@rexeus/typeweaver-gen 0.10.1 → 0.10.3

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 CHANGED
@@ -27,18 +27,6 @@ Most users don’t depend on this package directly — use the CLI instead:
27
27
  [`@rexeus/typeweaver`](https://github.com/rexeus/typeweaver/tree/main/packages/cli/README.md). If
28
28
  you’re writing a plugin, start here.
29
29
 
30
- ## 🏷️ Spec naming validation
31
-
32
- The normalization pipeline validates supported naming formats before generation:
33
-
34
- - `operationId` should use camelCase (preferred), for example `getUser`.
35
- - PascalCase `operationId` values are supported for compatibility.
36
- - snake_case and kebab-case `operationId` values are rejected during normalization.
37
- - `resourceName` should preferably be a singular noun in camelCase, for example `user` or
38
- `authSession`.
39
- - Plural and PascalCase `resourceName` values are supported.
40
- - snake_case and kebab-case `resourceName` values are rejected during normalization.
41
-
42
30
  ### 🚀 Minimal plugin
43
31
 
44
32
  ```ts
@@ -187,6 +175,18 @@ output.
187
175
  - Keep plugins focused: one concern per plugin (clients, routers, infra).
188
176
  - Prefer `GeneratorContext.writeFile` over manual fs writes for tracking and directory setup.
189
177
 
178
+ ### 🏷️ Spec naming validation
179
+
180
+ The normalization pipeline validates supported naming formats before generation:
181
+
182
+ - `operationId` should use camelCase (preferred), for example `getUser`.
183
+ - PascalCase `operationId` values are supported for compatibility.
184
+ - snake_case and kebab-case `operationId` values are rejected during normalization.
185
+ - `resourceName` should preferably be a singular noun in camelCase, for example `user` or
186
+ `authSession`.
187
+ - Plural and PascalCase `resourceName` values are supported.
188
+ - snake_case and kebab-case `resourceName` values are rejected during normalization.
189
+
190
190
  ## 📄 License
191
191
 
192
192
  Apache 2.0 © Dennis Wentzien 2026
package/dist/index.cjs CHANGED
@@ -23,6 +23,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
23
  //#endregion
24
24
  let _rexeus_typeweaver_core = require("@rexeus/typeweaver-core");
25
25
  let zod = require("zod");
26
+ let polycase = require("polycase");
26
27
  let node_fs = require("node:fs");
27
28
  node_fs = __toESM(node_fs);
28
29
  let node_path = require("node:path");
@@ -124,16 +125,8 @@ var PathParameterMismatchError = class extends Error {
124
125
  };
125
126
  //#endregion
126
127
  //#region src/helpers/namingUtils.ts
127
- const CAMEL_CASE_PATTERN = /^[a-z][A-Za-z0-9]*$/;
128
- const PASCAL_CASE_PATTERN = /^[A-Z][A-Za-z0-9]*$/;
129
- const isCamelCase = (value) => {
130
- return CAMEL_CASE_PATTERN.test(value);
131
- };
132
- const isPascalCase = (value) => {
133
- return PASCAL_CASE_PATTERN.test(value);
134
- };
135
128
  const isSupportedIdentifierName = (value) => {
136
- return isCamelCase(value) || isPascalCase(value);
129
+ return (0, polycase.isCamelCase)(value) || (0, polycase.isPascalCase)(value);
137
130
  };
138
131
  const isSupportedOperationId = (value) => {
139
132
  return isSupportedIdentifierName(value);
@@ -482,11 +475,12 @@ function createPluginContextBuilder() {
482
475
  };
483
476
  const getOperationOutputPaths = (config) => {
484
477
  const outputDir = getResourceOutputDir(config.resourceName);
485
- const requestFileName = `${config.operationId}Request.ts`;
486
- const responseFileName = `${config.operationId}Response.ts`;
487
- const requestValidationFileName = `${config.operationId}RequestValidator.ts`;
488
- const responseValidationFileName = `${config.operationId}ResponseValidator.ts`;
489
- const clientFileName = `${config.operationId}Client.ts`;
478
+ const fileBase = (0, polycase.pascalCase)(config.operationId);
479
+ const requestFileName = `${fileBase}Request.ts`;
480
+ const responseFileName = `${fileBase}Response.ts`;
481
+ const requestValidationFileName = `${fileBase}RequestValidator.ts`;
482
+ const responseValidationFileName = `${fileBase}ResponseValidator.ts`;
483
+ const clientFileName = `${fileBase}Client.ts`;
490
484
  return {
491
485
  outputDir,
492
486
  requestFile: node_path.default.join(outputDir, requestFileName),
@@ -507,7 +501,7 @@ function createPluginContextBuilder() {
507
501
  return response;
508
502
  };
509
503
  const getCanonicalResponseOutputFile = (responseName) => {
510
- return node_path.default.join(params.responsesOutputDir, `${responseName}Response.ts`);
504
+ return node_path.default.join(params.responsesOutputDir, `${(0, polycase.pascalCase)(responseName)}Response.ts`);
511
505
  };
512
506
  return {
513
507
  ...pluginContext,
@@ -518,10 +512,10 @@ function createPluginContextBuilder() {
518
512
  getCanonicalResponse,
519
513
  getCanonicalResponseOutputFile,
520
514
  getCanonicalResponseImportPath: (config) => {
521
- return relative(config.importerDir, getCanonicalResponseOutputFile(config.responseName).replace(/\.ts$/, ""));
515
+ return relative(config.importerDir, getCanonicalResponseOutputFile(config.responseName).replace(/\.ts$/, ".js"));
522
516
  },
523
517
  getSpecImportPath: (config) => {
524
- return relative(config.importerDir, node_path.default.join(params.specOutputDir, "spec").replace(/\.ts$/, ""));
518
+ return relative(config.importerDir, node_path.default.join(params.specOutputDir, "spec.js"));
525
519
  },
526
520
  getOperationDefinitionAccessor: (config) => {
527
521
  return `getOperationDefinition(spec, ${JSON.stringify(config.resourceName)}, ${JSON.stringify(config.operationId)})`;
@@ -556,21 +550,6 @@ function createPluginContextBuilder() {
556
550
  };
557
551
  }
558
552
  //#endregion
559
- //#region src/helpers/caseUtils.ts
560
- function splitWords(input) {
561
- return input.trim().replace(/[_\-\s]+/g, " ").replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").split(" ").filter(Boolean).map((word) => word.toLowerCase());
562
- }
563
- function capitalize(word) {
564
- return word.charAt(0).toUpperCase() + word.slice(1);
565
- }
566
- function toPascalCase(input) {
567
- return splitWords(input).map(capitalize).join("");
568
- }
569
- function toCamelCase(input) {
570
- const [firstWord = "", ...remainingWords] = splitWords(input);
571
- return firstWord + remainingWords.map(capitalize).join("");
572
- }
573
- //#endregion
574
553
  //#region src/helpers/routeSort.ts
575
554
  /**
576
555
  * HTTP method priority for route ordering.
@@ -640,13 +619,9 @@ exports.createPluginContextBuilder = createPluginContextBuilder;
640
619
  exports.createPluginRegistry = createPluginRegistry;
641
620
  exports.getMethodPriority = getMethodPriority;
642
621
  exports.getPathParameterNames = getPathParameterNames;
643
- exports.isCamelCase = isCamelCase;
644
- exports.isPascalCase = isPascalCase;
645
622
  exports.isSupportedOperationId = isSupportedOperationId;
646
623
  exports.isSupportedResourceName = isSupportedResourceName;
647
624
  exports.normalizeRoutePath = normalizeRoutePath;
648
625
  exports.normalizeSpec = normalizeSpec;
649
626
  exports.relative = relative;
650
627
  exports.renderTemplate = renderTemplate;
651
- exports.toCamelCase = toCamelCase;
652
- exports.toPascalCase = toPascalCase;
package/dist/index.d.cts CHANGED
@@ -305,13 +305,7 @@ type PluginContextBuilderApi = {
305
305
  };
306
306
  declare function createPluginContextBuilder(): PluginContextBuilderApi;
307
307
  //#endregion
308
- //#region src/helpers/caseUtils.d.ts
309
- declare function toPascalCase(input: string): string;
310
- declare function toCamelCase(input: string): string;
311
- //#endregion
312
308
  //#region src/helpers/namingUtils.d.ts
313
- declare const isCamelCase: (value: string) => boolean;
314
- declare const isPascalCase: (value: string) => boolean;
315
309
  declare const isSupportedOperationId: (value: string) => boolean;
316
310
  declare const isSupportedResourceName: (value: string) => boolean;
317
311
  //#endregion
@@ -347,5 +341,5 @@ declare const compareRoutes: (a: {
347
341
  //#region src/helpers/templateEngine.d.ts
348
342
  declare function renderTemplate(template: string, data: Record<string, unknown>): string;
349
343
  //#endregion
350
- export { BasePlugin, DerivedResponseCycleError, DuplicateOperationIdError, DuplicateRouteError, EmptyOperationResponsesError, EmptyResourceOperationsError, EmptySpecResourcesError, GeneratorContext, InvalidDerivedResponseError, InvalidOperationIdError, InvalidRequestSchemaError, InvalidResourceNameError, MissingDerivedResponseParentError, NormalizedCanonicalResponseUsage, NormalizedInlineResponseUsage, NormalizedOperation, NormalizedRequest, NormalizedResource, NormalizedResponse, NormalizedResponseUsage, NormalizedSpec, OperationOutputPaths, PathParameterMismatchError, PluginConfig, PluginConstructor, PluginContext, type PluginContextBuilderApi, PluginDependencyError, PluginLoadError, PluginMetadata, PluginModule, PluginRegistration, type PluginRegistryApi, TypeweaverConfig, TypeweaverPlugin, compareRoutes, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isCamelCase, isPascalCase, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate, toCamelCase, toPascalCase };
344
+ export { BasePlugin, DerivedResponseCycleError, DuplicateOperationIdError, DuplicateRouteError, EmptyOperationResponsesError, EmptyResourceOperationsError, EmptySpecResourcesError, GeneratorContext, InvalidDerivedResponseError, InvalidOperationIdError, InvalidRequestSchemaError, InvalidResourceNameError, MissingDerivedResponseParentError, NormalizedCanonicalResponseUsage, NormalizedInlineResponseUsage, NormalizedOperation, NormalizedRequest, NormalizedResource, NormalizedResponse, NormalizedResponseUsage, NormalizedSpec, OperationOutputPaths, PathParameterMismatchError, PluginConfig, PluginConstructor, PluginContext, type PluginContextBuilderApi, PluginDependencyError, PluginLoadError, PluginMetadata, PluginModule, PluginRegistration, type PluginRegistryApi, TypeweaverConfig, TypeweaverPlugin, compareRoutes, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate };
351
345
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors/DerivedResponseCycleError.ts","../src/errors/DuplicateOperationIdError.ts","../src/errors/DuplicateRouteError.ts","../src/errors/EmptyOperationResponsesError.ts","../src/errors/EmptyResourceOperationsError.ts","../src/errors/EmptySpecResourcesError.ts","../src/errors/InvalidDerivedResponseError.ts","../src/errors/InvalidOperationIdError.ts","../src/NormalizedSpec.ts","../src/errors/InvalidRequestSchemaError.ts","../src/errors/InvalidResourceNameError.ts","../src/errors/MissingDerivedResponseParentError.ts","../src/errors/PathParameterMismatchError.ts","../src/normalizeSpec.ts","../src/plugins/types.ts","../src/plugins/BasePlugin.ts","../src/plugins/pluginRegistry.ts","../src/plugins/pluginContext.ts","../src/helpers/caseUtils.ts","../src/helpers/namingUtils.ts","../src/helpers/path.ts","../src/helpers/routePath.ts","../src/helpers/routeSort.ts","../src/helpers/templateEngine.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors/DerivedResponseCycleError.ts","../src/errors/DuplicateOperationIdError.ts","../src/errors/DuplicateRouteError.ts","../src/errors/EmptyOperationResponsesError.ts","../src/errors/EmptyResourceOperationsError.ts","../src/errors/EmptySpecResourcesError.ts","../src/errors/InvalidDerivedResponseError.ts","../src/errors/InvalidOperationIdError.ts","../src/NormalizedSpec.ts","../src/errors/InvalidRequestSchemaError.ts","../src/errors/InvalidResourceNameError.ts","../src/errors/MissingDerivedResponseParentError.ts","../src/errors/PathParameterMismatchError.ts","../src/normalizeSpec.ts","../src/plugins/types.ts","../src/plugins/BasePlugin.ts","../src/plugins/pluginRegistry.ts","../src/plugins/pluginContext.ts","../src/helpers/namingUtils.ts","../src/helpers/path.ts","../src/helpers/routePath.ts","../src/helpers/routeSort.ts","../src/helpers/templateEngine.ts"],"mappings":";;;cAAa,yBAAA,SAAkC,KAAA;cAC1B,YAAA;AAAA;;;cCDR,yBAAA,SAAkC,KAAA;cAC1B,WAAA;AAAA;;;cCDR,mBAAA,SAA4B,KAAA;cACpB,MAAA,UAAgB,IAAA,UAAc,cAAA;AAAA;;;cCDtC,4BAAA,SAAqC,KAAA;cAC7B,WAAA;AAAA;;;cCDR,4BAAA,SAAqC,KAAA;cAC7B,YAAA;AAAA;;;cCDR,uBAAA,SAAgC,KAAA;EAAA,WAAA,CAAA;AAAA;;;cCAhC,2BAAA,SAAoC,KAAA;cAC5B,YAAA;AAAA;;;cCDR,uBAAA,SAAgC,KAAA;cACxB,WAAA;AAAA;;;KCQT,cAAA;EAAA,SACD,SAAA,WAAoB,kBAAA;EAAA,SACpB,SAAA,WAAoB,kBAAA;AAAA;AAAA,KAGnB,kBAAA;EAAA,SACD,IAAA;EAAA,SACA,UAAA,WAAqB,mBAAA;AAAA;AAAA,KAGpB,mBAAA;EAAA,SACD,WAAA;EAAA,SACA,MAAA,EAAQ,UAAA;EAAA,SACR,IAAA;EAAA,SACA,OAAA;EAAA,SACA,OAAA,GAAU,iBAAA;EAAA,SACV,SAAA,WAAoB,uBAAA;AAAA;AAAA,KAGnB,iBAAA;EAAA,SACD,MAAA,GAAS,gBAAA;EAAA,SACT,KAAA,GAAQ,eAAA;EAAA,SACR,KAAA,GAAQ,eAAA;EAAA,SACR,IAAA,GAAO,cAAA;AAAA;AAAA,KAGN,kBAAA;EAAA,SACD,IAAA;EAAA,SACA,UAAA,EAAY,cAAA;EAAA,SACZ,cAAA;EAAA,SACA,WAAA;EAAA,SACA,MAAA,GAAS,gBAAA;EAAA,SACT,IAAA,GAAO,cAAA;EAAA,SACP,IAAA;EAAA,SACA,WAAA;EAAA,SACA,OAAA;EAAA,SACA,KAAA;AAAA;AAAA,KAGC,gCAAA;EAAA,SACD,YAAA;EAAA,SACA,MAAA;AAAA;AAAA,KAGC,6BAAA;EAAA,SACD,YAAA;EAAA,SACA,MAAA;EAAA,SACA,QAAA,EAAU,kBAAA;AAAA;AAAA,KAGT,uBAAA,GACR,gCAAA,GACA,6BAAA;;;cC3DS,yBAAA,SAAkC,KAAA;cAE3C,WAAA,UACA,WAAA,QAAmB,iBAAA;AAAA;;;cCLV,wBAAA,SAAiC,KAAA;cACzB,YAAA;AAAA;;;cCDR,iCAAA,SAA0C,KAAA;cAClC,YAAA,UAAsB,UAAA;AAAA;;;cCD9B,0BAAA,SAAmC,KAAA;cAE5C,WAAA,UACA,IAAA,UACA,UAAA,qBACA,aAAA;AAAA;;;cCmLS,aAAA,GAAiB,UAAA,EAAY,cAAA,KAAiB,cAAA;;;;;AbxL3D;KcKY,YAAA,GAAe,MAAA;;;;KAKf,aAAA;EAAA,SACD,SAAA;EAAA,SACA,QAAA;EAAA,SACA,MAAA,EAAQ,YAAA;AAAA;AAAA,KAGP,oBAAA;EAAA,SACD,SAAA;EAAA,SACA,WAAA;EAAA,SACA,eAAA;EAAA,SACA,YAAA;EAAA,SACA,gBAAA;EAAA,SACA,qBAAA;EAAA,SACA,yBAAA;EAAA,SACA,sBAAA;EAAA,SACA,0BAAA;EAAA,SACA,UAAA;EAAA,SACA,cAAA;AAAA;;AZ3BX;;KYiCY,gBAAA,GAAmB,aAAA;EAAA,SACpB,cAAA,EAAgB,cAAA;EAAA,SAChB,OAAA;EAAA,SACA,kBAAA;EAAA,SACA,aAAA;EAAA,SAEA,oBAAA,GAAuB,YAAA,aAAyB,kBAAA;EAAA,SAChD,8BAAA,GAAiC,YAAA;EAAA,SACjC,8BAAA,GAAiC,MAAA;IAAA,SAC/B,WAAA;IAAA,SACA,YAAA;EAAA;EAAA,SAEF,iBAAA,GAAoB,MAAA;IAAA,SAClB,WAAA;EAAA;EAAA,SAEF,8BAAA,GAAiC,MAAA;IAAA,SAC/B,YAAA;IAAA,SACA,WAAA;EAAA;EAAA,SAEF,uBAAA,GAA0B,MAAA;IAAA,SACxB,YAAA;IAAA,SACA,WAAA;EAAA,MACL,oBAAA;EAAA,SACG,oBAAA,GAAuB,YAAA;EAAA,SACvB,SAAA,GAAY,YAAA,UAAsB,OAAA;EAAA,SAClC,cAAA,GAAiB,YAAA,UAAsB,IAAA;EAAA,SACvC,gBAAA,GAAmB,YAAA;EAAA,SACnB,iBAAA;AAAA;;;;KAMC,cAAA;EAAA,SACD,IAAA;EAAA,SACA,OAAA;AAAA;;ATpEX;;KS0EY,gBAAA,GAAmB,cAAA;ET1Ec;;;;ES+E3C,UAAA,EAAY,OAAA,EAAS,aAAA,GAAgB,OAAA;ER/E1B;;;;EQqFX,gBAAA,EACE,cAAA,EAAgB,cAAA,GACf,OAAA,CAAQ,cAAA,IAAkB,cAAA;;;;;EAM7B,QAAA,EAAU,OAAA,EAAS,gBAAA,GAAmB,OAAA;;;AP7FxC;;EOmGE,QAAA,EAAU,OAAA,EAAS,aAAA,GAAgB,OAAA;AAAA;;;;KAMzB,iBAAA,QAAyB,MAAA,GAAS,YAAA,KAAiB,gBAAA;;;;KAKnD,YAAA;EACV,OAAA,EAAS,iBAAA;AAAA;;;;KAMC,kBAAA;EACV,IAAA;EACA,MAAA,EAAQ,gBAAA;EACR,MAAA,GAAS,YAAA;AAAA;AN1GX;;;AAAA,KMgHY,gBAAA;EACV,KAAA;EACA,MAAA;EACA,OAAA,sBAA6B,YAAA;EAC7B,MAAA;EACA,KAAA;AAAA;;;;cAMW,eAAA,SAAwB,KAAA;EAE1B,UAAA;cAAA,UAAA,UACP,OAAA;AAAA;;;;cAUS,qBAAA,SAA8B,KAAA;EAEhC,UAAA;EACA,iBAAA;cADA,UAAA,UACA,iBAAA,UACP,OAAA;AAAA;;;;Ad1JJ;;;uBecsB,UAAA,YAAsB,gBAAA;EAAA,SACjC,IAAA;EACT,WAAA;EACA,MAAA;EACA,OAAA;EAAA,UAEU,MAAA,EAAQ,YAAA;cAEN,MAAA,GAAQ,YAAA;;;AdtBtB;Ec6BQ,UAAA,CAAW,QAAA,EAAU,aAAA,GAAgB,OAAA;;;;EAO3C,gBAAA,CAAiB,cAAA,EAAgB,cAAA,GAAiB,cAAA;EdnC/B;;;EAAA,Sc0CV,QAAA,CAAS,OAAA,EAAS,gBAAA,GAAmB,OAAA;;;Ab3ChD;EagDQ,QAAA,CAAS,QAAA,EAAU,aAAA,GAAgB,OAAA;EAAA,UAI/B,YAAA,CACR,OAAA,EAAS,gBAAA,EACT,YAAA,UACA,YAAA;AAAA;;;KCpDQ,iBAAA;EAAA,SACD,QAAA,GAAW,MAAA,EAAQ,gBAAA,EAAkB,MAAA;EAAA,SACrC,GAAA,GAAM,IAAA,aAAiB,kBAAA;EAAA,SACvB,MAAA,QAAc,kBAAA;EAAA,SACd,GAAA,GAAM,IAAA;EAAA,SACN,KAAA;AAAA;AAAA,iBAGK,oBAAA,CAAA,GAAwB,iBAAA;;;KCH5B,uBAAA;EAAA,SACD,mBAAA,GAAsB,MAAA;IAC7B,SAAA;IACA,QAAA;IACA,MAAA,EAAQ,YAAA;EAAA,MACJ,aAAA;EAAA,SACG,sBAAA,GAAyB,MAAA;IAAA,SACvB,SAAA;IAAA,SACA,QAAA;IAAA,SACA,MAAA,EAAQ,YAAA;IAAA,SACR,cAAA,EAAgB,cAAA;IAAA,SAChB,WAAA;IAAA,SACA,OAAA;IAAA,SACA,kBAAA;IAAA,SACA,aAAA;EAAA,MACL,gBAAA;EAAA,SACG,iBAAA;EAAA,SACA,mBAAA;AAAA;AAAA,iBAGK,0BAAA,CAAA,GAA8B,uBAAA;;;cCtBjC,sBAAA,GAA0B,KAAA;AAAA,cAI1B,uBAAA,GAA2B,KAAA;;;iBCRxB,QAAA,CAAS,IAAA,UAAc,EAAA;;;cCA1B,kBAAA,GAAsB,IAAA;AAAA,cAUtB,qBAAA,GAAyB,IAAA;;;;;;ApBZtC;cqBoBa,iBAAA,GAAqB,MAAA;;;;;;;;;cA4BrB,aAAA,GACX,CAAA;EAAK,MAAA;EAAgB,IAAA;AAAA,GACrB,CAAA;EAAK,MAAA;EAAgB,IAAA;AAAA;;;iBCjCP,cAAA,CACd,QAAA,UACA,IAAA,EAAM,MAAA"}
package/dist/index.d.mts CHANGED
@@ -305,13 +305,7 @@ type PluginContextBuilderApi = {
305
305
  };
306
306
  declare function createPluginContextBuilder(): PluginContextBuilderApi;
307
307
  //#endregion
308
- //#region src/helpers/caseUtils.d.ts
309
- declare function toPascalCase(input: string): string;
310
- declare function toCamelCase(input: string): string;
311
- //#endregion
312
308
  //#region src/helpers/namingUtils.d.ts
313
- declare const isCamelCase: (value: string) => boolean;
314
- declare const isPascalCase: (value: string) => boolean;
315
309
  declare const isSupportedOperationId: (value: string) => boolean;
316
310
  declare const isSupportedResourceName: (value: string) => boolean;
317
311
  //#endregion
@@ -347,5 +341,5 @@ declare const compareRoutes: (a: {
347
341
  //#region src/helpers/templateEngine.d.ts
348
342
  declare function renderTemplate(template: string, data: Record<string, unknown>): string;
349
343
  //#endregion
350
- export { BasePlugin, DerivedResponseCycleError, DuplicateOperationIdError, DuplicateRouteError, EmptyOperationResponsesError, EmptyResourceOperationsError, EmptySpecResourcesError, GeneratorContext, InvalidDerivedResponseError, InvalidOperationIdError, InvalidRequestSchemaError, InvalidResourceNameError, MissingDerivedResponseParentError, NormalizedCanonicalResponseUsage, NormalizedInlineResponseUsage, NormalizedOperation, NormalizedRequest, NormalizedResource, NormalizedResponse, NormalizedResponseUsage, NormalizedSpec, OperationOutputPaths, PathParameterMismatchError, PluginConfig, PluginConstructor, PluginContext, type PluginContextBuilderApi, PluginDependencyError, PluginLoadError, PluginMetadata, PluginModule, PluginRegistration, type PluginRegistryApi, TypeweaverConfig, TypeweaverPlugin, compareRoutes, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isCamelCase, isPascalCase, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate, toCamelCase, toPascalCase };
344
+ export { BasePlugin, DerivedResponseCycleError, DuplicateOperationIdError, DuplicateRouteError, EmptyOperationResponsesError, EmptyResourceOperationsError, EmptySpecResourcesError, GeneratorContext, InvalidDerivedResponseError, InvalidOperationIdError, InvalidRequestSchemaError, InvalidResourceNameError, MissingDerivedResponseParentError, NormalizedCanonicalResponseUsage, NormalizedInlineResponseUsage, NormalizedOperation, NormalizedRequest, NormalizedResource, NormalizedResponse, NormalizedResponseUsage, NormalizedSpec, OperationOutputPaths, PathParameterMismatchError, PluginConfig, PluginConstructor, PluginContext, type PluginContextBuilderApi, PluginDependencyError, PluginLoadError, PluginMetadata, PluginModule, PluginRegistration, type PluginRegistryApi, TypeweaverConfig, TypeweaverPlugin, compareRoutes, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate };
351
345
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors/DerivedResponseCycleError.ts","../src/errors/DuplicateOperationIdError.ts","../src/errors/DuplicateRouteError.ts","../src/errors/EmptyOperationResponsesError.ts","../src/errors/EmptyResourceOperationsError.ts","../src/errors/EmptySpecResourcesError.ts","../src/errors/InvalidDerivedResponseError.ts","../src/errors/InvalidOperationIdError.ts","../src/NormalizedSpec.ts","../src/errors/InvalidRequestSchemaError.ts","../src/errors/InvalidResourceNameError.ts","../src/errors/MissingDerivedResponseParentError.ts","../src/errors/PathParameterMismatchError.ts","../src/normalizeSpec.ts","../src/plugins/types.ts","../src/plugins/BasePlugin.ts","../src/plugins/pluginRegistry.ts","../src/plugins/pluginContext.ts","../src/helpers/caseUtils.ts","../src/helpers/namingUtils.ts","../src/helpers/path.ts","../src/helpers/routePath.ts","../src/helpers/routeSort.ts","../src/helpers/templateEngine.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors/DerivedResponseCycleError.ts","../src/errors/DuplicateOperationIdError.ts","../src/errors/DuplicateRouteError.ts","../src/errors/EmptyOperationResponsesError.ts","../src/errors/EmptyResourceOperationsError.ts","../src/errors/EmptySpecResourcesError.ts","../src/errors/InvalidDerivedResponseError.ts","../src/errors/InvalidOperationIdError.ts","../src/NormalizedSpec.ts","../src/errors/InvalidRequestSchemaError.ts","../src/errors/InvalidResourceNameError.ts","../src/errors/MissingDerivedResponseParentError.ts","../src/errors/PathParameterMismatchError.ts","../src/normalizeSpec.ts","../src/plugins/types.ts","../src/plugins/BasePlugin.ts","../src/plugins/pluginRegistry.ts","../src/plugins/pluginContext.ts","../src/helpers/namingUtils.ts","../src/helpers/path.ts","../src/helpers/routePath.ts","../src/helpers/routeSort.ts","../src/helpers/templateEngine.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { HttpMethod, HttpStatusCodeNameMap, isNamedResponseDefinition, validateUniqueResponseNames } from "@rexeus/typeweaver-core";
2
2
  import { z } from "zod";
3
+ import { isCamelCase, isPascalCase, pascalCase } from "polycase";
3
4
  import fs from "node:fs";
4
5
  import path from "node:path";
5
6
  //#region src/errors/DerivedResponseCycleError.ts
@@ -99,14 +100,6 @@ var PathParameterMismatchError = class extends Error {
99
100
  };
100
101
  //#endregion
101
102
  //#region src/helpers/namingUtils.ts
102
- const CAMEL_CASE_PATTERN = /^[a-z][A-Za-z0-9]*$/;
103
- const PASCAL_CASE_PATTERN = /^[A-Z][A-Za-z0-9]*$/;
104
- const isCamelCase = (value) => {
105
- return CAMEL_CASE_PATTERN.test(value);
106
- };
107
- const isPascalCase = (value) => {
108
- return PASCAL_CASE_PATTERN.test(value);
109
- };
110
103
  const isSupportedIdentifierName = (value) => {
111
104
  return isCamelCase(value) || isPascalCase(value);
112
105
  };
@@ -457,11 +450,12 @@ function createPluginContextBuilder() {
457
450
  };
458
451
  const getOperationOutputPaths = (config) => {
459
452
  const outputDir = getResourceOutputDir(config.resourceName);
460
- const requestFileName = `${config.operationId}Request.ts`;
461
- const responseFileName = `${config.operationId}Response.ts`;
462
- const requestValidationFileName = `${config.operationId}RequestValidator.ts`;
463
- const responseValidationFileName = `${config.operationId}ResponseValidator.ts`;
464
- const clientFileName = `${config.operationId}Client.ts`;
453
+ const fileBase = pascalCase(config.operationId);
454
+ const requestFileName = `${fileBase}Request.ts`;
455
+ const responseFileName = `${fileBase}Response.ts`;
456
+ const requestValidationFileName = `${fileBase}RequestValidator.ts`;
457
+ const responseValidationFileName = `${fileBase}ResponseValidator.ts`;
458
+ const clientFileName = `${fileBase}Client.ts`;
465
459
  return {
466
460
  outputDir,
467
461
  requestFile: path.join(outputDir, requestFileName),
@@ -482,7 +476,7 @@ function createPluginContextBuilder() {
482
476
  return response;
483
477
  };
484
478
  const getCanonicalResponseOutputFile = (responseName) => {
485
- return path.join(params.responsesOutputDir, `${responseName}Response.ts`);
479
+ return path.join(params.responsesOutputDir, `${pascalCase(responseName)}Response.ts`);
486
480
  };
487
481
  return {
488
482
  ...pluginContext,
@@ -493,10 +487,10 @@ function createPluginContextBuilder() {
493
487
  getCanonicalResponse,
494
488
  getCanonicalResponseOutputFile,
495
489
  getCanonicalResponseImportPath: (config) => {
496
- return relative(config.importerDir, getCanonicalResponseOutputFile(config.responseName).replace(/\.ts$/, ""));
490
+ return relative(config.importerDir, getCanonicalResponseOutputFile(config.responseName).replace(/\.ts$/, ".js"));
497
491
  },
498
492
  getSpecImportPath: (config) => {
499
- return relative(config.importerDir, path.join(params.specOutputDir, "spec").replace(/\.ts$/, ""));
493
+ return relative(config.importerDir, path.join(params.specOutputDir, "spec.js"));
500
494
  },
501
495
  getOperationDefinitionAccessor: (config) => {
502
496
  return `getOperationDefinition(spec, ${JSON.stringify(config.resourceName)}, ${JSON.stringify(config.operationId)})`;
@@ -531,21 +525,6 @@ function createPluginContextBuilder() {
531
525
  };
532
526
  }
533
527
  //#endregion
534
- //#region src/helpers/caseUtils.ts
535
- function splitWords(input) {
536
- return input.trim().replace(/[_\-\s]+/g, " ").replace(/([a-z\d])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").split(" ").filter(Boolean).map((word) => word.toLowerCase());
537
- }
538
- function capitalize(word) {
539
- return word.charAt(0).toUpperCase() + word.slice(1);
540
- }
541
- function toPascalCase(input) {
542
- return splitWords(input).map(capitalize).join("");
543
- }
544
- function toCamelCase(input) {
545
- const [firstWord = "", ...remainingWords] = splitWords(input);
546
- return firstWord + remainingWords.map(capitalize).join("");
547
- }
548
- //#endregion
549
528
  //#region src/helpers/routeSort.ts
550
529
  /**
551
530
  * HTTP method priority for route ordering.
@@ -595,6 +574,6 @@ const compareRoutes = (a, b) => {
595
574
  return getMethodPriority(a.method) - getMethodPriority(b.method);
596
575
  };
597
576
  //#endregion
598
- export { BasePlugin, DerivedResponseCycleError, DuplicateOperationIdError, DuplicateRouteError, EmptyOperationResponsesError, EmptyResourceOperationsError, EmptySpecResourcesError, InvalidDerivedResponseError, InvalidOperationIdError, InvalidRequestSchemaError, InvalidResourceNameError, MissingDerivedResponseParentError, PathParameterMismatchError, PluginDependencyError, PluginLoadError, compareRoutes, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isCamelCase, isPascalCase, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate, toCamelCase, toPascalCase };
577
+ export { BasePlugin, DerivedResponseCycleError, DuplicateOperationIdError, DuplicateRouteError, EmptyOperationResponsesError, EmptyResourceOperationsError, EmptySpecResourcesError, InvalidDerivedResponseError, InvalidOperationIdError, InvalidRequestSchemaError, InvalidResourceNameError, MissingDerivedResponseParentError, PathParameterMismatchError, PluginDependencyError, PluginLoadError, compareRoutes, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate };
599
578
 
600
579
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/errors/DerivedResponseCycleError.ts","../src/errors/DuplicateOperationIdError.ts","../src/errors/DuplicateRouteError.ts","../src/errors/EmptyOperationResponsesError.ts","../src/errors/EmptyResourceOperationsError.ts","../src/errors/EmptySpecResourcesError.ts","../src/errors/InvalidDerivedResponseError.ts","../src/errors/InvalidOperationIdError.ts","../src/errors/InvalidRequestSchemaError.ts","../src/errors/InvalidResourceNameError.ts","../src/errors/MissingDerivedResponseParentError.ts","../src/errors/PathParameterMismatchError.ts","../src/helpers/namingUtils.ts","../src/helpers/routePath.ts","../src/validation/derivedResponseValidation.ts","../src/normalizeSpec.ts","../src/plugins/types.ts","../src/plugins/BasePlugin.ts","../src/plugins/pluginRegistry.ts","../src/helpers/path.ts","../src/helpers/templateEngine.ts","../src/plugins/pluginContext.ts","../src/helpers/caseUtils.ts","../src/helpers/routeSort.ts"],"sourcesContent":["export class DerivedResponseCycleError extends Error {\n public constructor(responseName: string) {\n super(`Derived response '${responseName}' contains a cyclic lineage.`);\n this.name = \"DerivedResponseCycleError\";\n }\n}\n","export class DuplicateOperationIdError extends Error {\n public constructor(operationId: string) {\n super(\n `Operation ID '${operationId}' must be globally unique within a spec.`\n );\n this.name = \"DuplicateOperationIdError\";\n }\n}\n","export class DuplicateRouteError extends Error {\n public constructor(method: string, path: string, normalizedPath: string) {\n super(\n `Route '${method} ${path}' conflicts with an existing route using normalized path '${normalizedPath}'.`\n );\n this.name = \"DuplicateRouteError\";\n }\n}\n","export class EmptyOperationResponsesError extends Error {\n public constructor(operationId: string) {\n super(`Operation '${operationId}' must declare at least one response.`);\n this.name = \"EmptyOperationResponsesError\";\n }\n}\n","export class EmptyResourceOperationsError extends Error {\n public constructor(resourceName: string) {\n super(`Resource '${resourceName}' must contain at least one operation.`);\n this.name = \"EmptyResourceOperationsError\";\n }\n}\n","export class EmptySpecResourcesError extends Error {\n public constructor() {\n super(\"Spec definition must contain at least one resource.\");\n this.name = \"EmptySpecResourcesError\";\n }\n}\n","export class InvalidDerivedResponseError extends Error {\n public constructor(responseName: string) {\n super(\n `Derived response '${responseName}' contains invalid lineage metadata.`\n );\n this.name = \"InvalidDerivedResponseError\";\n }\n}\n","export class InvalidOperationIdError extends Error {\n public constructor(operationId: string) {\n super(\n `Operation ID '${operationId}' is invalid. Use camelCase (preferred) or PascalCase. snake_case and kebab-case are not supported.`\n );\n this.name = \"InvalidOperationIdError\";\n }\n}\n","import type { NormalizedRequest } from \"../NormalizedSpec\";\n\nexport class InvalidRequestSchemaError extends Error {\n public constructor(\n operationId: string,\n requestPart: keyof NormalizedRequest\n ) {\n super(\n `Operation '${operationId}' has an invalid request.${requestPart} schema definition.`\n );\n this.name = \"InvalidRequestSchemaError\";\n }\n}\n","export class InvalidResourceNameError extends Error {\n public constructor(resourceName: string) {\n super(\n `Resource name '${resourceName}' is invalid. Use camelCase singular nouns when possible; PascalCase is also supported. snake_case and kebab-case are not supported.`\n );\n this.name = \"InvalidResourceNameError\";\n }\n}\n","export class MissingDerivedResponseParentError extends Error {\n public constructor(responseName: string, parentName: string) {\n super(\n `Derived response '${responseName}' references missing canonical parent '${parentName}'.`\n );\n this.name = \"MissingDerivedResponseParentError\";\n }\n}\n","export class PathParameterMismatchError extends Error {\n public constructor(\n operationId: string,\n path: string,\n pathParams: readonly string[],\n requestParams: readonly string[]\n ) {\n super(\n `Operation '${operationId}' has mismatched path parameters for '${path}'. Path params: [${pathParams.join(\n \", \"\n )}], request.param keys: [${requestParams.join(\", \")}].`\n );\n this.name = \"PathParameterMismatchError\";\n }\n}\n","const CAMEL_CASE_PATTERN = /^[a-z][A-Za-z0-9]*$/;\nconst PASCAL_CASE_PATTERN = /^[A-Z][A-Za-z0-9]*$/;\n\nexport const isCamelCase = (value: string): boolean => {\n return CAMEL_CASE_PATTERN.test(value);\n};\n\nexport const isPascalCase = (value: string): boolean => {\n return PASCAL_CASE_PATTERN.test(value);\n};\n\nconst isSupportedIdentifierName = (value: string): boolean => {\n return isCamelCase(value) || isPascalCase(value);\n};\n\nexport const isSupportedOperationId = (value: string): boolean => {\n return isSupportedIdentifierName(value);\n};\n\nexport const isSupportedResourceName = (value: string): boolean => {\n return isSupportedIdentifierName(value);\n};\n","const PATH_PARAMETER_PATTERN = /:([A-Za-z0-9_]+)/g;\n\nexport const normalizeRoutePath = (path: string): string => {\n const segments = path.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) {\n return \"/\";\n }\n\n return `/${segments.map(segment => (segment.startsWith(\":\") ? \":\" : segment)).join(\"/\")}`;\n};\n\nexport const getPathParameterNames = (path: string): string[] => {\n return Array.from(\n path.matchAll(PATH_PARAMETER_PATTERN),\n match => match[1] as string\n );\n};\n","import {\n HttpStatusCodeNameMap,\n isNamedResponseDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport type {\n ResponseDefinition,\n SpecDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport {\n DerivedResponseCycleError,\n InvalidDerivedResponseError,\n MissingDerivedResponseParentError,\n} from \"../errors\";\nimport type { NormalizedResponse } from \"../NormalizedSpec\";\n\nexport const validateDerivedResponseMetadata = (\n response: ResponseDefinition\n): void => {\n const derived = response.derived;\n\n if (derived === undefined) {\n return;\n }\n\n if (derived.parentName === response.name) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n if (derived.lineage.length === 0) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (derived.lineage.at(-1) !== response.name) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (derived.lineage.length !== derived.depth) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (new Set(derived.lineage).size !== derived.lineage.length) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n if (derived.depth > 1 && derived.lineage.at(-2) !== derived.parentName) {\n throw new InvalidDerivedResponseError(response.name);\n }\n};\n\nexport const collectCanonicalResponseDefinitions = (\n definition: SpecDefinition\n): Map<string, ResponseDefinition> => {\n const canonicalResponses = new Map<string, ResponseDefinition>();\n\n for (const resource of Object.values(definition.resources)) {\n for (const operation of resource.operations) {\n for (const response of operation.responses) {\n if (!isNamedResponseDefinition(response)) {\n continue;\n }\n\n validateDerivedResponseMetadata(response);\n\n canonicalResponses.set(response.name, response);\n }\n }\n }\n\n return canonicalResponses;\n};\n\nexport const getDerivedResponseChain = (\n response: ResponseDefinition,\n canonicalResponses: ReadonlyMap<string, ResponseDefinition>\n): readonly string[] => {\n const chain: string[] = [response.name];\n const visitedResponseNames = new Set(chain);\n let parentName = response.derived?.parentName;\n\n while (parentName !== undefined) {\n if (visitedResponseNames.has(parentName)) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n const parentResponse = canonicalResponses.get(parentName);\n\n if (parentResponse === undefined) {\n throw new MissingDerivedResponseParentError(response.name, parentName);\n }\n\n chain.unshift(parentResponse.name);\n visitedResponseNames.add(parentResponse.name);\n parentName = parentResponse.derived?.parentName;\n }\n\n return chain;\n};\n\nexport const validateDerivedResponseGraph = (\n canonicalResponses: ReadonlyMap<string, ResponseDefinition>\n): void => {\n for (const response of canonicalResponses.values()) {\n if (response.derived === undefined) {\n continue;\n }\n\n const chain = getDerivedResponseChain(response, canonicalResponses);\n const materializedLineage = chain.slice(1);\n\n if (response.derived.depth !== materializedLineage.length) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (\n materializedLineage.length !== response.derived.lineage.length ||\n materializedLineage.some(\n (lineageEntry, index) =>\n lineageEntry !== response.derived?.lineage[index]\n )\n ) {\n throw new InvalidDerivedResponseError(response.name);\n }\n }\n};\n\nexport const normalizeResponseDefinition = (\n response: ResponseDefinition\n): NormalizedResponse => {\n return {\n name: response.name,\n statusCode: response.statusCode,\n statusCodeName: HttpStatusCodeNameMap[response.statusCode],\n description: response.description,\n header: response.header,\n body: response.body,\n kind: response.derived === undefined ? \"response\" : \"derived-response\",\n derivedFrom: response.derived?.parentName,\n lineage: response.derived?.lineage,\n depth: response.derived?.depth,\n };\n};\n\nexport const collectCanonicalResponses = (\n definition: SpecDefinition\n): Map<string, NormalizedResponse> => {\n const canonicalResponseDefinitions =\n collectCanonicalResponseDefinitions(definition);\n\n validateDerivedResponseGraph(canonicalResponseDefinitions);\n\n return new Map(\n Array.from(\n canonicalResponseDefinitions.entries(),\n ([responseName, response]) => [\n responseName,\n normalizeResponseDefinition(response),\n ]\n )\n );\n};\n","import {\n isNamedResponseDefinition,\n validateUniqueResponseNames,\n} from \"@rexeus/typeweaver-core\";\nimport type {\n RequestDefinition,\n ResourceDefinition,\n ResponseDefinition,\n SpecDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport { z } from \"zod\";\nimport {\n DuplicateOperationIdError,\n DuplicateRouteError,\n EmptyOperationResponsesError,\n EmptyResourceOperationsError,\n EmptySpecResourcesError,\n InvalidOperationIdError,\n InvalidRequestSchemaError,\n InvalidResourceNameError,\n PathParameterMismatchError,\n} from \"./errors\";\nimport {\n isSupportedOperationId,\n isSupportedResourceName,\n} from \"./helpers/namingUtils\";\nimport { getPathParameterNames, normalizeRoutePath } from \"./helpers/routePath\";\nimport {\n collectCanonicalResponses,\n normalizeResponseDefinition,\n} from \"./validation\";\nimport type {\n NormalizedOperation,\n NormalizedRequest,\n NormalizedResponseUsage,\n NormalizedSpec,\n} from \"./NormalizedSpec\";\n\nconst isZodType = (schema: unknown): schema is z.ZodType => {\n return schema instanceof z.ZodType;\n};\n\nconst isZodObject = (\n schema: unknown\n): schema is z.ZodObject<z.core.$ZodShape> => {\n return schema instanceof z.ZodObject;\n};\n\nconst validateRequestSchema = (\n operationId: string,\n requestPart: keyof NormalizedRequest,\n schema: unknown\n): void => {\n if (!isZodType(schema)) {\n throw new InvalidRequestSchemaError(operationId, requestPart);\n }\n\n if (requestPart === \"param\" && !isZodObject(schema)) {\n throw new InvalidRequestSchemaError(operationId, requestPart);\n }\n};\n\nconst validateRequest = (\n operationId: string,\n path: string,\n request: RequestDefinition\n): NormalizedRequest | undefined => {\n if (request.header !== undefined) {\n validateRequestSchema(operationId, \"header\", request.header);\n }\n\n if (request.param !== undefined) {\n validateRequestSchema(operationId, \"param\", request.param);\n }\n\n if (request.query !== undefined) {\n validateRequestSchema(operationId, \"query\", request.query);\n }\n\n if (request.body !== undefined) {\n validateRequestSchema(operationId, \"body\", request.body);\n }\n\n const pathParams = getPathParameterNames(path);\n const requestParams =\n request.param === undefined ? [] : Object.keys(request.param.shape);\n\n if (\n pathParams.length !== requestParams.length ||\n pathParams.some(pathParam => !requestParams.includes(pathParam))\n ) {\n throw new PathParameterMismatchError(\n operationId,\n path,\n pathParams,\n requestParams\n );\n }\n\n if (\n request.header === undefined &&\n request.param === undefined &&\n request.query === undefined &&\n request.body === undefined\n ) {\n return undefined;\n }\n\n return {\n header: request.header,\n param: request.param,\n query: request.query,\n body: request.body,\n };\n};\n\nconst normalizeOperationResponses = (\n responses: readonly ResponseDefinition[]\n): NormalizedResponseUsage[] => {\n return responses.map(response => {\n if (isNamedResponseDefinition(response)) {\n return {\n responseName: response.name,\n source: \"canonical\",\n };\n }\n\n return {\n responseName: response.name,\n source: \"inline\",\n response: normalizeResponseDefinition(response),\n };\n });\n};\n\nconst normalizeOperation = (\n operationIds: Set<string>,\n routeKeys: Set<string>,\n operation: ResourceDefinition[\"operations\"][number]\n): NormalizedOperation => {\n if (!isSupportedOperationId(operation.operationId)) {\n throw new InvalidOperationIdError(operation.operationId);\n }\n\n if (operationIds.has(operation.operationId)) {\n throw new DuplicateOperationIdError(operation.operationId);\n }\n\n operationIds.add(operation.operationId);\n\n const normalizedPath = normalizeRoutePath(operation.path);\n const routeKey = `${operation.method}:${normalizedPath}`;\n\n if (routeKeys.has(routeKey)) {\n throw new DuplicateRouteError(\n operation.method,\n operation.path,\n normalizedPath\n );\n }\n\n routeKeys.add(routeKey);\n\n if (operation.responses.length === 0) {\n throw new EmptyOperationResponsesError(operation.operationId);\n }\n\n return {\n operationId: operation.operationId,\n method: operation.method,\n path: operation.path,\n summary: operation.summary,\n request: validateRequest(\n operation.operationId,\n operation.path,\n operation.request\n ),\n responses: normalizeOperationResponses(operation.responses),\n };\n};\n\nexport const normalizeSpec = (definition: SpecDefinition): NormalizedSpec => {\n const resourceEntries = Object.entries(definition.resources);\n\n if (resourceEntries.length === 0) {\n throw new EmptySpecResourcesError();\n }\n\n validateUniqueResponseNames(definition.resources);\n const canonicalResponses = collectCanonicalResponses(definition);\n const operationIds = new Set<string>();\n const routeKeys = new Set<string>();\n\n return {\n resources: resourceEntries.map(([resourceName, resource]) => {\n if (!isSupportedResourceName(resourceName)) {\n throw new InvalidResourceNameError(resourceName);\n }\n\n if (resource.operations.length === 0) {\n throw new EmptyResourceOperationsError(resourceName);\n }\n\n return {\n name: resourceName,\n operations: resource.operations.map(operation =>\n normalizeOperation(operationIds, routeKeys, operation)\n ),\n };\n }),\n responses: Array.from(canonicalResponses.values()),\n };\n};\n","import type { NormalizedResponse, NormalizedSpec } from \"../NormalizedSpec\";\n\n/**\n * Configuration for a typeweaver plugin\n */\nexport type PluginConfig = Record<string, unknown>;\n\n/**\n * Context provided to plugins during initialization and finalization\n */\nexport type PluginContext = {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n};\n\nexport type OperationOutputPaths = {\n readonly outputDir: string;\n readonly requestFile: string;\n readonly requestFileName: string;\n readonly responseFile: string;\n readonly responseFileName: string;\n readonly requestValidationFile: string;\n readonly requestValidationFileName: string;\n readonly responseValidationFile: string;\n readonly responseValidationFileName: string;\n readonly clientFile: string;\n readonly clientFileName: string;\n};\n\n/**\n * Context provided to plugins during generation\n */\nexport type GeneratorContext = PluginContext & {\n readonly normalizedSpec: NormalizedSpec;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n\n readonly getCanonicalResponse: (responseName: string) => NormalizedResponse;\n readonly getCanonicalResponseOutputFile: (responseName: string) => string;\n readonly getCanonicalResponseImportPath: (params: {\n readonly importerDir: string;\n readonly responseName: string;\n }) => string;\n readonly getSpecImportPath: (params: {\n readonly importerDir: string;\n }) => string;\n readonly getOperationDefinitionAccessor: (params: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => string;\n readonly getOperationOutputPaths: (params: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => OperationOutputPaths;\n readonly getResourceOutputDir: (resourceName: string) => string;\n readonly writeFile: (relativePath: string, content: string) => void;\n readonly renderTemplate: (templatePath: string, data: unknown) => string;\n readonly addGeneratedFile: (relativePath: string) => void;\n readonly getGeneratedFiles: () => string[];\n};\n\n/**\n * Plugin metadata\n */\nexport type PluginMetadata = {\n readonly name: string;\n readonly depends?: readonly string[];\n};\n\n/**\n * typeweaver plugin interface\n */\nexport type TypeweaverPlugin = PluginMetadata & {\n /**\n * Initialize the plugin\n * Called before any generation happens\n */\n initialize?(context: PluginContext): Promise<void> | void;\n\n /**\n * Collect and transform resources\n * Allows plugins to modify the resource collection\n */\n collectResources?(\n normalizedSpec: NormalizedSpec\n ): Promise<NormalizedSpec> | NormalizedSpec;\n\n /**\n * Main generation logic\n * Called with all resources and utilities\n */\n generate?(context: GeneratorContext): Promise<void> | void;\n\n /**\n * Finalize the plugin\n * Called after all generation is complete\n */\n finalize?(context: PluginContext): Promise<void> | void;\n};\n\n/**\n * Plugin constructor type\n */\nexport type PluginConstructor = new (config?: PluginConfig) => TypeweaverPlugin;\n\n/**\n * Plugin module export\n */\nexport type PluginModule = {\n default: PluginConstructor;\n};\n\n/**\n * Plugin registration entry\n */\nexport type PluginRegistration = {\n name: string;\n plugin: TypeweaverPlugin;\n config?: PluginConfig;\n};\n\n/**\n * typeweaver configuration\n */\nexport type TypeweaverConfig = {\n input: string;\n output: string;\n plugins?: (string | [string, PluginConfig])[];\n format?: boolean;\n clean?: boolean;\n};\n\n/**\n * Plugin loading error\n */\nexport class PluginLoadError extends Error {\n constructor(\n public pluginName: string,\n message: string\n ) {\n super(`Failed to load plugin '${pluginName}': ${message}`);\n this.name = \"PluginLoadError\";\n }\n}\n\n/**\n * Plugin dependency error\n */\nexport class PluginDependencyError extends Error {\n constructor(\n public pluginName: string,\n public missingDependency: string,\n message?: string\n ) {\n super(\n message ??\n `Plugin '${pluginName}' depends on '${missingDependency}' which is not loaded`\n );\n this.name = \"PluginDependencyError\";\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { NormalizedSpec } from \"../NormalizedSpec\";\nimport type {\n GeneratorContext,\n PluginConfig,\n PluginContext,\n TypeweaverPlugin,\n} from \"./types\";\n\n/**\n * Base class for typeweaver plugins\n * Provides default implementations and common utilities\n */\nexport abstract class BasePlugin implements TypeweaverPlugin {\n abstract name: string;\n description?: string;\n author?: string;\n depends?: string[];\n\n protected config: PluginConfig;\n\n constructor(config: PluginConfig = {}) {\n this.config = config;\n }\n\n /**\n * Default implementation - override in subclasses if needed\n */\n async initialize(_context: PluginContext): Promise<void> {\n // Default: no initialization needed\n }\n\n /**\n * Default implementation - override in subclasses if needed\n */\n collectResources(normalizedSpec: NormalizedSpec): NormalizedSpec {\n return normalizedSpec;\n }\n\n /**\n * Main generation logic - must be implemented by subclasses\n */\n abstract generate(context: GeneratorContext): Promise<void> | void;\n\n /**\n * Default implementation - override in subclasses if needed\n */\n async finalize(_context: PluginContext): Promise<void> {\n // Default: no finalization needed\n }\n\n protected copyLibFiles(\n context: GeneratorContext,\n libSourceDir: string,\n libNamespace: string\n ): void {\n if (!fs.existsSync(libSourceDir)) return;\n\n const libDir = path.join(context.outputDir, \"lib\", libNamespace);\n\n fs.cpSync(libSourceDir, libDir, { recursive: true });\n\n const libIndexPath = path.join(\"lib\", libNamespace, \"index.ts\");\n if (fs.existsSync(path.join(libDir, \"index.ts\"))) {\n context.addGeneratedFile(libIndexPath);\n }\n }\n}\n","import { PluginDependencyError } from \"./types\";\nimport type { PluginRegistration, TypeweaverPlugin } from \"./types\";\n\nexport type PluginRegistryApi = {\n readonly register: (plugin: TypeweaverPlugin, config?: unknown) => void;\n readonly get: (name: string) => PluginRegistration | undefined;\n readonly getAll: () => PluginRegistration[];\n readonly has: (name: string) => boolean;\n readonly clear: () => void;\n};\n\nexport function createPluginRegistry(): PluginRegistryApi {\n const plugins = new Map<string, PluginRegistration>();\n let sortedRegistrations: PluginRegistration[] | undefined;\n\n const invalidateSortedRegistrations = (): void => {\n sortedRegistrations = undefined;\n };\n\n return {\n register: (plugin: TypeweaverPlugin, config?: unknown): void => {\n if (plugins.has(plugin.name)) {\n console.info(\n `Skipping duplicate registration of required plugin: ${plugin.name}`\n );\n return;\n }\n\n const registration: PluginRegistration = {\n name: plugin.name,\n plugin,\n config: config as Record<string, unknown>,\n };\n\n plugins.set(plugin.name, registration);\n invalidateSortedRegistrations();\n console.info(`Registered plugin: ${plugin.name}`);\n },\n get: (name: string) => plugins.get(name),\n getAll: () => {\n if (sortedRegistrations === undefined) {\n sortedRegistrations = sortPluginRegistrations(\n Array.from(plugins.values())\n );\n }\n\n return [...sortedRegistrations];\n },\n has: (name: string) => plugins.has(name),\n clear: () => {\n plugins.clear();\n invalidateSortedRegistrations();\n },\n };\n}\n\nfunction sortPluginRegistrations(\n registrations: readonly PluginRegistration[]\n): PluginRegistration[] {\n const registrationsByName = new Map(\n registrations.map(registration => [registration.name, registration])\n );\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const sorted: PluginRegistration[] = [];\n\n for (const registration of registrations) {\n visitPlugin({\n registration,\n registrationsByName,\n visiting,\n visited,\n sorted,\n dependencyPath: [],\n });\n }\n\n return sorted;\n}\n\nfunction visitPlugin(params: {\n readonly registration: PluginRegistration;\n readonly registrationsByName: ReadonlyMap<string, PluginRegistration>;\n readonly visiting: Set<string>;\n readonly visited: Set<string>;\n readonly sorted: PluginRegistration[];\n readonly dependencyPath: readonly string[];\n}): void {\n const {\n registration,\n registrationsByName,\n visiting,\n visited,\n sorted,\n dependencyPath,\n } = params;\n\n if (visited.has(registration.name)) {\n return;\n }\n\n if (visiting.has(registration.name)) {\n const cyclePath = [...dependencyPath, registration.name].join(\" -> \");\n throw new PluginDependencyError(\n registration.name,\n registration.name,\n `Detected plugin dependency cycle: ${cyclePath}`\n );\n }\n\n visiting.add(registration.name);\n\n for (const dependencyName of registration.plugin.depends ?? []) {\n const dependency = registrationsByName.get(dependencyName);\n if (dependency === undefined) {\n throw new PluginDependencyError(registration.name, dependencyName);\n }\n\n visitPlugin({\n registration: dependency,\n registrationsByName,\n visiting,\n visited,\n sorted,\n dependencyPath: [...dependencyPath, registration.name],\n });\n }\n\n visiting.delete(registration.name);\n visited.add(registration.name);\n sorted.push(registration);\n}\n","import path from \"node:path\";\n\nexport function relative(from: string, to: string): string {\n const relativePath = path.relative(from, to);\n\n const posixPath = relativePath.split(path.sep).join(\"/\");\n\n if (!posixPath.startsWith(\"./\") && !posixPath.startsWith(\"../\")) {\n return `./${posixPath}`;\n }\n\n return posixPath;\n}\n","function escapeHtml(input: string): string {\n return input\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction stringifyTemplateValue(value: unknown): string {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n return String(value);\n}\n\nexport function renderTemplate(\n template: string,\n data: Record<string, unknown>\n): string {\n const outputChunks: string[] = [];\n const expressionPattern = /<%[=-]?[\\s\\S]*?%>/g;\n let currentIndex = 0;\n let match: RegExpExecArray | null = expressionPattern.exec(template);\n\n while (match !== null) {\n const [tag] = match;\n const tagStart = match.index;\n\n outputChunks.push(\n `__output.push(${JSON.stringify(template.slice(currentIndex, tagStart))});`\n );\n\n if (tag.startsWith(\"<%=\")) {\n const expression = tag.slice(3, -2).trim();\n outputChunks.push(`__output.push(__escape(__stringify(${expression})));`);\n } else if (tag.startsWith(\"<%-\")) {\n const expression = tag.slice(3, -2).trim();\n outputChunks.push(`__output.push(__stringify(${expression}));`);\n } else {\n outputChunks.push(tag.slice(2, -2));\n }\n\n currentIndex = tagStart + tag.length;\n match = expressionPattern.exec(template);\n }\n\n outputChunks.push(\n `__output.push(${JSON.stringify(template.slice(currentIndex))});`\n );\n\n const render = new Function(\n \"data\",\n \"__escape\",\n \"__stringify\",\n // This intentionally relies on `new Function()` sloppy mode so `with (data)`\n // can expose template variables as bare identifiers during rendering.\n // The tests pin the expected collision behavior: own properties on `data`\n // (including names like `name` or `toString`) must win over outer built-ins.\n `const __output = []; with (data) { ${outputChunks.join(\"\\n\")} } return __output.join(\"\");`\n ) as (\n data: Record<string, unknown>,\n escape: typeof escapeHtml,\n stringify: typeof stringifyTemplateValue\n ) => string;\n\n return render(data, escapeHtml, stringifyTemplateValue);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { relative } from \"../helpers/path\";\nimport { renderTemplate } from \"../helpers/templateEngine\";\nimport type { NormalizedResponse, NormalizedSpec } from \"../NormalizedSpec\";\nimport type { GeneratorContext, PluginConfig, PluginContext } from \"./types\";\n\nexport type PluginContextBuilderApi = {\n readonly createPluginContext: (params: {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n }) => PluginContext;\n readonly createGeneratorContext: (params: {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n readonly normalizedSpec: NormalizedSpec;\n readonly templateDir: string;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n }) => GeneratorContext;\n readonly getGeneratedFiles: () => string[];\n readonly clearGeneratedFiles: () => void;\n};\n\nexport function createPluginContextBuilder(): PluginContextBuilderApi {\n const generatedFiles = new Set<string>();\n\n const createPluginContext = (params: {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n }): PluginContext => {\n return {\n outputDir: params.outputDir,\n inputDir: params.inputDir,\n config: params.config,\n };\n };\n\n const createGeneratorContext = (params: {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n readonly normalizedSpec: NormalizedSpec;\n readonly templateDir: string;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n }): GeneratorContext => {\n const pluginContext = createPluginContext(params);\n const canonicalResponsesByName = new Map<string, NormalizedResponse>(\n params.normalizedSpec.responses.map(response => [response.name, response])\n );\n\n const getResourceOutputDir = (resourceName: string): string => {\n return path.join(params.outputDir, resourceName);\n };\n\n const getOperationOutputPaths = (config: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => {\n const outputDir = getResourceOutputDir(config.resourceName);\n const requestFileName = `${config.operationId}Request.ts`;\n const responseFileName = `${config.operationId}Response.ts`;\n const requestValidationFileName = `${config.operationId}RequestValidator.ts`;\n const responseValidationFileName = `${config.operationId}ResponseValidator.ts`;\n const clientFileName = `${config.operationId}Client.ts`;\n\n return {\n outputDir,\n requestFile: path.join(outputDir, requestFileName),\n requestFileName,\n responseFile: path.join(outputDir, responseFileName),\n responseFileName,\n requestValidationFile: path.join(outputDir, requestValidationFileName),\n requestValidationFileName,\n responseValidationFile: path.join(\n outputDir,\n responseValidationFileName\n ),\n responseValidationFileName,\n clientFile: path.join(outputDir, clientFileName),\n clientFileName,\n };\n };\n\n const getCanonicalResponse = (responseName: string): NormalizedResponse => {\n const response = canonicalResponsesByName.get(responseName);\n\n if (response === undefined) {\n throw new Error(`Missing canonical response '${responseName}'.`);\n }\n\n return response;\n };\n\n const getCanonicalResponseOutputFile = (responseName: string): string => {\n return path.join(params.responsesOutputDir, `${responseName}Response.ts`);\n };\n\n return {\n ...pluginContext,\n normalizedSpec: params.normalizedSpec,\n coreDir: params.coreDir,\n responsesOutputDir: params.responsesOutputDir,\n specOutputDir: params.specOutputDir,\n getCanonicalResponse,\n getCanonicalResponseOutputFile,\n getCanonicalResponseImportPath: config => {\n return relative(\n config.importerDir,\n getCanonicalResponseOutputFile(config.responseName).replace(\n /\\.ts$/,\n \"\"\n )\n );\n },\n getSpecImportPath: config => {\n return relative(\n config.importerDir,\n path.join(params.specOutputDir, \"spec\").replace(/\\.ts$/, \"\")\n );\n },\n getOperationDefinitionAccessor: config => {\n return (\n `getOperationDefinition(` +\n `spec, ` +\n `${JSON.stringify(config.resourceName)}, ` +\n `${JSON.stringify(config.operationId)}` +\n `)`\n );\n },\n getOperationOutputPaths,\n getResourceOutputDir,\n\n writeFile: (relativePath: string, content: string) => {\n const fullPath = path.join(params.outputDir, relativePath);\n const dir = path.dirname(fullPath);\n\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(fullPath, content);\n generatedFiles.add(relativePath);\n\n console.info(`Generated: ${relativePath}`);\n },\n\n renderTemplate: (templatePath: string, data: unknown) => {\n const fullTemplatePath = path.isAbsolute(templatePath)\n ? templatePath\n : path.join(params.templateDir, templatePath);\n\n const template = fs.readFileSync(fullTemplatePath, \"utf8\");\n return renderTemplate(\n template,\n (data ?? {}) as Record<string, unknown>\n );\n },\n\n addGeneratedFile: (relativePath: string) => {\n generatedFiles.add(relativePath);\n },\n\n getGeneratedFiles: () => {\n return Array.from(generatedFiles);\n },\n };\n };\n\n return {\n createPluginContext,\n createGeneratorContext,\n getGeneratedFiles: () => Array.from(generatedFiles),\n clearGeneratedFiles: () => generatedFiles.clear(),\n };\n}\n","function splitWords(input: string): string[] {\n return input\n .trim()\n .replace(/[_\\-\\s]+/g, \" \")\n .replace(/([a-z\\d])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .split(\" \")\n .filter(Boolean)\n .map(word => word.toLowerCase());\n}\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nexport function toPascalCase(input: string): string {\n return splitWords(input).map(capitalize).join(\"\");\n}\n\nexport function toCamelCase(input: string): string {\n const [firstWord = \"\", ...remainingWords] = splitWords(input);\n\n return firstWord + remainingWords.map(capitalize).join(\"\");\n}\n","import { HttpMethod } from \"@rexeus/typeweaver-core\";\n\n/**\n * HTTP method priority for route ordering.\n * Lower numbers = higher priority (sorted first).\n */\nconst METHOD_PRIORITY: Record<string, number> = {\n [HttpMethod.GET]: 1,\n [HttpMethod.POST]: 2,\n [HttpMethod.PUT]: 3,\n [HttpMethod.PATCH]: 4,\n [HttpMethod.DELETE]: 5,\n [HttpMethod.OPTIONS]: 6,\n [HttpMethod.HEAD]: 7,\n};\n\n/**\n * Returns the sort priority for an HTTP method.\n * Unrecognized methods default to priority 999.\n */\nexport const getMethodPriority = (method: string): number =>\n METHOD_PRIORITY[method] ?? 999;\n\n/**\n * Compares two path segments for route ordering.\n * Returns negative if a should come before b, positive if after.\n *\n * Order: static segments before parameters, then alphabetically.\n */\nconst comparePathSegments = (a: string, b: string): number => {\n const aIsParam = a.startsWith(\":\");\n const bIsParam = b.startsWith(\":\");\n\n if (aIsParam !== bIsParam) {\n return aIsParam ? 1 : -1;\n }\n\n return a.localeCompare(b);\n};\n\n/**\n * Compares two routes for ordering.\n * Routes are sorted by:\n * 1. Path depth (shallow to deep)\n * 2. Static segments before parameters\n * 3. Alphabetical within same segment type\n * 4. HTTP method priority\n */\nexport const compareRoutes = (\n a: { method: string; path: string },\n b: { method: string; path: string }\n): number => {\n const aSegments = a.path.split(\"/\").filter(Boolean);\n const bSegments = b.path.split(\"/\").filter(Boolean);\n\n if (aSegments.length !== bSegments.length) {\n return aSegments.length - bSegments.length;\n }\n\n for (let i = 0; i < aSegments.length; i++) {\n const cmp = comparePathSegments(aSegments[i]!, bSegments[i]!);\n if (cmp !== 0) {\n return cmp;\n }\n }\n\n return getMethodPriority(a.method) - getMethodPriority(b.method);\n};\n"],"mappings":";;;;;AAAA,IAAa,4BAAb,cAA+C,MAAM;CACnD,YAAmB,cAAsB;AACvC,QAAM,qBAAqB,aAAa,8BAA8B;AACtE,OAAK,OAAO;;;;;ACHhB,IAAa,4BAAb,cAA+C,MAAM;CACnD,YAAmB,aAAqB;AACtC,QACE,iBAAiB,YAAY,0CAC9B;AACD,OAAK,OAAO;;;;;ACLhB,IAAa,sBAAb,cAAyC,MAAM;CAC7C,YAAmB,QAAgB,MAAc,gBAAwB;AACvE,QACE,UAAU,OAAO,GAAG,KAAK,4DAA4D,eAAe,IACrG;AACD,OAAK,OAAO;;;;;ACLhB,IAAa,+BAAb,cAAkD,MAAM;CACtD,YAAmB,aAAqB;AACtC,QAAM,cAAc,YAAY,uCAAuC;AACvE,OAAK,OAAO;;;;;ACHhB,IAAa,+BAAb,cAAkD,MAAM;CACtD,YAAmB,cAAsB;AACvC,QAAM,aAAa,aAAa,wCAAwC;AACxE,OAAK,OAAO;;;;;ACHhB,IAAa,0BAAb,cAA6C,MAAM;CACjD,cAAqB;AACnB,QAAM,sDAAsD;AAC5D,OAAK,OAAO;;;;;ACHhB,IAAa,8BAAb,cAAiD,MAAM;CACrD,YAAmB,cAAsB;AACvC,QACE,qBAAqB,aAAa,sCACnC;AACD,OAAK,OAAO;;;;;ACLhB,IAAa,0BAAb,cAA6C,MAAM;CACjD,YAAmB,aAAqB;AACtC,QACE,iBAAiB,YAAY,qGAC9B;AACD,OAAK,OAAO;;;;;ACHhB,IAAa,4BAAb,cAA+C,MAAM;CACnD,YACE,aACA,aACA;AACA,QACE,cAAc,YAAY,2BAA2B,YAAY,qBAClE;AACD,OAAK,OAAO;;;;;ACVhB,IAAa,2BAAb,cAA8C,MAAM;CAClD,YAAmB,cAAsB;AACvC,QACE,kBAAkB,aAAa,sIAChC;AACD,OAAK,OAAO;;;;;ACLhB,IAAa,oCAAb,cAAuD,MAAM;CAC3D,YAAmB,cAAsB,YAAoB;AAC3D,QACE,qBAAqB,aAAa,yCAAyC,WAAW,IACvF;AACD,OAAK,OAAO;;;;;ACLhB,IAAa,6BAAb,cAAgD,MAAM;CACpD,YACE,aACA,MACA,YACA,eACA;AACA,QACE,cAAc,YAAY,wCAAwC,KAAK,mBAAmB,WAAW,KACnG,KACD,CAAC,0BAA0B,cAAc,KAAK,KAAK,CAAC,IACtD;AACD,OAAK,OAAO;;;;;ACZhB,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAE5B,MAAa,eAAe,UAA2B;AACrD,QAAO,mBAAmB,KAAK,MAAM;;AAGvC,MAAa,gBAAgB,UAA2B;AACtD,QAAO,oBAAoB,KAAK,MAAM;;AAGxC,MAAM,6BAA6B,UAA2B;AAC5D,QAAO,YAAY,MAAM,IAAI,aAAa,MAAM;;AAGlD,MAAa,0BAA0B,UAA2B;AAChE,QAAO,0BAA0B,MAAM;;AAGzC,MAAa,2BAA2B,UAA2B;AACjE,QAAO,0BAA0B,MAAM;;;;ACpBzC,MAAM,yBAAyB;AAE/B,MAAa,sBAAsB,SAAyB;CAC1D,MAAM,WAAW,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;AAEhD,KAAI,SAAS,WAAW,EACtB,QAAO;AAGT,QAAO,IAAI,SAAS,KAAI,YAAY,QAAQ,WAAW,IAAI,GAAG,MAAM,QAAS,CAAC,KAAK,IAAI;;AAGzF,MAAa,yBAAyB,SAA2B;AAC/D,QAAO,MAAM,KACX,KAAK,SAAS,uBAAuB,GACrC,UAAS,MAAM,GAChB;;;;ACDH,MAAa,mCACX,aACS;CACT,MAAM,UAAU,SAAS;AAEzB,KAAI,YAAY,KAAA,EACd;AAGF,KAAI,QAAQ,eAAe,SAAS,KAClC,OAAM,IAAI,0BAA0B,SAAS,KAAK;AAGpD,KAAI,QAAQ,QAAQ,WAAW,EAC7B,OAAM,IAAI,4BAA4B,SAAS,KAAK;AAGtD,KAAI,QAAQ,QAAQ,GAAG,GAAG,KAAK,SAAS,KACtC,OAAM,IAAI,4BAA4B,SAAS,KAAK;AAGtD,KAAI,QAAQ,QAAQ,WAAW,QAAQ,MACrC,OAAM,IAAI,4BAA4B,SAAS,KAAK;AAGtD,KAAI,IAAI,IAAI,QAAQ,QAAQ,CAAC,SAAS,QAAQ,QAAQ,OACpD,OAAM,IAAI,0BAA0B,SAAS,KAAK;AAGpD,KAAI,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,GAAG,GAAG,KAAK,QAAQ,WAC1D,OAAM,IAAI,4BAA4B,SAAS,KAAK;;AAIxD,MAAa,uCACX,eACoC;CACpC,MAAM,qCAAqB,IAAI,KAAiC;AAEhE,MAAK,MAAM,YAAY,OAAO,OAAO,WAAW,UAAU,CACxD,MAAK,MAAM,aAAa,SAAS,WAC/B,MAAK,MAAM,YAAY,UAAU,WAAW;AAC1C,MAAI,CAAC,0BAA0B,SAAS,CACtC;AAGF,kCAAgC,SAAS;AAEzC,qBAAmB,IAAI,SAAS,MAAM,SAAS;;AAKrD,QAAO;;AAGT,MAAa,2BACX,UACA,uBACsB;CACtB,MAAM,QAAkB,CAAC,SAAS,KAAK;CACvC,MAAM,uBAAuB,IAAI,IAAI,MAAM;CAC3C,IAAI,aAAa,SAAS,SAAS;AAEnC,QAAO,eAAe,KAAA,GAAW;AAC/B,MAAI,qBAAqB,IAAI,WAAW,CACtC,OAAM,IAAI,0BAA0B,SAAS,KAAK;EAGpD,MAAM,iBAAiB,mBAAmB,IAAI,WAAW;AAEzD,MAAI,mBAAmB,KAAA,EACrB,OAAM,IAAI,kCAAkC,SAAS,MAAM,WAAW;AAGxE,QAAM,QAAQ,eAAe,KAAK;AAClC,uBAAqB,IAAI,eAAe,KAAK;AAC7C,eAAa,eAAe,SAAS;;AAGvC,QAAO;;AAGT,MAAa,gCACX,uBACS;AACT,MAAK,MAAM,YAAY,mBAAmB,QAAQ,EAAE;AAClD,MAAI,SAAS,YAAY,KAAA,EACvB;EAIF,MAAM,sBADQ,wBAAwB,UAAU,mBAAmB,CACjC,MAAM,EAAE;AAE1C,MAAI,SAAS,QAAQ,UAAU,oBAAoB,OACjD,OAAM,IAAI,4BAA4B,SAAS,KAAK;AAGtD,MACE,oBAAoB,WAAW,SAAS,QAAQ,QAAQ,UACxD,oBAAoB,MACjB,cAAc,UACb,iBAAiB,SAAS,SAAS,QAAQ,OAC9C,CAED,OAAM,IAAI,4BAA4B,SAAS,KAAK;;;AAK1D,MAAa,+BACX,aACuB;AACvB,QAAO;EACL,MAAM,SAAS;EACf,YAAY,SAAS;EACrB,gBAAgB,sBAAsB,SAAS;EAC/C,aAAa,SAAS;EACtB,QAAQ,SAAS;EACjB,MAAM,SAAS;EACf,MAAM,SAAS,YAAY,KAAA,IAAY,aAAa;EACpD,aAAa,SAAS,SAAS;EAC/B,SAAS,SAAS,SAAS;EAC3B,OAAO,SAAS,SAAS;EAC1B;;AAGH,MAAa,6BACX,eACoC;CACpC,MAAM,+BACJ,oCAAoC,WAAW;AAEjD,8BAA6B,6BAA6B;AAE1D,QAAO,IAAI,IACT,MAAM,KACJ,6BAA6B,SAAS,GACrC,CAAC,cAAc,cAAc,CAC5B,cACA,4BAA4B,SAAS,CACtC,CACF,CACF;;;;ACxHH,MAAM,aAAa,WAAyC;AAC1D,QAAO,kBAAkB,EAAE;;AAG7B,MAAM,eACJ,WAC4C;AAC5C,QAAO,kBAAkB,EAAE;;AAG7B,MAAM,yBACJ,aACA,aACA,WACS;AACT,KAAI,CAAC,UAAU,OAAO,CACpB,OAAM,IAAI,0BAA0B,aAAa,YAAY;AAG/D,KAAI,gBAAgB,WAAW,CAAC,YAAY,OAAO,CACjD,OAAM,IAAI,0BAA0B,aAAa,YAAY;;AAIjE,MAAM,mBACJ,aACA,MACA,YACkC;AAClC,KAAI,QAAQ,WAAW,KAAA,EACrB,uBAAsB,aAAa,UAAU,QAAQ,OAAO;AAG9D,KAAI,QAAQ,UAAU,KAAA,EACpB,uBAAsB,aAAa,SAAS,QAAQ,MAAM;AAG5D,KAAI,QAAQ,UAAU,KAAA,EACpB,uBAAsB,aAAa,SAAS,QAAQ,MAAM;AAG5D,KAAI,QAAQ,SAAS,KAAA,EACnB,uBAAsB,aAAa,QAAQ,QAAQ,KAAK;CAG1D,MAAM,aAAa,sBAAsB,KAAK;CAC9C,MAAM,gBACJ,QAAQ,UAAU,KAAA,IAAY,EAAE,GAAG,OAAO,KAAK,QAAQ,MAAM,MAAM;AAErE,KACE,WAAW,WAAW,cAAc,UACpC,WAAW,MAAK,cAAa,CAAC,cAAc,SAAS,UAAU,CAAC,CAEhE,OAAM,IAAI,2BACR,aACA,MACA,YACA,cACD;AAGH,KACE,QAAQ,WAAW,KAAA,KACnB,QAAQ,UAAU,KAAA,KAClB,QAAQ,UAAU,KAAA,KAClB,QAAQ,SAAS,KAAA,EAEjB;AAGF,QAAO;EACL,QAAQ,QAAQ;EAChB,OAAO,QAAQ;EACf,OAAO,QAAQ;EACf,MAAM,QAAQ;EACf;;AAGH,MAAM,+BACJ,cAC8B;AAC9B,QAAO,UAAU,KAAI,aAAY;AAC/B,MAAI,0BAA0B,SAAS,CACrC,QAAO;GACL,cAAc,SAAS;GACvB,QAAQ;GACT;AAGH,SAAO;GACL,cAAc,SAAS;GACvB,QAAQ;GACR,UAAU,4BAA4B,SAAS;GAChD;GACD;;AAGJ,MAAM,sBACJ,cACA,WACA,cACwB;AACxB,KAAI,CAAC,uBAAuB,UAAU,YAAY,CAChD,OAAM,IAAI,wBAAwB,UAAU,YAAY;AAG1D,KAAI,aAAa,IAAI,UAAU,YAAY,CACzC,OAAM,IAAI,0BAA0B,UAAU,YAAY;AAG5D,cAAa,IAAI,UAAU,YAAY;CAEvC,MAAM,iBAAiB,mBAAmB,UAAU,KAAK;CACzD,MAAM,WAAW,GAAG,UAAU,OAAO,GAAG;AAExC,KAAI,UAAU,IAAI,SAAS,CACzB,OAAM,IAAI,oBACR,UAAU,QACV,UAAU,MACV,eACD;AAGH,WAAU,IAAI,SAAS;AAEvB,KAAI,UAAU,UAAU,WAAW,EACjC,OAAM,IAAI,6BAA6B,UAAU,YAAY;AAG/D,QAAO;EACL,aAAa,UAAU;EACvB,QAAQ,UAAU;EAClB,MAAM,UAAU;EAChB,SAAS,UAAU;EACnB,SAAS,gBACP,UAAU,aACV,UAAU,MACV,UAAU,QACX;EACD,WAAW,4BAA4B,UAAU,UAAU;EAC5D;;AAGH,MAAa,iBAAiB,eAA+C;CAC3E,MAAM,kBAAkB,OAAO,QAAQ,WAAW,UAAU;AAE5D,KAAI,gBAAgB,WAAW,EAC7B,OAAM,IAAI,yBAAyB;AAGrC,6BAA4B,WAAW,UAAU;CACjD,MAAM,qBAAqB,0BAA0B,WAAW;CAChE,MAAM,+BAAe,IAAI,KAAa;CACtC,MAAM,4BAAY,IAAI,KAAa;AAEnC,QAAO;EACL,WAAW,gBAAgB,KAAK,CAAC,cAAc,cAAc;AAC3D,OAAI,CAAC,wBAAwB,aAAa,CACxC,OAAM,IAAI,yBAAyB,aAAa;AAGlD,OAAI,SAAS,WAAW,WAAW,EACjC,OAAM,IAAI,6BAA6B,aAAa;AAGtD,UAAO;IACL,MAAM;IACN,YAAY,SAAS,WAAW,KAAI,cAClC,mBAAmB,cAAc,WAAW,UAAU,CACvD;IACF;IACD;EACF,WAAW,MAAM,KAAK,mBAAmB,QAAQ,CAAC;EACnD;;;;;;;AC1EH,IAAa,kBAAb,cAAqC,MAAM;CACzC,YACE,YACA,SACA;AACA,QAAM,0BAA0B,WAAW,KAAK,UAAU;AAHnD,OAAA,aAAA;AAIP,OAAK,OAAO;;;;;;AAOhB,IAAa,wBAAb,cAA2C,MAAM;CAC/C,YACE,YACA,mBACA,SACA;AACA,QACE,WACE,WAAW,WAAW,gBAAgB,kBAAkB,uBAC3D;AAPM,OAAA,aAAA;AACA,OAAA,oBAAA;AAOP,OAAK,OAAO;;;;;;;;;AClJhB,IAAsB,aAAtB,MAA6D;CAE3D;CACA;CACA;CAEA;CAEA,YAAY,SAAuB,EAAE,EAAE;AACrC,OAAK,SAAS;;;;;CAMhB,MAAM,WAAW,UAAwC;;;;CAOzD,iBAAiB,gBAAgD;AAC/D,SAAO;;;;;CAWT,MAAM,SAAS,UAAwC;CAIvD,aACE,SACA,cACA,cACM;AACN,MAAI,CAAC,GAAG,WAAW,aAAa,CAAE;EAElC,MAAM,SAAS,KAAK,KAAK,QAAQ,WAAW,OAAO,aAAa;AAEhE,KAAG,OAAO,cAAc,QAAQ,EAAE,WAAW,MAAM,CAAC;EAEpD,MAAM,eAAe,KAAK,KAAK,OAAO,cAAc,WAAW;AAC/D,MAAI,GAAG,WAAW,KAAK,KAAK,QAAQ,WAAW,CAAC,CAC9C,SAAQ,iBAAiB,aAAa;;;;;ACtD5C,SAAgB,uBAA0C;CACxD,MAAM,0BAAU,IAAI,KAAiC;CACrD,IAAI;CAEJ,MAAM,sCAA4C;AAChD,wBAAsB,KAAA;;AAGxB,QAAO;EACL,WAAW,QAA0B,WAA2B;AAC9D,OAAI,QAAQ,IAAI,OAAO,KAAK,EAAE;AAC5B,YAAQ,KACN,uDAAuD,OAAO,OAC/D;AACD;;GAGF,MAAM,eAAmC;IACvC,MAAM,OAAO;IACb;IACQ;IACT;AAED,WAAQ,IAAI,OAAO,MAAM,aAAa;AACtC,kCAA+B;AAC/B,WAAQ,KAAK,sBAAsB,OAAO,OAAO;;EAEnD,MAAM,SAAiB,QAAQ,IAAI,KAAK;EACxC,cAAc;AACZ,OAAI,wBAAwB,KAAA,EAC1B,uBAAsB,wBACpB,MAAM,KAAK,QAAQ,QAAQ,CAAC,CAC7B;AAGH,UAAO,CAAC,GAAG,oBAAoB;;EAEjC,MAAM,SAAiB,QAAQ,IAAI,KAAK;EACxC,aAAa;AACX,WAAQ,OAAO;AACf,kCAA+B;;EAElC;;AAGH,SAAS,wBACP,eACsB;CACtB,MAAM,sBAAsB,IAAI,IAC9B,cAAc,KAAI,iBAAgB,CAAC,aAAa,MAAM,aAAa,CAAC,CACrE;CACD,MAAM,2BAAW,IAAI,KAAa;CAClC,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAM,SAA+B,EAAE;AAEvC,MAAK,MAAM,gBAAgB,cACzB,aAAY;EACV;EACA;EACA;EACA;EACA;EACA,gBAAgB,EAAE;EACnB,CAAC;AAGJ,QAAO;;AAGT,SAAS,YAAY,QAOZ;CACP,MAAM,EACJ,cACA,qBACA,UACA,SACA,QACA,mBACE;AAEJ,KAAI,QAAQ,IAAI,aAAa,KAAK,CAChC;AAGF,KAAI,SAAS,IAAI,aAAa,KAAK,EAAE;EACnC,MAAM,YAAY,CAAC,GAAG,gBAAgB,aAAa,KAAK,CAAC,KAAK,OAAO;AACrE,QAAM,IAAI,sBACR,aAAa,MACb,aAAa,MACb,qCAAqC,YACtC;;AAGH,UAAS,IAAI,aAAa,KAAK;AAE/B,MAAK,MAAM,kBAAkB,aAAa,OAAO,WAAW,EAAE,EAAE;EAC9D,MAAM,aAAa,oBAAoB,IAAI,eAAe;AAC1D,MAAI,eAAe,KAAA,EACjB,OAAM,IAAI,sBAAsB,aAAa,MAAM,eAAe;AAGpE,cAAY;GACV,cAAc;GACd;GACA;GACA;GACA;GACA,gBAAgB,CAAC,GAAG,gBAAgB,aAAa,KAAK;GACvD,CAAC;;AAGJ,UAAS,OAAO,aAAa,KAAK;AAClC,SAAQ,IAAI,aAAa,KAAK;AAC9B,QAAO,KAAK,aAAa;;;;AChI3B,SAAgB,SAAS,MAAc,IAAoB;CAGzD,MAAM,YAFe,KAAK,SAAS,MAAM,GAAG,CAEb,MAAM,KAAK,IAAI,CAAC,KAAK,IAAI;AAExD,KAAI,CAAC,UAAU,WAAW,KAAK,IAAI,CAAC,UAAU,WAAW,MAAM,CAC7D,QAAO,KAAK;AAGd,QAAO;;;;ACXT,SAAS,WAAW,OAAuB;AACzC,QAAO,MACJ,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,QAAQ;;AAG7B,SAAS,uBAAuB,OAAwB;AACtD,KAAI,UAAU,KAAA,KAAa,UAAU,KACnC,QAAO;AAGT,QAAO,OAAO,MAAM;;AAGtB,SAAgB,eACd,UACA,MACQ;CACR,MAAM,eAAyB,EAAE;CACjC,MAAM,oBAAoB;CAC1B,IAAI,eAAe;CACnB,IAAI,QAAgC,kBAAkB,KAAK,SAAS;AAEpE,QAAO,UAAU,MAAM;EACrB,MAAM,CAAC,OAAO;EACd,MAAM,WAAW,MAAM;AAEvB,eAAa,KACX,iBAAiB,KAAK,UAAU,SAAS,MAAM,cAAc,SAAS,CAAC,CAAC,IACzE;AAED,MAAI,IAAI,WAAW,MAAM,EAAE;GACzB,MAAM,aAAa,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM;AAC1C,gBAAa,KAAK,sCAAsC,WAAW,MAAM;aAChE,IAAI,WAAW,MAAM,EAAE;GAChC,MAAM,aAAa,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM;AAC1C,gBAAa,KAAK,6BAA6B,WAAW,KAAK;QAE/D,cAAa,KAAK,IAAI,MAAM,GAAG,GAAG,CAAC;AAGrC,iBAAe,WAAW,IAAI;AAC9B,UAAQ,kBAAkB,KAAK,SAAS;;AAG1C,cAAa,KACX,iBAAiB,KAAK,UAAU,SAAS,MAAM,aAAa,CAAC,CAAC,IAC/D;AAiBD,QAfe,IAAI,SACjB,QACA,YACA,eAKA,sCAAsC,aAAa,KAAK,KAAK,CAAC,8BAC/D,CAMa,MAAM,YAAY,uBAAuB;;;;ACxCzD,SAAgB,6BAAsD;CACpE,MAAM,iCAAiB,IAAI,KAAa;CAExC,MAAM,uBAAuB,WAIR;AACnB,SAAO;GACL,WAAW,OAAO;GAClB,UAAU,OAAO;GACjB,QAAQ,OAAO;GAChB;;CAGH,MAAM,0BAA0B,WASR;EACtB,MAAM,gBAAgB,oBAAoB,OAAO;EACjD,MAAM,2BAA2B,IAAI,IACnC,OAAO,eAAe,UAAU,KAAI,aAAY,CAAC,SAAS,MAAM,SAAS,CAAC,CAC3E;EAED,MAAM,wBAAwB,iBAAiC;AAC7D,UAAO,KAAK,KAAK,OAAO,WAAW,aAAa;;EAGlD,MAAM,2BAA2B,WAG3B;GACJ,MAAM,YAAY,qBAAqB,OAAO,aAAa;GAC3D,MAAM,kBAAkB,GAAG,OAAO,YAAY;GAC9C,MAAM,mBAAmB,GAAG,OAAO,YAAY;GAC/C,MAAM,4BAA4B,GAAG,OAAO,YAAY;GACxD,MAAM,6BAA6B,GAAG,OAAO,YAAY;GACzD,MAAM,iBAAiB,GAAG,OAAO,YAAY;AAE7C,UAAO;IACL;IACA,aAAa,KAAK,KAAK,WAAW,gBAAgB;IAClD;IACA,cAAc,KAAK,KAAK,WAAW,iBAAiB;IACpD;IACA,uBAAuB,KAAK,KAAK,WAAW,0BAA0B;IACtE;IACA,wBAAwB,KAAK,KAC3B,WACA,2BACD;IACD;IACA,YAAY,KAAK,KAAK,WAAW,eAAe;IAChD;IACD;;EAGH,MAAM,wBAAwB,iBAA6C;GACzE,MAAM,WAAW,yBAAyB,IAAI,aAAa;AAE3D,OAAI,aAAa,KAAA,EACf,OAAM,IAAI,MAAM,+BAA+B,aAAa,IAAI;AAGlE,UAAO;;EAGT,MAAM,kCAAkC,iBAAiC;AACvE,UAAO,KAAK,KAAK,OAAO,oBAAoB,GAAG,aAAa,aAAa;;AAG3E,SAAO;GACL,GAAG;GACH,gBAAgB,OAAO;GACvB,SAAS,OAAO;GAChB,oBAAoB,OAAO;GAC3B,eAAe,OAAO;GACtB;GACA;GACA,iCAAgC,WAAU;AACxC,WAAO,SACL,OAAO,aACP,+BAA+B,OAAO,aAAa,CAAC,QAClD,SACA,GACD,CACF;;GAEH,oBAAmB,WAAU;AAC3B,WAAO,SACL,OAAO,aACP,KAAK,KAAK,OAAO,eAAe,OAAO,CAAC,QAAQ,SAAS,GAAG,CAC7D;;GAEH,iCAAgC,WAAU;AACxC,WACE,gCAEG,KAAK,UAAU,OAAO,aAAa,CAAC,IACpC,KAAK,UAAU,OAAO,YAAY,CAAA;;GAIzC;GACA;GAEA,YAAY,cAAsB,YAAoB;IACpD,MAAM,WAAW,KAAK,KAAK,OAAO,WAAW,aAAa;IAC1D,MAAM,MAAM,KAAK,QAAQ,SAAS;AAElC,OAAG,UAAU,KAAK,EAAE,WAAW,MAAM,CAAC;AACtC,OAAG,cAAc,UAAU,QAAQ;AACnC,mBAAe,IAAI,aAAa;AAEhC,YAAQ,KAAK,cAAc,eAAe;;GAG5C,iBAAiB,cAAsB,SAAkB;IACvD,MAAM,mBAAmB,KAAK,WAAW,aAAa,GAClD,eACA,KAAK,KAAK,OAAO,aAAa,aAAa;AAG/C,WAAO,eADU,GAAG,aAAa,kBAAkB,OAAO,EAGvD,QAAQ,EAAE,CACZ;;GAGH,mBAAmB,iBAAyB;AAC1C,mBAAe,IAAI,aAAa;;GAGlC,yBAAyB;AACvB,WAAO,MAAM,KAAK,eAAe;;GAEpC;;AAGH,QAAO;EACL;EACA;EACA,yBAAyB,MAAM,KAAK,eAAe;EACnD,2BAA2B,eAAe,OAAO;EAClD;;;;ACjLH,SAAS,WAAW,OAAyB;AAC3C,QAAO,MACJ,MAAM,CACN,QAAQ,aAAa,IAAI,CACzB,QAAQ,qBAAqB,QAAQ,CACrC,QAAQ,yBAAyB,QAAQ,CACzC,MAAM,IAAI,CACV,OAAO,QAAQ,CACf,KAAI,SAAQ,KAAK,aAAa,CAAC;;AAGpC,SAAS,WAAW,MAAsB;AACxC,QAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;;AAGrD,SAAgB,aAAa,OAAuB;AAClD,QAAO,WAAW,MAAM,CAAC,IAAI,WAAW,CAAC,KAAK,GAAG;;AAGnD,SAAgB,YAAY,OAAuB;CACjD,MAAM,CAAC,YAAY,IAAI,GAAG,kBAAkB,WAAW,MAAM;AAE7D,QAAO,YAAY,eAAe,IAAI,WAAW,CAAC,KAAK,GAAG;;;;;;;;AChB5D,MAAM,kBAA0C;EAC7C,WAAW,MAAM;EACjB,WAAW,OAAO;EAClB,WAAW,MAAM;EACjB,WAAW,QAAQ;EACnB,WAAW,SAAS;EACpB,WAAW,UAAU;EACrB,WAAW,OAAO;CACpB;;;;;AAMD,MAAa,qBAAqB,WAChC,gBAAgB,WAAW;;;;;;;AAQ7B,MAAM,uBAAuB,GAAW,MAAsB;CAC5D,MAAM,WAAW,EAAE,WAAW,IAAI;AAGlC,KAAI,aAFa,EAAE,WAAW,IAAI,CAGhC,QAAO,WAAW,IAAI;AAGxB,QAAO,EAAE,cAAc,EAAE;;;;;;;;;;AAW3B,MAAa,iBACX,GACA,MACW;CACX,MAAM,YAAY,EAAE,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;CACnD,MAAM,YAAY,EAAE,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;AAEnD,KAAI,UAAU,WAAW,UAAU,OACjC,QAAO,UAAU,SAAS,UAAU;AAGtC,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EACzC,MAAM,MAAM,oBAAoB,UAAU,IAAK,UAAU,GAAI;AAC7D,MAAI,QAAQ,EACV,QAAO;;AAIX,QAAO,kBAAkB,EAAE,OAAO,GAAG,kBAAkB,EAAE,OAAO"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/errors/DerivedResponseCycleError.ts","../src/errors/DuplicateOperationIdError.ts","../src/errors/DuplicateRouteError.ts","../src/errors/EmptyOperationResponsesError.ts","../src/errors/EmptyResourceOperationsError.ts","../src/errors/EmptySpecResourcesError.ts","../src/errors/InvalidDerivedResponseError.ts","../src/errors/InvalidOperationIdError.ts","../src/errors/InvalidRequestSchemaError.ts","../src/errors/InvalidResourceNameError.ts","../src/errors/MissingDerivedResponseParentError.ts","../src/errors/PathParameterMismatchError.ts","../src/helpers/namingUtils.ts","../src/helpers/routePath.ts","../src/validation/derivedResponseValidation.ts","../src/normalizeSpec.ts","../src/plugins/types.ts","../src/plugins/BasePlugin.ts","../src/plugins/pluginRegistry.ts","../src/helpers/path.ts","../src/helpers/templateEngine.ts","../src/plugins/pluginContext.ts","../src/helpers/routeSort.ts"],"sourcesContent":["export class DerivedResponseCycleError extends Error {\n public constructor(responseName: string) {\n super(`Derived response '${responseName}' contains a cyclic lineage.`);\n this.name = \"DerivedResponseCycleError\";\n }\n}\n","export class DuplicateOperationIdError extends Error {\n public constructor(operationId: string) {\n super(\n `Operation ID '${operationId}' must be globally unique within a spec.`\n );\n this.name = \"DuplicateOperationIdError\";\n }\n}\n","export class DuplicateRouteError extends Error {\n public constructor(method: string, path: string, normalizedPath: string) {\n super(\n `Route '${method} ${path}' conflicts with an existing route using normalized path '${normalizedPath}'.`\n );\n this.name = \"DuplicateRouteError\";\n }\n}\n","export class EmptyOperationResponsesError extends Error {\n public constructor(operationId: string) {\n super(`Operation '${operationId}' must declare at least one response.`);\n this.name = \"EmptyOperationResponsesError\";\n }\n}\n","export class EmptyResourceOperationsError extends Error {\n public constructor(resourceName: string) {\n super(`Resource '${resourceName}' must contain at least one operation.`);\n this.name = \"EmptyResourceOperationsError\";\n }\n}\n","export class EmptySpecResourcesError extends Error {\n public constructor() {\n super(\"Spec definition must contain at least one resource.\");\n this.name = \"EmptySpecResourcesError\";\n }\n}\n","export class InvalidDerivedResponseError extends Error {\n public constructor(responseName: string) {\n super(\n `Derived response '${responseName}' contains invalid lineage metadata.`\n );\n this.name = \"InvalidDerivedResponseError\";\n }\n}\n","export class InvalidOperationIdError extends Error {\n public constructor(operationId: string) {\n super(\n `Operation ID '${operationId}' is invalid. Use camelCase (preferred) or PascalCase. snake_case and kebab-case are not supported.`\n );\n this.name = \"InvalidOperationIdError\";\n }\n}\n","import type { NormalizedRequest } from \"../NormalizedSpec.js\";\n\nexport class InvalidRequestSchemaError extends Error {\n public constructor(\n operationId: string,\n requestPart: keyof NormalizedRequest\n ) {\n super(\n `Operation '${operationId}' has an invalid request.${requestPart} schema definition.`\n );\n this.name = \"InvalidRequestSchemaError\";\n }\n}\n","export class InvalidResourceNameError extends Error {\n public constructor(resourceName: string) {\n super(\n `Resource name '${resourceName}' is invalid. Use camelCase singular nouns when possible; PascalCase is also supported. snake_case and kebab-case are not supported.`\n );\n this.name = \"InvalidResourceNameError\";\n }\n}\n","export class MissingDerivedResponseParentError extends Error {\n public constructor(responseName: string, parentName: string) {\n super(\n `Derived response '${responseName}' references missing canonical parent '${parentName}'.`\n );\n this.name = \"MissingDerivedResponseParentError\";\n }\n}\n","export class PathParameterMismatchError extends Error {\n public constructor(\n operationId: string,\n path: string,\n pathParams: readonly string[],\n requestParams: readonly string[]\n ) {\n super(\n `Operation '${operationId}' has mismatched path parameters for '${path}'. Path params: [${pathParams.join(\n \", \"\n )}], request.param keys: [${requestParams.join(\", \")}].`\n );\n this.name = \"PathParameterMismatchError\";\n }\n}\n","import { isCamelCase, isPascalCase } from \"polycase\";\n\nconst isSupportedIdentifierName = (value: string): boolean => {\n return isCamelCase(value) || isPascalCase(value);\n};\n\nexport const isSupportedOperationId = (value: string): boolean => {\n return isSupportedIdentifierName(value);\n};\n\nexport const isSupportedResourceName = (value: string): boolean => {\n return isSupportedIdentifierName(value);\n};\n","const PATH_PARAMETER_PATTERN = /:([A-Za-z0-9_]+)/g;\n\nexport const normalizeRoutePath = (path: string): string => {\n const segments = path.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) {\n return \"/\";\n }\n\n return `/${segments.map(segment => (segment.startsWith(\":\") ? \":\" : segment)).join(\"/\")}`;\n};\n\nexport const getPathParameterNames = (path: string): string[] => {\n return Array.from(\n path.matchAll(PATH_PARAMETER_PATTERN),\n match => match[1] as string\n );\n};\n","import {\n HttpStatusCodeNameMap,\n isNamedResponseDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport type {\n ResponseDefinition,\n SpecDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport {\n DerivedResponseCycleError,\n InvalidDerivedResponseError,\n MissingDerivedResponseParentError,\n} from \"../errors/index.js\";\nimport type { NormalizedResponse } from \"../NormalizedSpec.js\";\n\nexport const validateDerivedResponseMetadata = (\n response: ResponseDefinition\n): void => {\n const derived = response.derived;\n\n if (derived === undefined) {\n return;\n }\n\n if (derived.parentName === response.name) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n if (derived.lineage.length === 0) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (derived.lineage.at(-1) !== response.name) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (derived.lineage.length !== derived.depth) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (new Set(derived.lineage).size !== derived.lineage.length) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n if (derived.depth > 1 && derived.lineage.at(-2) !== derived.parentName) {\n throw new InvalidDerivedResponseError(response.name);\n }\n};\n\nexport const collectCanonicalResponseDefinitions = (\n definition: SpecDefinition\n): Map<string, ResponseDefinition> => {\n const canonicalResponses = new Map<string, ResponseDefinition>();\n\n for (const resource of Object.values(definition.resources)) {\n for (const operation of resource.operations) {\n for (const response of operation.responses) {\n if (!isNamedResponseDefinition(response)) {\n continue;\n }\n\n validateDerivedResponseMetadata(response);\n\n canonicalResponses.set(response.name, response);\n }\n }\n }\n\n return canonicalResponses;\n};\n\nexport const getDerivedResponseChain = (\n response: ResponseDefinition,\n canonicalResponses: ReadonlyMap<string, ResponseDefinition>\n): readonly string[] => {\n const chain: string[] = [response.name];\n const visitedResponseNames = new Set(chain);\n let parentName = response.derived?.parentName;\n\n while (parentName !== undefined) {\n if (visitedResponseNames.has(parentName)) {\n throw new DerivedResponseCycleError(response.name);\n }\n\n const parentResponse = canonicalResponses.get(parentName);\n\n if (parentResponse === undefined) {\n throw new MissingDerivedResponseParentError(response.name, parentName);\n }\n\n chain.unshift(parentResponse.name);\n visitedResponseNames.add(parentResponse.name);\n parentName = parentResponse.derived?.parentName;\n }\n\n return chain;\n};\n\nexport const validateDerivedResponseGraph = (\n canonicalResponses: ReadonlyMap<string, ResponseDefinition>\n): void => {\n for (const response of canonicalResponses.values()) {\n if (response.derived === undefined) {\n continue;\n }\n\n const chain = getDerivedResponseChain(response, canonicalResponses);\n const materializedLineage = chain.slice(1);\n\n if (response.derived.depth !== materializedLineage.length) {\n throw new InvalidDerivedResponseError(response.name);\n }\n\n if (\n materializedLineage.length !== response.derived.lineage.length ||\n materializedLineage.some(\n (lineageEntry, index) =>\n lineageEntry !== response.derived?.lineage[index]\n )\n ) {\n throw new InvalidDerivedResponseError(response.name);\n }\n }\n};\n\nexport const normalizeResponseDefinition = (\n response: ResponseDefinition\n): NormalizedResponse => {\n return {\n name: response.name,\n statusCode: response.statusCode,\n statusCodeName: HttpStatusCodeNameMap[response.statusCode],\n description: response.description,\n header: response.header,\n body: response.body,\n kind: response.derived === undefined ? \"response\" : \"derived-response\",\n derivedFrom: response.derived?.parentName,\n lineage: response.derived?.lineage,\n depth: response.derived?.depth,\n };\n};\n\nexport const collectCanonicalResponses = (\n definition: SpecDefinition\n): Map<string, NormalizedResponse> => {\n const canonicalResponseDefinitions =\n collectCanonicalResponseDefinitions(definition);\n\n validateDerivedResponseGraph(canonicalResponseDefinitions);\n\n return new Map(\n Array.from(\n canonicalResponseDefinitions.entries(),\n ([responseName, response]) => [\n responseName,\n normalizeResponseDefinition(response),\n ]\n )\n );\n};\n","import {\n isNamedResponseDefinition,\n validateUniqueResponseNames,\n} from \"@rexeus/typeweaver-core\";\nimport type {\n RequestDefinition,\n ResourceDefinition,\n ResponseDefinition,\n SpecDefinition,\n} from \"@rexeus/typeweaver-core\";\nimport { z } from \"zod\";\nimport {\n DuplicateOperationIdError,\n DuplicateRouteError,\n EmptyOperationResponsesError,\n EmptyResourceOperationsError,\n EmptySpecResourcesError,\n InvalidOperationIdError,\n InvalidRequestSchemaError,\n InvalidResourceNameError,\n PathParameterMismatchError,\n} from \"./errors/index.js\";\nimport {\n isSupportedOperationId,\n isSupportedResourceName,\n} from \"./helpers/namingUtils.js\";\nimport {\n getPathParameterNames,\n normalizeRoutePath,\n} from \"./helpers/routePath.js\";\nimport {\n collectCanonicalResponses,\n normalizeResponseDefinition,\n} from \"./validation/index.js\";\nimport type {\n NormalizedOperation,\n NormalizedRequest,\n NormalizedResponseUsage,\n NormalizedSpec,\n} from \"./NormalizedSpec.js\";\n\nconst isZodType = (schema: unknown): schema is z.ZodType => {\n return schema instanceof z.ZodType;\n};\n\nconst isZodObject = (\n schema: unknown\n): schema is z.ZodObject<z.core.$ZodShape> => {\n return schema instanceof z.ZodObject;\n};\n\nconst validateRequestSchema = (\n operationId: string,\n requestPart: keyof NormalizedRequest,\n schema: unknown\n): void => {\n if (!isZodType(schema)) {\n throw new InvalidRequestSchemaError(operationId, requestPart);\n }\n\n if (requestPart === \"param\" && !isZodObject(schema)) {\n throw new InvalidRequestSchemaError(operationId, requestPart);\n }\n};\n\nconst validateRequest = (\n operationId: string,\n path: string,\n request: RequestDefinition\n): NormalizedRequest | undefined => {\n if (request.header !== undefined) {\n validateRequestSchema(operationId, \"header\", request.header);\n }\n\n if (request.param !== undefined) {\n validateRequestSchema(operationId, \"param\", request.param);\n }\n\n if (request.query !== undefined) {\n validateRequestSchema(operationId, \"query\", request.query);\n }\n\n if (request.body !== undefined) {\n validateRequestSchema(operationId, \"body\", request.body);\n }\n\n const pathParams = getPathParameterNames(path);\n const requestParams =\n request.param === undefined ? [] : Object.keys(request.param.shape);\n\n if (\n pathParams.length !== requestParams.length ||\n pathParams.some(pathParam => !requestParams.includes(pathParam))\n ) {\n throw new PathParameterMismatchError(\n operationId,\n path,\n pathParams,\n requestParams\n );\n }\n\n if (\n request.header === undefined &&\n request.param === undefined &&\n request.query === undefined &&\n request.body === undefined\n ) {\n return undefined;\n }\n\n return {\n header: request.header,\n param: request.param,\n query: request.query,\n body: request.body,\n };\n};\n\nconst normalizeOperationResponses = (\n responses: readonly ResponseDefinition[]\n): NormalizedResponseUsage[] => {\n return responses.map(response => {\n if (isNamedResponseDefinition(response)) {\n return {\n responseName: response.name,\n source: \"canonical\",\n };\n }\n\n return {\n responseName: response.name,\n source: \"inline\",\n response: normalizeResponseDefinition(response),\n };\n });\n};\n\nconst normalizeOperation = (\n operationIds: Set<string>,\n routeKeys: Set<string>,\n operation: ResourceDefinition[\"operations\"][number]\n): NormalizedOperation => {\n if (!isSupportedOperationId(operation.operationId)) {\n throw new InvalidOperationIdError(operation.operationId);\n }\n\n if (operationIds.has(operation.operationId)) {\n throw new DuplicateOperationIdError(operation.operationId);\n }\n\n operationIds.add(operation.operationId);\n\n const normalizedPath = normalizeRoutePath(operation.path);\n const routeKey = `${operation.method}:${normalizedPath}`;\n\n if (routeKeys.has(routeKey)) {\n throw new DuplicateRouteError(\n operation.method,\n operation.path,\n normalizedPath\n );\n }\n\n routeKeys.add(routeKey);\n\n if (operation.responses.length === 0) {\n throw new EmptyOperationResponsesError(operation.operationId);\n }\n\n return {\n operationId: operation.operationId,\n method: operation.method,\n path: operation.path,\n summary: operation.summary,\n request: validateRequest(\n operation.operationId,\n operation.path,\n operation.request\n ),\n responses: normalizeOperationResponses(operation.responses),\n };\n};\n\nexport const normalizeSpec = (definition: SpecDefinition): NormalizedSpec => {\n const resourceEntries = Object.entries(definition.resources);\n\n if (resourceEntries.length === 0) {\n throw new EmptySpecResourcesError();\n }\n\n validateUniqueResponseNames(definition.resources);\n const canonicalResponses = collectCanonicalResponses(definition);\n const operationIds = new Set<string>();\n const routeKeys = new Set<string>();\n\n return {\n resources: resourceEntries.map(([resourceName, resource]) => {\n if (!isSupportedResourceName(resourceName)) {\n throw new InvalidResourceNameError(resourceName);\n }\n\n if (resource.operations.length === 0) {\n throw new EmptyResourceOperationsError(resourceName);\n }\n\n return {\n name: resourceName,\n operations: resource.operations.map(operation =>\n normalizeOperation(operationIds, routeKeys, operation)\n ),\n };\n }),\n responses: Array.from(canonicalResponses.values()),\n };\n};\n","import type { NormalizedResponse, NormalizedSpec } from \"../NormalizedSpec.js\";\n\n/**\n * Configuration for a typeweaver plugin\n */\nexport type PluginConfig = Record<string, unknown>;\n\n/**\n * Context provided to plugins during initialization and finalization\n */\nexport type PluginContext = {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n};\n\nexport type OperationOutputPaths = {\n readonly outputDir: string;\n readonly requestFile: string;\n readonly requestFileName: string;\n readonly responseFile: string;\n readonly responseFileName: string;\n readonly requestValidationFile: string;\n readonly requestValidationFileName: string;\n readonly responseValidationFile: string;\n readonly responseValidationFileName: string;\n readonly clientFile: string;\n readonly clientFileName: string;\n};\n\n/**\n * Context provided to plugins during generation\n */\nexport type GeneratorContext = PluginContext & {\n readonly normalizedSpec: NormalizedSpec;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n\n readonly getCanonicalResponse: (responseName: string) => NormalizedResponse;\n readonly getCanonicalResponseOutputFile: (responseName: string) => string;\n readonly getCanonicalResponseImportPath: (params: {\n readonly importerDir: string;\n readonly responseName: string;\n }) => string;\n readonly getSpecImportPath: (params: {\n readonly importerDir: string;\n }) => string;\n readonly getOperationDefinitionAccessor: (params: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => string;\n readonly getOperationOutputPaths: (params: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => OperationOutputPaths;\n readonly getResourceOutputDir: (resourceName: string) => string;\n readonly writeFile: (relativePath: string, content: string) => void;\n readonly renderTemplate: (templatePath: string, data: unknown) => string;\n readonly addGeneratedFile: (relativePath: string) => void;\n readonly getGeneratedFiles: () => string[];\n};\n\n/**\n * Plugin metadata\n */\nexport type PluginMetadata = {\n readonly name: string;\n readonly depends?: readonly string[];\n};\n\n/**\n * typeweaver plugin interface\n */\nexport type TypeweaverPlugin = PluginMetadata & {\n /**\n * Initialize the plugin\n * Called before any generation happens\n */\n initialize?(context: PluginContext): Promise<void> | void;\n\n /**\n * Collect and transform resources\n * Allows plugins to modify the resource collection\n */\n collectResources?(\n normalizedSpec: NormalizedSpec\n ): Promise<NormalizedSpec> | NormalizedSpec;\n\n /**\n * Main generation logic\n * Called with all resources and utilities\n */\n generate?(context: GeneratorContext): Promise<void> | void;\n\n /**\n * Finalize the plugin\n * Called after all generation is complete\n */\n finalize?(context: PluginContext): Promise<void> | void;\n};\n\n/**\n * Plugin constructor type\n */\nexport type PluginConstructor = new (config?: PluginConfig) => TypeweaverPlugin;\n\n/**\n * Plugin module export\n */\nexport type PluginModule = {\n default: PluginConstructor;\n};\n\n/**\n * Plugin registration entry\n */\nexport type PluginRegistration = {\n name: string;\n plugin: TypeweaverPlugin;\n config?: PluginConfig;\n};\n\n/**\n * typeweaver configuration\n */\nexport type TypeweaverConfig = {\n input: string;\n output: string;\n plugins?: (string | [string, PluginConfig])[];\n format?: boolean;\n clean?: boolean;\n};\n\n/**\n * Plugin loading error\n */\nexport class PluginLoadError extends Error {\n constructor(\n public pluginName: string,\n message: string\n ) {\n super(`Failed to load plugin '${pluginName}': ${message}`);\n this.name = \"PluginLoadError\";\n }\n}\n\n/**\n * Plugin dependency error\n */\nexport class PluginDependencyError extends Error {\n constructor(\n public pluginName: string,\n public missingDependency: string,\n message?: string\n ) {\n super(\n message ??\n `Plugin '${pluginName}' depends on '${missingDependency}' which is not loaded`\n );\n this.name = \"PluginDependencyError\";\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { NormalizedSpec } from \"../NormalizedSpec.js\";\nimport type {\n GeneratorContext,\n PluginConfig,\n PluginContext,\n TypeweaverPlugin,\n} from \"./types.js\";\n\n/**\n * Base class for typeweaver plugins\n * Provides default implementations and common utilities\n */\nexport abstract class BasePlugin implements TypeweaverPlugin {\n abstract name: string;\n description?: string;\n author?: string;\n depends?: string[];\n\n protected config: PluginConfig;\n\n constructor(config: PluginConfig = {}) {\n this.config = config;\n }\n\n /**\n * Default implementation - override in subclasses if needed\n */\n async initialize(_context: PluginContext): Promise<void> {\n // Default: no initialization needed\n }\n\n /**\n * Default implementation - override in subclasses if needed\n */\n collectResources(normalizedSpec: NormalizedSpec): NormalizedSpec {\n return normalizedSpec;\n }\n\n /**\n * Main generation logic - must be implemented by subclasses\n */\n abstract generate(context: GeneratorContext): Promise<void> | void;\n\n /**\n * Default implementation - override in subclasses if needed\n */\n async finalize(_context: PluginContext): Promise<void> {\n // Default: no finalization needed\n }\n\n protected copyLibFiles(\n context: GeneratorContext,\n libSourceDir: string,\n libNamespace: string\n ): void {\n if (!fs.existsSync(libSourceDir)) return;\n\n const libDir = path.join(context.outputDir, \"lib\", libNamespace);\n\n fs.cpSync(libSourceDir, libDir, { recursive: true });\n\n const libIndexPath = path.join(\"lib\", libNamespace, \"index.ts\");\n if (fs.existsSync(path.join(libDir, \"index.ts\"))) {\n context.addGeneratedFile(libIndexPath);\n }\n }\n}\n","import { PluginDependencyError } from \"./types.js\";\nimport type { PluginRegistration, TypeweaverPlugin } from \"./types.js\";\n\nexport type PluginRegistryApi = {\n readonly register: (plugin: TypeweaverPlugin, config?: unknown) => void;\n readonly get: (name: string) => PluginRegistration | undefined;\n readonly getAll: () => PluginRegistration[];\n readonly has: (name: string) => boolean;\n readonly clear: () => void;\n};\n\nexport function createPluginRegistry(): PluginRegistryApi {\n const plugins = new Map<string, PluginRegistration>();\n let sortedRegistrations: PluginRegistration[] | undefined;\n\n const invalidateSortedRegistrations = (): void => {\n sortedRegistrations = undefined;\n };\n\n return {\n register: (plugin: TypeweaverPlugin, config?: unknown): void => {\n if (plugins.has(plugin.name)) {\n console.info(\n `Skipping duplicate registration of required plugin: ${plugin.name}`\n );\n return;\n }\n\n const registration: PluginRegistration = {\n name: plugin.name,\n plugin,\n config: config as Record<string, unknown>,\n };\n\n plugins.set(plugin.name, registration);\n invalidateSortedRegistrations();\n console.info(`Registered plugin: ${plugin.name}`);\n },\n get: (name: string) => plugins.get(name),\n getAll: () => {\n if (sortedRegistrations === undefined) {\n sortedRegistrations = sortPluginRegistrations(\n Array.from(plugins.values())\n );\n }\n\n return [...sortedRegistrations];\n },\n has: (name: string) => plugins.has(name),\n clear: () => {\n plugins.clear();\n invalidateSortedRegistrations();\n },\n };\n}\n\nfunction sortPluginRegistrations(\n registrations: readonly PluginRegistration[]\n): PluginRegistration[] {\n const registrationsByName = new Map(\n registrations.map(registration => [registration.name, registration])\n );\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const sorted: PluginRegistration[] = [];\n\n for (const registration of registrations) {\n visitPlugin({\n registration,\n registrationsByName,\n visiting,\n visited,\n sorted,\n dependencyPath: [],\n });\n }\n\n return sorted;\n}\n\nfunction visitPlugin(params: {\n readonly registration: PluginRegistration;\n readonly registrationsByName: ReadonlyMap<string, PluginRegistration>;\n readonly visiting: Set<string>;\n readonly visited: Set<string>;\n readonly sorted: PluginRegistration[];\n readonly dependencyPath: readonly string[];\n}): void {\n const {\n registration,\n registrationsByName,\n visiting,\n visited,\n sorted,\n dependencyPath,\n } = params;\n\n if (visited.has(registration.name)) {\n return;\n }\n\n if (visiting.has(registration.name)) {\n const cyclePath = [...dependencyPath, registration.name].join(\" -> \");\n throw new PluginDependencyError(\n registration.name,\n registration.name,\n `Detected plugin dependency cycle: ${cyclePath}`\n );\n }\n\n visiting.add(registration.name);\n\n for (const dependencyName of registration.plugin.depends ?? []) {\n const dependency = registrationsByName.get(dependencyName);\n if (dependency === undefined) {\n throw new PluginDependencyError(registration.name, dependencyName);\n }\n\n visitPlugin({\n registration: dependency,\n registrationsByName,\n visiting,\n visited,\n sorted,\n dependencyPath: [...dependencyPath, registration.name],\n });\n }\n\n visiting.delete(registration.name);\n visited.add(registration.name);\n sorted.push(registration);\n}\n","import path from \"node:path\";\n\nexport function relative(from: string, to: string): string {\n const relativePath = path.relative(from, to);\n\n const posixPath = relativePath.split(path.sep).join(\"/\");\n\n if (!posixPath.startsWith(\"./\") && !posixPath.startsWith(\"../\")) {\n return `./${posixPath}`;\n }\n\n return posixPath;\n}\n","function escapeHtml(input: string): string {\n return input\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction stringifyTemplateValue(value: unknown): string {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n return String(value);\n}\n\nexport function renderTemplate(\n template: string,\n data: Record<string, unknown>\n): string {\n const outputChunks: string[] = [];\n const expressionPattern = /<%[=-]?[\\s\\S]*?%>/g;\n let currentIndex = 0;\n let match: RegExpExecArray | null = expressionPattern.exec(template);\n\n while (match !== null) {\n const [tag] = match;\n const tagStart = match.index;\n\n outputChunks.push(\n `__output.push(${JSON.stringify(template.slice(currentIndex, tagStart))});`\n );\n\n if (tag.startsWith(\"<%=\")) {\n const expression = tag.slice(3, -2).trim();\n outputChunks.push(`__output.push(__escape(__stringify(${expression})));`);\n } else if (tag.startsWith(\"<%-\")) {\n const expression = tag.slice(3, -2).trim();\n outputChunks.push(`__output.push(__stringify(${expression}));`);\n } else {\n outputChunks.push(tag.slice(2, -2));\n }\n\n currentIndex = tagStart + tag.length;\n match = expressionPattern.exec(template);\n }\n\n outputChunks.push(\n `__output.push(${JSON.stringify(template.slice(currentIndex))});`\n );\n\n const render = new Function(\n \"data\",\n \"__escape\",\n \"__stringify\",\n // This intentionally relies on `new Function()` sloppy mode so `with (data)`\n // can expose template variables as bare identifiers during rendering.\n // The tests pin the expected collision behavior: own properties on `data`\n // (including names like `name` or `toString`) must win over outer built-ins.\n `const __output = []; with (data) { ${outputChunks.join(\"\\n\")} } return __output.join(\"\");`\n ) as (\n data: Record<string, unknown>,\n escape: typeof escapeHtml,\n stringify: typeof stringifyTemplateValue\n ) => string;\n\n return render(data, escapeHtml, stringifyTemplateValue);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pascalCase } from \"polycase\";\nimport { relative } from \"../helpers/path.js\";\nimport { renderTemplate } from \"../helpers/templateEngine.js\";\nimport type { NormalizedResponse, NormalizedSpec } from \"../NormalizedSpec.js\";\nimport type { GeneratorContext, PluginConfig, PluginContext } from \"./types.js\";\n\nexport type PluginContextBuilderApi = {\n readonly createPluginContext: (params: {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n }) => PluginContext;\n readonly createGeneratorContext: (params: {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n readonly normalizedSpec: NormalizedSpec;\n readonly templateDir: string;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n }) => GeneratorContext;\n readonly getGeneratedFiles: () => string[];\n readonly clearGeneratedFiles: () => void;\n};\n\nexport function createPluginContextBuilder(): PluginContextBuilderApi {\n const generatedFiles = new Set<string>();\n\n const createPluginContext = (params: {\n outputDir: string;\n inputDir: string;\n config: PluginConfig;\n }): PluginContext => {\n return {\n outputDir: params.outputDir,\n inputDir: params.inputDir,\n config: params.config,\n };\n };\n\n const createGeneratorContext = (params: {\n readonly outputDir: string;\n readonly inputDir: string;\n readonly config: PluginConfig;\n readonly normalizedSpec: NormalizedSpec;\n readonly templateDir: string;\n readonly coreDir: string;\n readonly responsesOutputDir: string;\n readonly specOutputDir: string;\n }): GeneratorContext => {\n const pluginContext = createPluginContext(params);\n const canonicalResponsesByName = new Map<string, NormalizedResponse>(\n params.normalizedSpec.responses.map(response => [response.name, response])\n );\n\n const getResourceOutputDir = (resourceName: string): string => {\n return path.join(params.outputDir, resourceName);\n };\n\n const getOperationOutputPaths = (config: {\n readonly resourceName: string;\n readonly operationId: string;\n }) => {\n const outputDir = getResourceOutputDir(config.resourceName);\n const fileBase = pascalCase(config.operationId);\n const requestFileName = `${fileBase}Request.ts`;\n const responseFileName = `${fileBase}Response.ts`;\n const requestValidationFileName = `${fileBase}RequestValidator.ts`;\n const responseValidationFileName = `${fileBase}ResponseValidator.ts`;\n const clientFileName = `${fileBase}Client.ts`;\n\n return {\n outputDir,\n requestFile: path.join(outputDir, requestFileName),\n requestFileName,\n responseFile: path.join(outputDir, responseFileName),\n responseFileName,\n requestValidationFile: path.join(outputDir, requestValidationFileName),\n requestValidationFileName,\n responseValidationFile: path.join(\n outputDir,\n responseValidationFileName\n ),\n responseValidationFileName,\n clientFile: path.join(outputDir, clientFileName),\n clientFileName,\n };\n };\n\n const getCanonicalResponse = (responseName: string): NormalizedResponse => {\n const response = canonicalResponsesByName.get(responseName);\n\n if (response === undefined) {\n throw new Error(`Missing canonical response '${responseName}'.`);\n }\n\n return response;\n };\n\n const getCanonicalResponseOutputFile = (responseName: string): string => {\n return path.join(\n params.responsesOutputDir,\n `${pascalCase(responseName)}Response.ts`\n );\n };\n\n return {\n ...pluginContext,\n normalizedSpec: params.normalizedSpec,\n coreDir: params.coreDir,\n responsesOutputDir: params.responsesOutputDir,\n specOutputDir: params.specOutputDir,\n getCanonicalResponse,\n getCanonicalResponseOutputFile,\n getCanonicalResponseImportPath: config => {\n return relative(\n config.importerDir,\n getCanonicalResponseOutputFile(config.responseName).replace(\n /\\.ts$/,\n \".js\"\n )\n );\n },\n getSpecImportPath: config => {\n return relative(\n config.importerDir,\n path.join(params.specOutputDir, \"spec.js\")\n );\n },\n getOperationDefinitionAccessor: config => {\n return (\n `getOperationDefinition(` +\n `spec, ` +\n `${JSON.stringify(config.resourceName)}, ` +\n `${JSON.stringify(config.operationId)}` +\n `)`\n );\n },\n getOperationOutputPaths,\n getResourceOutputDir,\n\n writeFile: (relativePath: string, content: string) => {\n const fullPath = path.join(params.outputDir, relativePath);\n const dir = path.dirname(fullPath);\n\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(fullPath, content);\n generatedFiles.add(relativePath);\n\n console.info(`Generated: ${relativePath}`);\n },\n\n renderTemplate: (templatePath: string, data: unknown) => {\n const fullTemplatePath = path.isAbsolute(templatePath)\n ? templatePath\n : path.join(params.templateDir, templatePath);\n\n const template = fs.readFileSync(fullTemplatePath, \"utf8\");\n return renderTemplate(\n template,\n (data ?? {}) as Record<string, unknown>\n );\n },\n\n addGeneratedFile: (relativePath: string) => {\n generatedFiles.add(relativePath);\n },\n\n getGeneratedFiles: () => {\n return Array.from(generatedFiles);\n },\n };\n };\n\n return {\n createPluginContext,\n createGeneratorContext,\n getGeneratedFiles: () => Array.from(generatedFiles),\n clearGeneratedFiles: () => generatedFiles.clear(),\n };\n}\n","import { HttpMethod } from \"@rexeus/typeweaver-core\";\n\n/**\n * HTTP method priority for route ordering.\n * Lower numbers = higher priority (sorted first).\n */\nconst METHOD_PRIORITY: Record<string, number> = {\n [HttpMethod.GET]: 1,\n [HttpMethod.POST]: 2,\n [HttpMethod.PUT]: 3,\n [HttpMethod.PATCH]: 4,\n [HttpMethod.DELETE]: 5,\n [HttpMethod.OPTIONS]: 6,\n [HttpMethod.HEAD]: 7,\n};\n\n/**\n * Returns the sort priority for an HTTP method.\n * Unrecognized methods default to priority 999.\n */\nexport const getMethodPriority = (method: string): number =>\n METHOD_PRIORITY[method] ?? 999;\n\n/**\n * Compares two path segments for route ordering.\n * Returns negative if a should come before b, positive if after.\n *\n * Order: static segments before parameters, then alphabetically.\n */\nconst comparePathSegments = (a: string, b: string): number => {\n const aIsParam = a.startsWith(\":\");\n const bIsParam = b.startsWith(\":\");\n\n if (aIsParam !== bIsParam) {\n return aIsParam ? 1 : -1;\n }\n\n return a.localeCompare(b);\n};\n\n/**\n * Compares two routes for ordering.\n * Routes are sorted by:\n * 1. Path depth (shallow to deep)\n * 2. Static segments before parameters\n * 3. Alphabetical within same segment type\n * 4. HTTP method priority\n */\nexport const compareRoutes = (\n a: { method: string; path: string },\n b: { method: string; path: string }\n): number => {\n const aSegments = a.path.split(\"/\").filter(Boolean);\n const bSegments = b.path.split(\"/\").filter(Boolean);\n\n if (aSegments.length !== bSegments.length) {\n return aSegments.length - bSegments.length;\n }\n\n for (let i = 0; i < aSegments.length; i++) {\n const cmp = comparePathSegments(aSegments[i]!, bSegments[i]!);\n if (cmp !== 0) {\n return cmp;\n }\n }\n\n return getMethodPriority(a.method) - getMethodPriority(b.method);\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rexeus/typeweaver-gen",
3
- "version": "0.10.1",
3
+ "version": "0.10.3",
4
4
  "description": "Template-driven engine that turns structured API definitions into production-ready artifacts. Powered by Typeweaver 🧵✨",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -48,11 +48,14 @@
48
48
  "homepage": "https://github.com/rexeus/typeweaver#readme",
49
49
  "peerDependencies": {
50
50
  "zod": "^4.3.0",
51
- "@rexeus/typeweaver-core": "^0.10.1"
51
+ "@rexeus/typeweaver-core": "^0.10.3"
52
52
  },
53
53
  "devDependencies": {
54
54
  "zod": "^4.3.6",
55
- "@rexeus/typeweaver-core": "^0.10.1"
55
+ "@rexeus/typeweaver-core": "^0.10.3"
56
+ },
57
+ "dependencies": {
58
+ "polycase": "^1.1.0"
56
59
  },
57
60
  "scripts": {
58
61
  "typecheck": "tsc --noEmit",