Skip to content

Commit c77ca7c

Browse files
committed
Add language map BCP47 event and test.
1 parent 03994f7 commit c77ca7c

File tree

2 files changed

+86
-5
lines changed

2 files changed

+86
-5
lines changed

lib/expand.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1139,7 +1139,18 @@ function _expandLanguageMap(activeCtx, languageMap, direction, options) {
11391139
const rval = [];
11401140
const keys = Object.keys(languageMap).sort();
11411141
for(const key of keys) {
1142-
const expandedKey = _expandIri(activeCtx, key, {vocab: true}, options);
1142+
const expandedKey = _expandIri(activeCtx, key, {vocab: true}, {
1143+
...options,
1144+
eventHandler: [
1145+
// filter to avoid relative reference events
1146+
({event, next}) => {
1147+
if(event.code !== 'relative IRI after expansion') {
1148+
next();
1149+
}
1150+
},
1151+
options.eventHandler
1152+
]
1153+
});
11431154
let val = languageMap[key];
11441155
if(!_isArray(val)) {
11451156
val = [val];
@@ -1157,6 +1168,22 @@ function _expandLanguageMap(activeCtx, languageMap, direction, options) {
11571168
}
11581169
const val = {'@value': item};
11591170
if(expandedKey !== '@none') {
1171+
if(!key.match(REGEX_BCP47)) {
1172+
if(options.eventHandler) {
1173+
_handleEvent({
1174+
event: {
1175+
type: ['JsonLdEvent'],
1176+
code: 'invalid @language value',
1177+
level: 'warning',
1178+
message: '@language value must be valid BCP47.',
1179+
details: {
1180+
language: key
1181+
}
1182+
},
1183+
options
1184+
});
1185+
}
1186+
}
11601187
val['@language'] = key.toLowerCase();
11611188
}
11621189
if(direction) {

tests/misc.js

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,7 +1363,7 @@ describe('events', () => {
13631363
const input =
13641364
{
13651365
"urn:property": {
1366-
"@language": "en_us",
1366+
"@language": "en_bad",
13671367
"@value": "test"
13681368
}
13691369
}
@@ -1373,7 +1373,7 @@ describe('events', () => {
13731373
{
13741374
"urn:property": [
13751375
{
1376-
"@language": "en_us",
1376+
"@language": "en_bad",
13771377
"@value": "test"
13781378
}
13791379
]
@@ -1402,7 +1402,7 @@ describe('events', () => {
14021402
const input =
14031403
{
14041404
"@context": {
1405-
"@language": "en_us"
1405+
"@language": "en_bad"
14061406
},
14071407
"urn:property": "value"
14081408
}
@@ -1412,7 +1412,7 @@ describe('events', () => {
14121412
{
14131413
"urn:property": [
14141414
{
1415-
"@language": "en_us",
1415+
"@language": "en_bad",
14161416
"@value": "value"
14171417
}
14181418
]
@@ -1436,6 +1436,60 @@ describe('events', () => {
14361436
testNotStrict: true
14371437
});
14381438
});
1439+
1440+
it('should emit for invalid @language map value', async () => {
1441+
const input =
1442+
{
1443+
"@context": {
1444+
"urn:property": {
1445+
"@container": "@language"
1446+
}
1447+
},
1448+
"urn:property": {
1449+
"en_bad": "en",
1450+
"de": "de"
1451+
}
1452+
}
1453+
;
1454+
const expected =
1455+
[
1456+
{
1457+
"urn:property": [
1458+
{
1459+
"@language": "de",
1460+
"@value": "de"
1461+
},
1462+
{
1463+
"@language": "en_bad",
1464+
"@value": "en"
1465+
}
1466+
]
1467+
}
1468+
]
1469+
;
1470+
1471+
console.error('FIXME');
1472+
await _test({
1473+
type: 'expand',
1474+
input,
1475+
expected,
1476+
mapCounts: {
1477+
expansionMap: 2,
1478+
relativeIri: {
1479+
de: 1,
1480+
en_bad: 1
1481+
}
1482+
},
1483+
eventCounts: {
1484+
codes: {
1485+
'invalid @language value': 1
1486+
},
1487+
events: 1
1488+
},
1489+
testNotSafe: true,
1490+
testNotStrict: true
1491+
});
1492+
});
14391493
});
14401494

14411495
describe('properties', () => {

0 commit comments

Comments
 (0)