componentsjs 4.5.0 → 5.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/context.jsonld +40 -2
- package/lib/construction/ConfigConstructor.js +7 -14
- package/lib/construction/argument/ArgumentConstructorHandlerHash.js +3 -2
- package/lib/construction/strategy/ConstructionStrategyCommonJsString.js +3 -0
- package/lib/construction/strategy/IConstructionStrategy.d.ts +2 -2
- package/lib/loading/ComponentRegistry.js +1 -1
- package/lib/loading/ComponentRegistryFinalizer.js +18 -3
- package/lib/preprocess/ConfigPreprocessorComponent.d.ts +1 -1
- package/lib/preprocess/ConfigPreprocessorComponent.js +17 -12
- package/lib/preprocess/ConfigPreprocessorComponentMapped.d.ts +3 -3
- package/lib/preprocess/ConfigPreprocessorComponentMapped.js +8 -11
- package/lib/preprocess/ParameterHandler.d.ts +2 -2
- package/lib/preprocess/ParameterHandler.js +18 -17
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerCollectEntries.d.ts +1 -1
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerCollectEntries.js +20 -8
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerElements.d.ts +1 -1
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerElements.js +7 -4
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerFields.d.ts +1 -1
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerFields.js +14 -8
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerKeyValue.d.ts +3 -3
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerKeyValue.js +7 -7
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerList.d.ts +1 -1
- package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerList.js +6 -21
- package/lib/preprocess/constructorargumentsmapping/IConstructorArgumentsElementMappingHandler.d.ts +1 -1
- package/lib/preprocess/constructorargumentsmapping/IConstructorArgumentsMapper.d.ts +2 -2
- package/lib/preprocess/parameterproperty/IParameterPropertyHandler.d.ts +2 -2
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefault.d.ts +6 -3
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefault.js +20 -3
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefaultScoped.d.ts +2 -2
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefaultScoped.js +16 -5
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerFixed.d.ts +5 -3
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerFixed.js +25 -2
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerLazy.d.ts +2 -2
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerLazy.js +10 -3
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRange.d.ts +15 -4
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRange.js +141 -25
- package/lib/rdf/RdfParser.d.ts +1 -1
- package/lib/rdf/RdfParser.js +16 -4
- package/lib/rdf/RdfStreamIncluder.js +1 -1
- package/package.json +2 -2
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRequired.d.ts +0 -11
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRequired.js +0 -23
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerUnique.d.ts +0 -12
- package/lib/preprocess/parameterproperty/ParameterPropertyHandlerUnique.js +0 -34
|
@@ -16,7 +16,7 @@ export interface IConstructorArgumentsMapper {
|
|
|
16
16
|
* @param constructorArgs Object mapping definition inside the constructor arguments.
|
|
17
17
|
* @param configElement Part of the config resource to look for parameter instantiations as predicates.
|
|
18
18
|
*/
|
|
19
|
-
applyConstructorArgumentsParameters: (configRoot: Resource, constructorArgs: Resource, configElement: Resource) => Resource
|
|
19
|
+
applyConstructorArgumentsParameters: (configRoot: Resource, constructorArgs: Resource, configElement: Resource) => Resource;
|
|
20
20
|
/**
|
|
21
21
|
* Obtain the value(s) of the given parameter in the given config.
|
|
22
22
|
* @param configRoot The root config resource that we are working in.
|
|
@@ -24,5 +24,5 @@ export interface IConstructorArgumentsMapper {
|
|
|
24
24
|
* @param configElement Part of the config resource to look for parameter instantiations as predicates.
|
|
25
25
|
* @param rawValue If the IRI represents a raw string value instead of a parameter reference.
|
|
26
26
|
*/
|
|
27
|
-
getParameterValue: (configRoot: Resource, parameter: Resource, configElement: Resource, rawValue: boolean) => Resource
|
|
27
|
+
getParameterValue: (configRoot: Resource, parameter: Resource, configElement: Resource, rawValue: boolean) => Resource | undefined;
|
|
28
28
|
}
|
|
@@ -11,7 +11,7 @@ export interface IParameterPropertyHandler {
|
|
|
11
11
|
* @param parameter The parameter resource to get the value for.
|
|
12
12
|
* @param configElement Part of the config resource to look for parameter instantiations as predicates.
|
|
13
13
|
*/
|
|
14
|
-
canHandle: (value: Resource
|
|
14
|
+
canHandle: (value: Resource | undefined, configRoot: Resource, parameter: Resource, configElement: Resource) => boolean;
|
|
15
15
|
/**
|
|
16
16
|
* Transform the given parameter value.
|
|
17
17
|
* @param value The current parameter value obtained from the config.
|
|
@@ -20,5 +20,5 @@ export interface IParameterPropertyHandler {
|
|
|
20
20
|
* @param parameter The parameter resource to get the value for.
|
|
21
21
|
* @param configElement Part of the config resource to look for parameter instantiations as predicates.
|
|
22
22
|
*/
|
|
23
|
-
handle: (value: Resource
|
|
23
|
+
handle: (value: Resource | undefined, configRoot: Resource, parameter: Resource, configElement: Resource) => Resource | undefined;
|
|
24
24
|
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type { Resource } from 'rdf-object';
|
|
1
|
+
import type { Resource, RdfObjectLoader } from 'rdf-object';
|
|
2
2
|
import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
|
|
3
3
|
/**
|
|
4
4
|
* If no value has been set, its default value will be set.
|
|
5
5
|
*/
|
|
6
6
|
export declare class ParameterPropertyHandlerDefault implements IParameterPropertyHandler {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
private readonly objectLoader;
|
|
8
|
+
constructor(objectLoader: RdfObjectLoader);
|
|
9
|
+
canHandle(value: Resource | undefined, configRoot: Resource, parameter: Resource): boolean;
|
|
10
|
+
handle(value: Resource | undefined, configRoot: Resource, parameter: Resource, configElement: Resource): Resource | undefined;
|
|
11
|
+
protected handleValue(value: Resource, configElement: Resource): Resource;
|
|
9
12
|
}
|
|
@@ -1,15 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ParameterPropertyHandlerDefault = void 0;
|
|
4
|
+
const Iris_1 = require("../../rdf/Iris");
|
|
5
|
+
const ErrorResourcesContext_1 = require("../../util/ErrorResourcesContext");
|
|
4
6
|
/**
|
|
5
7
|
* If no value has been set, its default value will be set.
|
|
6
8
|
*/
|
|
7
9
|
class ParameterPropertyHandlerDefault {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
constructor(objectLoader) {
|
|
11
|
+
this.objectLoader = objectLoader;
|
|
12
|
+
}
|
|
13
|
+
canHandle(value, configRoot, parameter) {
|
|
14
|
+
return Boolean(!value && parameter.property.default);
|
|
10
15
|
}
|
|
11
16
|
handle(value, configRoot, parameter, configElement) {
|
|
12
|
-
|
|
17
|
+
if (parameter.properties.default.length > 1) {
|
|
18
|
+
throw new ErrorResourcesContext_1.ErrorResourcesContext(`Invalid default value for parameter "${parameter.value}": Only one value can be defined, or an RDF list must be provided`, { parameter });
|
|
19
|
+
}
|
|
20
|
+
return parameter.property.default.list ?
|
|
21
|
+
this.objectLoader.createCompactedResource({
|
|
22
|
+
list: parameter.property.default.list.map(subValue => this.handleValue(subValue, configElement)),
|
|
23
|
+
}) :
|
|
24
|
+
this.handleValue(parameter.property.default, configElement);
|
|
25
|
+
}
|
|
26
|
+
handleValue(value, configElement) {
|
|
27
|
+
if (value.type === 'NamedNode' && value.value === Iris_1.IRIS_RDF.subject) {
|
|
28
|
+
value = this.objectLoader.createCompactedResource(`"${configElement.value}"`);
|
|
29
|
+
}
|
|
13
30
|
return value;
|
|
14
31
|
}
|
|
15
32
|
}
|
|
@@ -6,6 +6,6 @@ import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
|
|
|
6
6
|
export declare class ParameterPropertyHandlerDefaultScoped implements IParameterPropertyHandler {
|
|
7
7
|
private readonly objectLoader;
|
|
8
8
|
constructor(objectLoader: RdfObjectLoader);
|
|
9
|
-
canHandle(value: Resource
|
|
10
|
-
handle(value: Resource
|
|
9
|
+
canHandle(value: Resource | undefined, configRoot: Resource, parameter: Resource): boolean;
|
|
10
|
+
handle(value: Resource | undefined, configRoot: Resource, parameter: Resource, configElement: Resource): Resource | undefined;
|
|
11
11
|
}
|
|
@@ -9,11 +9,11 @@ class ParameterPropertyHandlerDefaultScoped {
|
|
|
9
9
|
constructor(objectLoader) {
|
|
10
10
|
this.objectLoader = objectLoader;
|
|
11
11
|
}
|
|
12
|
-
canHandle(value, configRoot, parameter
|
|
13
|
-
return Boolean(value
|
|
12
|
+
canHandle(value, configRoot, parameter) {
|
|
13
|
+
return Boolean(!value && parameter.property.defaultScoped);
|
|
14
14
|
}
|
|
15
15
|
handle(value, configRoot, parameter, configElement) {
|
|
16
|
-
|
|
16
|
+
let applyingValue;
|
|
17
17
|
for (const scoped of parameter.properties.defaultScoped) {
|
|
18
18
|
// Require defaultScope
|
|
19
19
|
if (!scoped.property.defaultScope) {
|
|
@@ -25,13 +25,24 @@ class ParameterPropertyHandlerDefaultScoped {
|
|
|
25
25
|
if (!scoped.property.defaultScopedValue) {
|
|
26
26
|
throw new ErrorResourcesContext_1.ErrorResourcesContext(`Invalid defaultScoped for parameter "${parameter.value}": Missing defaultScopedValue`, { parameter });
|
|
27
27
|
}
|
|
28
|
+
// Require RDF list or single value
|
|
29
|
+
if (scoped.properties.defaultScopedValue.length > 1) {
|
|
30
|
+
throw new ErrorResourcesContext_1.ErrorResourcesContext(`Invalid defaultScoped value for parameter "${parameter.value}": Only one defaultScopedValue can be defined, or an RDF list must be provided`, { parameter });
|
|
31
|
+
}
|
|
28
32
|
// Apply the scope if the config is of the required type (also considering sub-types)
|
|
29
33
|
if (configRoot.isA(scopeType.term)) {
|
|
30
|
-
|
|
34
|
+
applyingValue = !applyingValue ?
|
|
35
|
+
scoped.property.defaultScopedValue :
|
|
36
|
+
this.objectLoader.createCompactedResource({
|
|
37
|
+
list: [
|
|
38
|
+
...applyingValue.list || [applyingValue],
|
|
39
|
+
...scoped.property.defaultScopedValue.list || [scoped.property.defaultScopedValue],
|
|
40
|
+
],
|
|
41
|
+
});
|
|
31
42
|
}
|
|
32
43
|
}
|
|
33
44
|
}
|
|
34
|
-
return
|
|
45
|
+
return applyingValue;
|
|
35
46
|
}
|
|
36
47
|
}
|
|
37
48
|
exports.ParameterPropertyHandlerDefaultScoped = ParameterPropertyHandlerDefaultScoped;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import type { Resource } from 'rdf-object';
|
|
1
|
+
import type { Resource, RdfObjectLoader } from 'rdf-object';
|
|
2
2
|
import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
|
|
3
3
|
/**
|
|
4
4
|
* Irrespective of any set values, prepend the parameter's fixed values.
|
|
5
5
|
*/
|
|
6
6
|
export declare class ParameterPropertyHandlerFixed implements IParameterPropertyHandler {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
private readonly objectLoader;
|
|
8
|
+
constructor(objectLoader: RdfObjectLoader);
|
|
9
|
+
canHandle(value: Resource | undefined, configRoot: Resource, parameter: Resource): boolean;
|
|
10
|
+
handle(value: Resource | undefined, configRoot: Resource, parameter: Resource, configElement: Resource): Resource | undefined;
|
|
9
11
|
}
|
|
@@ -1,15 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ParameterPropertyHandlerFixed = void 0;
|
|
4
|
+
const ErrorResourcesContext_1 = require("../../util/ErrorResourcesContext");
|
|
4
5
|
/**
|
|
5
6
|
* Irrespective of any set values, prepend the parameter's fixed values.
|
|
6
7
|
*/
|
|
7
8
|
class ParameterPropertyHandlerFixed {
|
|
8
|
-
|
|
9
|
+
constructor(objectLoader) {
|
|
10
|
+
this.objectLoader = objectLoader;
|
|
11
|
+
}
|
|
12
|
+
canHandle(value, configRoot, parameter) {
|
|
9
13
|
return Boolean(parameter.property.fixed);
|
|
10
14
|
}
|
|
11
15
|
handle(value, configRoot, parameter, configElement) {
|
|
12
|
-
|
|
16
|
+
if (parameter.properties.fixed.length > 1) {
|
|
17
|
+
throw new ErrorResourcesContext_1.ErrorResourcesContext(`Invalid fixed value for parameter "${parameter.value}": Only one value can be defined, or an RDF list must be provided`, { parameter });
|
|
18
|
+
}
|
|
19
|
+
if (value) {
|
|
20
|
+
const fixedValues = parameter.property.fixed.list || [parameter.property.fixed];
|
|
21
|
+
if (value.list) {
|
|
22
|
+
value.list.unshift(...fixedValues);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
value = this.objectLoader.createCompactedResource({
|
|
26
|
+
list: [
|
|
27
|
+
...fixedValues,
|
|
28
|
+
value,
|
|
29
|
+
],
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
value = parameter.property.fixed;
|
|
35
|
+
}
|
|
13
36
|
return value;
|
|
14
37
|
}
|
|
15
38
|
}
|
|
@@ -5,6 +5,6 @@ import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
|
|
|
5
5
|
* make the value inherit this lazy tag so that it can be handled later.
|
|
6
6
|
*/
|
|
7
7
|
export declare class ParameterPropertyHandlerLazy implements IParameterPropertyHandler {
|
|
8
|
-
canHandle(value: Resource
|
|
9
|
-
handle(value: Resource
|
|
8
|
+
canHandle(value: Resource | undefined, configRoot: Resource, parameter: Resource): boolean;
|
|
9
|
+
handle(value: Resource | undefined, configRoot: Resource, parameter: Resource, configElement: Resource): Resource | undefined;
|
|
10
10
|
}
|
|
@@ -6,12 +6,19 @@ exports.ParameterPropertyHandlerLazy = void 0;
|
|
|
6
6
|
* make the value inherit this lazy tag so that it can be handled later.
|
|
7
7
|
*/
|
|
8
8
|
class ParameterPropertyHandlerLazy {
|
|
9
|
-
canHandle(value, configRoot, parameter
|
|
9
|
+
canHandle(value, configRoot, parameter) {
|
|
10
10
|
return Boolean(parameter.property.lazy);
|
|
11
11
|
}
|
|
12
12
|
handle(value, configRoot, parameter, configElement) {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
if (value) {
|
|
14
|
+
if (value.list) {
|
|
15
|
+
for (const subValue of value.list) {
|
|
16
|
+
subValue.property.lazy = parameter.property.lazy;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
value.property.lazy = parameter.property.lazy;
|
|
21
|
+
}
|
|
15
22
|
}
|
|
16
23
|
return value;
|
|
17
24
|
}
|
|
@@ -6,8 +6,8 @@ import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
|
|
|
6
6
|
export declare class ParameterPropertyHandlerRange implements IParameterPropertyHandler {
|
|
7
7
|
private readonly objectLoader;
|
|
8
8
|
constructor(objectLoader: RdfObjectLoader);
|
|
9
|
-
canHandle(value: Resource
|
|
10
|
-
handle(value: Resource
|
|
9
|
+
canHandle(value: Resource | undefined, configRoot: Resource, parameter: Resource): boolean;
|
|
10
|
+
handle(value: Resource | undefined, configRoot: Resource, parameter: Resource, configElement: Resource): Resource | undefined;
|
|
11
11
|
/**
|
|
12
12
|
* Apply the given datatype to the given literal.
|
|
13
13
|
* Checks if the datatype is correct and casts to the correct js type.
|
|
@@ -16,6 +16,17 @@ export declare class ParameterPropertyHandlerRange implements IParameterProperty
|
|
|
16
16
|
* @param value The value.
|
|
17
17
|
* @param param The parameter.
|
|
18
18
|
*/
|
|
19
|
-
captureType(value: Resource, param: Resource): Resource;
|
|
20
|
-
|
|
19
|
+
captureType(value: Resource | undefined, param: Resource): Resource | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Apply the given datatype to the given literal.
|
|
22
|
+
* Checks if the datatype is correct and casts to the correct js type.
|
|
23
|
+
* Will throw an error if the type has an invalid value.
|
|
24
|
+
* Will be ignored if the value is not a literal or the type is not recognized.
|
|
25
|
+
* @param value The value.
|
|
26
|
+
* @param param The parameter.
|
|
27
|
+
* @param paramRange The parameter's range.
|
|
28
|
+
*/
|
|
29
|
+
hasParamValueValidType(value: Resource | undefined, param: Resource, paramRange: Resource): boolean;
|
|
30
|
+
protected throwIncorrectTypeError(value: Resource | undefined, parameter: Resource): never;
|
|
31
|
+
rangeToDisplayString(paramRange: Resource | undefined): string;
|
|
21
32
|
}
|
|
@@ -10,13 +10,11 @@ class ParameterPropertyHandlerRange {
|
|
|
10
10
|
constructor(objectLoader) {
|
|
11
11
|
this.objectLoader = objectLoader;
|
|
12
12
|
}
|
|
13
|
-
canHandle(value, configRoot, parameter
|
|
13
|
+
canHandle(value, configRoot, parameter) {
|
|
14
14
|
return Boolean(parameter.property.range);
|
|
15
15
|
}
|
|
16
16
|
handle(value, configRoot, parameter, configElement) {
|
|
17
|
-
|
|
18
|
-
this.captureType(subValue, parameter);
|
|
19
|
-
}
|
|
17
|
+
this.captureType(value, parameter);
|
|
20
18
|
return value;
|
|
21
19
|
}
|
|
22
20
|
/**
|
|
@@ -28,9 +26,32 @@ class ParameterPropertyHandlerRange {
|
|
|
28
26
|
* @param param The parameter.
|
|
29
27
|
*/
|
|
30
28
|
captureType(value, param) {
|
|
31
|
-
if (value
|
|
29
|
+
if (this.hasParamValueValidType(value, param, param.property.range)) {
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
this.throwIncorrectTypeError(value, param);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Apply the given datatype to the given literal.
|
|
36
|
+
* Checks if the datatype is correct and casts to the correct js type.
|
|
37
|
+
* Will throw an error if the type has an invalid value.
|
|
38
|
+
* Will be ignored if the value is not a literal or the type is not recognized.
|
|
39
|
+
* @param value The value.
|
|
40
|
+
* @param param The parameter.
|
|
41
|
+
* @param paramRange The parameter's range.
|
|
42
|
+
*/
|
|
43
|
+
hasParamValueValidType(value, param, paramRange) {
|
|
44
|
+
if (!paramRange) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (!value && paramRange.isA('ParameterRangeUndefined')) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
if (value && value.type === 'Literal') {
|
|
32
51
|
let parsed;
|
|
33
|
-
switch (
|
|
52
|
+
switch (paramRange.value) {
|
|
53
|
+
case Iris_1.IRIS_XSD.string:
|
|
54
|
+
return true;
|
|
34
55
|
case Iris_1.IRIS_XSD.boolean:
|
|
35
56
|
if (value.value === 'true') {
|
|
36
57
|
value.term.valueRaw = true;
|
|
@@ -39,9 +60,9 @@ class ParameterPropertyHandlerRange {
|
|
|
39
60
|
value.term.valueRaw = false;
|
|
40
61
|
}
|
|
41
62
|
else {
|
|
42
|
-
|
|
63
|
+
return false;
|
|
43
64
|
}
|
|
44
|
-
|
|
65
|
+
return true;
|
|
45
66
|
case Iris_1.IRIS_XSD.integer:
|
|
46
67
|
case Iris_1.IRIS_XSD.number:
|
|
47
68
|
case Iris_1.IRIS_XSD.int:
|
|
@@ -49,45 +70,140 @@ class ParameterPropertyHandlerRange {
|
|
|
49
70
|
case Iris_1.IRIS_XSD.long:
|
|
50
71
|
parsed = Number.parseInt(value.value, 10);
|
|
51
72
|
if (Number.isNaN(parsed)) {
|
|
52
|
-
|
|
73
|
+
return false;
|
|
53
74
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this.throwIncorrectTypeError(value, param);
|
|
58
|
-
}
|
|
59
|
-
value.term.valueRaw = parsed;
|
|
75
|
+
// ParseInt also parses floats to ints!
|
|
76
|
+
if (String(parsed) !== value.value) {
|
|
77
|
+
return false;
|
|
60
78
|
}
|
|
61
|
-
|
|
79
|
+
value.term.valueRaw = parsed;
|
|
80
|
+
return true;
|
|
62
81
|
case Iris_1.IRIS_XSD.float:
|
|
63
82
|
case Iris_1.IRIS_XSD.decimal:
|
|
64
83
|
case Iris_1.IRIS_XSD.double:
|
|
65
84
|
parsed = Number.parseFloat(value.value);
|
|
66
85
|
if (Number.isNaN(parsed)) {
|
|
67
|
-
|
|
86
|
+
return false;
|
|
68
87
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
break;
|
|
88
|
+
value.term.valueRaw = parsed;
|
|
89
|
+
return true;
|
|
73
90
|
case Iris_1.IRIS_RDF.JSON:
|
|
74
91
|
try {
|
|
75
92
|
parsed = JSON.parse(value.value);
|
|
76
93
|
value.term.valueRaw = parsed;
|
|
77
94
|
}
|
|
78
95
|
catch (_a) {
|
|
79
|
-
|
|
96
|
+
return false;
|
|
80
97
|
}
|
|
81
|
-
|
|
98
|
+
return true;
|
|
82
99
|
}
|
|
83
100
|
}
|
|
84
|
-
|
|
101
|
+
// Allow IRIs to be casted to strings
|
|
102
|
+
if (value && paramRange && paramRange.value === Iris_1.IRIS_XSD.string && value.type === 'NamedNode') {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
if (paramRange && (!value || (!value.isA('Variable') && !value.isA(paramRange.term)))) {
|
|
106
|
+
if (value && paramRange.isA('ParameterRangeArray')) {
|
|
107
|
+
if (!value.list) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
return value.list.every(listElement => this
|
|
111
|
+
.hasParamValueValidType(listElement, param, paramRange.property.parameterRangeValue));
|
|
112
|
+
}
|
|
113
|
+
// Check if the param type is a composed type
|
|
114
|
+
if (paramRange.isA('ParameterRangeUnion')) {
|
|
115
|
+
return paramRange.properties.parameterRangeElements
|
|
116
|
+
.some(child => this.hasParamValueValidType(value, param, child));
|
|
117
|
+
}
|
|
118
|
+
if (paramRange.isA('ParameterRangeIntersection')) {
|
|
119
|
+
return paramRange.properties.parameterRangeElements
|
|
120
|
+
.every(child => this.hasParamValueValidType(value, param, child));
|
|
121
|
+
}
|
|
122
|
+
if (paramRange.isA('ParameterRangeTuple')) {
|
|
123
|
+
if (!value || !value.list) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
// Iterate over list elements and try to match with tuple types
|
|
127
|
+
const listElements = value.list;
|
|
128
|
+
const tupleTypes = paramRange.properties.parameterRangeElements;
|
|
129
|
+
let listIndex = 0;
|
|
130
|
+
let tupleIndex = 0;
|
|
131
|
+
while (listIndex < listElements.length && tupleIndex < tupleTypes.length) {
|
|
132
|
+
if (tupleTypes[tupleIndex].isA('ParameterRangeRest')) {
|
|
133
|
+
// Rest types can match multiple list elements, so only increment index if no match is found.
|
|
134
|
+
if (!this.hasParamValueValidType(listElements[listIndex], param, tupleTypes[tupleIndex].property.parameterRangeValue)) {
|
|
135
|
+
tupleIndex++;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
listIndex++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (!this.hasParamValueValidType(listElements[listIndex], param, tupleTypes[tupleIndex])) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
tupleIndex++;
|
|
146
|
+
listIndex++;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return listIndex === listElements.length &&
|
|
150
|
+
(tupleIndex === tupleTypes.length ||
|
|
151
|
+
(tupleIndex === tupleTypes.length - 1 && tupleTypes[tupleIndex].isA('ParameterRangeRest')));
|
|
152
|
+
}
|
|
153
|
+
if (paramRange.isA('ParameterRangeLiteral')) {
|
|
154
|
+
return Boolean(value && value.term.equals(paramRange.property.parameterRangeValue.term));
|
|
155
|
+
}
|
|
156
|
+
// Check if this param defines a field with sub-params
|
|
157
|
+
if (paramRange.isA('ParameterRangeCollectEntries')) {
|
|
158
|
+
// TODO: Add support for type-checking nested fields with collectEntries
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
return true;
|
|
85
164
|
}
|
|
86
165
|
throwIncorrectTypeError(value, parameter) {
|
|
87
|
-
|
|
166
|
+
const withTypes = value && value.properties.types.length > 0 ? ` with types "${value.properties.types.map(resource => resource.value)}"` : '';
|
|
167
|
+
// eslint-disable-next-line @typescript-eslint/no-extra-parens
|
|
168
|
+
const valueString = value ? (value.list ? `[${value.list.map(subValue => subValue.value).join(', ')}]` : value.value) : 'undefined';
|
|
169
|
+
throw new ErrorResourcesContext_1.ErrorResourcesContext(`The value "${valueString}"${withTypes} for parameter "${parameter.value}" is not of required range type "${this.rangeToDisplayString(parameter.property.range)}"`, {
|
|
170
|
+
value: value || 'undefined',
|
|
88
171
|
parameter,
|
|
89
172
|
});
|
|
90
173
|
}
|
|
174
|
+
rangeToDisplayString(paramRange) {
|
|
175
|
+
if (!paramRange) {
|
|
176
|
+
return `any`;
|
|
177
|
+
}
|
|
178
|
+
if (paramRange.isA('ParameterRangeUndefined')) {
|
|
179
|
+
return `undefined`;
|
|
180
|
+
}
|
|
181
|
+
if (paramRange.isA('ParameterRangeArray')) {
|
|
182
|
+
return `${this.rangeToDisplayString(paramRange.property.parameterRangeValue)}[]`;
|
|
183
|
+
}
|
|
184
|
+
if (paramRange.isA('ParameterRangeRest')) {
|
|
185
|
+
return `...${this.rangeToDisplayString(paramRange.property.parameterRangeValue)}`;
|
|
186
|
+
}
|
|
187
|
+
if (paramRange.isA('ParameterRangeUnion')) {
|
|
188
|
+
return paramRange.properties.parameterRangeElements
|
|
189
|
+
.map(child => this.rangeToDisplayString(child))
|
|
190
|
+
.join(' | ');
|
|
191
|
+
}
|
|
192
|
+
if (paramRange.isA('ParameterRangeIntersection')) {
|
|
193
|
+
return paramRange.properties.parameterRangeElements
|
|
194
|
+
.map(child => this.rangeToDisplayString(child))
|
|
195
|
+
.join(' & ');
|
|
196
|
+
}
|
|
197
|
+
if (paramRange.isA('ParameterRangeTuple')) {
|
|
198
|
+
return `[${paramRange.properties.parameterRangeElements
|
|
199
|
+
.map(child => this.rangeToDisplayString(child))
|
|
200
|
+
.join(', ')}]`;
|
|
201
|
+
}
|
|
202
|
+
if (paramRange.isA('ParameterRangeLiteral')) {
|
|
203
|
+
return paramRange.property.parameterRangeValue.value;
|
|
204
|
+
}
|
|
205
|
+
return paramRange.value;
|
|
206
|
+
}
|
|
91
207
|
}
|
|
92
208
|
exports.ParameterPropertyHandlerRange = ParameterPropertyHandlerRange;
|
|
93
209
|
//# sourceMappingURL=ParameterPropertyHandlerRange.js.map
|
package/lib/rdf/RdfParser.d.ts
CHANGED
package/lib/rdf/RdfParser.js
CHANGED
|
@@ -20,10 +20,22 @@ class RdfParser {
|
|
|
20
20
|
// Parsing libraries don't work as expected if path contains backslashes
|
|
21
21
|
options.path = options.path.replace(/\\+/gu, '/');
|
|
22
22
|
if (!options.baseIRI) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
// Try converting path to URL using defined import paths
|
|
24
|
+
if (options.importPaths) {
|
|
25
|
+
for (const [url, file] of Object.entries(options.importPaths)) {
|
|
26
|
+
if (options.path.startsWith(file)) {
|
|
27
|
+
options.baseIRI = `${url}${options.path.slice(file.length)}`;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Fallback to a baseIRI using the file scheme
|
|
33
|
+
if (!options.baseIRI) {
|
|
34
|
+
options.baseIRI = options.path;
|
|
35
|
+
// Windows paths always contain a ':'
|
|
36
|
+
if (!options.baseIRI.includes(':') || /^[A-Za-z]:[/\\][^/]/u.test(options.baseIRI)) {
|
|
37
|
+
options.baseIRI = `file://${options.baseIRI}`;
|
|
38
|
+
}
|
|
27
39
|
}
|
|
28
40
|
}
|
|
29
41
|
// Set JSON-LD parser options
|
|
@@ -51,7 +51,7 @@ class RdfStreamIncluder extends stream_1.Transform {
|
|
|
51
51
|
// Recursively call the parser
|
|
52
52
|
RdfParser_1.RdfParser.fetchFileOrUrl(relativeFilePath)
|
|
53
53
|
.then((rawStream) => {
|
|
54
|
-
const data = new RdfParser_1.RdfParser().parse(rawStream, Object.assign(Object.assign({}, this.parserOptions), { path: relativeFilePath, importedFromPath: this.parserOptions.path }));
|
|
54
|
+
const data = new RdfParser_1.RdfParser().parse(rawStream, Object.assign(Object.assign({}, this.parserOptions), { baseIRI: undefined, path: relativeFilePath, importedFromPath: this.parserOptions.path }));
|
|
55
55
|
data
|
|
56
56
|
.on('data', (subData) => this.push(subData))
|
|
57
57
|
.on('error', (error) => this.emit('error', error))
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "componentsjs",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-beta.0",
|
|
4
4
|
"description": "A semantic dependency injection framework",
|
|
5
5
|
"lsd:contexts": {
|
|
6
6
|
"https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^3.0.0/components/context.jsonld": "components/context.jsonld"
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"jsonld-context-parser": "^2.1.1",
|
|
41
41
|
"minimist": "^1.2.0",
|
|
42
42
|
"rdf-data-factory": "^1.1.0",
|
|
43
|
-
"rdf-object": "^1.
|
|
43
|
+
"rdf-object": "^1.12.0",
|
|
44
44
|
"rdf-parse": "^1.9.1",
|
|
45
45
|
"rdf-quad": "^1.5.0",
|
|
46
46
|
"rdf-terms": "^1.7.0",
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { RdfObjectLoader, Resource } from 'rdf-object';
|
|
2
|
-
import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
|
|
3
|
-
/**
|
|
4
|
-
* If no value has been set, but a value is required, throw.
|
|
5
|
-
*/
|
|
6
|
-
export declare class ParameterPropertyHandlerRequired implements IParameterPropertyHandler {
|
|
7
|
-
private readonly objectLoader;
|
|
8
|
-
constructor(objectLoader: RdfObjectLoader);
|
|
9
|
-
canHandle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): boolean;
|
|
10
|
-
handle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): Resource[];
|
|
11
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ParameterPropertyHandlerRequired = void 0;
|
|
4
|
-
const ErrorResourcesContext_1 = require("../../util/ErrorResourcesContext");
|
|
5
|
-
/**
|
|
6
|
-
* If no value has been set, but a value is required, throw.
|
|
7
|
-
*/
|
|
8
|
-
class ParameterPropertyHandlerRequired {
|
|
9
|
-
constructor(objectLoader) {
|
|
10
|
-
this.objectLoader = objectLoader;
|
|
11
|
-
}
|
|
12
|
-
canHandle(value, configRoot, parameter, configElement) {
|
|
13
|
-
return Boolean(value.length === 0 && parameter.property.required);
|
|
14
|
-
}
|
|
15
|
-
handle(value, configRoot, parameter, configElement) {
|
|
16
|
-
throw new ErrorResourcesContext_1.ErrorResourcesContext(`No value was set for required parameter "${parameter.value}"`, {
|
|
17
|
-
config: configElement,
|
|
18
|
-
parameter,
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
exports.ParameterPropertyHandlerRequired = ParameterPropertyHandlerRequired;
|
|
23
|
-
//# sourceMappingURL=ParameterPropertyHandlerRequired.js.map
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { RdfObjectLoader } from 'rdf-object';
|
|
2
|
-
import { Resource } from 'rdf-object';
|
|
3
|
-
import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
|
|
4
|
-
/**
|
|
5
|
-
* If the value is singular, and the value should be unique, transform to a single element.
|
|
6
|
-
*/
|
|
7
|
-
export declare class ParameterPropertyHandlerUnique implements IParameterPropertyHandler {
|
|
8
|
-
private readonly objectLoader;
|
|
9
|
-
constructor(objectLoader: RdfObjectLoader);
|
|
10
|
-
canHandle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): boolean;
|
|
11
|
-
handle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): Resource[];
|
|
12
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ParameterPropertyHandlerUnique = void 0;
|
|
4
|
-
const rdf_object_1 = require("rdf-object");
|
|
5
|
-
/**
|
|
6
|
-
* If the value is singular, and the value should be unique, transform to a single element.
|
|
7
|
-
*/
|
|
8
|
-
class ParameterPropertyHandlerUnique {
|
|
9
|
-
constructor(objectLoader) {
|
|
10
|
-
this.objectLoader = objectLoader;
|
|
11
|
-
}
|
|
12
|
-
canHandle(value, configRoot, parameter, configElement) {
|
|
13
|
-
return Boolean(parameter.property.unique && parameter.property.unique.value === 'true' && value.length > 0);
|
|
14
|
-
}
|
|
15
|
-
handle(value, configRoot, parameter, configElement) {
|
|
16
|
-
value = [value[0]];
|
|
17
|
-
// !!!Hack incoming!!!
|
|
18
|
-
// We make a manual resource to ensure uniqueness from other resources.
|
|
19
|
-
// This is needed because literals may occur different times in param values.
|
|
20
|
-
// This ensures that the unique label is only applied to the current occurrence, instead of all occurrences.
|
|
21
|
-
// TODO: improve this
|
|
22
|
-
const newValue = new rdf_object_1.Resource({ term: value[0].term, context: this.objectLoader.contextResolved });
|
|
23
|
-
for (const key of Object.keys(value[0].properties)) {
|
|
24
|
-
for (const subValue of value[0].properties[key]) {
|
|
25
|
-
newValue.properties[key].push(subValue);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
value = [newValue];
|
|
29
|
-
value[0].property.unique = parameter.property.unique;
|
|
30
|
-
return value;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
exports.ParameterPropertyHandlerUnique = ParameterPropertyHandlerUnique;
|
|
34
|
-
//# sourceMappingURL=ParameterPropertyHandlerUnique.js.map
|