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.
Files changed (44) hide show
  1. package/components/context.jsonld +40 -2
  2. package/lib/construction/ConfigConstructor.js +7 -14
  3. package/lib/construction/argument/ArgumentConstructorHandlerHash.js +3 -2
  4. package/lib/construction/strategy/ConstructionStrategyCommonJsString.js +3 -0
  5. package/lib/construction/strategy/IConstructionStrategy.d.ts +2 -2
  6. package/lib/loading/ComponentRegistry.js +1 -1
  7. package/lib/loading/ComponentRegistryFinalizer.js +18 -3
  8. package/lib/preprocess/ConfigPreprocessorComponent.d.ts +1 -1
  9. package/lib/preprocess/ConfigPreprocessorComponent.js +17 -12
  10. package/lib/preprocess/ConfigPreprocessorComponentMapped.d.ts +3 -3
  11. package/lib/preprocess/ConfigPreprocessorComponentMapped.js +8 -11
  12. package/lib/preprocess/ParameterHandler.d.ts +2 -2
  13. package/lib/preprocess/ParameterHandler.js +18 -17
  14. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerCollectEntries.d.ts +1 -1
  15. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerCollectEntries.js +20 -8
  16. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerElements.d.ts +1 -1
  17. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerElements.js +7 -4
  18. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerFields.d.ts +1 -1
  19. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerFields.js +14 -8
  20. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerKeyValue.d.ts +3 -3
  21. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerKeyValue.js +7 -7
  22. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerList.d.ts +1 -1
  23. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerList.js +6 -21
  24. package/lib/preprocess/constructorargumentsmapping/IConstructorArgumentsElementMappingHandler.d.ts +1 -1
  25. package/lib/preprocess/constructorargumentsmapping/IConstructorArgumentsMapper.d.ts +2 -2
  26. package/lib/preprocess/parameterproperty/IParameterPropertyHandler.d.ts +2 -2
  27. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefault.d.ts +6 -3
  28. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefault.js +20 -3
  29. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefaultScoped.d.ts +2 -2
  30. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefaultScoped.js +16 -5
  31. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerFixed.d.ts +5 -3
  32. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerFixed.js +25 -2
  33. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerLazy.d.ts +2 -2
  34. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerLazy.js +10 -3
  35. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRange.d.ts +15 -4
  36. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRange.js +141 -25
  37. package/lib/rdf/RdfParser.d.ts +1 -1
  38. package/lib/rdf/RdfParser.js +16 -4
  39. package/lib/rdf/RdfStreamIncluder.js +1 -1
  40. package/package.json +2 -2
  41. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRequired.d.ts +0 -11
  42. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRequired.js +0 -23
  43. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerUnique.d.ts +0 -12
  44. 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[], configRoot: Resource, parameter: Resource, configElement: Resource) => boolean;
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[], configRoot: Resource, parameter: Resource, configElement: Resource) => 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
- canHandle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): boolean;
8
- handle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): Resource[];
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
- canHandle(value, configRoot, parameter, configElement) {
9
- return Boolean(value.length === 0 && parameter.property.default);
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
- value = parameter.properties.default;
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[], configRoot: Resource, parameter: Resource, configElement: Resource): boolean;
10
- handle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): 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, configElement) {
13
- return Boolean(value.length === 0 && parameter.property.defaultScoped);
12
+ canHandle(value, configRoot, parameter) {
13
+ return Boolean(!value && parameter.property.defaultScoped);
14
14
  }
15
15
  handle(value, configRoot, parameter, configElement) {
16
- // Multiple scopes can be defined
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
- value.push(...scoped.properties.defaultScopedValue);
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 value;
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
- canHandle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): boolean;
8
- handle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): Resource[];
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
- canHandle(value, configRoot, parameter, configElement) {
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
- value.unshift(...parameter.properties.fixed);
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[], configRoot: Resource, parameter: Resource, configElement: Resource): boolean;
9
- handle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): 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, configElement) {
9
+ canHandle(value, configRoot, parameter) {
10
10
  return Boolean(parameter.property.lazy);
11
11
  }
12
12
  handle(value, configRoot, parameter, configElement) {
13
- for (const subValue of value) {
14
- subValue.property.lazy = parameter.property.lazy;
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[], configRoot: Resource, parameter: Resource, configElement: Resource): boolean;
10
- handle(value: Resource[], configRoot: Resource, parameter: Resource, configElement: Resource): 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
- protected throwIncorrectTypeError(value: Resource, parameter: Resource): void;
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, configElement) {
13
+ canHandle(value, configRoot, parameter) {
14
14
  return Boolean(parameter.property.range);
15
15
  }
16
16
  handle(value, configRoot, parameter, configElement) {
17
- for (const subValue of value) {
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.type === 'Literal') {
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 (param.property.range.value) {
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
- this.throwIncorrectTypeError(value, param);
63
+ return false;
43
64
  }
44
- break;
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
- this.throwIncorrectTypeError(value, param);
73
+ return false;
53
74
  }
54
- else {
55
- // ParseInt also parses floats to ints!
56
- if (String(parsed) !== value.value) {
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
- break;
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
- this.throwIncorrectTypeError(value, param);
86
+ return false;
68
87
  }
69
- else {
70
- value.term.valueRaw = parsed;
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
- this.throwIncorrectTypeError(value, param);
96
+ return false;
80
97
  }
81
- break;
98
+ return true;
82
99
  }
83
100
  }
84
- return value;
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
- throw new ErrorResourcesContext_1.ErrorResourcesContext(`Parameter value "${value.value}" is not of required range type "${parameter.property.range.value}"`, {
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
@@ -41,7 +41,7 @@ export declare type RdfParserOptions = ParseOptions & {
41
41
  */
42
42
  contexts?: Record<string, any>;
43
43
  /**
44
- * The cached import paths.
44
+ * The cached import paths. (URL -> file)
45
45
  */
46
46
  importPaths?: Record<string, string>;
47
47
  /**
@@ -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
- options.baseIRI = options.path;
24
- // Windows paths always contain a ':'
25
- if (!options.baseIRI.includes(':') || /^[A-Za-z]:[/\\][^/]/u.test(options.baseIRI)) {
26
- options.baseIRI = `file://${options.baseIRI}`;
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": "4.5.0",
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.11.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