@moinax/orc 0.1.4 → 0.2.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.
- package/README.md +5 -0
- package/dist/cli.js +52 -30
- package/dist/cli.js.map +1 -1
- package/dist/generator/config.cjs.map +1 -1
- package/dist/generator/config.d.cts +1 -0
- package/dist/generator/config.d.ts +1 -0
- package/dist/generator/config.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -97,6 +97,11 @@ export default defineConfig({
|
|
|
97
97
|
// Optional: strip a prefix from all API paths
|
|
98
98
|
// Useful when the spec includes a base path like /public
|
|
99
99
|
stripPathPrefix: '/public',
|
|
100
|
+
|
|
101
|
+
// Optional: prefix all generated schema/type/enum names
|
|
102
|
+
// Useful when generating multiple clients to avoid naming collisions
|
|
103
|
+
// e.g., 'Charge' → chargePetSchema, ChargePet, ChargeContractStatus
|
|
104
|
+
schemaPrefix: 'Charge',
|
|
100
105
|
},
|
|
101
106
|
],
|
|
102
107
|
});
|
package/dist/cli.js
CHANGED
|
@@ -43,18 +43,27 @@ function isBooleanLikeEnum(values) {
|
|
|
43
43
|
const sorted = [...values].sort();
|
|
44
44
|
return sorted[0] === "false" && sorted[1] === "true";
|
|
45
45
|
}
|
|
46
|
-
function
|
|
46
|
+
function prefixSchemaConst(name, schemaPrefix) {
|
|
47
|
+
if (!schemaPrefix) return `${camelCase(name)}Schema`;
|
|
48
|
+
return `${camelCase(schemaPrefix)}${pascalCase(name)}Schema`;
|
|
49
|
+
}
|
|
50
|
+
function prefixTypeName(name, schemaPrefix) {
|
|
51
|
+
if (!schemaPrefix) return pascalCase(name);
|
|
52
|
+
return `${pascalCase(schemaPrefix)}${pascalCase(name)}`;
|
|
53
|
+
}
|
|
54
|
+
function getResourcePrefixedParamNames(methodName, resourceClassName, schemaPrefix) {
|
|
47
55
|
const singularResource = singularize(resourceClassName);
|
|
56
|
+
const prefix = schemaPrefix ? pascalCase(schemaPrefix) : "";
|
|
48
57
|
if (methodName.startsWith("get")) {
|
|
49
58
|
const rest = methodName.slice(3);
|
|
50
59
|
return {
|
|
51
|
-
schemaConstName: `get${singularResource}${rest}ParamsSchema`,
|
|
52
|
-
typeName: `Get${singularResource}${rest}Params`
|
|
60
|
+
schemaConstName: `get${prefix}${singularResource}${rest}ParamsSchema`,
|
|
61
|
+
typeName: `Get${prefix}${singularResource}${rest}Params`
|
|
53
62
|
};
|
|
54
63
|
}
|
|
55
64
|
return {
|
|
56
|
-
schemaConstName: `${camelCase(methodName)}${singularResource}ParamsSchema`,
|
|
57
|
-
typeName: `${pascalCase(methodName)}${singularResource}Params`
|
|
65
|
+
schemaConstName: `${camelCase(methodName)}${prefix}${singularResource}ParamsSchema`,
|
|
66
|
+
typeName: `${pascalCase(methodName)}${prefix}${singularResource}Params`
|
|
58
67
|
};
|
|
59
68
|
}
|
|
60
69
|
function validateFileName(name, context) {
|
|
@@ -182,6 +191,10 @@ var EnumRegistry = class _EnumRegistry {
|
|
|
182
191
|
enums = /* @__PURE__ */ new Map();
|
|
183
192
|
enumContexts = /* @__PURE__ */ new Map();
|
|
184
193
|
usedNames = /* @__PURE__ */ new Set();
|
|
194
|
+
schemaPrefix;
|
|
195
|
+
constructor(schemaPrefix) {
|
|
196
|
+
this.schemaPrefix = schemaPrefix || "";
|
|
197
|
+
}
|
|
185
198
|
static fingerprint(values) {
|
|
186
199
|
return JSON.stringify([...values].sort());
|
|
187
200
|
}
|
|
@@ -199,6 +212,9 @@ var EnumRegistry = class _EnumRegistry {
|
|
|
199
212
|
} else {
|
|
200
213
|
baseName = camelCase(values[0].toLowerCase());
|
|
201
214
|
}
|
|
215
|
+
if (this.schemaPrefix) {
|
|
216
|
+
baseName = camelCase(this.schemaPrefix) + pascalCase(baseName);
|
|
217
|
+
}
|
|
202
218
|
const valuesConstName = pluralizeLib2.isPlural(baseName) ? baseName : pluralizeLib2.plural(baseName);
|
|
203
219
|
return {
|
|
204
220
|
valuesConstName,
|
|
@@ -277,12 +293,14 @@ var ResourceGenerator = class {
|
|
|
277
293
|
collectedInlineSchemas = /* @__PURE__ */ new Map();
|
|
278
294
|
currentResourceName = null;
|
|
279
295
|
runtimePackage;
|
|
296
|
+
schemaPrefix;
|
|
280
297
|
constructor(paths, schemas, clientClassName, options = {}) {
|
|
281
298
|
this.schemas = schemas || {};
|
|
282
299
|
this.clientClassName = clientClassName;
|
|
283
300
|
this.stripPathPrefix = options.stripPathPrefix || null;
|
|
284
301
|
this.enumRegistry = options.enumRegistry || new EnumRegistry();
|
|
285
302
|
this.runtimePackage = options.runtimePackage || "@moinax/orc";
|
|
303
|
+
this.schemaPrefix = options.schemaPrefix || "";
|
|
286
304
|
this.paths = this.stripPathPrefix ? this.stripPrefixFromPaths(paths || {}) : paths || {};
|
|
287
305
|
this.pathTree = buildPathTree(this.paths);
|
|
288
306
|
}
|
|
@@ -318,7 +336,7 @@ var ResourceGenerator = class {
|
|
|
318
336
|
this.collectedInlineSchemas.set(schemaConstName, {
|
|
319
337
|
schema: bodySchema,
|
|
320
338
|
isInput: true,
|
|
321
|
-
typeName: `${
|
|
339
|
+
typeName: prefixTypeName(`${resourceClassName}${pascalCase(methodName)}Body`, this.schemaPrefix)
|
|
322
340
|
});
|
|
323
341
|
}
|
|
324
342
|
}
|
|
@@ -335,7 +353,7 @@ var ResourceGenerator = class {
|
|
|
335
353
|
this.collectedInlineSchemas.set(schemaConstName, {
|
|
336
354
|
schema: inlineSchema,
|
|
337
355
|
isInput: false,
|
|
338
|
-
typeName: `${
|
|
356
|
+
typeName: prefixTypeName(`${resourceClassName}${pascalCase(methodName)}Response`, this.schemaPrefix)
|
|
339
357
|
});
|
|
340
358
|
}
|
|
341
359
|
}
|
|
@@ -430,7 +448,8 @@ var ResourceGenerator = class {
|
|
|
430
448
|
return schema.type === "object" && !!schema.properties;
|
|
431
449
|
}
|
|
432
450
|
generateInlineSchemaName(resourceName, methodName, purpose) {
|
|
433
|
-
const
|
|
451
|
+
const prefix = this.schemaPrefix ? camelCase(this.schemaPrefix) : "";
|
|
452
|
+
const baseName = `${prefix}${prefix ? pascalCase(resourceName) : camelCase(resourceName)}${capitalize(methodName)}${capitalize(purpose)}Schema`;
|
|
434
453
|
return camelCase(baseName);
|
|
435
454
|
}
|
|
436
455
|
getPathParams(operation) {
|
|
@@ -576,15 +595,15 @@ var ResourceGenerator = class {
|
|
|
576
595
|
for (const { pathPattern, operation } of node.operations) {
|
|
577
596
|
const responseSchema = this.getResponseSchemaName(operation, pathPattern);
|
|
578
597
|
if (responseSchema) {
|
|
579
|
-
const schemaConst =
|
|
598
|
+
const schemaConst = prefixSchemaConst(responseSchema, this.schemaPrefix);
|
|
580
599
|
schemaImports.add(schemaConst);
|
|
581
|
-
typeImports.set(schemaConst,
|
|
600
|
+
typeImports.set(schemaConst, prefixTypeName(responseSchema, this.schemaPrefix));
|
|
582
601
|
}
|
|
583
602
|
const requestSchema = this.getRequestSchemaName(operation, pathPattern);
|
|
584
603
|
if (requestSchema) {
|
|
585
|
-
const schemaConst =
|
|
604
|
+
const schemaConst = prefixSchemaConst(requestSchema, this.schemaPrefix);
|
|
586
605
|
schemaImports.add(schemaConst);
|
|
587
|
-
typeImports.set(schemaConst,
|
|
606
|
+
typeImports.set(schemaConst, prefixTypeName(requestSchema, this.schemaPrefix));
|
|
588
607
|
}
|
|
589
608
|
}
|
|
590
609
|
const inlineBodySchemas = /* @__PURE__ */ new Map();
|
|
@@ -645,7 +664,7 @@ var ResourceGenerator = class {
|
|
|
645
664
|
if (queryParams.length > 0) {
|
|
646
665
|
const opKey = this.getOperationKey(pathPattern, httpMethod);
|
|
647
666
|
const methodName = operationMethodNames.get(opKey);
|
|
648
|
-
const { schemaConstName, typeName } = getResourcePrefixedParamNames(methodName, resourceClassName);
|
|
667
|
+
const { schemaConstName, typeName } = getResourcePrefixedParamNames(methodName, resourceClassName, this.schemaPrefix);
|
|
649
668
|
const specificParams = queryParams.filter((p) => !this.isPaginationParam(p.name));
|
|
650
669
|
if (specificParams.length > 0) {
|
|
651
670
|
const props = specificParams.map((p) => {
|
|
@@ -701,14 +720,14 @@ ${props.join(",\n")},
|
|
|
701
720
|
params.push(`${p.name}: ${p.type}`);
|
|
702
721
|
}
|
|
703
722
|
if (queryParams.length > 0) {
|
|
704
|
-
const { typeName } = getResourcePrefixedParamNames(methodName, resourceClassName);
|
|
723
|
+
const { typeName } = getResourcePrefixedParamNames(methodName, resourceClassName, this.schemaPrefix);
|
|
705
724
|
const hasRequired = queryParams.some((p) => p.required);
|
|
706
725
|
params.push(`params${hasRequired ? "" : "?"}: ${typeName}`);
|
|
707
726
|
}
|
|
708
727
|
const inlineBodySchema = inlineBodySchemas.get(opKey);
|
|
709
728
|
if (["post", "put", "patch"].includes(httpMethod) && operation.requestBody) {
|
|
710
729
|
if (requestSchema) {
|
|
711
|
-
const schemaConst =
|
|
730
|
+
const schemaConst = prefixSchemaConst(requestSchema, this.schemaPrefix);
|
|
712
731
|
const typeName = typeImports.get(schemaConst);
|
|
713
732
|
params.push(`body: ${typeName}`);
|
|
714
733
|
} else if (inlineBodySchema) {
|
|
@@ -731,8 +750,8 @@ ${props.join(",\n")},
|
|
|
731
750
|
if (dataRef) {
|
|
732
751
|
const rawItemSchema = dataRef.split("/").pop();
|
|
733
752
|
const itemSchema = cleanSchemaName(rawItemSchema);
|
|
734
|
-
const itemSchemaConst =
|
|
735
|
-
const itemTypeName =
|
|
753
|
+
const itemSchemaConst = prefixSchemaConst(itemSchema, this.schemaPrefix);
|
|
754
|
+
const itemTypeName = prefixTypeName(itemSchema, this.schemaPrefix);
|
|
736
755
|
schemaImports.add(itemSchemaConst);
|
|
737
756
|
typeImports.set(itemSchemaConst, itemTypeName);
|
|
738
757
|
returnType = `{ pagination: PaginationResponse; data: ${itemTypeName}[] }`;
|
|
@@ -740,8 +759,8 @@ ${props.join(",\n")},
|
|
|
740
759
|
return parseSchema(schema, response);`;
|
|
741
760
|
} else {
|
|
742
761
|
if (responseSchema) {
|
|
743
|
-
const itemSchemaConst =
|
|
744
|
-
const itemTypeName =
|
|
762
|
+
const itemSchemaConst = prefixSchemaConst(responseSchema, this.schemaPrefix);
|
|
763
|
+
const itemTypeName = prefixTypeName(responseSchema, this.schemaPrefix);
|
|
745
764
|
schemaImports.add(itemSchemaConst);
|
|
746
765
|
typeImports.set(itemSchemaConst, itemTypeName);
|
|
747
766
|
returnType = `{ pagination: PaginationResponse; data: ${itemTypeName}[] }`;
|
|
@@ -754,8 +773,8 @@ ${props.join(",\n")},
|
|
|
754
773
|
}
|
|
755
774
|
}
|
|
756
775
|
} else if (responseSchema) {
|
|
757
|
-
const schemaConstName =
|
|
758
|
-
const typeName =
|
|
776
|
+
const schemaConstName = prefixSchemaConst(responseSchema, this.schemaPrefix);
|
|
777
|
+
const typeName = prefixTypeName(responseSchema, this.schemaPrefix);
|
|
759
778
|
returnType = typeName;
|
|
760
779
|
parseLogic = `return parseSchema(${schemaConstName}, response);`;
|
|
761
780
|
schemaImports.add(schemaConstName);
|
|
@@ -772,7 +791,7 @@ ${props.join(",\n")},
|
|
|
772
791
|
lines.push("");
|
|
773
792
|
lines.push(` async ${methodName}(${params.join(", ")}): Promise<${returnType}> {`);
|
|
774
793
|
if (queryParams.length > 0) {
|
|
775
|
-
const { schemaConstName } = getResourcePrefixedParamNames(methodName, resourceClassName);
|
|
794
|
+
const { schemaConstName } = getResourcePrefixedParamNames(methodName, resourceClassName, this.schemaPrefix);
|
|
776
795
|
lines.push(` const searchParams = new URLSearchParams();`);
|
|
777
796
|
lines.push(` if (params) {`);
|
|
778
797
|
lines.push(` const validated = parseSchema(${schemaConstName}, params);`);
|
|
@@ -790,7 +809,7 @@ ${props.join(",\n")},
|
|
|
790
809
|
const hasBodyValidation = ["post", "put", "patch"].includes(httpMethod) && hasBodySchema;
|
|
791
810
|
const bodyVar = hasBodyValidation ? "validatedBody" : "body";
|
|
792
811
|
if (hasBodyValidation) {
|
|
793
|
-
const bodySchemaConst = requestSchema ?
|
|
812
|
+
const bodySchemaConst = requestSchema ? prefixSchemaConst(requestSchema, this.schemaPrefix) : inlineBodySchema.schemaConst;
|
|
794
813
|
lines.push(` const validatedBody = parseSchema(${bodySchemaConst}, body);`);
|
|
795
814
|
}
|
|
796
815
|
switch (httpMethod) {
|
|
@@ -877,9 +896,11 @@ var ZodGenerator = class {
|
|
|
877
896
|
};
|
|
878
897
|
currentSchemaName = null;
|
|
879
898
|
currentPropertyPath = null;
|
|
880
|
-
|
|
899
|
+
schemaPrefix;
|
|
900
|
+
constructor(schemas, enumRegistry, schemaPrefix) {
|
|
881
901
|
this.schemas = schemas || {};
|
|
882
902
|
this.enumRegistry = enumRegistry || new EnumRegistry();
|
|
903
|
+
this.schemaPrefix = schemaPrefix || "";
|
|
883
904
|
}
|
|
884
905
|
addInlineSchemas(inlineSchemas) {
|
|
885
906
|
this.inlineSchemas = inlineSchemas;
|
|
@@ -889,7 +910,7 @@ var ZodGenerator = class {
|
|
|
889
910
|
if (schema.$ref) {
|
|
890
911
|
const refName = schema.$ref.split("/").pop();
|
|
891
912
|
const cleanedName = cleanSchemaName(refName);
|
|
892
|
-
return
|
|
913
|
+
return prefixSchemaConst(cleanedName, this.schemaPrefix);
|
|
893
914
|
}
|
|
894
915
|
if (schema.anyOf) {
|
|
895
916
|
const options = schema.anyOf.map((s) => this.convertSchema(s, schemaName));
|
|
@@ -1174,8 +1195,8 @@ ${properties.join(",\n")}
|
|
|
1174
1195
|
} else if (cleanName.endsWith("Schema")) {
|
|
1175
1196
|
cleanName = cleanName.replace("Schema", "");
|
|
1176
1197
|
}
|
|
1177
|
-
const schemaConstName =
|
|
1178
|
-
const typeName =
|
|
1198
|
+
const schemaConstName = prefixSchemaConst(cleanName, this.schemaPrefix);
|
|
1199
|
+
const typeName = prefixTypeName(cleanName, this.schemaPrefix);
|
|
1179
1200
|
if (usedNames.has(schemaConstName) || usedNames.has(typeName)) {
|
|
1180
1201
|
continue;
|
|
1181
1202
|
}
|
|
@@ -1302,16 +1323,17 @@ ${"=".repeat(60)}`);
|
|
|
1302
1323
|
Cleaned up ${outputDir}`);
|
|
1303
1324
|
}
|
|
1304
1325
|
const spec = await loadSpec(specUrl);
|
|
1305
|
-
const enumRegistry = new EnumRegistry();
|
|
1326
|
+
const enumRegistry = new EnumRegistry(config.schemaPrefix);
|
|
1306
1327
|
const resourceGenerator = new ResourceGenerator(spec.paths, spec.components?.schemas, clientClassName, {
|
|
1307
1328
|
stripPathPrefix: config.stripPathPrefix,
|
|
1308
1329
|
enumRegistry,
|
|
1309
|
-
runtimePackage
|
|
1330
|
+
runtimePackage,
|
|
1331
|
+
schemaPrefix: config.schemaPrefix
|
|
1310
1332
|
});
|
|
1311
1333
|
console.log("\nGenerating resource classes...");
|
|
1312
1334
|
const { resources, tree, inlineSchemas } = resourceGenerator.generateAll();
|
|
1313
1335
|
console.log("\nGenerating Zod schemas...");
|
|
1314
|
-
const zodGenerator = new ZodGenerator(spec.components?.schemas, enumRegistry);
|
|
1336
|
+
const zodGenerator = new ZodGenerator(spec.components?.schemas, enumRegistry, config.schemaPrefix);
|
|
1315
1337
|
zodGenerator.addInlineSchemas(inlineSchemas);
|
|
1316
1338
|
const schemasCode = zodGenerator.generateSchemas(runtimePackage);
|
|
1317
1339
|
const generatedFiles = [];
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/generator/client-generator.ts","../src/generator/enum-registry.ts","../src/generator/utils.ts","../src/generator/resource-generator.ts","../src/generator/zod-generator.ts","../src/generator/file-writer.ts","../src/generator/spec-loader.ts","../src/cli/commands/generate.ts","../src/cli/commands/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport path from 'path';\nimport fs from 'fs';\nimport { createJiti } from 'jiti';\nimport type { OrcConfig } from './generator/config';\nimport { runGenerate } from './cli/commands/generate';\nimport { runInit } from './cli/commands/init';\n\nconst CONFIG_NAMES = ['orc.config.ts', 'orc.config.js', 'orc.config.mjs'];\n\nasync function loadConfig(): Promise<OrcConfig> {\n const cwd = process.cwd();\n\n for (const configName of CONFIG_NAMES) {\n const configPath = path.join(cwd, configName);\n if (fs.existsSync(configPath)) {\n console.log(`Using config: ${configPath}`);\n const jiti = createJiti(cwd, { interopDefault: true });\n const config = await jiti.import(configPath) as OrcConfig;\n return config;\n }\n }\n\n throw new Error(\n `No config file found. Create one with 'orc init' or add one of: ${CONFIG_NAMES.join(', ')}`,\n );\n}\n\nconst program = new Command();\n\nprogram\n .name('orc')\n .description('ORC - OpenAPI Rest Client Generator')\n .version('0.1.0');\n\nprogram\n .command('generate')\n .description('Generate TypeScript API clients from OpenAPI specs')\n .option('-c, --client <name>', 'Generate a specific client only')\n .option('-s, --spec <url>', 'Override spec URL (requires --client)')\n .action(async (options) => {\n const config = await loadConfig();\n await runGenerate(config, options);\n });\n\nprogram\n .command('init')\n .description('Scaffold a new orc.config.ts file')\n .action(async () => {\n await runInit();\n });\n\nprogram.parse();\n","import fs from 'fs';\nimport path from 'path';\nimport { EnumRegistry } from './enum-registry';\nimport { ResourceGenerator } from './resource-generator';\nimport { ZodGenerator } from './zod-generator';\nimport { writeFile, type GeneratedFile } from './file-writer';\nimport { loadSpec } from './spec-loader';\nimport {\n validateFileName,\n validateOutputPath,\n pascalCase,\n singularize,\n camelCase,\n} from './utils';\nimport type { ClientConfig } from './config';\n\nexport interface GenerateResult {\n name: string;\n resourceNames: string[];\n files?: GeneratedFile[];\n}\n\nexport async function generateClient(\n config: ClientConfig,\n options: {\n specOverride?: string;\n write?: boolean;\n runtimePackage?: string;\n } = {},\n): Promise<GenerateResult> {\n const { name, output } = config;\n const specUrl = options.specOverride || config.spec;\n const shouldWrite = options.write !== false;\n const runtimePackage = options.runtimePackage || '@moinax/orc';\n\n validateOutputPath(output);\n\n const outputDir = path.join(output, 'generated');\n const clientClassName = `${name}Client`;\n\n validateFileName(clientClassName, 'client class name');\n\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Generating ${clientClassName}...`);\n console.log(`${'='.repeat(60)}`);\n\n // Clean up previously generated files\n if (shouldWrite && fs.existsSync(outputDir)) {\n fs.rmSync(outputDir, { recursive: true });\n console.log(`\\nCleaned up ${outputDir}`);\n }\n\n // Fetch/load OpenAPI spec\n const spec = await loadSpec(specUrl);\n\n // Create shared enum registry\n const enumRegistry = new EnumRegistry();\n\n // Create resource generator\n const resourceGenerator = new ResourceGenerator(spec.paths, spec.components?.schemas, clientClassName, {\n stripPathPrefix: config.stripPathPrefix,\n enumRegistry,\n runtimePackage,\n });\n\n // Generate resources FIRST (registers query param enums)\n console.log('\\nGenerating resource classes...');\n const { resources, tree, inlineSchemas } = resourceGenerator.generateAll();\n\n // Generate schemas (including inline schemas from resources)\n console.log('\\nGenerating Zod schemas...');\n const zodGenerator = new ZodGenerator(spec.components?.schemas, enumRegistry);\n zodGenerator.addInlineSchemas(inlineSchemas);\n const schemasCode = zodGenerator.generateSchemas(runtimePackage);\n\n const generatedFiles: GeneratedFile[] = [];\n\n // schemas.ts\n generatedFiles.push({\n path: path.join(outputDir, 'schemas.ts'),\n content: schemasCode,\n });\n\n // Resource files\n const resourceNames: string[] = [];\n for (const [resourceName, code] of Object.entries(resources)) {\n validateFileName(resourceName, 'resource name');\n generatedFiles.push({\n path: path.join(outputDir, 'resources', `${resourceName}.resource.ts`),\n content: code,\n });\n resourceNames.push(resourceName);\n }\n\n // Resources index\n const resourceIndexCode = resourceNames\n .map((resourceName) => `export { ${resourceName}Resource } from './${resourceName}.resource';`)\n .join('\\n');\n generatedFiles.push({\n path: path.join(outputDir, 'resources', 'index.ts'),\n content: resourceIndexCode,\n });\n\n // Resource base class\n const resourceBaseCode = `import type ${clientClassName} from './${clientClassName}';\nimport { Resource as BaseResource } from '${runtimePackage}';\n\nexport class Resource extends BaseResource {\n protected declare client: ${clientClassName};\n\n constructor(client: ${clientClassName}) {\n super(client);\n }\n}\n`;\n generatedFiles.push({\n path: path.join(outputDir, 'Resource.ts'),\n content: resourceBaseCode,\n });\n\n // Get top-level resources\n const topLevelResources: Array<{ propertyName: string; className: string }> = [];\n for (const [childName] of tree.children) {\n const className = pascalCase(childName);\n topLevelResources.push({\n propertyName: singularize(camelCase(childName)),\n className,\n });\n }\n\n // Client class\n console.log(`\\nGenerating ${clientClassName}...`);\n const resourceImports = topLevelResources.map((r) => `${r.className}Resource`).join(',\\n ');\n const resourceProperties = topLevelResources\n .map((r) => `public ${r.propertyName}: ${r.className}Resource;`)\n .join('\\n ');\n const resourceInstantiations = topLevelResources\n .map((r) => `this.${r.propertyName} = new ${r.className}Resource(this);`)\n .join('\\n ');\n\n const clientCode = `import { Client, ClientOptions } from '${runtimePackage}';\n\nimport {\n ${resourceImports},\n} from './resources';\n\nexport default class ${clientClassName} extends Client {\n ${resourceProperties}\n\n constructor(baseUrl: string, options: ClientOptions = {}) {\n super(baseUrl, options);\n ${resourceInstantiations}\n }\n}\n`;\n generatedFiles.push({\n path: path.join(outputDir, `${clientClassName}.ts`),\n content: clientCode,\n });\n\n // Main index\n const mainIndexCode = `export { default as ${clientClassName} } from './${clientClassName}';\nexport * from './schemas';\nexport * from './resources';\n`;\n generatedFiles.push({\n path: path.join(outputDir, 'index.ts'),\n content: mainIndexCode,\n });\n\n // Write files if not in dry-run mode\n if (shouldWrite) {\n for (const file of generatedFiles) {\n await writeFile(file.path, file.content);\n }\n }\n\n console.log(`\\n${clientClassName} generation complete!`);\n\n return {\n name,\n resourceNames: topLevelResources.map((r) => r.className),\n files: shouldWrite ? undefined : generatedFiles,\n };\n}\n","import pluralizeLib from 'pluralize';\nimport { camelCase, pascalCase, singularize } from './utils';\n\nexport interface EnumContext {\n source: 'schema' | 'queryParam';\n schemaName?: string;\n propertyPath?: string;\n paramName?: string;\n resourceName?: string;\n}\n\nexport interface EnumInfo {\n valuesConstName: string;\n schemaConstName: string;\n typeName: string;\n values: string[];\n}\n\nexport class EnumRegistry {\n private enums = new Map<string, EnumInfo>();\n private enumContexts = new Map<string, EnumContext[]>();\n private usedNames = new Set<string>();\n\n static fingerprint(values: string[]): string {\n return JSON.stringify([...values].sort());\n }\n\n generateEnumNames(values: string[], context: EnumContext): EnumInfo {\n const { source, schemaName, propertyPath, paramName, resourceName } = context;\n\n let baseName: string;\n if (source === 'schema' && schemaName && propertyPath) {\n const cleanSchemaName = schemaName\n .replace(/Schema$/, '')\n .replace(/SchemaInput$/, '')\n .replace(/Input$/, '');\n\n const pathParts = propertyPath.split('.');\n const contextFromPath = pathParts.map((p) => pascalCase(singularize(p))).join('');\n baseName = camelCase(cleanSchemaName) + contextFromPath;\n } else if (source === 'queryParam' && resourceName && paramName) {\n const singularResource = singularize(resourceName);\n baseName = camelCase(singularResource) + pascalCase(paramName);\n } else {\n baseName = camelCase(values[0].toLowerCase());\n }\n\n const valuesConstName = pluralizeLib.isPlural(baseName) ? baseName : pluralizeLib.plural(baseName);\n\n return {\n valuesConstName,\n schemaConstName: `${singularize(baseName)}Schema`,\n typeName: pascalCase(singularize(baseName)),\n values,\n };\n }\n\n register(values: string[], context: EnumContext): EnumInfo {\n const fingerprint = EnumRegistry.fingerprint(values);\n\n if (!this.enumContexts.has(fingerprint)) {\n this.enumContexts.set(fingerprint, []);\n }\n this.enumContexts.get(fingerprint)!.push(context);\n\n if (this.enums.has(fingerprint)) {\n return this.enums.get(fingerprint)!;\n }\n\n let enumInfo = this.generateEnumNames(values, context);\n\n let counter = 1;\n const hasCollision = () =>\n this.usedNames.has(enumInfo.valuesConstName) ||\n this.usedNames.has(enumInfo.schemaConstName) ||\n this.usedNames.has(enumInfo.typeName);\n\n while (hasCollision()) {\n const baseInfo = this.generateEnumNames(values, context);\n enumInfo = {\n valuesConstName: `${baseInfo.valuesConstName}${counter}`,\n schemaConstName: `${baseInfo.schemaConstName.replace(/Schema$/, '')}${counter}Schema`,\n typeName: `${baseInfo.typeName}${counter}`,\n values: baseInfo.values,\n };\n counter++;\n }\n\n this.usedNames.add(enumInfo.valuesConstName);\n this.usedNames.add(enumInfo.schemaConstName);\n this.usedNames.add(enumInfo.typeName);\n\n this.enums.set(fingerprint, enumInfo);\n return enumInfo;\n }\n\n has(values: string[]): boolean {\n return this.enums.has(EnumRegistry.fingerprint(values));\n }\n\n get(values: string[]): EnumInfo | undefined {\n return this.enums.get(EnumRegistry.fingerprint(values));\n }\n\n getAll(): EnumInfo[] {\n return Array.from(this.enums.values());\n }\n\n generateEnumExports(): string {\n const lines: string[] = [];\n\n if (this.enums.size === 0) {\n return '';\n }\n\n lines.push('// ============================================================================');\n lines.push('// Extracted Enums');\n lines.push('// ============================================================================');\n lines.push('');\n\n for (const enumInfo of this.enums.values()) {\n const { valuesConstName, schemaConstName, typeName, values } = enumInfo;\n const valuesStr = values.map((v) => `'${v}'`).join(', ');\n\n lines.push(`export const ${valuesConstName} = [${valuesStr}] as const;`);\n lines.push(`export const ${schemaConstName} = z.enum(${valuesConstName});`);\n lines.push(`export type ${typeName} = z.output<typeof ${schemaConstName}>;`);\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n}\n","import pluralizeLib from 'pluralize';\n\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function camelCase(str: string): string {\n const result = str\n .replace(/[-_.]+/g, '_')\n .replace(/_([a-zA-Z])/g, (_, char) => char.toUpperCase())\n .replace(/_+/g, '');\n\n return result.charAt(0).toLowerCase() + result.slice(1);\n}\n\nexport function pascalCase(str: string): string {\n return capitalize(camelCase(str));\n}\n\nexport function schemaConstToTypeName(schemaConstName: string): string {\n const withoutSuffix = schemaConstName.replace(/Schema$/, '');\n return pascalCase(withoutSuffix);\n}\n\nexport function singularize(str: string): string {\n const match = str.match(/^(.*)([A-Z][a-z]+s)$/);\n if (match) {\n const prefix = match[1];\n const lastWord = match[2];\n return prefix + pluralizeLib.singular(lastWord);\n }\n return pluralizeLib.singular(str);\n}\n\nexport function isBooleanLikeEnum(values: unknown[]): boolean {\n if (!Array.isArray(values) || values.length !== 2) return false;\n const sorted = [...values].sort();\n return sorted[0] === 'false' && sorted[1] === 'true';\n}\n\nexport function getResourcePrefixedParamNames(\n methodName: string,\n resourceClassName: string,\n): { schemaConstName: string; typeName: string } {\n const singularResource = singularize(resourceClassName);\n\n if (methodName.startsWith('get')) {\n const rest = methodName.slice(3);\n return {\n schemaConstName: `get${singularResource}${rest}ParamsSchema`,\n typeName: `Get${singularResource}${rest}Params`,\n };\n }\n\n return {\n schemaConstName: `${camelCase(methodName)}${singularResource}ParamsSchema`,\n typeName: `${pascalCase(methodName)}${singularResource}Params`,\n };\n}\n\nexport function validateFileName(name: string, context: string): void {\n if (!name || typeof name !== 'string') {\n throw new Error(`Invalid ${context}: must be a non-empty string`);\n }\n if (name.includes('..') || name.includes('/') || name.includes('\\\\')) {\n throw new Error(`Invalid ${context}: contains path traversal characters`);\n }\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(name)) {\n throw new Error(`Invalid ${context}: must be alphanumeric starting with a letter`);\n }\n}\n\nexport function validateOutputPath(outputPath: string): void {\n if (!outputPath || typeof outputPath !== 'string') {\n throw new Error('Invalid output path: must be a non-empty string');\n }\n if (outputPath.includes('..')) {\n throw new Error('Invalid output path: contains path traversal characters');\n }\n}\n\nexport interface OpenAPISchema {\n type?: string;\n format?: string;\n enum?: (string | null)[];\n const?: unknown;\n nullable?: boolean;\n $ref?: string;\n anyOf?: OpenAPISchema[];\n oneOf?: OpenAPISchema[];\n allOf?: OpenAPISchema[];\n items?: OpenAPISchema;\n properties?: Record<string, OpenAPISchema>;\n additionalProperties?: boolean | OpenAPISchema;\n required?: string[];\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n minimum?: number;\n maximum?: number;\n minItems?: number;\n maxItems?: number;\n description?: string;\n}\n\nexport interface OpenAPIParameter {\n name: string;\n in: string;\n required?: boolean;\n schema?: OpenAPISchema;\n}\n\nexport interface OpenAPIOperation {\n operationId?: string;\n summary?: string;\n tags?: string[];\n parameters?: OpenAPIParameter[];\n requestBody?: {\n content?: {\n 'application/json'?: {\n schema?: OpenAPISchema;\n };\n };\n };\n responses?: Record<\n string,\n {\n content?: {\n 'application/json'?: {\n schema?: OpenAPISchema;\n };\n };\n }\n >;\n}\n\nexport interface OpenAPISpec {\n openapi: string;\n info: { title: string; version?: string };\n paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>>;\n components?: {\n schemas?: Record<string, OpenAPISchema>;\n };\n}\n\nexport interface PathSegment {\n name: string;\n isParam: boolean;\n raw: string;\n}\n\nexport function isListResponse(responseSchema: OpenAPISchema | undefined): boolean {\n if (!responseSchema) return false;\n\n if (responseSchema.type === 'object' && responseSchema.properties?.pagination) {\n return true;\n }\n if (responseSchema.type === 'array') {\n return true;\n }\n if (responseSchema.type === 'object' && responseSchema.properties) {\n for (const arrayProp of ['data', 'items', 'results']) {\n const prop = responseSchema.properties[arrayProp];\n if (prop?.type === 'array') return true;\n }\n }\n if (responseSchema.$ref) {\n const refName = responseSchema.$ref.split('/').pop()!;\n if (refName.includes('Paginated') || refName.includes('List')) {\n return true;\n }\n }\n return false;\n}\n\nexport function deriveEntityFromPath(pathPattern: string, includeParentContext = false): string | null {\n const segments = pathPattern.split('/').filter((seg) => seg && !seg.startsWith('{'));\n if (segments.length === 0) return null;\n\n if (includeParentContext && segments.length >= 2) {\n const parentSegment = segments[segments.length - 2];\n const lastSegment = segments[segments.length - 1];\n const singularParent = parentSegment.endsWith('s') ? parentSegment.slice(0, -1) : parentSegment;\n return pascalCase(singularParent) + pascalCase(lastSegment);\n }\n\n const lastSegment = segments[segments.length - 1];\n return pascalCase(lastSegment);\n}\n\nexport function isActionWord(word: string): boolean {\n const knownActions = ['status', 'approve', 'cancel', 'current', 'download_link', 'preferences'];\n if (knownActions.includes(word.toLowerCase())) return true;\n if (word.endsWith('s') && !word.endsWith('ss') && !word.endsWith('us')) {\n return false;\n }\n return true;\n}\n\nexport function operationIdToMethodName(\n operationId: string | undefined,\n httpMethod: string,\n pathPattern: string,\n resourceName: string,\n responseSchema: OpenAPISchema | undefined,\n): string {\n const isList = isListResponse(responseSchema);\n\n switch (httpMethod) {\n case 'get':\n return isList ? 'getList' : 'getDetail';\n case 'post':\n return 'create';\n case 'put':\n return 'replace';\n case 'patch':\n return 'update';\n case 'delete':\n return 'delete';\n default:\n return operationId ? camelCase(operationId) : httpMethod;\n }\n}\n\nexport function parsePathSegments(pathPattern: string): PathSegment[] {\n return pathPattern\n .split('/')\n .filter((seg) => seg)\n .map((seg) => ({\n name: seg.startsWith('{') ? seg.slice(1, -1) : seg,\n isParam: seg.startsWith('{'),\n raw: seg,\n }));\n}\n\nexport function getResourcePath(pathPattern: string): string[] {\n const segments = parsePathSegments(pathPattern);\n const resourcePath: string[] = [];\n for (const seg of segments) {\n if (!seg.isParam) {\n resourcePath.push(seg.name);\n }\n }\n return resourcePath;\n}\n\nexport interface PathTreeNode {\n name: string;\n children: Map<string, PathTreeNode>;\n operations: Array<{\n pathPattern: string;\n httpMethod: string;\n operation: OpenAPIOperation;\n }>;\n}\n\nexport function buildPathTree(paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>>): PathTreeNode {\n const tree: PathTreeNode = {\n name: 'root',\n children: new Map(),\n operations: [],\n };\n\n for (const [pathPattern, methods] of Object.entries(paths)) {\n for (const [httpMethod, operation] of Object.entries(methods)) {\n if (httpMethod === 'parameters') continue;\n\n const resourcePath = getResourcePath(pathPattern);\n\n let current = tree;\n for (const segment of resourcePath) {\n if (!current.children.has(segment)) {\n current.children.set(segment, {\n name: segment,\n children: new Map(),\n operations: [],\n });\n }\n current = current.children.get(segment)!;\n }\n\n current.operations.push({\n pathPattern,\n httpMethod,\n operation: operation as OpenAPIOperation,\n });\n }\n }\n\n return tree;\n}\n\nexport function cleanSchemaName(name: string): string {\n if (name.endsWith('SchemaInput')) {\n name = name.replace('SchemaInput', 'Input');\n } else if (name.endsWith('Schema')) {\n name = name.replace('Schema', '');\n }\n\n if (name.includes('__')) {\n const parts = name.split('__');\n name = parts[parts.length - 1];\n }\n\n name = name.replace(/_+$/, '');\n name = name.replace(/_([A-Za-z])/g, (_, char) => char.toUpperCase());\n\n return name;\n}\n","import { EnumRegistry } from './enum-registry';\nimport { ZodGenerator } from './zod-generator';\nimport {\n camelCase,\n pascalCase,\n singularize,\n capitalize,\n schemaConstToTypeName,\n isBooleanLikeEnum,\n getResourcePrefixedParamNames,\n operationIdToMethodName,\n getResourcePath,\n buildPathTree,\n cleanSchemaName,\n OpenAPISchema,\n OpenAPIOperation,\n OpenAPIParameter,\n PathTreeNode,\n} from './utils';\n\ninterface ResourceResult {\n className: string;\n code: string;\n children: Array<{ propertyName: string; className: string; fileName: string }>;\n}\n\nexport class ResourceGenerator {\n private schemas: Record<string, OpenAPISchema>;\n private clientClassName: string;\n private stripPathPrefix: string | null;\n public enumRegistry: EnumRegistry;\n private paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>>;\n private pathTree: PathTreeNode;\n private generatedResources = new Map<string, ResourceResult>();\n public collectedInlineSchemas = new Map<\n string,\n { schema: OpenAPISchema; isInput: boolean; typeName: string }\n >();\n private currentResourceName: string | null = null;\n private runtimePackage: string;\n\n constructor(\n paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>> | undefined,\n schemas: Record<string, OpenAPISchema> | undefined,\n clientClassName: string,\n options: {\n stripPathPrefix?: string;\n enumRegistry?: EnumRegistry;\n runtimePackage?: string;\n } = {},\n ) {\n this.schemas = schemas || {};\n this.clientClassName = clientClassName;\n this.stripPathPrefix = options.stripPathPrefix || null;\n this.enumRegistry = options.enumRegistry || new EnumRegistry();\n this.runtimePackage = options.runtimePackage || '@moinax/orc';\n\n this.paths = this.stripPathPrefix ? this.stripPrefixFromPaths(paths || {}) : paths || {};\n this.pathTree = buildPathTree(this.paths);\n }\n\n collectAllInlineSchemas(): Map<string, { schema: OpenAPISchema; isInput: boolean; typeName: string }> {\n this._collectInlineSchemasFromNode(this.pathTree, []);\n return this.collectedInlineSchemas;\n }\n\n private _collectInlineSchemasFromNode(node: PathTreeNode, parentPath: string[]): void {\n const nodeName = node.name === 'root' ? '' : node.name;\n const currentPath = [...parentPath, nodeName].filter(Boolean);\n\n const operationMethodNames = new Map<string, string>();\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n const responseSchemaObj = (\n operation.responses?.['200'] || operation.responses?.['201']\n )?.content?.['application/json']?.schema;\n const methodName = operationIdToMethodName(\n operation.operationId,\n httpMethod,\n pathPattern,\n node.name,\n responseSchemaObj,\n );\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n operationMethodNames.set(opKey, methodName);\n }\n\n const resourceClassName = this.getResourceClassName(currentPath);\n\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n if (this.hasInlineRequestBody(operation)) {\n const requestSchema = this.getRequestSchemaName(operation, pathPattern);\n if (!requestSchema) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const schemaConstName = this.generateInlineSchemaName(resourceClassName, methodName, 'body');\n\n const bodySchema = operation.requestBody!.content!['application/json']!.schema!;\n this.collectedInlineSchemas.set(schemaConstName, {\n schema: bodySchema,\n isInput: true,\n typeName: `${pascalCase(resourceClassName)}${pascalCase(methodName)}Body`,\n });\n }\n }\n }\n\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n if (this.hasInlineResponseSchema(operation)) {\n const responseSchema = this.getResponseSchemaName(operation, pathPattern);\n if (!responseSchema) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const schemaConstName = this.generateInlineSchemaName(resourceClassName, methodName, 'response');\n\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n const inlineSchema = successResponse!.content!['application/json']!.schema!;\n this.collectedInlineSchemas.set(schemaConstName, {\n schema: inlineSchema,\n isInput: false,\n typeName: `${pascalCase(resourceClassName)}${pascalCase(methodName)}Response`,\n });\n }\n }\n }\n\n for (const [, childNode] of node.children) {\n this._collectInlineSchemasFromNode(childNode, currentPath);\n }\n }\n\n private stripPrefixFromPaths(\n paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>>,\n ): Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>> {\n const result: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>> = {};\n for (const [pathPattern, methods] of Object.entries(paths)) {\n let newPath = pathPattern;\n if (this.stripPathPrefix && pathPattern.startsWith(this.stripPathPrefix)) {\n newPath = pathPattern.slice(this.stripPathPrefix.length) || '/';\n }\n result[newPath] = methods;\n }\n return result;\n }\n\n private getResponseSchemaName(operation: OpenAPIOperation, pathPattern: string | null = null): string | null {\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n if (!successResponse) return null;\n\n const content = successResponse.content?.['application/json'];\n if (!content?.schema) return null;\n\n const schema = content.schema;\n if (schema.$ref) {\n const rawName = schema.$ref.split('/').pop()!;\n return cleanSchemaName(rawName);\n }\n\n if (schema.type === 'object') {\n if (operation.operationId) {\n const opId = operation.operationId;\n const patterns = [\n /^create[_-]?(.+)$/i,\n /^update[_-]?(.+)$/i,\n /^get[_-]?(.+)$/i,\n /^(.+)[_-]?create$/i,\n /^(.+)[_-]?update$/i,\n /^(.+)[_-]?get$/i,\n ];\n\n for (const pattern of patterns) {\n const match = opId.match(pattern);\n if (match) {\n const entityName = pascalCase(match[1].replace(/[_-]/g, ' '));\n const schemaSchemaName = `${entityName}Schema`;\n if (this.schemas[entityName] || this.schemas[schemaSchemaName]) {\n return entityName;\n }\n }\n }\n }\n\n if (pathPattern) {\n const resourcePath = getResourcePath(pathPattern);\n if (resourcePath.length > 0) {\n const lastSegment = resourcePath[resourcePath.length - 1];\n const entityName = pascalCase(singularize(lastSegment));\n const schemaSchemaName = `${entityName}Schema`;\n if (this.schemas[entityName] || this.schemas[schemaSchemaName]) {\n return entityName;\n }\n }\n }\n }\n\n if (schema.type === 'object' && schema.properties) {\n return null;\n }\n\n return null;\n }\n\n private getRequestSchemaName(operation: OpenAPIOperation, pathPattern: string | null = null): string | null {\n const content = operation.requestBody?.content?.['application/json'];\n if (!content?.schema) return null;\n\n const schema = content.schema;\n if (schema.$ref) {\n const rawName = schema.$ref.split('/').pop()!;\n return cleanSchemaName(rawName);\n }\n\n return null;\n }\n\n private hasInlineRequestBody(operation: OpenAPIOperation): boolean {\n const content = operation.requestBody?.content?.['application/json'];\n if (!content?.schema) return false;\n return !content.schema.$ref && content.schema.type === 'object';\n }\n\n private hasInlineResponseSchema(operation: OpenAPIOperation): boolean {\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n if (!successResponse) return false;\n\n const content = successResponse.content?.['application/json'];\n if (!content?.schema) return false;\n\n const schema = content.schema;\n if (schema.$ref) return false;\n if (schema.type === 'object' && schema.properties?.pagination) return false;\n return schema.type === 'object' && !!schema.properties;\n }\n\n private generateInlineSchemaName(resourceName: string, methodName: string, purpose: string): string {\n const baseName = `${camelCase(resourceName)}${capitalize(methodName)}${capitalize(purpose)}Schema`;\n return camelCase(baseName);\n }\n\n private getPathParams(operation: OpenAPIOperation): Array<{ name: string; type: string; required: boolean }> {\n return (operation.parameters || [])\n .filter((p): p is OpenAPIParameter => 'in' in p && p.in === 'path')\n .map((p) => ({\n name: p.name,\n type: this.paramTypeToTs(p.schema),\n required: p.required !== false,\n }));\n }\n\n private getQueryParams(\n operation: OpenAPIOperation,\n ): Array<{ name: string; type: string; required: boolean; schema?: OpenAPISchema }> {\n return (operation.parameters || [])\n .filter((p): p is OpenAPIParameter => 'in' in p && p.in === 'query')\n .map((p) => ({\n name: p.name,\n type: this.paramTypeToTs(p.schema),\n required: p.required === true,\n schema: p.schema,\n }));\n }\n\n private paramTypeToTs(schema?: OpenAPISchema): string {\n if (!schema) return 'string';\n if (schema.enum) return schema.enum.map((v) => `'${v}'`).join(' | ');\n switch (schema.type) {\n case 'integer':\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n default:\n return 'string';\n }\n }\n\n private paramToZod(\n param: { name: string; required: boolean; schema?: OpenAPISchema },\n resourceName?: string,\n ): string {\n const { schema, name: paramName } = param;\n if (!schema) return 'z.string()';\n\n let zodType: string;\n if (schema.enum) {\n if (isBooleanLikeEnum(schema.enum)) {\n zodType = 'z.boolean()';\n } else {\n const context = {\n source: 'queryParam' as const,\n resourceName: resourceName || this.currentResourceName || undefined,\n paramName: paramName,\n };\n const enumInfo = this.enumRegistry.register(schema.enum, context);\n zodType = enumInfo.schemaConstName;\n }\n } else {\n switch (schema.type) {\n case 'integer':\n zodType = 'z.number().int()';\n break;\n case 'number':\n zodType = 'z.number()';\n break;\n case 'boolean':\n zodType = 'z.boolean()';\n break;\n default:\n zodType = 'z.string()';\n }\n }\n\n if (!param.required) {\n zodType = `${zodType}.optional()`;\n }\n\n return zodType;\n }\n\n private isPaginationParam(paramName: string): boolean {\n return ['page', 'limit', 'orderBy', 'ordering'].includes(paramName);\n }\n\n private getUniqueMethodName(\n operationId: string | undefined,\n httpMethod: string,\n pathPattern: string,\n usedNames: Set<string>,\n responseSchema?: OpenAPISchema,\n ): string {\n let methodName = operationIdToMethodName(operationId, httpMethod, pathPattern, '', responseSchema);\n\n if (usedNames.has(methodName) && operationId) {\n methodName = camelCase(operationId);\n }\n\n let finalName = methodName;\n let counter = 1;\n while (usedNames.has(finalName)) {\n finalName = `${methodName}${counter}`;\n counter++;\n }\n\n usedNames.add(finalName);\n return finalName;\n }\n\n private getOperationKey(pathPattern: string, httpMethod: string): string {\n return `${httpMethod}:${pathPattern}`;\n }\n\n private getResourceClassName(pathSegments: string[]): string {\n return pathSegments.map((seg) => pascalCase(seg)).join('');\n }\n\n private generateResourceNode(node: PathTreeNode, pathSegments: string[]): ResourceResult {\n const parentImportPath = '../';\n const resourceClassName = this.getResourceClassName(pathSegments);\n\n this.currentResourceName = resourceClassName;\n\n const lines: string[] = [];\n const usedMethodNames = new Set<string>();\n const schemaImports = new Set<string>();\n let hasQueryParams = false;\n let hasPaginatedResponse = false;\n\n const childResources: Array<{ propertyName: string; className: string; fileName: string }> = [];\n for (const [childName, childNode] of node.children) {\n const childPath = [...pathSegments, childName];\n const childClassName = this.getResourceClassName(childPath);\n childResources.push({\n propertyName: singularize(camelCase(childName)),\n className: childClassName,\n fileName: `${childClassName}.resource`,\n });\n }\n\n const operationMethodNames = new Map<string, string>();\n let usesInlineZod = false;\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n const responseContent = successResponse?.content?.['application/json'];\n const responseSchemaObj = responseContent?.schema;\n\n const methodName = this.getUniqueMethodName(\n operation.operationId,\n httpMethod,\n pathPattern,\n usedMethodNames,\n responseSchemaObj,\n );\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n operationMethodNames.set(opKey, methodName);\n\n const queryParams = this.getQueryParams(operation);\n if (queryParams.length > 0) {\n hasQueryParams = true;\n }\n\n if (responseSchemaObj?.type === 'object' && responseSchemaObj?.properties?.pagination) {\n hasPaginatedResponse = true;\n }\n\n if (\n responseSchemaObj?.type === 'object' &&\n responseSchemaObj?.properties?.pagination &&\n !responseSchemaObj?.properties?.data?.items?.$ref\n ) {\n usesInlineZod = true;\n }\n }\n\n const typeImports = new Map<string, string>();\n\n if (hasQueryParams) {\n schemaImports.add('paginationParamsSchema');\n }\n if (hasPaginatedResponse) {\n schemaImports.add('paginationResponseSchema');\n typeImports.set('paginationResponseSchema', 'PaginationResponse');\n }\n\n for (const { pathPattern, operation } of node.operations) {\n const responseSchema = this.getResponseSchemaName(operation, pathPattern);\n if (responseSchema) {\n const schemaConst = `${camelCase(responseSchema)}Schema`;\n schemaImports.add(schemaConst);\n typeImports.set(schemaConst, pascalCase(responseSchema));\n }\n const requestSchema = this.getRequestSchemaName(operation, pathPattern);\n if (requestSchema) {\n const schemaConst = `${camelCase(requestSchema)}Schema`;\n schemaImports.add(schemaConst);\n typeImports.set(schemaConst, pascalCase(requestSchema));\n }\n }\n\n const inlineBodySchemas = new Map<string, { schemaConst: string; typeName: string }>();\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n if (this.hasInlineRequestBody(operation)) {\n const requestSchema = this.getRequestSchemaName(operation, pathPattern);\n if (!requestSchema) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const schemaConstName = this.generateInlineSchemaName(resourceClassName, methodName, 'body');\n const typeName = schemaConstToTypeName(schemaConstName);\n inlineBodySchemas.set(opKey, { schemaConst: schemaConstName, typeName });\n schemaImports.add(schemaConstName);\n typeImports.set(schemaConstName, typeName);\n }\n }\n }\n\n const inlineResponseSchemas = new Map<string, { schemaConst: string; typeName: string }>();\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n if (this.hasInlineResponseSchema(operation)) {\n const responseSchema = this.getResponseSchemaName(operation, pathPattern);\n if (!responseSchema) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const schemaConstName = this.generateInlineSchemaName(resourceClassName, methodName, 'response');\n const typeName = schemaConstToTypeName(schemaConstName);\n inlineResponseSchemas.set(opKey, { schemaConst: schemaConstName, typeName });\n schemaImports.add(schemaConstName);\n typeImports.set(schemaConstName, typeName);\n }\n }\n }\n\n const needsZod = hasQueryParams || usesInlineZod;\n if (needsZod) {\n lines.push(\"import { z } from 'zod';\");\n lines.push('');\n }\n\n const hasParsing = node.operations.some(({ httpMethod, operation }) => {\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n const hasResponseParsing = !!successResponse?.content?.['application/json']?.schema;\n const hasBodyParsing = ['post', 'put', 'patch'].includes(httpMethod) && !!operation.requestBody;\n const hasParamsParsing = this.getQueryParams(operation).length > 0;\n return hasResponseParsing || hasBodyParsing || hasParamsParsing;\n });\n if (hasParsing) {\n lines.push(`import { parseSchema } from '${this.runtimePackage}';`);\n }\n\n lines.push(`import { Resource } from '${parentImportPath}Resource';`);\n\n const schemaImportPlaceholderIndex = lines.length;\n lines.push('__SCHEMA_IMPORTS_PLACEHOLDER__');\n\n for (const child of childResources) {\n lines.push(`import { ${child.className}Resource } from './${child.fileName}';`);\n }\n lines.push('');\n\n const queryParamsSchemas: string[] = [];\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n const queryParams = this.getQueryParams(operation);\n if (queryParams.length > 0) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const { schemaConstName, typeName } = getResourcePrefixedParamNames(methodName, resourceClassName);\n\n const specificParams = queryParams.filter((p) => !this.isPaginationParam(p.name));\n\n if (specificParams.length > 0) {\n const props = specificParams.map((p) => {\n const zodCode = this.paramToZod(p, resourceClassName);\n if (p.schema?.enum) {\n const enumInfo = this.enumRegistry.get(p.schema.enum);\n if (enumInfo) {\n schemaImports.add(enumInfo.schemaConstName);\n }\n }\n return ` ${p.name}: ${zodCode}`;\n });\n queryParamsSchemas.push(\n `export const ${schemaConstName} = paginationParamsSchema.extend({\\n${props.join(',\\n')},\\n});`,\n );\n } else {\n queryParamsSchemas.push(`export const ${schemaConstName} = paginationParamsSchema;`);\n }\n queryParamsSchemas.push(`export type ${typeName} = z.input<typeof ${schemaConstName}>;`);\n queryParamsSchemas.push('');\n }\n }\n\n if (queryParamsSchemas.length > 0) {\n lines.push('// Query parameter schemas');\n lines.push(queryParamsSchemas.join('\\n'));\n }\n\n lines.push(`export class ${resourceClassName}Resource extends Resource {`);\n\n for (const child of childResources) {\n lines.push(` public ${child.propertyName}: ${child.className}Resource;`);\n }\n\n if (childResources.length > 0) {\n lines.push('');\n lines.push(\n ` constructor(client: InstanceType<typeof import('${parentImportPath}${this.clientClassName}').default>) {`,\n );\n lines.push(' super(client);');\n for (const child of childResources) {\n lines.push(` this.${child.propertyName} = new ${child.className}Resource(client);`);\n }\n lines.push(' }');\n }\n\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const pathParams = this.getPathParams(operation);\n const queryParams = this.getQueryParams(operation);\n const responseSchema = this.getResponseSchemaName(operation, pathPattern);\n const requestSchema = this.getRequestSchemaName(operation, pathPattern);\n\n const params: string[] = [];\n for (const p of pathParams) {\n params.push(`${p.name}: ${p.type}`);\n }\n\n if (queryParams.length > 0) {\n const { typeName } = getResourcePrefixedParamNames(methodName, resourceClassName);\n const hasRequired = queryParams.some((p) => p.required);\n params.push(`params${hasRequired ? '' : '?'}: ${typeName}`);\n }\n\n const inlineBodySchema = inlineBodySchemas.get(opKey);\n\n if (['post', 'put', 'patch'].includes(httpMethod) && operation.requestBody) {\n if (requestSchema) {\n const schemaConst = `${camelCase(requestSchema)}Schema`;\n const typeName = typeImports.get(schemaConst)!;\n params.push(`body: ${typeName}`);\n } else if (inlineBodySchema) {\n params.push(`body: ${inlineBodySchema.typeName}`);\n } else {\n params.push('body: Record<string, unknown>');\n }\n }\n\n const fullPath = this.stripPathPrefix ? this.stripPathPrefix + pathPattern : pathPattern;\n let pathTemplate = fullPath.replace(/\\{(\\w+)\\}/g, '${$1}');\n pathTemplate = '`' + pathTemplate + '`';\n\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n const responseContent = successResponse?.content?.['application/json'];\n const responseSchemaObj = responseContent?.schema;\n\n let returnType = 'void';\n let parseLogic = '';\n\n if (responseSchemaObj) {\n if (responseSchemaObj.type === 'object' && responseSchemaObj.properties?.pagination) {\n const dataRef = responseSchemaObj.properties.data?.items?.$ref;\n if (dataRef) {\n const rawItemSchema = dataRef.split('/').pop()!;\n const itemSchema = cleanSchemaName(rawItemSchema);\n const itemSchemaConst = `${camelCase(itemSchema)}Schema`;\n const itemTypeName = pascalCase(itemSchema);\n schemaImports.add(itemSchemaConst);\n typeImports.set(itemSchemaConst, itemTypeName);\n returnType = `{ pagination: PaginationResponse; data: ${itemTypeName}[] }`;\n parseLogic = `const schema = z.object({ pagination: paginationResponseSchema, data: z.array(${itemSchemaConst}) }).describe('Paginated${itemTypeName}List');\n return parseSchema(schema, response);`;\n } else {\n if (responseSchema) {\n const itemSchemaConst = `${camelCase(responseSchema)}Schema`;\n const itemTypeName = pascalCase(responseSchema);\n schemaImports.add(itemSchemaConst);\n typeImports.set(itemSchemaConst, itemTypeName);\n returnType = `{ pagination: PaginationResponse; data: ${itemTypeName}[] }`;\n parseLogic = `const schema = z.object({ pagination: paginationResponseSchema, data: z.array(${itemSchemaConst}) }).describe('Paginated${itemTypeName}List');\n return parseSchema(schema, response);`;\n } else {\n returnType = `{ pagination: PaginationResponse; data: unknown[] }`;\n parseLogic = `const schema = z.object({ pagination: paginationResponseSchema, data: z.array(z.unknown()) }).describe('PaginatedList');\n return parseSchema(schema, response);`;\n }\n }\n } else if (responseSchema) {\n const schemaConstName = `${camelCase(responseSchema)}Schema`;\n const typeName = pascalCase(responseSchema);\n returnType = typeName;\n parseLogic = `return parseSchema(${schemaConstName}, response);`;\n schemaImports.add(schemaConstName);\n typeImports.set(schemaConstName, typeName);\n } else if (inlineResponseSchemas.get(opKey)) {\n const inlineSchema = inlineResponseSchemas.get(opKey)!;\n returnType = inlineSchema.typeName;\n parseLogic = `return parseSchema(${inlineSchema.schemaConst}, response);`;\n } else {\n returnType = 'unknown';\n parseLogic = 'return response;';\n }\n }\n\n lines.push('');\n lines.push(` async ${methodName}(${params.join(', ')}): Promise<${returnType}> {`);\n\n if (queryParams.length > 0) {\n const { schemaConstName } = getResourcePrefixedParamNames(methodName, resourceClassName);\n lines.push(` const searchParams = new URLSearchParams();`);\n lines.push(` if (params) {`);\n lines.push(` const validated = parseSchema(${schemaConstName}, params);`);\n lines.push(` Object.entries(validated).forEach(([key, value]) => {`);\n lines.push(` if (value !== undefined) searchParams.set(key, String(value));`);\n lines.push(` });`);\n lines.push(` }`);\n lines.push(` const query = searchParams.toString();`);\n lines.push(` const url = query ? \\`\\${${pathTemplate}}?\\${query}\\` : ${pathTemplate};`);\n }\n\n const urlVar = queryParams.length > 0 ? 'url' : pathTemplate;\n const needsResponse = returnType !== 'void';\n const responsePrefix = needsResponse ? 'const response = ' : '';\n\n const hasBodySchema = requestSchema || inlineBodySchema;\n const hasBodyValidation = ['post', 'put', 'patch'].includes(httpMethod) && hasBodySchema;\n const bodyVar = hasBodyValidation ? 'validatedBody' : 'body';\n\n if (hasBodyValidation) {\n const bodySchemaConst = requestSchema\n ? `${camelCase(requestSchema)}Schema`\n : inlineBodySchema!.schemaConst;\n lines.push(` const validatedBody = parseSchema(${bodySchemaConst}, body);`);\n }\n\n switch (httpMethod) {\n case 'get':\n lines.push(` ${responsePrefix}await this.client.get(${urlVar});`);\n break;\n case 'post':\n lines.push(` ${responsePrefix}await this.client.post(${urlVar}, ${bodyVar});`);\n break;\n case 'put':\n lines.push(` ${responsePrefix}await this.client.put(${urlVar}, ${bodyVar});`);\n break;\n case 'patch':\n lines.push(` ${responsePrefix}await this.client.patch(${urlVar}, ${bodyVar});`);\n break;\n case 'delete':\n lines.push(` ${responsePrefix}await this.client.delete(${urlVar});`);\n break;\n }\n\n if (parseLogic) {\n lines.push(` ${parseLogic}`);\n }\n\n lines.push(' }');\n }\n\n lines.push('}');\n\n const placeholderIndex = lines.findIndex((l) => l === '__SCHEMA_IMPORTS_PLACEHOLDER__');\n if (placeholderIndex >= 0) {\n if (schemaImports.size > 0 || typeImports.size > 0) {\n const allImports = new Set([...schemaImports, ...typeImports.values()]);\n lines[placeholderIndex] = `import { ${Array.from(allImports).join(', ')} } from '${parentImportPath}schemas';`;\n } else {\n lines.splice(placeholderIndex, 1);\n }\n }\n\n return {\n className: resourceClassName,\n code: lines.join('\\n'),\n children: childResources,\n };\n }\n\n private generateFromTree(\n node: PathTreeNode,\n pathSegments: string[] = [],\n depth = 0,\n ): Array<ResourceResult & { pathSegments: string[] }> {\n const resources: Array<ResourceResult & { pathSegments: string[] }> = [];\n\n for (const [childName, childNode] of node.children) {\n const childPath = [...pathSegments, childName];\n const childResources = this.generateFromTree(childNode, childPath, depth + 1);\n resources.push(...childResources);\n }\n\n if (pathSegments.length > 0 && (node.operations.length > 0 || node.children.size > 0)) {\n const resource = this.generateResourceNode(node, pathSegments);\n resources.push({\n pathSegments,\n ...resource,\n });\n }\n\n return resources;\n }\n\n generateAll(): {\n resources: Record<string, string>;\n tree: PathTreeNode;\n inlineSchemas: Map<string, { schema: OpenAPISchema; isInput: boolean; typeName: string }>;\n } {\n this.collectAllInlineSchemas();\n\n const resources = this.generateFromTree(this.pathTree);\n\n const result: Record<string, string> = {};\n for (const resource of resources) {\n result[resource.className] = resource.code;\n }\n\n return {\n resources: result,\n tree: this.pathTree,\n inlineSchemas: this.collectedInlineSchemas,\n };\n }\n}\n","import { EnumRegistry, EnumContext } from './enum-registry';\nimport { camelCase, pascalCase, isBooleanLikeEnum, cleanSchemaName, OpenAPISchema } from './utils';\n\nexport interface UsedDateSchemas {\n stringToDateSchema: boolean;\n stringToDaySchema: boolean;\n dateToStringSchema: boolean;\n dayToStringSchema: boolean;\n}\n\nexport class ZodGenerator {\n private schemas: Record<string, OpenAPISchema>;\n private generatedSchemas = new Map<string, string>();\n private schemaOrder: string[] = [];\n private inlineSchemas = new Map<string, { schema: OpenAPISchema; isInput: boolean; typeName: string }>();\n public enumRegistry: EnumRegistry;\n public usedDateSchemas: UsedDateSchemas = {\n stringToDateSchema: false,\n stringToDaySchema: false,\n dateToStringSchema: false,\n dayToStringSchema: false,\n };\n private currentSchemaName: string | null = null;\n private currentPropertyPath: string | null = null;\n\n constructor(schemas?: Record<string, OpenAPISchema>, enumRegistry?: EnumRegistry) {\n this.schemas = schemas || {};\n this.enumRegistry = enumRegistry || new EnumRegistry();\n }\n\n addInlineSchemas(inlineSchemas: Map<string, { schema: OpenAPISchema; isInput: boolean; typeName: string }>): void {\n this.inlineSchemas = inlineSchemas;\n }\n\n convertSchema(schema: OpenAPISchema | undefined, schemaName: string | null = null, isTopLevel = false): string {\n if (!schema) return 'z.unknown()';\n\n if (schema.$ref) {\n const refName = schema.$ref.split('/').pop()!;\n const cleanedName = cleanSchemaName(refName);\n return `${camelCase(cleanedName)}Schema`;\n }\n\n if (schema.anyOf) {\n const options = schema.anyOf.map((s) => this.convertSchema(s, schemaName));\n if (options.length === 2 && options.includes('z.null()')) {\n const nonNull = options.find((o) => o !== 'z.null()');\n const isInputSchema =\n schemaName &&\n (schemaName.includes('Input') || schemaName.includes('Create') || schemaName.includes('Update'));\n return isInputSchema ? `${nonNull}.nullish()` : `${nonNull}.nullable()`;\n }\n return `z.union([${options.join(', ')}])`;\n }\n\n if (schema.oneOf) {\n if (schema.oneOf.length === 2) {\n const nullIdx = schema.oneOf.findIndex((s) => this.isNullSchema(s));\n if (nullIdx !== -1) {\n const nonNull = this.convertSchema(schema.oneOf[1 - nullIdx], schemaName);\n const isInputSchema =\n schemaName &&\n (schemaName.includes('Input') || schemaName.includes('Create') || schemaName.includes('Update'));\n return isInputSchema ? `${nonNull}.nullish()` : `${nonNull}.nullable()`;\n }\n }\n const options = schema.oneOf.map((s) => this.convertSchema(s, schemaName));\n return `z.union([${options.join(', ')}])`;\n }\n\n if (schema.allOf) {\n const schemas = schema.allOf.map((s) => this.convertSchema(s, schemaName));\n if (schemas.length === 1) return schemas[0];\n return schemas.reduce((acc, s) => `${acc}.merge(${s})`);\n }\n\n if (schema.const !== undefined) {\n if (typeof schema.const === 'string') {\n return `z.literal('${schema.const}')`;\n }\n return `z.literal(${JSON.stringify(schema.const)})`;\n }\n\n const isNullable = schema.nullable === true;\n let zodSchema: string;\n\n switch (schema.type) {\n case 'string':\n zodSchema = this.convertStringSchema(schema, schemaName);\n break;\n case 'number':\n case 'integer':\n zodSchema = this.convertNumberSchema(schema, schemaName);\n break;\n case 'boolean':\n zodSchema = 'z.boolean()';\n break;\n case 'array':\n zodSchema = this.convertArraySchema(schema, schemaName);\n break;\n case 'object':\n zodSchema = this.convertObjectSchema(schema, schemaName);\n break;\n case 'null':\n return 'z.null()';\n default:\n if (schema.enum) {\n zodSchema = this.convertEnumSchema(schema, schemaName);\n } else if (schema.properties) {\n zodSchema = this.convertObjectSchema(schema, schemaName);\n } else {\n zodSchema = 'z.unknown()';\n }\n }\n\n if (isNullable) {\n const isInputSchema =\n schemaName && (schemaName.includes('Input') || schemaName.includes('Create') || schemaName.includes('Update'));\n zodSchema = isInputSchema ? `${zodSchema}.nullish()` : `${zodSchema}.nullable()`;\n }\n\n return zodSchema;\n }\n\n private isNullSchema(schema: OpenAPISchema): boolean {\n if (schema.type === 'null') return true;\n if (schema.enum && schema.enum.length === 1 && schema.enum[0] === null) return true;\n if (schema.$ref) {\n const refName = schema.$ref.split('/').pop()!;\n const resolved = this.schemas[refName];\n if (resolved) return this.isNullSchema(resolved);\n }\n return false;\n }\n\n private convertStringSchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n if (schema.enum) {\n return this.convertEnumSchema(schema, schemaName);\n }\n\n if (schema.format === 'date-time' || schema.format === 'date') {\n const isInputSchema =\n schemaName && (schemaName.includes('Input') || schemaName.includes('Create') || schemaName.includes('Update'));\n const isDateTime = schema.format === 'date-time';\n\n if (isInputSchema) {\n if (isDateTime) {\n this.usedDateSchemas.dateToStringSchema = true;\n return 'dateToStringSchema';\n } else {\n this.usedDateSchemas.dayToStringSchema = true;\n return 'dayToStringSchema';\n }\n }\n if (isDateTime) {\n this.usedDateSchemas.stringToDateSchema = true;\n return 'stringToDateSchema';\n } else {\n this.usedDateSchemas.stringToDaySchema = true;\n return 'stringToDaySchema';\n }\n }\n\n let zod = 'z.string()';\n if (schema.format === 'uuid') {\n zod = 'z.string().uuid()';\n } else if (schema.format === 'email') {\n zod = 'z.string().email()';\n } else if (schema.format === 'uri') {\n zod = 'z.string().url()';\n }\n\n if (schema.minLength !== undefined) {\n zod = `${zod}.min(${schema.minLength})`;\n }\n if (schema.maxLength !== undefined) {\n zod = `${zod}.max(${schema.maxLength})`;\n }\n if (schema.pattern && !schema.format) {\n zod = `${zod}.regex(/${schema.pattern}/)`;\n }\n\n return zod;\n }\n\n private convertNumberSchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n const isInputSchema =\n schemaName &&\n (schemaName.includes('Input') ||\n schemaName.includes('Body') ||\n schemaName.includes('Params') ||\n schemaName === 'InlineInput');\n const baseType = isInputSchema ? 'z.coerce.number()' : 'z.number()';\n let zod = schema.type === 'integer' ? `${baseType}.int()` : baseType;\n\n if (schema.minimum !== undefined) {\n zod = `${zod}.min(${schema.minimum})`;\n }\n if (schema.maximum !== undefined) {\n zod = `${zod}.max(${schema.maximum})`;\n }\n\n return zod;\n }\n\n private convertArraySchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n const itemSchema = schema.items ? this.convertSchema(schema.items, schemaName) : 'z.unknown()';\n let zod = `z.array(${itemSchema})`;\n\n if (schema.minItems !== undefined) {\n zod = `${zod}.min(${schema.minItems})`;\n }\n if (schema.maxItems !== undefined) {\n zod = `${zod}.max(${schema.maxItems})`;\n }\n\n return zod;\n }\n\n private convertObjectSchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\n const valueSchema = this.convertSchema(schema.additionalProperties as OpenAPISchema, schemaName);\n return `z.record(z.string(), ${valueSchema})`;\n }\n return 'z.object({})';\n }\n\n const required = new Set(schema.required || []);\n const properties: string[] = [];\n\n for (const [propName, propSchema] of Object.entries(schema.properties)) {\n const previousPropertyPath = this.currentPropertyPath;\n this.currentPropertyPath = previousPropertyPath ? `${previousPropertyPath}.${propName}` : propName;\n\n const propZod = this.convertSchema(propSchema, schemaName);\n const isRequired = required.has(propName);\n const finalProp = isRequired ? propZod : `${propZod}.optional()`;\n properties.push(` ${propName}: ${finalProp}`);\n\n this.currentPropertyPath = previousPropertyPath;\n }\n\n let zod = `z.object({\\n${properties.join(',\\n')}\\n})`;\n\n if (schema.additionalProperties === false) {\n zod = `${zod}.strict()`;\n }\n\n return zod;\n }\n\n private convertEnumSchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n const rawValues = schema.enum!;\n const hasNull = rawValues.some((v) => v === null);\n const values = rawValues.filter((v): v is string => v !== null && v !== '');\n\n if (values.length === 0) {\n if (hasNull) return 'z.null()';\n // Enum with only empty string(s) — treat as z.literal('')\n return \"z.literal('')\";\n }\n\n if (isBooleanLikeEnum(values)) {\n return hasNull ? 'z.boolean().nullable()' : 'z.boolean()';\n }\n\n const context: EnumContext = {\n source: 'schema',\n schemaName: this.currentSchemaName || schemaName || undefined,\n propertyPath: this.currentPropertyPath || undefined,\n };\n\n const enumInfo = this.enumRegistry.register(values, context);\n return hasNull ? `${enumInfo.schemaConstName}.nullable()` : enumInfo.schemaConstName;\n }\n\n private extractDependencies(schema: OpenAPISchema | undefined): Set<string> {\n const deps = new Set<string>();\n if (!schema) return deps;\n\n if (schema.$ref) {\n const refName = schema.$ref.split('/').pop()!;\n deps.add(refName);\n return deps;\n }\n\n if (schema.anyOf) {\n for (const s of schema.anyOf) {\n for (const dep of this.extractDependencies(s)) {\n deps.add(dep);\n }\n }\n }\n\n if (schema.oneOf) {\n for (const s of schema.oneOf) {\n for (const dep of this.extractDependencies(s)) {\n deps.add(dep);\n }\n }\n }\n\n if (schema.allOf) {\n for (const s of schema.allOf) {\n for (const dep of this.extractDependencies(s)) {\n deps.add(dep);\n }\n }\n }\n\n if (schema.items) {\n for (const dep of this.extractDependencies(schema.items)) {\n deps.add(dep);\n }\n }\n\n if (schema.properties) {\n for (const propSchema of Object.values(schema.properties)) {\n for (const dep of this.extractDependencies(propSchema)) {\n deps.add(dep);\n }\n }\n }\n\n if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\n for (const dep of this.extractDependencies(schema.additionalProperties as OpenAPISchema)) {\n deps.add(dep);\n }\n }\n\n return deps;\n }\n\n private topologicalSort(schemaNames: string[]): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n const visiting = new Set<string>();\n\n const visit = (name: string) => {\n if (visited.has(name)) return;\n if (visiting.has(name)) return;\n\n visiting.add(name);\n\n const schema = this.schemas[name];\n if (schema) {\n const deps = this.extractDependencies(schema);\n for (const dep of deps) {\n if (schemaNames.includes(dep)) {\n visit(dep);\n }\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n result.push(name);\n };\n\n for (const name of schemaNames) {\n visit(name);\n }\n\n return result;\n }\n\n generateSchemas(runtimePackage: string): string {\n const schemaOutput: string[] = [];\n\n for (const name of Object.keys(this.schemas)) {\n this.schemaOrder.push(name);\n }\n\n this.schemaOrder = this.topologicalSort(this.schemaOrder);\n\n const usedNames = new Set<string>();\n\n for (const name of this.schemaOrder) {\n const schema = this.schemas[name];\n\n this.currentSchemaName = name;\n this.currentPropertyPath = null;\n\n const zodSchema = this.convertSchema(schema, name, true);\n\n this.currentSchemaName = null;\n\n let cleanName = name;\n if (cleanName.endsWith('SchemaInput')) {\n cleanName = cleanName.replace('SchemaInput', 'Input');\n } else if (cleanName.endsWith('Schema')) {\n cleanName = cleanName.replace('Schema', '');\n }\n\n const schemaConstName = camelCase(cleanName) + 'Schema';\n const typeName = pascalCase(cleanName);\n\n if (usedNames.has(schemaConstName) || usedNames.has(typeName)) {\n continue;\n }\n usedNames.add(schemaConstName);\n usedNames.add(typeName);\n\n schemaOutput.push(`export const ${schemaConstName} = ${zodSchema}.describe('${typeName}');`);\n const isInputType = /(?:Body|Input|Params)$/.test(cleanName);\n const inferType = isInputType ? 'z.input' : 'z.output';\n schemaOutput.push(`export type ${typeName} = ${inferType}<typeof ${schemaConstName}>;`);\n schemaOutput.push('');\n }\n\n this.enumRegistry.register(['desc', 'asc'], {\n source: 'schema',\n schemaName: 'PaginationParams',\n propertyPath: 'ordering',\n });\n const orderingEnumInfo = this.enumRegistry.get(['desc', 'asc'])!;\n\n schemaOutput.push('// Common pagination schemas');\n schemaOutput.push(`export const paginationParamsSchema = z.object({\n page: z.number().optional(),\n limit: z.number().optional(),\n orderBy: z.string().optional(),\n ordering: ${orderingEnumInfo.schemaConstName}.optional(),\n}).describe('PaginationParams');`);\n schemaOutput.push('export type PaginationParams = z.input<typeof paginationParamsSchema>;');\n schemaOutput.push('');\n\n schemaOutput.push(`export const paginationResponseSchema = z.object({\n page: z.number(),\n pages: z.number(),\n limit: z.number(),\n total: z.number(),\n}).describe('PaginationResponse');`);\n schemaOutput.push('export type PaginationResponse = z.output<typeof paginationResponseSchema>;');\n schemaOutput.push('');\n\n if (this.inlineSchemas.size > 0) {\n schemaOutput.push('// Inline request/response schemas');\n for (const [schemaName, schemaInfo] of this.inlineSchemas) {\n const { schema, isInput, typeName } = schemaInfo;\n const contextName = isInput ? 'InlineInput' : 'InlineOutput';\n const zodSchema = this.convertSchema(schema, contextName, true);\n schemaOutput.push(`export const ${schemaName} = ${zodSchema}.describe('${typeName}');`);\n const inferType = isInput ? 'z.input' : 'z.output';\n schemaOutput.push(`export type ${typeName} = ${inferType}<typeof ${schemaName}>;`);\n schemaOutput.push('');\n }\n }\n\n const output: string[] = [];\n output.push(\"import { z } from 'zod';\");\n\n const usedDateSchemasList = Object.entries(this.usedDateSchemas)\n .filter(([_, used]) => used)\n .map(([name]) => name);\n\n if (usedDateSchemasList.length > 0) {\n output.push(`import { ${usedDateSchemasList.join(', ')} } from '${runtimePackage}';`);\n }\n\n output.push('');\n\n const enumExports = this.enumRegistry.generateEnumExports();\n if (enumExports) {\n output.push(enumExports);\n }\n\n output.push(...schemaOutput);\n\n return output.join('\\n');\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport async function writeFile(filepath: string, content: string): Promise<void> {\n const dir = path.dirname(filepath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filepath, content);\n console.log(`Generated: ${filepath}`);\n}\n\nexport interface GeneratedFile {\n path: string;\n content: string;\n}\n\nexport async function writeFiles(files: GeneratedFile[]): Promise<void> {\n for (const file of files) {\n await writeFile(file.path, file.content);\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { OpenAPISpec } from './utils';\n\nexport async function loadSpec(specPath: string): Promise<OpenAPISpec> {\n // If it's a URL, fetch it\n if (specPath.startsWith('http://') || specPath.startsWith('https://')) {\n console.log(`Fetching OpenAPI spec from ${specPath}...`);\n const response = await fetch(specPath);\n if (!response.ok) {\n throw new Error(`Failed to fetch OpenAPI spec: ${response.statusText}`);\n }\n const spec = (await response.json()) as OpenAPISpec;\n console.log(`OpenAPI spec version: ${spec.openapi}`);\n console.log(`API title: ${spec.info.title}`);\n return spec;\n }\n\n // Otherwise, read from file\n const resolvedPath = path.resolve(specPath);\n console.log(`Reading OpenAPI spec from ${resolvedPath}...`);\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`OpenAPI spec file not found: ${resolvedPath}`);\n }\n\n const content = fs.readFileSync(resolvedPath, 'utf-8');\n\n let spec: OpenAPISpec;\n if (resolvedPath.endsWith('.yaml') || resolvedPath.endsWith('.yml')) {\n throw new Error('YAML specs are not supported yet. Please use JSON format.');\n } else {\n spec = JSON.parse(content) as OpenAPISpec;\n }\n\n console.log(`OpenAPI spec version: ${spec.openapi}`);\n console.log(`API title: ${spec.info.title}`);\n return spec;\n}\n","import path from 'path';\nimport { generateClient } from '../../generator/client-generator';\nimport type { OrcConfig } from '../../generator/config';\n\nexport async function runGenerate(\n config: OrcConfig,\n options: { client?: string; spec?: string },\n): Promise<void> {\n const runtimePackage = config.runtimePackage || '@moinax/orc';\n\n let clients = config.clients;\n\n if (options.client) {\n clients = clients.filter((c) => c.name.toLowerCase() === options.client!.toLowerCase());\n if (clients.length === 0) {\n console.error(`Error: Client \"${options.client}\" not found in configuration.`);\n console.log('Available clients:', config.clients.map((c) => c.name).join(', '));\n process.exit(1);\n }\n }\n\n if (options.spec && !options.client) {\n console.error('Error: --spec requires --client to be specified');\n process.exit(1);\n }\n\n console.log('ORC - OpenAPI Rest Client Generator');\n console.log('====================================');\n console.log(`Generating ${clients.length} client(s): ${clients.map((c) => c.name).join(', ')}`);\n if (options.spec) {\n console.log(`Using custom spec: ${options.spec}`);\n }\n\n const results = [];\n for (const clientConfig of clients) {\n try {\n const result = await generateClient(clientConfig, {\n specOverride: options.spec,\n runtimePackage,\n });\n results.push(result);\n } catch (error) {\n console.error(`\\nError generating ${clientConfig.name}Client:`, (error as Error).message);\n process.exit(1);\n }\n }\n\n console.log('\\n' + '='.repeat(60));\n console.log('All clients generated successfully!');\n console.log('='.repeat(60));\n\n for (const result of results) {\n console.log(`\\n${result.name}Client resources: ${result.resourceNames.join(', ')}`);\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst CONFIG_TEMPLATE = `import { defineConfig } from '@moinax/orc/config';\n\nexport default defineConfig({\n clients: [\n {\n name: 'MyApi',\n spec: 'https://api.example.com/openapi.json',\n output: 'src/lib/api/my-api-client',\n },\n ],\n});\n`;\n\nexport async function runInit(): Promise<void> {\n const configPath = path.join(process.cwd(), 'orc.config.ts');\n\n if (fs.existsSync(configPath)) {\n console.error(`Config file already exists: ${configPath}`);\n process.exit(1);\n }\n\n fs.writeFileSync(configPath, CONFIG_TEMPLATE);\n console.log(`Created config file: ${configPath}`);\n console.log('\\nEdit the file to configure your API clients, then run:');\n console.log(' orc generate');\n}\n"],"mappings":"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","names":["path","fs","fs","path","pluralizeLib","cleanSchemaName","pluralizeLib","fs","path","spec","path","fs","fs","path","path","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/generator/client-generator.ts","../src/generator/enum-registry.ts","../src/generator/utils.ts","../src/generator/resource-generator.ts","../src/generator/zod-generator.ts","../src/generator/file-writer.ts","../src/generator/spec-loader.ts","../src/cli/commands/generate.ts","../src/cli/commands/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport path from 'path';\nimport fs from 'fs';\nimport { createJiti } from 'jiti';\nimport type { OrcConfig } from './generator/config';\nimport { runGenerate } from './cli/commands/generate';\nimport { runInit } from './cli/commands/init';\n\nconst CONFIG_NAMES = ['orc.config.ts', 'orc.config.js', 'orc.config.mjs'];\n\nasync function loadConfig(): Promise<OrcConfig> {\n const cwd = process.cwd();\n\n for (const configName of CONFIG_NAMES) {\n const configPath = path.join(cwd, configName);\n if (fs.existsSync(configPath)) {\n console.log(`Using config: ${configPath}`);\n const jiti = createJiti(cwd, { interopDefault: true });\n const config = await jiti.import(configPath) as OrcConfig;\n return config;\n }\n }\n\n throw new Error(\n `No config file found. Create one with 'orc init' or add one of: ${CONFIG_NAMES.join(', ')}`,\n );\n}\n\nconst program = new Command();\n\nprogram\n .name('orc')\n .description('ORC - OpenAPI Rest Client Generator')\n .version('0.1.0');\n\nprogram\n .command('generate')\n .description('Generate TypeScript API clients from OpenAPI specs')\n .option('-c, --client <name>', 'Generate a specific client only')\n .option('-s, --spec <url>', 'Override spec URL (requires --client)')\n .action(async (options) => {\n const config = await loadConfig();\n await runGenerate(config, options);\n });\n\nprogram\n .command('init')\n .description('Scaffold a new orc.config.ts file')\n .action(async () => {\n await runInit();\n });\n\nprogram.parse();\n","import fs from 'fs';\nimport path from 'path';\nimport { EnumRegistry } from './enum-registry';\nimport { ResourceGenerator } from './resource-generator';\nimport { ZodGenerator } from './zod-generator';\nimport { writeFile, type GeneratedFile } from './file-writer';\nimport { loadSpec } from './spec-loader';\nimport {\n validateFileName,\n validateOutputPath,\n pascalCase,\n singularize,\n camelCase,\n} from './utils';\nimport type { ClientConfig } from './config';\n\nexport interface GenerateResult {\n name: string;\n resourceNames: string[];\n files?: GeneratedFile[];\n}\n\nexport async function generateClient(\n config: ClientConfig,\n options: {\n specOverride?: string;\n write?: boolean;\n runtimePackage?: string;\n } = {},\n): Promise<GenerateResult> {\n const { name, output } = config;\n const specUrl = options.specOverride || config.spec;\n const shouldWrite = options.write !== false;\n const runtimePackage = options.runtimePackage || '@moinax/orc';\n\n validateOutputPath(output);\n\n const outputDir = path.join(output, 'generated');\n const clientClassName = `${name}Client`;\n\n validateFileName(clientClassName, 'client class name');\n\n console.log(`\\n${'='.repeat(60)}`);\n console.log(`Generating ${clientClassName}...`);\n console.log(`${'='.repeat(60)}`);\n\n // Clean up previously generated files\n if (shouldWrite && fs.existsSync(outputDir)) {\n fs.rmSync(outputDir, { recursive: true });\n console.log(`\\nCleaned up ${outputDir}`);\n }\n\n // Fetch/load OpenAPI spec\n const spec = await loadSpec(specUrl);\n\n // Create shared enum registry\n const enumRegistry = new EnumRegistry(config.schemaPrefix);\n\n // Create resource generator\n const resourceGenerator = new ResourceGenerator(spec.paths, spec.components?.schemas, clientClassName, {\n stripPathPrefix: config.stripPathPrefix,\n enumRegistry,\n runtimePackage,\n schemaPrefix: config.schemaPrefix,\n });\n\n // Generate resources FIRST (registers query param enums)\n console.log('\\nGenerating resource classes...');\n const { resources, tree, inlineSchemas } = resourceGenerator.generateAll();\n\n // Generate schemas (including inline schemas from resources)\n console.log('\\nGenerating Zod schemas...');\n const zodGenerator = new ZodGenerator(spec.components?.schemas, enumRegistry, config.schemaPrefix);\n zodGenerator.addInlineSchemas(inlineSchemas);\n const schemasCode = zodGenerator.generateSchemas(runtimePackage);\n\n const generatedFiles: GeneratedFile[] = [];\n\n // schemas.ts\n generatedFiles.push({\n path: path.join(outputDir, 'schemas.ts'),\n content: schemasCode,\n });\n\n // Resource files\n const resourceNames: string[] = [];\n for (const [resourceName, code] of Object.entries(resources)) {\n validateFileName(resourceName, 'resource name');\n generatedFiles.push({\n path: path.join(outputDir, 'resources', `${resourceName}.resource.ts`),\n content: code,\n });\n resourceNames.push(resourceName);\n }\n\n // Resources index\n const resourceIndexCode = resourceNames\n .map((resourceName) => `export { ${resourceName}Resource } from './${resourceName}.resource';`)\n .join('\\n');\n generatedFiles.push({\n path: path.join(outputDir, 'resources', 'index.ts'),\n content: resourceIndexCode,\n });\n\n // Resource base class\n const resourceBaseCode = `import type ${clientClassName} from './${clientClassName}';\nimport { Resource as BaseResource } from '${runtimePackage}';\n\nexport class Resource extends BaseResource {\n protected declare client: ${clientClassName};\n\n constructor(client: ${clientClassName}) {\n super(client);\n }\n}\n`;\n generatedFiles.push({\n path: path.join(outputDir, 'Resource.ts'),\n content: resourceBaseCode,\n });\n\n // Get top-level resources\n const topLevelResources: Array<{ propertyName: string; className: string }> = [];\n for (const [childName] of tree.children) {\n const className = pascalCase(childName);\n topLevelResources.push({\n propertyName: singularize(camelCase(childName)),\n className,\n });\n }\n\n // Client class\n console.log(`\\nGenerating ${clientClassName}...`);\n const resourceImports = topLevelResources.map((r) => `${r.className}Resource`).join(',\\n ');\n const resourceProperties = topLevelResources\n .map((r) => `public ${r.propertyName}: ${r.className}Resource;`)\n .join('\\n ');\n const resourceInstantiations = topLevelResources\n .map((r) => `this.${r.propertyName} = new ${r.className}Resource(this);`)\n .join('\\n ');\n\n const clientCode = `import { Client, ClientOptions } from '${runtimePackage}';\n\nimport {\n ${resourceImports},\n} from './resources';\n\nexport default class ${clientClassName} extends Client {\n ${resourceProperties}\n\n constructor(baseUrl: string, options: ClientOptions = {}) {\n super(baseUrl, options);\n ${resourceInstantiations}\n }\n}\n`;\n generatedFiles.push({\n path: path.join(outputDir, `${clientClassName}.ts`),\n content: clientCode,\n });\n\n // Main index\n const mainIndexCode = `export { default as ${clientClassName} } from './${clientClassName}';\nexport * from './schemas';\nexport * from './resources';\n`;\n generatedFiles.push({\n path: path.join(outputDir, 'index.ts'),\n content: mainIndexCode,\n });\n\n // Write files if not in dry-run mode\n if (shouldWrite) {\n for (const file of generatedFiles) {\n await writeFile(file.path, file.content);\n }\n }\n\n console.log(`\\n${clientClassName} generation complete!`);\n\n return {\n name,\n resourceNames: topLevelResources.map((r) => r.className),\n files: shouldWrite ? undefined : generatedFiles,\n };\n}\n","import pluralizeLib from 'pluralize';\nimport { camelCase, pascalCase, singularize } from './utils';\n\nexport interface EnumContext {\n source: 'schema' | 'queryParam';\n schemaName?: string;\n propertyPath?: string;\n paramName?: string;\n resourceName?: string;\n}\n\nexport interface EnumInfo {\n valuesConstName: string;\n schemaConstName: string;\n typeName: string;\n values: string[];\n}\n\nexport class EnumRegistry {\n private enums = new Map<string, EnumInfo>();\n private enumContexts = new Map<string, EnumContext[]>();\n private usedNames = new Set<string>();\n private schemaPrefix: string;\n\n constructor(schemaPrefix?: string) {\n this.schemaPrefix = schemaPrefix || '';\n }\n\n static fingerprint(values: string[]): string {\n return JSON.stringify([...values].sort());\n }\n\n generateEnumNames(values: string[], context: EnumContext): EnumInfo {\n const { source, schemaName, propertyPath, paramName, resourceName } = context;\n\n let baseName: string;\n if (source === 'schema' && schemaName && propertyPath) {\n const cleanSchemaName = schemaName\n .replace(/Schema$/, '')\n .replace(/SchemaInput$/, '')\n .replace(/Input$/, '');\n\n const pathParts = propertyPath.split('.');\n const contextFromPath = pathParts.map((p) => pascalCase(singularize(p))).join('');\n baseName = camelCase(cleanSchemaName) + contextFromPath;\n } else if (source === 'queryParam' && resourceName && paramName) {\n const singularResource = singularize(resourceName);\n baseName = camelCase(singularResource) + pascalCase(paramName);\n } else {\n baseName = camelCase(values[0].toLowerCase());\n }\n\n if (this.schemaPrefix) {\n baseName = camelCase(this.schemaPrefix) + pascalCase(baseName);\n }\n\n const valuesConstName = pluralizeLib.isPlural(baseName) ? baseName : pluralizeLib.plural(baseName);\n\n return {\n valuesConstName,\n schemaConstName: `${singularize(baseName)}Schema`,\n typeName: pascalCase(singularize(baseName)),\n values,\n };\n }\n\n register(values: string[], context: EnumContext): EnumInfo {\n const fingerprint = EnumRegistry.fingerprint(values);\n\n if (!this.enumContexts.has(fingerprint)) {\n this.enumContexts.set(fingerprint, []);\n }\n this.enumContexts.get(fingerprint)!.push(context);\n\n if (this.enums.has(fingerprint)) {\n return this.enums.get(fingerprint)!;\n }\n\n let enumInfo = this.generateEnumNames(values, context);\n\n let counter = 1;\n const hasCollision = () =>\n this.usedNames.has(enumInfo.valuesConstName) ||\n this.usedNames.has(enumInfo.schemaConstName) ||\n this.usedNames.has(enumInfo.typeName);\n\n while (hasCollision()) {\n const baseInfo = this.generateEnumNames(values, context);\n enumInfo = {\n valuesConstName: `${baseInfo.valuesConstName}${counter}`,\n schemaConstName: `${baseInfo.schemaConstName.replace(/Schema$/, '')}${counter}Schema`,\n typeName: `${baseInfo.typeName}${counter}`,\n values: baseInfo.values,\n };\n counter++;\n }\n\n this.usedNames.add(enumInfo.valuesConstName);\n this.usedNames.add(enumInfo.schemaConstName);\n this.usedNames.add(enumInfo.typeName);\n\n this.enums.set(fingerprint, enumInfo);\n return enumInfo;\n }\n\n has(values: string[]): boolean {\n return this.enums.has(EnumRegistry.fingerprint(values));\n }\n\n get(values: string[]): EnumInfo | undefined {\n return this.enums.get(EnumRegistry.fingerprint(values));\n }\n\n getAll(): EnumInfo[] {\n return Array.from(this.enums.values());\n }\n\n generateEnumExports(): string {\n const lines: string[] = [];\n\n if (this.enums.size === 0) {\n return '';\n }\n\n lines.push('// ============================================================================');\n lines.push('// Extracted Enums');\n lines.push('// ============================================================================');\n lines.push('');\n\n for (const enumInfo of this.enums.values()) {\n const { valuesConstName, schemaConstName, typeName, values } = enumInfo;\n const valuesStr = values.map((v) => `'${v}'`).join(', ');\n\n lines.push(`export const ${valuesConstName} = [${valuesStr}] as const;`);\n lines.push(`export const ${schemaConstName} = z.enum(${valuesConstName});`);\n lines.push(`export type ${typeName} = z.output<typeof ${schemaConstName}>;`);\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n}\n","import pluralizeLib from 'pluralize';\n\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function camelCase(str: string): string {\n const result = str\n .replace(/[-_.]+/g, '_')\n .replace(/_([a-zA-Z])/g, (_, char) => char.toUpperCase())\n .replace(/_+/g, '');\n\n return result.charAt(0).toLowerCase() + result.slice(1);\n}\n\nexport function pascalCase(str: string): string {\n return capitalize(camelCase(str));\n}\n\nexport function schemaConstToTypeName(schemaConstName: string): string {\n const withoutSuffix = schemaConstName.replace(/Schema$/, '');\n return pascalCase(withoutSuffix);\n}\n\nexport function singularize(str: string): string {\n const match = str.match(/^(.*)([A-Z][a-z]+s)$/);\n if (match) {\n const prefix = match[1];\n const lastWord = match[2];\n return prefix + pluralizeLib.singular(lastWord);\n }\n return pluralizeLib.singular(str);\n}\n\nexport function isBooleanLikeEnum(values: unknown[]): boolean {\n if (!Array.isArray(values) || values.length !== 2) return false;\n const sorted = [...values].sort();\n return sorted[0] === 'false' && sorted[1] === 'true';\n}\n\nexport function prefixSchemaConst(name: string, schemaPrefix?: string): string {\n if (!schemaPrefix) return `${camelCase(name)}Schema`;\n return `${camelCase(schemaPrefix)}${pascalCase(name)}Schema`;\n}\n\nexport function prefixTypeName(name: string, schemaPrefix?: string): string {\n if (!schemaPrefix) return pascalCase(name);\n return `${pascalCase(schemaPrefix)}${pascalCase(name)}`;\n}\n\nexport function getResourcePrefixedParamNames(\n methodName: string,\n resourceClassName: string,\n schemaPrefix?: string,\n): { schemaConstName: string; typeName: string } {\n const singularResource = singularize(resourceClassName);\n const prefix = schemaPrefix ? pascalCase(schemaPrefix) : '';\n\n if (methodName.startsWith('get')) {\n const rest = methodName.slice(3);\n return {\n schemaConstName: `get${prefix}${singularResource}${rest}ParamsSchema`,\n typeName: `Get${prefix}${singularResource}${rest}Params`,\n };\n }\n\n return {\n schemaConstName: `${camelCase(methodName)}${prefix}${singularResource}ParamsSchema`,\n typeName: `${pascalCase(methodName)}${prefix}${singularResource}Params`,\n };\n}\n\nexport function validateFileName(name: string, context: string): void {\n if (!name || typeof name !== 'string') {\n throw new Error(`Invalid ${context}: must be a non-empty string`);\n }\n if (name.includes('..') || name.includes('/') || name.includes('\\\\')) {\n throw new Error(`Invalid ${context}: contains path traversal characters`);\n }\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(name)) {\n throw new Error(`Invalid ${context}: must be alphanumeric starting with a letter`);\n }\n}\n\nexport function validateOutputPath(outputPath: string): void {\n if (!outputPath || typeof outputPath !== 'string') {\n throw new Error('Invalid output path: must be a non-empty string');\n }\n if (outputPath.includes('..')) {\n throw new Error('Invalid output path: contains path traversal characters');\n }\n}\n\nexport interface OpenAPISchema {\n type?: string;\n format?: string;\n enum?: (string | null)[];\n const?: unknown;\n nullable?: boolean;\n $ref?: string;\n anyOf?: OpenAPISchema[];\n oneOf?: OpenAPISchema[];\n allOf?: OpenAPISchema[];\n items?: OpenAPISchema;\n properties?: Record<string, OpenAPISchema>;\n additionalProperties?: boolean | OpenAPISchema;\n required?: string[];\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n minimum?: number;\n maximum?: number;\n minItems?: number;\n maxItems?: number;\n description?: string;\n}\n\nexport interface OpenAPIParameter {\n name: string;\n in: string;\n required?: boolean;\n schema?: OpenAPISchema;\n}\n\nexport interface OpenAPIOperation {\n operationId?: string;\n summary?: string;\n tags?: string[];\n parameters?: OpenAPIParameter[];\n requestBody?: {\n content?: {\n 'application/json'?: {\n schema?: OpenAPISchema;\n };\n };\n };\n responses?: Record<\n string,\n {\n content?: {\n 'application/json'?: {\n schema?: OpenAPISchema;\n };\n };\n }\n >;\n}\n\nexport interface OpenAPISpec {\n openapi: string;\n info: { title: string; version?: string };\n paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>>;\n components?: {\n schemas?: Record<string, OpenAPISchema>;\n };\n}\n\nexport interface PathSegment {\n name: string;\n isParam: boolean;\n raw: string;\n}\n\nexport function isListResponse(responseSchema: OpenAPISchema | undefined): boolean {\n if (!responseSchema) return false;\n\n if (responseSchema.type === 'object' && responseSchema.properties?.pagination) {\n return true;\n }\n if (responseSchema.type === 'array') {\n return true;\n }\n if (responseSchema.type === 'object' && responseSchema.properties) {\n for (const arrayProp of ['data', 'items', 'results']) {\n const prop = responseSchema.properties[arrayProp];\n if (prop?.type === 'array') return true;\n }\n }\n if (responseSchema.$ref) {\n const refName = responseSchema.$ref.split('/').pop()!;\n if (refName.includes('Paginated') || refName.includes('List')) {\n return true;\n }\n }\n return false;\n}\n\nexport function deriveEntityFromPath(pathPattern: string, includeParentContext = false): string | null {\n const segments = pathPattern.split('/').filter((seg) => seg && !seg.startsWith('{'));\n if (segments.length === 0) return null;\n\n if (includeParentContext && segments.length >= 2) {\n const parentSegment = segments[segments.length - 2];\n const lastSegment = segments[segments.length - 1];\n const singularParent = parentSegment.endsWith('s') ? parentSegment.slice(0, -1) : parentSegment;\n return pascalCase(singularParent) + pascalCase(lastSegment);\n }\n\n const lastSegment = segments[segments.length - 1];\n return pascalCase(lastSegment);\n}\n\nexport function isActionWord(word: string): boolean {\n const knownActions = ['status', 'approve', 'cancel', 'current', 'download_link', 'preferences'];\n if (knownActions.includes(word.toLowerCase())) return true;\n if (word.endsWith('s') && !word.endsWith('ss') && !word.endsWith('us')) {\n return false;\n }\n return true;\n}\n\nexport function operationIdToMethodName(\n operationId: string | undefined,\n httpMethod: string,\n pathPattern: string,\n resourceName: string,\n responseSchema: OpenAPISchema | undefined,\n): string {\n const isList = isListResponse(responseSchema);\n\n switch (httpMethod) {\n case 'get':\n return isList ? 'getList' : 'getDetail';\n case 'post':\n return 'create';\n case 'put':\n return 'replace';\n case 'patch':\n return 'update';\n case 'delete':\n return 'delete';\n default:\n return operationId ? camelCase(operationId) : httpMethod;\n }\n}\n\nexport function parsePathSegments(pathPattern: string): PathSegment[] {\n return pathPattern\n .split('/')\n .filter((seg) => seg)\n .map((seg) => ({\n name: seg.startsWith('{') ? seg.slice(1, -1) : seg,\n isParam: seg.startsWith('{'),\n raw: seg,\n }));\n}\n\nexport function getResourcePath(pathPattern: string): string[] {\n const segments = parsePathSegments(pathPattern);\n const resourcePath: string[] = [];\n for (const seg of segments) {\n if (!seg.isParam) {\n resourcePath.push(seg.name);\n }\n }\n return resourcePath;\n}\n\nexport interface PathTreeNode {\n name: string;\n children: Map<string, PathTreeNode>;\n operations: Array<{\n pathPattern: string;\n httpMethod: string;\n operation: OpenAPIOperation;\n }>;\n}\n\nexport function buildPathTree(paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>>): PathTreeNode {\n const tree: PathTreeNode = {\n name: 'root',\n children: new Map(),\n operations: [],\n };\n\n for (const [pathPattern, methods] of Object.entries(paths)) {\n for (const [httpMethod, operation] of Object.entries(methods)) {\n if (httpMethod === 'parameters') continue;\n\n const resourcePath = getResourcePath(pathPattern);\n\n let current = tree;\n for (const segment of resourcePath) {\n if (!current.children.has(segment)) {\n current.children.set(segment, {\n name: segment,\n children: new Map(),\n operations: [],\n });\n }\n current = current.children.get(segment)!;\n }\n\n current.operations.push({\n pathPattern,\n httpMethod,\n operation: operation as OpenAPIOperation,\n });\n }\n }\n\n return tree;\n}\n\nexport function cleanSchemaName(name: string): string {\n if (name.endsWith('SchemaInput')) {\n name = name.replace('SchemaInput', 'Input');\n } else if (name.endsWith('Schema')) {\n name = name.replace('Schema', '');\n }\n\n if (name.includes('__')) {\n const parts = name.split('__');\n name = parts[parts.length - 1];\n }\n\n name = name.replace(/_+$/, '');\n name = name.replace(/_([A-Za-z])/g, (_, char) => char.toUpperCase());\n\n return name;\n}\n","import { EnumRegistry } from './enum-registry';\nimport { ZodGenerator } from './zod-generator';\nimport {\n camelCase,\n pascalCase,\n singularize,\n capitalize,\n schemaConstToTypeName,\n isBooleanLikeEnum,\n getResourcePrefixedParamNames,\n prefixSchemaConst,\n prefixTypeName,\n operationIdToMethodName,\n getResourcePath,\n buildPathTree,\n cleanSchemaName,\n OpenAPISchema,\n OpenAPIOperation,\n OpenAPIParameter,\n PathTreeNode,\n} from './utils';\n\ninterface ResourceResult {\n className: string;\n code: string;\n children: Array<{ propertyName: string; className: string; fileName: string }>;\n}\n\nexport class ResourceGenerator {\n private schemas: Record<string, OpenAPISchema>;\n private clientClassName: string;\n private stripPathPrefix: string | null;\n public enumRegistry: EnumRegistry;\n private paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>>;\n private pathTree: PathTreeNode;\n private generatedResources = new Map<string, ResourceResult>();\n public collectedInlineSchemas = new Map<\n string,\n { schema: OpenAPISchema; isInput: boolean; typeName: string }\n >();\n private currentResourceName: string | null = null;\n private runtimePackage: string;\n private schemaPrefix: string;\n\n constructor(\n paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>> | undefined,\n schemas: Record<string, OpenAPISchema> | undefined,\n clientClassName: string,\n options: {\n stripPathPrefix?: string;\n enumRegistry?: EnumRegistry;\n runtimePackage?: string;\n schemaPrefix?: string;\n } = {},\n ) {\n this.schemas = schemas || {};\n this.clientClassName = clientClassName;\n this.stripPathPrefix = options.stripPathPrefix || null;\n this.enumRegistry = options.enumRegistry || new EnumRegistry();\n this.runtimePackage = options.runtimePackage || '@moinax/orc';\n this.schemaPrefix = options.schemaPrefix || '';\n\n this.paths = this.stripPathPrefix ? this.stripPrefixFromPaths(paths || {}) : paths || {};\n this.pathTree = buildPathTree(this.paths);\n }\n\n collectAllInlineSchemas(): Map<string, { schema: OpenAPISchema; isInput: boolean; typeName: string }> {\n this._collectInlineSchemasFromNode(this.pathTree, []);\n return this.collectedInlineSchemas;\n }\n\n private _collectInlineSchemasFromNode(node: PathTreeNode, parentPath: string[]): void {\n const nodeName = node.name === 'root' ? '' : node.name;\n const currentPath = [...parentPath, nodeName].filter(Boolean);\n\n const operationMethodNames = new Map<string, string>();\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n const responseSchemaObj = (\n operation.responses?.['200'] || operation.responses?.['201']\n )?.content?.['application/json']?.schema;\n const methodName = operationIdToMethodName(\n operation.operationId,\n httpMethod,\n pathPattern,\n node.name,\n responseSchemaObj,\n );\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n operationMethodNames.set(opKey, methodName);\n }\n\n const resourceClassName = this.getResourceClassName(currentPath);\n\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n if (this.hasInlineRequestBody(operation)) {\n const requestSchema = this.getRequestSchemaName(operation, pathPattern);\n if (!requestSchema) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const schemaConstName = this.generateInlineSchemaName(resourceClassName, methodName, 'body');\n\n const bodySchema = operation.requestBody!.content!['application/json']!.schema!;\n this.collectedInlineSchemas.set(schemaConstName, {\n schema: bodySchema,\n isInput: true,\n typeName: prefixTypeName(`${resourceClassName}${pascalCase(methodName)}Body`, this.schemaPrefix),\n });\n }\n }\n }\n\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n if (this.hasInlineResponseSchema(operation)) {\n const responseSchema = this.getResponseSchemaName(operation, pathPattern);\n if (!responseSchema) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const schemaConstName = this.generateInlineSchemaName(resourceClassName, methodName, 'response');\n\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n const inlineSchema = successResponse!.content!['application/json']!.schema!;\n this.collectedInlineSchemas.set(schemaConstName, {\n schema: inlineSchema,\n isInput: false,\n typeName: prefixTypeName(`${resourceClassName}${pascalCase(methodName)}Response`, this.schemaPrefix),\n });\n }\n }\n }\n\n for (const [, childNode] of node.children) {\n this._collectInlineSchemasFromNode(childNode, currentPath);\n }\n }\n\n private stripPrefixFromPaths(\n paths: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>>,\n ): Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>> {\n const result: Record<string, Record<string, OpenAPIOperation | OpenAPIParameter[]>> = {};\n for (const [pathPattern, methods] of Object.entries(paths)) {\n let newPath = pathPattern;\n if (this.stripPathPrefix && pathPattern.startsWith(this.stripPathPrefix)) {\n newPath = pathPattern.slice(this.stripPathPrefix.length) || '/';\n }\n result[newPath] = methods;\n }\n return result;\n }\n\n private getResponseSchemaName(operation: OpenAPIOperation, pathPattern: string | null = null): string | null {\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n if (!successResponse) return null;\n\n const content = successResponse.content?.['application/json'];\n if (!content?.schema) return null;\n\n const schema = content.schema;\n if (schema.$ref) {\n const rawName = schema.$ref.split('/').pop()!;\n return cleanSchemaName(rawName);\n }\n\n if (schema.type === 'object') {\n if (operation.operationId) {\n const opId = operation.operationId;\n const patterns = [\n /^create[_-]?(.+)$/i,\n /^update[_-]?(.+)$/i,\n /^get[_-]?(.+)$/i,\n /^(.+)[_-]?create$/i,\n /^(.+)[_-]?update$/i,\n /^(.+)[_-]?get$/i,\n ];\n\n for (const pattern of patterns) {\n const match = opId.match(pattern);\n if (match) {\n const entityName = pascalCase(match[1].replace(/[_-]/g, ' '));\n const schemaSchemaName = `${entityName}Schema`;\n if (this.schemas[entityName] || this.schemas[schemaSchemaName]) {\n return entityName;\n }\n }\n }\n }\n\n if (pathPattern) {\n const resourcePath = getResourcePath(pathPattern);\n if (resourcePath.length > 0) {\n const lastSegment = resourcePath[resourcePath.length - 1];\n const entityName = pascalCase(singularize(lastSegment));\n const schemaSchemaName = `${entityName}Schema`;\n if (this.schemas[entityName] || this.schemas[schemaSchemaName]) {\n return entityName;\n }\n }\n }\n }\n\n if (schema.type === 'object' && schema.properties) {\n return null;\n }\n\n return null;\n }\n\n private getRequestSchemaName(operation: OpenAPIOperation, pathPattern: string | null = null): string | null {\n const content = operation.requestBody?.content?.['application/json'];\n if (!content?.schema) return null;\n\n const schema = content.schema;\n if (schema.$ref) {\n const rawName = schema.$ref.split('/').pop()!;\n return cleanSchemaName(rawName);\n }\n\n return null;\n }\n\n private hasInlineRequestBody(operation: OpenAPIOperation): boolean {\n const content = operation.requestBody?.content?.['application/json'];\n if (!content?.schema) return false;\n return !content.schema.$ref && content.schema.type === 'object';\n }\n\n private hasInlineResponseSchema(operation: OpenAPIOperation): boolean {\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n if (!successResponse) return false;\n\n const content = successResponse.content?.['application/json'];\n if (!content?.schema) return false;\n\n const schema = content.schema;\n if (schema.$ref) return false;\n if (schema.type === 'object' && schema.properties?.pagination) return false;\n return schema.type === 'object' && !!schema.properties;\n }\n\n private generateInlineSchemaName(resourceName: string, methodName: string, purpose: string): string {\n const prefix = this.schemaPrefix ? camelCase(this.schemaPrefix) : '';\n // When prefixed, resourceName must be PascalCased to avoid merging with the camelCase prefix.\n // Without prefix, resourceName stays camelCase as the leading segment.\n const baseName = `${prefix}${prefix ? pascalCase(resourceName) : camelCase(resourceName)}${capitalize(methodName)}${capitalize(purpose)}Schema`;\n return camelCase(baseName);\n }\n\n private getPathParams(operation: OpenAPIOperation): Array<{ name: string; type: string; required: boolean }> {\n return (operation.parameters || [])\n .filter((p): p is OpenAPIParameter => 'in' in p && p.in === 'path')\n .map((p) => ({\n name: p.name,\n type: this.paramTypeToTs(p.schema),\n required: p.required !== false,\n }));\n }\n\n private getQueryParams(\n operation: OpenAPIOperation,\n ): Array<{ name: string; type: string; required: boolean; schema?: OpenAPISchema }> {\n return (operation.parameters || [])\n .filter((p): p is OpenAPIParameter => 'in' in p && p.in === 'query')\n .map((p) => ({\n name: p.name,\n type: this.paramTypeToTs(p.schema),\n required: p.required === true,\n schema: p.schema,\n }));\n }\n\n private paramTypeToTs(schema?: OpenAPISchema): string {\n if (!schema) return 'string';\n if (schema.enum) return schema.enum.map((v) => `'${v}'`).join(' | ');\n switch (schema.type) {\n case 'integer':\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n default:\n return 'string';\n }\n }\n\n private paramToZod(\n param: { name: string; required: boolean; schema?: OpenAPISchema },\n resourceName?: string,\n ): string {\n const { schema, name: paramName } = param;\n if (!schema) return 'z.string()';\n\n let zodType: string;\n if (schema.enum) {\n if (isBooleanLikeEnum(schema.enum)) {\n zodType = 'z.boolean()';\n } else {\n const context = {\n source: 'queryParam' as const,\n resourceName: resourceName || this.currentResourceName || undefined,\n paramName: paramName,\n };\n const enumInfo = this.enumRegistry.register(schema.enum, context);\n zodType = enumInfo.schemaConstName;\n }\n } else {\n switch (schema.type) {\n case 'integer':\n zodType = 'z.number().int()';\n break;\n case 'number':\n zodType = 'z.number()';\n break;\n case 'boolean':\n zodType = 'z.boolean()';\n break;\n default:\n zodType = 'z.string()';\n }\n }\n\n if (!param.required) {\n zodType = `${zodType}.optional()`;\n }\n\n return zodType;\n }\n\n private isPaginationParam(paramName: string): boolean {\n return ['page', 'limit', 'orderBy', 'ordering'].includes(paramName);\n }\n\n private getUniqueMethodName(\n operationId: string | undefined,\n httpMethod: string,\n pathPattern: string,\n usedNames: Set<string>,\n responseSchema?: OpenAPISchema,\n ): string {\n let methodName = operationIdToMethodName(operationId, httpMethod, pathPattern, '', responseSchema);\n\n if (usedNames.has(methodName) && operationId) {\n methodName = camelCase(operationId);\n }\n\n let finalName = methodName;\n let counter = 1;\n while (usedNames.has(finalName)) {\n finalName = `${methodName}${counter}`;\n counter++;\n }\n\n usedNames.add(finalName);\n return finalName;\n }\n\n private getOperationKey(pathPattern: string, httpMethod: string): string {\n return `${httpMethod}:${pathPattern}`;\n }\n\n private getResourceClassName(pathSegments: string[]): string {\n return pathSegments.map((seg) => pascalCase(seg)).join('');\n }\n\n private generateResourceNode(node: PathTreeNode, pathSegments: string[]): ResourceResult {\n const parentImportPath = '../';\n const resourceClassName = this.getResourceClassName(pathSegments);\n\n this.currentResourceName = resourceClassName;\n\n const lines: string[] = [];\n const usedMethodNames = new Set<string>();\n const schemaImports = new Set<string>();\n let hasQueryParams = false;\n let hasPaginatedResponse = false;\n\n const childResources: Array<{ propertyName: string; className: string; fileName: string }> = [];\n for (const [childName, childNode] of node.children) {\n const childPath = [...pathSegments, childName];\n const childClassName = this.getResourceClassName(childPath);\n childResources.push({\n propertyName: singularize(camelCase(childName)),\n className: childClassName,\n fileName: `${childClassName}.resource`,\n });\n }\n\n const operationMethodNames = new Map<string, string>();\n let usesInlineZod = false;\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n const responseContent = successResponse?.content?.['application/json'];\n const responseSchemaObj = responseContent?.schema;\n\n const methodName = this.getUniqueMethodName(\n operation.operationId,\n httpMethod,\n pathPattern,\n usedMethodNames,\n responseSchemaObj,\n );\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n operationMethodNames.set(opKey, methodName);\n\n const queryParams = this.getQueryParams(operation);\n if (queryParams.length > 0) {\n hasQueryParams = true;\n }\n\n if (responseSchemaObj?.type === 'object' && responseSchemaObj?.properties?.pagination) {\n hasPaginatedResponse = true;\n }\n\n if (\n responseSchemaObj?.type === 'object' &&\n responseSchemaObj?.properties?.pagination &&\n !responseSchemaObj?.properties?.data?.items?.$ref\n ) {\n usesInlineZod = true;\n }\n }\n\n const typeImports = new Map<string, string>();\n\n if (hasQueryParams) {\n schemaImports.add('paginationParamsSchema');\n }\n if (hasPaginatedResponse) {\n schemaImports.add('paginationResponseSchema');\n typeImports.set('paginationResponseSchema', 'PaginationResponse');\n }\n\n for (const { pathPattern, operation } of node.operations) {\n const responseSchema = this.getResponseSchemaName(operation, pathPattern);\n if (responseSchema) {\n const schemaConst = prefixSchemaConst(responseSchema, this.schemaPrefix);\n schemaImports.add(schemaConst);\n typeImports.set(schemaConst, prefixTypeName(responseSchema, this.schemaPrefix));\n }\n const requestSchema = this.getRequestSchemaName(operation, pathPattern);\n if (requestSchema) {\n const schemaConst = prefixSchemaConst(requestSchema, this.schemaPrefix);\n schemaImports.add(schemaConst);\n typeImports.set(schemaConst, prefixTypeName(requestSchema, this.schemaPrefix));\n }\n }\n\n const inlineBodySchemas = new Map<string, { schemaConst: string; typeName: string }>();\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n if (this.hasInlineRequestBody(operation)) {\n const requestSchema = this.getRequestSchemaName(operation, pathPattern);\n if (!requestSchema) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const schemaConstName = this.generateInlineSchemaName(resourceClassName, methodName, 'body');\n const typeName = schemaConstToTypeName(schemaConstName);\n inlineBodySchemas.set(opKey, { schemaConst: schemaConstName, typeName });\n schemaImports.add(schemaConstName);\n typeImports.set(schemaConstName, typeName);\n }\n }\n }\n\n const inlineResponseSchemas = new Map<string, { schemaConst: string; typeName: string }>();\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n if (this.hasInlineResponseSchema(operation)) {\n const responseSchema = this.getResponseSchemaName(operation, pathPattern);\n if (!responseSchema) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const schemaConstName = this.generateInlineSchemaName(resourceClassName, methodName, 'response');\n const typeName = schemaConstToTypeName(schemaConstName);\n inlineResponseSchemas.set(opKey, { schemaConst: schemaConstName, typeName });\n schemaImports.add(schemaConstName);\n typeImports.set(schemaConstName, typeName);\n }\n }\n }\n\n const needsZod = hasQueryParams || usesInlineZod;\n if (needsZod) {\n lines.push(\"import { z } from 'zod';\");\n lines.push('');\n }\n\n const hasParsing = node.operations.some(({ httpMethod, operation }) => {\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n const hasResponseParsing = !!successResponse?.content?.['application/json']?.schema;\n const hasBodyParsing = ['post', 'put', 'patch'].includes(httpMethod) && !!operation.requestBody;\n const hasParamsParsing = this.getQueryParams(operation).length > 0;\n return hasResponseParsing || hasBodyParsing || hasParamsParsing;\n });\n if (hasParsing) {\n lines.push(`import { parseSchema } from '${this.runtimePackage}';`);\n }\n\n lines.push(`import { Resource } from '${parentImportPath}Resource';`);\n\n const schemaImportPlaceholderIndex = lines.length;\n lines.push('__SCHEMA_IMPORTS_PLACEHOLDER__');\n\n for (const child of childResources) {\n lines.push(`import { ${child.className}Resource } from './${child.fileName}';`);\n }\n lines.push('');\n\n const queryParamsSchemas: string[] = [];\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n const queryParams = this.getQueryParams(operation);\n if (queryParams.length > 0) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const { schemaConstName, typeName } = getResourcePrefixedParamNames(methodName, resourceClassName, this.schemaPrefix);\n\n const specificParams = queryParams.filter((p) => !this.isPaginationParam(p.name));\n\n if (specificParams.length > 0) {\n const props = specificParams.map((p) => {\n const zodCode = this.paramToZod(p, resourceClassName);\n if (p.schema?.enum) {\n const enumInfo = this.enumRegistry.get(p.schema.enum);\n if (enumInfo) {\n schemaImports.add(enumInfo.schemaConstName);\n }\n }\n return ` ${p.name}: ${zodCode}`;\n });\n queryParamsSchemas.push(\n `export const ${schemaConstName} = paginationParamsSchema.extend({\\n${props.join(',\\n')},\\n});`,\n );\n } else {\n queryParamsSchemas.push(`export const ${schemaConstName} = paginationParamsSchema;`);\n }\n queryParamsSchemas.push(`export type ${typeName} = z.input<typeof ${schemaConstName}>;`);\n queryParamsSchemas.push('');\n }\n }\n\n if (queryParamsSchemas.length > 0) {\n lines.push('// Query parameter schemas');\n lines.push(queryParamsSchemas.join('\\n'));\n }\n\n lines.push(`export class ${resourceClassName}Resource extends Resource {`);\n\n for (const child of childResources) {\n lines.push(` public ${child.propertyName}: ${child.className}Resource;`);\n }\n\n if (childResources.length > 0) {\n lines.push('');\n lines.push(\n ` constructor(client: InstanceType<typeof import('${parentImportPath}${this.clientClassName}').default>) {`,\n );\n lines.push(' super(client);');\n for (const child of childResources) {\n lines.push(` this.${child.propertyName} = new ${child.className}Resource(client);`);\n }\n lines.push(' }');\n }\n\n for (const { pathPattern, httpMethod, operation } of node.operations) {\n const opKey = this.getOperationKey(pathPattern, httpMethod);\n const methodName = operationMethodNames.get(opKey)!;\n const pathParams = this.getPathParams(operation);\n const queryParams = this.getQueryParams(operation);\n const responseSchema = this.getResponseSchemaName(operation, pathPattern);\n const requestSchema = this.getRequestSchemaName(operation, pathPattern);\n\n const params: string[] = [];\n for (const p of pathParams) {\n params.push(`${p.name}: ${p.type}`);\n }\n\n if (queryParams.length > 0) {\n const { typeName } = getResourcePrefixedParamNames(methodName, resourceClassName, this.schemaPrefix);\n const hasRequired = queryParams.some((p) => p.required);\n params.push(`params${hasRequired ? '' : '?'}: ${typeName}`);\n }\n\n const inlineBodySchema = inlineBodySchemas.get(opKey);\n\n if (['post', 'put', 'patch'].includes(httpMethod) && operation.requestBody) {\n if (requestSchema) {\n const schemaConst = prefixSchemaConst(requestSchema, this.schemaPrefix);\n const typeName = typeImports.get(schemaConst)!;\n params.push(`body: ${typeName}`);\n } else if (inlineBodySchema) {\n params.push(`body: ${inlineBodySchema.typeName}`);\n } else {\n params.push('body: Record<string, unknown>');\n }\n }\n\n const fullPath = this.stripPathPrefix ? this.stripPathPrefix + pathPattern : pathPattern;\n let pathTemplate = fullPath.replace(/\\{(\\w+)\\}/g, '${$1}');\n pathTemplate = '`' + pathTemplate + '`';\n\n const successResponse = operation.responses?.['200'] || operation.responses?.['201'];\n const responseContent = successResponse?.content?.['application/json'];\n const responseSchemaObj = responseContent?.schema;\n\n let returnType = 'void';\n let parseLogic = '';\n\n if (responseSchemaObj) {\n if (responseSchemaObj.type === 'object' && responseSchemaObj.properties?.pagination) {\n const dataRef = responseSchemaObj.properties.data?.items?.$ref;\n if (dataRef) {\n const rawItemSchema = dataRef.split('/').pop()!;\n const itemSchema = cleanSchemaName(rawItemSchema);\n const itemSchemaConst = prefixSchemaConst(itemSchema, this.schemaPrefix);\n const itemTypeName = prefixTypeName(itemSchema, this.schemaPrefix);\n schemaImports.add(itemSchemaConst);\n typeImports.set(itemSchemaConst, itemTypeName);\n returnType = `{ pagination: PaginationResponse; data: ${itemTypeName}[] }`;\n parseLogic = `const schema = z.object({ pagination: paginationResponseSchema, data: z.array(${itemSchemaConst}) }).describe('Paginated${itemTypeName}List');\n return parseSchema(schema, response);`;\n } else {\n if (responseSchema) {\n const itemSchemaConst = prefixSchemaConst(responseSchema, this.schemaPrefix);\n const itemTypeName = prefixTypeName(responseSchema, this.schemaPrefix);\n schemaImports.add(itemSchemaConst);\n typeImports.set(itemSchemaConst, itemTypeName);\n returnType = `{ pagination: PaginationResponse; data: ${itemTypeName}[] }`;\n parseLogic = `const schema = z.object({ pagination: paginationResponseSchema, data: z.array(${itemSchemaConst}) }).describe('Paginated${itemTypeName}List');\n return parseSchema(schema, response);`;\n } else {\n returnType = `{ pagination: PaginationResponse; data: unknown[] }`;\n parseLogic = `const schema = z.object({ pagination: paginationResponseSchema, data: z.array(z.unknown()) }).describe('PaginatedList');\n return parseSchema(schema, response);`;\n }\n }\n } else if (responseSchema) {\n const schemaConstName = prefixSchemaConst(responseSchema, this.schemaPrefix);\n const typeName = prefixTypeName(responseSchema, this.schemaPrefix);\n returnType = typeName;\n parseLogic = `return parseSchema(${schemaConstName}, response);`;\n schemaImports.add(schemaConstName);\n typeImports.set(schemaConstName, typeName);\n } else if (inlineResponseSchemas.get(opKey)) {\n const inlineSchema = inlineResponseSchemas.get(opKey)!;\n returnType = inlineSchema.typeName;\n parseLogic = `return parseSchema(${inlineSchema.schemaConst}, response);`;\n } else {\n returnType = 'unknown';\n parseLogic = 'return response;';\n }\n }\n\n lines.push('');\n lines.push(` async ${methodName}(${params.join(', ')}): Promise<${returnType}> {`);\n\n if (queryParams.length > 0) {\n const { schemaConstName } = getResourcePrefixedParamNames(methodName, resourceClassName, this.schemaPrefix);\n lines.push(` const searchParams = new URLSearchParams();`);\n lines.push(` if (params) {`);\n lines.push(` const validated = parseSchema(${schemaConstName}, params);`);\n lines.push(` Object.entries(validated).forEach(([key, value]) => {`);\n lines.push(` if (value !== undefined) searchParams.set(key, String(value));`);\n lines.push(` });`);\n lines.push(` }`);\n lines.push(` const query = searchParams.toString();`);\n lines.push(` const url = query ? \\`\\${${pathTemplate}}?\\${query}\\` : ${pathTemplate};`);\n }\n\n const urlVar = queryParams.length > 0 ? 'url' : pathTemplate;\n const needsResponse = returnType !== 'void';\n const responsePrefix = needsResponse ? 'const response = ' : '';\n\n const hasBodySchema = requestSchema || inlineBodySchema;\n const hasBodyValidation = ['post', 'put', 'patch'].includes(httpMethod) && hasBodySchema;\n const bodyVar = hasBodyValidation ? 'validatedBody' : 'body';\n\n if (hasBodyValidation) {\n const bodySchemaConst = requestSchema\n ? prefixSchemaConst(requestSchema, this.schemaPrefix)\n : inlineBodySchema!.schemaConst;\n lines.push(` const validatedBody = parseSchema(${bodySchemaConst}, body);`);\n }\n\n switch (httpMethod) {\n case 'get':\n lines.push(` ${responsePrefix}await this.client.get(${urlVar});`);\n break;\n case 'post':\n lines.push(` ${responsePrefix}await this.client.post(${urlVar}, ${bodyVar});`);\n break;\n case 'put':\n lines.push(` ${responsePrefix}await this.client.put(${urlVar}, ${bodyVar});`);\n break;\n case 'patch':\n lines.push(` ${responsePrefix}await this.client.patch(${urlVar}, ${bodyVar});`);\n break;\n case 'delete':\n lines.push(` ${responsePrefix}await this.client.delete(${urlVar});`);\n break;\n }\n\n if (parseLogic) {\n lines.push(` ${parseLogic}`);\n }\n\n lines.push(' }');\n }\n\n lines.push('}');\n\n const placeholderIndex = lines.findIndex((l) => l === '__SCHEMA_IMPORTS_PLACEHOLDER__');\n if (placeholderIndex >= 0) {\n if (schemaImports.size > 0 || typeImports.size > 0) {\n const allImports = new Set([...schemaImports, ...typeImports.values()]);\n lines[placeholderIndex] = `import { ${Array.from(allImports).join(', ')} } from '${parentImportPath}schemas';`;\n } else {\n lines.splice(placeholderIndex, 1);\n }\n }\n\n return {\n className: resourceClassName,\n code: lines.join('\\n'),\n children: childResources,\n };\n }\n\n private generateFromTree(\n node: PathTreeNode,\n pathSegments: string[] = [],\n depth = 0,\n ): Array<ResourceResult & { pathSegments: string[] }> {\n const resources: Array<ResourceResult & { pathSegments: string[] }> = [];\n\n for (const [childName, childNode] of node.children) {\n const childPath = [...pathSegments, childName];\n const childResources = this.generateFromTree(childNode, childPath, depth + 1);\n resources.push(...childResources);\n }\n\n if (pathSegments.length > 0 && (node.operations.length > 0 || node.children.size > 0)) {\n const resource = this.generateResourceNode(node, pathSegments);\n resources.push({\n pathSegments,\n ...resource,\n });\n }\n\n return resources;\n }\n\n generateAll(): {\n resources: Record<string, string>;\n tree: PathTreeNode;\n inlineSchemas: Map<string, { schema: OpenAPISchema; isInput: boolean; typeName: string }>;\n } {\n this.collectAllInlineSchemas();\n\n const resources = this.generateFromTree(this.pathTree);\n\n const result: Record<string, string> = {};\n for (const resource of resources) {\n result[resource.className] = resource.code;\n }\n\n return {\n resources: result,\n tree: this.pathTree,\n inlineSchemas: this.collectedInlineSchemas,\n };\n }\n}\n","import { EnumRegistry, EnumContext } from './enum-registry';\nimport { camelCase, pascalCase, isBooleanLikeEnum, cleanSchemaName, prefixSchemaConst, prefixTypeName, OpenAPISchema } from './utils';\n\nexport interface UsedDateSchemas {\n stringToDateSchema: boolean;\n stringToDaySchema: boolean;\n dateToStringSchema: boolean;\n dayToStringSchema: boolean;\n}\n\nexport class ZodGenerator {\n private schemas: Record<string, OpenAPISchema>;\n private generatedSchemas = new Map<string, string>();\n private schemaOrder: string[] = [];\n private inlineSchemas = new Map<string, { schema: OpenAPISchema; isInput: boolean; typeName: string }>();\n public enumRegistry: EnumRegistry;\n public usedDateSchemas: UsedDateSchemas = {\n stringToDateSchema: false,\n stringToDaySchema: false,\n dateToStringSchema: false,\n dayToStringSchema: false,\n };\n private currentSchemaName: string | null = null;\n private currentPropertyPath: string | null = null;\n\n private schemaPrefix: string;\n\n constructor(schemas?: Record<string, OpenAPISchema>, enumRegistry?: EnumRegistry, schemaPrefix?: string) {\n this.schemas = schemas || {};\n this.enumRegistry = enumRegistry || new EnumRegistry();\n this.schemaPrefix = schemaPrefix || '';\n }\n\n addInlineSchemas(inlineSchemas: Map<string, { schema: OpenAPISchema; isInput: boolean; typeName: string }>): void {\n this.inlineSchemas = inlineSchemas;\n }\n\n convertSchema(schema: OpenAPISchema | undefined, schemaName: string | null = null, isTopLevel = false): string {\n if (!schema) return 'z.unknown()';\n\n if (schema.$ref) {\n const refName = schema.$ref.split('/').pop()!;\n const cleanedName = cleanSchemaName(refName);\n return prefixSchemaConst(cleanedName, this.schemaPrefix);\n }\n\n if (schema.anyOf) {\n const options = schema.anyOf.map((s) => this.convertSchema(s, schemaName));\n if (options.length === 2 && options.includes('z.null()')) {\n const nonNull = options.find((o) => o !== 'z.null()');\n const isInputSchema =\n schemaName &&\n (schemaName.includes('Input') || schemaName.includes('Create') || schemaName.includes('Update'));\n return isInputSchema ? `${nonNull}.nullish()` : `${nonNull}.nullable()`;\n }\n return `z.union([${options.join(', ')}])`;\n }\n\n if (schema.oneOf) {\n if (schema.oneOf.length === 2) {\n const nullIdx = schema.oneOf.findIndex((s) => this.isNullSchema(s));\n if (nullIdx !== -1) {\n const nonNull = this.convertSchema(schema.oneOf[1 - nullIdx], schemaName);\n const isInputSchema =\n schemaName &&\n (schemaName.includes('Input') || schemaName.includes('Create') || schemaName.includes('Update'));\n return isInputSchema ? `${nonNull}.nullish()` : `${nonNull}.nullable()`;\n }\n }\n const options = schema.oneOf.map((s) => this.convertSchema(s, schemaName));\n return `z.union([${options.join(', ')}])`;\n }\n\n if (schema.allOf) {\n const schemas = schema.allOf.map((s) => this.convertSchema(s, schemaName));\n if (schemas.length === 1) return schemas[0];\n return schemas.reduce((acc, s) => `${acc}.merge(${s})`);\n }\n\n if (schema.const !== undefined) {\n if (typeof schema.const === 'string') {\n return `z.literal('${schema.const}')`;\n }\n return `z.literal(${JSON.stringify(schema.const)})`;\n }\n\n const isNullable = schema.nullable === true;\n let zodSchema: string;\n\n switch (schema.type) {\n case 'string':\n zodSchema = this.convertStringSchema(schema, schemaName);\n break;\n case 'number':\n case 'integer':\n zodSchema = this.convertNumberSchema(schema, schemaName);\n break;\n case 'boolean':\n zodSchema = 'z.boolean()';\n break;\n case 'array':\n zodSchema = this.convertArraySchema(schema, schemaName);\n break;\n case 'object':\n zodSchema = this.convertObjectSchema(schema, schemaName);\n break;\n case 'null':\n return 'z.null()';\n default:\n if (schema.enum) {\n zodSchema = this.convertEnumSchema(schema, schemaName);\n } else if (schema.properties) {\n zodSchema = this.convertObjectSchema(schema, schemaName);\n } else {\n zodSchema = 'z.unknown()';\n }\n }\n\n if (isNullable) {\n const isInputSchema =\n schemaName && (schemaName.includes('Input') || schemaName.includes('Create') || schemaName.includes('Update'));\n zodSchema = isInputSchema ? `${zodSchema}.nullish()` : `${zodSchema}.nullable()`;\n }\n\n return zodSchema;\n }\n\n private isNullSchema(schema: OpenAPISchema): boolean {\n if (schema.type === 'null') return true;\n if (schema.enum && schema.enum.length === 1 && schema.enum[0] === null) return true;\n if (schema.$ref) {\n const refName = schema.$ref.split('/').pop()!;\n const resolved = this.schemas[refName];\n if (resolved) return this.isNullSchema(resolved);\n }\n return false;\n }\n\n private convertStringSchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n if (schema.enum) {\n return this.convertEnumSchema(schema, schemaName);\n }\n\n if (schema.format === 'date-time' || schema.format === 'date') {\n const isInputSchema =\n schemaName && (schemaName.includes('Input') || schemaName.includes('Create') || schemaName.includes('Update'));\n const isDateTime = schema.format === 'date-time';\n\n if (isInputSchema) {\n if (isDateTime) {\n this.usedDateSchemas.dateToStringSchema = true;\n return 'dateToStringSchema';\n } else {\n this.usedDateSchemas.dayToStringSchema = true;\n return 'dayToStringSchema';\n }\n }\n if (isDateTime) {\n this.usedDateSchemas.stringToDateSchema = true;\n return 'stringToDateSchema';\n } else {\n this.usedDateSchemas.stringToDaySchema = true;\n return 'stringToDaySchema';\n }\n }\n\n let zod = 'z.string()';\n if (schema.format === 'uuid') {\n zod = 'z.string().uuid()';\n } else if (schema.format === 'email') {\n zod = 'z.string().email()';\n } else if (schema.format === 'uri') {\n zod = 'z.string().url()';\n }\n\n if (schema.minLength !== undefined) {\n zod = `${zod}.min(${schema.minLength})`;\n }\n if (schema.maxLength !== undefined) {\n zod = `${zod}.max(${schema.maxLength})`;\n }\n if (schema.pattern && !schema.format) {\n zod = `${zod}.regex(/${schema.pattern}/)`;\n }\n\n return zod;\n }\n\n private convertNumberSchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n const isInputSchema =\n schemaName &&\n (schemaName.includes('Input') ||\n schemaName.includes('Body') ||\n schemaName.includes('Params') ||\n schemaName === 'InlineInput');\n const baseType = isInputSchema ? 'z.coerce.number()' : 'z.number()';\n let zod = schema.type === 'integer' ? `${baseType}.int()` : baseType;\n\n if (schema.minimum !== undefined) {\n zod = `${zod}.min(${schema.minimum})`;\n }\n if (schema.maximum !== undefined) {\n zod = `${zod}.max(${schema.maximum})`;\n }\n\n return zod;\n }\n\n private convertArraySchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n const itemSchema = schema.items ? this.convertSchema(schema.items, schemaName) : 'z.unknown()';\n let zod = `z.array(${itemSchema})`;\n\n if (schema.minItems !== undefined) {\n zod = `${zod}.min(${schema.minItems})`;\n }\n if (schema.maxItems !== undefined) {\n zod = `${zod}.max(${schema.maxItems})`;\n }\n\n return zod;\n }\n\n private convertObjectSchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\n const valueSchema = this.convertSchema(schema.additionalProperties as OpenAPISchema, schemaName);\n return `z.record(z.string(), ${valueSchema})`;\n }\n return 'z.object({})';\n }\n\n const required = new Set(schema.required || []);\n const properties: string[] = [];\n\n for (const [propName, propSchema] of Object.entries(schema.properties)) {\n const previousPropertyPath = this.currentPropertyPath;\n this.currentPropertyPath = previousPropertyPath ? `${previousPropertyPath}.${propName}` : propName;\n\n const propZod = this.convertSchema(propSchema, schemaName);\n const isRequired = required.has(propName);\n const finalProp = isRequired ? propZod : `${propZod}.optional()`;\n properties.push(` ${propName}: ${finalProp}`);\n\n this.currentPropertyPath = previousPropertyPath;\n }\n\n let zod = `z.object({\\n${properties.join(',\\n')}\\n})`;\n\n if (schema.additionalProperties === false) {\n zod = `${zod}.strict()`;\n }\n\n return zod;\n }\n\n private convertEnumSchema(schema: OpenAPISchema, schemaName: string | null = null): string {\n const rawValues = schema.enum!;\n const hasNull = rawValues.some((v) => v === null);\n const values = rawValues.filter((v): v is string => v !== null && v !== '');\n\n if (values.length === 0) {\n if (hasNull) return 'z.null()';\n // Enum with only empty string(s) — treat as z.literal('')\n return \"z.literal('')\";\n }\n\n if (isBooleanLikeEnum(values)) {\n return hasNull ? 'z.boolean().nullable()' : 'z.boolean()';\n }\n\n const context: EnumContext = {\n source: 'schema',\n schemaName: this.currentSchemaName || schemaName || undefined,\n propertyPath: this.currentPropertyPath || undefined,\n };\n\n const enumInfo = this.enumRegistry.register(values, context);\n return hasNull ? `${enumInfo.schemaConstName}.nullable()` : enumInfo.schemaConstName;\n }\n\n private extractDependencies(schema: OpenAPISchema | undefined): Set<string> {\n const deps = new Set<string>();\n if (!schema) return deps;\n\n if (schema.$ref) {\n const refName = schema.$ref.split('/').pop()!;\n deps.add(refName);\n return deps;\n }\n\n if (schema.anyOf) {\n for (const s of schema.anyOf) {\n for (const dep of this.extractDependencies(s)) {\n deps.add(dep);\n }\n }\n }\n\n if (schema.oneOf) {\n for (const s of schema.oneOf) {\n for (const dep of this.extractDependencies(s)) {\n deps.add(dep);\n }\n }\n }\n\n if (schema.allOf) {\n for (const s of schema.allOf) {\n for (const dep of this.extractDependencies(s)) {\n deps.add(dep);\n }\n }\n }\n\n if (schema.items) {\n for (const dep of this.extractDependencies(schema.items)) {\n deps.add(dep);\n }\n }\n\n if (schema.properties) {\n for (const propSchema of Object.values(schema.properties)) {\n for (const dep of this.extractDependencies(propSchema)) {\n deps.add(dep);\n }\n }\n }\n\n if (schema.additionalProperties && typeof schema.additionalProperties === 'object') {\n for (const dep of this.extractDependencies(schema.additionalProperties as OpenAPISchema)) {\n deps.add(dep);\n }\n }\n\n return deps;\n }\n\n private topologicalSort(schemaNames: string[]): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n const visiting = new Set<string>();\n\n const visit = (name: string) => {\n if (visited.has(name)) return;\n if (visiting.has(name)) return;\n\n visiting.add(name);\n\n const schema = this.schemas[name];\n if (schema) {\n const deps = this.extractDependencies(schema);\n for (const dep of deps) {\n if (schemaNames.includes(dep)) {\n visit(dep);\n }\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n result.push(name);\n };\n\n for (const name of schemaNames) {\n visit(name);\n }\n\n return result;\n }\n\n generateSchemas(runtimePackage: string): string {\n const schemaOutput: string[] = [];\n\n for (const name of Object.keys(this.schemas)) {\n this.schemaOrder.push(name);\n }\n\n this.schemaOrder = this.topologicalSort(this.schemaOrder);\n\n const usedNames = new Set<string>();\n\n for (const name of this.schemaOrder) {\n const schema = this.schemas[name];\n\n this.currentSchemaName = name;\n this.currentPropertyPath = null;\n\n const zodSchema = this.convertSchema(schema, name, true);\n\n this.currentSchemaName = null;\n\n let cleanName = name;\n if (cleanName.endsWith('SchemaInput')) {\n cleanName = cleanName.replace('SchemaInput', 'Input');\n } else if (cleanName.endsWith('Schema')) {\n cleanName = cleanName.replace('Schema', '');\n }\n\n const schemaConstName = prefixSchemaConst(cleanName, this.schemaPrefix);\n const typeName = prefixTypeName(cleanName, this.schemaPrefix);\n\n if (usedNames.has(schemaConstName) || usedNames.has(typeName)) {\n continue;\n }\n usedNames.add(schemaConstName);\n usedNames.add(typeName);\n\n schemaOutput.push(`export const ${schemaConstName} = ${zodSchema}.describe('${typeName}');`);\n const isInputType = /(?:Body|Input|Params)$/.test(cleanName);\n const inferType = isInputType ? 'z.input' : 'z.output';\n schemaOutput.push(`export type ${typeName} = ${inferType}<typeof ${schemaConstName}>;`);\n schemaOutput.push('');\n }\n\n this.enumRegistry.register(['desc', 'asc'], {\n source: 'schema',\n schemaName: 'PaginationParams',\n propertyPath: 'ordering',\n });\n const orderingEnumInfo = this.enumRegistry.get(['desc', 'asc'])!;\n\n schemaOutput.push('// Common pagination schemas');\n schemaOutput.push(`export const paginationParamsSchema = z.object({\n page: z.number().optional(),\n limit: z.number().optional(),\n orderBy: z.string().optional(),\n ordering: ${orderingEnumInfo.schemaConstName}.optional(),\n}).describe('PaginationParams');`);\n schemaOutput.push('export type PaginationParams = z.input<typeof paginationParamsSchema>;');\n schemaOutput.push('');\n\n schemaOutput.push(`export const paginationResponseSchema = z.object({\n page: z.number(),\n pages: z.number(),\n limit: z.number(),\n total: z.number(),\n}).describe('PaginationResponse');`);\n schemaOutput.push('export type PaginationResponse = z.output<typeof paginationResponseSchema>;');\n schemaOutput.push('');\n\n if (this.inlineSchemas.size > 0) {\n schemaOutput.push('// Inline request/response schemas');\n for (const [schemaName, schemaInfo] of this.inlineSchemas) {\n const { schema, isInput, typeName } = schemaInfo;\n const contextName = isInput ? 'InlineInput' : 'InlineOutput';\n const zodSchema = this.convertSchema(schema, contextName, true);\n schemaOutput.push(`export const ${schemaName} = ${zodSchema}.describe('${typeName}');`);\n const inferType = isInput ? 'z.input' : 'z.output';\n schemaOutput.push(`export type ${typeName} = ${inferType}<typeof ${schemaName}>;`);\n schemaOutput.push('');\n }\n }\n\n const output: string[] = [];\n output.push(\"import { z } from 'zod';\");\n\n const usedDateSchemasList = Object.entries(this.usedDateSchemas)\n .filter(([_, used]) => used)\n .map(([name]) => name);\n\n if (usedDateSchemasList.length > 0) {\n output.push(`import { ${usedDateSchemasList.join(', ')} } from '${runtimePackage}';`);\n }\n\n output.push('');\n\n const enumExports = this.enumRegistry.generateEnumExports();\n if (enumExports) {\n output.push(enumExports);\n }\n\n output.push(...schemaOutput);\n\n return output.join('\\n');\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport async function writeFile(filepath: string, content: string): Promise<void> {\n const dir = path.dirname(filepath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filepath, content);\n console.log(`Generated: ${filepath}`);\n}\n\nexport interface GeneratedFile {\n path: string;\n content: string;\n}\n\nexport async function writeFiles(files: GeneratedFile[]): Promise<void> {\n for (const file of files) {\n await writeFile(file.path, file.content);\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { OpenAPISpec } from './utils';\n\nexport async function loadSpec(specPath: string): Promise<OpenAPISpec> {\n // If it's a URL, fetch it\n if (specPath.startsWith('http://') || specPath.startsWith('https://')) {\n console.log(`Fetching OpenAPI spec from ${specPath}...`);\n const response = await fetch(specPath);\n if (!response.ok) {\n throw new Error(`Failed to fetch OpenAPI spec: ${response.statusText}`);\n }\n const spec = (await response.json()) as OpenAPISpec;\n console.log(`OpenAPI spec version: ${spec.openapi}`);\n console.log(`API title: ${spec.info.title}`);\n return spec;\n }\n\n // Otherwise, read from file\n const resolvedPath = path.resolve(specPath);\n console.log(`Reading OpenAPI spec from ${resolvedPath}...`);\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`OpenAPI spec file not found: ${resolvedPath}`);\n }\n\n const content = fs.readFileSync(resolvedPath, 'utf-8');\n\n let spec: OpenAPISpec;\n if (resolvedPath.endsWith('.yaml') || resolvedPath.endsWith('.yml')) {\n throw new Error('YAML specs are not supported yet. Please use JSON format.');\n } else {\n spec = JSON.parse(content) as OpenAPISpec;\n }\n\n console.log(`OpenAPI spec version: ${spec.openapi}`);\n console.log(`API title: ${spec.info.title}`);\n return spec;\n}\n","import path from 'path';\nimport { generateClient } from '../../generator/client-generator';\nimport type { OrcConfig } from '../../generator/config';\n\nexport async function runGenerate(\n config: OrcConfig,\n options: { client?: string; spec?: string },\n): Promise<void> {\n const runtimePackage = config.runtimePackage || '@moinax/orc';\n\n let clients = config.clients;\n\n if (options.client) {\n clients = clients.filter((c) => c.name.toLowerCase() === options.client!.toLowerCase());\n if (clients.length === 0) {\n console.error(`Error: Client \"${options.client}\" not found in configuration.`);\n console.log('Available clients:', config.clients.map((c) => c.name).join(', '));\n process.exit(1);\n }\n }\n\n if (options.spec && !options.client) {\n console.error('Error: --spec requires --client to be specified');\n process.exit(1);\n }\n\n console.log('ORC - OpenAPI Rest Client Generator');\n console.log('====================================');\n console.log(`Generating ${clients.length} client(s): ${clients.map((c) => c.name).join(', ')}`);\n if (options.spec) {\n console.log(`Using custom spec: ${options.spec}`);\n }\n\n const results = [];\n for (const clientConfig of clients) {\n try {\n const result = await generateClient(clientConfig, {\n specOverride: options.spec,\n runtimePackage,\n });\n results.push(result);\n } catch (error) {\n console.error(`\\nError generating ${clientConfig.name}Client:`, (error as Error).message);\n process.exit(1);\n }\n }\n\n console.log('\\n' + '='.repeat(60));\n console.log('All clients generated successfully!');\n console.log('='.repeat(60));\n\n for (const result of results) {\n console.log(`\\n${result.name}Client resources: ${result.resourceNames.join(', ')}`);\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nconst CONFIG_TEMPLATE = `import { defineConfig } from '@moinax/orc/config';\n\nexport default defineConfig({\n clients: [\n {\n name: 'MyApi',\n spec: 'https://api.example.com/openapi.json',\n output: 'src/lib/api/my-api-client',\n },\n ],\n});\n`;\n\nexport async function runInit(): Promise<void> {\n const configPath = path.join(process.cwd(), 'orc.config.ts');\n\n if (fs.existsSync(configPath)) {\n console.error(`Config file already exists: ${configPath}`);\n process.exit(1);\n }\n\n fs.writeFileSync(configPath, CONFIG_TEMPLATE);\n console.log(`Created config file: ${configPath}`);\n console.log('\\nEdit the file to configure your API clients, then run:');\n console.log(' orc generate');\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,OAAOA,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,kBAAkB;;;ACH3B,OAAOC,SAAQ;AACf,OAAOC,WAAU;;;ACDjB,OAAOC,mBAAkB;;;ACAzB,OAAO,kBAAkB;AAElB,SAAS,WAAW,KAAqB;AAC9C,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;AAEO,SAAS,UAAU,KAAqB;AAC7C,QAAM,SAAS,IACZ,QAAQ,WAAW,GAAG,EACtB,QAAQ,gBAAgB,CAAC,GAAG,SAAS,KAAK,YAAY,CAAC,EACvD,QAAQ,OAAO,EAAE;AAEpB,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACxD;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,WAAW,UAAU,GAAG,CAAC;AAClC;AAEO,SAAS,sBAAsB,iBAAiC;AACrE,QAAM,gBAAgB,gBAAgB,QAAQ,WAAW,EAAE;AAC3D,SAAO,WAAW,aAAa;AACjC;AAEO,SAAS,YAAY,KAAqB;AAC/C,QAAM,QAAQ,IAAI,MAAM,sBAAsB;AAC9C,MAAI,OAAO;AACT,UAAM,SAAS,MAAM,CAAC;AACtB,UAAM,WAAW,MAAM,CAAC;AACxB,WAAO,SAAS,aAAa,SAAS,QAAQ;AAAA,EAChD;AACA,SAAO,aAAa,SAAS,GAAG;AAClC;AAEO,SAAS,kBAAkB,QAA4B;AAC5D,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,EAAG,QAAO;AAC1D,QAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK;AAChC,SAAO,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM;AAChD;AAEO,SAAS,kBAAkB,MAAc,cAA+B;AAC7E,MAAI,CAAC,aAAc,QAAO,GAAG,UAAU,IAAI,CAAC;AAC5C,SAAO,GAAG,UAAU,YAAY,CAAC,GAAG,WAAW,IAAI,CAAC;AACtD;AAEO,SAAS,eAAe,MAAc,cAA+B;AAC1E,MAAI,CAAC,aAAc,QAAO,WAAW,IAAI;AACzC,SAAO,GAAG,WAAW,YAAY,CAAC,GAAG,WAAW,IAAI,CAAC;AACvD;AAEO,SAAS,8BACd,YACA,mBACA,cAC+C;AAC/C,QAAM,mBAAmB,YAAY,iBAAiB;AACtD,QAAM,SAAS,eAAe,WAAW,YAAY,IAAI;AAEzD,MAAI,WAAW,WAAW,KAAK,GAAG;AAChC,UAAM,OAAO,WAAW,MAAM,CAAC;AAC/B,WAAO;AAAA,MACL,iBAAiB,MAAM,MAAM,GAAG,gBAAgB,GAAG,IAAI;AAAA,MACvD,UAAU,MAAM,MAAM,GAAG,gBAAgB,GAAG,IAAI;AAAA,IAClD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,iBAAiB,GAAG,UAAU,UAAU,CAAC,GAAG,MAAM,GAAG,gBAAgB;AAAA,IACrE,UAAU,GAAG,WAAW,UAAU,CAAC,GAAG,MAAM,GAAG,gBAAgB;AAAA,EACjE;AACF;AAEO,SAAS,iBAAiB,MAAc,SAAuB;AACpE,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,UAAM,IAAI,MAAM,WAAW,OAAO,8BAA8B;AAAA,EAClE;AACA,MAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,GAAG;AACpE,UAAM,IAAI,MAAM,WAAW,OAAO,sCAAsC;AAAA,EAC1E;AACA,MAAI,CAAC,yBAAyB,KAAK,IAAI,GAAG;AACxC,UAAM,IAAI,MAAM,WAAW,OAAO,+CAA+C;AAAA,EACnF;AACF;AAEO,SAAS,mBAAmB,YAA0B;AAC3D,MAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,MAAI,WAAW,SAAS,IAAI,GAAG;AAC7B,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACF;AAwEO,SAAS,eAAe,gBAAoD;AACjF,MAAI,CAAC,eAAgB,QAAO;AAE5B,MAAI,eAAe,SAAS,YAAY,eAAe,YAAY,YAAY;AAC7E,WAAO;AAAA,EACT;AACA,MAAI,eAAe,SAAS,SAAS;AACnC,WAAO;AAAA,EACT;AACA,MAAI,eAAe,SAAS,YAAY,eAAe,YAAY;AACjE,eAAW,aAAa,CAAC,QAAQ,SAAS,SAAS,GAAG;AACpD,YAAM,OAAO,eAAe,WAAW,SAAS;AAChD,UAAI,MAAM,SAAS,QAAS,QAAO;AAAA,IACrC;AAAA,EACF;AACA,MAAI,eAAe,MAAM;AACvB,UAAM,UAAU,eAAe,KAAK,MAAM,GAAG,EAAE,IAAI;AACnD,QAAI,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,MAAM,GAAG;AAC7D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AA0BO,SAAS,wBACd,aACA,YACA,aACA,cACA,gBACQ;AACR,QAAM,SAAS,eAAe,cAAc;AAE5C,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO,SAAS,YAAY;AAAA,IAC9B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,cAAc,UAAU,WAAW,IAAI;AAAA,EAClD;AACF;AAEO,SAAS,kBAAkB,aAAoC;AACpE,SAAO,YACJ,MAAM,GAAG,EACT,OAAO,CAAC,QAAQ,GAAG,EACnB,IAAI,CAAC,SAAS;AAAA,IACb,MAAM,IAAI,WAAW,GAAG,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI;AAAA,IAC/C,SAAS,IAAI,WAAW,GAAG;AAAA,IAC3B,KAAK;AAAA,EACP,EAAE;AACN;AAEO,SAAS,gBAAgB,aAA+B;AAC7D,QAAM,WAAW,kBAAkB,WAAW;AAC9C,QAAM,eAAyB,CAAC;AAChC,aAAW,OAAO,UAAU;AAC1B,QAAI,CAAC,IAAI,SAAS;AAChB,mBAAa,KAAK,IAAI,IAAI;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAYO,SAAS,cAAc,OAA4F;AACxH,QAAM,OAAqB;AAAA,IACzB,MAAM;AAAA,IACN,UAAU,oBAAI,IAAI;AAAA,IAClB,YAAY,CAAC;AAAA,EACf;AAEA,aAAW,CAAC,aAAa,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1D,eAAW,CAAC,YAAY,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC7D,UAAI,eAAe,aAAc;AAEjC,YAAM,eAAe,gBAAgB,WAAW;AAEhD,UAAI,UAAU;AACd,iBAAW,WAAW,cAAc;AAClC,YAAI,CAAC,QAAQ,SAAS,IAAI,OAAO,GAAG;AAClC,kBAAQ,SAAS,IAAI,SAAS;AAAA,YAC5B,MAAM;AAAA,YACN,UAAU,oBAAI,IAAI;AAAA,YAClB,YAAY,CAAC;AAAA,UACf,CAAC;AAAA,QACH;AACA,kBAAU,QAAQ,SAAS,IAAI,OAAO;AAAA,MACxC;AAEA,cAAQ,WAAW,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAsB;AACpD,MAAI,KAAK,SAAS,aAAa,GAAG;AAChC,WAAO,KAAK,QAAQ,eAAe,OAAO;AAAA,EAC5C,WAAW,KAAK,SAAS,QAAQ,GAAG;AAClC,WAAO,KAAK,QAAQ,UAAU,EAAE;AAAA,EAClC;AAEA,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,MAAM,MAAM,SAAS,CAAC;AAAA,EAC/B;AAEA,SAAO,KAAK,QAAQ,OAAO,EAAE;AAC7B,SAAO,KAAK,QAAQ,gBAAgB,CAAC,GAAG,SAAS,KAAK,YAAY,CAAC;AAEnE,SAAO;AACT;;;AD9SO,IAAM,eAAN,MAAM,cAAa;AAAA,EAChB,QAAQ,oBAAI,IAAsB;AAAA,EAClC,eAAe,oBAAI,IAA2B;AAAA,EAC9C,YAAY,oBAAI,IAAY;AAAA,EAC5B;AAAA,EAER,YAAY,cAAuB;AACjC,SAAK,eAAe,gBAAgB;AAAA,EACtC;AAAA,EAEA,OAAO,YAAY,QAA0B;AAC3C,WAAO,KAAK,UAAU,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC;AAAA,EAC1C;AAAA,EAEA,kBAAkB,QAAkB,SAAgC;AAClE,UAAM,EAAE,QAAQ,YAAY,cAAc,WAAW,aAAa,IAAI;AAEtE,QAAI;AACJ,QAAI,WAAW,YAAY,cAAc,cAAc;AACrD,YAAMC,mBAAkB,WACrB,QAAQ,WAAW,EAAE,EACrB,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,UAAU,EAAE;AAEvB,YAAM,YAAY,aAAa,MAAM,GAAG;AACxC,YAAM,kBAAkB,UAAU,IAAI,CAAC,MAAM,WAAW,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;AAChF,iBAAW,UAAUA,gBAAe,IAAI;AAAA,IAC1C,WAAW,WAAW,gBAAgB,gBAAgB,WAAW;AAC/D,YAAM,mBAAmB,YAAY,YAAY;AACjD,iBAAW,UAAU,gBAAgB,IAAI,WAAW,SAAS;AAAA,IAC/D,OAAO;AACL,iBAAW,UAAU,OAAO,CAAC,EAAE,YAAY,CAAC;AAAA,IAC9C;AAEA,QAAI,KAAK,cAAc;AACrB,iBAAW,UAAU,KAAK,YAAY,IAAI,WAAW,QAAQ;AAAA,IAC/D;AAEA,UAAM,kBAAkBC,cAAa,SAAS,QAAQ,IAAI,WAAWA,cAAa,OAAO,QAAQ;AAEjG,WAAO;AAAA,MACL;AAAA,MACA,iBAAiB,GAAG,YAAY,QAAQ,CAAC;AAAA,MACzC,UAAU,WAAW,YAAY,QAAQ,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS,QAAkB,SAAgC;AACzD,UAAM,cAAc,cAAa,YAAY,MAAM;AAEnD,QAAI,CAAC,KAAK,aAAa,IAAI,WAAW,GAAG;AACvC,WAAK,aAAa,IAAI,aAAa,CAAC,CAAC;AAAA,IACvC;AACA,SAAK,aAAa,IAAI,WAAW,EAAG,KAAK,OAAO;AAEhD,QAAI,KAAK,MAAM,IAAI,WAAW,GAAG;AAC/B,aAAO,KAAK,MAAM,IAAI,WAAW;AAAA,IACnC;AAEA,QAAI,WAAW,KAAK,kBAAkB,QAAQ,OAAO;AAErD,QAAI,UAAU;AACd,UAAM,eAAe,MACnB,KAAK,UAAU,IAAI,SAAS,eAAe,KAC3C,KAAK,UAAU,IAAI,SAAS,eAAe,KAC3C,KAAK,UAAU,IAAI,SAAS,QAAQ;AAEtC,WAAO,aAAa,GAAG;AACrB,YAAM,WAAW,KAAK,kBAAkB,QAAQ,OAAO;AACvD,iBAAW;AAAA,QACT,iBAAiB,GAAG,SAAS,eAAe,GAAG,OAAO;AAAA,QACtD,iBAAiB,GAAG,SAAS,gBAAgB,QAAQ,WAAW,EAAE,CAAC,GAAG,OAAO;AAAA,QAC7E,UAAU,GAAG,SAAS,QAAQ,GAAG,OAAO;AAAA,QACxC,QAAQ,SAAS;AAAA,MACnB;AACA;AAAA,IACF;AAEA,SAAK,UAAU,IAAI,SAAS,eAAe;AAC3C,SAAK,UAAU,IAAI,SAAS,eAAe;AAC3C,SAAK,UAAU,IAAI,SAAS,QAAQ;AAEpC,SAAK,MAAM,IAAI,aAAa,QAAQ;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAA2B;AAC7B,WAAO,KAAK,MAAM,IAAI,cAAa,YAAY,MAAM,CAAC;AAAA,EACxD;AAAA,EAEA,IAAI,QAAwC;AAC1C,WAAO,KAAK,MAAM,IAAI,cAAa,YAAY,MAAM,CAAC;AAAA,EACxD;AAAA,EAEA,SAAqB;AACnB,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA,EAEA,sBAA8B;AAC5B,UAAM,QAAkB,CAAC;AAEzB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,iFAAiF;AAC5F,UAAM,KAAK,oBAAoB;AAC/B,UAAM,KAAK,iFAAiF;AAC5F,UAAM,KAAK,EAAE;AAEb,eAAW,YAAY,KAAK,MAAM,OAAO,GAAG;AAC1C,YAAM,EAAE,iBAAiB,iBAAiB,UAAU,OAAO,IAAI;AAC/D,YAAM,YAAY,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AAEvD,YAAM,KAAK,gBAAgB,eAAe,OAAO,SAAS,aAAa;AACvE,YAAM,KAAK,gBAAgB,eAAe,aAAa,eAAe,IAAI;AAC1E,YAAM,KAAK,eAAe,QAAQ,sBAAsB,eAAe,IAAI;AAC3E,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;AEjHO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACD;AAAA,EACC;AAAA,EACA;AAAA,EACA,qBAAqB,oBAAI,IAA4B;AAAA,EACtD,yBAAyB,oBAAI,IAGlC;AAAA,EACM,sBAAqC;AAAA,EACrC;AAAA,EACA;AAAA,EAER,YACE,OACA,SACA,iBACA,UAKI,CAAC,GACL;AACA,SAAK,UAAU,WAAW,CAAC;AAC3B,SAAK,kBAAkB;AACvB,SAAK,kBAAkB,QAAQ,mBAAmB;AAClD,SAAK,eAAe,QAAQ,gBAAgB,IAAI,aAAa;AAC7D,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,eAAe,QAAQ,gBAAgB;AAE5C,SAAK,QAAQ,KAAK,kBAAkB,KAAK,qBAAqB,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC;AACvF,SAAK,WAAW,cAAc,KAAK,KAAK;AAAA,EAC1C;AAAA,EAEA,0BAAsG;AACpG,SAAK,8BAA8B,KAAK,UAAU,CAAC,CAAC;AACpD,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,8BAA8B,MAAoB,YAA4B;AACpF,UAAM,WAAW,KAAK,SAAS,SAAS,KAAK,KAAK;AAClD,UAAM,cAAc,CAAC,GAAG,YAAY,QAAQ,EAAE,OAAO,OAAO;AAE5D,UAAM,uBAAuB,oBAAI,IAAoB;AACrD,eAAW,EAAE,aAAa,YAAY,UAAU,KAAK,KAAK,YAAY;AACpE,YAAM,qBACJ,UAAU,YAAY,KAAK,KAAK,UAAU,YAAY,KAAK,IAC1D,UAAU,kBAAkB,GAAG;AAClC,YAAM,aAAa;AAAA,QACjB,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACF;AACA,YAAM,QAAQ,KAAK,gBAAgB,aAAa,UAAU;AAC1D,2BAAqB,IAAI,OAAO,UAAU;AAAA,IAC5C;AAEA,UAAM,oBAAoB,KAAK,qBAAqB,WAAW;AAE/D,eAAW,EAAE,aAAa,YAAY,UAAU,KAAK,KAAK,YAAY;AACpE,UAAI,KAAK,qBAAqB,SAAS,GAAG;AACxC,cAAM,gBAAgB,KAAK,qBAAqB,WAAW,WAAW;AACtE,YAAI,CAAC,eAAe;AAClB,gBAAM,QAAQ,KAAK,gBAAgB,aAAa,UAAU;AAC1D,gBAAM,aAAa,qBAAqB,IAAI,KAAK;AACjD,gBAAM,kBAAkB,KAAK,yBAAyB,mBAAmB,YAAY,MAAM;AAE3F,gBAAM,aAAa,UAAU,YAAa,QAAS,kBAAkB,EAAG;AACxE,eAAK,uBAAuB,IAAI,iBAAiB;AAAA,YAC/C,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,UAAU,eAAe,GAAG,iBAAiB,GAAG,WAAW,UAAU,CAAC,QAAQ,KAAK,YAAY;AAAA,UACjG,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,eAAW,EAAE,aAAa,YAAY,UAAU,KAAK,KAAK,YAAY;AACpE,UAAI,KAAK,wBAAwB,SAAS,GAAG;AAC3C,cAAM,iBAAiB,KAAK,sBAAsB,WAAW,WAAW;AACxE,YAAI,CAAC,gBAAgB;AACnB,gBAAM,QAAQ,KAAK,gBAAgB,aAAa,UAAU;AAC1D,gBAAM,aAAa,qBAAqB,IAAI,KAAK;AACjD,gBAAM,kBAAkB,KAAK,yBAAyB,mBAAmB,YAAY,UAAU;AAE/F,gBAAM,kBAAkB,UAAU,YAAY,KAAK,KAAK,UAAU,YAAY,KAAK;AACnF,gBAAM,eAAe,gBAAiB,QAAS,kBAAkB,EAAG;AACpE,eAAK,uBAAuB,IAAI,iBAAiB;AAAA,YAC/C,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,UAAU,eAAe,GAAG,iBAAiB,GAAG,WAAW,UAAU,CAAC,YAAY,KAAK,YAAY;AAAA,UACrG,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,eAAW,CAAC,EAAE,SAAS,KAAK,KAAK,UAAU;AACzC,WAAK,8BAA8B,WAAW,WAAW;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,qBACN,OACuE;AACvE,UAAM,SAAgF,CAAC;AACvF,eAAW,CAAC,aAAa,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1D,UAAI,UAAU;AACd,UAAI,KAAK,mBAAmB,YAAY,WAAW,KAAK,eAAe,GAAG;AACxE,kBAAU,YAAY,MAAM,KAAK,gBAAgB,MAAM,KAAK;AAAA,MAC9D;AACA,aAAO,OAAO,IAAI;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,sBAAsB,WAA6B,cAA6B,MAAqB;AAC3G,UAAM,kBAAkB,UAAU,YAAY,KAAK,KAAK,UAAU,YAAY,KAAK;AACnF,QAAI,CAAC,gBAAiB,QAAO;AAE7B,UAAM,UAAU,gBAAgB,UAAU,kBAAkB;AAC5D,QAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,UAAM,SAAS,QAAQ;AACvB,QAAI,OAAO,MAAM;AACf,YAAM,UAAU,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI;AAC3C,aAAO,gBAAgB,OAAO;AAAA,IAChC;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,UAAI,UAAU,aAAa;AACzB,cAAM,OAAO,UAAU;AACvB,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,mBAAW,WAAW,UAAU;AAC9B,gBAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,cAAI,OAAO;AACT,kBAAM,aAAa,WAAW,MAAM,CAAC,EAAE,QAAQ,SAAS,GAAG,CAAC;AAC5D,kBAAM,mBAAmB,GAAG,UAAU;AACtC,gBAAI,KAAK,QAAQ,UAAU,KAAK,KAAK,QAAQ,gBAAgB,GAAG;AAC9D,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,aAAa;AACf,cAAM,eAAe,gBAAgB,WAAW;AAChD,YAAI,aAAa,SAAS,GAAG;AAC3B,gBAAM,cAAc,aAAa,aAAa,SAAS,CAAC;AACxD,gBAAM,aAAa,WAAW,YAAY,WAAW,CAAC;AACtD,gBAAM,mBAAmB,GAAG,UAAU;AACtC,cAAI,KAAK,QAAQ,UAAU,KAAK,KAAK,QAAQ,gBAAgB,GAAG;AAC9D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,YAAY,OAAO,YAAY;AACjD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,WAA6B,cAA6B,MAAqB;AAC1G,UAAM,UAAU,UAAU,aAAa,UAAU,kBAAkB;AACnE,QAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,UAAM,SAAS,QAAQ;AACvB,QAAI,OAAO,MAAM;AACf,YAAM,UAAU,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI;AAC3C,aAAO,gBAAgB,OAAO;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,WAAsC;AACjE,UAAM,UAAU,UAAU,aAAa,UAAU,kBAAkB;AACnE,QAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,WAAO,CAAC,QAAQ,OAAO,QAAQ,QAAQ,OAAO,SAAS;AAAA,EACzD;AAAA,EAEQ,wBAAwB,WAAsC;AACpE,UAAM,kBAAkB,UAAU,YAAY,KAAK,KAAK,UAAU,YAAY,KAAK;AACnF,QAAI,CAAC,gBAAiB,QAAO;AAE7B,UAAM,UAAU,gBAAgB,UAAU,kBAAkB;AAC5D,QAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,UAAM,SAAS,QAAQ;AACvB,QAAI,OAAO,KAAM,QAAO;AACxB,QAAI,OAAO,SAAS,YAAY,OAAO,YAAY,WAAY,QAAO;AACtE,WAAO,OAAO,SAAS,YAAY,CAAC,CAAC,OAAO;AAAA,EAC9C;AAAA,EAEQ,yBAAyB,cAAsB,YAAoB,SAAyB;AAClG,UAAM,SAAS,KAAK,eAAe,UAAU,KAAK,YAAY,IAAI;AAGlE,UAAM,WAAW,GAAG,MAAM,GAAG,SAAS,WAAW,YAAY,IAAI,UAAU,YAAY,CAAC,GAAG,WAAW,UAAU,CAAC,GAAG,WAAW,OAAO,CAAC;AACvI,WAAO,UAAU,QAAQ;AAAA,EAC3B;AAAA,EAEQ,cAAc,WAAuF;AAC3G,YAAQ,UAAU,cAAc,CAAC,GAC9B,OAAO,CAAC,MAA6B,QAAQ,KAAK,EAAE,OAAO,MAAM,EACjE,IAAI,CAAC,OAAO;AAAA,MACX,MAAM,EAAE;AAAA,MACR,MAAM,KAAK,cAAc,EAAE,MAAM;AAAA,MACjC,UAAU,EAAE,aAAa;AAAA,IAC3B,EAAE;AAAA,EACN;AAAA,EAEQ,eACN,WACkF;AAClF,YAAQ,UAAU,cAAc,CAAC,GAC9B,OAAO,CAAC,MAA6B,QAAQ,KAAK,EAAE,OAAO,OAAO,EAClE,IAAI,CAAC,OAAO;AAAA,MACX,MAAM,EAAE;AAAA,MACR,MAAM,KAAK,cAAc,EAAE,MAAM;AAAA,MACjC,UAAU,EAAE,aAAa;AAAA,MACzB,QAAQ,EAAE;AAAA,IACZ,EAAE;AAAA,EACN;AAAA,EAEQ,cAAc,QAAgC;AACpD,QAAI,CAAC,OAAQ,QAAO;AACpB,QAAI,OAAO,KAAM,QAAO,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AACnE,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,WACN,OACA,cACQ;AACR,UAAM,EAAE,QAAQ,MAAM,UAAU,IAAI;AACpC,QAAI,CAAC,OAAQ,QAAO;AAEpB,QAAI;AACJ,QAAI,OAAO,MAAM;AACf,UAAI,kBAAkB,OAAO,IAAI,GAAG;AAClC,kBAAU;AAAA,MACZ,OAAO;AACL,cAAM,UAAU;AAAA,UACd,QAAQ;AAAA,UACR,cAAc,gBAAgB,KAAK,uBAAuB;AAAA,UAC1D;AAAA,QACF;AACA,cAAM,WAAW,KAAK,aAAa,SAAS,OAAO,MAAM,OAAO;AAChE,kBAAU,SAAS;AAAA,MACrB;AAAA,IACF,OAAO;AACL,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,oBAAU;AACV;AAAA,QACF,KAAK;AACH,oBAAU;AACV;AAAA,QACF,KAAK;AACH,oBAAU;AACV;AAAA,QACF;AACE,oBAAU;AAAA,MACd;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,UAAU;AACnB,gBAAU,GAAG,OAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,WAA4B;AACpD,WAAO,CAAC,QAAQ,SAAS,WAAW,UAAU,EAAE,SAAS,SAAS;AAAA,EACpE;AAAA,EAEQ,oBACN,aACA,YACA,aACA,WACA,gBACQ;AACR,QAAI,aAAa,wBAAwB,aAAa,YAAY,aAAa,IAAI,cAAc;AAEjG,QAAI,UAAU,IAAI,UAAU,KAAK,aAAa;AAC5C,mBAAa,UAAU,WAAW;AAAA,IACpC;AAEA,QAAI,YAAY;AAChB,QAAI,UAAU;AACd,WAAO,UAAU,IAAI,SAAS,GAAG;AAC/B,kBAAY,GAAG,UAAU,GAAG,OAAO;AACnC;AAAA,IACF;AAEA,cAAU,IAAI,SAAS;AACvB,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,aAAqB,YAA4B;AACvE,WAAO,GAAG,UAAU,IAAI,WAAW;AAAA,EACrC;AAAA,EAEQ,qBAAqB,cAAgC;AAC3D,WAAO,aAAa,IAAI,CAAC,QAAQ,WAAW,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,EAC3D;AAAA,EAEQ,qBAAqB,MAAoB,cAAwC;AACvF,UAAM,mBAAmB;AACzB,UAAM,oBAAoB,KAAK,qBAAqB,YAAY;AAEhE,SAAK,sBAAsB;AAE3B,UAAM,QAAkB,CAAC;AACzB,UAAM,kBAAkB,oBAAI,IAAY;AACxC,UAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAI,iBAAiB;AACrB,QAAI,uBAAuB;AAE3B,UAAM,iBAAuF,CAAC;AAC9F,eAAW,CAAC,WAAW,SAAS,KAAK,KAAK,UAAU;AAClD,YAAM,YAAY,CAAC,GAAG,cAAc,SAAS;AAC7C,YAAM,iBAAiB,KAAK,qBAAqB,SAAS;AAC1D,qBAAe,KAAK;AAAA,QAClB,cAAc,YAAY,UAAU,SAAS,CAAC;AAAA,QAC9C,WAAW;AAAA,QACX,UAAU,GAAG,cAAc;AAAA,MAC7B,CAAC;AAAA,IACH;AAEA,UAAM,uBAAuB,oBAAI,IAAoB;AACrD,QAAI,gBAAgB;AACpB,eAAW,EAAE,aAAa,YAAY,UAAU,KAAK,KAAK,YAAY;AACpE,YAAM,kBAAkB,UAAU,YAAY,KAAK,KAAK,UAAU,YAAY,KAAK;AACnF,YAAM,kBAAkB,iBAAiB,UAAU,kBAAkB;AACrE,YAAM,oBAAoB,iBAAiB;AAE3C,YAAM,aAAa,KAAK;AAAA,QACtB,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,QAAQ,KAAK,gBAAgB,aAAa,UAAU;AAC1D,2BAAqB,IAAI,OAAO,UAAU;AAE1C,YAAM,cAAc,KAAK,eAAe,SAAS;AACjD,UAAI,YAAY,SAAS,GAAG;AAC1B,yBAAiB;AAAA,MACnB;AAEA,UAAI,mBAAmB,SAAS,YAAY,mBAAmB,YAAY,YAAY;AACrF,+BAAuB;AAAA,MACzB;AAEA,UACE,mBAAmB,SAAS,YAC5B,mBAAmB,YAAY,cAC/B,CAAC,mBAAmB,YAAY,MAAM,OAAO,MAC7C;AACA,wBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,cAAc,oBAAI,IAAoB;AAE5C,QAAI,gBAAgB;AAClB,oBAAc,IAAI,wBAAwB;AAAA,IAC5C;AACA,QAAI,sBAAsB;AACxB,oBAAc,IAAI,0BAA0B;AAC5C,kBAAY,IAAI,4BAA4B,oBAAoB;AAAA,IAClE;AAEA,eAAW,EAAE,aAAa,UAAU,KAAK,KAAK,YAAY;AACxD,YAAM,iBAAiB,KAAK,sBAAsB,WAAW,WAAW;AACxE,UAAI,gBAAgB;AAClB,cAAM,cAAc,kBAAkB,gBAAgB,KAAK,YAAY;AACvE,sBAAc,IAAI,WAAW;AAC7B,oBAAY,IAAI,aAAa,eAAe,gBAAgB,KAAK,YAAY,CAAC;AAAA,MAChF;AACA,YAAM,gBAAgB,KAAK,qBAAqB,WAAW,WAAW;AACtE,UAAI,eAAe;AACjB,cAAM,cAAc,kBAAkB,eAAe,KAAK,YAAY;AACtE,sBAAc,IAAI,WAAW;AAC7B,oBAAY,IAAI,aAAa,eAAe,eAAe,KAAK,YAAY,CAAC;AAAA,MAC/E;AAAA,IACF;AAEA,UAAM,oBAAoB,oBAAI,IAAuD;AACrF,eAAW,EAAE,aAAa,YAAY,UAAU,KAAK,KAAK,YAAY;AACpE,UAAI,KAAK,qBAAqB,SAAS,GAAG;AACxC,cAAM,gBAAgB,KAAK,qBAAqB,WAAW,WAAW;AACtE,YAAI,CAAC,eAAe;AAClB,gBAAM,QAAQ,KAAK,gBAAgB,aAAa,UAAU;AAC1D,gBAAM,aAAa,qBAAqB,IAAI,KAAK;AACjD,gBAAM,kBAAkB,KAAK,yBAAyB,mBAAmB,YAAY,MAAM;AAC3F,gBAAM,WAAW,sBAAsB,eAAe;AACtD,4BAAkB,IAAI,OAAO,EAAE,aAAa,iBAAiB,SAAS,CAAC;AACvE,wBAAc,IAAI,eAAe;AACjC,sBAAY,IAAI,iBAAiB,QAAQ;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,wBAAwB,oBAAI,IAAuD;AACzF,eAAW,EAAE,aAAa,YAAY,UAAU,KAAK,KAAK,YAAY;AACpE,UAAI,KAAK,wBAAwB,SAAS,GAAG;AAC3C,cAAM,iBAAiB,KAAK,sBAAsB,WAAW,WAAW;AACxE,YAAI,CAAC,gBAAgB;AACnB,gBAAM,QAAQ,KAAK,gBAAgB,aAAa,UAAU;AAC1D,gBAAM,aAAa,qBAAqB,IAAI,KAAK;AACjD,gBAAM,kBAAkB,KAAK,yBAAyB,mBAAmB,YAAY,UAAU;AAC/F,gBAAM,WAAW,sBAAsB,eAAe;AACtD,gCAAsB,IAAI,OAAO,EAAE,aAAa,iBAAiB,SAAS,CAAC;AAC3E,wBAAc,IAAI,eAAe;AACjC,sBAAY,IAAI,iBAAiB,QAAQ;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,kBAAkB;AACnC,QAAI,UAAU;AACZ,YAAM,KAAK,0BAA0B;AACrC,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,UAAM,aAAa,KAAK,WAAW,KAAK,CAAC,EAAE,YAAY,UAAU,MAAM;AACrE,YAAM,kBAAkB,UAAU,YAAY,KAAK,KAAK,UAAU,YAAY,KAAK;AACnF,YAAM,qBAAqB,CAAC,CAAC,iBAAiB,UAAU,kBAAkB,GAAG;AAC7E,YAAM,iBAAiB,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,UAAU,KAAK,CAAC,CAAC,UAAU;AACpF,YAAM,mBAAmB,KAAK,eAAe,SAAS,EAAE,SAAS;AACjE,aAAO,sBAAsB,kBAAkB;AAAA,IACjD,CAAC;AACD,QAAI,YAAY;AACd,YAAM,KAAK,gCAAgC,KAAK,cAAc,IAAI;AAAA,IACpE;AAEA,UAAM,KAAK,6BAA6B,gBAAgB,YAAY;AAEpE,UAAM,+BAA+B,MAAM;AAC3C,UAAM,KAAK,gCAAgC;AAE3C,eAAW,SAAS,gBAAgB;AAClC,YAAM,KAAK,YAAY,MAAM,SAAS,sBAAsB,MAAM,QAAQ,IAAI;AAAA,IAChF;AACA,UAAM,KAAK,EAAE;AAEb,UAAM,qBAA+B,CAAC;AACtC,eAAW,EAAE,aAAa,YAAY,UAAU,KAAK,KAAK,YAAY;AACpE,YAAM,cAAc,KAAK,eAAe,SAAS;AACjD,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,QAAQ,KAAK,gBAAgB,aAAa,UAAU;AAC1D,cAAM,aAAa,qBAAqB,IAAI,KAAK;AACjD,cAAM,EAAE,iBAAiB,SAAS,IAAI,8BAA8B,YAAY,mBAAmB,KAAK,YAAY;AAEpH,cAAM,iBAAiB,YAAY,OAAO,CAAC,MAAM,CAAC,KAAK,kBAAkB,EAAE,IAAI,CAAC;AAEhF,YAAI,eAAe,SAAS,GAAG;AAC7B,gBAAM,QAAQ,eAAe,IAAI,CAAC,MAAM;AACtC,kBAAM,UAAU,KAAK,WAAW,GAAG,iBAAiB;AACpD,gBAAI,EAAE,QAAQ,MAAM;AAClB,oBAAM,WAAW,KAAK,aAAa,IAAI,EAAE,OAAO,IAAI;AACpD,kBAAI,UAAU;AACZ,8BAAc,IAAI,SAAS,eAAe;AAAA,cAC5C;AAAA,YACF;AACA,mBAAO,KAAK,EAAE,IAAI,KAAK,OAAO;AAAA,UAChC,CAAC;AACD,6BAAmB;AAAA,YACjB,gBAAgB,eAAe;AAAA,EAAuC,MAAM,KAAK,KAAK,CAAC;AAAA;AAAA,UACzF;AAAA,QACF,OAAO;AACL,6BAAmB,KAAK,gBAAgB,eAAe,4BAA4B;AAAA,QACrF;AACA,2BAAmB,KAAK,eAAe,QAAQ,qBAAqB,eAAe,IAAI;AACvF,2BAAmB,KAAK,EAAE;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,mBAAmB,SAAS,GAAG;AACjC,YAAM,KAAK,4BAA4B;AACvC,YAAM,KAAK,mBAAmB,KAAK,IAAI,CAAC;AAAA,IAC1C;AAEA,UAAM,KAAK,gBAAgB,iBAAiB,6BAA6B;AAEzE,eAAW,SAAS,gBAAgB;AAClC,YAAM,KAAK,YAAY,MAAM,YAAY,KAAK,MAAM,SAAS,WAAW;AAAA,IAC1E;AAEA,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM,KAAK,EAAE;AACb,YAAM;AAAA,QACJ,qDAAqD,gBAAgB,GAAG,KAAK,eAAe;AAAA,MAC9F;AACA,YAAM,KAAK,oBAAoB;AAC/B,iBAAW,SAAS,gBAAgB;AAClC,cAAM,KAAK,YAAY,MAAM,YAAY,UAAU,MAAM,SAAS,mBAAmB;AAAA,MACvF;AACA,YAAM,KAAK,KAAK;AAAA,IAClB;AAEA,eAAW,EAAE,aAAa,YAAY,UAAU,KAAK,KAAK,YAAY;AACpE,YAAM,QAAQ,KAAK,gBAAgB,aAAa,UAAU;AAC1D,YAAM,aAAa,qBAAqB,IAAI,KAAK;AACjD,YAAM,aAAa,KAAK,cAAc,SAAS;AAC/C,YAAM,cAAc,KAAK,eAAe,SAAS;AACjD,YAAM,iBAAiB,KAAK,sBAAsB,WAAW,WAAW;AACxE,YAAM,gBAAgB,KAAK,qBAAqB,WAAW,WAAW;AAEtE,YAAM,SAAmB,CAAC;AAC1B,iBAAW,KAAK,YAAY;AAC1B,eAAO,KAAK,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,EAAE;AAAA,MACpC;AAEA,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,EAAE,SAAS,IAAI,8BAA8B,YAAY,mBAAmB,KAAK,YAAY;AACnG,cAAM,cAAc,YAAY,KAAK,CAAC,MAAM,EAAE,QAAQ;AACtD,eAAO,KAAK,SAAS,cAAc,KAAK,GAAG,KAAK,QAAQ,EAAE;AAAA,MAC5D;AAEA,YAAM,mBAAmB,kBAAkB,IAAI,KAAK;AAEpD,UAAI,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,UAAU,KAAK,UAAU,aAAa;AAC1E,YAAI,eAAe;AACjB,gBAAM,cAAc,kBAAkB,eAAe,KAAK,YAAY;AACtE,gBAAM,WAAW,YAAY,IAAI,WAAW;AAC5C,iBAAO,KAAK,SAAS,QAAQ,EAAE;AAAA,QACjC,WAAW,kBAAkB;AAC3B,iBAAO,KAAK,SAAS,iBAAiB,QAAQ,EAAE;AAAA,QAClD,OAAO;AACL,iBAAO,KAAK,+BAA+B;AAAA,QAC7C;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,kBAAkB,KAAK,kBAAkB,cAAc;AAC7E,UAAI,eAAe,SAAS,QAAQ,cAAc,OAAO;AACzD,qBAAe,MAAM,eAAe;AAEpC,YAAM,kBAAkB,UAAU,YAAY,KAAK,KAAK,UAAU,YAAY,KAAK;AACnF,YAAM,kBAAkB,iBAAiB,UAAU,kBAAkB;AACrE,YAAM,oBAAoB,iBAAiB;AAE3C,UAAI,aAAa;AACjB,UAAI,aAAa;AAEjB,UAAI,mBAAmB;AACrB,YAAI,kBAAkB,SAAS,YAAY,kBAAkB,YAAY,YAAY;AACnF,gBAAM,UAAU,kBAAkB,WAAW,MAAM,OAAO;AAC1D,cAAI,SAAS;AACX,kBAAM,gBAAgB,QAAQ,MAAM,GAAG,EAAE,IAAI;AAC7C,kBAAM,aAAa,gBAAgB,aAAa;AAChD,kBAAM,kBAAkB,kBAAkB,YAAY,KAAK,YAAY;AACvE,kBAAM,eAAe,eAAe,YAAY,KAAK,YAAY;AACjE,0BAAc,IAAI,eAAe;AACjC,wBAAY,IAAI,iBAAiB,YAAY;AAC7C,yBAAa,2CAA2C,YAAY;AACpE,yBAAa,iFAAiF,eAAe,2BAA2B,YAAY;AAAA;AAAA,UAEtJ,OAAO;AACL,gBAAI,gBAAgB;AAClB,oBAAM,kBAAkB,kBAAkB,gBAAgB,KAAK,YAAY;AAC3E,oBAAM,eAAe,eAAe,gBAAgB,KAAK,YAAY;AACrE,4BAAc,IAAI,eAAe;AACjC,0BAAY,IAAI,iBAAiB,YAAY;AAC7C,2BAAa,2CAA2C,YAAY;AACpE,2BAAa,iFAAiF,eAAe,2BAA2B,YAAY;AAAA;AAAA,YAEtJ,OAAO;AACL,2BAAa;AACb,2BAAa;AAAA;AAAA,YAEf;AAAA,UACF;AAAA,QACF,WAAW,gBAAgB;AACzB,gBAAM,kBAAkB,kBAAkB,gBAAgB,KAAK,YAAY;AAC3E,gBAAM,WAAW,eAAe,gBAAgB,KAAK,YAAY;AACjE,uBAAa;AACb,uBAAa,sBAAsB,eAAe;AAClD,wBAAc,IAAI,eAAe;AACjC,sBAAY,IAAI,iBAAiB,QAAQ;AAAA,QAC3C,WAAW,sBAAsB,IAAI,KAAK,GAAG;AAC3C,gBAAM,eAAe,sBAAsB,IAAI,KAAK;AACpD,uBAAa,aAAa;AAC1B,uBAAa,sBAAsB,aAAa,WAAW;AAAA,QAC7D,OAAO;AACL,uBAAa;AACb,uBAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,WAAW,UAAU,IAAI,OAAO,KAAK,IAAI,CAAC,cAAc,UAAU,KAAK;AAElF,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,EAAE,gBAAgB,IAAI,8BAA8B,YAAY,mBAAmB,KAAK,YAAY;AAC1G,cAAM,KAAK,iDAAiD;AAC5D,cAAM,KAAK,mBAAmB;AAC9B,cAAM,KAAK,uCAAuC,eAAe,YAAY;AAC7E,cAAM,KAAK,6DAA6D;AACxE,cAAM,KAAK,wEAAwE;AACnF,cAAM,KAAK,WAAW;AACtB,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,4CAA4C;AACvD,cAAM,KAAK,gCAAgC,YAAY,mBAAmB,YAAY,GAAG;AAAA,MAC3F;AAEA,YAAM,SAAS,YAAY,SAAS,IAAI,QAAQ;AAChD,YAAM,gBAAgB,eAAe;AACrC,YAAM,iBAAiB,gBAAgB,sBAAsB;AAE7D,YAAM,gBAAgB,iBAAiB;AACvC,YAAM,oBAAoB,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,UAAU,KAAK;AAC3E,YAAM,UAAU,oBAAoB,kBAAkB;AAEtD,UAAI,mBAAmB;AACrB,cAAM,kBAAkB,gBACpB,kBAAkB,eAAe,KAAK,YAAY,IAClD,iBAAkB;AACtB,cAAM,KAAK,yCAAyC,eAAe,UAAU;AAAA,MAC/E;AAEA,cAAQ,YAAY;AAAA,QAClB,KAAK;AACH,gBAAM,KAAK,OAAO,cAAc,yBAAyB,MAAM,IAAI;AACnE;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,OAAO,cAAc,0BAA0B,MAAM,KAAK,OAAO,IAAI;AAChF;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,OAAO,cAAc,yBAAyB,MAAM,KAAK,OAAO,IAAI;AAC/E;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,OAAO,cAAc,2BAA2B,MAAM,KAAK,OAAO,IAAI;AACjF;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,OAAO,cAAc,4BAA4B,MAAM,IAAI;AACtE;AAAA,MACJ;AAEA,UAAI,YAAY;AACd,cAAM,KAAK,OAAO,UAAU,EAAE;AAAA,MAChC;AAEA,YAAM,KAAK,KAAK;AAAA,IAClB;AAEA,UAAM,KAAK,GAAG;AAEd,UAAM,mBAAmB,MAAM,UAAU,CAAC,MAAM,MAAM,gCAAgC;AACtF,QAAI,oBAAoB,GAAG;AACzB,UAAI,cAAc,OAAO,KAAK,YAAY,OAAO,GAAG;AAClD,cAAM,aAAa,oBAAI,IAAI,CAAC,GAAG,eAAe,GAAG,YAAY,OAAO,CAAC,CAAC;AACtE,cAAM,gBAAgB,IAAI,YAAY,MAAM,KAAK,UAAU,EAAE,KAAK,IAAI,CAAC,YAAY,gBAAgB;AAAA,MACrG,OAAO;AACL,cAAM,OAAO,kBAAkB,CAAC;AAAA,MAClC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM,MAAM,KAAK,IAAI;AAAA,MACrB,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEQ,iBACN,MACA,eAAyB,CAAC,GAC1B,QAAQ,GAC4C;AACpD,UAAM,YAAgE,CAAC;AAEvE,eAAW,CAAC,WAAW,SAAS,KAAK,KAAK,UAAU;AAClD,YAAM,YAAY,CAAC,GAAG,cAAc,SAAS;AAC7C,YAAM,iBAAiB,KAAK,iBAAiB,WAAW,WAAW,QAAQ,CAAC;AAC5E,gBAAU,KAAK,GAAG,cAAc;AAAA,IAClC;AAEA,QAAI,aAAa,SAAS,MAAM,KAAK,WAAW,SAAS,KAAK,KAAK,SAAS,OAAO,IAAI;AACrF,YAAM,WAAW,KAAK,qBAAqB,MAAM,YAAY;AAC7D,gBAAU,KAAK;AAAA,QACb;AAAA,QACA,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,cAIE;AACA,SAAK,wBAAwB;AAE7B,UAAM,YAAY,KAAK,iBAAiB,KAAK,QAAQ;AAErD,UAAM,SAAiC,CAAC;AACxC,eAAW,YAAY,WAAW;AAChC,aAAO,SAAS,SAAS,IAAI,SAAS;AAAA,IACxC;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM,KAAK;AAAA,MACX,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AACF;;;ACrvBO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA,mBAAmB,oBAAI,IAAoB;AAAA,EAC3C,cAAwB,CAAC;AAAA,EACzB,gBAAgB,oBAAI,IAA2E;AAAA,EAChG;AAAA,EACA,kBAAmC;AAAA,IACxC,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,EACrB;AAAA,EACQ,oBAAmC;AAAA,EACnC,sBAAqC;AAAA,EAErC;AAAA,EAER,YAAY,SAAyC,cAA6B,cAAuB;AACvG,SAAK,UAAU,WAAW,CAAC;AAC3B,SAAK,eAAe,gBAAgB,IAAI,aAAa;AACrD,SAAK,eAAe,gBAAgB;AAAA,EACtC;AAAA,EAEA,iBAAiB,eAAiG;AAChH,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,cAAc,QAAmC,aAA4B,MAAM,aAAa,OAAe;AAC7G,QAAI,CAAC,OAAQ,QAAO;AAEpB,QAAI,OAAO,MAAM;AACf,YAAM,UAAU,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI;AAC3C,YAAM,cAAc,gBAAgB,OAAO;AAC3C,aAAO,kBAAkB,aAAa,KAAK,YAAY;AAAA,IACzD;AAEA,QAAI,OAAO,OAAO;AAChB,YAAM,UAAU,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,cAAc,GAAG,UAAU,CAAC;AACzE,UAAI,QAAQ,WAAW,KAAK,QAAQ,SAAS,UAAU,GAAG;AACxD,cAAM,UAAU,QAAQ,KAAK,CAAC,MAAM,MAAM,UAAU;AACpD,cAAM,gBACJ,eACC,WAAW,SAAS,OAAO,KAAK,WAAW,SAAS,QAAQ,KAAK,WAAW,SAAS,QAAQ;AAChG,eAAO,gBAAgB,GAAG,OAAO,eAAe,GAAG,OAAO;AAAA,MAC5D;AACA,aAAO,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,IACvC;AAEA,QAAI,OAAO,OAAO;AAChB,UAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,cAAM,UAAU,OAAO,MAAM,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AAClE,YAAI,YAAY,IAAI;AAClB,gBAAM,UAAU,KAAK,cAAc,OAAO,MAAM,IAAI,OAAO,GAAG,UAAU;AACxE,gBAAM,gBACJ,eACC,WAAW,SAAS,OAAO,KAAK,WAAW,SAAS,QAAQ,KAAK,WAAW,SAAS,QAAQ;AAChG,iBAAO,gBAAgB,GAAG,OAAO,eAAe,GAAG,OAAO;AAAA,QAC5D;AAAA,MACF;AACA,YAAM,UAAU,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,cAAc,GAAG,UAAU,CAAC;AACzE,aAAO,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,IACvC;AAEA,QAAI,OAAO,OAAO;AAChB,YAAM,UAAU,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,cAAc,GAAG,UAAU,CAAC;AACzE,UAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,aAAO,QAAQ,OAAO,CAAC,KAAK,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG;AAAA,IACxD;AAEA,QAAI,OAAO,UAAU,QAAW;AAC9B,UAAI,OAAO,OAAO,UAAU,UAAU;AACpC,eAAO,cAAc,OAAO,KAAK;AAAA,MACnC;AACA,aAAO,aAAa,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,IAClD;AAEA,UAAM,aAAa,OAAO,aAAa;AACvC,QAAI;AAEJ,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AACH,oBAAY,KAAK,oBAAoB,QAAQ,UAAU;AACvD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,oBAAY,KAAK,oBAAoB,QAAQ,UAAU;AACvD;AAAA,MACF,KAAK;AACH,oBAAY;AACZ;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,mBAAmB,QAAQ,UAAU;AACtD;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,oBAAoB,QAAQ,UAAU;AACvD;AAAA,MACF,KAAK;AACH,eAAO;AAAA,MACT;AACE,YAAI,OAAO,MAAM;AACf,sBAAY,KAAK,kBAAkB,QAAQ,UAAU;AAAA,QACvD,WAAW,OAAO,YAAY;AAC5B,sBAAY,KAAK,oBAAoB,QAAQ,UAAU;AAAA,QACzD,OAAO;AACL,sBAAY;AAAA,QACd;AAAA,IACJ;AAEA,QAAI,YAAY;AACd,YAAM,gBACJ,eAAe,WAAW,SAAS,OAAO,KAAK,WAAW,SAAS,QAAQ,KAAK,WAAW,SAAS,QAAQ;AAC9G,kBAAY,gBAAgB,GAAG,SAAS,eAAe,GAAG,SAAS;AAAA,IACrE;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,QAAgC;AACnD,QAAI,OAAO,SAAS,OAAQ,QAAO;AACnC,QAAI,OAAO,QAAQ,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,CAAC,MAAM,KAAM,QAAO;AAC/E,QAAI,OAAO,MAAM;AACf,YAAM,UAAU,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI;AAC3C,YAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,UAAI,SAAU,QAAO,KAAK,aAAa,QAAQ;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,QAAuB,aAA4B,MAAc;AAC3F,QAAI,OAAO,MAAM;AACf,aAAO,KAAK,kBAAkB,QAAQ,UAAU;AAAA,IAClD;AAEA,QAAI,OAAO,WAAW,eAAe,OAAO,WAAW,QAAQ;AAC7D,YAAM,gBACJ,eAAe,WAAW,SAAS,OAAO,KAAK,WAAW,SAAS,QAAQ,KAAK,WAAW,SAAS,QAAQ;AAC9G,YAAM,aAAa,OAAO,WAAW;AAErC,UAAI,eAAe;AACjB,YAAI,YAAY;AACd,eAAK,gBAAgB,qBAAqB;AAC1C,iBAAO;AAAA,QACT,OAAO;AACL,eAAK,gBAAgB,oBAAoB;AACzC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,YAAY;AACd,aAAK,gBAAgB,qBAAqB;AAC1C,eAAO;AAAA,MACT,OAAO;AACL,aAAK,gBAAgB,oBAAoB;AACzC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,MAAM;AACV,QAAI,OAAO,WAAW,QAAQ;AAC5B,YAAM;AAAA,IACR,WAAW,OAAO,WAAW,SAAS;AACpC,YAAM;AAAA,IACR,WAAW,OAAO,WAAW,OAAO;AAClC,YAAM;AAAA,IACR;AAEA,QAAI,OAAO,cAAc,QAAW;AAClC,YAAM,GAAG,GAAG,QAAQ,OAAO,SAAS;AAAA,IACtC;AACA,QAAI,OAAO,cAAc,QAAW;AAClC,YAAM,GAAG,GAAG,QAAQ,OAAO,SAAS;AAAA,IACtC;AACA,QAAI,OAAO,WAAW,CAAC,OAAO,QAAQ;AACpC,YAAM,GAAG,GAAG,WAAW,OAAO,OAAO;AAAA,IACvC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,QAAuB,aAA4B,MAAc;AAC3F,UAAM,gBACJ,eACC,WAAW,SAAS,OAAO,KAC1B,WAAW,SAAS,MAAM,KAC1B,WAAW,SAAS,QAAQ,KAC5B,eAAe;AACnB,UAAM,WAAW,gBAAgB,sBAAsB;AACvD,QAAI,MAAM,OAAO,SAAS,YAAY,GAAG,QAAQ,WAAW;AAE5D,QAAI,OAAO,YAAY,QAAW;AAChC,YAAM,GAAG,GAAG,QAAQ,OAAO,OAAO;AAAA,IACpC;AACA,QAAI,OAAO,YAAY,QAAW;AAChC,YAAM,GAAG,GAAG,QAAQ,OAAO,OAAO;AAAA,IACpC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,QAAuB,aAA4B,MAAc;AAC1F,UAAM,aAAa,OAAO,QAAQ,KAAK,cAAc,OAAO,OAAO,UAAU,IAAI;AACjF,QAAI,MAAM,WAAW,UAAU;AAE/B,QAAI,OAAO,aAAa,QAAW;AACjC,YAAM,GAAG,GAAG,QAAQ,OAAO,QAAQ;AAAA,IACrC;AACA,QAAI,OAAO,aAAa,QAAW;AACjC,YAAM,GAAG,GAAG,QAAQ,OAAO,QAAQ;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,QAAuB,aAA4B,MAAc;AAC3F,QAAI,CAAC,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,WAAW,GAAG;AACrE,UAAI,OAAO,wBAAwB,OAAO,OAAO,yBAAyB,UAAU;AAClF,cAAM,cAAc,KAAK,cAAc,OAAO,sBAAuC,UAAU;AAC/F,eAAO,wBAAwB,WAAW;AAAA,MAC5C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC;AAC9C,UAAM,aAAuB,CAAC;AAE9B,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACtE,YAAM,uBAAuB,KAAK;AAClC,WAAK,sBAAsB,uBAAuB,GAAG,oBAAoB,IAAI,QAAQ,KAAK;AAE1F,YAAM,UAAU,KAAK,cAAc,YAAY,UAAU;AACzD,YAAM,aAAa,SAAS,IAAI,QAAQ;AACxC,YAAM,YAAY,aAAa,UAAU,GAAG,OAAO;AACnD,iBAAW,KAAK,KAAK,QAAQ,KAAK,SAAS,EAAE;AAE7C,WAAK,sBAAsB;AAAA,IAC7B;AAEA,QAAI,MAAM;AAAA,EAAe,WAAW,KAAK,KAAK,CAAC;AAAA;AAE/C,QAAI,OAAO,yBAAyB,OAAO;AACzC,YAAM,GAAG,GAAG;AAAA,IACd;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,QAAuB,aAA4B,MAAc;AACzF,UAAM,YAAY,OAAO;AACzB,UAAM,UAAU,UAAU,KAAK,CAAC,MAAM,MAAM,IAAI;AAChD,UAAM,SAAS,UAAU,OAAO,CAAC,MAAmB,MAAM,QAAQ,MAAM,EAAE;AAE1E,QAAI,OAAO,WAAW,GAAG;AACvB,UAAI,QAAS,QAAO;AAEpB,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,MAAM,GAAG;AAC7B,aAAO,UAAU,2BAA2B;AAAA,IAC9C;AAEA,UAAM,UAAuB;AAAA,MAC3B,QAAQ;AAAA,MACR,YAAY,KAAK,qBAAqB,cAAc;AAAA,MACpD,cAAc,KAAK,uBAAuB;AAAA,IAC5C;AAEA,UAAM,WAAW,KAAK,aAAa,SAAS,QAAQ,OAAO;AAC3D,WAAO,UAAU,GAAG,SAAS,eAAe,gBAAgB,SAAS;AAAA,EACvE;AAAA,EAEQ,oBAAoB,QAAgD;AAC1E,UAAM,OAAO,oBAAI,IAAY;AAC7B,QAAI,CAAC,OAAQ,QAAO;AAEpB,QAAI,OAAO,MAAM;AACf,YAAM,UAAU,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI;AAC3C,WAAK,IAAI,OAAO;AAChB,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,OAAO;AAChB,iBAAW,KAAK,OAAO,OAAO;AAC5B,mBAAW,OAAO,KAAK,oBAAoB,CAAC,GAAG;AAC7C,eAAK,IAAI,GAAG;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,OAAO;AAChB,iBAAW,KAAK,OAAO,OAAO;AAC5B,mBAAW,OAAO,KAAK,oBAAoB,CAAC,GAAG;AAC7C,eAAK,IAAI,GAAG;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,OAAO;AAChB,iBAAW,KAAK,OAAO,OAAO;AAC5B,mBAAW,OAAO,KAAK,oBAAoB,CAAC,GAAG;AAC7C,eAAK,IAAI,GAAG;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,OAAO;AAChB,iBAAW,OAAO,KAAK,oBAAoB,OAAO,KAAK,GAAG;AACxD,aAAK,IAAI,GAAG;AAAA,MACd;AAAA,IACF;AAEA,QAAI,OAAO,YAAY;AACrB,iBAAW,cAAc,OAAO,OAAO,OAAO,UAAU,GAAG;AACzD,mBAAW,OAAO,KAAK,oBAAoB,UAAU,GAAG;AACtD,eAAK,IAAI,GAAG;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,wBAAwB,OAAO,OAAO,yBAAyB,UAAU;AAClF,iBAAW,OAAO,KAAK,oBAAoB,OAAO,oBAAqC,GAAG;AACxF,aAAK,IAAI,GAAG;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,aAAiC;AACvD,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAW,oBAAI,IAAY;AAEjC,UAAM,QAAQ,CAAC,SAAiB;AAC9B,UAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,UAAI,SAAS,IAAI,IAAI,EAAG;AAExB,eAAS,IAAI,IAAI;AAEjB,YAAM,SAAS,KAAK,QAAQ,IAAI;AAChC,UAAI,QAAQ;AACV,cAAM,OAAO,KAAK,oBAAoB,MAAM;AAC5C,mBAAW,OAAO,MAAM;AACtB,cAAI,YAAY,SAAS,GAAG,GAAG;AAC7B,kBAAM,GAAG;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,eAAS,OAAO,IAAI;AACpB,cAAQ,IAAI,IAAI;AAChB,aAAO,KAAK,IAAI;AAAA,IAClB;AAEA,eAAW,QAAQ,aAAa;AAC9B,YAAM,IAAI;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,gBAAgC;AAC9C,UAAM,eAAyB,CAAC;AAEhC,eAAW,QAAQ,OAAO,KAAK,KAAK,OAAO,GAAG;AAC5C,WAAK,YAAY,KAAK,IAAI;AAAA,IAC5B;AAEA,SAAK,cAAc,KAAK,gBAAgB,KAAK,WAAW;AAExD,UAAM,YAAY,oBAAI,IAAY;AAElC,eAAW,QAAQ,KAAK,aAAa;AACnC,YAAM,SAAS,KAAK,QAAQ,IAAI;AAEhC,WAAK,oBAAoB;AACzB,WAAK,sBAAsB;AAE3B,YAAM,YAAY,KAAK,cAAc,QAAQ,MAAM,IAAI;AAEvD,WAAK,oBAAoB;AAEzB,UAAI,YAAY;AAChB,UAAI,UAAU,SAAS,aAAa,GAAG;AACrC,oBAAY,UAAU,QAAQ,eAAe,OAAO;AAAA,MACtD,WAAW,UAAU,SAAS,QAAQ,GAAG;AACvC,oBAAY,UAAU,QAAQ,UAAU,EAAE;AAAA,MAC5C;AAEA,YAAM,kBAAkB,kBAAkB,WAAW,KAAK,YAAY;AACtE,YAAM,WAAW,eAAe,WAAW,KAAK,YAAY;AAE5D,UAAI,UAAU,IAAI,eAAe,KAAK,UAAU,IAAI,QAAQ,GAAG;AAC7D;AAAA,MACF;AACA,gBAAU,IAAI,eAAe;AAC7B,gBAAU,IAAI,QAAQ;AAEtB,mBAAa,KAAK,gBAAgB,eAAe,MAAM,SAAS,cAAc,QAAQ,KAAK;AAC3F,YAAM,cAAc,yBAAyB,KAAK,SAAS;AAC3D,YAAM,YAAY,cAAc,YAAY;AAC5C,mBAAa,KAAK,eAAe,QAAQ,MAAM,SAAS,WAAW,eAAe,IAAI;AACtF,mBAAa,KAAK,EAAE;AAAA,IACtB;AAEA,SAAK,aAAa,SAAS,CAAC,QAAQ,KAAK,GAAG;AAAA,MAC1C,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC;AACD,UAAM,mBAAmB,KAAK,aAAa,IAAI,CAAC,QAAQ,KAAK,CAAC;AAE9D,iBAAa,KAAK,8BAA8B;AAChD,iBAAa,KAAK;AAAA;AAAA;AAAA;AAAA,cAIR,iBAAiB,eAAe;AAAA,iCACb;AAC7B,iBAAa,KAAK,wEAAwE;AAC1F,iBAAa,KAAK,EAAE;AAEpB,iBAAa,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,mCAKa;AAC/B,iBAAa,KAAK,6EAA6E;AAC/F,iBAAa,KAAK,EAAE;AAEpB,QAAI,KAAK,cAAc,OAAO,GAAG;AAC/B,mBAAa,KAAK,oCAAoC;AACtD,iBAAW,CAAC,YAAY,UAAU,KAAK,KAAK,eAAe;AACzD,cAAM,EAAE,QAAQ,SAAS,SAAS,IAAI;AACtC,cAAM,cAAc,UAAU,gBAAgB;AAC9C,cAAM,YAAY,KAAK,cAAc,QAAQ,aAAa,IAAI;AAC9D,qBAAa,KAAK,gBAAgB,UAAU,MAAM,SAAS,cAAc,QAAQ,KAAK;AACtF,cAAM,YAAY,UAAU,YAAY;AACxC,qBAAa,KAAK,eAAe,QAAQ,MAAM,SAAS,WAAW,UAAU,IAAI;AACjF,qBAAa,KAAK,EAAE;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,SAAmB,CAAC;AAC1B,WAAO,KAAK,0BAA0B;AAEtC,UAAM,sBAAsB,OAAO,QAAQ,KAAK,eAAe,EAC5D,OAAO,CAAC,CAAC,GAAG,IAAI,MAAM,IAAI,EAC1B,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAEvB,QAAI,oBAAoB,SAAS,GAAG;AAClC,aAAO,KAAK,YAAY,oBAAoB,KAAK,IAAI,CAAC,YAAY,cAAc,IAAI;AAAA,IACtF;AAEA,WAAO,KAAK,EAAE;AAEd,UAAM,cAAc,KAAK,aAAa,oBAAoB;AAC1D,QAAI,aAAa;AACf,aAAO,KAAK,WAAW;AAAA,IACzB;AAEA,WAAO,KAAK,GAAG,YAAY;AAE3B,WAAO,OAAO,KAAK,IAAI;AAAA,EACzB;AACF;;;AC3dA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,eAAsB,UAAU,UAAkB,SAAgC;AAChF,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,MAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACvB,OAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AACA,KAAG,cAAc,UAAU,OAAO;AAClC,UAAQ,IAAI,cAAc,QAAQ,EAAE;AACtC;;;ACVA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGjB,eAAsB,SAAS,UAAwC;AAErE,MAAI,SAAS,WAAW,SAAS,KAAK,SAAS,WAAW,UAAU,GAAG;AACrE,YAAQ,IAAI,8BAA8B,QAAQ,KAAK;AACvD,UAAM,WAAW,MAAM,MAAM,QAAQ;AACrC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,iCAAiC,SAAS,UAAU,EAAE;AAAA,IACxE;AACA,UAAMC,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAQ,IAAI,yBAAyBA,MAAK,OAAO,EAAE;AACnD,YAAQ,IAAI,cAAcA,MAAK,KAAK,KAAK,EAAE;AAC3C,WAAOA;AAAA,EACT;AAGA,QAAM,eAAeD,MAAK,QAAQ,QAAQ;AAC1C,UAAQ,IAAI,6BAA6B,YAAY,KAAK;AAC1D,MAAI,CAACD,IAAG,WAAW,YAAY,GAAG;AAChC,UAAM,IAAI,MAAM,gCAAgC,YAAY,EAAE;AAAA,EAChE;AAEA,QAAM,UAAUA,IAAG,aAAa,cAAc,OAAO;AAErD,MAAI;AACJ,MAAI,aAAa,SAAS,OAAO,KAAK,aAAa,SAAS,MAAM,GAAG;AACnE,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E,OAAO;AACL,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AAEA,UAAQ,IAAI,yBAAyB,KAAK,OAAO,EAAE;AACnD,UAAQ,IAAI,cAAc,KAAK,KAAK,KAAK,EAAE;AAC3C,SAAO;AACT;;;ANfA,eAAsB,eACpB,QACA,UAII,CAAC,GACoB;AACzB,QAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAM,UAAU,QAAQ,gBAAgB,OAAO;AAC/C,QAAM,cAAc,QAAQ,UAAU;AACtC,QAAM,iBAAiB,QAAQ,kBAAkB;AAEjD,qBAAmB,MAAM;AAEzB,QAAM,YAAYG,MAAK,KAAK,QAAQ,WAAW;AAC/C,QAAM,kBAAkB,GAAG,IAAI;AAE/B,mBAAiB,iBAAiB,mBAAmB;AAErD,UAAQ,IAAI;AAAA,EAAK,IAAI,OAAO,EAAE,CAAC,EAAE;AACjC,UAAQ,IAAI,cAAc,eAAe,KAAK;AAC9C,UAAQ,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE;AAG/B,MAAI,eAAeC,IAAG,WAAW,SAAS,GAAG;AAC3C,IAAAA,IAAG,OAAO,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,YAAQ,IAAI;AAAA,aAAgB,SAAS,EAAE;AAAA,EACzC;AAGA,QAAM,OAAO,MAAM,SAAS,OAAO;AAGnC,QAAM,eAAe,IAAI,aAAa,OAAO,YAAY;AAGzD,QAAM,oBAAoB,IAAI,kBAAkB,KAAK,OAAO,KAAK,YAAY,SAAS,iBAAiB;AAAA,IACrG,iBAAiB,OAAO;AAAA,IACxB;AAAA,IACA;AAAA,IACA,cAAc,OAAO;AAAA,EACvB,CAAC;AAGD,UAAQ,IAAI,kCAAkC;AAC9C,QAAM,EAAE,WAAW,MAAM,cAAc,IAAI,kBAAkB,YAAY;AAGzE,UAAQ,IAAI,6BAA6B;AACzC,QAAM,eAAe,IAAI,aAAa,KAAK,YAAY,SAAS,cAAc,OAAO,YAAY;AACjG,eAAa,iBAAiB,aAAa;AAC3C,QAAM,cAAc,aAAa,gBAAgB,cAAc;AAE/D,QAAM,iBAAkC,CAAC;AAGzC,iBAAe,KAAK;AAAA,IAClB,MAAMD,MAAK,KAAK,WAAW,YAAY;AAAA,IACvC,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,gBAA0B,CAAC;AACjC,aAAW,CAAC,cAAc,IAAI,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC5D,qBAAiB,cAAc,eAAe;AAC9C,mBAAe,KAAK;AAAA,MAClB,MAAMA,MAAK,KAAK,WAAW,aAAa,GAAG,YAAY,cAAc;AAAA,MACrE,SAAS;AAAA,IACX,CAAC;AACD,kBAAc,KAAK,YAAY;AAAA,EACjC;AAGA,QAAM,oBAAoB,cACvB,IAAI,CAAC,iBAAiB,YAAY,YAAY,sBAAsB,YAAY,aAAa,EAC7F,KAAK,IAAI;AACZ,iBAAe,KAAK;AAAA,IAClB,MAAMA,MAAK,KAAK,WAAW,aAAa,UAAU;AAAA,IAClD,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,mBAAmB,eAAe,eAAe,YAAY,eAAe;AAAA,4CACxC,cAAc;AAAA;AAAA;AAAA,8BAG5B,eAAe;AAAA;AAAA,wBAErB,eAAe;AAAA;AAAA;AAAA;AAAA;AAKrC,iBAAe,KAAK;AAAA,IAClB,MAAMA,MAAK,KAAK,WAAW,aAAa;AAAA,IACxC,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,oBAAwE,CAAC;AAC/E,aAAW,CAAC,SAAS,KAAK,KAAK,UAAU;AACvC,UAAM,YAAY,WAAW,SAAS;AACtC,sBAAkB,KAAK;AAAA,MACrB,cAAc,YAAY,UAAU,SAAS,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AAGA,UAAQ,IAAI;AAAA,aAAgB,eAAe,KAAK;AAChD,QAAM,kBAAkB,kBAAkB,IAAI,CAAC,MAAM,GAAG,EAAE,SAAS,UAAU,EAAE,KAAK,OAAO;AAC3F,QAAM,qBAAqB,kBACxB,IAAI,CAAC,MAAM,UAAU,EAAE,YAAY,KAAK,EAAE,SAAS,WAAW,EAC9D,KAAK,MAAM;AACd,QAAM,yBAAyB,kBAC5B,IAAI,CAAC,MAAM,QAAQ,EAAE,YAAY,UAAU,EAAE,SAAS,iBAAiB,EACvE,KAAK,QAAQ;AAEhB,QAAM,aAAa,0CAA0C,cAAc;AAAA;AAAA;AAAA,IAGzE,eAAe;AAAA;AAAA;AAAA,uBAGI,eAAe;AAAA,IAClC,kBAAkB;AAAA;AAAA;AAAA;AAAA,MAIhB,sBAAsB;AAAA;AAAA;AAAA;AAI1B,iBAAe,KAAK;AAAA,IAClB,MAAMA,MAAK,KAAK,WAAW,GAAG,eAAe,KAAK;AAAA,IAClD,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,gBAAgB,uBAAuB,eAAe,cAAc,eAAe;AAAA;AAAA;AAAA;AAIzF,iBAAe,KAAK;AAAA,IAClB,MAAMA,MAAK,KAAK,WAAW,UAAU;AAAA,IACrC,SAAS;AAAA,EACX,CAAC;AAGD,MAAI,aAAa;AACf,eAAW,QAAQ,gBAAgB;AACjC,YAAM,UAAU,KAAK,MAAM,KAAK,OAAO;AAAA,IACzC;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,EAAK,eAAe,uBAAuB;AAEvD,SAAO;AAAA,IACL;AAAA,IACA,eAAe,kBAAkB,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,IACvD,OAAO,cAAc,SAAY;AAAA,EACnC;AACF;;;AOrLA,eAAsB,YACpB,QACA,SACe;AACf,QAAM,iBAAiB,OAAO,kBAAkB;AAEhD,MAAI,UAAU,OAAO;AAErB,MAAI,QAAQ,QAAQ;AAClB,cAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,QAAQ,OAAQ,YAAY,CAAC;AACtF,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,MAAM,kBAAkB,QAAQ,MAAM,+BAA+B;AAC7E,cAAQ,IAAI,sBAAsB,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAC9E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,CAAC,QAAQ,QAAQ;AACnC,YAAQ,MAAM,iDAAiD;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,qCAAqC;AACjD,UAAQ,IAAI,sCAAsC;AAClD,UAAQ,IAAI,cAAc,QAAQ,MAAM,eAAe,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAC9F,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,sBAAsB,QAAQ,IAAI,EAAE;AAAA,EAClD;AAEA,QAAM,UAAU,CAAC;AACjB,aAAW,gBAAgB,SAAS;AAClC,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,cAAc;AAAA,QAChD,cAAc,QAAQ;AAAA,QACtB;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,MAAM;AAAA,IACrB,SAAS,OAAO;AACd,cAAQ,MAAM;AAAA,mBAAsB,aAAa,IAAI,WAAY,MAAgB,OAAO;AACxF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,UAAQ,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;AACjC,UAAQ,IAAI,qCAAqC;AACjD,UAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAE1B,aAAW,UAAU,SAAS;AAC5B,YAAQ,IAAI;AAAA,EAAK,OAAO,IAAI,qBAAqB,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,EACpF;AACF;;;ACtDA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAEjB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaxB,eAAsB,UAAyB;AAC7C,QAAM,aAAaA,MAAK,KAAK,QAAQ,IAAI,GAAG,eAAe;AAE3D,MAAID,IAAG,WAAW,UAAU,GAAG;AAC7B,YAAQ,MAAM,+BAA+B,UAAU,EAAE;AACzD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAAA,IAAG,cAAc,YAAY,eAAe;AAC5C,UAAQ,IAAI,wBAAwB,UAAU,EAAE;AAChD,UAAQ,IAAI,0DAA0D;AACtE,UAAQ,IAAI,gBAAgB;AAC9B;;;ATpBA,IAAM,eAAe,CAAC,iBAAiB,iBAAiB,gBAAgB;AAExE,eAAe,aAAiC;AAC9C,QAAM,MAAM,QAAQ,IAAI;AAExB,aAAW,cAAc,cAAc;AACrC,UAAM,aAAaE,MAAK,KAAK,KAAK,UAAU;AAC5C,QAAIC,IAAG,WAAW,UAAU,GAAG;AAC7B,cAAQ,IAAI,iBAAiB,UAAU,EAAE;AACzC,YAAM,OAAO,WAAW,KAAK,EAAE,gBAAgB,KAAK,CAAC;AACrD,YAAM,SAAS,MAAM,KAAK,OAAO,UAAU;AAC3C,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,mEAAmE,aAAa,KAAK,IAAI,CAAC;AAAA,EAC5F;AACF;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,KAAK,EACV,YAAY,qCAAqC,EACjD,QAAQ,OAAO;AAElB,QACG,QAAQ,UAAU,EAClB,YAAY,oDAAoD,EAChE,OAAO,uBAAuB,iCAAiC,EAC/D,OAAO,oBAAoB,uCAAuC,EAClE,OAAO,OAAO,YAAY;AACzB,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,YAAY,QAAQ,OAAO;AACnC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,OAAO,YAAY;AAClB,QAAM,QAAQ;AAChB,CAAC;AAEH,QAAQ,MAAM;","names":["path","fs","fs","path","pluralizeLib","cleanSchemaName","pluralizeLib","fs","path","spec","path","fs","fs","path","path","fs"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/generator/config.ts"],"sourcesContent":["export interface ClientConfig {\n name: string;\n spec: string;\n output: string;\n stripPathPrefix?: string;\n}\n\nexport interface OrcConfig {\n clients: ClientConfig[];\n runtimePackage?: string;\n}\n\nexport function defineConfig(config: OrcConfig): OrcConfig {\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
1
|
+
{"version":3,"sources":["../../src/generator/config.ts"],"sourcesContent":["export interface ClientConfig {\n name: string;\n spec: string;\n output: string;\n stripPathPrefix?: string;\n schemaPrefix?: string;\n}\n\nexport interface OrcConfig {\n clients: ClientConfig[];\n runtimePackage?: string;\n}\n\nexport function defineConfig(config: OrcConfig): OrcConfig {\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAaO,SAAS,aAAa,QAA8B;AACzD,SAAO;AACT;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/generator/config.ts"],"sourcesContent":["export interface ClientConfig {\n name: string;\n spec: string;\n output: string;\n stripPathPrefix?: string;\n}\n\nexport interface OrcConfig {\n clients: ClientConfig[];\n runtimePackage?: string;\n}\n\nexport function defineConfig(config: OrcConfig): OrcConfig {\n return config;\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../src/generator/config.ts"],"sourcesContent":["export interface ClientConfig {\n name: string;\n spec: string;\n output: string;\n stripPathPrefix?: string;\n schemaPrefix?: string;\n}\n\nexport interface OrcConfig {\n clients: ClientConfig[];\n runtimePackage?: string;\n}\n\nexport function defineConfig(config: OrcConfig): OrcConfig {\n return config;\n}\n"],"mappings":";AAaO,SAAS,aAAa,QAA8B;AACzD,SAAO;AACT;","names":[]}
|