componentsjs 4.4.0 → 5.0.0-beta.1

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 (53) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/bin/compile-config.js +1 -1
  3. package/components/context.jsonld +65 -2
  4. package/lib/construction/ConfigConstructor.js +7 -14
  5. package/lib/construction/argument/ArgumentConstructorHandlerHash.js +3 -2
  6. package/lib/construction/strategy/ConstructionStrategyCommonJsString.js +3 -0
  7. package/lib/construction/strategy/IConstructionStrategy.d.ts +2 -2
  8. package/lib/loading/ComponentRegistry.d.ts +1 -1
  9. package/lib/loading/ComponentRegistry.js +1 -1
  10. package/lib/loading/ComponentRegistryFinalizer.js +18 -3
  11. package/lib/loading/ComponentsManagerBuilder.js +1 -1
  12. package/lib/loading/ConfigRegistry.d.ts +1 -1
  13. package/lib/preprocess/ConfigPreprocessorComponent.d.ts +3 -1
  14. package/lib/preprocess/ConfigPreprocessorComponent.js +38 -12
  15. package/lib/preprocess/ConfigPreprocessorComponentMapped.d.ts +4 -3
  16. package/lib/preprocess/ConfigPreprocessorComponentMapped.js +17 -18
  17. package/lib/preprocess/GenericsContext.d.ts +30 -0
  18. package/lib/preprocess/GenericsContext.js +63 -0
  19. package/lib/preprocess/ParameterHandler.d.ts +4 -2
  20. package/lib/preprocess/ParameterHandler.js +24 -12
  21. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerCollectEntries.d.ts +3 -2
  22. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerCollectEntries.js +24 -10
  23. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerElements.d.ts +2 -1
  24. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerElements.js +8 -5
  25. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerFields.d.ts +2 -1
  26. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerFields.js +16 -9
  27. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerKeyValue.d.ts +4 -3
  28. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerKeyValue.js +12 -12
  29. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerList.d.ts +2 -1
  30. package/lib/preprocess/constructorargumentsmapping/ConstructorArgumentsElementMappingHandlerList.js +9 -22
  31. package/lib/preprocess/constructorargumentsmapping/IConstructorArgumentsElementMappingHandler.d.ts +5 -2
  32. package/lib/preprocess/constructorargumentsmapping/IConstructorArgumentsMapper.d.ts +5 -2
  33. package/lib/preprocess/parameterproperty/IParameterPropertyHandler.d.ts +5 -2
  34. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefault.d.ts +6 -3
  35. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefault.js +20 -3
  36. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefaultScoped.d.ts +2 -2
  37. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerDefaultScoped.js +16 -5
  38. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerFixed.d.ts +5 -3
  39. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerFixed.js +25 -2
  40. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerLazy.d.ts +2 -2
  41. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerLazy.js +10 -3
  42. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRange.d.ts +18 -4
  43. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRange.js +179 -30
  44. package/lib/rdf/Iris.js +24 -24
  45. package/lib/rdf/RdfParser.d.ts +2 -2
  46. package/lib/rdf/RdfParser.js +17 -5
  47. package/lib/rdf/RdfStreamIncluder.d.ts +1 -1
  48. package/lib/rdf/RdfStreamIncluder.js +2 -2
  49. package/package.json +10 -10
  50. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRequired.d.ts +0 -11
  51. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerRequired.js +0 -23
  52. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerUnique.d.ts +0 -12
  53. package/lib/preprocess/parameterproperty/ParameterPropertyHandlerUnique.js +0 -34
@@ -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
  }
@@ -1,4 +1,5 @@
1
1
  import type { RdfObjectLoader, Resource } from 'rdf-object';
2
+ import type { GenericsContext } from '../GenericsContext';
2
3
  import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
3
4
  /**
4
5
  * If a param range is defined, apply the type and validate the range.
@@ -6,8 +7,8 @@ import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
6
7
  export declare class ParameterPropertyHandlerRange implements IParameterPropertyHandler {
7
8
  private readonly objectLoader;
8
9
  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[];
10
+ canHandle(value: Resource | undefined, configRoot: Resource, parameter: Resource): boolean;
11
+ handle(value: Resource | undefined, configRoot: Resource, parameter: Resource, configElement: Resource, genericsContext: GenericsContext): Resource | undefined;
11
12
  /**
12
13
  * Apply the given datatype to the given literal.
13
14
  * Checks if the datatype is correct and casts to the correct js type.
@@ -15,7 +16,20 @@ export declare class ParameterPropertyHandlerRange implements IParameterProperty
15
16
  * Will be ignored if the value is not a literal or the type is not recognized.
16
17
  * @param value The value.
17
18
  * @param param The parameter.
19
+ * @param genericsContext Context for generic types.
18
20
  */
19
- captureType(value: Resource, param: Resource): Resource;
20
- protected throwIncorrectTypeError(value: Resource, parameter: Resource): void;
21
+ captureType(value: Resource | undefined, param: Resource, genericsContext: GenericsContext): Resource | undefined;
22
+ /**
23
+ * Apply the given datatype to the given literal.
24
+ * Checks if the datatype is correct and casts to the correct js type.
25
+ * Will throw an error if the type has an invalid value.
26
+ * Will be ignored if the value is not a literal or the type is not recognized.
27
+ * @param value The value.
28
+ * @param param The parameter.
29
+ * @param paramRange The parameter's range.
30
+ * @param genericsContext Context for generic types.
31
+ */
32
+ hasParamValueValidType(value: Resource | undefined, param: Resource, paramRange: Resource, genericsContext: GenericsContext): boolean;
33
+ protected throwIncorrectTypeError(value: Resource | undefined, parameter: Resource, genericsContext: GenericsContext): never;
34
+ rangeToDisplayString(paramRange: Resource | undefined, genericsContext: GenericsContext): string;
21
35
  }
@@ -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
- handle(value, configRoot, parameter, configElement) {
17
- for (const subValue of value) {
18
- this.captureType(subValue, parameter);
19
- }
16
+ handle(value, configRoot, parameter, configElement, genericsContext) {
17
+ this.captureType(value, parameter, genericsContext);
20
18
  return value;
21
19
  }
22
20
  /**
@@ -26,11 +24,36 @@ class ParameterPropertyHandlerRange {
26
24
  * Will be ignored if the value is not a literal or the type is not recognized.
27
25
  * @param value The value.
28
26
  * @param param The parameter.
27
+ * @param genericsContext Context for generic types.
28
+ */
29
+ captureType(value, param, genericsContext) {
30
+ if (this.hasParamValueValidType(value, param, param.property.range, genericsContext)) {
31
+ return value;
32
+ }
33
+ this.throwIncorrectTypeError(value, param, genericsContext);
34
+ }
35
+ /**
36
+ * Apply the given datatype to the given literal.
37
+ * Checks if the datatype is correct and casts to the correct js type.
38
+ * Will throw an error if the type has an invalid value.
39
+ * Will be ignored if the value is not a literal or the type is not recognized.
40
+ * @param value The value.
41
+ * @param param The parameter.
42
+ * @param paramRange The parameter's range.
43
+ * @param genericsContext Context for generic types.
29
44
  */
30
- captureType(value, param) {
31
- if (value.type === 'Literal') {
45
+ hasParamValueValidType(value, param, paramRange, genericsContext) {
46
+ if (!paramRange) {
47
+ return true;
48
+ }
49
+ if (!value && paramRange.isA('ParameterRangeUndefined')) {
50
+ return true;
51
+ }
52
+ if (value && value.type === 'Literal') {
32
53
  let parsed;
33
- switch (param.property.range.value) {
54
+ switch (paramRange.value) {
55
+ case Iris_1.IRIS_XSD.string:
56
+ return true;
34
57
  case Iris_1.IRIS_XSD.boolean:
35
58
  if (value.value === 'true') {
36
59
  value.term.valueRaw = true;
@@ -39,9 +62,9 @@ class ParameterPropertyHandlerRange {
39
62
  value.term.valueRaw = false;
40
63
  }
41
64
  else {
42
- this.throwIncorrectTypeError(value, param);
65
+ return false;
43
66
  }
44
- break;
67
+ return true;
45
68
  case Iris_1.IRIS_XSD.integer:
46
69
  case Iris_1.IRIS_XSD.number:
47
70
  case Iris_1.IRIS_XSD.int:
@@ -49,44 +72,170 @@ class ParameterPropertyHandlerRange {
49
72
  case Iris_1.IRIS_XSD.long:
50
73
  parsed = Number.parseInt(value.value, 10);
51
74
  if (Number.isNaN(parsed)) {
52
- this.throwIncorrectTypeError(value, param);
75
+ return false;
53
76
  }
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;
77
+ // ParseInt also parses floats to ints!
78
+ if (String(parsed) !== value.value) {
79
+ return false;
60
80
  }
61
- break;
81
+ value.term.valueRaw = parsed;
82
+ return true;
62
83
  case Iris_1.IRIS_XSD.float:
63
84
  case Iris_1.IRIS_XSD.decimal:
64
85
  case Iris_1.IRIS_XSD.double:
65
86
  parsed = Number.parseFloat(value.value);
66
87
  if (Number.isNaN(parsed)) {
67
- this.throwIncorrectTypeError(value, param);
68
- }
69
- else {
70
- value.term.valueRaw = parsed;
88
+ return false;
71
89
  }
72
- break;
90
+ value.term.valueRaw = parsed;
91
+ return true;
73
92
  case Iris_1.IRIS_RDF.JSON:
74
93
  try {
75
94
  parsed = JSON.parse(value.value);
76
95
  value.term.valueRaw = parsed;
77
96
  }
78
97
  catch (_a) {
79
- this.throwIncorrectTypeError(value, param);
98
+ return false;
80
99
  }
81
- break;
100
+ return true;
82
101
  }
83
102
  }
84
- return value;
103
+ // Allow IRIs to be casted to strings
104
+ if (value && paramRange && paramRange.value === Iris_1.IRIS_XSD.string && value.type === 'NamedNode') {
105
+ return true;
106
+ }
107
+ if (paramRange && (!value || (!value.isA('Variable') && !value.isA(paramRange.term)))) {
108
+ if (value && paramRange.isA('ParameterRangeArray')) {
109
+ if (!value.list) {
110
+ return false;
111
+ }
112
+ return value.list.every(listElement => this
113
+ .hasParamValueValidType(listElement, param, paramRange.property.parameterRangeValue, genericsContext));
114
+ }
115
+ // Check if the param type is a composed type
116
+ if (paramRange.isA('ParameterRangeUnion')) {
117
+ return paramRange.properties.parameterRangeElements
118
+ .some(child => this.hasParamValueValidType(value, param, child, genericsContext));
119
+ }
120
+ if (paramRange.isA('ParameterRangeIntersection')) {
121
+ return paramRange.properties.parameterRangeElements
122
+ .every(child => this.hasParamValueValidType(value, param, child, genericsContext));
123
+ }
124
+ if (paramRange.isA('ParameterRangeTuple')) {
125
+ if (!value || !value.list) {
126
+ return false;
127
+ }
128
+ // Iterate over list elements and try to match with tuple types
129
+ const listElements = value.list;
130
+ const tupleTypes = paramRange.properties.parameterRangeElements;
131
+ let listIndex = 0;
132
+ let tupleIndex = 0;
133
+ while (listIndex < listElements.length && tupleIndex < tupleTypes.length) {
134
+ if (tupleTypes[tupleIndex].isA('ParameterRangeRest')) {
135
+ // Rest types can match multiple list elements, so only increment index if no match is found.
136
+ if (!this.hasParamValueValidType(listElements[listIndex], param, tupleTypes[tupleIndex].property.parameterRangeValue, genericsContext)) {
137
+ tupleIndex++;
138
+ }
139
+ else {
140
+ listIndex++;
141
+ }
142
+ }
143
+ else {
144
+ if (!this.hasParamValueValidType(listElements[listIndex], param, tupleTypes[tupleIndex], genericsContext)) {
145
+ return false;
146
+ }
147
+ tupleIndex++;
148
+ listIndex++;
149
+ }
150
+ }
151
+ return listIndex === listElements.length &&
152
+ (tupleIndex === tupleTypes.length ||
153
+ (tupleIndex === tupleTypes.length - 1 && tupleTypes[tupleIndex].isA('ParameterRangeRest')));
154
+ }
155
+ if (paramRange.isA('ParameterRangeLiteral')) {
156
+ return Boolean(value && value.term.equals(paramRange.property.parameterRangeValue.term));
157
+ }
158
+ // Check if the range refers to a generic type
159
+ if (paramRange.isA('ParameterRangeGenericTypeReference')) {
160
+ return genericsContext.bindGenericTypeToValue(paramRange.property.parameterRangeGenericType.value, value, (subValue, subType) => this.hasParamValueValidType(subValue, param, subType, genericsContext));
161
+ }
162
+ // Check if the range refers to a component with a generic type
163
+ if (paramRange.isA('ParameterRangeGenericComponent')) {
164
+ if (value) {
165
+ if (value.property.genericTypeInstances) {
166
+ // Once we support manual generics setting, we'll need to check here if we can merge with it.
167
+ throw new ErrorResourcesContext_1.ErrorResourcesContext(`Simultaneous manual generic type passing and generic type inference are not supported yet.`, { parameter: param, value });
168
+ }
169
+ // For the defined generic type instances, apply them into the instance so they can be checked later
170
+ value.properties.genericTypeInstances = paramRange.properties.genericTypeInstances
171
+ .map(genericTypeInstance => this.objectLoader.createCompactedResource({
172
+ type: 'ParameterRangeGenericTypeReference',
173
+ parameterRangeGenericType: genericTypeInstance.property.parameterRangeGenericType.value,
174
+ parameterRangeGenericBindings: genericsContext
175
+ .bindings[genericTypeInstance.property.parameterRangeGenericType.value],
176
+ }));
177
+ }
178
+ return this.hasParamValueValidType(value, param, paramRange.property.component, genericsContext);
179
+ }
180
+ // Check if this param defines a field with sub-params
181
+ if (paramRange.isA('ParameterRangeCollectEntries')) {
182
+ // TODO: Add support for type-checking nested fields with collectEntries
183
+ return true;
184
+ }
185
+ return false;
186
+ }
187
+ return true;
188
+ }
189
+ throwIncorrectTypeError(value, parameter, genericsContext) {
190
+ const withTypes = value && value.properties.types.length > 0 ? ` with types "${value.properties.types.map(resource => resource.value)}"` : '';
191
+ // eslint-disable-next-line @typescript-eslint/no-extra-parens
192
+ const valueString = value ? (value.list ? `[${value.list.map(subValue => subValue.value).join(', ')}]` : value.value) : 'undefined';
193
+ throw new ErrorResourcesContext_1.ErrorResourcesContext(`The value "${valueString}"${withTypes} for parameter "${parameter.value}" is not of required range type "${this.rangeToDisplayString(parameter.property.range, genericsContext)}"`, Object.assign(Object.assign({ value: value || 'undefined' }, Object.keys(genericsContext.bindings).length > 0 ?
194
+ { generics: `[\n ${Object.entries(genericsContext.bindings)
195
+ .map(([id, values]) => `<${id}> => ${values.map(subValue => subValue.value)}`)
196
+ .join(',\n ')}\n]` } :
197
+ {}), { parameter }));
85
198
  }
86
- throwIncorrectTypeError(value, parameter) {
87
- throw new ErrorResourcesContext_1.ErrorResourcesContext(`Parameter value "${value.value}" is not of required range type "${parameter.property.range.value}"`, {
88
- parameter,
89
- });
199
+ rangeToDisplayString(paramRange, genericsContext) {
200
+ if (!paramRange) {
201
+ return `any`;
202
+ }
203
+ if (paramRange.isA('ParameterRangeUndefined')) {
204
+ return `undefined`;
205
+ }
206
+ if (paramRange.isA('ParameterRangeArray')) {
207
+ return `${this.rangeToDisplayString(paramRange.property.parameterRangeValue, genericsContext)}[]`;
208
+ }
209
+ if (paramRange.isA('ParameterRangeRest')) {
210
+ return `...${this.rangeToDisplayString(paramRange.property.parameterRangeValue, genericsContext)}`;
211
+ }
212
+ if (paramRange.isA('ParameterRangeUnion')) {
213
+ return paramRange.properties.parameterRangeElements
214
+ .map(child => this.rangeToDisplayString(child, genericsContext))
215
+ .join(' | ');
216
+ }
217
+ if (paramRange.isA('ParameterRangeIntersection')) {
218
+ return paramRange.properties.parameterRangeElements
219
+ .map(child => this.rangeToDisplayString(child, genericsContext))
220
+ .join(' & ');
221
+ }
222
+ if (paramRange.isA('ParameterRangeTuple')) {
223
+ return `[${paramRange.properties.parameterRangeElements
224
+ .map(child => this.rangeToDisplayString(child, genericsContext))
225
+ .join(', ')}]`;
226
+ }
227
+ if (paramRange.isA('ParameterRangeLiteral')) {
228
+ return paramRange.property.parameterRangeValue.value;
229
+ }
230
+ if (paramRange.isA('ParameterRangeGenericTypeReference')) {
231
+ const valid = paramRange.property.parameterRangeGenericType.value in genericsContext.genericTypeIds;
232
+ return `<${valid ? '' : 'UNKNOWN GENERIC: '}${paramRange.property.parameterRangeGenericType.value}>`;
233
+ }
234
+ if (paramRange.isA('ParameterRangeGenericComponent')) {
235
+ return `(${this.rangeToDisplayString(paramRange.property.component, genericsContext)})${paramRange.properties.genericTypeInstances
236
+ .map(genericTypeInstance => this.rangeToDisplayString(genericTypeInstance, genericsContext)).join('')}`;
237
+ }
238
+ return paramRange.value;
90
239
  }
91
240
  }
92
241
  exports.ParameterPropertyHandlerRange = ParameterPropertyHandlerRange;
package/lib/rdf/Iris.js CHANGED
@@ -4,45 +4,45 @@ exports.IRIS_OWL = exports.PREFIX_OWL = exports.IRIS_DOAP = exports.PREFIX_DOAP
4
4
  const definePrefix = (prefix) => (suffix) => `${prefix}${suffix}`;
5
5
  exports.PREFIX_OO = definePrefix('https://linkedsoftwaredependencies.org/vocabularies/object-oriented#');
6
6
  exports.IRIS_OO = {
7
- Module: exports.PREFIX_OO('Module'),
8
- Class: exports.PREFIX_OO('Class'),
9
- AbstractClass: exports.PREFIX_OO('AbstractClass'),
10
- ComponentInstance: exports.PREFIX_OO('ComponentInstance'),
11
- component: exports.PREFIX_OO('component'),
12
- componentPath: exports.PREFIX_OO('componentPath'),
13
- parameter: exports.PREFIX_OO('parameter'),
7
+ Module: (0, exports.PREFIX_OO)('Module'),
8
+ Class: (0, exports.PREFIX_OO)('Class'),
9
+ AbstractClass: (0, exports.PREFIX_OO)('AbstractClass'),
10
+ ComponentInstance: (0, exports.PREFIX_OO)('ComponentInstance'),
11
+ component: (0, exports.PREFIX_OO)('component'),
12
+ componentPath: (0, exports.PREFIX_OO)('componentPath'),
13
+ parameter: (0, exports.PREFIX_OO)('parameter'),
14
14
  };
15
15
  exports.PREFIX_OM = definePrefix('https://linkedsoftwaredependencies.org/vocabularies/object-mapping#');
16
16
  exports.PREFIX_RDF = definePrefix('http://www.w3.org/1999/02/22-rdf-syntax-ns#');
17
17
  exports.IRIS_RDF = {
18
- subject: exports.PREFIX_RDF('subject'),
19
- object: exports.PREFIX_RDF('object'),
20
- type: exports.PREFIX_RDF('type'),
21
- JSON: exports.PREFIX_RDF('JSON'),
18
+ subject: (0, exports.PREFIX_RDF)('subject'),
19
+ object: (0, exports.PREFIX_RDF)('object'),
20
+ type: (0, exports.PREFIX_RDF)('type'),
21
+ JSON: (0, exports.PREFIX_RDF)('JSON'),
22
22
  };
23
23
  exports.PREFIX_RDFS = definePrefix('http://www.w3.org/2000/01/rdf-schema#');
24
24
  exports.IRIS_RDFS = {
25
- imports: exports.PREFIX_RDFS('seeAlso'),
25
+ imports: (0, exports.PREFIX_RDFS)('seeAlso'),
26
26
  };
27
27
  exports.PREFIX_XSD = definePrefix('http://www.w3.org/2001/XMLSchema#');
28
28
  exports.IRIS_XSD = {
29
- string: exports.PREFIX_XSD('string'),
30
- boolean: exports.PREFIX_XSD('boolean'),
31
- integer: exports.PREFIX_XSD('integer'),
32
- number: exports.PREFIX_XSD('number'),
33
- int: exports.PREFIX_XSD('int'),
34
- byte: exports.PREFIX_XSD('byte'),
35
- long: exports.PREFIX_XSD('long'),
36
- float: exports.PREFIX_XSD('float'),
37
- decimal: exports.PREFIX_XSD('decimal'),
38
- double: exports.PREFIX_XSD('double'),
29
+ string: (0, exports.PREFIX_XSD)('string'),
30
+ boolean: (0, exports.PREFIX_XSD)('boolean'),
31
+ integer: (0, exports.PREFIX_XSD)('integer'),
32
+ number: (0, exports.PREFIX_XSD)('number'),
33
+ int: (0, exports.PREFIX_XSD)('int'),
34
+ byte: (0, exports.PREFIX_XSD)('byte'),
35
+ long: (0, exports.PREFIX_XSD)('long'),
36
+ float: (0, exports.PREFIX_XSD)('float'),
37
+ decimal: (0, exports.PREFIX_XSD)('decimal'),
38
+ double: (0, exports.PREFIX_XSD)('double'),
39
39
  };
40
40
  exports.PREFIX_DOAP = definePrefix('http://usefulinc.com/ns/doap#');
41
41
  exports.IRIS_DOAP = {
42
- name: exports.PREFIX_DOAP('name'),
42
+ name: (0, exports.PREFIX_DOAP)('name'),
43
43
  };
44
44
  exports.PREFIX_OWL = definePrefix('http://www.w3.org/2002/07/owl#');
45
45
  exports.IRIS_OWL = {
46
- Restriction: exports.PREFIX_OWL('Restriction'),
46
+ Restriction: (0, exports.PREFIX_OWL)('Restriction'),
47
47
  };
48
48
  //# sourceMappingURL=Iris.js.map
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import type { Readable } from 'stream';
3
- import type * as RDF from 'rdf-js';
3
+ import type * as RDF from '@rdfjs/types';
4
4
  import type { ParseOptions } from 'rdf-parse';
5
5
  import type { Logger } from 'winston';
6
6
  /**
@@ -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
@@ -61,7 +73,7 @@ class RdfParser {
61
73
  if (!(await fs.stat(pathOrUrl)).isFile()) {
62
74
  throw new Error(`Path does not refer to a valid file: ${pathOrUrl}`);
63
75
  }
64
- return fs_1.createReadStream(pathOrUrl);
76
+ return (0, fs_1.createReadStream)(pathOrUrl);
65
77
  }
66
78
  /**
67
79
  * Add the path to an error message.
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import type { TransformCallback } from 'stream';
3
3
  import { Transform } from 'stream';
4
- import type * as RDF from 'rdf-js';
4
+ import type * as RDF from '@rdfjs/types';
5
5
  import type { RdfParserOptions } from './RdfParser';
6
6
  /**
7
7
  * A RdfStreamIncluder takes a triple stream and detects owl:includes to automatically include other files.
@@ -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))
@@ -70,7 +70,7 @@ class RdfStreamIncluder extends stream_1.Transform {
70
70
  */
71
71
  validateIris(quad) {
72
72
  if (this.parserOptions.logger) {
73
- for (const term of rdf_terms_1.getNamedNodes(rdf_terms_1.getTerms(quad))) {
73
+ for (const term of (0, rdf_terms_1.getNamedNodes)((0, rdf_terms_1.getTerms)(quad))) {
74
74
  if (!RdfStreamIncluder.isValidIri(term.value)) {
75
75
  this.parserOptions.logger.warn(`Detected potentially invalid IRI '${term.value}' in ${this.parserOptions.path}`);
76
76
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "componentsjs",
3
- "version": "4.4.0",
3
+ "version": "5.0.0-beta.1",
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"
@@ -33,17 +33,17 @@
33
33
  "version": "manual-git-changelog onversion"
34
34
  },
35
35
  "dependencies": {
36
+ "@rdfjs/types": "*",
36
37
  "@types/minimist": "^1.2.0",
37
38
  "@types/node": "^14.14.7",
38
- "@types/rdf-js": "*",
39
39
  "@types/semver": "^7.3.4",
40
40
  "jsonld-context-parser": "^2.1.1",
41
41
  "minimist": "^1.2.0",
42
- "rdf-data-factory": "^1.0.4",
43
- "rdf-object": "^1.8.0",
44
- "rdf-parse": "^1.8.1",
42
+ "rdf-data-factory": "^1.1.0",
43
+ "rdf-object": "^1.12.0",
44
+ "rdf-parse": "^1.9.1",
45
45
  "rdf-quad": "^1.5.0",
46
- "rdf-terms": "^1.6.2",
46
+ "rdf-terms": "^1.7.0",
47
47
  "semver": "^7.3.2",
48
48
  "winston": "^3.3.3"
49
49
  },
@@ -51,7 +51,7 @@
51
51
  "@rubensworks/eslint-config": "^1.0.1",
52
52
  "@typescript-eslint/eslint-plugin": "^4.6.1",
53
53
  "@typescript-eslint/parser": "^4.6.1",
54
- "@types/jest": "^26.0.23",
54
+ "@types/jest": "^27.0.0",
55
55
  "eslint": "^7.12.1",
56
56
  "eslint-config-es": "3.25.3",
57
57
  "eslint-import-resolver-typescript": "^2.3.0",
@@ -60,14 +60,14 @@
60
60
  "eslint-plugin-tsdoc": "^0.2.7",
61
61
  "eslint-plugin-unused-imports": "^1.0.0",
62
62
  "jest": "^27.0.1",
63
- "jest-rdf": "^1.6.0",
63
+ "jest-rdf": "^1.7.0",
64
64
  "jshint": "^2.1.10",
65
65
  "manual-git-changelog": "^1.0.1",
66
- "n3": "^1.6.3",
66
+ "n3": "^1.11.1",
67
67
  "pre-commit": "^1.2.2",
68
68
  "streamify-string": "^1.0.1",
69
69
  "ts-jest": "^27.0.1",
70
- "typescript": "^4.0.3"
70
+ "typescript": "^4.3.5"
71
71
  },
72
72
  "files": [
73
73
  "components",
@@ -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