@player-tools/fluent-generator 0.13.0--canary.221.5819
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +510 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/index.legacy-esm.js +472 -0
- package/dist/index.mjs +472 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +35 -0
- package/src/__tests__/__snapshots__/generator.test.ts.snap +875 -0
- package/src/__tests__/generator.test.ts +1142 -0
- package/src/cli.ts +192 -0
- package/src/generator.ts +596 -0
- package/src/index.ts +12 -0
- package/src/utils.ts +209 -0
- package/types/cli.d.ts +6 -0
- package/types/generator.d.ts +77 -0
- package/types/index.d.ts +8 -0
- package/types/utils.d.ts +73 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/generators/fluent/src/generator.ts
|
|
2
|
+
import { isGenericNamedType } from "@player-tools/xlr-utils";
|
|
3
|
+
|
|
4
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/generators/fluent/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 "@player-tools/xlr-utils";
|
|
17
|
+
function isPrimitiveConst(node) {
|
|
18
|
+
return (isStringType(node) || isNumberType(node) || isBooleanType(node)) && "const" in node && node.const !== void 0;
|
|
19
|
+
}
|
|
20
|
+
function isAssetWrapperRef(node) {
|
|
21
|
+
return isRefType(node) && node.ref.startsWith("AssetWrapper");
|
|
22
|
+
}
|
|
23
|
+
function isExpressionRef(node) {
|
|
24
|
+
return isRefType(node) && node.ref === "Expression";
|
|
25
|
+
}
|
|
26
|
+
function isBindingRef(node) {
|
|
27
|
+
return isRefType(node) && node.ref === "Binding";
|
|
28
|
+
}
|
|
29
|
+
function toPascalCase(str) {
|
|
30
|
+
return str.split(/[-_]/).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
|
|
31
|
+
}
|
|
32
|
+
function toFactoryName(typeName) {
|
|
33
|
+
const name = typeName.replace(/Asset$/, "");
|
|
34
|
+
return name.charAt(0).toLowerCase() + name.slice(1);
|
|
35
|
+
}
|
|
36
|
+
function toBuilderClassName(typeName) {
|
|
37
|
+
return `${typeName}Builder`;
|
|
38
|
+
}
|
|
39
|
+
function isComplexObjectType(obj) {
|
|
40
|
+
const props = Object.values(obj.properties);
|
|
41
|
+
const hasSlots = props.some((p) => isAssetWrapperRef(p.node));
|
|
42
|
+
if (hasSlots) return true;
|
|
43
|
+
if (props.length > 3) return true;
|
|
44
|
+
const hasNestedObjects = props.some(
|
|
45
|
+
(p) => isObjectType(p.node) && !isPrimitiveConst(p.node)
|
|
46
|
+
);
|
|
47
|
+
if (hasNestedObjects) return true;
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
function getAssetTypeFromExtends(obj) {
|
|
51
|
+
if (!obj.extends) return void 0;
|
|
52
|
+
const ref = obj.extends;
|
|
53
|
+
if (ref.genericArguments && ref.genericArguments.length > 0) {
|
|
54
|
+
const typeArg = ref.genericArguments[0];
|
|
55
|
+
if (isStringType(typeArg) && typeArg.const) {
|
|
56
|
+
return typeArg.const;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return void 0;
|
|
60
|
+
}
|
|
61
|
+
function getPropertiesInfo(obj) {
|
|
62
|
+
return Object.entries(obj.properties).map(([name, prop]) => {
|
|
63
|
+
const isSlot = isAssetWrapperRef(prop.node);
|
|
64
|
+
const isArray = isArrayType(prop.node);
|
|
65
|
+
const isArraySlot = isArray && isAssetWrapperRef(prop.node.elementType);
|
|
66
|
+
return {
|
|
67
|
+
name,
|
|
68
|
+
node: prop.node,
|
|
69
|
+
required: prop.required,
|
|
70
|
+
isSlot,
|
|
71
|
+
isArraySlot,
|
|
72
|
+
isArray
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function containsArrayType(node) {
|
|
77
|
+
if (isArrayType(node)) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
if (isOrType(node)) {
|
|
81
|
+
return node.or.some(containsArrayType);
|
|
82
|
+
}
|
|
83
|
+
if (isAndType(node)) {
|
|
84
|
+
return node.and.some(containsArrayType);
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
function extractGenericUsage(genericParams) {
|
|
89
|
+
if (!genericParams) {
|
|
90
|
+
return "";
|
|
91
|
+
}
|
|
92
|
+
const params = genericParams.split(",").map((p) => p.trim().split(" ")[0]).join(", ");
|
|
93
|
+
return `<${params}>`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/language/generators/fluent/src/generator.ts
|
|
97
|
+
function extractBaseName(ref) {
|
|
98
|
+
const bracketIndex = ref.indexOf("<");
|
|
99
|
+
return bracketIndex === -1 ? ref : ref.substring(0, bracketIndex);
|
|
100
|
+
}
|
|
101
|
+
var FluentBuilderGenerator = class {
|
|
102
|
+
namedType;
|
|
103
|
+
config;
|
|
104
|
+
/** Track nested types that need their own builders */
|
|
105
|
+
nestedBuilders = /* @__PURE__ */ new Map();
|
|
106
|
+
/** Track array properties for __arrayProperties__ */
|
|
107
|
+
arrayProperties = /* @__PURE__ */ new Set();
|
|
108
|
+
/** Track all type references that need to be imported from the source type file */
|
|
109
|
+
referencedTypes = /* @__PURE__ */ new Set();
|
|
110
|
+
/** Track whether Asset type is needed for imports */
|
|
111
|
+
needsAssetImport = false;
|
|
112
|
+
constructor(namedType, config = {}) {
|
|
113
|
+
this.namedType = namedType;
|
|
114
|
+
this.config = config;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generate the builder code
|
|
118
|
+
*/
|
|
119
|
+
generate() {
|
|
120
|
+
const mainBuilder = this.createBuilderInfo(this.namedType);
|
|
121
|
+
this.collectNestedTypes(this.namedType);
|
|
122
|
+
const nestedBuilderCode = Array.from(this.nestedBuilders.entries()).map(([name, objType]) => {
|
|
123
|
+
const info = {
|
|
124
|
+
name,
|
|
125
|
+
className: toBuilderClassName(name),
|
|
126
|
+
factoryName: toFactoryName(name),
|
|
127
|
+
objectType: objType,
|
|
128
|
+
isAsset: false
|
|
129
|
+
};
|
|
130
|
+
return this.generateBuilderClass(info);
|
|
131
|
+
}).join("\n\n");
|
|
132
|
+
const mainBuilderCode = this.generateBuilderClass(mainBuilder);
|
|
133
|
+
const imports = this.generateImports(mainBuilder);
|
|
134
|
+
return [imports, nestedBuilderCode, mainBuilderCode].filter(Boolean).join("\n\n");
|
|
135
|
+
}
|
|
136
|
+
createBuilderInfo(namedType) {
|
|
137
|
+
const assetType = getAssetTypeFromExtends(namedType);
|
|
138
|
+
const isAsset = !!assetType;
|
|
139
|
+
let genericParams;
|
|
140
|
+
if (isGenericNamedType(namedType)) {
|
|
141
|
+
genericParams = namedType.genericTokens.map((t) => {
|
|
142
|
+
let param = t.symbol;
|
|
143
|
+
if (t.constraints) {
|
|
144
|
+
param += ` extends ${this.transformType(t.constraints)}`;
|
|
145
|
+
}
|
|
146
|
+
if (t.default) {
|
|
147
|
+
param += ` = ${this.transformType(t.default)}`;
|
|
148
|
+
}
|
|
149
|
+
return param;
|
|
150
|
+
}).join(", ");
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
name: namedType.name,
|
|
154
|
+
className: toBuilderClassName(namedType.name),
|
|
155
|
+
factoryName: toFactoryName(namedType.name),
|
|
156
|
+
objectType: namedType,
|
|
157
|
+
assetType,
|
|
158
|
+
genericParams,
|
|
159
|
+
isAsset
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
generateImports(mainBuilder) {
|
|
163
|
+
const typeImportPath = this.config.typeImportPathGenerator ? this.config.typeImportPathGenerator(mainBuilder.name) : `../types/${this.getTypeFileName(mainBuilder.name)}`;
|
|
164
|
+
const typesToImport = /* @__PURE__ */ new Set([mainBuilder.name]);
|
|
165
|
+
Array.from(this.nestedBuilders.keys()).forEach((name) => {
|
|
166
|
+
typesToImport.add(name);
|
|
167
|
+
});
|
|
168
|
+
Array.from(this.referencedTypes).forEach((name) => {
|
|
169
|
+
typesToImport.add(name);
|
|
170
|
+
});
|
|
171
|
+
const typeImportStatement = `import type { ${Array.from(typesToImport).join(", ")} } from "${typeImportPath}";`;
|
|
172
|
+
const typesImportPath = this.config.typesImportPath ?? "@player-ui/types";
|
|
173
|
+
const fluentImportPath = this.config.fluentImportPath ?? "@player-tools/fluent";
|
|
174
|
+
const lines = [typeImportStatement];
|
|
175
|
+
if (this.needsAssetImport) {
|
|
176
|
+
lines.push(`import type { Asset } from "${typesImportPath}";`);
|
|
177
|
+
}
|
|
178
|
+
lines.push(
|
|
179
|
+
`import { type FluentBuilder, type BaseBuildContext, FluentBuilderBase, createInspectMethod, type TaggedTemplateValue } from "${fluentImportPath}";`
|
|
180
|
+
);
|
|
181
|
+
return lines.join("\n");
|
|
182
|
+
}
|
|
183
|
+
getTypeFileName(typeName) {
|
|
184
|
+
return typeName.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "").replace(/asset$/, "");
|
|
185
|
+
}
|
|
186
|
+
collectNestedTypes(objType) {
|
|
187
|
+
for (const [propName, prop] of Object.entries(objType.properties)) {
|
|
188
|
+
this.collectNestedTypesFromNode(prop.node, propName);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
collectNestedTypesFromNode(node, parentName) {
|
|
192
|
+
if (isObjectType(node)) {
|
|
193
|
+
if (isNamedType(node) && isComplexObjectType(node)) {
|
|
194
|
+
this.nestedBuilders.set(node.name, node);
|
|
195
|
+
this.collectNestedTypes(node);
|
|
196
|
+
} else if (!isNamedType(node) && isComplexObjectType(node)) {
|
|
197
|
+
const name = toPascalCase(parentName);
|
|
198
|
+
this.nestedBuilders.set(name, node);
|
|
199
|
+
this.collectNestedTypes(node);
|
|
200
|
+
} else if (isNamedType(node)) {
|
|
201
|
+
this.referencedTypes.add(node.name);
|
|
202
|
+
}
|
|
203
|
+
} else if (isArrayType(node)) {
|
|
204
|
+
this.collectNestedTypesFromNode(node.elementType, parentName);
|
|
205
|
+
} else if (isOrType(node)) {
|
|
206
|
+
for (const variant of node.or) {
|
|
207
|
+
this.collectNestedTypesFromNode(variant, parentName);
|
|
208
|
+
}
|
|
209
|
+
} else if (isAndType(node)) {
|
|
210
|
+
for (const part of node.and) {
|
|
211
|
+
this.collectNestedTypesFromNode(part, parentName);
|
|
212
|
+
}
|
|
213
|
+
} else if (isRefType(node)) {
|
|
214
|
+
const baseName = extractBaseName(node.ref);
|
|
215
|
+
const builtInTypes = [
|
|
216
|
+
"Asset",
|
|
217
|
+
"AssetWrapper",
|
|
218
|
+
"Binding",
|
|
219
|
+
"Expression",
|
|
220
|
+
"Array",
|
|
221
|
+
"Record"
|
|
222
|
+
];
|
|
223
|
+
if (!builtInTypes.includes(baseName)) {
|
|
224
|
+
this.referencedTypes.add(baseName);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
generateBuilderClass(info) {
|
|
229
|
+
const {
|
|
230
|
+
name,
|
|
231
|
+
className,
|
|
232
|
+
factoryName,
|
|
233
|
+
objectType,
|
|
234
|
+
assetType,
|
|
235
|
+
genericParams
|
|
236
|
+
} = info;
|
|
237
|
+
this.arrayProperties.clear();
|
|
238
|
+
const genericPart = genericParams ? `<${genericParams}>` : "";
|
|
239
|
+
const genericUsage = extractGenericUsage(genericParams);
|
|
240
|
+
const interfaceCode = this.generateInterfaceMethods(info);
|
|
241
|
+
const classMethods = this.generateClassMethods(info);
|
|
242
|
+
const defaults = this.generateDefaults(objectType, assetType);
|
|
243
|
+
const arrayPropsCode = this.arrayProperties.size > 0 ? ` private static readonly __arrayProperties__: ReadonlySet<string> = new Set([${Array.from(
|
|
244
|
+
this.arrayProperties
|
|
245
|
+
).map((p) => `"${p}"`).join(", ")}]);
|
|
246
|
+
` : "";
|
|
247
|
+
const classCode = `
|
|
248
|
+
${interfaceCode}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* A builder for ${name}
|
|
252
|
+
*/
|
|
253
|
+
export class ${className}${genericPart} extends FluentBuilderBase<${name}${genericUsage}> implements ${className}Methods${genericUsage}, FluentBuilder<${name}${genericUsage}, BaseBuildContext> {
|
|
254
|
+
private static readonly defaults: Record<string, unknown> = ${defaults};
|
|
255
|
+
${arrayPropsCode}
|
|
256
|
+
${classMethods}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Builds the final ${name} object
|
|
260
|
+
* @param context - Optional build context for nested builders
|
|
261
|
+
*/
|
|
262
|
+
build(context?: BaseBuildContext): ${name}${genericUsage} {
|
|
263
|
+
return this.buildWithDefaults(${className}.defaults, context);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
[Symbol.for("nodejs.util.inspect.custom")](): string {
|
|
267
|
+
return createInspectMethod("${className}", this.values);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Creates a new ${name} builder
|
|
273
|
+
* @param initial Optional initial values
|
|
274
|
+
* @returns A fluent builder for ${name}
|
|
275
|
+
*/
|
|
276
|
+
export function ${factoryName}${genericPart}(initial?: Partial<${name}${genericUsage}>): ${className}${genericUsage} {
|
|
277
|
+
return new ${className}${genericUsage}(initial);
|
|
278
|
+
}`;
|
|
279
|
+
return classCode.trim();
|
|
280
|
+
}
|
|
281
|
+
generateInterfaceMethods(info) {
|
|
282
|
+
const { className, objectType, genericParams, isAsset } = info;
|
|
283
|
+
const genericUsage = extractGenericUsage(genericParams);
|
|
284
|
+
const properties = this.collectPropertiesForMethods(objectType, isAsset);
|
|
285
|
+
const methods = properties.map(({ propName, propType, description }) => {
|
|
286
|
+
const methodName = `with${toPascalCase(propName)}`;
|
|
287
|
+
const paramType = this.transformType(propType, true);
|
|
288
|
+
return ` /** ${description} */
|
|
289
|
+
${methodName}(value: ${paramType}): ${className}${genericUsage};`;
|
|
290
|
+
}).join("\n");
|
|
291
|
+
return `export interface ${className}Methods${genericParams ? `<${genericParams}>` : ""} {
|
|
292
|
+
${methods}
|
|
293
|
+
}`;
|
|
294
|
+
}
|
|
295
|
+
collectPropertiesForMethods(objectType, isAsset) {
|
|
296
|
+
const properties = [];
|
|
297
|
+
if (isAsset) {
|
|
298
|
+
properties.push({
|
|
299
|
+
propName: "id",
|
|
300
|
+
propType: { type: "string" },
|
|
301
|
+
description: "A unique identifier for this asset"
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
for (const [propName, prop] of Object.entries(objectType.properties)) {
|
|
305
|
+
properties.push({
|
|
306
|
+
propName,
|
|
307
|
+
propType: prop.node,
|
|
308
|
+
description: prop.node.description || `Sets the ${propName} property`
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
return properties;
|
|
312
|
+
}
|
|
313
|
+
generateClassMethods(info) {
|
|
314
|
+
const { className, objectType, genericParams, isAsset } = info;
|
|
315
|
+
const genericUsage = extractGenericUsage(genericParams);
|
|
316
|
+
const properties = this.collectPropertiesForMethods(objectType, isAsset);
|
|
317
|
+
return properties.map(({ propName, propType, description }) => {
|
|
318
|
+
const methodName = `with${toPascalCase(propName)}`;
|
|
319
|
+
const paramType = this.transformType(propType, true);
|
|
320
|
+
if (containsArrayType(propType)) {
|
|
321
|
+
this.arrayProperties.add(propName);
|
|
322
|
+
}
|
|
323
|
+
return ` /** ${description} */
|
|
324
|
+
${methodName}(value: ${paramType}): ${className}${genericUsage} {
|
|
325
|
+
return this.set("${propName}", value);
|
|
326
|
+
}`;
|
|
327
|
+
}).join("\n\n");
|
|
328
|
+
}
|
|
329
|
+
generateDefaults(objectType, assetType) {
|
|
330
|
+
const defaults = {};
|
|
331
|
+
if (assetType) {
|
|
332
|
+
defaults["type"] = assetType;
|
|
333
|
+
}
|
|
334
|
+
if (objectType.extends?.ref.startsWith("Asset")) {
|
|
335
|
+
defaults["id"] = "";
|
|
336
|
+
} else if ("id" in objectType.properties) {
|
|
337
|
+
defaults["id"] = "";
|
|
338
|
+
}
|
|
339
|
+
for (const [propName, prop] of Object.entries(objectType.properties)) {
|
|
340
|
+
if (isPrimitiveConst(prop.node)) {
|
|
341
|
+
defaults[propName] = prop.node.const;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return JSON.stringify(defaults);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Transform an XLR type to a TypeScript type string
|
|
348
|
+
* This is the core recursive transformation that adds TaggedTemplateValue support
|
|
349
|
+
*/
|
|
350
|
+
transformType(node, forParameter = false) {
|
|
351
|
+
if (isStringType(node)) {
|
|
352
|
+
if (isPrimitiveConst(node)) {
|
|
353
|
+
return `"${node.const}"`;
|
|
354
|
+
}
|
|
355
|
+
return forParameter ? "string | TaggedTemplateValue<string>" : "string";
|
|
356
|
+
}
|
|
357
|
+
if (isNumberType(node)) {
|
|
358
|
+
if (isPrimitiveConst(node)) {
|
|
359
|
+
return `${node.const}`;
|
|
360
|
+
}
|
|
361
|
+
return forParameter ? "number | TaggedTemplateValue<number>" : "number";
|
|
362
|
+
}
|
|
363
|
+
if (isBooleanType(node)) {
|
|
364
|
+
if (isPrimitiveConst(node)) {
|
|
365
|
+
return `${node.const}`;
|
|
366
|
+
}
|
|
367
|
+
return forParameter ? "boolean | TaggedTemplateValue<boolean>" : "boolean";
|
|
368
|
+
}
|
|
369
|
+
if (isRefType(node)) {
|
|
370
|
+
return this.transformRefType(node, forParameter);
|
|
371
|
+
}
|
|
372
|
+
if (isArrayType(node)) {
|
|
373
|
+
const elementType = this.transformType(node.elementType, forParameter);
|
|
374
|
+
return `Array<${elementType}>`;
|
|
375
|
+
}
|
|
376
|
+
if (isOrType(node)) {
|
|
377
|
+
const variants = node.or.map((v) => this.transformType(v, forParameter));
|
|
378
|
+
return variants.join(" | ");
|
|
379
|
+
}
|
|
380
|
+
if (isAndType(node)) {
|
|
381
|
+
const parts = node.and.map((p) => this.transformType(p, forParameter));
|
|
382
|
+
return parts.join(" & ");
|
|
383
|
+
}
|
|
384
|
+
if (isRecordType(node)) {
|
|
385
|
+
const keyType = this.transformType(node.keyType, false);
|
|
386
|
+
const valueType = this.transformType(node.valueType, forParameter);
|
|
387
|
+
return `Record<${keyType}, ${valueType}>`;
|
|
388
|
+
}
|
|
389
|
+
if (isObjectType(node)) {
|
|
390
|
+
if (isNamedType(node)) {
|
|
391
|
+
if (isComplexObjectType(node)) {
|
|
392
|
+
return `${node.name} | FluentBuilder<${node.name}, BaseBuildContext>`;
|
|
393
|
+
}
|
|
394
|
+
return node.name;
|
|
395
|
+
}
|
|
396
|
+
return this.generateInlineObjectType(node, forParameter);
|
|
397
|
+
}
|
|
398
|
+
if (node.type === "null") return "null";
|
|
399
|
+
if (node.type === "undefined") return "undefined";
|
|
400
|
+
if (node.type === "any") return "any";
|
|
401
|
+
if (node.type === "unknown") return "unknown";
|
|
402
|
+
if (node.type === "never") return "never";
|
|
403
|
+
if (node.type === "void") return "void";
|
|
404
|
+
return "unknown";
|
|
405
|
+
}
|
|
406
|
+
transformRefType(node, forParameter) {
|
|
407
|
+
const ref = node.ref;
|
|
408
|
+
if (ref.startsWith("AssetWrapper")) {
|
|
409
|
+
this.needsAssetImport = true;
|
|
410
|
+
return "Asset | FluentBuilder<Asset, BaseBuildContext>";
|
|
411
|
+
}
|
|
412
|
+
if (ref === "Expression") {
|
|
413
|
+
return forParameter ? "string | TaggedTemplateValue<string>" : "string";
|
|
414
|
+
}
|
|
415
|
+
if (ref === "Binding") {
|
|
416
|
+
return forParameter ? "string | TaggedTemplateValue<string>" : "string";
|
|
417
|
+
}
|
|
418
|
+
if (ref === "Asset" || ref.startsWith("Asset<")) {
|
|
419
|
+
this.needsAssetImport = true;
|
|
420
|
+
return "Asset";
|
|
421
|
+
}
|
|
422
|
+
const baseName = extractBaseName(ref);
|
|
423
|
+
if (this.nestedBuilders.has(baseName)) {
|
|
424
|
+
return `${baseName} | FluentBuilder<${baseName}, BaseBuildContext>`;
|
|
425
|
+
}
|
|
426
|
+
if (node.genericArguments && node.genericArguments.length > 0) {
|
|
427
|
+
const args = node.genericArguments.map(
|
|
428
|
+
(a) => this.transformType(a, forParameter)
|
|
429
|
+
);
|
|
430
|
+
return `${baseName}<${args.join(", ")}>`;
|
|
431
|
+
}
|
|
432
|
+
return baseName;
|
|
433
|
+
}
|
|
434
|
+
generateInlineObjectType(node, forParameter) {
|
|
435
|
+
const props = Object.entries(node.properties).map(([propName, prop]) => {
|
|
436
|
+
const propType = this.transformType(prop.node, forParameter);
|
|
437
|
+
const optional = prop.required ? "" : "?";
|
|
438
|
+
return `${propName}${optional}: ${propType}`;
|
|
439
|
+
}).join("; ");
|
|
440
|
+
return `{ ${props} }`;
|
|
441
|
+
}
|
|
442
|
+
};
|
|
443
|
+
function generateFluentBuilder(namedType, config = {}) {
|
|
444
|
+
const generator = new FluentBuilderGenerator(namedType, config);
|
|
445
|
+
return generator.generate();
|
|
446
|
+
}
|
|
447
|
+
export {
|
|
448
|
+
containsArrayType,
|
|
449
|
+
extractGenericUsage,
|
|
450
|
+
generateFluentBuilder,
|
|
451
|
+
getAssetTypeFromExtends,
|
|
452
|
+
getPropertiesInfo,
|
|
453
|
+
isAndType,
|
|
454
|
+
isArrayType,
|
|
455
|
+
isAssetWrapperRef,
|
|
456
|
+
isBindingRef,
|
|
457
|
+
isBooleanType,
|
|
458
|
+
isComplexObjectType,
|
|
459
|
+
isExpressionRef,
|
|
460
|
+
isNamedType,
|
|
461
|
+
isNumberType,
|
|
462
|
+
isObjectType,
|
|
463
|
+
isOrType,
|
|
464
|
+
isPrimitiveConst,
|
|
465
|
+
isRecordType,
|
|
466
|
+
isRefType,
|
|
467
|
+
isStringType,
|
|
468
|
+
toBuilderClassName,
|
|
469
|
+
toFactoryName,
|
|
470
|
+
toPascalCase
|
|
471
|
+
};
|
|
472
|
+
//# sourceMappingURL=index.mjs.map
|