@@ -301,33 +301,10 @@ api.createTermDefinition = (
301
301
{ code : 'invalid term definition' , context : localCtx } ) ;
302
302
}
303
303
304
- // FIXME if(1.1) ... ?
305
- if ( activeCtx . protected . hasOwnProperty ( term ) &&
306
- ! isPropertyTermScopedContext ) {
307
- const protectedMode = ( options && options . protectedMode ) || 'error' ;
308
- if ( protectedMode === 'error' ) {
309
- throw new JsonLdError (
310
- 'Invalid JSON-LD syntax; tried to redefine a protected term.' ,
311
- 'jsonld.SyntaxError' ,
312
- { code : 'protected term redefinition' , context : localCtx , term} ) ;
313
- } else if ( protectedMode === 'warn' ) {
314
- // FIXME: remove logging and use a handler
315
- console . warn ( 'WARNING: protected term redefinition' , { term} ) ;
316
- return ;
317
- }
318
- throw new JsonLdError (
319
- 'Invalid protectedMode.' ,
320
- 'jsonld.SyntaxError' ,
321
- { code : 'invalid protected mode' , context : localCtx , term,
322
- protectedMode} ) ;
323
- }
324
-
325
304
// remove old mapping
326
305
let previousMapping = null ;
327
306
if ( activeCtx . mappings . has ( term ) ) {
328
- if ( isTypeScopedContext ) {
329
- previousMapping = activeCtx . mappings . get ( term ) ;
330
- }
307
+ previousMapping = activeCtx . mappings . get ( term ) ;
331
308
activeCtx . mappings . delete ( term ) ;
332
309
}
333
310
@@ -652,6 +629,33 @@ api.createTermDefinition = (
652
629
'Invalid JSON-LD syntax; @context and @preserve cannot be aliased.' ,
653
630
'jsonld.SyntaxError' , { code : 'invalid keyword alias' , context : localCtx } ) ;
654
631
}
632
+
633
+ // FIXME if(1.1) ... ?
634
+ if ( previousMapping && previousMapping . protected &&
635
+ ! isPropertyTermScopedContext ) {
636
+ // force new term to continue to be protected and see if the mappings would
637
+ // be equal
638
+ activeCtx . protected [ term ] = true ;
639
+ mapping . protected = true ;
640
+ if ( ! _areTermDefinitionsEqual ( previousMapping , mapping ) ) {
641
+ const protectedMode = ( options && options . protectedMode ) || 'error' ;
642
+ if ( protectedMode === 'error' ) {
643
+ throw new JsonLdError (
644
+ 'Invalid JSON-LD syntax; tried to redefine a protected term.' ,
645
+ 'jsonld.SyntaxError' ,
646
+ { code : 'protected term redefinition' , context : localCtx , term} ) ;
647
+ } else if ( protectedMode === 'warn' ) {
648
+ // FIXME: remove logging and use a handler
649
+ console . warn ( 'WARNING: protected term redefinition' , { term} ) ;
650
+ return ;
651
+ }
652
+ throw new JsonLdError (
653
+ 'Invalid protectedMode.' ,
654
+ 'jsonld.SyntaxError' ,
655
+ { code : 'invalid protected mode' , context : localCtx , term,
656
+ protectedMode} ) ;
657
+ }
658
+ }
655
659
} ;
656
660
657
661
/**
@@ -1303,3 +1307,44 @@ function _findContextUrls(input, urls, replace, base) {
1303
1307
}
1304
1308
}
1305
1309
}
1310
+
1311
+ function _areTermDefinitionsEqual ( d1 , d2 ) {
1312
+ const k1 = Object . keys ( d1 ) ;
1313
+ const k2 = Object . keys ( d2 ) ;
1314
+ if ( k1 . length !== k2 . length ) {
1315
+ return false ;
1316
+ }
1317
+
1318
+ for ( const k of k1 ) {
1319
+ const v1 = d1 [ k ] ;
1320
+ const v2 = d2 [ k ] ;
1321
+ if ( k === '@context' ) {
1322
+ if ( JSON . stringify ( v1 ) !== JSON . stringify ( v2 ) ) {
1323
+ return false ;
1324
+ }
1325
+ continue ;
1326
+ }
1327
+ const isArray = Array . isArray ( v1 ) ;
1328
+ if ( isArray !== Array . isArray ( v2 ) ) {
1329
+ return false ;
1330
+ }
1331
+ // `@container`
1332
+ if ( isArray ) {
1333
+ if ( v1 . length !== v2 . length ) {
1334
+ return false ;
1335
+ }
1336
+ v1 . sort ( ) ;
1337
+ v2 . sort ( ) ;
1338
+ for ( let i = 0 ; i < v1 . length ; ++ i ) {
1339
+ if ( v1 [ i ] !== v2 [ i ] ) {
1340
+ return false ;
1341
+ }
1342
+ }
1343
+ }
1344
+ // strings
1345
+ if ( v1 !== v2 ) {
1346
+ return false ;
1347
+ }
1348
+ }
1349
+ return true ;
1350
+ }
0 commit comments