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,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript type generator from OpenAPI schemas
|
|
3
|
+
*/
|
|
4
|
+
import { isReference, getRefName } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate TypeScript type definitions from OpenAPI spec
|
|
7
|
+
*/
|
|
8
|
+
export function generateTypes(spec) {
|
|
9
|
+
const lines = [];
|
|
10
|
+
lines.push('/**');
|
|
11
|
+
lines.push(' * Auto-generated TypeScript types from OpenAPI specification');
|
|
12
|
+
lines.push(` * Generated from: ${spec.info.title} v${spec.info.version}`);
|
|
13
|
+
lines.push(' * DO NOT EDIT MANUALLY');
|
|
14
|
+
lines.push(' */');
|
|
15
|
+
lines.push('');
|
|
16
|
+
// Always include ProblemDetails (RFC 9457) for error handling
|
|
17
|
+
lines.push(generateProblemDetailsType());
|
|
18
|
+
lines.push('');
|
|
19
|
+
// Generate types from components/schemas
|
|
20
|
+
if (spec.components?.schemas) {
|
|
21
|
+
for (const [name, schema] of Object.entries(spec.components.schemas)) {
|
|
22
|
+
// Skip if already generated (e.g., ProblemDetails)
|
|
23
|
+
if (name === 'ProblemDetails')
|
|
24
|
+
continue;
|
|
25
|
+
lines.push(generateSchemaType(name, schema, spec));
|
|
26
|
+
lines.push('');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Generate request/response types from paths
|
|
30
|
+
const operationTypes = generateOperationTypes(spec);
|
|
31
|
+
if (operationTypes) {
|
|
32
|
+
lines.push('// Operation-specific types');
|
|
33
|
+
lines.push(operationTypes);
|
|
34
|
+
}
|
|
35
|
+
return lines.join('\n');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate ProblemDetails type (RFC 9457)
|
|
39
|
+
* This is always included for standardized error handling
|
|
40
|
+
*/
|
|
41
|
+
function generateProblemDetailsType() {
|
|
42
|
+
return `/**
|
|
43
|
+
* RFC 9457 Problem Details for HTTP APIs
|
|
44
|
+
* @see https://www.rfc-editor.org/rfc/rfc9457.html
|
|
45
|
+
*/
|
|
46
|
+
export interface ProblemDetails {
|
|
47
|
+
/** A URI reference that identifies the problem type */
|
|
48
|
+
type: string;
|
|
49
|
+
/** A short, human-readable summary */
|
|
50
|
+
title: string;
|
|
51
|
+
/** The HTTP status code */
|
|
52
|
+
status: number;
|
|
53
|
+
/** A human-readable explanation specific to this occurrence */
|
|
54
|
+
detail?: string;
|
|
55
|
+
/** A URI reference to the specific occurrence */
|
|
56
|
+
instance?: string;
|
|
57
|
+
/** Application-specific error code (SCREAMING_SNAKE_CASE) */
|
|
58
|
+
code?: string;
|
|
59
|
+
/** Request trace ID for debugging */
|
|
60
|
+
traceId?: string;
|
|
61
|
+
/** Detailed validation errors */
|
|
62
|
+
errors?: ValidationError[];
|
|
63
|
+
/** Additional properties */
|
|
64
|
+
[key: string]: unknown;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Validation error detail
|
|
69
|
+
*/
|
|
70
|
+
export interface ValidationError {
|
|
71
|
+
/** JSON Pointer to the invalid field */
|
|
72
|
+
pointer: string;
|
|
73
|
+
/** Error message for this field */
|
|
74
|
+
detail: string;
|
|
75
|
+
}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Generate TypeScript type for a single schema
|
|
79
|
+
*/
|
|
80
|
+
function generateSchemaType(name, schema, spec) {
|
|
81
|
+
if (isReference(schema)) {
|
|
82
|
+
const refName = getRefName(schema.$ref);
|
|
83
|
+
return `export type ${name} = ${refName};`;
|
|
84
|
+
}
|
|
85
|
+
// Handle allOf, oneOf, anyOf
|
|
86
|
+
if (schema.allOf) {
|
|
87
|
+
const types = schema.allOf.map(s => schemaToTypeString(s, spec)).join(' & ');
|
|
88
|
+
return `export type ${name} = ${types};`;
|
|
89
|
+
}
|
|
90
|
+
if (schema.oneOf) {
|
|
91
|
+
const types = schema.oneOf.map(s => schemaToTypeString(s, spec)).join(' | ');
|
|
92
|
+
return `export type ${name} = ${types};`;
|
|
93
|
+
}
|
|
94
|
+
if (schema.anyOf) {
|
|
95
|
+
const types = schema.anyOf.map(s => schemaToTypeString(s, spec)).join(' | ');
|
|
96
|
+
return `export type ${name} = ${types};`;
|
|
97
|
+
}
|
|
98
|
+
// Handle object type
|
|
99
|
+
if (schema.type === 'object' || schema.properties) {
|
|
100
|
+
return generateInterfaceType(name, schema, spec);
|
|
101
|
+
}
|
|
102
|
+
// Handle enum
|
|
103
|
+
if (schema.enum) {
|
|
104
|
+
const enumValues = schema.enum.map(v => typeof v === 'string' ? `'${v}'` : String(v)).join(' | ');
|
|
105
|
+
return `export type ${name} = ${enumValues};`;
|
|
106
|
+
}
|
|
107
|
+
// Handle array
|
|
108
|
+
if (schema.type === 'array' && schema.items) {
|
|
109
|
+
const itemType = schemaToTypeString(schema.items, spec);
|
|
110
|
+
return `export type ${name} = ${itemType}[];`;
|
|
111
|
+
}
|
|
112
|
+
// Handle primitive types
|
|
113
|
+
const tsType = primitiveToTsType(schema);
|
|
114
|
+
return `export type ${name} = ${tsType};`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generate interface type for object schema
|
|
118
|
+
*/
|
|
119
|
+
function generateInterfaceType(name, schema, spec) {
|
|
120
|
+
const lines = [];
|
|
121
|
+
const required = new Set(schema.required || []);
|
|
122
|
+
if (schema.description) {
|
|
123
|
+
lines.push(`/** ${schema.description} */`);
|
|
124
|
+
}
|
|
125
|
+
lines.push(`export interface ${name} {`);
|
|
126
|
+
if (schema.properties) {
|
|
127
|
+
for (const [propName, propSchema] of Object.entries(schema.properties)) {
|
|
128
|
+
const isRequired = required.has(propName);
|
|
129
|
+
const tsType = schemaToTypeString(propSchema, spec);
|
|
130
|
+
const optional = isRequired ? '' : '?';
|
|
131
|
+
// Add description as JSDoc if available
|
|
132
|
+
if (!isReference(propSchema) && propSchema.description) {
|
|
133
|
+
lines.push(` /** ${propSchema.description} */`);
|
|
134
|
+
}
|
|
135
|
+
lines.push(` ${propName}${optional}: ${tsType};`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Handle additionalProperties
|
|
139
|
+
if (schema.additionalProperties) {
|
|
140
|
+
if (typeof schema.additionalProperties === 'boolean') {
|
|
141
|
+
lines.push(' [key: string]: unknown;');
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const valueType = schemaToTypeString(schema.additionalProperties, spec);
|
|
145
|
+
lines.push(` [key: string]: ${valueType};`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
lines.push('}');
|
|
149
|
+
return lines.join('\n');
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Convert schema to TypeScript type string
|
|
153
|
+
*/
|
|
154
|
+
function schemaToTypeString(schema, spec) {
|
|
155
|
+
if (isReference(schema)) {
|
|
156
|
+
return getRefName(schema.$ref);
|
|
157
|
+
}
|
|
158
|
+
// Handle nullable
|
|
159
|
+
const nullable = schema.nullable ? ' | null' : '';
|
|
160
|
+
// Handle allOf, oneOf, anyOf
|
|
161
|
+
if (schema.allOf) {
|
|
162
|
+
const types = schema.allOf.map(s => schemaToTypeString(s, spec)).join(' & ');
|
|
163
|
+
return `(${types})${nullable}`;
|
|
164
|
+
}
|
|
165
|
+
if (schema.oneOf) {
|
|
166
|
+
const types = schema.oneOf.map(s => schemaToTypeString(s, spec)).join(' | ');
|
|
167
|
+
return `(${types})${nullable}`;
|
|
168
|
+
}
|
|
169
|
+
if (schema.anyOf) {
|
|
170
|
+
const types = schema.anyOf.map(s => schemaToTypeString(s, spec)).join(' | ');
|
|
171
|
+
return `(${types})${nullable}`;
|
|
172
|
+
}
|
|
173
|
+
// Handle enum
|
|
174
|
+
if (schema.enum) {
|
|
175
|
+
const enumValues = schema.enum.map(v => typeof v === 'string' ? `'${v}'` : String(v)).join(' | ');
|
|
176
|
+
return `(${enumValues})${nullable}`;
|
|
177
|
+
}
|
|
178
|
+
// Handle array
|
|
179
|
+
if (schema.type === 'array' && schema.items) {
|
|
180
|
+
const itemType = schemaToTypeString(schema.items, spec);
|
|
181
|
+
// Wrap item type in parentheses if it contains union types
|
|
182
|
+
const wrappedItemType = itemType.includes(' | ') || itemType.includes(' & ')
|
|
183
|
+
? `(${itemType})`
|
|
184
|
+
: itemType;
|
|
185
|
+
return `${wrappedItemType}[]${nullable}`;
|
|
186
|
+
}
|
|
187
|
+
// Handle object with inline properties
|
|
188
|
+
if (schema.type === 'object' || schema.properties) {
|
|
189
|
+
if (!schema.properties) {
|
|
190
|
+
if (schema.additionalProperties) {
|
|
191
|
+
if (typeof schema.additionalProperties === 'boolean') {
|
|
192
|
+
return `Record<string, unknown>${nullable}`;
|
|
193
|
+
}
|
|
194
|
+
const valueType = schemaToTypeString(schema.additionalProperties, spec);
|
|
195
|
+
return `Record<string, ${valueType}>${nullable}`;
|
|
196
|
+
}
|
|
197
|
+
return `Record<string, unknown>${nullable}`;
|
|
198
|
+
}
|
|
199
|
+
// Inline object - generate inline type
|
|
200
|
+
const props = [];
|
|
201
|
+
const required = new Set(schema.required || []);
|
|
202
|
+
for (const [propName, propSchema] of Object.entries(schema.properties)) {
|
|
203
|
+
const isRequired = required.has(propName);
|
|
204
|
+
const tsType = schemaToTypeString(propSchema, spec);
|
|
205
|
+
const optional = isRequired ? '' : '?';
|
|
206
|
+
props.push(`${propName}${optional}: ${tsType}`);
|
|
207
|
+
}
|
|
208
|
+
return `{ ${props.join('; ')} }${nullable}`;
|
|
209
|
+
}
|
|
210
|
+
// Handle primitive types
|
|
211
|
+
return primitiveToTsType(schema) + nullable;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Convert primitive OpenAPI type to TypeScript type
|
|
215
|
+
*/
|
|
216
|
+
function primitiveToTsType(schema) {
|
|
217
|
+
switch (schema.type) {
|
|
218
|
+
case 'string':
|
|
219
|
+
if (schema.format === 'date' || schema.format === 'date-time') {
|
|
220
|
+
return 'string'; // Keep as string, not Date
|
|
221
|
+
}
|
|
222
|
+
return 'string';
|
|
223
|
+
case 'integer':
|
|
224
|
+
case 'number':
|
|
225
|
+
return 'number';
|
|
226
|
+
case 'boolean':
|
|
227
|
+
return 'boolean';
|
|
228
|
+
case 'null':
|
|
229
|
+
return 'null';
|
|
230
|
+
default:
|
|
231
|
+
return 'unknown';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Generate a valid TypeScript identifier from domain and method
|
|
236
|
+
* e.g., "DashboardDomain" + "getSchema" -> "DashboardDomain_getSchema"
|
|
237
|
+
*/
|
|
238
|
+
function getOperationTypeName(operation) {
|
|
239
|
+
const domain = operation['x-micro-contracts-domain'];
|
|
240
|
+
const method = operation['x-micro-contracts-method'];
|
|
241
|
+
if (domain && method) {
|
|
242
|
+
// Use x-micro-contracts-domain + _ + x-micro-contracts-method for type name
|
|
243
|
+
return `${domain}_${method}`;
|
|
244
|
+
}
|
|
245
|
+
// Fallback: sanitize operationId (replace dots with underscores, etc.)
|
|
246
|
+
if (operation.operationId) {
|
|
247
|
+
return operation.operationId.replace(/[^a-zA-Z0-9]/g, '_');
|
|
248
|
+
}
|
|
249
|
+
return 'Unknown';
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Generate parameter types for operations
|
|
253
|
+
*/
|
|
254
|
+
function generateOperationTypes(spec) {
|
|
255
|
+
const lines = [];
|
|
256
|
+
const generatedTypes = new Set();
|
|
257
|
+
for (const [path, pathItem] of Object.entries(spec.paths)) {
|
|
258
|
+
for (const method of ['get', 'post', 'put', 'patch', 'delete']) {
|
|
259
|
+
const operation = pathItem[method];
|
|
260
|
+
if (!operation)
|
|
261
|
+
continue;
|
|
262
|
+
const baseTypeName = getOperationTypeName(operation);
|
|
263
|
+
// Collect all parameters (path + query) into a single Params type
|
|
264
|
+
const allParams = (operation.parameters || []).filter((p) => !isReference(p) && (p.in === 'query' || p.in === 'path'));
|
|
265
|
+
let paramsTypeName;
|
|
266
|
+
if (allParams.length > 0) {
|
|
267
|
+
paramsTypeName = `${baseTypeName}Params`;
|
|
268
|
+
if (!generatedTypes.has(paramsTypeName)) {
|
|
269
|
+
generatedTypes.add(paramsTypeName);
|
|
270
|
+
lines.push(generateParamsType(paramsTypeName, allParams, spec));
|
|
271
|
+
lines.push('');
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Get request body type name
|
|
275
|
+
let bodyTypeName;
|
|
276
|
+
if (operation.requestBody) {
|
|
277
|
+
if (isReference(operation.requestBody)) {
|
|
278
|
+
// Referenced request body - extract name
|
|
279
|
+
bodyTypeName = getRefName(operation.requestBody.$ref);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
const content = operation.requestBody.content?.['application/json'];
|
|
283
|
+
if (content?.schema) {
|
|
284
|
+
if (isReference(content.schema)) {
|
|
285
|
+
bodyTypeName = getRefName(content.schema.$ref);
|
|
286
|
+
}
|
|
287
|
+
else if (content.schema.properties || content.schema.type === 'object') {
|
|
288
|
+
// Generate inline body type
|
|
289
|
+
bodyTypeName = `${baseTypeName}Body`;
|
|
290
|
+
if (!generatedTypes.has(bodyTypeName)) {
|
|
291
|
+
generatedTypes.add(bodyTypeName);
|
|
292
|
+
lines.push(generateRequestBodyType(bodyTypeName, content.schema, spec));
|
|
293
|
+
lines.push('');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Generate Input type that combines params and body
|
|
300
|
+
// - params are flattened (path + query combined)
|
|
301
|
+
// - body becomes 'data' (not HTTP-specific)
|
|
302
|
+
// - Always generate (empty object for parameterless operations)
|
|
303
|
+
const inputTypeName = `${baseTypeName}Input`;
|
|
304
|
+
if (!generatedTypes.has(inputTypeName)) {
|
|
305
|
+
generatedTypes.add(inputTypeName);
|
|
306
|
+
lines.push(generateInputType(inputTypeName, paramsTypeName, bodyTypeName));
|
|
307
|
+
lines.push('');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return lines.join('\n');
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Generate Input type that combines params and body
|
|
315
|
+
* - params (path + query) are flattened (HTTP details hidden)
|
|
316
|
+
* - body is renamed to 'data' (not HTTP-specific naming)
|
|
317
|
+
* - parameterless operations get empty object type
|
|
318
|
+
*
|
|
319
|
+
* Examples:
|
|
320
|
+
* - No params: type Input = Record<string, never>; (empty object)
|
|
321
|
+
* - Params only: type Input = Params;
|
|
322
|
+
* - Body only: type Input = { data: Body };
|
|
323
|
+
* - Params + Body: type Input = Params & { data: Body };
|
|
324
|
+
*/
|
|
325
|
+
function generateInputType(name, paramsType, bodyType) {
|
|
326
|
+
const parts = [];
|
|
327
|
+
// Flatten params (path + query parameters become direct properties)
|
|
328
|
+
if (paramsType) {
|
|
329
|
+
parts.push(paramsType);
|
|
330
|
+
}
|
|
331
|
+
// Body becomes 'data' property (not HTTP-specific naming)
|
|
332
|
+
if (bodyType) {
|
|
333
|
+
parts.push(`{ data: ${bodyType} }`);
|
|
334
|
+
}
|
|
335
|
+
// Generate type alias
|
|
336
|
+
if (parts.length === 0) {
|
|
337
|
+
// Parameterless operation: empty object type
|
|
338
|
+
return `export type ${name} = Record<string, never>;`;
|
|
339
|
+
}
|
|
340
|
+
else if (parts.length === 1) {
|
|
341
|
+
return `export type ${name} = ${parts[0]};`;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
return `export type ${name} = ${parts.join(' & ')};`;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Generate request body interface
|
|
349
|
+
*/
|
|
350
|
+
function generateRequestBodyType(name, schema, spec) {
|
|
351
|
+
const lines = [];
|
|
352
|
+
lines.push(`export interface ${name} {`);
|
|
353
|
+
if (schema.properties) {
|
|
354
|
+
const required = new Set(schema.required || []);
|
|
355
|
+
for (const [propName, propSchema] of Object.entries(schema.properties)) {
|
|
356
|
+
const isRequired = required.has(propName);
|
|
357
|
+
const optional = isRequired ? '' : '?';
|
|
358
|
+
const tsType = schemaToTypeString(propSchema, spec);
|
|
359
|
+
if (isReference(propSchema)) {
|
|
360
|
+
// No description for refs
|
|
361
|
+
}
|
|
362
|
+
else if (propSchema.description) {
|
|
363
|
+
lines.push(` /** ${propSchema.description} */`);
|
|
364
|
+
}
|
|
365
|
+
lines.push(` ${propName}${optional}: ${tsType};`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
lines.push('}');
|
|
369
|
+
return lines.join('\n');
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Generate params interface (combines path + query parameters)
|
|
373
|
+
*/
|
|
374
|
+
function generateParamsType(name, params, spec) {
|
|
375
|
+
const lines = [];
|
|
376
|
+
lines.push(`export interface ${name} {`);
|
|
377
|
+
for (const param of params) {
|
|
378
|
+
const optional = param.required ? '' : '?';
|
|
379
|
+
let tsType = 'unknown';
|
|
380
|
+
if (param.schema) {
|
|
381
|
+
tsType = schemaToTypeString(param.schema, spec);
|
|
382
|
+
}
|
|
383
|
+
if (param.description) {
|
|
384
|
+
lines.push(` /** ${param.description} */`);
|
|
385
|
+
}
|
|
386
|
+
// Use OpenAPI parameter name as-is (quoted for names with special chars)
|
|
387
|
+
lines.push(` '${param.name}'${optional}: ${tsType};`);
|
|
388
|
+
}
|
|
389
|
+
lines.push('}');
|
|
390
|
+
return lines.join('\n');
|
|
391
|
+
}
|
|
392
|
+
function capitalize(str) {
|
|
393
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=typeGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeGenerator.js","sourceRoot":"","sources":["../../src/generator/typeGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allowlist verification for guardrails
|
|
3
|
+
*
|
|
4
|
+
* Verifies that changed files are within allowed boundaries.
|
|
5
|
+
*/
|
|
6
|
+
import type { GuardrailsConfig, AllowlistResult, CheckResult, CheckOptions } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Simple glob pattern matching with negation support
|
|
9
|
+
* Patterns are evaluated top-to-bottom; last match wins.
|
|
10
|
+
* - "!pattern" → if matched, result becomes false (exclude)
|
|
11
|
+
* - "pattern" → if matched, result becomes true (include)
|
|
12
|
+
*/
|
|
13
|
+
export declare function matchWithNegation(patterns: string[] | undefined, file: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Simple glob pattern matching
|
|
16
|
+
* Supports:
|
|
17
|
+
* - * matches any characters except /
|
|
18
|
+
* - ** matches any characters including / (zero or more path segments)
|
|
19
|
+
* - ? matches single character
|
|
20
|
+
*/
|
|
21
|
+
export declare function matchGlob(file: string, pattern: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Get list of changed files, filtered to a specific base directory
|
|
24
|
+
*/
|
|
25
|
+
export declare function getChangedFiles(options: {
|
|
26
|
+
/** Path to file containing list of changed files */
|
|
27
|
+
changedFilesPath?: string;
|
|
28
|
+
/** Base ref for git diff (default: HEAD) */
|
|
29
|
+
baseRef?: string;
|
|
30
|
+
/** Base directory to filter files (only files under this dir are returned) */
|
|
31
|
+
baseDir?: string;
|
|
32
|
+
}): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Verify changed files against allowlist
|
|
35
|
+
*/
|
|
36
|
+
export declare function verifyAllowlist(changedFiles: string[], config: GuardrailsConfig): AllowlistResult;
|
|
37
|
+
/**
|
|
38
|
+
* Run allowlist check
|
|
39
|
+
*/
|
|
40
|
+
export declare function runAllowlistCheck(options: CheckOptions): Promise<CheckResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Format allowlist result for CLI output
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatAllowlistResult(result: AllowlistResult): string;
|
|
45
|
+
//# sourceMappingURL=allowlist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowlist.d.ts","sourceRoot":"","sources":["../../src/guardrails/allowlist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAsB,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGnH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAgBvF;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAMhE;AA8DD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,EAAE,CA2DX;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,gBAAgB,GACvB,eAAe,CA2BjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAyDnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiBrE"}
|