@@ -368,26 +368,45 @@ api.compact = ({
368
368
rval , itemActiveProperty , compactedItem ,
369
369
{ propertyIsArray : ( ! options . compactArrays || container . includes ( '@set' ) ) } ) ;
370
370
}
371
- } else if ( container . includes ( '@language' ) || container . includes ( '@index' ) ) {
372
- // handle language and index maps
371
+ } else if ( container . includes ( '@language' ) || container . includes ( '@index' ) ||
372
+ container . includes ( '@id' ) || container . includes ( '@type' ) ) {
373
+ // handle language and index maps
373
374
// get or create the map object
374
- let mapObject ;
375
+ let mapObject , key ;
375
376
if ( itemActiveProperty in rval ) {
376
377
mapObject = rval [ itemActiveProperty ] ;
377
378
} else {
378
379
rval [ itemActiveProperty ] = mapObject = { } ;
379
380
}
380
381
382
+ if ( container . includes ( '@language' ) ) {
381
383
// if container is a language map, simplify compacted value to
382
384
// a simple string
383
- if ( container . includes ( '@language' ) && _isValue ( compactedItem ) ) {
384
- compactedItem = compactedItem [ '@value' ] ;
385
+ if ( _isValue ( compactedItem ) ) {
386
+ compactedItem = compactedItem [ '@value' ] ;
387
+ }
388
+ key = expandedItem [ '@language' ] ;
389
+ } else if ( container . includes ( '@index' ) ) {
390
+ key = expandedItem [ '@index' ] ;
391
+ } else if ( container . includes ( '@id' ) ) {
392
+ const idKey = api . compactIri ( { activeCtx, iri : '@id' , vocab : true } ) ;
393
+ key = compactedItem [ idKey ] || '@none' ;
394
+ delete compactedItem [ idKey ] ;
395
+ } else if ( container . includes ( '@type' ) ) {
396
+ const typeKey = api . compactIri ( { activeCtx, iri : '@type' , vocab : true } ) ;
397
+ var types ;
398
+ [ key , ...types ] = [ ] . concat ( compactedItem [ typeKey ] || [ '@none' ] ) ;
399
+ switch ( types . length ) {
400
+ case 0 : delete compactedItem [ typeKey ] ; break ;
401
+ case 1 : compactedItem [ typeKey ] = types [ 0 ] ; break ;
402
+ default : compactedItem [ typeKey ] = types ; break ;
403
+ }
385
404
}
386
405
387
406
// add compact value to map object using key from expanded value
388
407
// based on the container type
389
- const c = container . includes ( '@language' ) ? '@language' : '@index' ;
390
- _addValue ( mapObject , expandedItem [ c ] , compactedItem ) ;
408
+ _addValue ( mapObject , key , compactedItem ,
409
+ { propertyIsArray : container . includes ( '@set' ) } ) ;
391
410
} else {
392
411
// use an array if: compactArrays flag is false,
393
412
// @container is @set or @list , value is an empty
@@ -465,6 +484,11 @@ api.compactIri = ({
465
484
containers . push ( '@graph@id' ) ;
466
485
containers . push ( '@graph@set' ) ;
467
486
containers . push ( '@graph' ) ;
487
+ } else if ( _isObject ( value ) && ! _isValue ( value ) ) {
488
+ containers . push ( '@id@set' ) ;
489
+ containers . push ( '@id' ) ;
490
+ containers . push ( '@type@set' ) ;
491
+ containers . push ( '@type' ) ;
468
492
}
469
493
470
494
// defaults for term selection based on type/language
0 commit comments