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