@@ -51,20 +51,24 @@ exports.compile = function (messages, target) {
5151 Assert ( typeof message === 'object' && ! Array . isArray ( message ) , 'Invalid message for' , code ) ;
5252
5353 const language = code ;
54- target [ language ] = target [ language ] || { } ;
54+
55+ // Don't reuse an inherited object, otherwise a language named __proto__ or constructor writes on the prototype
56+
57+ const localizedTarget = Object . prototype . hasOwnProperty . call ( target , language ) ? target [ language ] : { } ;
58+ target [ language ] = localizedTarget ;
5559
5660 for ( code in message ) {
5761 const localized = message [ code ] ;
5862
5963 if ( code === 'root' ||
6064 Template . isTemplate ( localized ) ) {
6165
62- target [ language ] [ code ] = localized ;
66+ localizedTarget [ code ] = localized ;
6367 continue ;
6468 }
6569
6670 Assert ( typeof localized === 'string' , 'Invalid message for' , code , 'in' , language ) ;
67- target [ language ] [ code ] = new Template ( localized ) ;
71+ localizedTarget [ code ] = new Template ( localized ) ;
6872 }
6973 }
7074
@@ -157,20 +161,24 @@ exports.merge = function (base, extended) {
157161 Assert ( typeof message === 'object' && ! Array . isArray ( message ) , 'Invalid message for' , code ) ;
158162
159163 const language = code ;
160- target [ language ] = target [ language ] || { } ;
164+
165+ // Same as in compile(), don't reuse an inherited object
166+
167+ const localizedTarget = Object . prototype . hasOwnProperty . call ( target , language ) ? target [ language ] : { } ;
168+ target [ language ] = localizedTarget ;
161169
162170 for ( code in message ) {
163171 const localized = message [ code ] ;
164172
165173 if ( code === 'root' ||
166174 Template . isTemplate ( localized ) ) {
167175
168- target [ language ] [ code ] = localized ;
176+ localizedTarget [ code ] = localized ;
169177 continue ;
170178 }
171179
172180 Assert ( typeof localized === 'string' , 'Invalid message for' , code , 'in' , language ) ;
173- target [ language ] [ code ] = new Template ( localized ) ;
181+ localizedTarget [ code ] = new Template ( localized ) ;
174182 }
175183 }
176184
0 commit comments