@player-lang/functional-dsl-generator 0.0.2-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/cjs/index.cjs +2146 -0
  2. package/dist/cjs/index.cjs.map +1 -0
  3. package/dist/index.legacy-esm.js +2075 -0
  4. package/dist/index.mjs +2075 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/package.json +38 -0
  7. package/src/__tests__/__snapshots__/generator.test.ts.snap +886 -0
  8. package/src/__tests__/builder-class-generator.test.ts +627 -0
  9. package/src/__tests__/cli.test.ts +685 -0
  10. package/src/__tests__/default-value-generator.test.ts +365 -0
  11. package/src/__tests__/generator.test.ts +2860 -0
  12. package/src/__tests__/import-generator.test.ts +444 -0
  13. package/src/__tests__/path-utils.test.ts +174 -0
  14. package/src/__tests__/type-collector.test.ts +674 -0
  15. package/src/__tests__/type-transformer.test.ts +934 -0
  16. package/src/__tests__/utils.test.ts +597 -0
  17. package/src/builder-class-generator.ts +254 -0
  18. package/src/cli.ts +285 -0
  19. package/src/default-value-generator.ts +307 -0
  20. package/src/generator.ts +257 -0
  21. package/src/import-generator.ts +331 -0
  22. package/src/index.ts +38 -0
  23. package/src/path-utils.ts +155 -0
  24. package/src/ts-morph-type-finder.ts +319 -0
  25. package/src/type-categorizer.ts +131 -0
  26. package/src/type-collector.ts +296 -0
  27. package/src/type-resolver.ts +266 -0
  28. package/src/type-transformer.ts +487 -0
  29. package/src/utils.ts +762 -0
  30. package/types/builder-class-generator.d.ts +56 -0
  31. package/types/cli.d.ts +6 -0
  32. package/types/default-value-generator.d.ts +74 -0
  33. package/types/generator.d.ts +102 -0
  34. package/types/import-generator.d.ts +77 -0
  35. package/types/index.d.ts +12 -0
  36. package/types/path-utils.d.ts +65 -0
  37. package/types/ts-morph-type-finder.d.ts +73 -0
  38. package/types/type-categorizer.d.ts +46 -0
  39. package/types/type-collector.d.ts +62 -0
  40. package/types/type-resolver.d.ts +49 -0
  41. package/types/type-transformer.d.ts +74 -0
  42. package/types/utils.d.ts +205 -0
@@ -0,0 +1,2075 @@
1
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/generator.ts
2
+ import { isGenericNamedType as isGenericNamedType2 } from "@xlr-lib/xlr-utils";
3
+
4
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/utils.ts
5
+ import {
6
+ isStringType,
7
+ isNumberType,
8
+ isBooleanType,
9
+ isObjectType,
10
+ isArrayType,
11
+ isRefType,
12
+ isOrType,
13
+ isAndType,
14
+ isRecordType,
15
+ isNamedType
16
+ } from "@xlr-lib/xlr-utils";
17
+ function isTupleType(node) {
18
+ return node.type === "tuple";
19
+ }
20
+ function isPrimitiveConst(node) {
21
+ return (isStringType(node) || isNumberType(node) || isBooleanType(node)) && "const" in node && node.const !== void 0;
22
+ }
23
+ function isAssetWrapperRef(node) {
24
+ return isRefType(node) && node.ref.startsWith("AssetWrapper");
25
+ }
26
+ function extendsAssetWrapper(node, typeRegistry, visited = /* @__PURE__ */ new Set()) {
27
+ if (isObjectType(node) && node.extends) {
28
+ if (node.extends.ref.startsWith("AssetWrapper")) return true;
29
+ return extendsAssetWrapper(node.extends, typeRegistry, visited);
30
+ }
31
+ if (isRefType(node)) {
32
+ const typeName = extractBaseName(node.ref);
33
+ if (visited.has(typeName)) return false;
34
+ visited.add(typeName);
35
+ const resolved = typeRegistry.get(typeName);
36
+ if (!resolved?.extends) return false;
37
+ if (resolved.extends.ref.startsWith("AssetWrapper")) return true;
38
+ return extendsAssetWrapper(resolved.extends, typeRegistry, visited);
39
+ }
40
+ return false;
41
+ }
42
+ function getAssetWrapperExtendsRef(node, typeRegistry, visited = /* @__PURE__ */ new Set()) {
43
+ if (isObjectType(node) && node.extends) {
44
+ if (node.extends.ref.startsWith("AssetWrapper")) return node.extends;
45
+ return getAssetWrapperExtendsRef(node.extends, typeRegistry, visited);
46
+ }
47
+ if (isRefType(node)) {
48
+ const typeName = extractBaseName(node.ref);
49
+ if (visited.has(typeName)) return void 0;
50
+ visited.add(typeName);
51
+ const resolved = typeRegistry.get(typeName);
52
+ if (!resolved?.extends) return void 0;
53
+ if (resolved.extends.ref.startsWith("AssetWrapper"))
54
+ return resolved.extends;
55
+ return getAssetWrapperExtendsRef(resolved.extends, typeRegistry, visited);
56
+ }
57
+ return void 0;
58
+ }
59
+ function getAssetWrapperExtendsRefByName(typeName, typeRegistry) {
60
+ return getAssetWrapperExtendsRef(
61
+ { type: "ref", ref: typeName },
62
+ typeRegistry
63
+ );
64
+ }
65
+ function isExpressionRef(node) {
66
+ return isRefType(node) && node.ref === "Expression";
67
+ }
68
+ function isBindingRef(node) {
69
+ return isRefType(node) && node.ref === "Binding";
70
+ }
71
+ function sanitizePropertyName(name) {
72
+ return name.replace(/^['"]|['"]$/g, "");
73
+ }
74
+ function toPascalCase(str) {
75
+ const sanitized = sanitizePropertyName(str);
76
+ return sanitized.split(/[-_]/).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
77
+ }
78
+ function toFactoryName(typeName) {
79
+ const name = typeName.replace(/Asset$/, "");
80
+ return name.charAt(0).toLowerCase() + name.slice(1);
81
+ }
82
+ function toBuilderClassName(typeName) {
83
+ return `${typeName}Builder`;
84
+ }
85
+ function isComplexObjectType(obj) {
86
+ const props = Object.values(obj.properties);
87
+ const hasSlots = props.some((p) => isAssetWrapperRef(p.node));
88
+ if (hasSlots) return true;
89
+ if (props.length > 3) return true;
90
+ const hasNestedObjects = props.some(
91
+ (p) => isObjectType(p.node) && !isPrimitiveConst(p.node)
92
+ );
93
+ if (hasNestedObjects) return true;
94
+ return false;
95
+ }
96
+ function getAssetTypeFromExtends(obj) {
97
+ if (!obj.extends) return void 0;
98
+ const ref = obj.extends;
99
+ if (ref.genericArguments && ref.genericArguments.length > 0) {
100
+ const typeArg = ref.genericArguments[0];
101
+ if (isStringType(typeArg) && typeArg.const) {
102
+ return typeArg.const;
103
+ }
104
+ }
105
+ return void 0;
106
+ }
107
+ function getPropertiesInfo(obj) {
108
+ return Object.entries(obj.properties).map(([name, prop]) => {
109
+ const isSlot = isAssetWrapperRef(prop.node);
110
+ const isArray = isArrayType(prop.node);
111
+ const isArraySlot = isArray && isAssetWrapperRef(prop.node.elementType);
112
+ return {
113
+ name,
114
+ node: prop.node,
115
+ required: prop.required,
116
+ isSlot,
117
+ isArraySlot,
118
+ isArray
119
+ };
120
+ });
121
+ }
122
+ function containsArrayType(node) {
123
+ if (isArrayType(node)) {
124
+ return true;
125
+ }
126
+ if (isOrType(node)) {
127
+ return node.or.some(containsArrayType);
128
+ }
129
+ if (isAndType(node)) {
130
+ return node.and.some(containsArrayType);
131
+ }
132
+ return false;
133
+ }
134
+ function splitAtTopLevelCommas(str) {
135
+ const result = [];
136
+ let current = "";
137
+ let depth = 0;
138
+ for (const char of str) {
139
+ if (char === "<") {
140
+ depth++;
141
+ current += char;
142
+ } else if (char === ">") {
143
+ depth--;
144
+ current += char;
145
+ } else if (char === "," && depth === 0) {
146
+ result.push(current.trim());
147
+ current = "";
148
+ } else {
149
+ current += char;
150
+ }
151
+ }
152
+ if (current.trim()) {
153
+ result.push(current.trim());
154
+ }
155
+ return result;
156
+ }
157
+ function extractGenericUsage(genericParams) {
158
+ if (!genericParams) {
159
+ return "";
160
+ }
161
+ const params = splitAtTopLevelCommas(genericParams).map((p) => p.trim().split(" ")[0]).join(", ");
162
+ return `<${params}>`;
163
+ }
164
+ var TYPESCRIPT_BUILTINS = /* @__PURE__ */ new Set([
165
+ // Primitive wrappers
166
+ "String",
167
+ "Number",
168
+ "Boolean",
169
+ "Symbol",
170
+ "BigInt",
171
+ // Collections
172
+ "Array",
173
+ "Map",
174
+ "Set",
175
+ "WeakMap",
176
+ "WeakSet",
177
+ "ReadonlyArray",
178
+ "ReadonlyMap",
179
+ "ReadonlySet",
180
+ // Object types
181
+ "Object",
182
+ "Function",
183
+ "Date",
184
+ "RegExp",
185
+ "Error",
186
+ "Promise",
187
+ "PromiseLike",
188
+ // Utility types
189
+ "Partial",
190
+ "Required",
191
+ "Readonly",
192
+ "Pick",
193
+ "Omit",
194
+ "Exclude",
195
+ "Extract",
196
+ "NonNullable",
197
+ "Parameters",
198
+ "ConstructorParameters",
199
+ "ReturnType",
200
+ "InstanceType",
201
+ "ThisParameterType",
202
+ "OmitThisParameter",
203
+ "ThisType",
204
+ "Awaited",
205
+ "Record",
206
+ // Iterable types
207
+ "Iterable",
208
+ "Iterator",
209
+ "IterableIterator",
210
+ "Generator",
211
+ "AsyncIterator",
212
+ "AsyncIterable",
213
+ "AsyncIterableIterator",
214
+ "AsyncGenerator",
215
+ "GeneratorFunction",
216
+ "AsyncGeneratorFunction",
217
+ // Array-like types
218
+ "ArrayLike",
219
+ "ArrayBuffer",
220
+ "SharedArrayBuffer",
221
+ "DataView",
222
+ "TypedArray",
223
+ "Int8Array",
224
+ "Uint8Array",
225
+ "Uint8ClampedArray",
226
+ "Int16Array",
227
+ "Uint16Array",
228
+ "Int32Array",
229
+ "Uint32Array",
230
+ "Float32Array",
231
+ "Float64Array",
232
+ "BigInt64Array",
233
+ "BigUint64Array",
234
+ // Other built-ins
235
+ "JSON",
236
+ "Math",
237
+ "Console",
238
+ "Proxy",
239
+ "Reflect",
240
+ "WeakRef",
241
+ "FinalizationRegistry"
242
+ ]);
243
+ var PLAYER_BUILTINS = /* @__PURE__ */ new Set([
244
+ "Asset",
245
+ "AssetWrapper",
246
+ "Binding",
247
+ "Expression"
248
+ ]);
249
+ function isBuiltinType(typeName) {
250
+ return TYPESCRIPT_BUILTINS.has(typeName) || PLAYER_BUILTINS.has(typeName);
251
+ }
252
+ function extractBaseName(ref) {
253
+ const bracketIndex = ref.indexOf("<");
254
+ return bracketIndex === -1 ? ref : ref.substring(0, bracketIndex);
255
+ }
256
+ function parseNamespacedType(typeName) {
257
+ const dotIndex = typeName.indexOf(".");
258
+ if (dotIndex === -1) return null;
259
+ return {
260
+ namespace: typeName.substring(0, dotIndex),
261
+ member: typeName.substring(dotIndex + 1)
262
+ };
263
+ }
264
+ function findAssetWrapperPaths(node, typeRegistry) {
265
+ const context = {
266
+ typeRegistry,
267
+ visited: /* @__PURE__ */ new Set(),
268
+ currentPath: []
269
+ };
270
+ return findPathsRecursive(node, context);
271
+ }
272
+ function findPathsRecursive(node, context) {
273
+ const paths = [];
274
+ if (isObjectType(node)) {
275
+ if (isNamedType(node)) {
276
+ if (context.visited.has(node.name)) {
277
+ return [];
278
+ }
279
+ context.visited.add(node.name);
280
+ }
281
+ for (const [propName, prop] of Object.entries(node.properties)) {
282
+ const propPaths = findPathsForProperty(propName, prop.node, context);
283
+ paths.push(...propPaths);
284
+ }
285
+ if (isNamedType(node)) {
286
+ context.visited.delete(node.name);
287
+ }
288
+ }
289
+ return paths;
290
+ }
291
+ function recurseIntoExtendingType(targetNode, context, propName) {
292
+ const newContext = {
293
+ ...context,
294
+ currentPath: [...context.currentPath, propName]
295
+ };
296
+ if (isObjectType(targetNode)) {
297
+ return findPathsRecursive(targetNode, newContext);
298
+ }
299
+ if (isRefType(targetNode)) {
300
+ const typeName = extractBaseName(targetNode.ref);
301
+ const resolvedType = context.typeRegistry.get(typeName);
302
+ if (resolvedType && !context.visited.has(typeName)) {
303
+ context.visited.add(typeName);
304
+ const nestedPaths = findPathsRecursive(resolvedType, newContext);
305
+ context.visited.delete(typeName);
306
+ return nestedPaths;
307
+ }
308
+ }
309
+ return [];
310
+ }
311
+ function findPathsForProperty(propName, node, context) {
312
+ const paths = [];
313
+ if (isAssetWrapperRef(node)) {
314
+ paths.push([...context.currentPath, propName]);
315
+ return paths;
316
+ }
317
+ if (isArrayType(node) && isAssetWrapperRef(node.elementType)) {
318
+ paths.push([...context.currentPath, propName]);
319
+ return paths;
320
+ }
321
+ if (extendsAssetWrapper(node, context.typeRegistry, new Set(context.visited))) {
322
+ paths.push([...context.currentPath, propName]);
323
+ paths.push(...recurseIntoExtendingType(node, context, propName));
324
+ return paths;
325
+ }
326
+ if (isArrayType(node) && extendsAssetWrapper(
327
+ node.elementType,
328
+ context.typeRegistry,
329
+ new Set(context.visited)
330
+ )) {
331
+ paths.push([...context.currentPath, propName]);
332
+ paths.push(
333
+ ...recurseIntoExtendingType(node.elementType, context, propName)
334
+ );
335
+ return paths;
336
+ }
337
+ if (isArrayType(node)) {
338
+ paths.push(
339
+ ...recurseIntoExtendingType(node.elementType, context, propName)
340
+ );
341
+ return paths;
342
+ }
343
+ if (isRefType(node)) {
344
+ const typeName = extractBaseName(node.ref);
345
+ const resolvedType = context.typeRegistry.get(typeName);
346
+ if (resolvedType && !context.visited.has(typeName)) {
347
+ context.visited.add(typeName);
348
+ const newContext = {
349
+ ...context,
350
+ currentPath: [...context.currentPath, propName]
351
+ };
352
+ const nestedPaths = findPathsRecursive(resolvedType, newContext);
353
+ paths.push(...nestedPaths);
354
+ context.visited.delete(typeName);
355
+ }
356
+ return paths;
357
+ }
358
+ if (isObjectType(node)) {
359
+ const newContext = {
360
+ ...context,
361
+ currentPath: [...context.currentPath, propName]
362
+ };
363
+ const nestedPaths = findPathsRecursive(node, newContext);
364
+ paths.push(...nestedPaths);
365
+ return paths;
366
+ }
367
+ if (isOrType(node)) {
368
+ for (const variant of node.or) {
369
+ const variantPaths = findPathsForProperty(propName, variant, {
370
+ ...context,
371
+ currentPath: context.currentPath
372
+ });
373
+ for (const path3 of variantPaths) {
374
+ const pathStr = path3.join(".");
375
+ if (!paths.some((p) => p.join(".") === pathStr)) {
376
+ paths.push(path3);
377
+ }
378
+ }
379
+ }
380
+ return paths;
381
+ }
382
+ if (isAndType(node)) {
383
+ for (const part of node.and) {
384
+ const partPaths = findPathsForProperty(propName, part, {
385
+ ...context,
386
+ currentPath: context.currentPath
387
+ });
388
+ for (const path3 of partPaths) {
389
+ const pathStr = path3.join(".");
390
+ if (!paths.some((p) => p.join(".") === pathStr)) {
391
+ paths.push(path3);
392
+ }
393
+ }
394
+ }
395
+ return paths;
396
+ }
397
+ return paths;
398
+ }
399
+
400
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/type-collector.ts
401
+ import { isGenericNamedType } from "@xlr-lib/xlr-utils";
402
+ var TypeCollector = class {
403
+ typeTracker;
404
+ genericParamSymbols;
405
+ mainTypeName;
406
+ namespaceMemberMap;
407
+ typeRegistry;
408
+ constructor(typeTracker, genericParamSymbols, mainTypeName, namespaceMemberMap, typeRegistry) {
409
+ this.typeTracker = typeTracker;
410
+ this.genericParamSymbols = genericParamSymbols;
411
+ this.mainTypeName = mainTypeName;
412
+ this.namespaceMemberMap = namespaceMemberMap;
413
+ this.typeRegistry = typeRegistry;
414
+ }
415
+ /**
416
+ * Collect generic parameter symbols (e.g., T, U) from the type definition.
417
+ * These should not be imported as they are type parameters, not concrete types.
418
+ *
419
+ * Also handles the case where a non-generic type extends a generic base without
420
+ * passing type arguments. In that scenario, XLR copies properties from the base
421
+ * (including references to the base's generic params like `AnyAsset`) but does
422
+ * NOT propagate `genericTokens` to the child type. We scan the type registry for
423
+ * generic parameter symbols that should be excluded from imports.
424
+ */
425
+ collectGenericParamSymbols(namedType) {
426
+ if (isGenericNamedType(namedType)) {
427
+ for (const token of namedType.genericTokens) {
428
+ this.genericParamSymbols.add(token.symbol);
429
+ }
430
+ }
431
+ if (this.typeRegistry) {
432
+ for (const registeredType of this.typeRegistry.values()) {
433
+ if (isGenericNamedType(registeredType)) {
434
+ for (const token of registeredType.genericTokens) {
435
+ if (!this.typeRegistry.has(token.symbol)) {
436
+ this.genericParamSymbols.add(token.symbol);
437
+ }
438
+ }
439
+ }
440
+ }
441
+ }
442
+ }
443
+ /**
444
+ * Collect type references from generic parameter constraints and defaults.
445
+ * This ensures types used in generics like "T extends Foo = Bar<X>" have
446
+ * Foo, Bar, and X added to referencedTypes for import generation.
447
+ */
448
+ collectTypesFromGenericTokens(namedType) {
449
+ if (!isGenericNamedType(namedType)) {
450
+ return;
451
+ }
452
+ for (const token of namedType.genericTokens) {
453
+ if (token.constraints) {
454
+ this.collectTypeReferencesFromNode(token.constraints);
455
+ }
456
+ if (token.default) {
457
+ this.collectTypeReferencesFromNode(token.default);
458
+ }
459
+ }
460
+ }
461
+ /**
462
+ * Collect all referenced types from an object type for imports.
463
+ */
464
+ collectReferencedTypes(objType) {
465
+ for (const prop of Object.values(objType.properties)) {
466
+ this.collectReferencedTypesFromNode(prop.node);
467
+ }
468
+ }
469
+ /**
470
+ * Collect referenced types from a node type.
471
+ */
472
+ collectReferencedTypesFromNode(node) {
473
+ if (isObjectType(node)) {
474
+ if (isNamedType(node)) {
475
+ if (node.name !== this.mainTypeName && !isBuiltinType(node.name) && !this.genericParamSymbols.has(node.name)) {
476
+ this.typeTracker.trackReferencedType(node.name);
477
+ }
478
+ } else {
479
+ for (const prop of Object.values(node.properties)) {
480
+ this.collectReferencedTypesFromNode(prop.node);
481
+ }
482
+ }
483
+ } else if (isArrayType(node)) {
484
+ this.collectReferencedTypesFromNode(node.elementType);
485
+ } else if (isOrType(node)) {
486
+ for (const variant of node.or) {
487
+ this.collectReferencedTypesFromNode(variant);
488
+ }
489
+ } else if (isAndType(node)) {
490
+ for (const part of node.and) {
491
+ this.collectReferencedTypesFromNode(part);
492
+ }
493
+ } else if (isRefType(node)) {
494
+ const baseName = extractBaseName(node.ref);
495
+ const namespaced = parseNamespacedType(baseName);
496
+ if (namespaced) {
497
+ this.typeTracker.trackNamespaceImport(namespaced.namespace);
498
+ this.namespaceMemberMap.set(namespaced.member, baseName);
499
+ } else {
500
+ if (!isBuiltinType(baseName) && !this.genericParamSymbols.has(baseName)) {
501
+ this.typeTracker.trackReferencedType(baseName);
502
+ }
503
+ }
504
+ if (node.genericArguments) {
505
+ for (const arg of node.genericArguments) {
506
+ if (isRefType(arg)) {
507
+ const argName = extractBaseName(arg.ref);
508
+ if (this.isTypeParamOfRef(argName, node.ref)) {
509
+ continue;
510
+ }
511
+ }
512
+ this.collectReferencedTypesFromNode(arg);
513
+ }
514
+ }
515
+ }
516
+ }
517
+ /**
518
+ * Recursively collect type references from any NodeType.
519
+ * This handles refs, arrays, unions, intersections, and objects.
520
+ */
521
+ collectTypeReferencesFromNode(node) {
522
+ if (isRefType(node)) {
523
+ const baseName = extractBaseName(node.ref);
524
+ const namespaced = parseNamespacedType(baseName);
525
+ if (namespaced) {
526
+ this.typeTracker.trackNamespaceImport(namespaced.namespace);
527
+ this.namespaceMemberMap.set(namespaced.member, baseName);
528
+ } else if (!isBuiltinType(baseName) && !this.genericParamSymbols.has(baseName)) {
529
+ this.typeTracker.trackReferencedType(baseName);
530
+ }
531
+ if (node.genericArguments) {
532
+ for (const arg of node.genericArguments) {
533
+ if (isRefType(arg)) {
534
+ const argName = extractBaseName(arg.ref);
535
+ if (this.isTypeParamOfRef(argName, node.ref)) {
536
+ continue;
537
+ }
538
+ }
539
+ this.collectTypeReferencesFromNode(arg);
540
+ }
541
+ }
542
+ } else if (isArrayType(node)) {
543
+ this.collectTypeReferencesFromNode(node.elementType);
544
+ } else if (isOrType(node)) {
545
+ for (const variant of node.or) {
546
+ this.collectTypeReferencesFromNode(variant);
547
+ }
548
+ } else if (isAndType(node)) {
549
+ for (const part of node.and) {
550
+ this.collectTypeReferencesFromNode(part);
551
+ }
552
+ } else if (isObjectType(node)) {
553
+ if (isNamedType(node)) {
554
+ const importName = extractBaseName(node.name);
555
+ if (!this.genericParamSymbols.has(importName) && !isBuiltinType(importName)) {
556
+ this.typeTracker.trackReferencedType(importName);
557
+ }
558
+ }
559
+ for (const prop of Object.values(node.properties)) {
560
+ this.collectTypeReferencesFromNode(prop.node);
561
+ }
562
+ }
563
+ }
564
+ /**
565
+ * Check if a type name appears to be a generic type parameter of the referenced type.
566
+ * This detects cases like ref="Bar<AnyAsset>" where "AnyAsset" is Bar's type parameter,
567
+ * not a concrete type to import.
568
+ *
569
+ * @param argName - The name of the type argument being checked
570
+ * @param parentRef - The parent ref string that contains the generic usage
571
+ * @returns true if argName appears to be a type parameter in parentRef
572
+ */
573
+ isTypeParamOfRef(argName, parentRef) {
574
+ const genericMatch = parentRef.match(/<(.+)>/);
575
+ if (!genericMatch) {
576
+ return false;
577
+ }
578
+ const genericPart = genericMatch[1];
579
+ let depth = 0;
580
+ let current = "";
581
+ const params = [];
582
+ for (const char of genericPart) {
583
+ if (char === "<") {
584
+ depth++;
585
+ current += char;
586
+ } else if (char === ">") {
587
+ depth--;
588
+ current += char;
589
+ } else if (char === "," && depth === 0) {
590
+ params.push(current.trim());
591
+ current = "";
592
+ } else {
593
+ current += char;
594
+ }
595
+ }
596
+ if (current.trim()) {
597
+ params.push(current.trim());
598
+ }
599
+ return params.some(
600
+ (param) => param === argName || param.startsWith(`${argName} `)
601
+ );
602
+ }
603
+ };
604
+
605
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/type-transformer.ts
606
+ var TypeTransformer = class {
607
+ context;
608
+ constructor(context) {
609
+ this.context = context;
610
+ }
611
+ /**
612
+ * Determines if a type name should be tracked for import.
613
+ * A type should be tracked if it's not a generic parameter and not a builtin type.
614
+ * Note: PLAYER_BUILTINS (Asset, AssetWrapper, Binding, Expression) are filtered
615
+ * by isBuiltinType(), so no explicit Asset check is needed here.
616
+ */
617
+ shouldTrackTypeForImport(typeName) {
618
+ return !this.context.getGenericParamSymbols().has(typeName) && !isBuiltinType(typeName);
619
+ }
620
+ /**
621
+ * Transform an XLR type to a TypeScript type string.
622
+ * This is the core recursive transformation that adds TaggedTemplateValue support.
623
+ */
624
+ transformType(node, forParameter = false) {
625
+ if (isStringType(node)) {
626
+ if (isPrimitiveConst(node)) {
627
+ return `"${node.const}"`;
628
+ }
629
+ return forParameter ? "string | TaggedTemplateValue<string>" : "string";
630
+ }
631
+ if (isNumberType(node)) {
632
+ if (isPrimitiveConst(node)) {
633
+ return `${node.const}`;
634
+ }
635
+ return forParameter ? "number | TaggedTemplateValue<number>" : "number";
636
+ }
637
+ if (isBooleanType(node)) {
638
+ if (isPrimitiveConst(node)) {
639
+ return `${node.const}`;
640
+ }
641
+ return forParameter ? "boolean | TaggedTemplateValue<boolean>" : "boolean";
642
+ }
643
+ if (isRefType(node)) {
644
+ return this.transformRefType(node, forParameter);
645
+ }
646
+ if (isArrayType(node)) {
647
+ const elementType = this.transformType(node.elementType, forParameter);
648
+ return `Array<${elementType}>`;
649
+ }
650
+ if (isOrType(node)) {
651
+ const variants = node.or.map((v) => this.transformType(v, forParameter));
652
+ return variants.join(" | ");
653
+ }
654
+ if (isAndType(node)) {
655
+ const parts = node.and.map((p) => this.transformType(p, forParameter));
656
+ return parts.join(" & ");
657
+ }
658
+ if (isRecordType(node)) {
659
+ const keyType = this.transformType(node.keyType, false);
660
+ const valueType = this.transformType(node.valueType, forParameter);
661
+ return `Record<${keyType}, ${valueType}>`;
662
+ }
663
+ if (isObjectType(node)) {
664
+ if (isNamedType(node)) {
665
+ const typeName = this.resolveTypeName(node.name);
666
+ const inlineExtendsRef = node.extends?.ref.startsWith("AssetWrapper") ? node.extends : null;
667
+ const extendsRef = inlineExtendsRef ?? this.context.getAssetWrapperExtendsRef(node.name);
668
+ if (extendsRef) {
669
+ return this.transformAssetWrapperExtension(
670
+ typeName,
671
+ node.name,
672
+ extendsRef
673
+ );
674
+ }
675
+ return `${typeName} | FunctionalBuilder<${typeName}, BaseBuildContext> | FunctionalPartial<${typeName}, BaseBuildContext>`;
676
+ }
677
+ const inlineType = this.generateInlineObjectType(node, forParameter);
678
+ return `${inlineType} | FunctionalBuilder<${inlineType}, BaseBuildContext> | FunctionalPartial<${inlineType}, BaseBuildContext>`;
679
+ }
680
+ if (isTupleType(node)) {
681
+ const elements = node.elementTypes.map((member) => {
682
+ const elementType = this.transformType(member.type, forParameter);
683
+ return member.optional ? `${elementType}?` : elementType;
684
+ });
685
+ if (node.additionalItems) {
686
+ const restType = this.transformType(node.additionalItems, forParameter);
687
+ elements.push(`...${restType}[]`);
688
+ }
689
+ return `[${elements.join(", ")}]`;
690
+ }
691
+ if (node.type === "null") return "null";
692
+ if (node.type === "undefined") return "undefined";
693
+ if (node.type === "any") return "any";
694
+ if (node.type === "unknown") return "unknown";
695
+ if (node.type === "never") return "never";
696
+ if (node.type === "void") return "void";
697
+ return "unknown";
698
+ }
699
+ /**
700
+ * Transform a type for use in generic constraints and defaults.
701
+ * Unlike transformType(), this returns raw type names without FunctionalBuilder unions,
702
+ * since constraints define type bounds, not parameter types that accept builders.
703
+ *
704
+ * @param node - The type node to transform
705
+ * @returns The raw TypeScript type string
706
+ */
707
+ transformTypeForConstraint(node) {
708
+ if (isRefType(node)) {
709
+ const baseName = extractBaseName(node.ref);
710
+ const namespaced = parseNamespacedType(baseName);
711
+ if (namespaced) {
712
+ this.context.trackNamespaceImport(namespaced.namespace);
713
+ this.context.getNamespaceMemberMap().set(namespaced.member, baseName);
714
+ } else if (baseName === "Asset" || node.ref.startsWith("Asset<")) {
715
+ this.context.setNeedsAssetImport(true);
716
+ } else if (this.shouldTrackTypeForImport(baseName)) {
717
+ this.context.trackReferencedType(baseName);
718
+ }
719
+ const resolvedName = this.resolveTypeName(baseName);
720
+ if (node.genericArguments && node.genericArguments.length > 0) {
721
+ const args = node.genericArguments.map(
722
+ (a) => this.transformTypeForConstraint(a)
723
+ );
724
+ return `${resolvedName}<${args.join(", ")}>`;
725
+ }
726
+ if (node.ref.includes("<")) {
727
+ return this.resolveTypeName(extractBaseName(node.ref)) + node.ref.substring(node.ref.indexOf("<"));
728
+ }
729
+ return resolvedName;
730
+ }
731
+ if (isObjectType(node) && isNamedType(node)) {
732
+ if (node.name === "Asset") {
733
+ this.context.setNeedsAssetImport(true);
734
+ } else if (this.shouldTrackTypeForImport(node.name)) {
735
+ this.context.trackReferencedType(node.name);
736
+ }
737
+ return this.resolveTypeName(node.name);
738
+ }
739
+ if (isArrayType(node)) {
740
+ const elementType = this.transformTypeForConstraint(node.elementType);
741
+ return `Array<${elementType}>`;
742
+ }
743
+ if (isOrType(node)) {
744
+ const variants = node.or.map((v) => this.transformTypeForConstraint(v));
745
+ return variants.join(" | ");
746
+ }
747
+ if (isAndType(node)) {
748
+ const parts = node.and.map((p) => this.transformTypeForConstraint(p));
749
+ return parts.join(" & ");
750
+ }
751
+ if (isTupleType(node)) {
752
+ const elements = node.elementTypes.map((member) => {
753
+ const elementType = this.transformTypeForConstraint(member.type);
754
+ return member.optional ? `${elementType}?` : elementType;
755
+ });
756
+ if (node.additionalItems) {
757
+ const restType = this.transformTypeForConstraint(node.additionalItems);
758
+ elements.push(`...${restType}[]`);
759
+ }
760
+ return `[${elements.join(", ")}]`;
761
+ }
762
+ return this.transformType(node, false);
763
+ }
764
+ /**
765
+ * Transform a reference type to TypeScript.
766
+ */
767
+ transformRefType(node, forParameter) {
768
+ const ref = node.ref;
769
+ if (ref.startsWith("AssetWrapper")) {
770
+ this.context.setNeedsAssetImport(true);
771
+ let innerType = "Asset";
772
+ let isIntersectionType = false;
773
+ if (node.genericArguments && node.genericArguments.length > 0) {
774
+ const genericArg = node.genericArguments[0];
775
+ const argType = this.transformTypeForConstraint(genericArg);
776
+ innerType = this.context.getGenericParamSymbols().has(argType) ? "Asset" : argType;
777
+ isIntersectionType = isAndType(genericArg);
778
+ } else if (ref.includes("<")) {
779
+ const match = ref.match(/AssetWrapper<(.+)>/);
780
+ if (match) {
781
+ const extractedType = match[1].trim();
782
+ if (extractedType.includes(" & ")) {
783
+ isIntersectionType = true;
784
+ innerType = extractedType;
785
+ const parts = extractedType.split(" & ").map((p) => p.trim());
786
+ for (const part of parts) {
787
+ const partName = extractBaseName(part);
788
+ if (this.shouldTrackTypeForImport(partName)) {
789
+ this.context.trackReferencedType(partName);
790
+ }
791
+ }
792
+ } else {
793
+ const baseName2 = extractBaseName(extractedType);
794
+ innerType = this.context.getGenericParamSymbols().has(baseName2) ? "Asset" : baseName2;
795
+ }
796
+ }
797
+ }
798
+ if (!isIntersectionType && this.shouldTrackTypeForImport(innerType)) {
799
+ this.context.trackReferencedType(innerType);
800
+ }
801
+ return `${innerType} | FunctionalBuilder<${innerType}, BaseBuildContext>`;
802
+ }
803
+ if (ref === "Expression") {
804
+ return forParameter ? "string | TaggedTemplateValue<string>" : "string";
805
+ }
806
+ if (ref === "Binding") {
807
+ return forParameter ? "string | TaggedTemplateValue<string>" : "string";
808
+ }
809
+ if (ref === "Asset" || ref.startsWith("Asset<")) {
810
+ this.context.setNeedsAssetImport(true);
811
+ return "Asset";
812
+ }
813
+ {
814
+ const refBaseName = extractBaseName(ref);
815
+ const extendsRef = this.context.getAssetWrapperExtendsRef(refBaseName);
816
+ if (extendsRef) {
817
+ return this.transformAssetWrapperExtension(
818
+ this.resolveTypeName(refBaseName),
819
+ refBaseName,
820
+ extendsRef
821
+ );
822
+ }
823
+ }
824
+ const baseName = extractBaseName(ref);
825
+ const resolvedName = this.resolveTypeName(baseName);
826
+ if (node.genericArguments && node.genericArguments.length > 0) {
827
+ const args = node.genericArguments.map(
828
+ (a) => this.transformType(a, forParameter)
829
+ );
830
+ const fullType = `${resolvedName}<${args.join(", ")}>`;
831
+ return `${fullType} | FunctionalBuilder<${fullType}, BaseBuildContext> | FunctionalPartial<${fullType}, BaseBuildContext>`;
832
+ }
833
+ if (ref.includes("<")) {
834
+ const resolvedRef = this.resolveTypeName(extractBaseName(ref)) + ref.substring(ref.indexOf("<"));
835
+ return `${resolvedRef} | FunctionalBuilder<${resolvedRef}, BaseBuildContext> | FunctionalPartial<${resolvedRef}, BaseBuildContext>`;
836
+ }
837
+ return `${resolvedName} | FunctionalBuilder<${resolvedName}, BaseBuildContext> | FunctionalPartial<${resolvedName}, BaseBuildContext>`;
838
+ }
839
+ /**
840
+ * Transform a type that extends AssetWrapper into a combined union.
841
+ * Produces: InnerType | FunctionalBuilder<InnerType> | TypeName | FunctionalBuilder<TypeName> | FunctionalPartial<TypeName>
842
+ */
843
+ transformAssetWrapperExtension(resolvedTypeName, rawTypeName, extendsRef) {
844
+ this.context.setNeedsAssetImport(true);
845
+ let innerType = "Asset";
846
+ if (extendsRef.genericArguments && extendsRef.genericArguments.length > 0) {
847
+ const genericArg = extendsRef.genericArguments[0];
848
+ const argType = this.transformTypeForConstraint(genericArg);
849
+ innerType = this.context.getGenericParamSymbols().has(argType) ? "Asset" : argType;
850
+ } else if (extendsRef.ref.includes("<")) {
851
+ const match = extendsRef.ref.match(/AssetWrapper<(.+)>/);
852
+ if (match) {
853
+ const extracted = extractBaseName(match[1].trim());
854
+ innerType = this.context.getGenericParamSymbols().has(extracted) ? "Asset" : extracted;
855
+ }
856
+ }
857
+ if (innerType !== "Asset" && this.shouldTrackTypeForImport(innerType)) {
858
+ this.context.trackReferencedType(innerType);
859
+ }
860
+ if (this.shouldTrackTypeForImport(rawTypeName)) {
861
+ this.context.trackReferencedType(rawTypeName);
862
+ }
863
+ return `${innerType} | FunctionalBuilder<${innerType}, BaseBuildContext> | ${resolvedTypeName} | FunctionalBuilder<${resolvedTypeName}, BaseBuildContext> | FunctionalPartial<${resolvedTypeName}, BaseBuildContext>`;
864
+ }
865
+ /**
866
+ * Generate an inline object type for anonymous objects.
867
+ */
868
+ generateInlineObjectType(node, forParameter) {
869
+ const props = Object.entries(node.properties).map(([propName, prop]) => {
870
+ const propType = this.transformType(prop.node, forParameter);
871
+ const optional = prop.required ? "" : "?";
872
+ const quotedName = this.needsQuoting(propName) ? `"${propName}"` : propName;
873
+ return `${quotedName}${optional}: ${propType}`;
874
+ }).join("; ");
875
+ return `{ ${props} }`;
876
+ }
877
+ /**
878
+ * Check if a property name needs to be quoted in TypeScript.
879
+ * Property names with special characters like hyphens must be quoted.
880
+ */
881
+ needsQuoting(name) {
882
+ return !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name);
883
+ }
884
+ /**
885
+ * Get the full qualified name for a type if it's a namespace member.
886
+ * For example, "CrossfieldReference" -> "Validation.CrossfieldReference"
887
+ * if we've seen "Validation.CrossfieldReference" in the source.
888
+ * Returns the original name if no namespace mapping exists.
889
+ */
890
+ resolveTypeName(typeName) {
891
+ return this.context.getNamespaceMemberMap().get(typeName) ?? typeName;
892
+ }
893
+ };
894
+
895
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/import-generator.ts
896
+ import path2 from "path";
897
+
898
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/type-resolver.ts
899
+ import ts2 from "typescript";
900
+ import path from "path";
901
+
902
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/ts-morph-type-finder.ts
903
+ import { Project, ts } from "ts-morph";
904
+ import { existsSync } from "fs";
905
+ import { dirname, resolve } from "path";
906
+ var TsMorphTypeDefinitionFinder = class {
907
+ project;
908
+ typeLocationCache = /* @__PURE__ */ new Map();
909
+ unexportedTypes = /* @__PURE__ */ new Map();
910
+ /**
911
+ * Finds the source file for a type by searching the codebase.
912
+ * Recursively follows imports to find where a type is actually defined.
913
+ * Supports both relative imports and node_modules packages.
914
+ *
915
+ * @param typeName - The name of the type to find
916
+ * @param startingFile - The file to start searching from
917
+ * @returns The path to the file containing the type definition, or null if not found
918
+ */
919
+ findTypeSourceFile(typeName, startingFile) {
920
+ if (!typeName || !startingFile) return null;
921
+ const cacheKey = `${typeName}:${startingFile}`;
922
+ if (this.typeLocationCache.has(cacheKey)) {
923
+ return this.typeLocationCache.get(cacheKey) || null;
924
+ }
925
+ try {
926
+ if (!this.project) {
927
+ this.project = new Project({
928
+ useInMemoryFileSystem: false,
929
+ // Enable module resolution for node_modules support
930
+ skipFileDependencyResolution: false,
931
+ compilerOptions: {
932
+ moduleResolution: ts.ModuleResolutionKind.Node16,
933
+ resolveJsonModule: true
934
+ }
935
+ });
936
+ }
937
+ const visitedFiles = /* @__PURE__ */ new Set();
938
+ const result = this.searchForType(typeName, startingFile, visitedFiles);
939
+ this.typeLocationCache.set(cacheKey, result);
940
+ return result;
941
+ } catch {
942
+ this.typeLocationCache.set(cacheKey, null);
943
+ return null;
944
+ }
945
+ }
946
+ /**
947
+ * Recursively searches for a type definition through imports.
948
+ * Handles both relative imports and node_modules packages.
949
+ */
950
+ searchForType(typeName, filePath, visitedFiles) {
951
+ if (!existsSync(filePath) || visitedFiles.has(filePath)) return null;
952
+ visitedFiles.add(filePath);
953
+ try {
954
+ const sourceFile = this.project.addSourceFileAtPath(filePath);
955
+ if (this.fileDefinesType(sourceFile, typeName)) {
956
+ return filePath;
957
+ }
958
+ const typeCheck = this.fileHasTypeDeclaration(sourceFile, typeName);
959
+ if (typeCheck.found && !typeCheck.exported) {
960
+ this.trackUnexportedType(typeName, typeCheck.filePath);
961
+ }
962
+ for (const importDecl of sourceFile.getImportDeclarations()) {
963
+ const moduleSpecifier = importDecl.getModuleSpecifierValue();
964
+ const importedType = this.getImportedTypeFromDeclaration(
965
+ importDecl,
966
+ typeName
967
+ );
968
+ if (importedType) {
969
+ const resolvedSourceFile = importDecl.getModuleSpecifierSourceFile();
970
+ if (resolvedSourceFile) {
971
+ const resolvedPath = resolvedSourceFile.getFilePath();
972
+ if (this.fileDefinesType(resolvedSourceFile, typeName)) {
973
+ return resolvedPath;
974
+ }
975
+ const deeperResult = this.searchForType(
976
+ typeName,
977
+ resolvedPath,
978
+ visitedFiles
979
+ );
980
+ if (deeperResult) return deeperResult;
981
+ return resolvedPath;
982
+ }
983
+ if (moduleSpecifier.startsWith(".")) {
984
+ const resolvedPath = this.resolveImportPath(
985
+ filePath,
986
+ moduleSpecifier
987
+ );
988
+ if (resolvedPath) {
989
+ const result = this.searchForType(
990
+ typeName,
991
+ resolvedPath,
992
+ visitedFiles
993
+ );
994
+ if (result) return result;
995
+ }
996
+ }
997
+ }
998
+ if (moduleSpecifier.startsWith(".")) {
999
+ const resolvedPath = this.resolveImportPath(
1000
+ filePath,
1001
+ moduleSpecifier
1002
+ );
1003
+ if (resolvedPath) {
1004
+ const result = this.searchForType(
1005
+ typeName,
1006
+ resolvedPath,
1007
+ visitedFiles
1008
+ );
1009
+ if (result) return result;
1010
+ }
1011
+ }
1012
+ }
1013
+ return null;
1014
+ } catch {
1015
+ return null;
1016
+ }
1017
+ }
1018
+ /**
1019
+ * Checks if an import declaration imports a specific type.
1020
+ * Handles named imports, default imports, and namespace imports.
1021
+ */
1022
+ getImportedTypeFromDeclaration(importDecl, typeName) {
1023
+ for (const namedImport of importDecl.getNamedImports()) {
1024
+ const name = namedImport.getAliasNode()?.getText() || namedImport.getName();
1025
+ if (name === typeName) return true;
1026
+ }
1027
+ const defaultImport = importDecl.getDefaultImport();
1028
+ if (defaultImport?.getText() === typeName) return true;
1029
+ const namespaceImport = importDecl.getNamespaceImport();
1030
+ if (namespaceImport?.getText() === typeName) return true;
1031
+ return false;
1032
+ }
1033
+ /**
1034
+ * Checks if a source file defines and exports a specific type.
1035
+ * Handles interfaces, type aliases, classes, and re-exported types.
1036
+ * Only returns true if the type is publicly exported.
1037
+ */
1038
+ fileDefinesType(sourceFile, typeName) {
1039
+ for (const decl of [
1040
+ ...sourceFile.getInterfaces(),
1041
+ ...sourceFile.getTypeAliases(),
1042
+ ...sourceFile.getClasses()
1043
+ ]) {
1044
+ if (decl.getName() === typeName && decl.isExported()) {
1045
+ return true;
1046
+ }
1047
+ }
1048
+ for (const exportDecl of sourceFile.getExportDeclarations()) {
1049
+ for (const namedExport of exportDecl.getNamedExports()) {
1050
+ if (namedExport.getName() === typeName) return true;
1051
+ }
1052
+ }
1053
+ return false;
1054
+ }
1055
+ /**
1056
+ * Resolves a relative import path to an actual file path.
1057
+ * Handles TypeScript extensions and index files.
1058
+ */
1059
+ resolveImportPath(fromFile, importPath) {
1060
+ const dir = dirname(fromFile);
1061
+ const extensions = [".ts", ".tsx", ".d.ts"];
1062
+ for (const ext of extensions) {
1063
+ const fullPath = resolve(dir, `${importPath}${ext}`);
1064
+ if (existsSync(fullPath)) return fullPath;
1065
+ }
1066
+ for (const ext of extensions) {
1067
+ const fullPath = resolve(dir, `${importPath}/index${ext}`);
1068
+ if (existsSync(fullPath)) return fullPath;
1069
+ }
1070
+ if (importPath.endsWith(".js")) {
1071
+ const tsPath = resolve(dir, importPath.replace(/\.js$/, ".ts"));
1072
+ if (existsSync(tsPath)) return tsPath;
1073
+ const dtsPath = resolve(dir, importPath.replace(/\.js$/, ".d.ts"));
1074
+ if (existsSync(dtsPath)) return dtsPath;
1075
+ }
1076
+ return null;
1077
+ }
1078
+ /**
1079
+ * Get all types that were found to exist but are not exported.
1080
+ * Call this after searching to get the list of types that need to be exported.
1081
+ */
1082
+ getUnexportedTypes() {
1083
+ return Array.from(this.unexportedTypes.entries()).map(
1084
+ ([typeName, filePath]) => ({
1085
+ typeName,
1086
+ filePath
1087
+ })
1088
+ );
1089
+ }
1090
+ /**
1091
+ * Check if a file declares a type (regardless of export status).
1092
+ * Used internally to track unexported types.
1093
+ */
1094
+ fileHasTypeDeclaration(sourceFile, typeName) {
1095
+ const filePath = sourceFile.getFilePath();
1096
+ for (const decl of [
1097
+ ...sourceFile.getInterfaces(),
1098
+ ...sourceFile.getTypeAliases(),
1099
+ ...sourceFile.getClasses()
1100
+ ]) {
1101
+ if (decl.getName() === typeName) {
1102
+ return {
1103
+ found: true,
1104
+ exported: decl.isExported(),
1105
+ filePath
1106
+ };
1107
+ }
1108
+ }
1109
+ return { found: false, exported: false, filePath };
1110
+ }
1111
+ /**
1112
+ * Track an unexported type for later reporting.
1113
+ */
1114
+ trackUnexportedType(typeName, filePath) {
1115
+ if (!this.unexportedTypes.has(typeName)) {
1116
+ this.unexportedTypes.set(typeName, filePath);
1117
+ }
1118
+ }
1119
+ /**
1120
+ * Disposes of internal resources and clears caches.
1121
+ * Should be called when the finder is no longer needed.
1122
+ */
1123
+ dispose() {
1124
+ this.typeLocationCache.clear();
1125
+ this.unexportedTypes.clear();
1126
+ this.project = void 0;
1127
+ }
1128
+ };
1129
+
1130
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/type-resolver.ts
1131
+ function isBuiltInDeclarationPath(filePath) {
1132
+ if (filePath.includes("/typescript/lib/lib.")) return true;
1133
+ if (filePath.includes("/@types/node/")) return true;
1134
+ return false;
1135
+ }
1136
+ function isDeclarationExported(node, typescript) {
1137
+ const modifiers = typescript.canHaveModifiers(node) ? typescript.getModifiers(node) : void 0;
1138
+ if (modifiers) {
1139
+ for (const modifier of modifiers) {
1140
+ if (modifier.kind === typescript.SyntaxKind.ExportKeyword) {
1141
+ return true;
1142
+ }
1143
+ }
1144
+ }
1145
+ const parent = node.parent;
1146
+ if (parent && typescript.isExportDeclaration(parent)) {
1147
+ return true;
1148
+ }
1149
+ return false;
1150
+ }
1151
+ function createTypeScriptResolver(tsContext) {
1152
+ const { program, sourceFile, outputDir } = tsContext;
1153
+ const typeChecker = program.getTypeChecker();
1154
+ const finder = new TsMorphTypeDefinitionFinder();
1155
+ const resolvedCache = /* @__PURE__ */ new Map();
1156
+ const unexportedTypes = [];
1157
+ function resolveTypePath(typeName) {
1158
+ if (resolvedCache.has(typeName)) {
1159
+ return resolvedCache.get(typeName);
1160
+ }
1161
+ const typeFilePath = finder.findTypeSourceFile(
1162
+ typeName,
1163
+ sourceFile.fileName
1164
+ );
1165
+ if (typeFilePath) {
1166
+ if (typeFilePath === sourceFile.fileName) {
1167
+ resolvedCache.set(typeName, "sameFile");
1168
+ return "sameFile";
1169
+ }
1170
+ if (isBuiltInDeclarationPath(typeFilePath)) {
1171
+ resolvedCache.set(typeName, "sameFile");
1172
+ return "sameFile";
1173
+ }
1174
+ if (typeFilePath.includes("node_modules")) {
1175
+ const nodeModulesIdx = typeFilePath.lastIndexOf("node_modules/");
1176
+ const afterNodeModules = typeFilePath.slice(
1177
+ nodeModulesIdx + "node_modules/".length
1178
+ );
1179
+ let packageName;
1180
+ if (afterNodeModules.startsWith("@")) {
1181
+ const parts = afterNodeModules.split("/");
1182
+ packageName = `${parts[0]}/${parts[1]}`;
1183
+ } else {
1184
+ packageName = afterNodeModules.split("/")[0];
1185
+ }
1186
+ resolvedCache.set(typeName, packageName);
1187
+ return packageName;
1188
+ }
1189
+ let relativePath2 = path.relative(outputDir, typeFilePath);
1190
+ relativePath2 = relativePath2.replace(/\.tsx?$/, ".js");
1191
+ if (!relativePath2.startsWith(".")) {
1192
+ relativePath2 = "./" + relativePath2;
1193
+ }
1194
+ resolvedCache.set(typeName, relativePath2);
1195
+ return relativePath2;
1196
+ }
1197
+ const symbols = typeChecker.getSymbolsInScope(
1198
+ sourceFile,
1199
+ ts2.SymbolFlags.Type | ts2.SymbolFlags.Interface | ts2.SymbolFlags.TypeAlias
1200
+ );
1201
+ const matchingSymbols = symbols.filter((s) => s.getName() === typeName);
1202
+ let symbol;
1203
+ let validDeclaration;
1204
+ let unexportedDeclarationFile;
1205
+ for (const s of matchingSymbols) {
1206
+ const declarations = s.getDeclarations();
1207
+ if (declarations && declarations.length > 0) {
1208
+ const decl = declarations[0];
1209
+ const declFile = decl.getSourceFile().fileName;
1210
+ if (isBuiltInDeclarationPath(declFile)) {
1211
+ continue;
1212
+ }
1213
+ const isFromNodeModules = declFile.includes("node_modules");
1214
+ const isExported = isFromNodeModules || isDeclarationExported(decl, ts2);
1215
+ if (isExported) {
1216
+ symbol = s;
1217
+ validDeclaration = decl;
1218
+ break;
1219
+ } else {
1220
+ unexportedDeclarationFile = declFile;
1221
+ }
1222
+ }
1223
+ }
1224
+ if (!symbol || !validDeclaration) {
1225
+ if (unexportedDeclarationFile) {
1226
+ const alreadyTracked = unexportedTypes.some(
1227
+ (t) => t.typeName === typeName && t.filePath === unexportedDeclarationFile
1228
+ );
1229
+ if (!alreadyTracked) {
1230
+ unexportedTypes.push({
1231
+ typeName,
1232
+ filePath: unexportedDeclarationFile
1233
+ });
1234
+ }
1235
+ resolvedCache.set(typeName, "sameFile");
1236
+ return "sameFile";
1237
+ }
1238
+ resolvedCache.set(typeName, "notFound");
1239
+ return "notFound";
1240
+ }
1241
+ const declSourceFile = validDeclaration.getSourceFile();
1242
+ const declFilePath = declSourceFile.fileName;
1243
+ if (declFilePath === sourceFile.fileName) {
1244
+ resolvedCache.set(typeName, "sameFile");
1245
+ return "sameFile";
1246
+ }
1247
+ if (declFilePath.includes("node_modules")) {
1248
+ const nodeModulesIdx = declFilePath.lastIndexOf("node_modules/");
1249
+ const afterNodeModules = declFilePath.slice(
1250
+ nodeModulesIdx + "node_modules/".length
1251
+ );
1252
+ let packageName;
1253
+ if (afterNodeModules.startsWith("@")) {
1254
+ const parts = afterNodeModules.split("/");
1255
+ packageName = `${parts[0]}/${parts[1]}`;
1256
+ } else {
1257
+ packageName = afterNodeModules.split("/")[0];
1258
+ }
1259
+ resolvedCache.set(typeName, packageName);
1260
+ return packageName;
1261
+ }
1262
+ let relativePath = path.relative(outputDir, declFilePath);
1263
+ relativePath = relativePath.replace(/\.tsx?$/, ".js");
1264
+ if (!relativePath.startsWith(".")) {
1265
+ relativePath = "./" + relativePath;
1266
+ }
1267
+ resolvedCache.set(typeName, relativePath);
1268
+ return relativePath;
1269
+ }
1270
+ function getUnexportedTypes() {
1271
+ return [...unexportedTypes];
1272
+ }
1273
+ return { resolveTypePath, getUnexportedTypes };
1274
+ }
1275
+
1276
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/import-generator.ts
1277
+ var ImportGenerator = class {
1278
+ config;
1279
+ /** Track all type references that need to be imported, grouped by source file */
1280
+ referencedTypesBySource = /* @__PURE__ */ new Map();
1281
+ /** Track types that should be imported from the main type's source file */
1282
+ referencedTypes = /* @__PURE__ */ new Set();
1283
+ /** Track whether Asset type is needed for imports */
1284
+ needsAssetImport = false;
1285
+ /** Track generic parameter symbols (e.g., T, U) that should not be imported */
1286
+ genericParamSymbols = /* @__PURE__ */ new Set();
1287
+ /** TypeScript resolver for automatic import path resolution */
1288
+ tsResolver;
1289
+ /** Track types that couldn't be resolved - will cause errors if used */
1290
+ unresolvedTypes = /* @__PURE__ */ new Set();
1291
+ /** Track namespaces that need to be imported (e.g., "Validation" from @player-ui/types) */
1292
+ namespaceImports = /* @__PURE__ */ new Set();
1293
+ /** Map short type names to their full qualified names (e.g., "CrossfieldReference" -> "Validation.CrossfieldReference") */
1294
+ namespaceMemberMap = /* @__PURE__ */ new Map();
1295
+ /** Effective sameFileTypes - computed from tsContext or provided directly */
1296
+ effectiveSameFileTypes;
1297
+ constructor(config = {}) {
1298
+ this.config = config;
1299
+ if (config.tsContext) {
1300
+ this.tsResolver = createTypeScriptResolver(config.tsContext);
1301
+ }
1302
+ this.effectiveSameFileTypes = config.sameFileTypes;
1303
+ }
1304
+ // TypeTransformContext implementation
1305
+ setNeedsAssetImport(value) {
1306
+ this.needsAssetImport = value;
1307
+ }
1308
+ getNeedsAssetImport() {
1309
+ return this.needsAssetImport;
1310
+ }
1311
+ getNamespaceMemberMap() {
1312
+ return this.namespaceMemberMap;
1313
+ }
1314
+ getGenericParamSymbols() {
1315
+ return this.genericParamSymbols;
1316
+ }
1317
+ getAssetWrapperExtendsRef(typeName) {
1318
+ const registry = this.config.typeRegistry;
1319
+ if (!registry) return void 0;
1320
+ return getAssetWrapperExtendsRefByName(typeName, registry);
1321
+ }
1322
+ /**
1323
+ * Get list of types that exist but need to be exported.
1324
+ */
1325
+ getUnexportedTypes() {
1326
+ return this.tsResolver?.getUnexportedTypes() ?? [];
1327
+ }
1328
+ /**
1329
+ * Get list of types that couldn't be resolved at all.
1330
+ */
1331
+ getUnresolvedTypes() {
1332
+ return Array.from(this.unresolvedTypes);
1333
+ }
1334
+ /**
1335
+ * Track a referenced type for import generation.
1336
+ */
1337
+ trackReferencedType(typeName) {
1338
+ const { externalTypes, typeImportPathGenerator } = this.config;
1339
+ const importName = extractBaseName(typeName);
1340
+ if (PLAYER_BUILTINS.has(importName)) {
1341
+ return;
1342
+ }
1343
+ const namespaced = parseNamespacedType(importName);
1344
+ if (namespaced) {
1345
+ const namespaceName = namespaced.namespace;
1346
+ if (externalTypes?.has(namespaceName)) {
1347
+ const packageName = externalTypes.get(namespaceName);
1348
+ if (!this.referencedTypesBySource.has(packageName)) {
1349
+ this.referencedTypesBySource.set(packageName, /* @__PURE__ */ new Set());
1350
+ }
1351
+ this.referencedTypesBySource.get(packageName).add(namespaceName);
1352
+ return;
1353
+ }
1354
+ const typesImportPath = this.config.typesImportPath ?? "@player-ui/types";
1355
+ if (!this.referencedTypesBySource.has(typesImportPath)) {
1356
+ this.referencedTypesBySource.set(typesImportPath, /* @__PURE__ */ new Set());
1357
+ }
1358
+ this.referencedTypesBySource.get(typesImportPath).add(namespaceName);
1359
+ return;
1360
+ }
1361
+ if (externalTypes?.has(importName)) {
1362
+ const packageName = externalTypes.get(importName);
1363
+ if (!this.referencedTypesBySource.has(packageName)) {
1364
+ this.referencedTypesBySource.set(packageName, /* @__PURE__ */ new Set());
1365
+ }
1366
+ this.referencedTypesBySource.get(packageName).add(importName);
1367
+ return;
1368
+ }
1369
+ if (this.tsResolver) {
1370
+ const result = this.tsResolver.resolveTypePath(importName);
1371
+ if (result === "notFound") {
1372
+ this.unresolvedTypes.add(importName);
1373
+ return;
1374
+ }
1375
+ if (result === "sameFile") {
1376
+ this.referencedTypes.add(importName);
1377
+ } else {
1378
+ if (!this.referencedTypesBySource.has(result)) {
1379
+ this.referencedTypesBySource.set(result, /* @__PURE__ */ new Set());
1380
+ }
1381
+ this.referencedTypesBySource.get(result).add(importName);
1382
+ }
1383
+ return;
1384
+ }
1385
+ const sameFileTypes = this.effectiveSameFileTypes;
1386
+ if (sameFileTypes) {
1387
+ if (sameFileTypes.has(importName)) {
1388
+ this.referencedTypes.add(importName);
1389
+ } else if (typeImportPathGenerator) {
1390
+ const importPath = typeImportPathGenerator(importName);
1391
+ if (importPath) {
1392
+ if (!this.referencedTypesBySource.has(importPath)) {
1393
+ this.referencedTypesBySource.set(importPath, /* @__PURE__ */ new Set());
1394
+ }
1395
+ this.referencedTypesBySource.get(importPath).add(importName);
1396
+ }
1397
+ } else {
1398
+ this.referencedTypes.add(importName);
1399
+ }
1400
+ } else {
1401
+ this.referencedTypes.add(importName);
1402
+ }
1403
+ }
1404
+ /**
1405
+ * Track a namespace that needs to be imported.
1406
+ */
1407
+ trackNamespaceImport(namespaceName) {
1408
+ this.namespaceImports.add(namespaceName);
1409
+ if (this.tsResolver) {
1410
+ const result = this.tsResolver.resolveTypePath(namespaceName);
1411
+ if (result === "sameFile") {
1412
+ this.referencedTypes.add(namespaceName);
1413
+ } else if (result !== "notFound") {
1414
+ if (!this.referencedTypesBySource.has(result)) {
1415
+ this.referencedTypesBySource.set(result, /* @__PURE__ */ new Set());
1416
+ }
1417
+ this.referencedTypesBySource.get(result).add(namespaceName);
1418
+ } else {
1419
+ this.unresolvedTypes.add(namespaceName);
1420
+ }
1421
+ return;
1422
+ }
1423
+ const { externalTypes, typeImportPathGenerator } = this.config;
1424
+ if (externalTypes?.has(namespaceName)) {
1425
+ const packageName = externalTypes.get(namespaceName);
1426
+ if (!this.referencedTypesBySource.has(packageName)) {
1427
+ this.referencedTypesBySource.set(packageName, /* @__PURE__ */ new Set());
1428
+ }
1429
+ this.referencedTypesBySource.get(packageName).add(namespaceName);
1430
+ return;
1431
+ }
1432
+ if (typeImportPathGenerator) {
1433
+ const importPath = typeImportPathGenerator(namespaceName);
1434
+ if (importPath) {
1435
+ if (!this.referencedTypesBySource.has(importPath)) {
1436
+ this.referencedTypesBySource.set(importPath, /* @__PURE__ */ new Set());
1437
+ }
1438
+ this.referencedTypesBySource.get(importPath).add(namespaceName);
1439
+ return;
1440
+ }
1441
+ }
1442
+ this.referencedTypes.add(namespaceName);
1443
+ }
1444
+ /**
1445
+ * Generate import statements.
1446
+ */
1447
+ generateImports(mainTypeName) {
1448
+ let typeImportPath;
1449
+ if (this.config.tsContext) {
1450
+ const { sourceFile, outputDir } = this.config.tsContext;
1451
+ let relativePath = path2.relative(outputDir, sourceFile.fileName);
1452
+ relativePath = relativePath.replace(/\.tsx?$/, ".js");
1453
+ if (!relativePath.startsWith(".")) {
1454
+ relativePath = "./" + relativePath;
1455
+ }
1456
+ typeImportPath = relativePath;
1457
+ } else if (this.config.typeImportPathGenerator) {
1458
+ typeImportPath = this.config.typeImportPathGenerator(mainTypeName);
1459
+ } else {
1460
+ typeImportPath = `../types/${this.getTypeFileName(mainTypeName)}`;
1461
+ }
1462
+ const typesToImport = /* @__PURE__ */ new Set([mainTypeName]);
1463
+ Array.from(this.referencedTypes).forEach((name) => {
1464
+ typesToImport.add(name);
1465
+ });
1466
+ const typesImportPath = this.config.typesImportPath ?? "@player-ui/types";
1467
+ const functionalImportPath = this.config.functionalImportPath ?? "@player-lang/functional-dsl";
1468
+ const lines = [];
1469
+ const typeImportStatement = `import type { ${Array.from(typesToImport).join(", ")} } from "${typeImportPath}";`;
1470
+ lines.push(typeImportStatement);
1471
+ for (const [importPath, types] of this.referencedTypesBySource) {
1472
+ const typeNames = Array.from(types).join(", ");
1473
+ lines.push(`import type { ${typeNames} } from "${importPath}";`);
1474
+ }
1475
+ if (this.needsAssetImport) {
1476
+ lines.push(`import type { Asset } from "${typesImportPath}";`);
1477
+ }
1478
+ lines.push(
1479
+ `import { type FunctionalBuilder, type BaseBuildContext, type FunctionalPartial, FunctionalBuilderBase, createInspectMethod, type TaggedTemplateValue } from "${functionalImportPath}";`
1480
+ );
1481
+ return lines.join("\n");
1482
+ }
1483
+ getTypeFileName(typeName) {
1484
+ return typeName.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "").replace(/asset$/, "");
1485
+ }
1486
+ };
1487
+
1488
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/default-value-generator.ts
1489
+ var DEFAULT_CONFIG = {
1490
+ maxDepth: 3,
1491
+ skipTypes: /* @__PURE__ */ new Set(["Asset", "AssetWrapper"])
1492
+ };
1493
+ var DefaultValueGenerator = class {
1494
+ config;
1495
+ constructor(config = {}) {
1496
+ this.config = {
1497
+ ...DEFAULT_CONFIG,
1498
+ ...config,
1499
+ skipTypes: config.skipTypes ?? DEFAULT_CONFIG.skipTypes
1500
+ };
1501
+ }
1502
+ /**
1503
+ * Generate default values for an ObjectType.
1504
+ *
1505
+ * @param objectType - The XLR ObjectType to generate defaults for
1506
+ * @param assetType - Optional asset type string for Asset types
1507
+ * @returns Record of property names to default values
1508
+ */
1509
+ generateDefaults(objectType, assetType) {
1510
+ const defaults = {};
1511
+ if (assetType) {
1512
+ defaults["type"] = assetType;
1513
+ }
1514
+ if (objectType.extends?.ref.startsWith("Asset")) {
1515
+ defaults["id"] = "";
1516
+ } else if ("id" in objectType.properties) {
1517
+ defaults["id"] = "";
1518
+ }
1519
+ const context = {
1520
+ depth: 0,
1521
+ config: this.config
1522
+ };
1523
+ for (const [propName, prop] of Object.entries(objectType.properties)) {
1524
+ if (isPrimitiveConst(prop.node)) {
1525
+ defaults[propName] = prop.node.const;
1526
+ continue;
1527
+ }
1528
+ if (!prop.required) {
1529
+ continue;
1530
+ }
1531
+ if (propName in defaults) {
1532
+ continue;
1533
+ }
1534
+ const defaultValue = this.getDefaultForType(prop.node, context);
1535
+ if (defaultValue !== void 0) {
1536
+ defaults[propName] = defaultValue;
1537
+ }
1538
+ }
1539
+ return defaults;
1540
+ }
1541
+ /**
1542
+ * Get the default value for a specific type node.
1543
+ *
1544
+ * @param node - The type node
1545
+ * @param context - Generation context for tracking depth
1546
+ * @returns The default value, or undefined if the type should be skipped
1547
+ */
1548
+ getDefaultForType(node, context) {
1549
+ if (isAssetWrapperRef(node)) {
1550
+ return void 0;
1551
+ }
1552
+ if (isRefType(node)) {
1553
+ const baseName = node.ref.split("<")[0];
1554
+ if (context.config.skipTypes.has(baseName)) {
1555
+ return void 0;
1556
+ }
1557
+ }
1558
+ if (isStringType(node)) {
1559
+ return "";
1560
+ }
1561
+ if (isNumberType(node)) {
1562
+ return 0;
1563
+ }
1564
+ if (isBooleanType(node)) {
1565
+ return false;
1566
+ }
1567
+ if (isExpressionRef(node) || isBindingRef(node)) {
1568
+ return "";
1569
+ }
1570
+ if (isArrayType(node)) {
1571
+ return [];
1572
+ }
1573
+ if (isOrType(node)) {
1574
+ return this.getDefaultForUnion(node.or, context);
1575
+ }
1576
+ if (isAndType(node)) {
1577
+ return this.getDefaultForIntersection(node.and, context);
1578
+ }
1579
+ if (isObjectType(node)) {
1580
+ if (context.depth >= context.config.maxDepth) {
1581
+ return {};
1582
+ }
1583
+ return this.getDefaultForObject(node, {
1584
+ ...context,
1585
+ depth: context.depth + 1
1586
+ });
1587
+ }
1588
+ if (node.type === "null") {
1589
+ return null;
1590
+ }
1591
+ if (node.type === "undefined") {
1592
+ return void 0;
1593
+ }
1594
+ if (isRefType(node)) {
1595
+ return {};
1596
+ }
1597
+ return void 0;
1598
+ }
1599
+ /**
1600
+ * Get default for a union type by picking the first non-null/undefined variant.
1601
+ */
1602
+ getDefaultForUnion(variants, context) {
1603
+ for (const variant of variants) {
1604
+ if (variant.type === "null" || variant.type === "undefined") {
1605
+ continue;
1606
+ }
1607
+ const defaultValue = this.getDefaultForType(variant, context);
1608
+ if (defaultValue !== void 0) {
1609
+ return defaultValue;
1610
+ }
1611
+ }
1612
+ return void 0;
1613
+ }
1614
+ /**
1615
+ * Get default for an intersection type by attempting to merge.
1616
+ */
1617
+ getDefaultForIntersection(parts, context) {
1618
+ const merged = {};
1619
+ for (const part of parts) {
1620
+ const partDefault = this.getDefaultForType(part, context);
1621
+ if (partDefault !== void 0 && typeof partDefault === "object" && partDefault !== null && !Array.isArray(partDefault)) {
1622
+ Object.assign(merged, partDefault);
1623
+ }
1624
+ }
1625
+ return Object.keys(merged).length > 0 ? merged : {};
1626
+ }
1627
+ /**
1628
+ * Get default for an object type by processing required properties.
1629
+ */
1630
+ getDefaultForObject(node, context) {
1631
+ const result = {};
1632
+ for (const [propName, prop] of Object.entries(node.properties)) {
1633
+ if (isPrimitiveConst(prop.node)) {
1634
+ result[propName] = prop.node.const;
1635
+ continue;
1636
+ }
1637
+ if (!prop.required) {
1638
+ continue;
1639
+ }
1640
+ const defaultValue = this.getDefaultForType(prop.node, context);
1641
+ if (defaultValue !== void 0) {
1642
+ result[propName] = defaultValue;
1643
+ }
1644
+ }
1645
+ return result;
1646
+ }
1647
+ };
1648
+
1649
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/builder-class-generator.ts
1650
+ var BuilderClassGenerator = class {
1651
+ typeTransformer;
1652
+ defaultValueGenerator;
1653
+ typeRegistry;
1654
+ /** Track array properties for __arrayProperties__ */
1655
+ arrayProperties = /* @__PURE__ */ new Set();
1656
+ /** Track asset wrapper paths for __assetWrapperPaths__ */
1657
+ assetWrapperPaths = [];
1658
+ constructor(typeTransformer, typeRegistry) {
1659
+ this.typeTransformer = typeTransformer;
1660
+ this.typeRegistry = typeRegistry ?? /* @__PURE__ */ new Map();
1661
+ this.defaultValueGenerator = new DefaultValueGenerator({
1662
+ maxDepth: 3,
1663
+ skipTypes: /* @__PURE__ */ new Set(["Asset", "AssetWrapper"])
1664
+ });
1665
+ }
1666
+ /**
1667
+ * Generate the builder class code.
1668
+ */
1669
+ generateBuilderClass(info) {
1670
+ const {
1671
+ name,
1672
+ className,
1673
+ factoryName,
1674
+ objectType,
1675
+ assetType,
1676
+ genericParams
1677
+ } = info;
1678
+ this.arrayProperties.clear();
1679
+ this.assetWrapperPaths = [];
1680
+ const genericPart = genericParams ? `<${genericParams}>` : "";
1681
+ const genericUsage = extractGenericUsage(genericParams);
1682
+ const interfaceCode = this.generateInterfaceMethods(info);
1683
+ const classMethods = this.generateClassMethods(info);
1684
+ const defaults = this.generateDefaults(objectType, assetType);
1685
+ this.assetWrapperPaths = findAssetWrapperPaths(
1686
+ objectType,
1687
+ this.typeRegistry
1688
+ );
1689
+ const arrayPropsCode = this.arrayProperties.size > 0 ? ` private static readonly __arrayProperties__: ReadonlySet<string> = new Set([${Array.from(
1690
+ this.arrayProperties
1691
+ ).map((p) => `"${p}"`).join(", ")}]);
1692
+ ` : "";
1693
+ const assetWrapperPathsCode = this.assetWrapperPaths.length > 0 ? ` private static readonly __assetWrapperPaths__: ReadonlyArray<ReadonlyArray<string>> = ${JSON.stringify(this.assetWrapperPaths)};
1694
+ ` : "";
1695
+ const classCode = `
1696
+ ${interfaceCode}
1697
+
1698
+ /**
1699
+ * A builder for ${name}
1700
+ */
1701
+ export class ${className}${genericPart} extends FunctionalBuilderBase<${name}${genericUsage}> implements ${className}Methods${genericUsage}, FunctionalBuilder<${name}${genericUsage}, BaseBuildContext> {
1702
+ private static readonly defaults: Record<string, unknown> = ${defaults};
1703
+ ${arrayPropsCode}${assetWrapperPathsCode}
1704
+ ${classMethods}
1705
+
1706
+ /**
1707
+ * Builds the final ${name} object
1708
+ * @param context - Optional build context for nested builders
1709
+ */
1710
+ build(context?: BaseBuildContext): ${name}${genericUsage} {
1711
+ return this.buildWithDefaults(${className}.defaults, context);
1712
+ }
1713
+
1714
+ [Symbol.for("nodejs.util.inspect.custom")](): string {
1715
+ return createInspectMethod("${className}", this.values);
1716
+ }
1717
+ }
1718
+
1719
+ /**
1720
+ * Creates a new ${name} builder
1721
+ * @param initial Optional initial values
1722
+ * @returns A functional builder for ${name}
1723
+ */
1724
+ export function ${factoryName}${genericPart}(initial?: FunctionalPartial<${name}${genericUsage}>): ${className}${genericUsage} {
1725
+ return new ${className}${genericUsage}(initial);
1726
+ }`;
1727
+ return classCode.trim();
1728
+ }
1729
+ /**
1730
+ * Generate interface methods for the builder.
1731
+ */
1732
+ generateInterfaceMethods(info) {
1733
+ const { className, objectType, genericParams, isAsset } = info;
1734
+ const genericUsage = extractGenericUsage(genericParams);
1735
+ const properties = this.collectPropertiesForMethods(objectType, isAsset);
1736
+ const methods = properties.map(({ propName, propType, description }) => {
1737
+ const methodName = `with${toPascalCase(propName)}`;
1738
+ const paramType = this.typeTransformer.transformType(propType, true);
1739
+ return ` /** ${description} */
1740
+ ${methodName}(value: ${paramType}): ${className}${genericUsage};`;
1741
+ }).join("\n");
1742
+ return `export interface ${className}Methods${genericParams ? `<${genericParams}>` : ""} {
1743
+ ${methods}
1744
+ }`;
1745
+ }
1746
+ /**
1747
+ * Collect properties that need methods generated.
1748
+ */
1749
+ collectPropertiesForMethods(objectType, isAsset) {
1750
+ const properties = [];
1751
+ const seenProps = /* @__PURE__ */ new Set();
1752
+ if (isAsset && !("id" in objectType.properties)) {
1753
+ properties.push({
1754
+ propName: "id",
1755
+ propType: { type: "string" },
1756
+ description: "A unique identifier for this asset"
1757
+ });
1758
+ seenProps.add("id");
1759
+ }
1760
+ for (const [propName, prop] of Object.entries(objectType.properties)) {
1761
+ if (seenProps.has(propName)) {
1762
+ continue;
1763
+ }
1764
+ seenProps.add(propName);
1765
+ properties.push({
1766
+ propName,
1767
+ propType: prop.node,
1768
+ description: prop.node.description || `Sets the ${propName} property`
1769
+ });
1770
+ }
1771
+ return properties;
1772
+ }
1773
+ /**
1774
+ * Generate class methods for the builder.
1775
+ */
1776
+ generateClassMethods(info) {
1777
+ const { className, objectType, genericParams, isAsset } = info;
1778
+ const genericUsage = extractGenericUsage(genericParams);
1779
+ const properties = this.collectPropertiesForMethods(objectType, isAsset);
1780
+ return properties.map(({ propName, propType, description }) => {
1781
+ const methodName = `with${toPascalCase(propName)}`;
1782
+ const paramType = this.typeTransformer.transformType(propType, true);
1783
+ if (containsArrayType(propType)) {
1784
+ this.arrayProperties.add(propName);
1785
+ }
1786
+ return ` /** ${description} */
1787
+ ${methodName}(value: ${paramType}): ${className}${genericUsage} {
1788
+ return this.set("${propName}", value);
1789
+ }`;
1790
+ }).join("\n\n");
1791
+ }
1792
+ /**
1793
+ * Generate default values object using DefaultValueGenerator.
1794
+ */
1795
+ generateDefaults(objectType, assetType) {
1796
+ const defaults = this.defaultValueGenerator.generateDefaults(
1797
+ objectType,
1798
+ assetType
1799
+ );
1800
+ return JSON.stringify(defaults);
1801
+ }
1802
+ };
1803
+
1804
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/generator.ts
1805
+ var FunctionalBuilderGenerator = class {
1806
+ namedType;
1807
+ config;
1808
+ /** Import generator handles import tracking and generation */
1809
+ importGenerator;
1810
+ /** Type transformer handles XLR to TypeScript type conversion */
1811
+ typeTransformer;
1812
+ /** Type collector handles collecting type references */
1813
+ typeCollector;
1814
+ /** Builder class generator handles class code generation */
1815
+ builderClassGenerator;
1816
+ /** Map short type names to their full qualified names */
1817
+ namespaceMemberMap = /* @__PURE__ */ new Map();
1818
+ constructor(namedType, config = {}) {
1819
+ this.namedType = namedType;
1820
+ this.config = config;
1821
+ const importConfig = {
1822
+ functionalImportPath: config.functionalImportPath,
1823
+ typesImportPath: config.typesImportPath,
1824
+ tsContext: config.tsContext,
1825
+ typeImportPathGenerator: config.typeImportPathGenerator,
1826
+ sameFileTypes: config.sameFileTypes,
1827
+ externalTypes: config.externalTypes,
1828
+ typeRegistry: config.typeRegistry
1829
+ };
1830
+ this.importGenerator = new ImportGenerator(importConfig);
1831
+ this.typeTransformer = new TypeTransformer(this.importGenerator);
1832
+ this.typeCollector = new TypeCollector(
1833
+ this.importGenerator,
1834
+ this.importGenerator.getGenericParamSymbols(),
1835
+ namedType.name,
1836
+ this.importGenerator.getNamespaceMemberMap(),
1837
+ config.typeRegistry
1838
+ );
1839
+ this.builderClassGenerator = new BuilderClassGenerator(
1840
+ this.typeTransformer,
1841
+ config.typeRegistry
1842
+ );
1843
+ }
1844
+ /**
1845
+ * Get list of types that exist but need to be exported.
1846
+ * Call this after generate() to get warnings for the user.
1847
+ */
1848
+ getUnexportedTypes() {
1849
+ return this.importGenerator.getUnexportedTypes();
1850
+ }
1851
+ /**
1852
+ * Get list of types that couldn't be resolved at all.
1853
+ * These types are used in the generated code but won't be imported,
1854
+ * causing type errors. Often these are namespaced types (e.g., Validation.CrossfieldReference).
1855
+ */
1856
+ getUnresolvedTypes() {
1857
+ return this.importGenerator.getUnresolvedTypes();
1858
+ }
1859
+ /**
1860
+ * Generate the builder code
1861
+ */
1862
+ generate() {
1863
+ this.typeCollector.collectGenericParamSymbols(this.namedType);
1864
+ const mainBuilder = this.createBuilderInfo(this.namedType);
1865
+ this.typeCollector.collectTypesFromGenericTokens(this.namedType);
1866
+ this.typeCollector.collectReferencedTypes(this.namedType);
1867
+ const mainBuilderCode = this.builderClassGenerator.generateBuilderClass(mainBuilder);
1868
+ const imports = this.importGenerator.generateImports(mainBuilder.name);
1869
+ return [imports, mainBuilderCode].filter(Boolean).join("\n\n");
1870
+ }
1871
+ createBuilderInfo(namedType) {
1872
+ const assetType = getAssetTypeFromExtends(namedType);
1873
+ const isAsset = !!assetType;
1874
+ let genericParams;
1875
+ if (isGenericNamedType2(namedType)) {
1876
+ const seenParams = /* @__PURE__ */ new Set();
1877
+ genericParams = namedType.genericTokens.filter((t) => {
1878
+ if (seenParams.has(t.symbol)) {
1879
+ return false;
1880
+ }
1881
+ seenParams.add(t.symbol);
1882
+ return true;
1883
+ }).map((t) => {
1884
+ let param = t.symbol;
1885
+ if (t.constraints) {
1886
+ const constraintType = this.typeTransformer.transformTypeForConstraint(t.constraints);
1887
+ if (constraintType !== "any") {
1888
+ param += ` extends ${constraintType}`;
1889
+ }
1890
+ }
1891
+ if (t.default) {
1892
+ param += ` = ${this.typeTransformer.transformTypeForConstraint(t.default)}`;
1893
+ }
1894
+ return param;
1895
+ }).join(", ");
1896
+ }
1897
+ return {
1898
+ name: namedType.name,
1899
+ className: toBuilderClassName(namedType.name),
1900
+ factoryName: toFactoryName(namedType.name),
1901
+ objectType: namedType,
1902
+ assetType,
1903
+ genericParams,
1904
+ isAsset
1905
+ };
1906
+ }
1907
+ };
1908
+ function generateFunctionalBuilder(namedType, config = {}) {
1909
+ const generator = new FunctionalBuilderGenerator(namedType, config);
1910
+ return generator.generate();
1911
+ }
1912
+ function generateFunctionalBuilderWithWarnings(namedType, config = {}) {
1913
+ const generator = new FunctionalBuilderGenerator(namedType, config);
1914
+ const code = generator.generate();
1915
+ const unexportedTypes = generator.getUnexportedTypes();
1916
+ return { code, unexportedTypes };
1917
+ }
1918
+
1919
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/path-utils.ts
1920
+ import { normalize, sep, dirname as dirname2, relative, resolve as resolve2 } from "path";
1921
+ function normalizeAndSplitPath(filePath) {
1922
+ return normalize(filePath).split(sep);
1923
+ }
1924
+ function isPackageDirectory(part) {
1925
+ return part === "node_modules" || part.startsWith(".pnpm");
1926
+ }
1927
+ function isNodeModulesPath(filePath) {
1928
+ const parts = normalizeAndSplitPath(filePath);
1929
+ return parts.some(isPackageDirectory);
1930
+ }
1931
+ function extractPackageNameFromPath(filePath) {
1932
+ const parts = normalizeAndSplitPath(filePath);
1933
+ let lastNodeModulesIndex = -1;
1934
+ for (let i = parts.length - 1; i >= 0; i--) {
1935
+ if (parts[i] === "node_modules") {
1936
+ lastNodeModulesIndex = i;
1937
+ break;
1938
+ }
1939
+ }
1940
+ if (lastNodeModulesIndex === -1 || lastNodeModulesIndex >= parts.length - 1) {
1941
+ return null;
1942
+ }
1943
+ const afterNodeModules = parts.slice(lastNodeModulesIndex + 1);
1944
+ if (afterNodeModules[0]?.startsWith("@")) {
1945
+ if (afterNodeModules.length >= 2) {
1946
+ return `${afterNodeModules[0]}/${afterNodeModules[1]}`;
1947
+ }
1948
+ return null;
1949
+ }
1950
+ return afterNodeModules[0] || null;
1951
+ }
1952
+ function createRelativeImportPath(fromFile, toFile) {
1953
+ const fromDir = dirname2(fromFile);
1954
+ let relativePath = relative(fromDir, toFile);
1955
+ relativePath = relativePath.replace(/\.tsx?$/, ".js");
1956
+ relativePath = relativePath.replace(/\.d\.ts$/, ".js");
1957
+ if (!relativePath.startsWith(".")) {
1958
+ relativePath = `./${relativePath}`;
1959
+ }
1960
+ return relativePath;
1961
+ }
1962
+ function resolveRelativeImportPath(fromFile, importSpecifier) {
1963
+ const fromDir = dirname2(fromFile);
1964
+ let actualSpecifier = importSpecifier;
1965
+ if (importSpecifier.endsWith(".js")) {
1966
+ actualSpecifier = importSpecifier.replace(/\.js$/, ".ts");
1967
+ }
1968
+ let resolvedPath = resolve2(fromDir, actualSpecifier);
1969
+ if (!resolvedPath.endsWith(".ts") && !resolvedPath.endsWith(".tsx") && !resolvedPath.endsWith(".d.ts")) {
1970
+ resolvedPath += ".ts";
1971
+ }
1972
+ return resolvedPath;
1973
+ }
1974
+
1975
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/generators/javascript/src/type-categorizer.ts
1976
+ function categorizeTypes(referencedTypes, finder, options) {
1977
+ const { mainSourceFile, sameFileTypes } = options;
1978
+ const result = {
1979
+ localTypes: /* @__PURE__ */ new Set(),
1980
+ relativeImports: /* @__PURE__ */ new Map(),
1981
+ externalTypes: /* @__PURE__ */ new Map()
1982
+ };
1983
+ for (const typeName of referencedTypes) {
1984
+ if (sameFileTypes?.has(typeName)) {
1985
+ result.localTypes.add(typeName);
1986
+ continue;
1987
+ }
1988
+ const sourceFile = finder.findTypeSourceFile(typeName, mainSourceFile);
1989
+ if (!sourceFile) {
1990
+ result.localTypes.add(typeName);
1991
+ continue;
1992
+ }
1993
+ const normalizedSource = normalizePath(sourceFile);
1994
+ const normalizedMain = normalizePath(mainSourceFile);
1995
+ if (normalizedSource === normalizedMain) {
1996
+ result.localTypes.add(typeName);
1997
+ } else if (isNodeModulesPath(sourceFile)) {
1998
+ const packageName = extractPackageNameFromPath(sourceFile);
1999
+ if (packageName) {
2000
+ result.externalTypes.set(typeName, packageName);
2001
+ } else {
2002
+ result.localTypes.add(typeName);
2003
+ }
2004
+ } else {
2005
+ const relativePath = createRelativeImportPath(mainSourceFile, sourceFile);
2006
+ if (!result.relativeImports.has(relativePath)) {
2007
+ result.relativeImports.set(relativePath, /* @__PURE__ */ new Set());
2008
+ }
2009
+ result.relativeImports.get(relativePath).add(typeName);
2010
+ }
2011
+ }
2012
+ return result;
2013
+ }
2014
+ function groupExternalTypesByPackage(externalTypes) {
2015
+ const grouped = /* @__PURE__ */ new Map();
2016
+ for (const [typeName, packageName] of externalTypes) {
2017
+ if (!grouped.has(packageName)) {
2018
+ grouped.set(packageName, /* @__PURE__ */ new Set());
2019
+ }
2020
+ grouped.get(packageName).add(typeName);
2021
+ }
2022
+ return grouped;
2023
+ }
2024
+ function normalizePath(filePath) {
2025
+ return filePath.replace(/\\/g, "/").replace(/\/$/, "");
2026
+ }
2027
+ export {
2028
+ PLAYER_BUILTINS,
2029
+ TYPESCRIPT_BUILTINS,
2030
+ TsMorphTypeDefinitionFinder,
2031
+ categorizeTypes,
2032
+ containsArrayType,
2033
+ createRelativeImportPath,
2034
+ createTypeScriptResolver,
2035
+ extendsAssetWrapper,
2036
+ extractBaseName,
2037
+ extractGenericUsage,
2038
+ extractPackageNameFromPath,
2039
+ findAssetWrapperPaths,
2040
+ generateFunctionalBuilder,
2041
+ generateFunctionalBuilderWithWarnings,
2042
+ getAssetTypeFromExtends,
2043
+ getAssetWrapperExtendsRef,
2044
+ getAssetWrapperExtendsRefByName,
2045
+ getPropertiesInfo,
2046
+ groupExternalTypesByPackage,
2047
+ isAndType,
2048
+ isArrayType,
2049
+ isAssetWrapperRef,
2050
+ isBindingRef,
2051
+ isBooleanType,
2052
+ isBuiltInDeclarationPath,
2053
+ isBuiltinType,
2054
+ isComplexObjectType,
2055
+ isDeclarationExported,
2056
+ isExpressionRef,
2057
+ isNamedType,
2058
+ isNodeModulesPath,
2059
+ isNumberType,
2060
+ isObjectType,
2061
+ isOrType,
2062
+ isPrimitiveConst,
2063
+ isRecordType,
2064
+ isRefType,
2065
+ isStringType,
2066
+ isTupleType,
2067
+ parseNamespacedType,
2068
+ resolveRelativeImportPath,
2069
+ sanitizePropertyName,
2070
+ splitAtTopLevelCommas,
2071
+ toBuilderClassName,
2072
+ toFactoryName,
2073
+ toPascalCase
2074
+ };
2075
+ //# sourceMappingURL=index.mjs.map