@@ -10,56 +10,71 @@ vi.mock('@intlify/shared', async () => {
1010import { handleFlatJson } from '../src/utils'
1111import { I18nWarnCodes , getWarnMessage } from '../src/warnings'
1212
13- test ( 'handleFlatJson' , ( ) => {
14- const mockWarn = vi . spyOn ( shared , 'warn' )
15- // eslint-disable-next-line @typescript-eslint/no-empty-function
16- mockWarn . mockImplementation ( ( ) => { } )
13+ describe ( 'handleFlatJson' , ( ) => {
14+ test ( 'basic' , ( ) => {
15+ const mockWarn = vi . spyOn ( shared , 'warn' )
16+ // eslint-disable-next-line @typescript-eslint/no-empty-function
17+ mockWarn . mockImplementation ( ( ) => { } )
1718
18- const obj = {
19- a : { a1 : 'a1.value' } ,
20- 'a.a2' : 'a.a2.value' ,
21- 'b.x' : {
22- 'b1.x' : 'b1.x.value' ,
23- 'b2.x' : [ 'b2.x.value0' , 'b2.x.value1' ] ,
24- 'b3.x' : { 'b3.x' : 'b3.x.value' }
25- } ,
26- c : {
27- 'animal.dog' : 'Dog' ,
28- animal : 'Animal'
29- } ,
30- d : {
31- 'animal.dog' : 'Dog' ,
32- animal : { }
33- }
34- }
35- const expectObj = {
36- a : {
37- a1 : 'a1.value' ,
38- a2 : 'a.a2.value'
39- } ,
40- b : {
41- x : {
42- b1 : { x : 'b1.x.value' } ,
43- b2 : { x : [ 'b2.x.value0' , 'b2.x.value1' ] } ,
44- b3 : { x : { b3 : { x : 'b3.x.value' } } }
19+ const obj = {
20+ a : { a1 : 'a1.value' } ,
21+ 'a.a2' : 'a.a2.value' ,
22+ 'b.x' : {
23+ 'b1.x' : 'b1.x.value' ,
24+ 'b2.x' : [ 'b2.x.value0' , 'b2.x.value1' ] ,
25+ 'b3.x' : { 'b3.x' : 'b3.x.value' }
26+ } ,
27+ c : {
28+ 'animal.dog' : 'Dog' ,
29+ animal : 'Animal'
30+ } ,
31+ d : {
32+ 'animal.dog' : 'Dog' ,
33+ animal : { }
4534 }
46- } ,
47- c : {
48- 'animal.dog' : 'Dog' ,
49- animal : 'Animal'
50- } ,
51- d : {
52- animal : {
53- dog : 'Dog'
35+ }
36+ const expectObj = {
37+ a : {
38+ a1 : 'a1.value' ,
39+ a2 : 'a.a2.value'
40+ } ,
41+ b : {
42+ x : {
43+ b1 : { x : 'b1.x.value' } ,
44+ b2 : { x : [ 'b2.x.value0' , 'b2.x.value1' ] } ,
45+ b3 : { x : { b3 : { x : 'b3.x.value' } } }
46+ }
47+ } ,
48+ c : {
49+ 'animal.dog' : 'Dog' ,
50+ animal : 'Animal'
51+ } ,
52+ d : {
53+ animal : {
54+ dog : 'Dog'
55+ }
5456 }
5557 }
56- }
5758
58- expect ( handleFlatJson ( obj ) ) . toEqual ( expectObj )
59- expect ( mockWarn ) . toHaveBeenCalled ( )
60- expect ( mockWarn . mock . calls [ 0 ] [ 0 ] ) . toEqual (
61- getWarnMessage ( I18nWarnCodes . IGNORE_OBJ_FLATTEN , {
62- key : 'animal'
63- } )
64- )
59+ expect ( handleFlatJson ( obj ) ) . toEqual ( expectObj )
60+ expect ( mockWarn ) . toHaveBeenCalled ( )
61+ expect ( mockWarn . mock . calls [ 0 ] [ 0 ] ) . toEqual (
62+ getWarnMessage ( I18nWarnCodes . IGNORE_OBJ_FLATTEN , {
63+ key : 'animal'
64+ } )
65+ )
66+ } )
67+
68+ // security advisories
69+ // ref: https://github.com/intlify/vue-i18n/security/advisories/GHSA-p2ph-7g93-hw3m
70+ test ( 'prototype pollution' , ( ) => {
71+ expect ( ( ) =>
72+ handleFlatJson ( { '__proto__.pollutedKey' : 'pollutedValue' } )
73+ ) . toThrow ( )
74+ // @ts -ignore -- test
75+ // eslint-disable-next-line no-proto
76+ expect ( { } . __proto__ . pollutedKey ) . toBeUndefined ( )
77+ // @ts -ignore -- test
78+ expect ( Object . prototype . pollutedKey ) . toBeUndefined ( )
79+ } )
6580} )
0 commit comments