@twin.org/tools-core 0.0.3-next.21 → 0.0.3-next.23
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/es/utils/importTypeQuerySchemaResolver.js +36 -2
- package/dist/es/utils/importTypeQuerySchemaResolver.js.map +1 -1
- package/dist/es/utils/jsDoc.js +1 -1
- package/dist/es/utils/jsDoc.js.map +1 -1
- package/dist/es/utils/jsonSchemaBuilder.js +144 -133
- package/dist/es/utils/jsonSchemaBuilder.js.map +1 -1
- package/dist/es/utils/mappedTypeSchemaResolver.js +35 -1
- package/dist/es/utils/mappedTypeSchemaResolver.js.map +1 -1
- package/dist/es/utils/objectTransformer.js +1 -1
- package/dist/es/utils/objectTransformer.js.map +1 -1
- package/dist/es/utils/resolver.js +22 -9
- package/dist/es/utils/resolver.js.map +1 -1
- package/dist/es/utils/utilityTypeSchemaMapper.js +81 -40
- package/dist/es/utils/utilityTypeSchemaMapper.js.map +1 -1
- package/dist/types/utils/importTypeQuerySchemaResolver.d.ts +35 -0
- package/dist/types/utils/jsonSchemaBuilder.d.ts +6 -82
- package/dist/types/utils/mappedTypeSchemaResolver.d.ts +35 -0
- package/dist/types/utils/resolver.d.ts +7 -1
- package/dist/types/utils/utilityTypeSchemaMapper.d.ts +60 -13
- package/docs/changelog.md +51 -0
- package/docs/reference/classes/ImportTypeQuerySchemaResolver.md +22 -0
- package/docs/reference/classes/JsonSchemaBuilder.md +12 -304
- package/docs/reference/classes/MappedTypeSchemaResolver.md +64 -0
- package/docs/reference/classes/Resolver.md +12 -1
- package/docs/reference/classes/UtilityTypeSchemaMapper.md +64 -62
- package/package.json +2 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Copyright 2026 IOTA Stiftung.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
-
|
|
4
|
-
import { JsonHelper, ObjectHelper } from "@twin.org/core";
|
|
3
|
+
import { Is, JsonHelper, ObjectHelper } from "@twin.org/core";
|
|
5
4
|
import * as ts from "typescript";
|
|
5
|
+
import { JsonSchemaBuilder } from "./jsonSchemaBuilder.js";
|
|
6
6
|
import { ObjectTransformer } from "./objectTransformer.js";
|
|
7
7
|
/**
|
|
8
8
|
* Static utility-type schema mapping helpers.
|
|
@@ -12,15 +12,14 @@ export class UtilityTypeSchemaMapper {
|
|
|
12
12
|
* Map Partial<T> to an object schema with no required properties.
|
|
13
13
|
* @param context The generation context.
|
|
14
14
|
* @param typeNode The Partial type reference.
|
|
15
|
-
* @param resolveUtilityBaseObjectSchema Callback to resolve base object schemas.
|
|
16
15
|
* @returns The mapped schema.
|
|
17
16
|
*/
|
|
18
|
-
static mapPartialUtilityType(context, typeNode
|
|
17
|
+
static mapPartialUtilityType(context, typeNode) {
|
|
19
18
|
const baseTypeNode = typeNode.typeArguments?.[0];
|
|
20
19
|
if (!baseTypeNode) {
|
|
21
20
|
return undefined;
|
|
22
21
|
}
|
|
23
|
-
const objectSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
22
|
+
const objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
24
23
|
if (objectSchema) {
|
|
25
24
|
const partialSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);
|
|
26
25
|
delete partialSchema.required;
|
|
@@ -32,15 +31,14 @@ export class UtilityTypeSchemaMapper {
|
|
|
32
31
|
* Map Required<T> to an object schema with all properties required.
|
|
33
32
|
* @param context The generation context.
|
|
34
33
|
* @param typeNode The Required type reference.
|
|
35
|
-
* @param resolveUtilityBaseObjectSchema Callback to resolve base object schemas.
|
|
36
34
|
* @returns The mapped schema.
|
|
37
35
|
*/
|
|
38
|
-
static mapRequiredUtilityType(context, typeNode
|
|
36
|
+
static mapRequiredUtilityType(context, typeNode) {
|
|
39
37
|
const baseTypeNode = typeNode.typeArguments?.[0];
|
|
40
38
|
if (!baseTypeNode) {
|
|
41
39
|
return undefined;
|
|
42
40
|
}
|
|
43
|
-
const objectSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
41
|
+
const objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
44
42
|
if (objectSchema) {
|
|
45
43
|
const requiredSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);
|
|
46
44
|
if (requiredSchema.properties) {
|
|
@@ -52,14 +50,17 @@ export class UtilityTypeSchemaMapper {
|
|
|
52
50
|
}
|
|
53
51
|
/**
|
|
54
52
|
* Map Pick<T, K> to an object schema with selected keys preserved.
|
|
53
|
+
* @param context The generation context.
|
|
54
|
+
* @param typeNode The Pick type reference.
|
|
55
|
+
* @returns The mapped schema.
|
|
55
56
|
*/
|
|
56
|
-
static mapPickUtilityType(context, typeNode
|
|
57
|
+
static mapPickUtilityType(context, typeNode) {
|
|
57
58
|
const baseTypeNode = typeNode.typeArguments?.[0];
|
|
58
|
-
const pickedKeys = extractUtilityTypeKeys(context, typeNode.typeArguments?.[1]);
|
|
59
|
+
const pickedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(context, typeNode.typeArguments?.[1]);
|
|
59
60
|
if (!baseTypeNode || pickedKeys.length === 0) {
|
|
60
61
|
return undefined;
|
|
61
62
|
}
|
|
62
|
-
const baseSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
63
|
+
const baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
63
64
|
if (baseSchema) {
|
|
64
65
|
return ObjectTransformer.pickKeysFromObjectSchema(baseSchema, pickedKeys);
|
|
65
66
|
}
|
|
@@ -67,14 +68,17 @@ export class UtilityTypeSchemaMapper {
|
|
|
67
68
|
}
|
|
68
69
|
/**
|
|
69
70
|
* Map Omit<T, K> to an object schema with selected keys removed.
|
|
71
|
+
* @param context The generation context.
|
|
72
|
+
* @param typeNode The Omit type reference.
|
|
73
|
+
* @returns The mapped schema.
|
|
70
74
|
*/
|
|
71
|
-
static mapOmitUtilityType(context, typeNode
|
|
75
|
+
static mapOmitUtilityType(context, typeNode) {
|
|
72
76
|
const baseTypeNode = typeNode.typeArguments?.[0];
|
|
73
|
-
const omittedKeys = extractUtilityTypeKeys(context, typeNode.typeArguments?.[1]);
|
|
77
|
+
const omittedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(context, typeNode.typeArguments?.[1]);
|
|
74
78
|
if (!baseTypeNode || omittedKeys.length === 0) {
|
|
75
79
|
return undefined;
|
|
76
80
|
}
|
|
77
|
-
const baseSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
81
|
+
const baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
78
82
|
if (baseSchema) {
|
|
79
83
|
return ObjectTransformer.omitKeysFromObjectSchema(baseSchema, omittedKeys);
|
|
80
84
|
}
|
|
@@ -82,8 +86,11 @@ export class UtilityTypeSchemaMapper {
|
|
|
82
86
|
}
|
|
83
87
|
/**
|
|
84
88
|
* Map Exclude<T, U> to a schema that removes U members from T.
|
|
89
|
+
* @param context The generation context.
|
|
90
|
+
* @param typeNode The Exclude type reference.
|
|
91
|
+
* @returns The mapped schema.
|
|
85
92
|
*/
|
|
86
|
-
static mapExcludeUtilityType(context, typeNode
|
|
93
|
+
static mapExcludeUtilityType(context, typeNode) {
|
|
87
94
|
const sourceTypeNode = typeNode.typeArguments?.[0];
|
|
88
95
|
const excludedTypeNode = typeNode.typeArguments?.[1];
|
|
89
96
|
if (!sourceTypeNode || !excludedTypeNode) {
|
|
@@ -96,10 +103,10 @@ export class UtilityTypeSchemaMapper {
|
|
|
96
103
|
? excludedTypeNode.types
|
|
97
104
|
: [excludedTypeNode];
|
|
98
105
|
const sourceSchemas = sourceTypes
|
|
99
|
-
.map(sourceType => mapTypeNodeToSchema(context, sourceType))
|
|
106
|
+
.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))
|
|
100
107
|
.filter((schema) => schema !== undefined);
|
|
101
108
|
const excludedSchemas = excludedTypes
|
|
102
|
-
.map(excludedType => mapTypeNodeToSchema(context, excludedType))
|
|
109
|
+
.map(excludedType => JsonSchemaBuilder.mapTypeNodeToSchema(context, excludedType))
|
|
103
110
|
.filter((schema) => schema !== undefined)
|
|
104
111
|
.map(schema => JsonHelper.canonicalize(schema));
|
|
105
112
|
if (sourceSchemas.length === 0) {
|
|
@@ -119,8 +126,11 @@ export class UtilityTypeSchemaMapper {
|
|
|
119
126
|
}
|
|
120
127
|
/**
|
|
121
128
|
* Map Extract<T, U> to a schema that keeps U members from T.
|
|
129
|
+
* @param context The generation context.
|
|
130
|
+
* @param typeNode The Extract type reference.
|
|
131
|
+
* @returns The mapped schema.
|
|
122
132
|
*/
|
|
123
|
-
static mapExtractUtilityType(context, typeNode
|
|
133
|
+
static mapExtractUtilityType(context, typeNode) {
|
|
124
134
|
const sourceTypeNode = typeNode.typeArguments?.[0];
|
|
125
135
|
const includedTypeNode = typeNode.typeArguments?.[1];
|
|
126
136
|
if (!sourceTypeNode || !includedTypeNode) {
|
|
@@ -133,10 +143,10 @@ export class UtilityTypeSchemaMapper {
|
|
|
133
143
|
? includedTypeNode.types
|
|
134
144
|
: [includedTypeNode];
|
|
135
145
|
const sourceSchemas = sourceTypes
|
|
136
|
-
.map(sourceType => mapTypeNodeToSchema(context, sourceType))
|
|
146
|
+
.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))
|
|
137
147
|
.filter((schema) => schema !== undefined);
|
|
138
148
|
const includedSchemaKeys = new Set(includedTypes
|
|
139
|
-
.map(includedType => mapTypeNodeToSchema(context, includedType))
|
|
149
|
+
.map(includedType => JsonSchemaBuilder.mapTypeNodeToSchema(context, includedType))
|
|
140
150
|
.filter((schema) => schema !== undefined)
|
|
141
151
|
.map(schema => JsonHelper.canonicalize(schema)));
|
|
142
152
|
if (sourceSchemas.length === 0 || includedSchemaKeys.size === 0) {
|
|
@@ -155,8 +165,11 @@ export class UtilityTypeSchemaMapper {
|
|
|
155
165
|
}
|
|
156
166
|
/**
|
|
157
167
|
* Map NonNullable<T> by removing null and undefined branches from T.
|
|
168
|
+
* @param context The generation context.
|
|
169
|
+
* @param typeNode The NonNullable type reference.
|
|
170
|
+
* @returns The mapped schema.
|
|
158
171
|
*/
|
|
159
|
-
static mapNonNullableUtilityType(context, typeNode
|
|
172
|
+
static mapNonNullableUtilityType(context, typeNode) {
|
|
160
173
|
const sourceTypeNode = typeNode.typeArguments?.[0];
|
|
161
174
|
if (!sourceTypeNode) {
|
|
162
175
|
return undefined;
|
|
@@ -169,7 +182,7 @@ export class UtilityTypeSchemaMapper {
|
|
|
169
182
|
return undefined;
|
|
170
183
|
}
|
|
171
184
|
const mappedSchemas = nonNullableTypes
|
|
172
|
-
.map(sourceType => mapTypeNodeToSchema(context, sourceType))
|
|
185
|
+
.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))
|
|
173
186
|
.filter((schema) => schema !== undefined);
|
|
174
187
|
if (mappedSchemas.length === 0) {
|
|
175
188
|
return undefined;
|
|
@@ -190,14 +203,17 @@ export class UtilityTypeSchemaMapper {
|
|
|
190
203
|
}
|
|
191
204
|
/**
|
|
192
205
|
* Map Record<K, V> to an object schema with key constraints where possible.
|
|
206
|
+
* @param context The generation context.
|
|
207
|
+
* @param typeNode The Record type reference.
|
|
208
|
+
* @returns The mapped schema.
|
|
193
209
|
*/
|
|
194
|
-
static mapRecordUtilityType(context, typeNode
|
|
210
|
+
static mapRecordUtilityType(context, typeNode) {
|
|
195
211
|
const keyTypeNode = typeNode.typeArguments?.[0];
|
|
196
212
|
const valueTypeNode = typeNode.typeArguments?.[1];
|
|
197
213
|
if (!keyTypeNode || !valueTypeNode) {
|
|
198
214
|
return undefined;
|
|
199
215
|
}
|
|
200
|
-
const valueSchema = mapTypeNodeToSchema(context, valueTypeNode);
|
|
216
|
+
const valueSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode);
|
|
201
217
|
if (!valueSchema) {
|
|
202
218
|
return undefined;
|
|
203
219
|
}
|
|
@@ -220,13 +236,20 @@ export class UtilityTypeSchemaMapper {
|
|
|
220
236
|
}
|
|
221
237
|
/**
|
|
222
238
|
* Map JsonLdObject utility types using key-removal and optional key-addition rules.
|
|
239
|
+
* @param context The generation context.
|
|
240
|
+
* @param typeNode The JsonLdObject utility type reference.
|
|
241
|
+
* @param options The mapping options for key removal and optional key addition.
|
|
242
|
+
* @param options.keysToRemove The property keys to remove from the base schema.
|
|
243
|
+
* @param options.keyToAdd The optional key to add after removal.
|
|
244
|
+
* @param options.isAddedKeyRequired True when the added key must be required.
|
|
245
|
+
* @returns The mapped schema.
|
|
223
246
|
*/
|
|
224
|
-
static mapJsonLdObjectUtilityType(context, typeNode, options
|
|
247
|
+
static mapJsonLdObjectUtilityType(context, typeNode, options) {
|
|
225
248
|
const baseTypeNode = typeNode.typeArguments?.[0];
|
|
226
249
|
if (!baseTypeNode) {
|
|
227
250
|
return undefined;
|
|
228
251
|
}
|
|
229
|
-
const baseSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
252
|
+
const baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);
|
|
230
253
|
if (!baseSchema) {
|
|
231
254
|
return undefined;
|
|
232
255
|
}
|
|
@@ -236,7 +259,7 @@ export class UtilityTypeSchemaMapper {
|
|
|
236
259
|
}
|
|
237
260
|
const valueTypeNode = typeNode.typeArguments?.[1];
|
|
238
261
|
const valueSchema = valueTypeNode
|
|
239
|
-
? mapTypeNodeToSchema(context, valueTypeNode)
|
|
262
|
+
? JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode)
|
|
240
263
|
: UtilityTypeSchemaMapper.mapJsonLdObjectDefaultSchemaByKey(baseSchema, options.keyToAdd);
|
|
241
264
|
if (!valueSchema) {
|
|
242
265
|
return undefined;
|
|
@@ -253,17 +276,20 @@ export class UtilityTypeSchemaMapper {
|
|
|
253
276
|
}
|
|
254
277
|
/**
|
|
255
278
|
* Map ObjectOrArray<T> to a schema accepting T or T[].
|
|
279
|
+
* @param context The generation context.
|
|
280
|
+
* @param typeNode The ObjectOrArray type reference.
|
|
281
|
+
* @returns The mapped schema.
|
|
256
282
|
*/
|
|
257
|
-
static mapObjectOrArrayUtilityType(context, typeNode
|
|
283
|
+
static mapObjectOrArrayUtilityType(context, typeNode) {
|
|
258
284
|
const baseTypeNode = typeNode.typeArguments?.[0];
|
|
259
285
|
if (!baseTypeNode) {
|
|
260
286
|
return undefined;
|
|
261
287
|
}
|
|
262
|
-
const itemSchema = mapTypeNodeToSchema(context, baseTypeNode);
|
|
288
|
+
const itemSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, baseTypeNode);
|
|
263
289
|
if (!itemSchema) {
|
|
264
290
|
return undefined;
|
|
265
291
|
}
|
|
266
|
-
const scalarSchemas =
|
|
292
|
+
const scalarSchemas = Is.array(itemSchema.anyOf) && Object.keys(itemSchema).length === 1
|
|
267
293
|
? itemSchema.anyOf
|
|
268
294
|
: [itemSchema];
|
|
269
295
|
return {
|
|
@@ -272,13 +298,16 @@ export class UtilityTypeSchemaMapper {
|
|
|
272
298
|
}
|
|
273
299
|
/**
|
|
274
300
|
* Map SingleOccurrenceArray<T, U> to a non-empty array containing exactly one U.
|
|
301
|
+
* @param context The generation context.
|
|
302
|
+
* @param typeNode The SingleOccurrenceArray type reference.
|
|
303
|
+
* @returns The mapped schema.
|
|
275
304
|
*/
|
|
276
|
-
static mapSingleOccurrenceArrayUtilityType(context, typeNode
|
|
305
|
+
static mapSingleOccurrenceArrayUtilityType(context, typeNode) {
|
|
277
306
|
const primaryTypeNode = typeNode.typeArguments?.[0];
|
|
278
307
|
if (!primaryTypeNode) {
|
|
279
308
|
return undefined;
|
|
280
309
|
}
|
|
281
|
-
const primarySchema = mapTypeNodeToSchema(context, primaryTypeNode);
|
|
310
|
+
const primarySchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, primaryTypeNode);
|
|
282
311
|
if (!primarySchema) {
|
|
283
312
|
return undefined;
|
|
284
313
|
}
|
|
@@ -290,7 +319,7 @@ export class UtilityTypeSchemaMapper {
|
|
|
290
319
|
minItems: 1
|
|
291
320
|
};
|
|
292
321
|
}
|
|
293
|
-
const singleOccurrenceSchema = mapTypeNodeToSchema(context, singleOccurrenceTypeNode);
|
|
322
|
+
const singleOccurrenceSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, singleOccurrenceTypeNode);
|
|
294
323
|
if (!singleOccurrenceSchema) {
|
|
295
324
|
return {
|
|
296
325
|
type: "array",
|
|
@@ -319,6 +348,8 @@ export class UtilityTypeSchemaMapper {
|
|
|
319
348
|
}
|
|
320
349
|
/**
|
|
321
350
|
* Determine whether a type node represents null or undefined.
|
|
351
|
+
* @param typeNode The type node to inspect.
|
|
352
|
+
* @returns True if the node represents null or undefined; otherwise false.
|
|
322
353
|
*/
|
|
323
354
|
static isNullOrUndefinedTypeNode(typeNode) {
|
|
324
355
|
if (typeNode.kind === ts.SyntaxKind.NullKeyword ||
|
|
@@ -335,6 +366,8 @@ export class UtilityTypeSchemaMapper {
|
|
|
335
366
|
}
|
|
336
367
|
/**
|
|
337
368
|
* Extract literal keys from a Record key type argument.
|
|
369
|
+
* @param keyTypeNode The Record key type argument to inspect.
|
|
370
|
+
* @returns The extracted literal keys.
|
|
338
371
|
*/
|
|
339
372
|
static extractRecordLiteralKeys(keyTypeNode) {
|
|
340
373
|
if (ts.isLiteralTypeNode(keyTypeNode) && ts.isStringLiteral(keyTypeNode.literal)) {
|
|
@@ -351,6 +384,9 @@ export class UtilityTypeSchemaMapper {
|
|
|
351
384
|
}
|
|
352
385
|
/**
|
|
353
386
|
* Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.
|
|
387
|
+
* @param baseSchema The base object schema being transformed.
|
|
388
|
+
* @param keyToAdd The key to add when no explicit value type argument is provided.
|
|
389
|
+
* @returns The resolved default schema for the added key.
|
|
354
390
|
*/
|
|
355
391
|
static mapJsonLdObjectDefaultSchemaByKey(baseSchema, keyToAdd) {
|
|
356
392
|
if (keyToAdd === "id" || keyToAdd === "@id") {
|
|
@@ -363,6 +399,8 @@ export class UtilityTypeSchemaMapper {
|
|
|
363
399
|
}
|
|
364
400
|
/**
|
|
365
401
|
* Resolve default id schema for JsonLdObjectWithId when Id type argument is omitted.
|
|
402
|
+
* @param baseSchema The base object schema being transformed.
|
|
403
|
+
* @returns The default id schema.
|
|
366
404
|
*/
|
|
367
405
|
static mapJsonLdObjectWithIdDefaultIdSchema(baseSchema) {
|
|
368
406
|
return UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, "id", "@id", {
|
|
@@ -371,6 +409,8 @@ export class UtilityTypeSchemaMapper {
|
|
|
371
409
|
}
|
|
372
410
|
/**
|
|
373
411
|
* Resolve default type schema for JsonLdObjectWithType when Type argument is omitted.
|
|
412
|
+
* @param baseSchema The base object schema being transformed.
|
|
413
|
+
* @returns The default type schema.
|
|
374
414
|
*/
|
|
375
415
|
static mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema) {
|
|
376
416
|
return UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, "type", "@type", {
|
|
@@ -379,6 +419,8 @@ export class UtilityTypeSchemaMapper {
|
|
|
379
419
|
}
|
|
380
420
|
/**
|
|
381
421
|
* Resolve default context schema for JsonLdObjectWithContext when Context argument is omitted.
|
|
422
|
+
* @param baseSchema The base object schema being transformed.
|
|
423
|
+
* @returns The default context schema.
|
|
382
424
|
*/
|
|
383
425
|
static mapJsonLdObjectWithContextDefaultContextSchema(baseSchema) {
|
|
384
426
|
return UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, "@context", "@context", {
|
|
@@ -388,6 +430,11 @@ export class UtilityTypeSchemaMapper {
|
|
|
388
430
|
}
|
|
389
431
|
/**
|
|
390
432
|
* Resolve default schema from either of two source keys, with fallback when both are absent.
|
|
433
|
+
* @param baseSchema The base object schema being transformed.
|
|
434
|
+
* @param firstKey The first property key to check.
|
|
435
|
+
* @param secondKey The second property key to check.
|
|
436
|
+
* @param fallbackSchema The fallback schema when neither key is present.
|
|
437
|
+
* @returns The resolved schema.
|
|
391
438
|
*/
|
|
392
439
|
static mapJsonLdObjectDefaultEitherSchema(baseSchema, firstKey, secondKey, fallbackSchema) {
|
|
393
440
|
const firstSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(baseSchema, firstKey);
|
|
@@ -400,13 +447,7 @@ export class UtilityTypeSchemaMapper {
|
|
|
400
447
|
anyOf: [firstSchema, secondSchema]
|
|
401
448
|
};
|
|
402
449
|
}
|
|
403
|
-
|
|
404
|
-
return firstSchema;
|
|
405
|
-
}
|
|
406
|
-
if (secondSchema) {
|
|
407
|
-
return secondSchema;
|
|
408
|
-
}
|
|
409
|
-
return fallbackSchema;
|
|
450
|
+
return firstSchema ?? secondSchema ?? fallbackSchema;
|
|
410
451
|
}
|
|
411
452
|
}
|
|
412
453
|
//# sourceMappingURL=utilityTypeSchemaMapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilityTypeSchemaMapper.js","sourceRoot":"","sources":["../../../src/utils/utilityTypeSchemaMapper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable jsdoc/require-param, jsdoc/require-returns */\nimport { JsonHelper, ObjectHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { ObjectTransformer } from \"./objectTransformer.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Static utility-type schema mapping helpers.\n */\nexport class UtilityTypeSchemaMapper {\n\t/**\n\t * Map Partial<T> to an object schema with no required properties.\n\t * @param context The generation context.\n\t * @param typeNode The Partial type reference.\n\t * @param resolveUtilityBaseObjectSchema Callback to resolve base object schemas.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapPartialUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tresolveUtilityBaseObjectSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\tbaseTypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (objectSchema) {\n\t\t\tconst partialSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);\n\t\t\tdelete partialSchema.required;\n\t\t\treturn partialSchema;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map Required<T> to an object schema with all properties required.\n\t * @param context The generation context.\n\t * @param typeNode The Required type reference.\n\t * @param resolveUtilityBaseObjectSchema Callback to resolve base object schemas.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapRequiredUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tresolveUtilityBaseObjectSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\tbaseTypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (objectSchema) {\n\t\t\tconst requiredSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);\n\t\t\tif (requiredSchema.properties) {\n\t\t\t\trequiredSchema.required = Object.keys(requiredSchema.properties);\n\t\t\t}\n\t\t\treturn requiredSchema;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map Pick<T, K> to an object schema with selected keys preserved.\n\t */\n\tpublic static mapPickUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tresolveUtilityBaseObjectSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\tbaseTypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined,\n\t\textractUtilityTypeKeys: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\tkeysNode: ts.TypeNode | undefined\n\t\t) => string[]\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tconst pickedKeys = extractUtilityTypeKeys(context, typeNode.typeArguments?.[1]);\n\t\tif (!baseTypeNode || pickedKeys.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (baseSchema) {\n\t\t\treturn ObjectTransformer.pickKeysFromObjectSchema(baseSchema, pickedKeys);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map Omit<T, K> to an object schema with selected keys removed.\n\t */\n\tpublic static mapOmitUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tresolveUtilityBaseObjectSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\tbaseTypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined,\n\t\textractUtilityTypeKeys: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\tkeysNode: ts.TypeNode | undefined\n\t\t) => string[]\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tconst omittedKeys = extractUtilityTypeKeys(context, typeNode.typeArguments?.[1]);\n\t\tif (!baseTypeNode || omittedKeys.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (baseSchema) {\n\t\t\treturn ObjectTransformer.omitKeysFromObjectSchema(baseSchema, omittedKeys);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map Exclude<T, U> to a schema that removes U members from T.\n\t */\n\tpublic static mapExcludeUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tmapTypeNodeToSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tconst excludedTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!sourceTypeNode || !excludedTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst excludedTypes = ts.isUnionTypeNode(excludedTypeNode)\n\t\t\t? excludedTypeNode.types\n\t\t\t: [excludedTypeNode];\n\n\t\tconst sourceSchemas = sourceTypes\n\t\t\t.map(sourceType => mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\t\tconst excludedSchemas = excludedTypes\n\t\t\t.map(excludedType => mapTypeNodeToSchema(context, excludedType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined)\n\t\t\t.map(schema => JsonHelper.canonicalize(schema));\n\n\t\tif (sourceSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst excludedSchemaKeys = new Set(excludedSchemas);\n\t\tconst remainingSchemas = sourceSchemas.filter(\n\t\t\tschema => !excludedSchemaKeys.has(JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (remainingSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (remainingSchemas.length === 1) {\n\t\t\treturn remainingSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: remainingSchemas\n\t\t};\n\t}\n\n\t/**\n\t * Map Extract<T, U> to a schema that keeps U members from T.\n\t */\n\tpublic static mapExtractUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tmapTypeNodeToSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tconst includedTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!sourceTypeNode || !includedTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst includedTypes = ts.isUnionTypeNode(includedTypeNode)\n\t\t\t? includedTypeNode.types\n\t\t\t: [includedTypeNode];\n\n\t\tconst sourceSchemas = sourceTypes\n\t\t\t.map(sourceType => mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\t\tconst includedSchemaKeys = new Set(\n\t\t\tincludedTypes\n\t\t\t\t.map(includedType => mapTypeNodeToSchema(context, includedType))\n\t\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined)\n\t\t\t\t.map(schema => JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (sourceSchemas.length === 0 || includedSchemaKeys.size === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst matchedSchemas = sourceSchemas.filter(schema =>\n\t\t\tincludedSchemaKeys.has(JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (matchedSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (matchedSchemas.length === 1) {\n\t\t\treturn matchedSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: matchedSchemas\n\t\t};\n\t}\n\n\t/**\n\t * Map NonNullable<T> by removing null and undefined branches from T.\n\t */\n\tpublic static mapNonNullableUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tmapTypeNodeToSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!sourceTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst nonNullableTypes = sourceTypes.filter(\n\t\t\tsourceType => !UtilityTypeSchemaMapper.isNullOrUndefinedTypeNode(sourceType)\n\t\t);\n\n\t\tif (nonNullableTypes.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mappedSchemas = nonNullableTypes\n\t\t\t.map(sourceType => mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\n\t\tif (mappedSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (mappedSchemas.length === 1) {\n\t\t\treturn mappedSchemas[0];\n\t\t}\n\n\t\tconst uniqueSchemas = mappedSchemas.filter((schema, index, allSchemas) => {\n\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t});\n\n\t\tif (uniqueSchemas.length === 1) {\n\t\t\treturn uniqueSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: uniqueSchemas\n\t\t};\n\t}\n\n\t/**\n\t * Map Record<K, V> to an object schema with key constraints where possible.\n\t */\n\tpublic static mapRecordUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tmapTypeNodeToSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst keyTypeNode = typeNode.typeArguments?.[0];\n\t\tconst valueTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!keyTypeNode || !valueTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueSchema = mapTypeNodeToSchema(context, valueTypeNode);\n\t\tif (!valueSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst recordLiteralKeys = UtilityTypeSchemaMapper.extractRecordLiteralKeys(keyTypeNode);\n\t\tif (recordLiteralKeys.length > 0) {\n\t\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\t\tfor (const key of recordLiteralKeys) {\n\t\t\t\tproperties[key] = ObjectHelper.clone(valueSchema);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties,\n\t\t\t\trequired: recordLiteralKeys\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties: valueSchema\n\t\t};\n\t}\n\n\t/**\n\t * Map JsonLdObject utility types using key-removal and optional key-addition rules.\n\t */\n\tpublic static mapJsonLdObjectUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\toptions: {\n\t\t\tkeysToRemove: string[];\n\t\t\tkeyToAdd?: \"id\" | \"@id\" | \"type\" | \"@type\" | \"@context\";\n\t\t\tisAddedKeyRequired?: boolean;\n\t\t},\n\t\tresolveUtilityBaseObjectSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\tbaseTypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined,\n\t\tmapTypeNodeToSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (!baseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mappedSchema = ObjectTransformer.omitKeysFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\toptions.keysToRemove\n\t\t);\n\t\tif (!options.keyToAdd) {\n\t\t\treturn mappedSchema;\n\t\t}\n\n\t\tconst valueTypeNode = typeNode.typeArguments?.[1];\n\t\tconst valueSchema = valueTypeNode\n\t\t\t? mapTypeNodeToSchema(context, valueTypeNode)\n\t\t\t: UtilityTypeSchemaMapper.mapJsonLdObjectDefaultSchemaByKey(baseSchema, options.keyToAdd);\n\t\tif (!valueSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tmappedSchema.type = \"object\";\n\t\tmappedSchema.properties ??= {};\n\t\tmappedSchema.properties[options.keyToAdd] = valueSchema;\n\n\t\tif (options.isAddedKeyRequired) {\n\t\t\tconst requiredKeys = new Set(mappedSchema.required ?? []);\n\t\t\trequiredKeys.add(options.keyToAdd);\n\t\t\tmappedSchema.required = [...requiredKeys];\n\t\t}\n\n\t\treturn mappedSchema;\n\t}\n\n\t/**\n\t * Map ObjectOrArray<T> to a schema accepting T or T[].\n\t */\n\tpublic static mapObjectOrArrayUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tmapTypeNodeToSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst itemSchema = mapTypeNodeToSchema(context, baseTypeNode);\n\t\tif (!itemSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst scalarSchemas =\n\t\t\tArray.isArray(itemSchema.anyOf) && Object.keys(itemSchema).length === 1\n\t\t\t\t? itemSchema.anyOf\n\t\t\t\t: [itemSchema];\n\n\t\treturn {\n\t\t\tanyOf: [...scalarSchemas, { type: \"array\", items: itemSchema }]\n\t\t};\n\t}\n\n\t/**\n\t * Map SingleOccurrenceArray<T, U> to a non-empty array containing exactly one U.\n\t */\n\tpublic static mapSingleOccurrenceArrayUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\tmapTypeNodeToSchema: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeNode\n\t\t) => IJsonSchema | undefined\n\t): IJsonSchema | undefined {\n\t\tconst primaryTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!primaryTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst primarySchema = mapTypeNodeToSchema(context, primaryTypeNode);\n\t\tif (!primarySchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst singleOccurrenceTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!singleOccurrenceTypeNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tconst singleOccurrenceSchema = mapTypeNodeToSchema(context, singleOccurrenceTypeNode);\n\t\tif (!singleOccurrenceSchema) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tJsonHelper.canonicalize(primarySchema) === JsonHelper.canonicalize(singleOccurrenceSchema)\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tconst itemSchema: IJsonSchema = {\n\t\t\tanyOf: [primarySchema, singleOccurrenceSchema]\n\t\t};\n\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\titems: itemSchema,\n\t\t\tcontains: singleOccurrenceSchema,\n\t\t\tminContains: 1,\n\t\t\tmaxContains: 1,\n\t\t\tminItems: 1\n\t\t};\n\t}\n\n\t/**\n\t * Determine whether a type node represents null or undefined.\n\t */\n\tprivate static isNullOrUndefinedTypeNode(typeNode: ts.TypeNode): boolean {\n\t\tif (\n\t\t\ttypeNode.kind === ts.SyntaxKind.NullKeyword ||\n\t\t\ttypeNode.kind === ts.SyntaxKind.UndefinedKeyword\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\treturn typeNode.literal.kind === ts.SyntaxKind.NullKeyword;\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n\t\t\treturn typeNode.typeName.text === \"undefined\";\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract literal keys from a Record key type argument.\n\t */\n\tprivate static extractRecordLiteralKeys(keyTypeNode: ts.TypeNode): string[] {\n\t\tif (ts.isLiteralTypeNode(keyTypeNode) && ts.isStringLiteral(keyTypeNode.literal)) {\n\t\t\treturn [keyTypeNode.literal.text];\n\t\t}\n\n\t\tif (ts.isUnionTypeNode(keyTypeNode)) {\n\t\t\tconst keys = keyTypeNode.types\n\t\t\t\t.filter(type => ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal))\n\t\t\t\t.map(type => (type as ts.LiteralTypeNode).literal as ts.StringLiteral)\n\t\t\t\t.map(literal => literal.text);\n\t\t\treturn keys.length === keyTypeNode.types.length ? keys : [];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.\n\t */\n\tprivate static mapJsonLdObjectDefaultSchemaByKey(\n\t\tbaseSchema: IJsonSchema,\n\t\tkeyToAdd: \"id\" | \"@id\" | \"type\" | \"@type\" | \"@context\"\n\t): IJsonSchema {\n\t\tif (keyToAdd === \"id\" || keyToAdd === \"@id\") {\n\t\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectWithIdDefaultIdSchema(baseSchema);\n\t\t}\n\n\t\tif (keyToAdd === \"@context\") {\n\t\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectWithContextDefaultContextSchema(baseSchema);\n\t\t}\n\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema);\n\t}\n\n\t/**\n\t * Resolve default id schema for JsonLdObjectWithId when Id type argument is omitted.\n\t */\n\tprivate static mapJsonLdObjectWithIdDefaultIdSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, \"id\", \"@id\", {\n\t\t\ttype: \"string\"\n\t\t});\n\t}\n\n\t/**\n\t * Resolve default type schema for JsonLdObjectWithType when Type argument is omitted.\n\t */\n\tprivate static mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, \"type\", \"@type\", {\n\t\t\tanyOf: [{ type: \"string\" }, { type: \"array\", items: { type: \"string\" } }]\n\t\t});\n\t}\n\n\t/**\n\t * Resolve default context schema for JsonLdObjectWithContext when Context argument is omitted.\n\t */\n\tprivate static mapJsonLdObjectWithContextDefaultContextSchema(\n\t\tbaseSchema: IJsonSchema\n\t): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(\n\t\t\tbaseSchema,\n\t\t\t\"@context\",\n\t\t\t\"@context\",\n\t\t\t{\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: { type: \"string\" }\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Resolve default schema from either of two source keys, with fallback when both are absent.\n\t */\n\tprivate static mapJsonLdObjectDefaultEitherSchema(\n\t\tbaseSchema: IJsonSchema,\n\t\tfirstKey: string,\n\t\tsecondKey: string,\n\t\tfallbackSchema: IJsonSchema\n\t): IJsonSchema {\n\t\tconst firstSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\tfirstKey\n\t\t);\n\t\tconst secondSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\tsecondKey\n\t\t);\n\n\t\tif (firstSchema && secondSchema) {\n\t\t\tif (JsonHelper.canonicalize(firstSchema) === JsonHelper.canonicalize(secondSchema)) {\n\t\t\t\treturn firstSchema;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tanyOf: [firstSchema, secondSchema]\n\t\t\t};\n\t\t}\n\n\t\tif (firstSchema) {\n\t\t\treturn firstSchema;\n\t\t}\n\n\t\tif (secondSchema) {\n\t\t\treturn secondSchema;\n\t\t}\n\n\t\treturn fallbackSchema;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utilityTypeSchemaMapper.js","sourceRoot":"","sources":["../../../src/utils/utilityTypeSchemaMapper.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D;;GAEG;AACH,MAAM,OAAO,uBAAuB;IACnC;;;;;OAKG;IACI,MAAM,CAAC,qBAAqB,CAClC,OAAmC,EACnC,QAA8B;QAE9B,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7F,IAAI,YAAY,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,iBAAiB,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;YAClF,OAAO,aAAa,CAAC,QAAQ,CAAC;YAC9B,OAAO,aAAa,CAAC;QACtB,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,sBAAsB,CACnC,OAAmC,EACnC,QAA8B;QAE9B,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7F,IAAI,YAAY,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,iBAAiB,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;YACnF,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;gBAC/B,cAAc,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,cAAc,CAAC;QACvB,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,kBAAkB,CAC/B,OAAmC,EACnC,QAA8B;QAE9B,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,sBAAsB,CAC1D,OAAO,EACP,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAC3B,CAAC;QACF,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC3F,IAAI,UAAU,EAAE,CAAC;YAChB,OAAO,iBAAiB,CAAC,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,kBAAkB,CAC/B,OAAmC,EACnC,QAA8B;QAE9B,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,iBAAiB,CAAC,sBAAsB,CAC3D,OAAO,EACP,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAC3B,CAAC;QACF,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC3F,IAAI,UAAU,EAAE,CAAC;YAChB,OAAO,iBAAiB,CAAC,wBAAwB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,qBAAqB,CAClC,OAAmC,EACnC,QAA8B;QAE9B,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,cAAc,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1C,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC;YACrD,CAAC,CAAC,cAAc,CAAC,KAAK;YACtB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACpB,MAAM,aAAa,GAAG,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC;YACzD,CAAC,CAAC,gBAAgB,CAAC,KAAK;YACxB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAEtB,MAAM,aAAa,GAAG,WAAW;aAC/B,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;aAC7E,MAAM,CAAC,CAAC,MAAM,EAAyB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,aAAa;aACnC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;aACjF,MAAM,CAAC,CAAC,MAAM,EAAyB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC;aAC/D,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAEjD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAC5C,MAAM,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAClE,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO;YACN,KAAK,EAAE,gBAAgB;SACvB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,qBAAqB,CAClC,OAAmC,EACnC,QAA8B;QAE9B,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,cAAc,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1C,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC;YACrD,CAAC,CAAC,cAAc,CAAC,KAAK;YACtB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACpB,MAAM,aAAa,GAAG,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC;YACzD,CAAC,CAAC,gBAAgB,CAAC,KAAK;YACxB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAEtB,MAAM,aAAa,GAAG,WAAW;aAC/B,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;aAC7E,MAAM,CAAC,CAAC,MAAM,EAAyB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAClE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CACjC,aAAa;aACX,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;aACjF,MAAM,CAAC,CAAC,MAAM,EAAyB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC;aAC/D,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAChD,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjE,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACpD,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CACvD,CAAC;QAEF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO;YACN,KAAK,EAAE,cAAc;SACrB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,yBAAyB,CACtC,OAAmC,EACnC,QAA8B;QAE9B,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,cAAc,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC;YACrD,CAAC,CAAC,cAAc,CAAC,KAAK;YACtB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACpB,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAC1C,UAAU,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAC5E,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB;aACpC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;aAC7E,MAAM,CAAC,CAAC,MAAM,EAAyB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAElE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACxE,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,KAAK,KAAK,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,OAAO;YACN,KAAK,EAAE,aAAa;SACpB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,oBAAoB,CACjC,OAAmC,EACnC,QAA8B;QAE9B,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,CAAC;YACpC,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAClF,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACxF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,UAAU,GAAmC,EAAE,CAAC;YACtD,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;gBACrC,UAAU,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACnD,CAAC;YACD,OAAO;gBACN,IAAI,EAAE,QAAQ;gBACd,UAAU;gBACV,QAAQ,EAAE,iBAAiB;aAC3B,CAAC;QACH,CAAC;QAED,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,WAAW;SACjC,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACI,MAAM,CAAC,0BAA0B,CACvC,OAAmC,EACnC,QAA8B,EAC9B,OAIC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC3F,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,wBAAwB,CAC9D,UAAU,EACV,OAAO,CAAC,YAAY,CACpB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,aAAa;YAChC,CAAC,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC;YAC/D,CAAC,CAAC,uBAAuB,CAAC,iCAAiC,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3F,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,YAAY,CAAC,IAAI,GAAG,QAAQ,CAAC;QAC7B,YAAY,CAAC,UAAU,KAAK,EAAE,CAAC;QAC/B,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC;QAExD,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC1D,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,YAAY,CAAC,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,YAAY,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,2BAA2B,CACxC,OAAmC,EACnC,QAA8B;QAE9B,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,aAAa,GAClB,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;YACjE,CAAC,CAAC,UAAU,CAAC,KAAK;YAClB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAEjB,OAAO;YACN,KAAK,EAAE,CAAC,GAAG,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;SAC/D,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,mCAAmC,CAChD,OAAmC,EACnC,QAA8B;QAE9B,MAAM,eAAe,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,eAAe,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACtF,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,wBAAwB,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC/B,OAAO;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,CAAC;aACX,CAAC;QACH,CAAC;QAED,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,mBAAmB,CACnE,OAAO,EACP,wBAAwB,CACxB,CAAC;QACF,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC7B,OAAO;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,CAAC;aACX,CAAC;QACH,CAAC;QAED,IACC,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,UAAU,CAAC,YAAY,CAAC,sBAAsB,CAAC,EACzF,CAAC;YACF,OAAO;gBACN,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,CAAC;aACX,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAgB;YAC/B,KAAK,EAAE,CAAC,aAAa,EAAE,sBAAsB,CAAC;SAC9C,CAAC;QAEF,OAAO;YACN,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,sBAAsB;YAChC,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,CAAC;SACX,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,yBAAyB,CAAC,QAAqB;QAC7D,IACC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;YAC3C,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAC/C,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAC5D,CAAC;QAED,IAAI,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5E,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC;QAC/C,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,wBAAwB,CAAC,WAAwB;QAC/D,IAAI,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAClF,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK;iBAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC9E,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,IAA2B,CAAC,OAA2B,CAAC;iBACrE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,iCAAiC,CAC/C,UAAuB,EACvB,QAAsD;QAEtD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC7C,OAAO,uBAAuB,CAAC,oCAAoC,CAAC,UAAU,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,uBAAuB,CAAC,8CAA8C,CAAC,UAAU,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,uBAAuB,CAAC,wCAAwC,CAAC,UAAU,CAAC,CAAC;IACrF,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,oCAAoC,CAAC,UAAuB;QAC1E,OAAO,uBAAuB,CAAC,kCAAkC,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;YAC1F,IAAI,EAAE,QAAQ;SACd,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,wCAAwC,CAAC,UAAuB;QAC9E,OAAO,uBAAuB,CAAC,kCAAkC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;YAC9F,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;SACzE,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,8CAA8C,CAC5D,UAAuB;QAEvB,OAAO,uBAAuB,CAAC,kCAAkC,CAChE,UAAU,EACV,UAAU,EACV,UAAU,EACV;YACC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SACzB,CACD,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,kCAAkC,CAChD,UAAuB,EACvB,QAAgB,EAChB,SAAiB,EACjB,cAA2B;QAE3B,MAAM,WAAW,GAAG,iBAAiB,CAAC,qCAAqC,CAC1E,UAAU,EACV,QAAQ,CACR,CAAC;QACF,MAAM,YAAY,GAAG,iBAAiB,CAAC,qCAAqC,CAC3E,UAAU,EACV,SAAS,CACT,CAAC;QAEF,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;YACjC,IAAI,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpF,OAAO,WAAW,CAAC;YACpB,CAAC;YAED,OAAO;gBACN,KAAK,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;aAClC,CAAC;QACH,CAAC;QAED,OAAO,WAAW,IAAI,YAAY,IAAI,cAAc,CAAC;IACtD,CAAC;CACD","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is, JsonHelper, ObjectHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport { ObjectTransformer } from \"./objectTransformer.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Static utility-type schema mapping helpers.\n */\nexport class UtilityTypeSchemaMapper {\n\t/**\n\t * Map Partial<T> to an object schema with no required properties.\n\t * @param context The generation context.\n\t * @param typeNode The Partial type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapPartialUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (objectSchema) {\n\t\t\tconst partialSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);\n\t\t\tdelete partialSchema.required;\n\t\t\treturn partialSchema;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map Required<T> to an object schema with all properties required.\n\t * @param context The generation context.\n\t * @param typeNode The Required type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapRequiredUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (objectSchema) {\n\t\t\tconst requiredSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);\n\t\t\tif (requiredSchema.properties) {\n\t\t\t\trequiredSchema.required = Object.keys(requiredSchema.properties);\n\t\t\t}\n\t\t\treturn requiredSchema;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map Pick<T, K> to an object schema with selected keys preserved.\n\t * @param context The generation context.\n\t * @param typeNode The Pick type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapPickUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tconst pickedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(\n\t\t\tcontext,\n\t\t\ttypeNode.typeArguments?.[1]\n\t\t);\n\t\tif (!baseTypeNode || pickedKeys.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (baseSchema) {\n\t\t\treturn ObjectTransformer.pickKeysFromObjectSchema(baseSchema, pickedKeys);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map Omit<T, K> to an object schema with selected keys removed.\n\t * @param context The generation context.\n\t * @param typeNode The Omit type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapOmitUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tconst omittedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(\n\t\t\tcontext,\n\t\t\ttypeNode.typeArguments?.[1]\n\t\t);\n\t\tif (!baseTypeNode || omittedKeys.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (baseSchema) {\n\t\t\treturn ObjectTransformer.omitKeysFromObjectSchema(baseSchema, omittedKeys);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map Exclude<T, U> to a schema that removes U members from T.\n\t * @param context The generation context.\n\t * @param typeNode The Exclude type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapExcludeUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tconst excludedTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!sourceTypeNode || !excludedTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst excludedTypes = ts.isUnionTypeNode(excludedTypeNode)\n\t\t\t? excludedTypeNode.types\n\t\t\t: [excludedTypeNode];\n\n\t\tconst sourceSchemas = sourceTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\t\tconst excludedSchemas = excludedTypes\n\t\t\t.map(excludedType => JsonSchemaBuilder.mapTypeNodeToSchema(context, excludedType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined)\n\t\t\t.map(schema => JsonHelper.canonicalize(schema));\n\n\t\tif (sourceSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst excludedSchemaKeys = new Set(excludedSchemas);\n\t\tconst remainingSchemas = sourceSchemas.filter(\n\t\t\tschema => !excludedSchemaKeys.has(JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (remainingSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (remainingSchemas.length === 1) {\n\t\t\treturn remainingSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: remainingSchemas\n\t\t};\n\t}\n\n\t/**\n\t * Map Extract<T, U> to a schema that keeps U members from T.\n\t * @param context The generation context.\n\t * @param typeNode The Extract type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapExtractUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tconst includedTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!sourceTypeNode || !includedTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst includedTypes = ts.isUnionTypeNode(includedTypeNode)\n\t\t\t? includedTypeNode.types\n\t\t\t: [includedTypeNode];\n\n\t\tconst sourceSchemas = sourceTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\t\tconst includedSchemaKeys = new Set(\n\t\t\tincludedTypes\n\t\t\t\t.map(includedType => JsonSchemaBuilder.mapTypeNodeToSchema(context, includedType))\n\t\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined)\n\t\t\t\t.map(schema => JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (sourceSchemas.length === 0 || includedSchemaKeys.size === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst matchedSchemas = sourceSchemas.filter(schema =>\n\t\t\tincludedSchemaKeys.has(JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (matchedSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (matchedSchemas.length === 1) {\n\t\t\treturn matchedSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: matchedSchemas\n\t\t};\n\t}\n\n\t/**\n\t * Map NonNullable<T> by removing null and undefined branches from T.\n\t * @param context The generation context.\n\t * @param typeNode The NonNullable type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapNonNullableUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!sourceTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst nonNullableTypes = sourceTypes.filter(\n\t\t\tsourceType => !UtilityTypeSchemaMapper.isNullOrUndefinedTypeNode(sourceType)\n\t\t);\n\n\t\tif (nonNullableTypes.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mappedSchemas = nonNullableTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\n\t\tif (mappedSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (mappedSchemas.length === 1) {\n\t\t\treturn mappedSchemas[0];\n\t\t}\n\n\t\tconst uniqueSchemas = mappedSchemas.filter((schema, index, allSchemas) => {\n\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t});\n\n\t\tif (uniqueSchemas.length === 1) {\n\t\t\treturn uniqueSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: uniqueSchemas\n\t\t};\n\t}\n\n\t/**\n\t * Map Record<K, V> to an object schema with key constraints where possible.\n\t * @param context The generation context.\n\t * @param typeNode The Record type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapRecordUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst keyTypeNode = typeNode.typeArguments?.[0];\n\t\tconst valueTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!keyTypeNode || !valueTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode);\n\t\tif (!valueSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst recordLiteralKeys = UtilityTypeSchemaMapper.extractRecordLiteralKeys(keyTypeNode);\n\t\tif (recordLiteralKeys.length > 0) {\n\t\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\t\tfor (const key of recordLiteralKeys) {\n\t\t\t\tproperties[key] = ObjectHelper.clone(valueSchema);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties,\n\t\t\t\trequired: recordLiteralKeys\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties: valueSchema\n\t\t};\n\t}\n\n\t/**\n\t * Map JsonLdObject utility types using key-removal and optional key-addition rules.\n\t * @param context The generation context.\n\t * @param typeNode The JsonLdObject utility type reference.\n\t * @param options The mapping options for key removal and optional key addition.\n\t * @param options.keysToRemove The property keys to remove from the base schema.\n\t * @param options.keyToAdd The optional key to add after removal.\n\t * @param options.isAddedKeyRequired True when the added key must be required.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapJsonLdObjectUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\toptions: {\n\t\t\tkeysToRemove: string[];\n\t\t\tkeyToAdd?: \"id\" | \"@id\" | \"type\" | \"@type\" | \"@context\";\n\t\t\tisAddedKeyRequired?: boolean;\n\t\t}\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (!baseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mappedSchema = ObjectTransformer.omitKeysFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\toptions.keysToRemove\n\t\t);\n\t\tif (!options.keyToAdd) {\n\t\t\treturn mappedSchema;\n\t\t}\n\n\t\tconst valueTypeNode = typeNode.typeArguments?.[1];\n\t\tconst valueSchema = valueTypeNode\n\t\t\t? JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode)\n\t\t\t: UtilityTypeSchemaMapper.mapJsonLdObjectDefaultSchemaByKey(baseSchema, options.keyToAdd);\n\t\tif (!valueSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tmappedSchema.type = \"object\";\n\t\tmappedSchema.properties ??= {};\n\t\tmappedSchema.properties[options.keyToAdd] = valueSchema;\n\n\t\tif (options.isAddedKeyRequired) {\n\t\t\tconst requiredKeys = new Set(mappedSchema.required ?? []);\n\t\t\trequiredKeys.add(options.keyToAdd);\n\t\t\tmappedSchema.required = [...requiredKeys];\n\t\t}\n\n\t\treturn mappedSchema;\n\t}\n\n\t/**\n\t * Map ObjectOrArray<T> to a schema accepting T or T[].\n\t * @param context The generation context.\n\t * @param typeNode The ObjectOrArray type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapObjectOrArrayUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst itemSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, baseTypeNode);\n\t\tif (!itemSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst scalarSchemas =\n\t\t\tIs.array(itemSchema.anyOf) && Object.keys(itemSchema).length === 1\n\t\t\t\t? itemSchema.anyOf\n\t\t\t\t: [itemSchema];\n\n\t\treturn {\n\t\t\tanyOf: [...scalarSchemas, { type: \"array\", items: itemSchema }]\n\t\t};\n\t}\n\n\t/**\n\t * Map SingleOccurrenceArray<T, U> to a non-empty array containing exactly one U.\n\t * @param context The generation context.\n\t * @param typeNode The SingleOccurrenceArray type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapSingleOccurrenceArrayUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst primaryTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!primaryTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst primarySchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, primaryTypeNode);\n\t\tif (!primarySchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst singleOccurrenceTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!singleOccurrenceTypeNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tconst singleOccurrenceSchema = JsonSchemaBuilder.mapTypeNodeToSchema(\n\t\t\tcontext,\n\t\t\tsingleOccurrenceTypeNode\n\t\t);\n\t\tif (!singleOccurrenceSchema) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tJsonHelper.canonicalize(primarySchema) === JsonHelper.canonicalize(singleOccurrenceSchema)\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tconst itemSchema: IJsonSchema = {\n\t\t\tanyOf: [primarySchema, singleOccurrenceSchema]\n\t\t};\n\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\titems: itemSchema,\n\t\t\tcontains: singleOccurrenceSchema,\n\t\t\tminContains: 1,\n\t\t\tmaxContains: 1,\n\t\t\tminItems: 1\n\t\t};\n\t}\n\n\t/**\n\t * Determine whether a type node represents null or undefined.\n\t * @param typeNode The type node to inspect.\n\t * @returns True if the node represents null or undefined; otherwise false.\n\t */\n\tprivate static isNullOrUndefinedTypeNode(typeNode: ts.TypeNode): boolean {\n\t\tif (\n\t\t\ttypeNode.kind === ts.SyntaxKind.NullKeyword ||\n\t\t\ttypeNode.kind === ts.SyntaxKind.UndefinedKeyword\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\treturn typeNode.literal.kind === ts.SyntaxKind.NullKeyword;\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n\t\t\treturn typeNode.typeName.text === \"undefined\";\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract literal keys from a Record key type argument.\n\t * @param keyTypeNode The Record key type argument to inspect.\n\t * @returns The extracted literal keys.\n\t */\n\tprivate static extractRecordLiteralKeys(keyTypeNode: ts.TypeNode): string[] {\n\t\tif (ts.isLiteralTypeNode(keyTypeNode) && ts.isStringLiteral(keyTypeNode.literal)) {\n\t\t\treturn [keyTypeNode.literal.text];\n\t\t}\n\n\t\tif (ts.isUnionTypeNode(keyTypeNode)) {\n\t\t\tconst keys = keyTypeNode.types\n\t\t\t\t.filter(type => ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal))\n\t\t\t\t.map(type => (type as ts.LiteralTypeNode).literal as ts.StringLiteral)\n\t\t\t\t.map(literal => literal.text);\n\t\t\treturn keys.length === keyTypeNode.types.length ? keys : [];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.\n\t * @param baseSchema The base object schema being transformed.\n\t * @param keyToAdd The key to add when no explicit value type argument is provided.\n\t * @returns The resolved default schema for the added key.\n\t */\n\tprivate static mapJsonLdObjectDefaultSchemaByKey(\n\t\tbaseSchema: IJsonSchema,\n\t\tkeyToAdd: \"id\" | \"@id\" | \"type\" | \"@type\" | \"@context\"\n\t): IJsonSchema {\n\t\tif (keyToAdd === \"id\" || keyToAdd === \"@id\") {\n\t\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectWithIdDefaultIdSchema(baseSchema);\n\t\t}\n\n\t\tif (keyToAdd === \"@context\") {\n\t\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectWithContextDefaultContextSchema(baseSchema);\n\t\t}\n\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema);\n\t}\n\n\t/**\n\t * Resolve default id schema for JsonLdObjectWithId when Id type argument is omitted.\n\t * @param baseSchema The base object schema being transformed.\n\t * @returns The default id schema.\n\t */\n\tprivate static mapJsonLdObjectWithIdDefaultIdSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, \"id\", \"@id\", {\n\t\t\ttype: \"string\"\n\t\t});\n\t}\n\n\t/**\n\t * Resolve default type schema for JsonLdObjectWithType when Type argument is omitted.\n\t * @param baseSchema The base object schema being transformed.\n\t * @returns The default type schema.\n\t */\n\tprivate static mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, \"type\", \"@type\", {\n\t\t\tanyOf: [{ type: \"string\" }, { type: \"array\", items: { type: \"string\" } }]\n\t\t});\n\t}\n\n\t/**\n\t * Resolve default context schema for JsonLdObjectWithContext when Context argument is omitted.\n\t * @param baseSchema The base object schema being transformed.\n\t * @returns The default context schema.\n\t */\n\tprivate static mapJsonLdObjectWithContextDefaultContextSchema(\n\t\tbaseSchema: IJsonSchema\n\t): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(\n\t\t\tbaseSchema,\n\t\t\t\"@context\",\n\t\t\t\"@context\",\n\t\t\t{\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: { type: \"string\" }\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Resolve default schema from either of two source keys, with fallback when both are absent.\n\t * @param baseSchema The base object schema being transformed.\n\t * @param firstKey The first property key to check.\n\t * @param secondKey The second property key to check.\n\t * @param fallbackSchema The fallback schema when neither key is present.\n\t * @returns The resolved schema.\n\t */\n\tprivate static mapJsonLdObjectDefaultEitherSchema(\n\t\tbaseSchema: IJsonSchema,\n\t\tfirstKey: string,\n\t\tsecondKey: string,\n\t\tfallbackSchema: IJsonSchema\n\t): IJsonSchema {\n\t\tconst firstSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\tfirstKey\n\t\t);\n\t\tconst secondSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\tsecondKey\n\t\t);\n\n\t\tif (firstSchema && secondSchema) {\n\t\t\tif (JsonHelper.canonicalize(firstSchema) === JsonHelper.canonicalize(secondSchema)) {\n\t\t\t\treturn firstSchema;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tanyOf: [firstSchema, secondSchema]\n\t\t\t};\n\t\t}\n\n\t\treturn firstSchema ?? secondSchema ?? fallbackSchema;\n\t}\n}\n"]}
|
|
@@ -7,46 +7,81 @@ import type { ITypeScriptToSchemaContext } from "../models/ITypeScriptToSchemaCo
|
|
|
7
7
|
export declare class ImportTypeQuerySchemaResolver {
|
|
8
8
|
/**
|
|
9
9
|
* Map import type nodes (e.g. import("pkg").Type) to schema references.
|
|
10
|
+
* @param context The generation context.
|
|
11
|
+
* @param typeNode The import type node.
|
|
12
|
+
* @returns The mapped schema.
|
|
10
13
|
*/
|
|
11
14
|
static mapImportTypeNodeToSchema(context: ITypeScriptToSchemaContext, typeNode: ts.ImportTypeNode): IJsonSchema | undefined;
|
|
12
15
|
/**
|
|
13
16
|
* Map a type query node (typeof expr) to schema by resolving the referenced variable.
|
|
17
|
+
* @param context The generation context.
|
|
18
|
+
* @param typeNode The type query node.
|
|
19
|
+
* @returns The mapped schema.
|
|
14
20
|
*/
|
|
15
21
|
static mapTypeQueryNodeToSchema(context: ITypeScriptToSchemaContext, typeNode: ts.TypeQueryNode): IJsonSchema;
|
|
16
22
|
/**
|
|
17
23
|
* Resolve import-type references to local or external schema ids.
|
|
24
|
+
* @param context The generation context.
|
|
25
|
+
* @param moduleSpecifier The import module specifier.
|
|
26
|
+
* @param typeName The imported type name.
|
|
27
|
+
* @param title The stripped schema title.
|
|
28
|
+
* @returns The resolved schema id.
|
|
18
29
|
*/
|
|
19
30
|
static resolveImportTypeReferenceSchemaId(context: ITypeScriptToSchemaContext, moduleSpecifier: string, typeName: string, title: string): string | undefined;
|
|
20
31
|
/**
|
|
21
32
|
* Resolve a property value from a const object declaration in an imported source file.
|
|
33
|
+
* @param context The generation context.
|
|
34
|
+
* @param objectName The imported object symbol name.
|
|
35
|
+
* @param propertyName The property name to resolve from the object.
|
|
36
|
+
* @returns The resolved literal property value.
|
|
22
37
|
*/
|
|
23
38
|
private static resolveConstObjectProperty;
|
|
24
39
|
/**
|
|
25
40
|
* Find a variable declaration by traversing import and export chains.
|
|
41
|
+
* @param sourceFilePath The source file path to inspect.
|
|
42
|
+
* @param variableName The variable name to find.
|
|
43
|
+
* @param visitedFiles The set of visited files to prevent recursion cycles.
|
|
44
|
+
* @returns The matched variable declaration.
|
|
26
45
|
*/
|
|
27
46
|
private static findVariableDeclarationInModuleGraph;
|
|
28
47
|
/**
|
|
29
48
|
* Find an imported symbol reference by local identifier name.
|
|
49
|
+
* @param sourceFile The active source file.
|
|
50
|
+
* @param localName The local identifier name.
|
|
51
|
+
* @returns The imported symbol reference.
|
|
30
52
|
*/
|
|
31
53
|
private static findImportedValueReference;
|
|
32
54
|
/**
|
|
33
55
|
* Resolve an import declaration module specifier to a source file.
|
|
56
|
+
* @param containingSourceFilePath The path of the file containing the import declaration.
|
|
57
|
+
* @param moduleSpecifier The module specifier to resolve.
|
|
58
|
+
* @returns The resolved source file path.
|
|
34
59
|
*/
|
|
35
60
|
private static resolveImportDeclarationSourceFile;
|
|
36
61
|
/**
|
|
37
62
|
* Extract a const-object property value from a declaration initializer.
|
|
63
|
+
* @param objectDeclaration The variable declaration containing the object initializer.
|
|
64
|
+
* @param propertyName The property name to resolve.
|
|
65
|
+
* @returns The extracted literal property value.
|
|
38
66
|
*/
|
|
39
67
|
private static extractConstObjectPropertyFromDeclarationInitializer;
|
|
40
68
|
/**
|
|
41
69
|
* Extract a const-object property value from a declaration type annotation.
|
|
70
|
+
* @param declarationTypeNode The declaration type node to inspect.
|
|
71
|
+
* @param propertyName The property name to resolve.
|
|
72
|
+
* @returns The extracted literal property value.
|
|
42
73
|
*/
|
|
43
74
|
private static extractConstObjectPropertyFromDeclarationType;
|
|
44
75
|
/**
|
|
45
76
|
* Extract a literal value from a type node when possible.
|
|
77
|
+
* @param typeNode The type node to inspect.
|
|
78
|
+
* @returns The extracted literal value.
|
|
46
79
|
*/
|
|
47
80
|
private static extractLiteralValueFromTypeNode;
|
|
48
81
|
/**
|
|
49
82
|
* Extract a referenced type name from an import type qualifier.
|
|
83
|
+
* @param qualifier The import type qualifier.
|
|
84
|
+
* @returns The extracted type name.
|
|
50
85
|
*/
|
|
51
86
|
private static extractImportTypeName;
|
|
52
87
|
}
|