@xlr-lib/xlr-utils 0.1.1--canary.9.190

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.
@@ -0,0 +1,456 @@
1
+ // ../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/utils/src/type-checks.ts
2
+ function isGenericNodeType(nt) {
3
+ return nt.genericTokens?.length > 0;
4
+ }
5
+ function isGenericNamedType(nt) {
6
+ return nt.genericTokens?.length > 0;
7
+ }
8
+ function isPrimitiveTypeNode(node) {
9
+ return node.type === "string" || node.type === "number" || node.type === "boolean" || node.type === "null" || node.type === "any" || node.type === "never" || node.type === "undefined" || node.type === "unknown" || node.type === "void";
10
+ }
11
+ function isNonNullable(a) {
12
+ return a !== null || a !== void 0;
13
+ }
14
+ function isStringType(node) {
15
+ return node.type === "string";
16
+ }
17
+ function isNumberType(node) {
18
+ return node.type === "number";
19
+ }
20
+ function isBooleanType(node) {
21
+ return node.type === "boolean";
22
+ }
23
+ function isObjectType(node) {
24
+ return node.type === "object";
25
+ }
26
+ function isArrayType(node) {
27
+ return node.type === "array";
28
+ }
29
+ function isRefType(node) {
30
+ return node.type === "ref";
31
+ }
32
+ function isOrType(node) {
33
+ return node.type === "or";
34
+ }
35
+ function isAndType(node) {
36
+ return node.type === "and";
37
+ }
38
+ function isRecordType(node) {
39
+ return node.type === "record";
40
+ }
41
+ function isNamedType(node) {
42
+ return "name" in node && "source" in node && typeof node.name === "string";
43
+ }
44
+
45
+ // ../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/utils/src/validation-helpers.ts
46
+ function propertyToTuple(node) {
47
+ return {
48
+ key: node.children?.[0].value,
49
+ value: node.children?.[1]
50
+ };
51
+ }
52
+ function makePropertyMap(node) {
53
+ const m = /* @__PURE__ */ new Map();
54
+ node.children?.forEach((child) => {
55
+ const property = propertyToTuple(child);
56
+ m.set(property.key, property.value);
57
+ });
58
+ return m;
59
+ }
60
+ function isNode(obj) {
61
+ return typeof obj !== "string" || typeof obj !== "number" || typeof obj !== "boolean";
62
+ }
63
+ function computeExtends(a, b) {
64
+ if ((a.type === "any" || a.type === "unknown") && (b.type === "any" || b.type === "unknown")) {
65
+ return true;
66
+ }
67
+ if ((a.type === "null" || a.type === "undefined") && (b.type === "null" || b.type === "undefined")) {
68
+ return true;
69
+ }
70
+ if (a.type === b.type) {
71
+ if (isPrimitiveTypeNode(a) && isPrimitiveTypeNode(b)) {
72
+ if (a.const && b.const) {
73
+ if (a.const === b.const) {
74
+ return true;
75
+ }
76
+ } else {
77
+ return true;
78
+ }
79
+ }
80
+ if (a.type === "ref" && b.type === "ref") {
81
+ return a.ref === b.ref;
82
+ }
83
+ if (a.type === "object" && b.type === "object") {
84
+ for (const property in b.properties) {
85
+ const propertyNode = b.properties[property];
86
+ if (!a.properties[property] || !computeExtends(a.properties[property].node, propertyNode.node)) {
87
+ return false;
88
+ }
89
+ }
90
+ return true;
91
+ }
92
+ }
93
+ if (isPrimitiveTypeNode(a) && b.type === "or") {
94
+ return b.or.every((member) => computeExtends(a, member));
95
+ }
96
+ if (isPrimitiveTypeNode(b) && a.type === "or") {
97
+ return a.or.every((member) => computeExtends(b, member));
98
+ }
99
+ if (a.type === "or" && b.type === "or") {
100
+ return a.or.every((x) => b.or.some((y) => computeExtends(x, y)));
101
+ }
102
+ return false;
103
+ }
104
+ function resolveConditional(conditional) {
105
+ const { left, right } = conditional.check;
106
+ const conditionalResult = computeExtends(left, right) ? conditional.value.true : conditional.value.false;
107
+ if (isGenericNodeType(conditional)) {
108
+ const genericMap = /* @__PURE__ */ new Map();
109
+ conditional.genericTokens.forEach((token) => {
110
+ genericMap.set(
111
+ token.symbol,
112
+ token.default ?? token.constraints ?? { type: "any" }
113
+ );
114
+ });
115
+ return fillInGenerics(conditionalResult, genericMap);
116
+ }
117
+ return conditionalResult;
118
+ }
119
+ function resolveReferenceNode(genericReference, typeToFill) {
120
+ const genericArgs = genericReference.genericArguments;
121
+ const genericMap = /* @__PURE__ */ new Map();
122
+ if (genericArgs && isGenericNodeType(typeToFill)) {
123
+ typeToFill.genericTokens.forEach((token, index) => {
124
+ genericMap.set(
125
+ token.symbol,
126
+ genericArgs[index] ?? token.default ?? token.constraints
127
+ );
128
+ });
129
+ }
130
+ const filledInNode = fillInGenerics(typeToFill, genericMap);
131
+ if (isGenericNodeType(filledInNode) && genericArgs?.length) {
132
+ if (genericArgs.length < filledInNode.genericTokens.length) {
133
+ filledInNode.genericTokens = filledInNode.genericTokens.slice(
134
+ genericArgs?.length
135
+ );
136
+ } else if (genericArgs.length === filledInNode.genericTokens.length) {
137
+ filledInNode.genericTokens = [];
138
+ }
139
+ }
140
+ if (genericReference.property && filledInNode.type === "object") {
141
+ return filledInNode.properties[genericReference.property]?.node ?? filledInNode.additionalProperties ?? { type: "undefined" };
142
+ }
143
+ return filledInNode;
144
+ }
145
+ function computeEffectiveObject(base, operand, errorOnOverlap = true) {
146
+ const baseObjectName = base.name ?? base.title ?? "object literal";
147
+ const operandObjectName = operand.name ?? operand.title ?? "object literal";
148
+ const newObject = {
149
+ ...JSON.parse(JSON.stringify(base)),
150
+ name: `${baseObjectName} & ${operandObjectName}`,
151
+ description: `Effective type combining ${baseObjectName} and ${operandObjectName}`,
152
+ genericTokens: [
153
+ ...isGenericNodeType(base) ? base.genericTokens : [],
154
+ ...isGenericNodeType(operand) ? operand.genericTokens : []
155
+ ]
156
+ };
157
+ for (const property in operand.properties) {
158
+ if (newObject.properties[property] !== void 0 && errorOnOverlap) {
159
+ if (!computeExtends(
160
+ newObject.properties[property].node,
161
+ operand.properties[property].node
162
+ )) {
163
+ throw new Error(
164
+ `Can't compute effective type for ${baseObjectName} and ${operandObjectName} because of conflicting properties ${property}`
165
+ );
166
+ }
167
+ }
168
+ newObject.properties[property] = operand.properties[property];
169
+ }
170
+ if (newObject.additionalProperties && operand.additionalProperties) {
171
+ if (!isPrimitiveTypeNode(newObject.additionalProperties) || !isPrimitiveTypeNode(operand.additionalProperties) || newObject.additionalProperties.type !== operand.additionalProperties.type) {
172
+ newObject.additionalProperties = {
173
+ type: "and",
174
+ and: [newObject.additionalProperties, operand.additionalProperties]
175
+ };
176
+ }
177
+ } else if (operand.additionalProperties) {
178
+ newObject.additionalProperties = operand.additionalProperties;
179
+ }
180
+ return newObject;
181
+ }
182
+
183
+ // ../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/utils/src/xlr-helpers.ts
184
+ function fillInGenerics(xlrNode, generics, preferLocalGenerics = false) {
185
+ let localGenerics;
186
+ if (generics) {
187
+ localGenerics = new Map(generics);
188
+ if (preferLocalGenerics && isGenericNodeType(xlrNode)) {
189
+ xlrNode.genericTokens?.forEach((token) => {
190
+ const genericValue = token.default ?? token.constraints;
191
+ localGenerics.set(
192
+ token.symbol,
193
+ fillInGenerics(genericValue, localGenerics, preferLocalGenerics)
194
+ );
195
+ });
196
+ }
197
+ } else {
198
+ localGenerics = /* @__PURE__ */ new Map();
199
+ if (isGenericNodeType(xlrNode)) {
200
+ xlrNode.genericTokens?.forEach((token) => {
201
+ const genericValue = token.default ?? token.constraints;
202
+ localGenerics.set(
203
+ token.symbol,
204
+ fillInGenerics(genericValue, localGenerics, preferLocalGenerics)
205
+ );
206
+ });
207
+ }
208
+ }
209
+ if (xlrNode.type === "ref") {
210
+ if (localGenerics.has(xlrNode.ref)) {
211
+ return {
212
+ ...localGenerics.get(xlrNode.ref),
213
+ ...xlrNode.genericArguments ? {
214
+ genericArguments: xlrNode.genericArguments.map(
215
+ (ga) => fillInGenerics(ga, localGenerics, preferLocalGenerics)
216
+ )
217
+ } : {},
218
+ ...xlrNode.title ? { title: xlrNode.title } : {},
219
+ ...xlrNode.name ? { name: xlrNode.name } : {},
220
+ ...xlrNode.description ? { description: xlrNode.description } : {},
221
+ ...xlrNode.comment ? { comment: xlrNode.comment } : {}
222
+ };
223
+ }
224
+ return {
225
+ ...xlrNode,
226
+ ...xlrNode.genericArguments ? {
227
+ genericArguments: xlrNode.genericArguments.map(
228
+ (ga) => fillInGenerics(ga, localGenerics, preferLocalGenerics)
229
+ )
230
+ } : {}
231
+ };
232
+ }
233
+ if (xlrNode.type === "object") {
234
+ const newProperties = {};
235
+ Object.getOwnPropertyNames(xlrNode.properties).forEach((propName) => {
236
+ const prop = xlrNode.properties[propName];
237
+ newProperties[propName] = {
238
+ required: prop.required,
239
+ node: fillInGenerics(prop.node, localGenerics, preferLocalGenerics)
240
+ };
241
+ });
242
+ return {
243
+ ...xlrNode,
244
+ properties: newProperties,
245
+ ...isGenericNamedType(xlrNode) ? {
246
+ genericTokens: xlrNode.genericTokens.map((token) => {
247
+ return {
248
+ ...token,
249
+ constraints: token.constraints ? fillInGenerics(
250
+ token.constraints,
251
+ localGenerics,
252
+ preferLocalGenerics
253
+ ) : void 0,
254
+ default: token.default ? fillInGenerics(
255
+ token.default,
256
+ localGenerics,
257
+ preferLocalGenerics
258
+ ) : void 0
259
+ };
260
+ })
261
+ } : {},
262
+ extends: xlrNode.extends ? fillInGenerics(
263
+ xlrNode.extends,
264
+ localGenerics,
265
+ preferLocalGenerics
266
+ ) : void 0,
267
+ additionalProperties: xlrNode.additionalProperties ? fillInGenerics(
268
+ xlrNode.additionalProperties,
269
+ localGenerics,
270
+ preferLocalGenerics
271
+ ) : false
272
+ };
273
+ }
274
+ if (xlrNode.type === "array") {
275
+ return {
276
+ ...xlrNode,
277
+ elementType: fillInGenerics(
278
+ xlrNode.elementType,
279
+ localGenerics,
280
+ preferLocalGenerics
281
+ )
282
+ };
283
+ } else if (xlrNode.type === "or" || xlrNode.type === "and") {
284
+ let pointer;
285
+ if (xlrNode.type === "or") {
286
+ pointer = xlrNode.or;
287
+ } else {
288
+ pointer = xlrNode.and;
289
+ }
290
+ return {
291
+ ...xlrNode,
292
+ [xlrNode.type]: pointer.map((prop) => {
293
+ return fillInGenerics(prop, localGenerics, preferLocalGenerics);
294
+ })
295
+ };
296
+ } else if (xlrNode.type === "record") {
297
+ return {
298
+ ...xlrNode,
299
+ keyType: fillInGenerics(
300
+ xlrNode.keyType,
301
+ localGenerics,
302
+ preferLocalGenerics
303
+ ),
304
+ valueType: fillInGenerics(
305
+ xlrNode.valueType,
306
+ localGenerics,
307
+ preferLocalGenerics
308
+ )
309
+ };
310
+ } else if (xlrNode.type === "conditional") {
311
+ const filledInConditional = {
312
+ ...xlrNode,
313
+ check: {
314
+ left: fillInGenerics(
315
+ xlrNode.check.left,
316
+ localGenerics,
317
+ preferLocalGenerics
318
+ ),
319
+ right: fillInGenerics(
320
+ xlrNode.check.right,
321
+ localGenerics,
322
+ preferLocalGenerics
323
+ )
324
+ },
325
+ value: {
326
+ true: fillInGenerics(
327
+ xlrNode.value.true,
328
+ localGenerics,
329
+ preferLocalGenerics
330
+ ),
331
+ false: fillInGenerics(
332
+ xlrNode.value.false,
333
+ localGenerics,
334
+ preferLocalGenerics
335
+ )
336
+ }
337
+ };
338
+ if (filledInConditional.check.left.type !== "ref" && filledInConditional.check.right.type !== "ref") {
339
+ return {
340
+ name: xlrNode.name,
341
+ title: xlrNode.title,
342
+ ...resolveConditional(filledInConditional)
343
+ };
344
+ }
345
+ return filledInConditional;
346
+ }
347
+ return xlrNode;
348
+ }
349
+ function applyPickOrOmitToNodeType(baseObject, operation, properties) {
350
+ if (baseObject.type === "object") {
351
+ const newObject = { ...baseObject };
352
+ Object.keys(baseObject.properties).forEach((key) => {
353
+ if (operation === "Omit" && properties.has(key) || operation === "Pick" && !properties.has(key)) {
354
+ delete newObject.properties[key];
355
+ }
356
+ });
357
+ if (Object.keys(newObject.properties).length === 0 && (operation !== "Omit" || newObject.additionalProperties === false)) {
358
+ return void 0;
359
+ }
360
+ return newObject;
361
+ }
362
+ let pointer;
363
+ if (baseObject.type === "and") {
364
+ pointer = baseObject.and;
365
+ } else if (baseObject.type === "or") {
366
+ pointer = baseObject.or;
367
+ } else {
368
+ throw new Error(
369
+ `Error: Can not apply ${operation} to type ${baseObject.type}`
370
+ );
371
+ }
372
+ const pickedTypes = pointer.map((type) => {
373
+ const node = applyPickOrOmitToNodeType(type, operation, properties);
374
+ if (node === void 0) {
375
+ return void 0;
376
+ }
377
+ return { ...node, additionalProperties: false };
378
+ }).filter((type) => type !== void 0);
379
+ if (pickedTypes.length === 0) {
380
+ return void 0;
381
+ }
382
+ if (pickedTypes.length === 1) {
383
+ return pickedTypes[0];
384
+ }
385
+ if (baseObject.type === "and") {
386
+ return { ...baseObject, and: pickedTypes };
387
+ }
388
+ return { ...baseObject, or: pickedTypes };
389
+ }
390
+ function applyPartialOrRequiredToNodeType(baseObject, modifier) {
391
+ if (baseObject.type === "object") {
392
+ const newObject = { ...baseObject };
393
+ Object.keys(baseObject.properties).forEach((key) => {
394
+ newObject.properties[key].required = modifier;
395
+ });
396
+ return newObject;
397
+ }
398
+ if (baseObject.type === "and") {
399
+ const pickedTypes = baseObject.and.map(
400
+ (type) => applyPartialOrRequiredToNodeType(type, modifier)
401
+ );
402
+ return { ...baseObject, and: pickedTypes };
403
+ }
404
+ if (baseObject.type === "or") {
405
+ const pickedTypes = baseObject.or.map(
406
+ (type) => applyPartialOrRequiredToNodeType(type, modifier)
407
+ );
408
+ return { ...baseObject, or: pickedTypes };
409
+ }
410
+ throw new Error(
411
+ `Error: Can not apply ${modifier ? "Required" : "Partial"} to type ${baseObject.type}`
412
+ );
413
+ }
414
+ function applyExcludeToNodeType(baseObject, filters) {
415
+ const remainingMembers = baseObject.or.filter((type) => {
416
+ if (filters.type === "or") {
417
+ return !filters.or.some((filter) => computeExtends(type, filter));
418
+ }
419
+ return !computeExtends(type, filters);
420
+ });
421
+ if (remainingMembers.length === 1) {
422
+ return remainingMembers[0];
423
+ }
424
+ return {
425
+ ...baseObject,
426
+ or: remainingMembers
427
+ };
428
+ }
429
+ export {
430
+ applyExcludeToNodeType,
431
+ applyPartialOrRequiredToNodeType,
432
+ applyPickOrOmitToNodeType,
433
+ computeEffectiveObject,
434
+ computeExtends,
435
+ fillInGenerics,
436
+ isAndType,
437
+ isArrayType,
438
+ isBooleanType,
439
+ isGenericNamedType,
440
+ isGenericNodeType,
441
+ isNamedType,
442
+ isNode,
443
+ isNonNullable,
444
+ isNumberType,
445
+ isObjectType,
446
+ isOrType,
447
+ isPrimitiveTypeNode,
448
+ isRecordType,
449
+ isRefType,
450
+ isStringType,
451
+ makePropertyMap,
452
+ propertyToTuple,
453
+ resolveConditional,
454
+ resolveReferenceNode
455
+ };
456
+ //# sourceMappingURL=index.mjs.map