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.
- package/LICENSE +22 -0
- package/README.md +351 -0
- package/dist/cli/templates.d.ts +16 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +377 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +978 -0
- package/dist/cli.js.map +1 -0
- package/dist/generator/dependencyGenerator.d.ts +43 -0
- package/dist/generator/dependencyGenerator.d.ts.map +1 -0
- package/dist/generator/dependencyGenerator.js +159 -0
- package/dist/generator/dependencyGenerator.js.map +1 -0
- package/dist/generator/domainGenerator.d.ts +16 -0
- package/dist/generator/domainGenerator.d.ts.map +1 -0
- package/dist/generator/domainGenerator.js +212 -0
- package/dist/generator/domainGenerator.js.map +1 -0
- package/dist/generator/index.d.ts +37 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +747 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/linter.d.ts +24 -0
- package/dist/generator/linter.d.ts.map +1 -0
- package/dist/generator/linter.js +202 -0
- package/dist/generator/linter.js.map +1 -0
- package/dist/generator/overlayProcessor.d.ts +90 -0
- package/dist/generator/overlayProcessor.d.ts.map +1 -0
- package/dist/generator/overlayProcessor.js +532 -0
- package/dist/generator/overlayProcessor.js.map +1 -0
- package/dist/generator/schemaGenerator.d.ts +10 -0
- package/dist/generator/schemaGenerator.d.ts.map +1 -0
- package/dist/generator/schemaGenerator.js +299 -0
- package/dist/generator/schemaGenerator.js.map +1 -0
- package/dist/generator/templateProcessor.d.ts +178 -0
- package/dist/generator/templateProcessor.d.ts.map +1 -0
- package/dist/generator/templateProcessor.js +607 -0
- package/dist/generator/templateProcessor.js.map +1 -0
- package/dist/generator/typeGenerator.d.ts +9 -0
- package/dist/generator/typeGenerator.d.ts.map +1 -0
- package/dist/generator/typeGenerator.js +395 -0
- package/dist/generator/typeGenerator.js.map +1 -0
- package/dist/guardrails/allowlist.d.ts +45 -0
- package/dist/guardrails/allowlist.d.ts.map +1 -0
- package/dist/guardrails/allowlist.js +261 -0
- package/dist/guardrails/allowlist.js.map +1 -0
- package/dist/guardrails/config.d.ts +40 -0
- package/dist/guardrails/config.d.ts.map +1 -0
- package/dist/guardrails/config.js +174 -0
- package/dist/guardrails/config.js.map +1 -0
- package/dist/guardrails/docs.d.ts +24 -0
- package/dist/guardrails/docs.d.ts.map +1 -0
- package/dist/guardrails/docs.js +138 -0
- package/dist/guardrails/docs.js.map +1 -0
- package/dist/guardrails/drift.d.ts +23 -0
- package/dist/guardrails/drift.d.ts.map +1 -0
- package/dist/guardrails/drift.js +127 -0
- package/dist/guardrails/drift.js.map +1 -0
- package/dist/guardrails/index.d.ts +19 -0
- package/dist/guardrails/index.d.ts.map +1 -0
- package/dist/guardrails/index.js +25 -0
- package/dist/guardrails/index.js.map +1 -0
- package/dist/guardrails/lint.d.ts +20 -0
- package/dist/guardrails/lint.d.ts.map +1 -0
- package/dist/guardrails/lint.js +274 -0
- package/dist/guardrails/lint.js.map +1 -0
- package/dist/guardrails/manifest.d.ts +43 -0
- package/dist/guardrails/manifest.d.ts.map +1 -0
- package/dist/guardrails/manifest.js +231 -0
- package/dist/guardrails/manifest.js.map +1 -0
- package/dist/guardrails/runner.d.ts +31 -0
- package/dist/guardrails/runner.d.ts.map +1 -0
- package/dist/guardrails/runner.js +268 -0
- package/dist/guardrails/runner.js.map +1 -0
- package/dist/guardrails/security.d.ts +31 -0
- package/dist/guardrails/security.d.ts.map +1 -0
- package/dist/guardrails/security.js +181 -0
- package/dist/guardrails/security.js.map +1 -0
- package/dist/guardrails/typecheck.d.ts +15 -0
- package/dist/guardrails/typecheck.d.ts.map +1 -0
- package/dist/guardrails/typecheck.js +104 -0
- package/dist/guardrails/typecheck.js.map +1 -0
- package/dist/guardrails/types.d.ts +196 -0
- package/dist/guardrails/types.d.ts.map +1 -0
- package/dist/guardrails/types.js +8 -0
- package/dist/guardrails/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +489 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +297 -0
- package/dist/types.js.map +1 -0
- package/docs/architecture.svg +226 -0
- package/docs/development-guardrails.md +541 -0
- package/docs/guardrails-concept.svg +252 -0
- package/docs/overlays-deep-dive.md +298 -0
- 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"}
|