@rexeus/typeweaver-gen 0.10.3 → 0.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -125,7 +125,9 @@ var PathParameterMismatchError = class extends Error {
125
125
  };
126
126
  //#endregion
127
127
  //#region src/helpers/namingUtils.ts
128
+ const startsWithDigit = (value) => /^[0-9]/u.test(value);
128
129
  const isSupportedIdentifierName = (value) => {
130
+ if (startsWithDigit(value)) return false;
129
131
  return (0, polycase.isCamelCase)(value) || (0, polycase.isPascalCase)(value);
130
132
  };
131
133
  const isSupportedOperationId = (value) => {
@@ -181,11 +183,19 @@ const getDerivedResponseChain = (response, canonicalResponses) => {
181
183
  return chain;
182
184
  };
183
185
  const validateDerivedResponseGraph = (canonicalResponses) => {
184
- for (const response of canonicalResponses.values()) {
185
- if (response.derived === void 0) continue;
186
- const materializedLineage = getDerivedResponseChain(response, canonicalResponses).slice(1);
187
- if (response.derived.depth !== materializedLineage.length) throw new InvalidDerivedResponseError(response.name);
188
- if (materializedLineage.length !== response.derived.lineage.length || materializedLineage.some((lineageEntry, index) => lineageEntry !== response.derived?.lineage[index])) throw new InvalidDerivedResponseError(response.name);
186
+ for (const response of canonicalResponses.values()) validateDerivedResponseAgainstCanonicalGraph(response, canonicalResponses);
187
+ };
188
+ const validateDerivedResponseAgainstCanonicalGraph = (response, canonicalResponses) => {
189
+ if (response.derived === void 0) return;
190
+ const materializedLineage = getDerivedResponseChain(response, canonicalResponses).slice(1);
191
+ if (response.derived.depth !== materializedLineage.length) throw new InvalidDerivedResponseError(response.name);
192
+ if (materializedLineage.length !== response.derived.lineage.length || materializedLineage.some((lineageEntry, index) => lineageEntry !== response.derived?.lineage[index])) throw new InvalidDerivedResponseError(response.name);
193
+ };
194
+ const validateInlineDerivedResponses = (definition, canonicalResponses) => {
195
+ for (const resource of Object.values(definition.resources)) for (const operation of resource.operations) for (const response of operation.responses) {
196
+ if ((0, _rexeus_typeweaver_core.isNamedResponseDefinition)(response)) continue;
197
+ validateDerivedResponseMetadata(response);
198
+ validateDerivedResponseAgainstCanonicalGraph(response, canonicalResponses);
189
199
  }
190
200
  };
191
201
  const normalizeResponseDefinition = (response) => {
@@ -205,6 +215,7 @@ const normalizeResponseDefinition = (response) => {
205
215
  const collectCanonicalResponses = (definition) => {
206
216
  const canonicalResponseDefinitions = collectCanonicalResponseDefinitions(definition);
207
217
  validateDerivedResponseGraph(canonicalResponseDefinitions);
218
+ validateInlineDerivedResponses(definition, canonicalResponseDefinitions);
208
219
  return new Map(Array.from(canonicalResponseDefinitions.entries(), ([responseName, response]) => [responseName, normalizeResponseDefinition(response)]));
209
220
  };
210
221
  //#endregion
@@ -422,8 +433,8 @@ function visitPlugin(params) {
422
433
  //#region src/helpers/path.ts
423
434
  function relative(from, to) {
424
435
  const posixPath = node_path.default.relative(from, to).split(node_path.default.sep).join("/");
425
- if (!posixPath.startsWith("./") && !posixPath.startsWith("../")) return `./${posixPath}`;
426
- return posixPath;
436
+ if (posixPath === ".." || posixPath.startsWith("./") || posixPath.startsWith("../")) return posixPath;
437
+ return `./${posixPath}`;
427
438
  }
428
439
  //#endregion
429
440
  //#region src/helpers/templateEngine.ts
@@ -457,6 +468,15 @@ function renderTemplate(template, data) {
457
468
  return new Function("data", "__escape", "__stringify", `const __output = []; with (data) { ${outputChunks.join("\n")} } return __output.join("");`)(data, escapeHtml, stringifyTemplateValue);
458
469
  }
459
470
  //#endregion
471
+ //#region src/plugins/errors/MissingCanonicalResponseError.ts
472
+ var MissingCanonicalResponseError = class extends Error {
473
+ name = "MissingCanonicalResponseError";
474
+ constructor(responseName) {
475
+ super(`Missing canonical response '${responseName}' in the normalized spec.`);
476
+ this.responseName = responseName;
477
+ }
478
+ };
479
+ //#endregion
460
480
  //#region src/plugins/pluginContext.ts
461
481
  function createPluginContextBuilder() {
462
482
  const generatedFiles = /* @__PURE__ */ new Set();
@@ -497,7 +517,7 @@ function createPluginContextBuilder() {
497
517
  };
498
518
  const getCanonicalResponse = (responseName) => {
499
519
  const response = canonicalResponsesByName.get(responseName);
500
- if (response === void 0) throw new Error(`Missing canonical response '${responseName}'.`);
520
+ if (response === void 0) throw new MissingCanonicalResponseError(responseName);
501
521
  return response;
502
522
  };
503
523
  const getCanonicalResponseOutputFile = (responseName) => {
@@ -550,6 +570,21 @@ function createPluginContextBuilder() {
550
570
  };
551
571
  }
552
572
  //#endregion
573
+ //#region src/helpers/jsdoc.ts
574
+ const BLOCK_COMMENT_END_PATTERN = /\*\//g;
575
+ const LINE_BREAK_PATTERN = /\r\n?/g;
576
+ function createJSDocComment(text, options = {}) {
577
+ const trimmedText = (text?.replace(LINE_BREAK_PATTERN, "\n"))?.trim();
578
+ if (!trimmedText) return void 0;
579
+ const indentation = options.indentation ?? "";
580
+ const lines = trimmedText.replace(BLOCK_COMMENT_END_PATTERN, "*\\/").split("\n");
581
+ return [
582
+ `${indentation}/**`,
583
+ ...lines.map((line) => `${indentation} * ${line}`),
584
+ `${indentation} */`
585
+ ].join("\n");
586
+ }
587
+ //#endregion
553
588
  //#region src/helpers/routeSort.ts
554
589
  /**
555
590
  * HTTP method priority for route ordering.
@@ -615,6 +650,7 @@ exports.PathParameterMismatchError = PathParameterMismatchError;
615
650
  exports.PluginDependencyError = PluginDependencyError;
616
651
  exports.PluginLoadError = PluginLoadError;
617
652
  exports.compareRoutes = compareRoutes;
653
+ exports.createJSDocComment = createJSDocComment;
618
654
  exports.createPluginContextBuilder = createPluginContextBuilder;
619
655
  exports.createPluginRegistry = createPluginRegistry;
620
656
  exports.getMethodPriority = getMethodPriority;
package/dist/index.d.cts CHANGED
@@ -309,6 +309,12 @@ declare function createPluginContextBuilder(): PluginContextBuilderApi;
309
309
  declare const isSupportedOperationId: (value: string) => boolean;
310
310
  declare const isSupportedResourceName: (value: string) => boolean;
311
311
  //#endregion
312
+ //#region src/helpers/jsdoc.d.ts
313
+ type CreateJSDocCommentOptions = {
314
+ readonly indentation?: string;
315
+ };
316
+ declare function createJSDocComment(text: string | undefined, options?: CreateJSDocCommentOptions): string | undefined;
317
+ //#endregion
312
318
  //#region src/helpers/path.d.ts
313
319
  declare function relative(from: string, to: string): string;
314
320
  //#endregion
@@ -341,5 +347,5 @@ declare const compareRoutes: (a: {
341
347
  //#region src/helpers/templateEngine.d.ts
342
348
  declare function renderTemplate(template: string, data: Record<string, unknown>): string;
343
349
  //#endregion
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 };
350
+ export { BasePlugin, CreateJSDocCommentOptions, 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, createJSDocComment, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate };
345
351
  //# 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/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/jsdoc.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.d.mts CHANGED
@@ -309,6 +309,12 @@ declare function createPluginContextBuilder(): PluginContextBuilderApi;
309
309
  declare const isSupportedOperationId: (value: string) => boolean;
310
310
  declare const isSupportedResourceName: (value: string) => boolean;
311
311
  //#endregion
312
+ //#region src/helpers/jsdoc.d.ts
313
+ type CreateJSDocCommentOptions = {
314
+ readonly indentation?: string;
315
+ };
316
+ declare function createJSDocComment(text: string | undefined, options?: CreateJSDocCommentOptions): string | undefined;
317
+ //#endregion
312
318
  //#region src/helpers/path.d.ts
313
319
  declare function relative(from: string, to: string): string;
314
320
  //#endregion
@@ -341,5 +347,5 @@ declare const compareRoutes: (a: {
341
347
  //#region src/helpers/templateEngine.d.ts
342
348
  declare function renderTemplate(template: string, data: Record<string, unknown>): string;
343
349
  //#endregion
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 };
350
+ export { BasePlugin, CreateJSDocCommentOptions, 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, createJSDocComment, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate };
345
351
  //# 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/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/jsdoc.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
@@ -100,7 +100,9 @@ var PathParameterMismatchError = class extends Error {
100
100
  };
101
101
  //#endregion
102
102
  //#region src/helpers/namingUtils.ts
103
+ const startsWithDigit = (value) => /^[0-9]/u.test(value);
103
104
  const isSupportedIdentifierName = (value) => {
105
+ if (startsWithDigit(value)) return false;
104
106
  return isCamelCase(value) || isPascalCase(value);
105
107
  };
106
108
  const isSupportedOperationId = (value) => {
@@ -156,11 +158,19 @@ const getDerivedResponseChain = (response, canonicalResponses) => {
156
158
  return chain;
157
159
  };
158
160
  const validateDerivedResponseGraph = (canonicalResponses) => {
159
- for (const response of canonicalResponses.values()) {
160
- if (response.derived === void 0) continue;
161
- const materializedLineage = getDerivedResponseChain(response, canonicalResponses).slice(1);
162
- if (response.derived.depth !== materializedLineage.length) throw new InvalidDerivedResponseError(response.name);
163
- if (materializedLineage.length !== response.derived.lineage.length || materializedLineage.some((lineageEntry, index) => lineageEntry !== response.derived?.lineage[index])) throw new InvalidDerivedResponseError(response.name);
161
+ for (const response of canonicalResponses.values()) validateDerivedResponseAgainstCanonicalGraph(response, canonicalResponses);
162
+ };
163
+ const validateDerivedResponseAgainstCanonicalGraph = (response, canonicalResponses) => {
164
+ if (response.derived === void 0) return;
165
+ const materializedLineage = getDerivedResponseChain(response, canonicalResponses).slice(1);
166
+ if (response.derived.depth !== materializedLineage.length) throw new InvalidDerivedResponseError(response.name);
167
+ if (materializedLineage.length !== response.derived.lineage.length || materializedLineage.some((lineageEntry, index) => lineageEntry !== response.derived?.lineage[index])) throw new InvalidDerivedResponseError(response.name);
168
+ };
169
+ const validateInlineDerivedResponses = (definition, canonicalResponses) => {
170
+ for (const resource of Object.values(definition.resources)) for (const operation of resource.operations) for (const response of operation.responses) {
171
+ if (isNamedResponseDefinition(response)) continue;
172
+ validateDerivedResponseMetadata(response);
173
+ validateDerivedResponseAgainstCanonicalGraph(response, canonicalResponses);
164
174
  }
165
175
  };
166
176
  const normalizeResponseDefinition = (response) => {
@@ -180,6 +190,7 @@ const normalizeResponseDefinition = (response) => {
180
190
  const collectCanonicalResponses = (definition) => {
181
191
  const canonicalResponseDefinitions = collectCanonicalResponseDefinitions(definition);
182
192
  validateDerivedResponseGraph(canonicalResponseDefinitions);
193
+ validateInlineDerivedResponses(definition, canonicalResponseDefinitions);
183
194
  return new Map(Array.from(canonicalResponseDefinitions.entries(), ([responseName, response]) => [responseName, normalizeResponseDefinition(response)]));
184
195
  };
185
196
  //#endregion
@@ -397,8 +408,8 @@ function visitPlugin(params) {
397
408
  //#region src/helpers/path.ts
398
409
  function relative(from, to) {
399
410
  const posixPath = path.relative(from, to).split(path.sep).join("/");
400
- if (!posixPath.startsWith("./") && !posixPath.startsWith("../")) return `./${posixPath}`;
401
- return posixPath;
411
+ if (posixPath === ".." || posixPath.startsWith("./") || posixPath.startsWith("../")) return posixPath;
412
+ return `./${posixPath}`;
402
413
  }
403
414
  //#endregion
404
415
  //#region src/helpers/templateEngine.ts
@@ -432,6 +443,15 @@ function renderTemplate(template, data) {
432
443
  return new Function("data", "__escape", "__stringify", `const __output = []; with (data) { ${outputChunks.join("\n")} } return __output.join("");`)(data, escapeHtml, stringifyTemplateValue);
433
444
  }
434
445
  //#endregion
446
+ //#region src/plugins/errors/MissingCanonicalResponseError.ts
447
+ var MissingCanonicalResponseError = class extends Error {
448
+ name = "MissingCanonicalResponseError";
449
+ constructor(responseName) {
450
+ super(`Missing canonical response '${responseName}' in the normalized spec.`);
451
+ this.responseName = responseName;
452
+ }
453
+ };
454
+ //#endregion
435
455
  //#region src/plugins/pluginContext.ts
436
456
  function createPluginContextBuilder() {
437
457
  const generatedFiles = /* @__PURE__ */ new Set();
@@ -472,7 +492,7 @@ function createPluginContextBuilder() {
472
492
  };
473
493
  const getCanonicalResponse = (responseName) => {
474
494
  const response = canonicalResponsesByName.get(responseName);
475
- if (response === void 0) throw new Error(`Missing canonical response '${responseName}'.`);
495
+ if (response === void 0) throw new MissingCanonicalResponseError(responseName);
476
496
  return response;
477
497
  };
478
498
  const getCanonicalResponseOutputFile = (responseName) => {
@@ -525,6 +545,21 @@ function createPluginContextBuilder() {
525
545
  };
526
546
  }
527
547
  //#endregion
548
+ //#region src/helpers/jsdoc.ts
549
+ const BLOCK_COMMENT_END_PATTERN = /\*\//g;
550
+ const LINE_BREAK_PATTERN = /\r\n?/g;
551
+ function createJSDocComment(text, options = {}) {
552
+ const trimmedText = (text?.replace(LINE_BREAK_PATTERN, "\n"))?.trim();
553
+ if (!trimmedText) return void 0;
554
+ const indentation = options.indentation ?? "";
555
+ const lines = trimmedText.replace(BLOCK_COMMENT_END_PATTERN, "*\\/").split("\n");
556
+ return [
557
+ `${indentation}/**`,
558
+ ...lines.map((line) => `${indentation} * ${line}`),
559
+ `${indentation} */`
560
+ ].join("\n");
561
+ }
562
+ //#endregion
528
563
  //#region src/helpers/routeSort.ts
529
564
  /**
530
565
  * HTTP method priority for route ordering.
@@ -574,6 +609,6 @@ const compareRoutes = (a, b) => {
574
609
  return getMethodPriority(a.method) - getMethodPriority(b.method);
575
610
  };
576
611
  //#endregion
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 };
612
+ export { BasePlugin, DerivedResponseCycleError, DuplicateOperationIdError, DuplicateRouteError, EmptyOperationResponsesError, EmptyResourceOperationsError, EmptySpecResourcesError, InvalidDerivedResponseError, InvalidOperationIdError, InvalidRequestSchemaError, InvalidResourceNameError, MissingDerivedResponseParentError, PathParameterMismatchError, PluginDependencyError, PluginLoadError, compareRoutes, createJSDocComment, createPluginContextBuilder, createPluginRegistry, getMethodPriority, getPathParameterNames, isSupportedOperationId, isSupportedResourceName, normalizeRoutePath, normalizeSpec, relative, renderTemplate };
578
613
 
579
614
  //# 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/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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"}
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/errors/MissingCanonicalResponseError.ts","../src/plugins/pluginContext.ts","../src/helpers/jsdoc.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 startsWithDigit = (value: string): boolean => /^[0-9]/u.test(value);\n\nconst isSupportedIdentifierName = (value: string): boolean => {\n if (startsWithDigit(value)) {\n return false;\n }\n\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 validateDerivedResponseAgainstCanonicalGraph(response, canonicalResponses);\n }\n};\n\nconst validateDerivedResponseAgainstCanonicalGraph = (\n response: ResponseDefinition,\n canonicalResponses: ReadonlyMap<string, ResponseDefinition>\n): void => {\n if (response.derived === undefined) {\n return;\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) => lineageEntry !== response.derived?.lineage[index]\n )\n ) {\n throw new InvalidDerivedResponseError(response.name);\n }\n};\n\nconst validateInlineDerivedResponses = (\n definition: SpecDefinition,\n canonicalResponses: ReadonlyMap<string, ResponseDefinition>\n): void => {\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 validateDerivedResponseAgainstCanonicalGraph(\n response,\n canonicalResponses\n );\n }\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 validateInlineDerivedResponses(definition, 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 (\n posixPath === \"..\" ||\n posixPath.startsWith(\"./\") ||\n posixPath.startsWith(\"../\")\n ) {\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","export class MissingCanonicalResponseError extends Error {\n public override readonly name = \"MissingCanonicalResponseError\";\n\n public constructor(public readonly responseName: string) {\n super(\n `Missing canonical response '${responseName}' in the normalized spec.`\n );\n }\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 { MissingCanonicalResponseError } from \"./errors/MissingCanonicalResponseError.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 MissingCanonicalResponseError(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","export type CreateJSDocCommentOptions = {\n readonly indentation?: string;\n};\n\nconst BLOCK_COMMENT_END_PATTERN = /\\*\\//g;\nconst LINE_BREAK_PATTERN = /\\r\\n?/g;\n\nexport function createJSDocComment(\n text: string | undefined,\n options: CreateJSDocCommentOptions = {}\n): string | undefined {\n const normalizedText = text?.replace(LINE_BREAK_PATTERN, \"\\n\");\n const trimmedText = normalizedText?.trim();\n\n if (!trimmedText) return undefined;\n\n const indentation = options.indentation ?? \"\";\n const lines = trimmedText\n .replace(BLOCK_COMMENT_END_PATTERN, \"*\\\\/\")\n .split(\"\\n\");\n\n return [\n `${indentation}/**`,\n ...lines.map(line => `${indentation} * ${line}`),\n `${indentation} */`,\n ].join(\"\\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.3",
3
+ "version": "0.10.5",
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,11 @@
48
48
  "homepage": "https://github.com/rexeus/typeweaver#readme",
49
49
  "peerDependencies": {
50
50
  "zod": "^4.3.0",
51
- "@rexeus/typeweaver-core": "^0.10.3"
51
+ "@rexeus/typeweaver-core": "^0.10.5"
52
52
  },
53
53
  "devDependencies": {
54
54
  "zod": "^4.3.6",
55
- "@rexeus/typeweaver-core": "^0.10.3"
55
+ "@rexeus/typeweaver-core": "^0.10.5"
56
56
  },
57
57
  "dependencies": {
58
58
  "polycase": "^1.1.0"