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,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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"}
|