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,607 @@
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 fs from 'fs';
8
+ import path from 'path';
9
+ import Handlebars from 'handlebars';
10
+ import { isReference, getRefName } from '../types.js';
11
+ // =============================================================================
12
+ // Template Processor
13
+ // =============================================================================
14
+ /**
15
+ * Load and compile a template
16
+ */
17
+ export function loadTemplate(templatePath) {
18
+ if (!fs.existsSync(templatePath)) {
19
+ throw new Error(`Template not found: ${templatePath}`);
20
+ }
21
+ const content = fs.readFileSync(templatePath, 'utf-8');
22
+ return Handlebars.compile(content);
23
+ }
24
+ /**
25
+ * Resolve template path following priority order:
26
+ * 1. spec/{module}/templates/{templateName}
27
+ * 2. spec/default/templates/{templateName}
28
+ *
29
+ * Returns null if not found (no built-in fallback)
30
+ */
31
+ export function resolveTemplatePath(options) {
32
+ const { specDir, moduleName, templateName } = options;
33
+ // Priority 1: Module-specific template
34
+ const moduleTemplatePath = path.join(specDir, moduleName, 'templates', templateName);
35
+ if (fs.existsSync(moduleTemplatePath)) {
36
+ return moduleTemplatePath;
37
+ }
38
+ // Priority 2: Default templates
39
+ const defaultTemplatePath = path.join(specDir, 'default', 'templates', templateName);
40
+ if (fs.existsSync(defaultTemplatePath)) {
41
+ return defaultTemplatePath;
42
+ }
43
+ // No built-in fallback
44
+ return null;
45
+ }
46
+ /**
47
+ * Load template with automatic resolution
48
+ */
49
+ export function loadTemplateWithResolution(options) {
50
+ const templatePath = resolveTemplatePath(options);
51
+ if (!templatePath) {
52
+ // Try absolute/relative path as fallback
53
+ const absolutePath = path.resolve(options.templateName);
54
+ if (fs.existsSync(absolutePath)) {
55
+ return loadTemplate(absolutePath);
56
+ }
57
+ throw new Error(`Template not found: ${options.templateName}\n` +
58
+ `Searched in:\n` +
59
+ ` - ${path.join(options.specDir, options.moduleName, 'templates', options.templateName)}\n` +
60
+ ` - ${path.join(options.specDir, 'default', 'templates', options.templateName)}\n` +
61
+ ` - ${absolutePath}\n` +
62
+ `\nRun 'micro-contracts init' to create starter templates.`);
63
+ }
64
+ return loadTemplate(templatePath);
65
+ }
66
+ /**
67
+ * Get default template content (built-in - for backward compatibility only)
68
+ * @deprecated Use loadTemplateWithResolution instead
69
+ */
70
+ export function getDefaultTemplate(type) {
71
+ switch (type) {
72
+ case 'server':
73
+ return DEFAULT_SERVER_TEMPLATE;
74
+ case 'frontend':
75
+ return DEFAULT_FRONTEND_TEMPLATE;
76
+ case 'domains':
77
+ return DEFAULT_DOMAINS_TEMPLATE;
78
+ }
79
+ }
80
+ /**
81
+ * Build template context from spec and overlay result
82
+ */
83
+ export function buildTemplateContext(spec, moduleName, options = {}) {
84
+ const domainsPath = options.domainsPath || `fastify.domains.${moduleName}`;
85
+ const contractPackage = options.contractPackage || `@project/contract/${moduleName}`;
86
+ const extensionInfo = options.extensionInfo
87
+ ? Array.from(options.extensionInfo.values())
88
+ : [];
89
+ const appliedOverlays = options.appliedOverlays || [];
90
+ const routes = extractRoutes(spec, extensionInfo);
91
+ const domains = extractDomains(routes);
92
+ const schemaNames = Object.keys(spec.components?.schemas || {});
93
+ // Extract base URL from OpenAPI servers
94
+ const baseUrl = extractBaseUrl(spec);
95
+ // Extract domain types for imports (e.g., 'UserDomainApi')
96
+ // Note: domain.name already includes 'Domain' suffix (e.g., 'UserDomain')
97
+ const domainTypes = domains.map(d => `${d.name}Api`);
98
+ // Extract schema types needed for imports
99
+ const schemaTypes = extractSchemaTypes(routes);
100
+ // Extract unique overlays with their parameters (deduplicated)
101
+ const uniqueOverlays = extractUniqueOverlays(routes);
102
+ return {
103
+ moduleName,
104
+ spec,
105
+ title: spec.info.title,
106
+ version: spec.info.version,
107
+ baseUrl,
108
+ extensionInfo,
109
+ appliedOverlays,
110
+ domainsPath,
111
+ contractPackage,
112
+ routes,
113
+ domains,
114
+ domainTypes,
115
+ schemaTypes,
116
+ schemaNames,
117
+ uniqueOverlays,
118
+ };
119
+ }
120
+ /**
121
+ * Extract unique overlays from routes (deduplicated by overlay name)
122
+ */
123
+ function extractUniqueOverlays(routes) {
124
+ const overlayMap = new Map();
125
+ for (const route of routes) {
126
+ for (const ext of route.extensions) {
127
+ if (!overlayMap.has(ext.value)) {
128
+ // Find params for this overlay
129
+ const params = route.extensionParams.filter(p => p.extensionName === ext.value);
130
+ overlayMap.set(ext.value, params);
131
+ }
132
+ }
133
+ }
134
+ return Array.from(overlayMap.entries()).map(([name, params]) => ({ name, params }));
135
+ }
136
+ /**
137
+ * Extract base URL from OpenAPI servers field
138
+ * Returns path portion only (e.g., '/api' from 'http://localhost:3000/api')
139
+ */
140
+ function extractBaseUrl(spec) {
141
+ const servers = spec.servers;
142
+ if (!servers || servers.length === 0) {
143
+ return '';
144
+ }
145
+ const serverUrl = servers[0].url;
146
+ try {
147
+ // Try to parse as full URL
148
+ const url = new URL(serverUrl);
149
+ // Return pathname, removing trailing slash
150
+ return url.pathname.replace(/\/$/, '');
151
+ }
152
+ catch {
153
+ // If not a valid URL, assume it's already a path
154
+ return serverUrl.replace(/\/$/, '');
155
+ }
156
+ }
157
+ /**
158
+ * Extract all schema types needed for client imports
159
+ */
160
+ function extractSchemaTypes(routes) {
161
+ const types = new Set();
162
+ types.add('ProblemDetails'); // Always needed for error handling
163
+ for (const route of routes) {
164
+ if (route.requestBody?.schemaName) {
165
+ types.add(route.requestBody.schemaName);
166
+ }
167
+ for (const resp of route.responses) {
168
+ if (resp.schemaName) {
169
+ types.add(resp.schemaName);
170
+ }
171
+ }
172
+ // Add params type (path + query parameters) for templates that need it
173
+ if (route.pathParams.length > 0 || route.queryParams.length > 0) {
174
+ types.add(`${route.typeNameBase}Params`);
175
+ }
176
+ // Add unified input type (for domain-aligned templates)
177
+ types.add(`${route.typeNameBase}Input`);
178
+ }
179
+ return Array.from(types).sort();
180
+ }
181
+ /**
182
+ * Process template with context
183
+ */
184
+ export function processTemplate(template, context) {
185
+ return template(context);
186
+ }
187
+ /**
188
+ * Generate code using template
189
+ */
190
+ export function generateWithTemplate(templatePath, defaultType, context) {
191
+ let template;
192
+ if (templatePath && fs.existsSync(templatePath)) {
193
+ template = loadTemplate(templatePath);
194
+ }
195
+ else {
196
+ template = Handlebars.compile(getDefaultTemplate(defaultType));
197
+ }
198
+ return processTemplate(template, context);
199
+ }
200
+ // =============================================================================
201
+ // Route Extraction
202
+ // =============================================================================
203
+ function extractRoutes(spec, extensionInfo) {
204
+ const routes = [];
205
+ const methods = ['get', 'post', 'put', 'patch', 'delete'];
206
+ for (const [apiPath, pathItem] of Object.entries(spec.paths)) {
207
+ for (const method of methods) {
208
+ const operation = pathItem[method];
209
+ if (!operation)
210
+ continue;
211
+ // Canonical extension names only
212
+ const domain = operation['x-micro-contracts-domain'];
213
+ const domainMethod = operation['x-micro-contracts-method'];
214
+ if (!domain || !domainMethod)
215
+ continue;
216
+ const operationId = operation.operationId || `${method}${apiPath.replace(/[^a-zA-Z0-9]/g, '')}`;
217
+ const typeNameBase = `${domain}_${domainMethod}`;
218
+ const fastifyPath = apiPath.replace(/\{([^}]+)\}/g, ':$1');
219
+ const domainKey = domain.replace(/Domain$/, '').charAt(0).toLowerCase() +
220
+ domain.replace(/Domain$/, '').slice(1);
221
+ // Extract extensions and their parameters
222
+ const extensions = [];
223
+ const extensionParams = [];
224
+ for (const info of extensionInfo) {
225
+ const extValue = operation[info.marker];
226
+ if (extValue) {
227
+ const matches = Array.isArray(extValue)
228
+ ? extValue.includes(info.name)
229
+ : extValue === info.name;
230
+ if (matches) {
231
+ const registryName = markerToRegistryName(info.marker);
232
+ extensions.push({
233
+ marker: info.marker,
234
+ value: info.name,
235
+ registryKey: `${registryName}.${info.name}`,
236
+ });
237
+ // Add parameters injected by this extension
238
+ for (const param of info.injectedParameters) {
239
+ // Map OpenAPI 'in' values to HTTP request property names
240
+ const locationMap = {
241
+ header: 'headers',
242
+ query: 'query',
243
+ path: 'params',
244
+ };
245
+ extensionParams.push({
246
+ extensionName: info.name,
247
+ name: param.name,
248
+ location: locationMap[param.in] || 'headers',
249
+ tsType: parameterToTsType(param),
250
+ required: param.required || false,
251
+ });
252
+ }
253
+ }
254
+ }
255
+ }
256
+ // Extract parameters
257
+ const allParams = operation.parameters || [];
258
+ const queryParams = allParams
259
+ .filter((p) => !isReference(p) && p.in === 'query')
260
+ .map(p => ({ name: p.name, required: p.required || false }));
261
+ const pathParams = allParams
262
+ .filter((p) => !isReference(p) && p.in === 'path')
263
+ .map(p => ({ name: p.name, required: true }));
264
+ // Extract request body
265
+ let requestBody;
266
+ if (operation.requestBody) {
267
+ const reqBody = isReference(operation.requestBody)
268
+ ? null // Simplified - would need to resolve
269
+ : operation.requestBody;
270
+ if (reqBody?.content?.['application/json']?.schema) {
271
+ const schema = reqBody.content['application/json'].schema;
272
+ const schemaName = isReference(schema)
273
+ ? getRefName(schema.$ref)
274
+ : operationId + 'Body';
275
+ requestBody = { schemaName, required: reqBody.required || false };
276
+ }
277
+ }
278
+ // Extract responses
279
+ const responses = [];
280
+ for (const [statusCode, response] of Object.entries(operation.responses)) {
281
+ const resp = isReference(response) ? null : response;
282
+ if (resp?.content?.['application/json']?.schema) {
283
+ const schema = resp.content['application/json'].schema;
284
+ const schemaName = isReference(schema) ? getRefName(schema.$ref) : undefined;
285
+ responses.push({ statusCode, schemaName });
286
+ }
287
+ else {
288
+ responses.push({ statusCode });
289
+ }
290
+ }
291
+ // Client URL pattern: /users/{id} -> /users/${params.id}
292
+ const clientUrlPattern = apiPath.replace(/\{([^}]+)\}/g, '${params.$1}');
293
+ // Client URL pattern using input object: /users/{id} -> /users/${input.id}
294
+ const clientUrlPatternInput = apiPath.replace(/\{([^}]+)\}/g, '${input.$1}');
295
+ // Calculate type names
296
+ const responseType = responses.length > 0 && responses[0].schemaName
297
+ ? responses[0].schemaName
298
+ : 'void';
299
+ const requestType = requestBody?.schemaName;
300
+ // Params type combines both path and query parameters
301
+ const paramsType = (pathParams.length > 0 || queryParams.length > 0) ? `${typeNameBase}Params` : undefined;
302
+ // Unified input type name (matches contract domain API)
303
+ const inputType = `${typeNameBase}Input`;
304
+ routes.push({
305
+ path: apiPath,
306
+ fastifyPath,
307
+ clientUrlPattern,
308
+ clientUrlPatternInput,
309
+ method,
310
+ httpMethod: method.toUpperCase(),
311
+ operationId,
312
+ domain,
313
+ domainKey,
314
+ domainMethod,
315
+ summary: operation.summary,
316
+ tags: operation.tags || [],
317
+ isPublished: operation['x-micro-contracts-published'] === true,
318
+ extensions,
319
+ extensionParams,
320
+ queryParams,
321
+ pathParams,
322
+ requestBody,
323
+ responses,
324
+ typeNameBase,
325
+ responseType,
326
+ requestType,
327
+ paramsType,
328
+ inputType,
329
+ });
330
+ }
331
+ }
332
+ return routes;
333
+ }
334
+ function extractDomains(routes) {
335
+ const domainMap = new Map();
336
+ for (const route of routes) {
337
+ if (!domainMap.has(route.domain)) {
338
+ domainMap.set(route.domain, {
339
+ name: route.domain,
340
+ key: route.domainKey,
341
+ methods: [],
342
+ });
343
+ }
344
+ const domain = domainMap.get(route.domain);
345
+ if (!domain.methods.includes(route.domainMethod)) {
346
+ domain.methods.push(route.domainMethod);
347
+ }
348
+ }
349
+ return Array.from(domainMap.values()).sort((a, b) => a.name.localeCompare(b.name));
350
+ }
351
+ function markerToRegistryName(marker) {
352
+ const name = marker.replace(/^x-/, '');
353
+ return name.replace(/-([a-z])/g, (_, c) => c.toUpperCase()) + 'Registry';
354
+ }
355
+ /**
356
+ * Convert OpenAPI parameter to TypeScript type
357
+ */
358
+ function parameterToTsType(param) {
359
+ if (!param.schema)
360
+ return 'unknown';
361
+ const schema = param.schema;
362
+ switch (schema.type) {
363
+ case 'string':
364
+ return 'string';
365
+ case 'integer':
366
+ case 'number':
367
+ return 'number';
368
+ case 'boolean':
369
+ return 'boolean';
370
+ case 'array':
371
+ return 'unknown[]';
372
+ default:
373
+ return 'unknown';
374
+ }
375
+ }
376
+ // =============================================================================
377
+ // Register Handlebars Helpers
378
+ // =============================================================================
379
+ // Comparison helpers
380
+ Handlebars.registerHelper('eq', (a, b) => a === b);
381
+ Handlebars.registerHelper('ne', (a, b) => a !== b);
382
+ Handlebars.registerHelper('gt', (a, b) => a > b);
383
+ Handlebars.registerHelper('gte', (a, b) => a >= b);
384
+ Handlebars.registerHelper('lt', (a, b) => a < b);
385
+ Handlebars.registerHelper('lte', (a, b) => a <= b);
386
+ Handlebars.registerHelper('and', function (...args) {
387
+ const options = args.pop();
388
+ return args.every(Boolean);
389
+ });
390
+ Handlebars.registerHelper('or', function (...args) {
391
+ const options = args.pop();
392
+ return args.some(Boolean);
393
+ });
394
+ // Array/Object helpers
395
+ Handlebars.registerHelper('length', (arr) => arr?.length || 0);
396
+ Handlebars.registerHelper('first', (arr) => arr?.[0]);
397
+ Handlebars.registerHelper('last', (arr) => arr?.[arr?.length - 1]);
398
+ Handlebars.registerHelper('join', (arr, sep) => arr?.join(sep) || '');
399
+ Handlebars.registerHelper('includes', (arr, val) => arr?.includes(val));
400
+ Handlebars.registerHelper('keys', (obj) => Object.keys(obj || {}));
401
+ Handlebars.registerHelper('values', (obj) => Object.values(obj || {}));
402
+ // String helpers
403
+ Handlebars.registerHelper('uppercase', (str) => str?.toUpperCase());
404
+ Handlebars.registerHelper('lowercase', (str) => str?.toLowerCase());
405
+ Handlebars.registerHelper('capitalize', (str) => str?.charAt(0).toUpperCase() + str?.slice(1));
406
+ Handlebars.registerHelper('camelCase', (str) => {
407
+ return str?.replace(/-([a-z])/g, (_match, c) => c.toUpperCase());
408
+ });
409
+ Handlebars.registerHelper('pascalCase', (str) => {
410
+ const camel = str?.replace(/-([a-z])/g, (_match, c) => c.toUpperCase());
411
+ return camel?.charAt(0).toUpperCase() + camel?.slice(1);
412
+ });
413
+ Handlebars.registerHelper('kebabCase', (str) => {
414
+ return str?.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
415
+ });
416
+ // JSON helper
417
+ Handlebars.registerHelper('json', (obj) => JSON.stringify(obj, null, 2));
418
+ // Conditional block helpers
419
+ Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) {
420
+ switch (operator) {
421
+ case '==': return v1 == v2 ? options.fn(this) : options.inverse(this);
422
+ case '===': return v1 === v2 ? options.fn(this) : options.inverse(this);
423
+ case '!=': return v1 != v2 ? options.fn(this) : options.inverse(this);
424
+ case '!==': return v1 !== v2 ? options.fn(this) : options.inverse(this);
425
+ case '<': return v1 < v2 ? options.fn(this) : options.inverse(this);
426
+ case '<=': return v1 <= v2 ? options.fn(this) : options.inverse(this);
427
+ case '>': return v1 > v2 ? options.fn(this) : options.inverse(this);
428
+ case '>=': return v1 >= v2 ? options.fn(this) : options.inverse(this);
429
+ default: return options.inverse(this);
430
+ }
431
+ });
432
+ // =============================================================================
433
+ // Default Templates
434
+ // =============================================================================
435
+ const DEFAULT_SERVER_TEMPLATE = `/**
436
+ * Auto-generated Fastify routes from OpenAPI specification
437
+ * Generated from: {{spec.info.title}} v{{spec.info.version}}
438
+ * DO NOT EDIT MANUALLY
439
+ */
440
+
441
+ import type { FastifyInstance } from 'fastify';
442
+ import { allSchemas } from '{{contractPackage}}/schemas';
443
+ import * as types from '{{contractPackage}}/schemas';
444
+
445
+ export async function registerRoutes(fastify: FastifyInstance): Promise<void> {
446
+ // Register all schemas from contract package
447
+ for (const schema of allSchemas) {
448
+ fastify.addSchema(schema);
449
+ }
450
+
451
+ // Domain references from {{domainsPath}}
452
+ const { {{#each domains}}{{key}}{{#unless @last}}, {{/unless}}{{/each}} } = {{domainsPath}};
453
+ {{#if extensionInfo.length}}
454
+
455
+ // Extension registries
456
+ {{#each extensionInfo}}
457
+ const {{camelCase marker}}Registry = fastify.{{camelCase marker}}Registry;
458
+ {{/each}}
459
+ {{/if}}
460
+
461
+ {{#each routes}}
462
+ // {{summary}}
463
+ // {{uppercase method}} {{path}}{{#if isPublished}} (published){{/if}}
464
+ fastify.{{method}}('{{fastifyPath}}', {
465
+ {{#if queryParams.length}}
466
+ schema: {
467
+ querystring: { $ref: '{{typeNameBase}}Query#' },
468
+ {{/if}}
469
+ {{#if pathParams.length}}
470
+ {{#unless queryParams.length}}
471
+ schema: {
472
+ {{/unless}}
473
+ params: { $ref: '{{typeNameBase}}Params#' },
474
+ {{/if}}
475
+ {{#if requestBody}}
476
+ {{#unless (or queryParams.length pathParams.length)}}
477
+ schema: {
478
+ {{/unless}}
479
+ body: { $ref: '{{requestBody.schemaName}}#' },
480
+ {{/if}}
481
+ {{#if responses.length}}
482
+ {{#unless (or queryParams.length pathParams.length requestBody)}}
483
+ schema: {
484
+ {{/unless}}
485
+ response: {
486
+ {{#each responses}}
487
+ {{#if schemaName}}
488
+ {{statusCode}}: { $ref: '{{schemaName}}#' },
489
+ {{/if}}
490
+ {{/each}}
491
+ },
492
+ {{/if}}
493
+ {{#if (or queryParams.length pathParams.length requestBody responses.length)}}
494
+ },
495
+ {{/if}}
496
+ {{#if extensions.length}}
497
+ preHandler: [
498
+ {{#each extensions}}
499
+ {{registryKey}},
500
+ {{/each}}
501
+ ],
502
+ {{/if}}
503
+ }, async (req, reply) => {
504
+ 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}});
505
+ });
506
+
507
+ {{/each}}
508
+ }
509
+ `;
510
+ const DEFAULT_FRONTEND_TEMPLATE = `/**
511
+ * Auto-generated API client from OpenAPI specification
512
+ * Generated from: {{spec.info.title}} v{{spec.info.version}}
513
+ * DO NOT EDIT MANUALLY
514
+ */
515
+
516
+ import type * as types from '{{contractPackage}}/schemas';
517
+
518
+ const BASE_URL = '';
519
+
520
+ async function fetchApi<T>(
521
+ url: string,
522
+ options: RequestInit = {}
523
+ ): Promise<T> {
524
+ const response = await fetch(BASE_URL + url, {
525
+ ...options,
526
+ headers: {
527
+ 'Content-Type': 'application/json',
528
+ ...options.headers,
529
+ },
530
+ });
531
+
532
+ if (!response.ok) {
533
+ throw new Error(\`API error: \${response.status}\`);
534
+ }
535
+
536
+ if (response.status === 204) {
537
+ return undefined as T;
538
+ }
539
+
540
+ return response.json();
541
+ }
542
+
543
+ {{#each routes}}
544
+ /**
545
+ * {{summary}}
546
+ * {{uppercase method}} {{path}}
547
+ */
548
+ export async function {{operationId}}(
549
+ {{#if pathParams.length}}
550
+ params: types.{{typeNameBase}}Params,
551
+ {{/if}}
552
+ {{#if queryParams.length}}
553
+ query?: Partial<types.{{typeNameBase}}Query>,
554
+ {{/if}}
555
+ {{#if requestBody}}
556
+ body: types.{{requestBody.schemaName}},
557
+ {{/if}}
558
+ ): Promise<{{#with (first responses)}}{{#if schemaName}}types.{{schemaName}}{{else}}void{{/if}}{{/with}}> {
559
+ {{#if pathParams.length}}
560
+ let url = '{{path}}'.replace(/\\{([^}]+)\\}/g, (_, key) => String((params as Record<string, unknown>)[key]));
561
+ {{else}}
562
+ let url = '{{path}}';
563
+ {{/if}}
564
+ {{#if queryParams.length}}
565
+ if (query) {
566
+ const searchParams = new URLSearchParams();
567
+ for (const [key, value] of Object.entries(query)) {
568
+ if (value !== undefined) {
569
+ searchParams.set(key, String(value));
570
+ }
571
+ }
572
+ const qs = searchParams.toString();
573
+ if (qs) url += '?' + qs;
574
+ }
575
+ {{/if}}
576
+ return fetchApi<{{#with (first responses)}}{{#if schemaName}}types.{{schemaName}}{{else}}void{{/if}}{{/with}}>(url, {
577
+ method: '{{uppercase method}}',
578
+ {{#if requestBody}}
579
+ body: JSON.stringify(body),
580
+ {{/if}}
581
+ });
582
+ }
583
+
584
+ {{/each}}
585
+ `;
586
+ const DEFAULT_DOMAINS_TEMPLATE = `/**
587
+ * Domain interfaces
588
+ * Auto-generated from OpenAPI specification
589
+ * DO NOT EDIT MANUALLY
590
+ */
591
+
592
+ import type * as types from '../schemas/types.js';
593
+
594
+ {{#each domains}}
595
+ /**
596
+ * {{name}} interface
597
+ */
598
+ export interface {{name}}Api {
599
+ {{#each methods}}
600
+ {{this}}(...args: unknown[]): Promise<unknown>;
601
+ {{/each}}
602
+ }
603
+
604
+ {{/each}}
605
+ `;
606
+ export { DEFAULT_SERVER_TEMPLATE, DEFAULT_FRONTEND_TEMPLATE, DEFAULT_DOMAINS_TEMPLATE };
607
+ //# sourceMappingURL=templateProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateProcessor.js","sourceRoot":"","sources":["../../src/generator/templateProcessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * TypeScript type generator from OpenAPI schemas
3
+ */
4
+ import type { OpenAPISpec } from '../types.js';
5
+ /**
6
+ * Generate TypeScript type definitions from OpenAPI spec
7
+ */
8
+ export declare function generateTypes(spec: OpenAPISpec): string;
9
+ //# sourceMappingURL=typeGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeGenerator.d.ts","sourceRoot":"","sources":["../../src/generator/typeGenerator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,WAAW,EAMZ,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAgCvD"}