@shaclmate/compiler 4.0.14 → 4.0.16
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/dist/Compiler.d.ts +4 -1
- package/dist/Compiler.js +3 -1
- package/dist/ShapesGraphToAstTransformer.d.ts +10 -2
- package/dist/ShapesGraphToAstTransformer.js +72 -1
- package/dist/_ShapesGraphToAstTransformer/nodeShapeIdentifierMintingStrategy.js +14 -13
- package/dist/_ShapesGraphToAstTransformer/shapeNodeKinds.js +18 -17
- package/dist/_ShapesGraphToAstTransformer/transformShapeToAstCompoundType.js +6 -2
- package/dist/_ShapesGraphToAstTransformer/transformShapeToAstListType.js +8 -8
- package/dist/_ShapesGraphToAstTransformer/transformShapeToAstObjectType.js +10 -5
- package/dist/ast/ObjectCompoundType.js +1 -1
- package/dist/ast/ObjectType.d.ts +1 -1
- package/dist/ast/ObjectType.js +1 -1
- package/dist/generators/json/AstJsonGenerator.js +1 -1
- package/dist/generators/ts/AbstractCollectionType.js +1 -7
- package/dist/generators/ts/AbstractTermType.d.ts +1 -0
- package/dist/generators/ts/AbstractTermType.js +6 -0
- package/dist/generators/ts/AbstractUnionType.d.ts +31 -9
- package/dist/generators/ts/AbstractUnionType.js +252 -126
- package/dist/generators/ts/DefaultValueType.js +1 -1
- package/dist/generators/ts/NamedObjectUnionType.js +1 -1
- package/dist/generators/ts/SetType.d.ts +1 -0
- package/dist/generators/ts/SetType.js +12 -0
- package/dist/generators/ts/TypeFactory.js +1 -1
- package/dist/generators/ts/_NamedObjectType/ShaclProperty.d.ts +1 -1
- package/dist/generators/ts/imports.js +4 -4
- package/dist/input/ShapesGraph.d.ts +38 -21
- package/dist/input/ShapesGraph.js +56 -58
- package/dist/input/generated.d.ts +211 -46
- package/dist/input/generated.js +2283 -677
- package/dist/input/index.d.ts +1 -3
- package/dist/input/index.js +1 -3
- package/package.json +5 -10
- package/dist/input/NodeShape.d.ts +0 -11
- package/dist/input/NodeShape.js +0 -2
- package/dist/input/Shape.d.ts +0 -4
- package/dist/input/Shape.js +0 -2
- package/dist/input/ancestorClassIris.d.ts +0 -4
- package/dist/input/ancestorClassIris.js +0 -24
- package/dist/input/descendantClassIris.d.ts +0 -4
- package/dist/input/descendantClassIris.js +0 -27
|
@@ -13,6 +13,19 @@ import { removeUndefined } from "./removeUndefined.js";
|
|
|
13
13
|
import { snippets } from "./snippets.js";
|
|
14
14
|
import { syntheticNamePrefix } from "./syntheticNamePrefix.js";
|
|
15
15
|
import { code, joinCode, literalOf } from "./ts-poet-wrapper.js";
|
|
16
|
+
const emptyTermTypesSet = new Set();
|
|
17
|
+
function termTypes(type) {
|
|
18
|
+
switch (type.kind) {
|
|
19
|
+
case "BlankNodeType":
|
|
20
|
+
case "IriType":
|
|
21
|
+
case "IdentifierType":
|
|
22
|
+
case "LiteralType":
|
|
23
|
+
case "TermType":
|
|
24
|
+
return type.termTypes;
|
|
25
|
+
default:
|
|
26
|
+
return emptyTermTypesSet;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
16
29
|
export class AbstractUnionType extends AbstractType {
|
|
17
30
|
discriminant;
|
|
18
31
|
identifierType;
|
|
@@ -24,27 +37,22 @@ export class AbstractUnionType extends AbstractType {
|
|
|
24
37
|
this.identifierType = identifierType;
|
|
25
38
|
invariant(members.length >= 2);
|
|
26
39
|
this.recursive = recursive;
|
|
27
|
-
|
|
28
|
-
this.discriminant = {
|
|
29
|
-
descendantValues: [],
|
|
30
|
-
kind: "envelope",
|
|
31
|
-
name: "type",
|
|
32
|
-
ownValues: members.map((member, memberI) => member.discriminantValue.orDefault(memberI)),
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
this.discriminant = Discriminant.infer(members.map((member) => member.type));
|
|
37
|
-
}
|
|
40
|
+
this.discriminant = Discriminant.infer(members);
|
|
38
41
|
this.lazyMembers = () => members.map((member, memberI) => {
|
|
39
42
|
if (member.type.abstract) {
|
|
40
43
|
return { abstract: true, discriminantValues: [], type: member.type };
|
|
41
44
|
}
|
|
42
45
|
let discriminantValues;
|
|
46
|
+
invariant(this.discriminant.memberValues.length === members.length);
|
|
43
47
|
switch (this.discriminant.kind) {
|
|
44
|
-
case "
|
|
45
|
-
discriminantValues = [this.discriminant.
|
|
48
|
+
case "extrinsic":
|
|
49
|
+
discriminantValues = [this.discriminant.memberValues[memberI]];
|
|
46
50
|
break;
|
|
47
|
-
case "
|
|
51
|
+
case "hybrid":
|
|
52
|
+
discriminantValues =
|
|
53
|
+
this.discriminant.memberValues[memberI].ownValues;
|
|
54
|
+
break;
|
|
55
|
+
case "intrinsic": {
|
|
48
56
|
// A member type's combined discriminant property values are its "own" values plus any descendant values that are
|
|
49
57
|
// not the "own" values of some other member type.
|
|
50
58
|
// So if you have type A, type B, and B inherits A, then
|
|
@@ -70,7 +78,7 @@ export class AbstractUnionType extends AbstractType {
|
|
|
70
78
|
break;
|
|
71
79
|
}
|
|
72
80
|
case "typeof":
|
|
73
|
-
discriminantValues =
|
|
81
|
+
discriminantValues = [this.discriminant.memberValues[memberI]];
|
|
74
82
|
break;
|
|
75
83
|
default:
|
|
76
84
|
throw this.discriminant;
|
|
@@ -79,45 +87,62 @@ export class AbstractUnionType extends AbstractType {
|
|
|
79
87
|
return { abstract: true, discriminantValues: [], type: member.type };
|
|
80
88
|
}
|
|
81
89
|
const typeCheck = (json) => (instance) => {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return code `(${joinCode(discriminantValues.map((discriminantValue) => code `${instance}.${this.discriminant.name} === ${literalOf(discriminantValue)}`), { on: " || " })})`;
|
|
90
|
+
const discriminant = this.discriminant; // To get type narrowing to work
|
|
91
|
+
if (discriminant.kind === "typeof") {
|
|
92
|
+
return code `(${joinCode(discriminantValues.map((discriminantValue) => code `typeof ${instance} === ${literalOf(discriminantValue)}`), { on: " || " })})`;
|
|
93
|
+
}
|
|
94
|
+
if (discriminant.kind === "intrinsic" && !json) {
|
|
95
|
+
switch (member.type.kind) {
|
|
96
|
+
case "NamedObjectUnionType":
|
|
97
|
+
case "NamedUnionType":
|
|
98
|
+
case "NamedObjectType":
|
|
99
|
+
return code `${member.type.staticModuleName}.is${member.type.name}(${instance})`;
|
|
95
100
|
}
|
|
96
|
-
case "typeof":
|
|
97
|
-
return code `(${joinCode(discriminantValues.map((discriminantValue) => code `typeof ${instance} === ${literalOf(discriminantValue)}`), { on: " || " })})`;
|
|
98
101
|
}
|
|
102
|
+
return code `(${joinCode(discriminantValues.map((discriminantValue) => code `${instance}.${discriminant.name} === ${literalOf(discriminantValue)}`), { on: " || " })})`;
|
|
99
103
|
};
|
|
100
104
|
return {
|
|
101
105
|
abstract: false,
|
|
102
106
|
discriminantValues,
|
|
107
|
+
jsonType: member.type.jsonType({
|
|
108
|
+
includeDiscriminantProperty: this.discriminant.kind === "intrinsic" ||
|
|
109
|
+
(this.discriminant.kind === "hybrid" &&
|
|
110
|
+
this.discriminant.memberValues[memberI].kind === "intrinsic"),
|
|
111
|
+
}).name,
|
|
103
112
|
jsonTypeCheck: typeCheck(true),
|
|
104
113
|
primaryDiscriminantValue: discriminantValues[0],
|
|
105
114
|
type: member.type,
|
|
106
115
|
typeCheck: typeCheck(false),
|
|
116
|
+
typeToJsonExpression: (valueVariable) => member.type.toJsonExpression({
|
|
117
|
+
includeDiscriminantProperty: this.discriminant.kind === "intrinsic" ||
|
|
118
|
+
(this.discriminant.kind === "hybrid" &&
|
|
119
|
+
this.discriminant.memberValues[memberI].kind === "intrinsic"),
|
|
120
|
+
variables: { value: valueVariable },
|
|
121
|
+
}),
|
|
107
122
|
unwrap: (instance) => {
|
|
108
123
|
switch (this.discriminant.kind) {
|
|
109
|
-
case "
|
|
124
|
+
case "extrinsic":
|
|
110
125
|
return code `${instance}.value`;
|
|
111
|
-
case "
|
|
126
|
+
case "hybrid":
|
|
127
|
+
return this.discriminant.memberValues[memberI].kind ===
|
|
128
|
+
"intrinsic"
|
|
129
|
+
? instance
|
|
130
|
+
: code `${instance}.value`;
|
|
131
|
+
case "intrinsic":
|
|
112
132
|
case "typeof":
|
|
113
133
|
return instance;
|
|
114
134
|
}
|
|
115
135
|
},
|
|
116
136
|
wrap: (instance) => {
|
|
117
137
|
switch (this.discriminant.kind) {
|
|
118
|
-
case "
|
|
119
|
-
return code `{ ${this.discriminant.name}:
|
|
120
|
-
case "
|
|
138
|
+
case "extrinsic":
|
|
139
|
+
return code `{ ${this.discriminant.name}: ${literalOf(discriminantValues[0])} as const, value: ${instance} }`;
|
|
140
|
+
case "hybrid":
|
|
141
|
+
return this.discriminant.memberValues[memberI].kind ===
|
|
142
|
+
"intrinsic"
|
|
143
|
+
? instance
|
|
144
|
+
: code `{ ${this.discriminant.name}: ${literalOf(discriminantValues[0])} as const, value: ${instance} }`;
|
|
145
|
+
case "intrinsic":
|
|
121
146
|
case "typeof":
|
|
122
147
|
return instance;
|
|
123
148
|
}
|
|
@@ -127,8 +152,9 @@ export class AbstractUnionType extends AbstractType {
|
|
|
127
152
|
}
|
|
128
153
|
get conversions() {
|
|
129
154
|
switch (this.discriminant.kind) {
|
|
130
|
-
case "
|
|
131
|
-
case "
|
|
155
|
+
case "extrinsic":
|
|
156
|
+
case "hybrid":
|
|
157
|
+
case "intrinsic":
|
|
132
158
|
return [
|
|
133
159
|
{
|
|
134
160
|
conversionExpression: (value) => value,
|
|
@@ -150,9 +176,24 @@ export class AbstractUnionType extends AbstractType {
|
|
|
150
176
|
}
|
|
151
177
|
get discriminantProperty() {
|
|
152
178
|
switch (this.discriminant.kind) {
|
|
153
|
-
case "
|
|
154
|
-
|
|
155
|
-
|
|
179
|
+
case "extrinsic":
|
|
180
|
+
return Maybe.of({
|
|
181
|
+
descendantValues: [],
|
|
182
|
+
ownValues: this.discriminant.memberValues,
|
|
183
|
+
name: this.discriminant.name,
|
|
184
|
+
});
|
|
185
|
+
case "hybrid":
|
|
186
|
+
return Maybe.of({
|
|
187
|
+
descendantValues: [],
|
|
188
|
+
ownValues: this.discriminant.memberValues.flatMap((_) => _.ownValues),
|
|
189
|
+
name: "termType",
|
|
190
|
+
});
|
|
191
|
+
case "intrinsic":
|
|
192
|
+
return Maybe.of({
|
|
193
|
+
descendantValues: this.discriminant.memberValues.flatMap((_) => _.descendantValues),
|
|
194
|
+
name: this.discriminant.name,
|
|
195
|
+
ownValues: this.discriminant.memberValues.flatMap((_) => _.ownValues),
|
|
196
|
+
});
|
|
156
197
|
case "typeof":
|
|
157
198
|
return Maybe.empty();
|
|
158
199
|
default:
|
|
@@ -172,7 +213,7 @@ export class AbstractUnionType extends AbstractType {
|
|
|
172
213
|
invariant(this.kind.endsWith("Type"));
|
|
173
214
|
return code `${{
|
|
174
215
|
// discriminant: {
|
|
175
|
-
// kind: '"
|
|
216
|
+
// kind: '"extrinsic" | "intrinsic" | "typeof"',
|
|
176
217
|
// },
|
|
177
218
|
kind: code `${literalOf(this.kind.substring(0, this.kind.length - "Type".length))}`,
|
|
178
219
|
members: code `{ ${joinCode(this.concreteMembers.map(({ type, primaryDiscriminantValue }) => code `readonly ${literalOf(primaryDiscriminantValue)}: ${{
|
|
@@ -228,9 +269,9 @@ if (filter.on?.[${literalOf(primaryDiscriminantValue)}] !== undefined && ${typeC
|
|
|
228
269
|
get inlineFromJsonFunction() {
|
|
229
270
|
return code `\
|
|
230
271
|
((value: ${this.jsonType().name}): ${this.name} => {
|
|
231
|
-
${joinCode(this.concreteMembers.map(({ jsonTypeCheck, type, unwrap, wrap }) => code `if (${jsonTypeCheck(code `value`)}) { return ${wrap(type.fromJsonExpression({
|
|
272
|
+
${joinCode(this.concreteMembers.map(({ jsonType, jsonTypeCheck, type, unwrap, wrap }) => code `if (${jsonTypeCheck(code `value`)}) { return ${wrap(type.fromJsonExpression({
|
|
232
273
|
variables: {
|
|
233
|
-
value: code `(${unwrap(code `value`)} as ${
|
|
274
|
+
value: code `(${unwrap(code `value`)} as ${jsonType})`,
|
|
234
275
|
},
|
|
235
276
|
}))}; }`))}
|
|
236
277
|
|
|
@@ -251,7 +292,7 @@ ${joinCode(this.concreteMembers.map(({ jsonTypeCheck, type, unwrap, wrap }) => c
|
|
|
251
292
|
(((values, _options) =>
|
|
252
293
|
values.chain(values => values.chainMap(value => {
|
|
253
294
|
const valueAsValues = ${imports.Right}(value.toValues());
|
|
254
|
-
return ${this.concreteMembers.reduce((expression, { type, primaryDiscriminantValue }) => {
|
|
295
|
+
return ${this.concreteMembers.reduce((expression, { type, primaryDiscriminantValue }, memberI) => {
|
|
255
296
|
let typeExpression = type.fromRdfResourceValuesExpression({
|
|
256
297
|
variables: {
|
|
257
298
|
context: variables.context,
|
|
@@ -264,7 +305,9 @@ ${joinCode(this.concreteMembers.map(({ jsonTypeCheck, type, unwrap, wrap }) => c
|
|
|
264
305
|
resourceValues: code `valueAsValues`,
|
|
265
306
|
},
|
|
266
307
|
});
|
|
267
|
-
if (this.discriminant.kind === "
|
|
308
|
+
if (this.discriminant.kind === "extrinsic" ||
|
|
309
|
+
(this.discriminant.kind === "hybrid" &&
|
|
310
|
+
this.discriminant.memberValues[memberI].kind === "extrinsic")) {
|
|
268
311
|
typeExpression = code `${typeExpression}.map(values => values.map(value => ({ ${this.discriminant.name}: ${literalOf(primaryDiscriminantValue)} as const, value }) as (${this.name})))`;
|
|
269
312
|
}
|
|
270
313
|
typeExpression = code `(${typeExpression} as ${imports.Either}<Error, ${imports.Resource}.Values<${this.name}>>)`;
|
|
@@ -276,38 +319,75 @@ ${joinCode(this.concreteMembers.map(({ jsonTypeCheck, type, unwrap, wrap }) => c
|
|
|
276
319
|
) satisfies ${snippets.FromRdfResourceValuesFunction}<${this.name}>)`;
|
|
277
320
|
}
|
|
278
321
|
get inlineJsonType() {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
322
|
+
const discriminant = this.discriminant; // To get type narrowing to work
|
|
323
|
+
switch (discriminant.kind) {
|
|
324
|
+
case "extrinsic":
|
|
325
|
+
return new AbstractType.JsonType(code `(${joinCode(this.concreteMembers.map(({ jsonType, primaryDiscriminantValue }) => code `{ ${discriminant.name}: ${literalOf(primaryDiscriminantValue)}, value: ${jsonType} }`), { on: "|" })})`);
|
|
326
|
+
case "hybrid":
|
|
327
|
+
return new AbstractType.JsonType(code `(${joinCode(this.concreteMembers.map(({ jsonType, primaryDiscriminantValue }, memberI) => {
|
|
328
|
+
switch (discriminant.memberValues[memberI].kind) {
|
|
329
|
+
case "extrinsic":
|
|
330
|
+
return code `{ ${discriminant.name}: ${literalOf(primaryDiscriminantValue)}, value: ${jsonType} }`;
|
|
331
|
+
case "intrinsic":
|
|
332
|
+
return code `${jsonType}`;
|
|
333
|
+
default:
|
|
334
|
+
throw new Error();
|
|
335
|
+
}
|
|
336
|
+
}), { on: "|" })})`);
|
|
337
|
+
case "intrinsic":
|
|
283
338
|
case "typeof":
|
|
284
|
-
return new AbstractType.JsonType(joinCode(this.concreteMembers.map(({
|
|
285
|
-
includeDiscriminantProperty: this.discriminant.kind === "inline",
|
|
286
|
-
}).name}`), { on: "|" }));
|
|
339
|
+
return new AbstractType.JsonType(joinCode(this.concreteMembers.map(({ jsonType }) => code `${jsonType}`), { on: "|" }));
|
|
287
340
|
default:
|
|
288
|
-
throw
|
|
341
|
+
throw discriminant;
|
|
289
342
|
}
|
|
290
343
|
}
|
|
291
344
|
get inlineJsonSchema() {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
345
|
+
const discriminant = this.discriminant; // To get type narrowing to work
|
|
346
|
+
switch (discriminant.kind) {
|
|
347
|
+
case "extrinsic":
|
|
348
|
+
return code `${imports.z}.discriminatedUnion("${discriminant.name}", [${joinCode(this.concreteMembers.map(({ type, primaryDiscriminantValue }) => code `${imports.z}.object({ ${discriminant.name}: ${imports.z}.literal(${literalOf(primaryDiscriminantValue)}), value: ${type.jsonSchema({ context: "type" })} })`), { on: "," })}]).readonly()`;
|
|
349
|
+
case "hybrid":
|
|
350
|
+
return code `${imports.z}.discriminatedUnion("${discriminant.name}", [${joinCode(this.concreteMembers.map(({ primaryDiscriminantValue, type }, memberI) => {
|
|
351
|
+
switch (discriminant.memberValues[memberI].kind) {
|
|
352
|
+
case "extrinsic":
|
|
353
|
+
return code `${imports.z}.object({ ${discriminant.name}: ${imports.z}.literal(${literalOf(primaryDiscriminantValue)}), value: ${type.jsonSchema({ context: "type" })} })`;
|
|
354
|
+
case "intrinsic":
|
|
355
|
+
return type.jsonSchema({
|
|
356
|
+
includeDiscriminantProperty: true,
|
|
357
|
+
context: "type",
|
|
358
|
+
});
|
|
359
|
+
default:
|
|
360
|
+
throw new Error();
|
|
361
|
+
}
|
|
362
|
+
}), { on: "," })}]).readonly()`;
|
|
363
|
+
case "intrinsic":
|
|
364
|
+
return code `${imports.z}.discriminatedUnion("${discriminant.name}", [${joinCode(this.concreteMembers.map(({ type }) => type.jsonSchema({
|
|
297
365
|
includeDiscriminantProperty: true,
|
|
298
366
|
context: "type",
|
|
299
367
|
})), { on: "," })}]).readonly()`;
|
|
300
368
|
case "typeof":
|
|
301
369
|
return code `${imports.z}.union([${joinCode(this.concreteMembers.map(({ type }) => type.jsonSchema({ context: "type" })), { on: "," })}]).readonly()`;
|
|
302
370
|
default:
|
|
303
|
-
throw
|
|
371
|
+
throw discriminant;
|
|
304
372
|
}
|
|
305
373
|
}
|
|
306
374
|
get inlineName() {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
375
|
+
const discriminant = this.discriminant; // To get type narrowing to work
|
|
376
|
+
switch (discriminant.kind) {
|
|
377
|
+
case "extrinsic":
|
|
378
|
+
return code `(${joinCode(this.concreteMembers.map(({ type, primaryDiscriminantValue }) => code `{ ${discriminant.name}: ${literalOf(primaryDiscriminantValue)}, value: ${type.name} }`), { on: "|" })})`;
|
|
379
|
+
case "hybrid":
|
|
380
|
+
return code `(${joinCode(this.concreteMembers.map(({ primaryDiscriminantValue, type }, memberI) => {
|
|
381
|
+
switch (discriminant.memberValues[memberI].kind) {
|
|
382
|
+
case "extrinsic":
|
|
383
|
+
return code `{ ${discriminant.name}: ${literalOf(primaryDiscriminantValue)}, value: ${type.name} }`;
|
|
384
|
+
case "intrinsic":
|
|
385
|
+
return code `${type.name}`;
|
|
386
|
+
default:
|
|
387
|
+
throw new Error();
|
|
388
|
+
}
|
|
389
|
+
}), { on: "|" })})`;
|
|
390
|
+
case "intrinsic":
|
|
311
391
|
// If every type shares a discriminant (e.g., RDF/JS "termType" or generated NamedObjectType "type"),
|
|
312
392
|
// just join their names with "|"
|
|
313
393
|
return code `(${joinCode(this.members.map(({ type }) => code `${type.name}`), { on: "|" })})`;
|
|
@@ -316,7 +396,7 @@ ${joinCode(this.concreteMembers.map(({ jsonTypeCheck, type, unwrap, wrap }) => c
|
|
|
316
396
|
// of the different member types are known to be different.
|
|
317
397
|
return code `(${joinCode(this.members.map(({ type }) => code `${type.name}`), { on: "|" })})`;
|
|
318
398
|
default:
|
|
319
|
-
|
|
399
|
+
discriminant;
|
|
320
400
|
throw new Error("should never reach this point");
|
|
321
401
|
}
|
|
322
402
|
}
|
|
@@ -345,10 +425,7 @@ unionPatterns.push({ patterns: ${type.valueSparqlWherePatternsFunction}({ ...oth
|
|
|
345
425
|
get inlineToJsonFunction() {
|
|
346
426
|
return code `\
|
|
347
427
|
((value: ${this.name}): ${this.jsonType().name} => {
|
|
348
|
-
${joinCode(this.concreteMembers.map(({
|
|
349
|
-
includeDiscriminantProperty: this.discriminant.kind === "inline",
|
|
350
|
-
variables: { value: unwrap(code `value`) },
|
|
351
|
-
}))}; }`))}
|
|
428
|
+
${joinCode(this.concreteMembers.map(({ typeCheck, typeToJsonExpression, unwrap, wrap }) => code `if (${typeCheck(code `value`)}) { return ${wrap(typeToJsonExpression(unwrap(code `value`)))}; }`))}
|
|
352
429
|
|
|
353
430
|
throw new Error("unable to serialize to JSON");
|
|
354
431
|
})`;
|
|
@@ -437,77 +514,126 @@ __decorate([
|
|
|
437
514
|
], AbstractUnionType.prototype, "inlineValueSparqlWherePatternsFunction", null);
|
|
438
515
|
export var Discriminant;
|
|
439
516
|
(function (Discriminant) {
|
|
440
|
-
function
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
517
|
+
function infer(members) {
|
|
518
|
+
// extrinsic with user-specified values
|
|
519
|
+
if (members.some((member) => member.discriminantValue.isJust())) {
|
|
520
|
+
return {
|
|
521
|
+
kind: "extrinsic",
|
|
522
|
+
memberValues: members.map((member, memberI) => member.discriminantValue.orDefault(memberI)),
|
|
523
|
+
name: "type",
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
const memberTypes = members.map((member) => member.type);
|
|
527
|
+
// intrinsic
|
|
528
|
+
{
|
|
529
|
+
let inlineDiscriminantPropertyName;
|
|
530
|
+
const memberValues = [];
|
|
531
|
+
for (const memberType of memberTypes) {
|
|
532
|
+
const memberTypeDiscriminantProperty = memberType.discriminantProperty.extract();
|
|
533
|
+
if (!memberTypeDiscriminantProperty) {
|
|
534
|
+
inlineDiscriminantPropertyName = undefined;
|
|
535
|
+
break;
|
|
536
|
+
}
|
|
537
|
+
if (!inlineDiscriminantPropertyName) {
|
|
538
|
+
inlineDiscriminantPropertyName = memberTypeDiscriminantProperty.name;
|
|
539
|
+
}
|
|
540
|
+
else if (memberTypeDiscriminantProperty.name !== inlineDiscriminantPropertyName) {
|
|
541
|
+
inlineDiscriminantPropertyName = undefined;
|
|
542
|
+
break;
|
|
543
|
+
}
|
|
544
|
+
memberValues.push({
|
|
545
|
+
descendantValues: memberTypeDiscriminantProperty.descendantValues,
|
|
546
|
+
ownValues: memberTypeDiscriminantProperty.ownValues,
|
|
547
|
+
});
|
|
447
548
|
}
|
|
448
|
-
if (
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
549
|
+
if (inlineDiscriminantPropertyName) {
|
|
550
|
+
return {
|
|
551
|
+
kind: "intrinsic",
|
|
552
|
+
memberValues,
|
|
553
|
+
name: inlineDiscriminantPropertyName,
|
|
453
554
|
};
|
|
454
555
|
}
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
556
|
+
}
|
|
557
|
+
// typeof
|
|
558
|
+
{
|
|
559
|
+
const memberTypeofsSet = new Set();
|
|
560
|
+
for (const memberType of memberTypes) {
|
|
561
|
+
for (const memberTypeof of memberType.typeofs) {
|
|
562
|
+
memberTypeofsSet.add(memberTypeof);
|
|
563
|
+
}
|
|
460
564
|
}
|
|
461
|
-
|
|
462
|
-
return
|
|
565
|
+
if (memberTypeofsSet.size === memberTypes.length) {
|
|
566
|
+
return {
|
|
567
|
+
memberValues: memberTypes.flatMap((memberType) => memberType.typeofs),
|
|
568
|
+
kind: "typeof",
|
|
569
|
+
};
|
|
463
570
|
}
|
|
464
571
|
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
572
|
+
// hybrid
|
|
573
|
+
// If some member type is an RDF/JS term then reuse "termType" as the discriminant.
|
|
574
|
+
if (memberTypes.some((memberType) => termTypes(memberType).size > 0)) {
|
|
575
|
+
const extrinsicMemberTypeNamesSet = new Set();
|
|
576
|
+
let extrinsicMemberTypeCount = 0;
|
|
577
|
+
for (const memberType of memberTypes) {
|
|
578
|
+
if (termTypes(memberType).size > 0) {
|
|
579
|
+
continue;
|
|
580
|
+
}
|
|
581
|
+
extrinsicMemberTypeCount++;
|
|
582
|
+
if (typeof memberType.name === "string") {
|
|
583
|
+
extrinsicMemberTypeNamesSet.add(memberType.name);
|
|
584
|
+
}
|
|
585
|
+
else {
|
|
586
|
+
break;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
471
589
|
return {
|
|
472
|
-
|
|
473
|
-
|
|
590
|
+
kind: "hybrid",
|
|
591
|
+
memberValues: memberTypes.map((memberType, memberTypeI) => {
|
|
592
|
+
const memberTermTypes = termTypes(memberType);
|
|
593
|
+
if (memberTermTypes.size > 0) {
|
|
594
|
+
return {
|
|
595
|
+
kind: "intrinsic",
|
|
596
|
+
ownValues: [...memberTermTypes],
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
return {
|
|
600
|
+
kind: "extrinsic",
|
|
601
|
+
ownValues: extrinsicMemberTypeNamesSet.size === extrinsicMemberTypeCount
|
|
602
|
+
? [memberType.name]
|
|
603
|
+
: [memberTypeI.toString()],
|
|
604
|
+
};
|
|
605
|
+
}),
|
|
606
|
+
name: "termType",
|
|
474
607
|
};
|
|
475
608
|
}
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
609
|
+
// extrinsic with inferred values
|
|
610
|
+
{
|
|
611
|
+
let memberValues;
|
|
612
|
+
{
|
|
613
|
+
const memberTypeNames = memberTypes.map((memberType) => memberType.name);
|
|
614
|
+
if (memberTypeNames.every((memberTypeName) => typeof memberTypeName === "string")) {
|
|
615
|
+
const memberTypeNamesSet = new Set(memberTypeNames);
|
|
616
|
+
if (memberTypeNamesSet.size === memberTypeNames.length) {
|
|
617
|
+
memberValues = memberTypeNames;
|
|
618
|
+
}
|
|
619
|
+
else {
|
|
620
|
+
// Otherwise prefix the non-unique strings with an index and use those as the discriminant values.
|
|
621
|
+
memberValues = memberTypeNames.map((memberTypeName, memberTypeI) => `${memberTypeI}-${memberTypeName}`);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
else {
|
|
625
|
+
// At least one member type name is Code
|
|
626
|
+
// Use member type indices as the discriminant values.
|
|
627
|
+
memberValues = memberTypes.map((_, memberTypeI) => memberTypeI);
|
|
628
|
+
}
|
|
480
629
|
}
|
|
481
|
-
|
|
482
|
-
if (memberTypeofs.size === memberTypes.length) {
|
|
630
|
+
invariant(memberValues.length === memberTypes.length);
|
|
483
631
|
return {
|
|
484
|
-
kind: "
|
|
632
|
+
kind: "extrinsic",
|
|
633
|
+
name: "type",
|
|
634
|
+
memberValues: memberValues,
|
|
485
635
|
};
|
|
486
636
|
}
|
|
487
|
-
let ownValues;
|
|
488
|
-
const memberTypeNames = memberTypes.map((memberType) => memberType.name);
|
|
489
|
-
if (memberTypeNames.every((memberTypeName) => typeof memberTypeName === "string")) {
|
|
490
|
-
const memberTypeNamesSet = new Set(memberTypeNames);
|
|
491
|
-
if (memberTypeNamesSet.size === memberTypeNames.length) {
|
|
492
|
-
// If every member type name is a unique string, use those strings as the discriminant values.
|
|
493
|
-
ownValues = memberTypeNames;
|
|
494
|
-
}
|
|
495
|
-
else {
|
|
496
|
-
// Otherwise prefix the non-unique strings with an index and use those as the discriminant values.
|
|
497
|
-
ownValues = memberTypeNames.map((memberTypeName, memberTypeIndex) => `${memberTypeIndex}-${memberTypeName}`);
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
else {
|
|
501
|
-
// At least one member type name is Code
|
|
502
|
-
// Use member type indices as the discriminant values.
|
|
503
|
-
ownValues = memberTypes.map((_, memberTypeIndex) => memberTypeIndex);
|
|
504
|
-
}
|
|
505
|
-
return {
|
|
506
|
-
descendantValues: [],
|
|
507
|
-
kind: "envelope",
|
|
508
|
-
name: "type",
|
|
509
|
-
ownValues,
|
|
510
|
-
};
|
|
511
637
|
}
|
|
512
638
|
Discriminant.infer = infer;
|
|
513
639
|
})(Discriminant || (Discriminant = {}));
|
|
@@ -4,8 +4,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
+
import { LiteralDecoder } from "@rdfx/literal";
|
|
7
8
|
import { Maybe, NonEmptyList } from "purify-ts";
|
|
8
|
-
import { LiteralDecoder } from "rdfjs-resource";
|
|
9
9
|
import { invariant } from "ts-invariant";
|
|
10
10
|
import { Memoize } from "typescript-memoize";
|
|
11
11
|
import { AbstractContainerType } from "./AbstractContainerType.js";
|
|
@@ -4,9 +4,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
+
import { PropertyPath } from "@rdfx/resource";
|
|
7
8
|
import { pascalCase } from "change-case";
|
|
8
9
|
import { Maybe } from "purify-ts";
|
|
9
|
-
import { PropertyPath } from "rdfjs-resource";
|
|
10
10
|
import { Memoize } from "typescript-memoize";
|
|
11
11
|
import { NamedObjectType_objectSetMethodNames } from "./_NamedObjectType/NamedObjectType_objectSetMethodNames.js";
|
|
12
12
|
import { NamedObjectType_sparqlConstructQueryFunctionDeclaration } from "./_NamedObjectType/NamedObjectType_sparqlConstructQueryFunctionDeclaration.js";
|
|
@@ -3,6 +3,7 @@ import { type Code } from "./ts-poet-wrapper.js";
|
|
|
3
3
|
export declare class SetType<ItemTypeT extends SetType.ItemType> extends AbstractCollectionType<ItemTypeT> {
|
|
4
4
|
readonly graphqlArgs: AbstractCollectionType<ItemTypeT>["graphqlArgs"];
|
|
5
5
|
readonly kind = "SetType";
|
|
6
|
+
get conversions(): readonly AbstractCollectionType.Conversion[];
|
|
6
7
|
get valueSparqlConstructTriplesFunction(): Code;
|
|
7
8
|
get valueSparqlWherePatternsFunction(): Code;
|
|
8
9
|
fromRdfResourceValuesExpression(parameters: Parameters<AbstractCollectionType<ItemTypeT>["fromRdfResourceValuesExpression"]>[0]): Code;
|
|
@@ -13,6 +13,18 @@ import { code, joinCode } from "./ts-poet-wrapper.js";
|
|
|
13
13
|
export class SetType extends AbstractCollectionType {
|
|
14
14
|
graphqlArgs = Maybe.empty();
|
|
15
15
|
kind = "SetType";
|
|
16
|
+
get conversions() {
|
|
17
|
+
const conversions = [];
|
|
18
|
+
if (this.minCount === 0) {
|
|
19
|
+
conversions.push({
|
|
20
|
+
conversionExpression: () => code `[]`,
|
|
21
|
+
sourceTypeCheckExpression: (value) => code `${value} === undefined`,
|
|
22
|
+
sourceTypeName: code `undefined`,
|
|
23
|
+
sourceTypeof: "undefined",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return conversions.concat(super.conversions);
|
|
27
|
+
}
|
|
16
28
|
get valueSparqlConstructTriplesFunction() {
|
|
17
29
|
return code `${snippets.setSparqlConstructTriples}<${this.itemType.filterType}, ${this.itemType.schemaType}>(${this.itemType.valueSparqlConstructTriplesFunction})`;
|
|
18
30
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import TermMap from "@rdfjs/term-map";
|
|
2
2
|
import TermSet from "@rdfjs/term-set";
|
|
3
|
+
import { LiteralDecoder, literalDatatypeDefinitions } from "@rdfx/literal";
|
|
3
4
|
import base62 from "@sindresorhus/base62";
|
|
4
5
|
import { rdf, xsd } from "@tpluscode/rdf-ns-builders";
|
|
5
6
|
import { Maybe } from "purify-ts";
|
|
6
|
-
import { LiteralDecoder, literalDatatypeDefinitions } from "rdfjs-resource";
|
|
7
7
|
import reservedTsIdentifiers_ from "reserved-identifiers";
|
|
8
8
|
import { invariant } from "ts-invariant";
|
|
9
9
|
import * as ast from "../../ast/index.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import type { PropertyPath } from "@rdfx/resource";
|
|
1
2
|
import { Maybe } from "purify-ts";
|
|
2
|
-
import type { PropertyPath } from "rdfjs-resource";
|
|
3
3
|
import type { Type } from "../Type.js";
|
|
4
4
|
import { type Code } from "../ts-poet-wrapper.js";
|
|
5
5
|
import { AbstractProperty } from "./AbstractProperty.js";
|
|
@@ -22,15 +22,15 @@ export const imports = {
|
|
|
22
22
|
GraphQLUnionType: imp("GraphQLUnionType@graphql"),
|
|
23
23
|
Left: imp("Left@purify-ts"),
|
|
24
24
|
Literal: imp("Literal@@rdfjs/types"),
|
|
25
|
-
LiteralFactory: imp("LiteralFactory
|
|
25
|
+
LiteralFactory: imp("LiteralFactory@@rdfx/literal"),
|
|
26
26
|
Maybe: imp("Maybe@purify-ts"),
|
|
27
27
|
NamedNode: imp("NamedNode@@rdfjs/types"),
|
|
28
28
|
NonEmptyList: imp("NonEmptyList@purify-ts"),
|
|
29
29
|
Quad: imp("Quad@@rdfjs/types"),
|
|
30
30
|
Quad_Graph: imp("Quad_Graph@@rdfjs/types"),
|
|
31
|
-
RdfjsResourcePropertyPath: imp("PropertyPath:RdfjsResourcePropertyPath
|
|
32
|
-
Resource: imp("Resource
|
|
33
|
-
ResourceSet: imp("ResourceSet
|
|
31
|
+
RdfjsResourcePropertyPath: imp("PropertyPath:RdfjsResourcePropertyPath@@rdfx/resource"),
|
|
32
|
+
Resource: imp("Resource@@rdfx/resource"),
|
|
33
|
+
ResourceSet: imp("ResourceSet@@rdfx/resource"),
|
|
34
34
|
Right: imp("Right@purify-ts"),
|
|
35
35
|
sha256: imp("sha256@js-sha256"),
|
|
36
36
|
sparqljs: imp("sparqljs*sparqljs"),
|