micro-contracts 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +351 -0
  3. package/dist/cli/templates.d.ts +16 -0
  4. package/dist/cli/templates.d.ts.map +1 -0
  5. package/dist/cli/templates.js +377 -0
  6. package/dist/cli/templates.js.map +1 -0
  7. package/dist/cli.d.ts +9 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +978 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/generator/dependencyGenerator.d.ts +43 -0
  12. package/dist/generator/dependencyGenerator.d.ts.map +1 -0
  13. package/dist/generator/dependencyGenerator.js +159 -0
  14. package/dist/generator/dependencyGenerator.js.map +1 -0
  15. package/dist/generator/domainGenerator.d.ts +16 -0
  16. package/dist/generator/domainGenerator.d.ts.map +1 -0
  17. package/dist/generator/domainGenerator.js +212 -0
  18. package/dist/generator/domainGenerator.js.map +1 -0
  19. package/dist/generator/index.d.ts +37 -0
  20. package/dist/generator/index.d.ts.map +1 -0
  21. package/dist/generator/index.js +747 -0
  22. package/dist/generator/index.js.map +1 -0
  23. package/dist/generator/linter.d.ts +24 -0
  24. package/dist/generator/linter.d.ts.map +1 -0
  25. package/dist/generator/linter.js +202 -0
  26. package/dist/generator/linter.js.map +1 -0
  27. package/dist/generator/overlayProcessor.d.ts +90 -0
  28. package/dist/generator/overlayProcessor.d.ts.map +1 -0
  29. package/dist/generator/overlayProcessor.js +532 -0
  30. package/dist/generator/overlayProcessor.js.map +1 -0
  31. package/dist/generator/schemaGenerator.d.ts +10 -0
  32. package/dist/generator/schemaGenerator.d.ts.map +1 -0
  33. package/dist/generator/schemaGenerator.js +299 -0
  34. package/dist/generator/schemaGenerator.js.map +1 -0
  35. package/dist/generator/templateProcessor.d.ts +178 -0
  36. package/dist/generator/templateProcessor.d.ts.map +1 -0
  37. package/dist/generator/templateProcessor.js +607 -0
  38. package/dist/generator/templateProcessor.js.map +1 -0
  39. package/dist/generator/typeGenerator.d.ts +9 -0
  40. package/dist/generator/typeGenerator.d.ts.map +1 -0
  41. package/dist/generator/typeGenerator.js +395 -0
  42. package/dist/generator/typeGenerator.js.map +1 -0
  43. package/dist/guardrails/allowlist.d.ts +45 -0
  44. package/dist/guardrails/allowlist.d.ts.map +1 -0
  45. package/dist/guardrails/allowlist.js +261 -0
  46. package/dist/guardrails/allowlist.js.map +1 -0
  47. package/dist/guardrails/config.d.ts +40 -0
  48. package/dist/guardrails/config.d.ts.map +1 -0
  49. package/dist/guardrails/config.js +174 -0
  50. package/dist/guardrails/config.js.map +1 -0
  51. package/dist/guardrails/docs.d.ts +24 -0
  52. package/dist/guardrails/docs.d.ts.map +1 -0
  53. package/dist/guardrails/docs.js +138 -0
  54. package/dist/guardrails/docs.js.map +1 -0
  55. package/dist/guardrails/drift.d.ts +23 -0
  56. package/dist/guardrails/drift.d.ts.map +1 -0
  57. package/dist/guardrails/drift.js +127 -0
  58. package/dist/guardrails/drift.js.map +1 -0
  59. package/dist/guardrails/index.d.ts +19 -0
  60. package/dist/guardrails/index.d.ts.map +1 -0
  61. package/dist/guardrails/index.js +25 -0
  62. package/dist/guardrails/index.js.map +1 -0
  63. package/dist/guardrails/lint.d.ts +20 -0
  64. package/dist/guardrails/lint.d.ts.map +1 -0
  65. package/dist/guardrails/lint.js +274 -0
  66. package/dist/guardrails/lint.js.map +1 -0
  67. package/dist/guardrails/manifest.d.ts +43 -0
  68. package/dist/guardrails/manifest.d.ts.map +1 -0
  69. package/dist/guardrails/manifest.js +231 -0
  70. package/dist/guardrails/manifest.js.map +1 -0
  71. package/dist/guardrails/runner.d.ts +31 -0
  72. package/dist/guardrails/runner.d.ts.map +1 -0
  73. package/dist/guardrails/runner.js +268 -0
  74. package/dist/guardrails/runner.js.map +1 -0
  75. package/dist/guardrails/security.d.ts +31 -0
  76. package/dist/guardrails/security.d.ts.map +1 -0
  77. package/dist/guardrails/security.js +181 -0
  78. package/dist/guardrails/security.js.map +1 -0
  79. package/dist/guardrails/typecheck.d.ts +15 -0
  80. package/dist/guardrails/typecheck.d.ts.map +1 -0
  81. package/dist/guardrails/typecheck.js +104 -0
  82. package/dist/guardrails/typecheck.js.map +1 -0
  83. package/dist/guardrails/types.d.ts +196 -0
  84. package/dist/guardrails/types.d.ts.map +1 -0
  85. package/dist/guardrails/types.js +8 -0
  86. package/dist/guardrails/types.js.map +1 -0
  87. package/dist/index.d.ts +7 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +7 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/types.d.ts +489 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +297 -0
  94. package/dist/types.js.map +1 -0
  95. package/docs/architecture.svg +226 -0
  96. package/docs/development-guardrails.md +541 -0
  97. package/docs/guardrails-concept.svg +252 -0
  98. package/docs/overlays-deep-dive.md +298 -0
  99. package/package.json +66 -0
@@ -0,0 +1,299 @@
1
+ /**
2
+ * JSON Schema generator from OpenAPI schemas
3
+ * Generates Fastify-compatible JSON Schema objects
4
+ */
5
+ import { isReference, getRefName } from '../types.js';
6
+ /**
7
+ * Get a valid TypeScript identifier from domain and method
8
+ * e.g., "DashboardDomain" + "getSchema" -> "DashboardDomain_getSchema"
9
+ */
10
+ function getOperationTypeBase(operation) {
11
+ const domain = operation['x-micro-contracts-domain'];
12
+ const method = operation['x-micro-contracts-method'];
13
+ if (domain && method) {
14
+ return `${domain}_${method}`;
15
+ }
16
+ if (operation.operationId) {
17
+ return operation.operationId.replace(/[^a-zA-Z0-9]/g, '_');
18
+ }
19
+ return 'Unknown';
20
+ }
21
+ /**
22
+ * Generate JSON Schema TypeScript file from OpenAPI spec
23
+ */
24
+ export function generateSchemas(spec) {
25
+ const lines = [];
26
+ lines.push('/**');
27
+ lines.push(' * Auto-generated JSON Schemas from OpenAPI specification');
28
+ lines.push(` * Generated from: ${spec.info.title} v${spec.info.version}`);
29
+ lines.push(' * DO NOT EDIT MANUALLY');
30
+ lines.push(' */');
31
+ lines.push('');
32
+ // Generate schemas from components/schemas
33
+ if (spec.components?.schemas) {
34
+ for (const [name, schema] of Object.entries(spec.components.schemas)) {
35
+ lines.push(generateSchemaExport(name, schema, spec));
36
+ lines.push('');
37
+ }
38
+ }
39
+ // Generate query/path parameter schemas from paths
40
+ const paramSchemas = generateParameterSchemas(spec);
41
+ if (paramSchemas) {
42
+ lines.push('// Parameter schemas');
43
+ lines.push(paramSchemas);
44
+ }
45
+ // Export all schema names for registration
46
+ lines.push('');
47
+ lines.push('// All schemas for registration');
48
+ lines.push('export const allSchemas = [');
49
+ if (spec.components?.schemas) {
50
+ for (const name of Object.keys(spec.components.schemas)) {
51
+ lines.push(` ${name},`);
52
+ }
53
+ }
54
+ // Add parameter schemas
55
+ for (const [, pathItem] of Object.entries(spec.paths)) {
56
+ for (const method of ['get', 'post', 'put', 'patch', 'delete']) {
57
+ const operation = pathItem[method];
58
+ if (!operation)
59
+ continue;
60
+ const typeBase = getOperationTypeBase(operation);
61
+ // Combine query and path params into a single Params schema
62
+ const queryParams = (operation.parameters || []).filter((p) => !isReference(p) && p.in === 'query');
63
+ const pathParams = (operation.parameters || []).filter((p) => !isReference(p) && p.in === 'path');
64
+ const allParams = [...pathParams, ...queryParams];
65
+ if (allParams.length > 0) {
66
+ lines.push(` ${typeBase}Params,`);
67
+ }
68
+ }
69
+ }
70
+ lines.push('] as const;');
71
+ return lines.join('\n');
72
+ }
73
+ /**
74
+ * Generate a single schema export
75
+ */
76
+ function generateSchemaExport(name, schema, spec) {
77
+ const jsonSchema = convertToJsonSchema(name, schema, spec);
78
+ const schemaStr = JSON.stringify(jsonSchema, null, 2)
79
+ .split('\n')
80
+ .map((line, i) => i === 0 ? line : ' ' + line)
81
+ .join('\n');
82
+ return `export const ${name} = ${schemaStr} as const;`;
83
+ }
84
+ /**
85
+ * Convert OpenAPI schema to JSON Schema with $id
86
+ */
87
+ function convertToJsonSchema(name, schema, spec) {
88
+ if (isReference(schema)) {
89
+ return { $ref: `${getRefName(schema.$ref)}#` };
90
+ }
91
+ const result = {
92
+ $id: name,
93
+ };
94
+ // Handle allOf, oneOf, anyOf
95
+ if (schema.allOf) {
96
+ result.allOf = schema.allOf.map(s => convertSchemaValue(s, spec));
97
+ return result;
98
+ }
99
+ if (schema.oneOf) {
100
+ result.oneOf = schema.oneOf.map(s => convertSchemaValue(s, spec));
101
+ return result;
102
+ }
103
+ if (schema.anyOf) {
104
+ result.anyOf = schema.anyOf.map(s => convertSchemaValue(s, spec));
105
+ return result;
106
+ }
107
+ // Copy basic properties
108
+ if (schema.type)
109
+ result.type = schema.type;
110
+ if (schema.description)
111
+ result.description = schema.description;
112
+ if (schema.enum)
113
+ result.enum = schema.enum;
114
+ if (schema.format)
115
+ result.format = schema.format;
116
+ if (schema.default !== undefined)
117
+ result.default = schema.default;
118
+ if (schema.nullable)
119
+ result.nullable = schema.nullable;
120
+ // Number constraints
121
+ if (schema.minimum !== undefined)
122
+ result.minimum = schema.minimum;
123
+ if (schema.maximum !== undefined)
124
+ result.maximum = schema.maximum;
125
+ // String constraints
126
+ if (schema.minLength !== undefined)
127
+ result.minLength = schema.minLength;
128
+ if (schema.maxLength !== undefined)
129
+ result.maxLength = schema.maxLength;
130
+ if (schema.pattern)
131
+ result.pattern = schema.pattern;
132
+ // Array constraints
133
+ if (schema.minItems !== undefined)
134
+ result.minItems = schema.minItems;
135
+ if (schema.maxItems !== undefined)
136
+ result.maxItems = schema.maxItems;
137
+ if (schema.items) {
138
+ result.items = convertSchemaValue(schema.items, spec);
139
+ }
140
+ // Object properties
141
+ if (schema.properties) {
142
+ result.properties = {};
143
+ for (const [propName, propSchema] of Object.entries(schema.properties)) {
144
+ result.properties[propName] =
145
+ convertSchemaValue(propSchema, spec);
146
+ }
147
+ }
148
+ if (schema.required && schema.required.length > 0) {
149
+ result.required = schema.required;
150
+ }
151
+ if (schema.additionalProperties !== undefined) {
152
+ if (typeof schema.additionalProperties === 'boolean') {
153
+ result.additionalProperties = schema.additionalProperties;
154
+ }
155
+ else {
156
+ result.additionalProperties = convertSchemaValue(schema.additionalProperties, spec);
157
+ }
158
+ }
159
+ return result;
160
+ }
161
+ /**
162
+ * Convert schema value (without $id)
163
+ */
164
+ function convertSchemaValue(schema, spec) {
165
+ if (isReference(schema)) {
166
+ return { $ref: `${getRefName(schema.$ref)}#` };
167
+ }
168
+ const result = {};
169
+ // Handle allOf, oneOf, anyOf
170
+ if (schema.allOf) {
171
+ result.allOf = schema.allOf.map(s => convertSchemaValue(s, spec));
172
+ return result;
173
+ }
174
+ if (schema.oneOf) {
175
+ result.oneOf = schema.oneOf.map(s => convertSchemaValue(s, spec));
176
+ return result;
177
+ }
178
+ if (schema.anyOf) {
179
+ result.anyOf = schema.anyOf.map(s => convertSchemaValue(s, spec));
180
+ return result;
181
+ }
182
+ // Copy basic properties
183
+ if (schema.type)
184
+ result.type = schema.type;
185
+ if (schema.description)
186
+ result.description = schema.description;
187
+ if (schema.enum)
188
+ result.enum = schema.enum;
189
+ if (schema.format)
190
+ result.format = schema.format;
191
+ if (schema.default !== undefined)
192
+ result.default = schema.default;
193
+ if (schema.nullable)
194
+ result.nullable = schema.nullable;
195
+ // Number constraints
196
+ if (schema.minimum !== undefined)
197
+ result.minimum = schema.minimum;
198
+ if (schema.maximum !== undefined)
199
+ result.maximum = schema.maximum;
200
+ // String constraints
201
+ if (schema.minLength !== undefined)
202
+ result.minLength = schema.minLength;
203
+ if (schema.maxLength !== undefined)
204
+ result.maxLength = schema.maxLength;
205
+ if (schema.pattern)
206
+ result.pattern = schema.pattern;
207
+ // Array constraints
208
+ if (schema.minItems !== undefined)
209
+ result.minItems = schema.minItems;
210
+ if (schema.maxItems !== undefined)
211
+ result.maxItems = schema.maxItems;
212
+ if (schema.items) {
213
+ result.items = convertSchemaValue(schema.items, spec);
214
+ }
215
+ // Object properties
216
+ if (schema.properties) {
217
+ result.properties = {};
218
+ for (const [propName, propSchema] of Object.entries(schema.properties)) {
219
+ result.properties[propName] =
220
+ convertSchemaValue(propSchema, spec);
221
+ }
222
+ }
223
+ if (schema.required && schema.required.length > 0) {
224
+ result.required = schema.required;
225
+ }
226
+ if (schema.additionalProperties !== undefined) {
227
+ if (typeof schema.additionalProperties === 'boolean') {
228
+ result.additionalProperties = schema.additionalProperties;
229
+ }
230
+ else {
231
+ result.additionalProperties = convertSchemaValue(schema.additionalProperties, spec);
232
+ }
233
+ }
234
+ return result;
235
+ }
236
+ /**
237
+ * Generate parameter schemas from paths
238
+ */
239
+ function generateParameterSchemas(spec) {
240
+ const lines = [];
241
+ const generatedSchemas = new Set();
242
+ for (const [, pathItem] of Object.entries(spec.paths)) {
243
+ for (const method of ['get', 'post', 'put', 'patch', 'delete']) {
244
+ const operation = pathItem[method];
245
+ if (!operation)
246
+ continue;
247
+ const typeBase = getOperationTypeBase(operation);
248
+ // Generate combined params schema (path + query params)
249
+ const queryParams = (operation.parameters || []).filter((p) => !isReference(p) && p.in === 'query');
250
+ const pathParams = (operation.parameters || []).filter((p) => !isReference(p) && p.in === 'path');
251
+ const allParams = [...pathParams, ...queryParams];
252
+ if (allParams.length > 0) {
253
+ const schemaName = `${typeBase}Params`;
254
+ if (!generatedSchemas.has(schemaName)) {
255
+ generatedSchemas.add(schemaName);
256
+ lines.push(generateParamsSchema(schemaName, allParams, spec));
257
+ lines.push('');
258
+ }
259
+ }
260
+ }
261
+ }
262
+ return lines.join('\n');
263
+ }
264
+ /**
265
+ * Generate parameter schema
266
+ */
267
+ function generateParamsSchema(name, params, spec) {
268
+ const schema = {
269
+ $id: name,
270
+ type: 'object',
271
+ properties: {},
272
+ required: [],
273
+ };
274
+ for (const param of params) {
275
+ if (param.schema) {
276
+ schema.properties[param.name] =
277
+ convertSchemaValue(param.schema, spec);
278
+ }
279
+ else {
280
+ schema.properties[param.name] = { type: 'string' };
281
+ }
282
+ if (param.required) {
283
+ schema.required.push(param.name);
284
+ }
285
+ }
286
+ // Remove empty required array
287
+ if (schema.required.length === 0) {
288
+ delete schema.required;
289
+ }
290
+ const schemaStr = JSON.stringify(schema, null, 2)
291
+ .split('\n')
292
+ .map((line, i) => i === 0 ? line : ' ' + line)
293
+ .join('\n');
294
+ return `export const ${name} = ${schemaStr} as const;`;
295
+ }
296
+ function capitalize(str) {
297
+ return str.charAt(0).toUpperCase() + str.slice(1);
298
+ }
299
+ //# sourceMappingURL=schemaGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaGenerator.js","sourceRoot":"","sources":["../../src/generator/schemaGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Template Processor
3
+ *
4
+ * Provides Handlebars template loading and processing for code generation.
5
+ * Supports custom templates for server routes, frontend clients, etc.
6
+ */
7
+ import Handlebars from 'handlebars';
8
+ import type { OpenAPISpec } from '../types.js';
9
+ import type { ExtensionInfo } from './overlayProcessor.js';
10
+ export interface TemplateConfig {
11
+ /** Path to server route template */
12
+ server?: string;
13
+ /** Path to frontend client template */
14
+ frontend?: string;
15
+ /** Path to domain interface template */
16
+ domains?: string;
17
+ /** Custom templates by name */
18
+ custom?: Record<string, string>;
19
+ }
20
+ export interface TemplateContext {
21
+ /** Module name */
22
+ moduleName: string;
23
+ /** OpenAPI spec (possibly transformed) */
24
+ spec: OpenAPISpec;
25
+ /** OpenAPI title */
26
+ title: string;
27
+ /** OpenAPI version */
28
+ version: string;
29
+ /** Base URL derived from OpenAPI servers[0].url */
30
+ baseUrl: string;
31
+ /** Extension information from overlays */
32
+ extensionInfo: ExtensionInfo[];
33
+ /** Applied overlays */
34
+ appliedOverlays: string[];
35
+ /** Path to domains object (e.g., 'fastify.domains.core') */
36
+ domainsPath: string;
37
+ /** Contract package import path */
38
+ contractPackage: string;
39
+ /** Routes extracted from spec */
40
+ routes: RouteContext[];
41
+ /** Domains grouped from routes (with methods list) */
42
+ domains: DomainContext[];
43
+ /** Domain API types for import (e.g., ['UserDomainApi', 'OrderDomainApi']) */
44
+ domainTypes: string[];
45
+ /** Schema types needed for import */
46
+ schemaTypes: string[];
47
+ /** All schema names */
48
+ schemaNames: string[];
49
+ /** Unique overlays with their parameters (for overlay adapter generation) */
50
+ uniqueOverlays: UniqueOverlayContext[];
51
+ }
52
+ export interface UniqueOverlayContext {
53
+ name: string;
54
+ params: ExtensionParameterContext[];
55
+ }
56
+ export interface RouteContext {
57
+ path: string;
58
+ fastifyPath: string;
59
+ /** URL pattern for client (with ${params.xxx} template syntax) */
60
+ clientUrlPattern: string;
61
+ method: string;
62
+ /** HTTP method in uppercase */
63
+ httpMethod: string;
64
+ operationId: string;
65
+ domain: string;
66
+ domainKey: string;
67
+ domainMethod: string;
68
+ summary?: string;
69
+ tags: string[];
70
+ isPublished: boolean;
71
+ /** Extensions applied to this route */
72
+ extensions: RouteExtension[];
73
+ /** Query parameters */
74
+ queryParams: ParameterContext[];
75
+ /** Path parameters */
76
+ pathParams: ParameterContext[];
77
+ /** Request body info */
78
+ requestBody?: {
79
+ schemaName: string;
80
+ required: boolean;
81
+ };
82
+ /** Response info */
83
+ responses: ResponseContext[];
84
+ /** Type name base for this route (e.g., 'User_getUsers') */
85
+ typeNameBase: string;
86
+ /** Response type (for return type) */
87
+ responseType: string;
88
+ /** Request body type (if exists) */
89
+ requestType?: string;
90
+ /** Params type (path + query combined, if exists) */
91
+ paramsType?: string;
92
+ /** Unified input type (e.g., UserDomain_getUsersInput) */
93
+ inputType: string;
94
+ /** URL pattern for client using input object (with ${input.xxx} template syntax) */
95
+ clientUrlPatternInput: string;
96
+ /** Parameters injected by extensions for this route */
97
+ extensionParams: ExtensionParameterContext[];
98
+ }
99
+ export interface RouteExtension {
100
+ marker: string;
101
+ value: string;
102
+ registryKey: string;
103
+ }
104
+ export interface ExtensionParameterContext {
105
+ extensionName: string;
106
+ name: string;
107
+ location: 'headers' | 'query' | 'params';
108
+ tsType: string;
109
+ required: boolean;
110
+ }
111
+ export interface ParameterContext {
112
+ name: string;
113
+ required: boolean;
114
+ schemaName?: string;
115
+ }
116
+ export interface ResponseContext {
117
+ statusCode: string;
118
+ schemaName?: string;
119
+ }
120
+ export interface DomainContext {
121
+ name: string;
122
+ key: string;
123
+ methods: string[];
124
+ }
125
+ /**
126
+ * Load and compile a template
127
+ */
128
+ export declare function loadTemplate(templatePath: string): Handlebars.TemplateDelegate;
129
+ /**
130
+ * Template resolution options
131
+ */
132
+ export interface TemplateResolveOptions {
133
+ /** Base spec directory (e.g., 'spec/') */
134
+ specDir: string;
135
+ /** Module name */
136
+ moduleName: string;
137
+ /** Template file name (e.g., 'fastify-routes.hbs') */
138
+ templateName: string;
139
+ }
140
+ /**
141
+ * Resolve template path following priority order:
142
+ * 1. spec/{module}/templates/{templateName}
143
+ * 2. spec/default/templates/{templateName}
144
+ *
145
+ * Returns null if not found (no built-in fallback)
146
+ */
147
+ export declare function resolveTemplatePath(options: TemplateResolveOptions): string | null;
148
+ /**
149
+ * Load template with automatic resolution
150
+ */
151
+ export declare function loadTemplateWithResolution(options: TemplateResolveOptions): Handlebars.TemplateDelegate;
152
+ /**
153
+ * Get default template content (built-in - for backward compatibility only)
154
+ * @deprecated Use loadTemplateWithResolution instead
155
+ */
156
+ export declare function getDefaultTemplate(type: 'server' | 'frontend' | 'domains'): string;
157
+ /**
158
+ * Build template context from spec and overlay result
159
+ */
160
+ export declare function buildTemplateContext(spec: OpenAPISpec, moduleName: string, options?: {
161
+ domainsPath?: string;
162
+ contractPackage?: string;
163
+ extensionInfo?: Map<string, ExtensionInfo>;
164
+ appliedOverlays?: string[];
165
+ }): TemplateContext;
166
+ /**
167
+ * Process template with context
168
+ */
169
+ export declare function processTemplate(template: Handlebars.TemplateDelegate, context: TemplateContext): string;
170
+ /**
171
+ * Generate code using template
172
+ */
173
+ export declare function generateWithTemplate(templatePath: string | null, defaultType: 'server' | 'frontend' | 'domains', context: TemplateContext): string;
174
+ declare const DEFAULT_SERVER_TEMPLATE = "/**\n * Auto-generated Fastify routes from OpenAPI specification\n * Generated from: {{spec.info.title}} v{{spec.info.version}}\n * DO NOT EDIT MANUALLY\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { allSchemas } from '{{contractPackage}}/schemas';\nimport * as types from '{{contractPackage}}/schemas';\n\nexport async function registerRoutes(fastify: FastifyInstance): Promise<void> {\n // Register all schemas from contract package\n for (const schema of allSchemas) {\n fastify.addSchema(schema);\n }\n\n // Domain references from {{domainsPath}}\n const { {{#each domains}}{{key}}{{#unless @last}}, {{/unless}}{{/each}} } = {{domainsPath}};\n{{#if extensionInfo.length}}\n\n // Extension registries\n{{#each extensionInfo}}\n const {{camelCase marker}}Registry = fastify.{{camelCase marker}}Registry;\n{{/each}}\n{{/if}}\n\n{{#each routes}}\n // {{summary}}\n // {{uppercase method}} {{path}}{{#if isPublished}} (published){{/if}}\n fastify.{{method}}('{{fastifyPath}}', {\n{{#if queryParams.length}}\n schema: {\n querystring: { $ref: '{{typeNameBase}}Query#' },\n{{/if}}\n{{#if pathParams.length}}\n{{#unless queryParams.length}}\n schema: {\n{{/unless}}\n params: { $ref: '{{typeNameBase}}Params#' },\n{{/if}}\n{{#if requestBody}}\n{{#unless (or queryParams.length pathParams.length)}}\n schema: {\n{{/unless}}\n body: { $ref: '{{requestBody.schemaName}}#' },\n{{/if}}\n{{#if responses.length}}\n{{#unless (or queryParams.length pathParams.length requestBody)}}\n schema: {\n{{/unless}}\n response: {\n{{#each responses}}\n{{#if schemaName}}\n {{statusCode}}: { $ref: '{{schemaName}}#' },\n{{/if}}\n{{/each}}\n },\n{{/if}}\n{{#if (or queryParams.length pathParams.length requestBody responses.length)}}\n },\n{{/if}}\n{{#if extensions.length}}\n preHandler: [\n{{#each extensions}}\n {{registryKey}},\n{{/each}}\n ],\n{{/if}}\n }, async (req, reply) => {\n return {{domainKey}}.{{domainMethod}}({{#if pathParams.length}}req.params as types.{{typeNameBase}}Params{{/if}}{{#if queryParams.length}}{{#if pathParams.length}}, {{/if}}req.query as types.{{typeNameBase}}Query{{/if}}{{#if requestBody}}{{#if (or pathParams.length queryParams.length)}}, {{/if}}req.body as types.{{requestBody.schemaName}}{{/if}});\n });\n\n{{/each}}\n}\n";
175
+ declare const DEFAULT_FRONTEND_TEMPLATE = "/**\n * Auto-generated API client from OpenAPI specification\n * Generated from: {{spec.info.title}} v{{spec.info.version}}\n * DO NOT EDIT MANUALLY\n */\n\nimport type * as types from '{{contractPackage}}/schemas';\n\nconst BASE_URL = '';\n\nasync function fetchApi<T>(\n url: string,\n options: RequestInit = {}\n): Promise<T> {\n const response = await fetch(BASE_URL + url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n throw new Error(`API error: ${response.status}`);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n}\n\n{{#each routes}}\n/**\n * {{summary}}\n * {{uppercase method}} {{path}}\n */\nexport async function {{operationId}}(\n{{#if pathParams.length}}\n params: types.{{typeNameBase}}Params,\n{{/if}}\n{{#if queryParams.length}}\n query?: Partial<types.{{typeNameBase}}Query>,\n{{/if}}\n{{#if requestBody}}\n body: types.{{requestBody.schemaName}},\n{{/if}}\n): Promise<{{#with (first responses)}}{{#if schemaName}}types.{{schemaName}}{{else}}void{{/if}}{{/with}}> {\n{{#if pathParams.length}}\n let url = '{{path}}'.replace(/\\{([^}]+)\\}/g, (_, key) => String((params as Record<string, unknown>)[key]));\n{{else}}\n let url = '{{path}}';\n{{/if}}\n{{#if queryParams.length}}\n if (query) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n searchParams.set(key, String(value));\n }\n }\n const qs = searchParams.toString();\n if (qs) url += '?' + qs;\n }\n{{/if}}\n return fetchApi<{{#with (first responses)}}{{#if schemaName}}types.{{schemaName}}{{else}}void{{/if}}{{/with}}>(url, {\n method: '{{uppercase method}}',\n{{#if requestBody}}\n body: JSON.stringify(body),\n{{/if}}\n });\n}\n\n{{/each}}\n";
176
+ declare const DEFAULT_DOMAINS_TEMPLATE = "/**\n * Domain interfaces\n * Auto-generated from OpenAPI specification\n * DO NOT EDIT MANUALLY\n */\n\nimport type * as types from '../schemas/types.js';\n\n{{#each domains}}\n/**\n * {{name}} interface\n */\nexport interface {{name}}Api {\n{{#each methods}}\n {{this}}(...args: unknown[]): Promise<unknown>;\n{{/each}}\n}\n\n{{/each}}\n";
177
+ export { DEFAULT_SERVER_TEMPLATE, DEFAULT_FRONTEND_TEMPLATE, DEFAULT_DOMAINS_TEMPLATE };
178
+ //# sourceMappingURL=templateProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateProcessor.d.ts","sourceRoot":"","sources":["../../src/generator/templateProcessor.ts"],"names":[],"mappings":"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"}