@specferret/core 0.8.0 → 0.9.2
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/README.md +2 -2
- package/dist/extractor/typescript.d.ts.map +1 -1
- package/dist/extractor/typescript.js +291 -19
- package/dist/extractor/typescript.js.map +1 -1
- package/dist/extractor/validator.js +2 -2
- package/package.json +2 -2
- package/src/extractor/__fixtures__/typescript/unions.golden.json +3 -6
- package/src/extractor/typescript.test.ts +106 -36
- package/src/extractor/typescript.ts +347 -23
- package/src/extractor/validator.ts +2 -2
package/README.md
CHANGED
|
@@ -44,7 +44,7 @@ Core behavior is validated through the Sprint 5 external branch-matrix harness (
|
|
|
44
44
|
|
|
45
45
|
Latest green runs:
|
|
46
46
|
|
|
47
|
-
- spec-kit: https://github.com/BenGardiner123/
|
|
47
|
+
- spec-kit: https://github.com/BenGardiner123/specferret-validation-spec-kit/actions/runs/23962649755
|
|
48
48
|
- BMAD: https://github.com/BenGardiner123/specferret-validation-bmad/actions/runs/23962652352
|
|
49
49
|
|
|
50
50
|
## Looking for the CLI?
|
|
@@ -57,6 +57,6 @@ bun install -g @specferret/cli
|
|
|
57
57
|
|
|
58
58
|
## Links
|
|
59
59
|
|
|
60
|
-
- Source: https://github.com/BenGardiner123/
|
|
60
|
+
- Source: https://github.com/BenGardiner123/specferret
|
|
61
61
|
- Docs: https://specferret.dev
|
|
62
62
|
- CLI package: https://www.npmjs.com/package/@specferret/cli
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/extractor/typescript.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,kGAAkG;IAClG,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sHAAsH;IACtH,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/extractor/typescript.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,kGAAkG;IAClG,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sHAAsH;IACtH,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA+0BD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,0BAA0B,CAkE5G"}
|
|
@@ -111,7 +111,10 @@ function collectExportedDeclarations(root) {
|
|
|
111
111
|
if (node.type !== 'export_statement') {
|
|
112
112
|
continue;
|
|
113
113
|
}
|
|
114
|
-
|
|
114
|
+
// Function declarations are intentionally NOT extracted: a function
|
|
115
|
+
// signature carries no data shape worth contracting (the Week-1 reality
|
|
116
|
+
// test produced empty params/returns husks from every real repo).
|
|
117
|
+
const declaration = node.namedChildren.find((child) => ['interface_declaration', 'type_alias_declaration', 'enum_declaration'].includes(child.type));
|
|
115
118
|
if (!declaration) {
|
|
116
119
|
continue;
|
|
117
120
|
}
|
|
@@ -128,17 +131,245 @@ function collectExportedDeclarations(root) {
|
|
|
128
131
|
declarations.push({ kind: 'type', symbol, node: declaration });
|
|
129
132
|
continue;
|
|
130
133
|
}
|
|
131
|
-
|
|
132
|
-
declarations.push({ kind: 'enum', symbol, node: declaration });
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
declarations.push({ kind: 'function', symbol, node: declaration });
|
|
134
|
+
declarations.push({ kind: 'enum', symbol, node: declaration });
|
|
136
135
|
}
|
|
137
136
|
return declarations;
|
|
138
137
|
}
|
|
139
138
|
function findChildByType(node, types) {
|
|
140
139
|
return node.namedChildren.find((child) => types.includes(child.type)) ?? null;
|
|
141
140
|
}
|
|
141
|
+
// Set per extraction call in extractContractsFromTypeScript. Module-level so
|
|
142
|
+
// the deeply recursive parse functions don't all need a threaded parameter;
|
|
143
|
+
// extraction is synchronous, so there is no re-entrancy.
|
|
144
|
+
let currentContext = { locals: new Map(), zodSchemas: new Map(), constLiterals: new Map(), resolving: new Set() };
|
|
145
|
+
function literalToSchema(node) {
|
|
146
|
+
if (!node)
|
|
147
|
+
return null;
|
|
148
|
+
// Unwrap `"3.0" as const` / `"3.0" satisfies X`.
|
|
149
|
+
if (node.type === 'as_expression' || node.type === 'satisfies_expression') {
|
|
150
|
+
return literalToSchema(node.namedChildren[0] ?? null);
|
|
151
|
+
}
|
|
152
|
+
if (node.type === 'string')
|
|
153
|
+
return { type: 'string', enum: [node.text.slice(1, -1)] };
|
|
154
|
+
if (node.type === 'number')
|
|
155
|
+
return { type: 'number', enum: [Number(node.text)] };
|
|
156
|
+
if (node.type === 'true' || node.type === 'false')
|
|
157
|
+
return { type: 'boolean', enum: [node.type === 'true'] };
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function collectResolutionContext(root) {
|
|
161
|
+
const locals = new Map();
|
|
162
|
+
const zodSchemas = new Map();
|
|
163
|
+
const constLiterals = new Map();
|
|
164
|
+
for (const child of root.namedChildren) {
|
|
165
|
+
const candidates = child.type === 'export_statement' ? child.namedChildren : [child];
|
|
166
|
+
for (const decl of candidates) {
|
|
167
|
+
if (decl.type === 'interface_declaration' || decl.type === 'type_alias_declaration' || decl.type === 'enum_declaration') {
|
|
168
|
+
const symbol = getIdentifierText(decl.childForFieldName('name'));
|
|
169
|
+
if (symbol) {
|
|
170
|
+
const kind = decl.type === 'interface_declaration' ? 'interface' : decl.type === 'type_alias_declaration' ? 'type' : 'enum';
|
|
171
|
+
locals.set(symbol, { kind, node: decl });
|
|
172
|
+
}
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (decl.type === 'lexical_declaration' || decl.type === 'variable_declaration') {
|
|
176
|
+
for (const declarator of decl.namedChildren.filter((c) => c.type === 'variable_declarator')) {
|
|
177
|
+
const symbol = getIdentifierText(declarator.childForFieldName('name'));
|
|
178
|
+
const value = declarator.childForFieldName('value');
|
|
179
|
+
if (!symbol || !value)
|
|
180
|
+
continue;
|
|
181
|
+
if (value.type === 'call_expression') {
|
|
182
|
+
zodSchemas.set(symbol, value);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const literal = literalToSchema(value);
|
|
186
|
+
if (literal) {
|
|
187
|
+
constLiterals.set(symbol, literal);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return { locals, zodSchemas, constLiterals, resolving: new Set() };
|
|
194
|
+
}
|
|
195
|
+
function resolveLocalType(name, filePath, symbol, diagnostics) {
|
|
196
|
+
const local = currentContext.locals.get(name);
|
|
197
|
+
if (!local)
|
|
198
|
+
return null;
|
|
199
|
+
if (currentContext.resolving.has(name)) {
|
|
200
|
+
diagnostics.push(`${filePath} (${symbol}): Circular type reference '${name}'. Falling back to object.`);
|
|
201
|
+
return { type: 'object' };
|
|
202
|
+
}
|
|
203
|
+
currentContext.resolving.add(name);
|
|
204
|
+
try {
|
|
205
|
+
if (local.kind === 'interface') {
|
|
206
|
+
const body = local.node.childForFieldName('body') ?? findChildByType(local.node, ['interface_body']);
|
|
207
|
+
return body ? parseObjectShape(filePath, symbol, body, diagnostics) : { type: 'object' };
|
|
208
|
+
}
|
|
209
|
+
if (local.kind === 'enum') {
|
|
210
|
+
return parseEnumShape(local.node);
|
|
211
|
+
}
|
|
212
|
+
const valueNode = local.node.childForFieldName('value') ?? local.node.namedChildren.at(-1);
|
|
213
|
+
return valueNode ? parseTypeNode(filePath, symbol, valueNode, diagnostics) : { type: 'object' };
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
currentContext.resolving.delete(name);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function zodChainCalls(node) {
|
|
220
|
+
const calls = [];
|
|
221
|
+
let current = node;
|
|
222
|
+
while (current && current.type === 'call_expression') {
|
|
223
|
+
const fn = current.childForFieldName('function');
|
|
224
|
+
if (!fn || fn.type !== 'member_expression')
|
|
225
|
+
return null;
|
|
226
|
+
const property = fn.childForFieldName('property');
|
|
227
|
+
if (!property)
|
|
228
|
+
return null;
|
|
229
|
+
calls.unshift({ name: property.text, args: current.childForFieldName('arguments') });
|
|
230
|
+
current = fn.childForFieldName('object');
|
|
231
|
+
}
|
|
232
|
+
if (!current || current.type !== 'identifier')
|
|
233
|
+
return null;
|
|
234
|
+
return { rootName: current.text, calls };
|
|
235
|
+
}
|
|
236
|
+
function firstArgument(args) {
|
|
237
|
+
return args?.namedChildren[0] ?? null;
|
|
238
|
+
}
|
|
239
|
+
function zodBaseToSchema(name, args, filePath, symbol, diagnostics) {
|
|
240
|
+
switch (name) {
|
|
241
|
+
case 'string':
|
|
242
|
+
case 'uuid':
|
|
243
|
+
case 'email':
|
|
244
|
+
case 'url':
|
|
245
|
+
return { schema: { type: 'string' }, optional: false };
|
|
246
|
+
case 'number':
|
|
247
|
+
case 'int':
|
|
248
|
+
case 'bigint':
|
|
249
|
+
return { schema: { type: 'number' }, optional: false };
|
|
250
|
+
case 'boolean':
|
|
251
|
+
return { schema: { type: 'boolean' }, optional: false };
|
|
252
|
+
case 'date':
|
|
253
|
+
return { schema: { type: 'string', format: 'date-time' }, optional: false };
|
|
254
|
+
case 'null':
|
|
255
|
+
return { schema: { type: 'null' }, optional: false };
|
|
256
|
+
case 'literal': {
|
|
257
|
+
const value = firstArgument(args);
|
|
258
|
+
if (value?.type === 'string')
|
|
259
|
+
return { schema: { type: 'string', enum: [value.text.slice(1, -1)] }, optional: false };
|
|
260
|
+
if (value?.type === 'number')
|
|
261
|
+
return { schema: { type: 'number', enum: [Number(value.text)] }, optional: false };
|
|
262
|
+
if (value?.type === 'true' || value?.type === 'false') {
|
|
263
|
+
return { schema: { type: 'boolean', enum: [value.type === 'true'] }, optional: false };
|
|
264
|
+
}
|
|
265
|
+
return { schema: { type: 'object' }, optional: false };
|
|
266
|
+
}
|
|
267
|
+
case 'enum': {
|
|
268
|
+
const arrayArg = firstArgument(args);
|
|
269
|
+
const values = (arrayArg?.namedChildren ?? []).filter((c) => c.type === 'string').map((c) => c.text.slice(1, -1));
|
|
270
|
+
return { schema: { type: 'string', enum: values }, optional: false };
|
|
271
|
+
}
|
|
272
|
+
case 'array': {
|
|
273
|
+
const item = firstArgument(args);
|
|
274
|
+
const converted = item ? zodExpressionToSchema(item, filePath, symbol, diagnostics) : null;
|
|
275
|
+
return { schema: { type: 'array', items: converted?.schema ?? { type: 'object' } }, optional: false };
|
|
276
|
+
}
|
|
277
|
+
case 'optional': {
|
|
278
|
+
const inner = firstArgument(args);
|
|
279
|
+
const converted = inner ? zodExpressionToSchema(inner, filePath, symbol, diagnostics) : null;
|
|
280
|
+
return { schema: converted?.schema ?? { type: 'object' }, optional: true };
|
|
281
|
+
}
|
|
282
|
+
case 'object': {
|
|
283
|
+
const objectLiteral = firstArgument(args);
|
|
284
|
+
if (!objectLiteral || objectLiteral.type !== 'object') {
|
|
285
|
+
diagnostics.push(`${filePath} (${symbol}): z.object without an inline object literal. Falling back to object.`);
|
|
286
|
+
return { schema: { type: 'object' }, optional: false };
|
|
287
|
+
}
|
|
288
|
+
const properties = {};
|
|
289
|
+
const required = [];
|
|
290
|
+
for (const pair of objectLiteral.namedChildren) {
|
|
291
|
+
if (pair.type !== 'pair')
|
|
292
|
+
continue;
|
|
293
|
+
const keyNode = pair.childForFieldName('key');
|
|
294
|
+
const key = getIdentifierText(keyNode) ?? keyNode?.text?.replace(/^['"]|['"]$/g, '');
|
|
295
|
+
const valueNode = pair.childForFieldName('value');
|
|
296
|
+
if (!key || !valueNode)
|
|
297
|
+
continue;
|
|
298
|
+
const converted = zodExpressionToSchema(valueNode, filePath, symbol, diagnostics);
|
|
299
|
+
properties[key] = converted.schema;
|
|
300
|
+
if (!converted.optional)
|
|
301
|
+
required.push(key);
|
|
302
|
+
}
|
|
303
|
+
return { schema: { type: 'object', properties, required }, optional: false };
|
|
304
|
+
}
|
|
305
|
+
default:
|
|
306
|
+
diagnostics.push(`${filePath} (${symbol}): Unsupported zod combinator 'z.${name}'. Falling back to object.`);
|
|
307
|
+
return { schema: { type: 'object' }, optional: false };
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function applyZodModifier(conversion, name) {
|
|
311
|
+
if (name === 'optional' || name === 'nullish' || name === 'default' || name === 'catch') {
|
|
312
|
+
return { ...conversion, optional: true };
|
|
313
|
+
}
|
|
314
|
+
if (name === 'array') {
|
|
315
|
+
return { schema: { type: 'array', items: conversion.schema }, optional: conversion.optional };
|
|
316
|
+
}
|
|
317
|
+
// Everything else (.min, .max, .email, .regex, .int, .nullable, .describe,
|
|
318
|
+
// .trim, .brand, …) refines values without changing the JSON shape.
|
|
319
|
+
return conversion;
|
|
320
|
+
}
|
|
321
|
+
function zodExpressionToSchema(node, filePath, symbol, diagnostics) {
|
|
322
|
+
// Bare reference to another top-level schema const: `user: UserSchema`
|
|
323
|
+
if (node.type === 'identifier') {
|
|
324
|
+
return resolveZodSchemaReference(node.text, filePath, symbol, diagnostics);
|
|
325
|
+
}
|
|
326
|
+
if (node.type !== 'call_expression') {
|
|
327
|
+
diagnostics.push(`${filePath} (${symbol}): Unsupported zod expression '${node.type}'. Falling back to object.`);
|
|
328
|
+
return { schema: { type: 'object' }, optional: false };
|
|
329
|
+
}
|
|
330
|
+
const chain = zodChainCalls(node);
|
|
331
|
+
if (!chain) {
|
|
332
|
+
diagnostics.push(`${filePath} (${symbol}): Unrecognized zod call chain. Falling back to object.`);
|
|
333
|
+
return { schema: { type: 'object' }, optional: false };
|
|
334
|
+
}
|
|
335
|
+
let conversion;
|
|
336
|
+
let modifierStart;
|
|
337
|
+
if (chain.rootName === 'z') {
|
|
338
|
+
if (chain.calls.length === 0) {
|
|
339
|
+
return { schema: { type: 'object' }, optional: false };
|
|
340
|
+
}
|
|
341
|
+
conversion = zodBaseToSchema(chain.calls[0].name, chain.calls[0].args, filePath, symbol, diagnostics);
|
|
342
|
+
modifierStart = 1;
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
// `UserSchema.optional()` — chain rooted on another schema const.
|
|
346
|
+
conversion = resolveZodSchemaReference(chain.rootName, filePath, symbol, diagnostics);
|
|
347
|
+
modifierStart = 0;
|
|
348
|
+
}
|
|
349
|
+
for (const call of chain.calls.slice(modifierStart)) {
|
|
350
|
+
conversion = applyZodModifier(conversion, call.name);
|
|
351
|
+
}
|
|
352
|
+
return conversion;
|
|
353
|
+
}
|
|
354
|
+
function resolveZodSchemaReference(name, filePath, symbol, diagnostics) {
|
|
355
|
+
const target = currentContext.zodSchemas.get(name);
|
|
356
|
+
if (!target) {
|
|
357
|
+
diagnostics.push(`${filePath} (${symbol}): Schema reference '${name}' is not a top-level const in this file. Falling back to object.`);
|
|
358
|
+
return { schema: { type: 'object' }, optional: false };
|
|
359
|
+
}
|
|
360
|
+
const guardKey = `zod:${name}`;
|
|
361
|
+
if (currentContext.resolving.has(guardKey)) {
|
|
362
|
+
diagnostics.push(`${filePath} (${symbol}): Circular schema reference '${name}'. Falling back to object.`);
|
|
363
|
+
return { schema: { type: 'object' }, optional: false };
|
|
364
|
+
}
|
|
365
|
+
currentContext.resolving.add(guardKey);
|
|
366
|
+
try {
|
|
367
|
+
return zodExpressionToSchema(target, filePath, symbol, diagnostics);
|
|
368
|
+
}
|
|
369
|
+
finally {
|
|
370
|
+
currentContext.resolving.delete(guardKey);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
142
373
|
function parseTypeNode(filePath, symbol, node, diagnostics) {
|
|
143
374
|
if (node.type === 'type_annotation') {
|
|
144
375
|
const inner = node.namedChildren[0];
|
|
@@ -154,9 +385,46 @@ function parseTypeNode(filePath, symbol, node, diagnostics) {
|
|
|
154
385
|
if (node.text === 'Date') {
|
|
155
386
|
return { type: 'string', format: 'date-time' };
|
|
156
387
|
}
|
|
388
|
+
// Follow references to interfaces/aliases/enums declared in this file.
|
|
389
|
+
const resolved = resolveLocalType(node.text, filePath, symbol, diagnostics);
|
|
390
|
+
if (resolved !== null) {
|
|
391
|
+
return resolved;
|
|
392
|
+
}
|
|
157
393
|
diagnostics.push(`${filePath} (${symbol}): Unsupported referenced type '${node.text}'. Falling back to object.`);
|
|
158
394
|
return { type: 'object' };
|
|
159
395
|
}
|
|
396
|
+
if (node.type === 'type_query') {
|
|
397
|
+
// `typeof CONST` where CONST is a top-level literal const resolves to that
|
|
398
|
+
// literal's enum schema (`const V = "3.0" as const` → string enum ["3.0"]).
|
|
399
|
+
const reference = node.namedChildren[0];
|
|
400
|
+
if (reference && ['identifier', 'type_identifier'].includes(reference.type)) {
|
|
401
|
+
const literal = currentContext.constLiterals.get(reference.text);
|
|
402
|
+
if (literal) {
|
|
403
|
+
return literal;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
diagnostics.push(`${filePath} (${symbol}): Unsupported node type 'type_query'. Falling back to object.`);
|
|
407
|
+
return { type: 'object' };
|
|
408
|
+
}
|
|
409
|
+
if (node.type === 'generic_type') {
|
|
410
|
+
const nameNode = node.childForFieldName('name') ?? node.namedChildren[0];
|
|
411
|
+
const nameText = nameNode?.text ?? '';
|
|
412
|
+
const typeArguments = findChildByType(node, ['type_arguments']);
|
|
413
|
+
const firstTypeArgument = typeArguments?.namedChildren[0] ?? null;
|
|
414
|
+
if (nameText === 'Array' && firstTypeArgument) {
|
|
415
|
+
return { type: 'array', items: parseTypeNode(filePath, symbol, firstTypeArgument, diagnostics) };
|
|
416
|
+
}
|
|
417
|
+
// z.infer<typeof Schema> / z.input / z.output — resolve the referenced
|
|
418
|
+
// top-level zod const statically instead of collapsing to object.
|
|
419
|
+
if (['z.infer', 'z.input', 'z.output', 'z.TypeOf', 'TypeOf'].includes(nameText) && firstTypeArgument?.type === 'type_query') {
|
|
420
|
+
const reference = firstTypeArgument.namedChildren[0];
|
|
421
|
+
if (reference && ['identifier', 'type_identifier'].includes(reference.type)) {
|
|
422
|
+
return resolveZodSchemaReference(reference.text, filePath, symbol, diagnostics).schema;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
diagnostics.push(`${filePath} (${symbol}): Unsupported node type 'generic_type'. Falling back to object.`);
|
|
426
|
+
return { type: 'object' };
|
|
427
|
+
}
|
|
160
428
|
if (node.type === 'array_type') {
|
|
161
429
|
const element = node.namedChildren[0];
|
|
162
430
|
if (!element) {
|
|
@@ -169,6 +437,20 @@ function parseTypeNode(filePath, symbol, node, diagnostics) {
|
|
|
169
437
|
};
|
|
170
438
|
}
|
|
171
439
|
if (node.type === 'union_type') {
|
|
440
|
+
// `a | b | c` parses as nested binary unions — flatten before analysis.
|
|
441
|
+
const flattenUnion = (n) => n.type === 'union_type' ? n.namedChildren.flatMap(flattenUnion) : [n];
|
|
442
|
+
const members = flattenUnion(node).filter((child) => child.type !== 'comment');
|
|
443
|
+
const nonNullMembers = members.filter((member) => member.text !== 'null' && member.text !== 'undefined');
|
|
444
|
+
// Nullable unions (T | null, T | undefined) unwrap to T — the dominant
|
|
445
|
+
// real-world union shape.
|
|
446
|
+
if (nonNullMembers.length === 1) {
|
|
447
|
+
return parseTypeNode(filePath, symbol, nonNullMembers[0], diagnostics);
|
|
448
|
+
}
|
|
449
|
+
// Pure string-literal unions become enums: 'admin' | 'viewer' | 'user'.
|
|
450
|
+
const literalStrings = nonNullMembers.map((member) => member.type === 'literal_type' && member.namedChildren[0]?.type === 'string' ? member.namedChildren[0].text.slice(1, -1) : null);
|
|
451
|
+
if (nonNullMembers.length > 0 && literalStrings.every((value) => value !== null)) {
|
|
452
|
+
return { type: 'string', enum: literalStrings };
|
|
453
|
+
}
|
|
172
454
|
diagnostics.push(`${filePath} (${symbol}): Union types are not supported in extraction. Falling back to object.`);
|
|
173
455
|
return { type: 'object' };
|
|
174
456
|
}
|
|
@@ -364,19 +646,7 @@ function parseDeclarationShape(filePath, declaration, diagnostics) {
|
|
|
364
646
|
}
|
|
365
647
|
return parseTypeNode(filePath, declaration.symbol, valueNode, diagnostics);
|
|
366
648
|
}
|
|
367
|
-
|
|
368
|
-
return parseEnumShape(declaration.node);
|
|
369
|
-
}
|
|
370
|
-
const parameters = declaration.node.childForFieldName('parameters');
|
|
371
|
-
const returnType = declaration.node.childForFieldName('return_type');
|
|
372
|
-
return {
|
|
373
|
-
type: 'object',
|
|
374
|
-
properties: {
|
|
375
|
-
params: parseParametersShape(filePath, declaration.symbol, parameters, diagnostics),
|
|
376
|
-
returns: returnType ? parseTypeNode(filePath, declaration.symbol, returnType, diagnostics) : { type: 'object' },
|
|
377
|
-
},
|
|
378
|
-
required: ['params', 'returns'],
|
|
379
|
-
};
|
|
649
|
+
return parseEnumShape(declaration.node);
|
|
380
650
|
}
|
|
381
651
|
function parseAnnotations(content) {
|
|
382
652
|
const contractTypePattern = CONTRACT_TYPES.join('|');
|
|
@@ -423,6 +693,8 @@ export function extractContractsFromTypeScript(filePath, content) {
|
|
|
423
693
|
if (tree.rootNode.hasError) {
|
|
424
694
|
diagnostics.push(`${filePath}: Tree-sitter detected syntax errors; extraction may be partial.`);
|
|
425
695
|
}
|
|
696
|
+
// Fresh per-file resolution context (local declarations + zod schema consts).
|
|
697
|
+
currentContext = collectResolutionContext(tree.rootNode);
|
|
426
698
|
const declarations = collectExportedDeclarations(tree.rootNode);
|
|
427
699
|
for (const declaration of declarations) {
|
|
428
700
|
const shape = parseDeclarationShape(filePath, declaration, diagnostics);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/extractor/typescript.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/extractor/typescript.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export function validateContractType(contractType, filePath) {
|
|
|
13
13
|
/**
|
|
14
14
|
* JSON Schema keywords that are explicitly NOT supported by Ferret.
|
|
15
15
|
* If any appear in a schema, a warning is emitted but the schema is still accepted.
|
|
16
|
-
* See:
|
|
16
|
+
* See: docs/CONTRACT-SCHEMA.md — Part 3
|
|
17
17
|
*/
|
|
18
18
|
const UNSUPPORTED_KEYWORDS = [
|
|
19
19
|
'$ref',
|
|
@@ -44,7 +44,7 @@ export function validateFerretSchema(shape, filePath) {
|
|
|
44
44
|
if (serialised.includes(`"${keyword}"`)) {
|
|
45
45
|
warnings.push(`⚠ Unsupported JSON Schema keyword: ${keyword} in ${filePath}\n` +
|
|
46
46
|
` Ferret supports a subset of JSON Schema.\n` +
|
|
47
|
-
` See:
|
|
47
|
+
` See: docs/CONTRACT-SCHEMA.md — Part 3`);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
return { valid: true, warnings };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@specferret/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "SpecFerret core engine — spec drift detection.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"license": "MIT",
|
|
42
42
|
"repository": {
|
|
43
43
|
"type": "git",
|
|
44
|
-
"url": "git+https://github.com/BenGardiner123/
|
|
44
|
+
"url": "git+https://github.com/BenGardiner123/specferret.git"
|
|
45
45
|
},
|
|
46
46
|
"homepage": "https://specferret.dev"
|
|
47
47
|
}
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
"type": "object",
|
|
8
8
|
"properties": {
|
|
9
9
|
"id": {
|
|
10
|
-
"type": "
|
|
10
|
+
"type": "string"
|
|
11
11
|
},
|
|
12
12
|
"displayName": {
|
|
13
|
-
"type": "
|
|
13
|
+
"type": "string"
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"required": [
|
|
@@ -23,8 +23,5 @@
|
|
|
23
23
|
}
|
|
24
24
|
],
|
|
25
25
|
"errors": [],
|
|
26
|
-
"diagnostics": [
|
|
27
|
-
"src/fixtures/unions.ts (MaybeUser): Union types are not supported in extraction. Falling back to object.",
|
|
28
|
-
"src/fixtures/unions.ts (MaybeUser): Union types are not supported in extraction. Falling back to object."
|
|
29
|
-
]
|
|
26
|
+
"diagnostics": []
|
|
30
27
|
}
|
|
@@ -32,7 +32,7 @@ export interface GetUsersResponse {
|
|
|
32
32
|
assert.equal(shape.type, 'object');
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
it('extracts
|
|
35
|
+
it('extracts enums and skips function declarations (no shape worth contracting)', () => {
|
|
36
36
|
const src = `
|
|
37
37
|
export enum UserRole {
|
|
38
38
|
Admin,
|
|
@@ -46,30 +46,49 @@ export function getUser(id: string): UserRole {
|
|
|
46
46
|
|
|
47
47
|
const result = extractContractsFromTypeScript('src/roles.ts', src);
|
|
48
48
|
|
|
49
|
-
assert.equal(result.contracts.length,
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
assert.ok(enumContract);
|
|
54
|
-
assert.ok(functionContract);
|
|
55
|
-
|
|
56
|
-
const enumShape = enumContract?.shape as Record<string, unknown>;
|
|
49
|
+
assert.equal(result.contracts.length, 1);
|
|
50
|
+
assert.equal(result.contracts[0].sourceSymbol, 'UserRole');
|
|
51
|
+
const enumShape = result.contracts[0].shape as Record<string, unknown>;
|
|
57
52
|
assert.equal(enumShape.type, 'string');
|
|
58
|
-
|
|
59
|
-
const functionShape = functionContract?.shape as Record<string, unknown>;
|
|
60
|
-
assert.equal(functionShape.type, 'object');
|
|
61
53
|
});
|
|
62
54
|
|
|
63
|
-
it('
|
|
55
|
+
it('unwraps nullable unions to their non-null member', () => {
|
|
64
56
|
const src = `
|
|
65
57
|
export interface ProfileResponse {
|
|
66
58
|
email: string | null;
|
|
59
|
+
age: number | undefined;
|
|
67
60
|
}
|
|
68
61
|
`;
|
|
69
62
|
|
|
70
63
|
const result = extractContractsFromTypeScript('src/profile.ts', src);
|
|
71
64
|
|
|
72
65
|
assert.equal(result.contracts.length, 1);
|
|
66
|
+
const shape = result.contracts[0].shape as { properties: Record<string, unknown> };
|
|
67
|
+
assert.deepEqual(shape.properties.email, { type: 'string' });
|
|
68
|
+
assert.deepEqual(shape.properties.age, { type: 'number' });
|
|
69
|
+
assert.equal(result.diagnostics.length, 0);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('converts string-literal unions to enums', () => {
|
|
73
|
+
const src = `
|
|
74
|
+
export interface Account {
|
|
75
|
+
role: 'admin' | 'user' | 'viewer';
|
|
76
|
+
}
|
|
77
|
+
`;
|
|
78
|
+
|
|
79
|
+
const result = extractContractsFromTypeScript('src/account.ts', src);
|
|
80
|
+
const shape = result.contracts[0].shape as { properties: Record<string, { type: string; enum?: string[] }> };
|
|
81
|
+
assert.deepEqual(shape.properties.role, { type: 'string', enum: ['admin', 'user', 'viewer'] });
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('records diagnostics for genuinely mixed unions', () => {
|
|
85
|
+
const src = `
|
|
86
|
+
export interface Odd {
|
|
87
|
+
value: string | number;
|
|
88
|
+
}
|
|
89
|
+
`;
|
|
90
|
+
|
|
91
|
+
const result = extractContractsFromTypeScript('src/odd.ts', src);
|
|
73
92
|
assert.ok(result.diagnostics.some((d) => d.includes('Union types are not supported')));
|
|
74
93
|
});
|
|
75
94
|
|
|
@@ -163,40 +182,91 @@ export interface Service {
|
|
|
163
182
|
assert.ok(!shape.required.includes('baz'));
|
|
164
183
|
});
|
|
165
184
|
|
|
166
|
-
it('
|
|
185
|
+
it('resolves references to interfaces and aliases declared in the same file', () => {
|
|
167
186
|
const src = `
|
|
168
|
-
|
|
187
|
+
interface Address {
|
|
188
|
+
street: string;
|
|
189
|
+
city: string;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
type Tags = string[];
|
|
193
|
+
|
|
194
|
+
export interface User {
|
|
195
|
+
id: string;
|
|
196
|
+
address: Address;
|
|
197
|
+
tags: Tags;
|
|
198
|
+
}
|
|
169
199
|
`;
|
|
170
|
-
const result = extractContractsFromTypeScript('src/
|
|
200
|
+
const result = extractContractsFromTypeScript('src/user.ts', src);
|
|
171
201
|
assert.equal(result.contracts.length, 1);
|
|
172
202
|
|
|
173
|
-
const shape = result.contracts[0].shape as {
|
|
174
|
-
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
assert.
|
|
178
|
-
assert.ok(!paramsRequired.includes('args'), 'rest param args should not be required');
|
|
203
|
+
const shape = result.contracts[0].shape as { properties: Record<string, any>; required: string[] };
|
|
204
|
+
assert.equal(shape.properties.address.type, 'object');
|
|
205
|
+
assert.deepEqual(shape.properties.address.properties.street, { type: 'string' });
|
|
206
|
+
assert.deepEqual(shape.properties.tags, { type: 'array', items: { type: 'string' } });
|
|
207
|
+
assert.equal(result.diagnostics.length, 0);
|
|
179
208
|
});
|
|
180
209
|
|
|
181
|
-
it('
|
|
210
|
+
it('resolves z.infer<typeof Schema> through the static zod interpreter', () => {
|
|
182
211
|
const src = `
|
|
183
|
-
|
|
212
|
+
import { z } from 'zod';
|
|
213
|
+
|
|
214
|
+
const AddressSchema = z.object({
|
|
215
|
+
street: z.string(),
|
|
216
|
+
zip: z.string().optional(),
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
export const UserSchema = z.object({
|
|
220
|
+
id: z.string().uuid(),
|
|
221
|
+
email: z.string().email(),
|
|
222
|
+
age: z.number().int().optional(),
|
|
223
|
+
role: z.enum(['admin', 'user']),
|
|
224
|
+
address: AddressSchema,
|
|
225
|
+
tags: z.array(z.string()),
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
export type User = z.infer<typeof UserSchema>;
|
|
184
229
|
`;
|
|
185
230
|
const result = extractContractsFromTypeScript('src/user.ts', src);
|
|
231
|
+
const user = result.contracts.find((c) => c.sourceSymbol === 'User');
|
|
232
|
+
assert.ok(user, 'User type should be extracted');
|
|
233
|
+
|
|
234
|
+
const shape = user!.shape as { properties: Record<string, any>; required: string[] };
|
|
235
|
+
assert.deepEqual(shape.properties.id, { type: 'string' });
|
|
236
|
+
assert.deepEqual(shape.properties.role, { type: 'string', enum: ['admin', 'user'] });
|
|
237
|
+
assert.deepEqual(shape.properties.tags, { type: 'array', items: { type: 'string' } });
|
|
238
|
+
assert.deepEqual(shape.properties.address.properties.street, { type: 'string' });
|
|
239
|
+
assert.ok(shape.required.includes('id'), 'id is required');
|
|
240
|
+
assert.ok(!shape.required.includes('age'), 'age is optional (.optional())');
|
|
241
|
+
assert.ok(!shape.properties.address.required.includes('zip'), 'zip is optional inside nested schema');
|
|
242
|
+
assert.equal(result.diagnostics.length, 0, `unexpected diagnostics: ${result.diagnostics.join('; ')}`);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it('guards against circular type references instead of recursing forever', () => {
|
|
246
|
+
const src = `
|
|
247
|
+
interface Node {
|
|
248
|
+
value: string;
|
|
249
|
+
next: Node;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export interface List {
|
|
253
|
+
head: Node;
|
|
254
|
+
}
|
|
255
|
+
`;
|
|
256
|
+
const result = extractContractsFromTypeScript('src/list.ts', src);
|
|
186
257
|
assert.equal(result.contracts.length, 1);
|
|
258
|
+
assert.ok(result.diagnostics.some((d) => d.includes('Circular type reference')));
|
|
259
|
+
});
|
|
187
260
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
assert.deepEqual(shape.properties.
|
|
197
|
-
type: 'boolean',
|
|
198
|
-
});
|
|
199
|
-
assert.deepEqual(shape.properties.params.required, ['id', 'active']);
|
|
261
|
+
it('resolves Array<T> generics', () => {
|
|
262
|
+
const src = `
|
|
263
|
+
export interface Basket {
|
|
264
|
+
items: Array<string>;
|
|
265
|
+
}
|
|
266
|
+
`;
|
|
267
|
+
const result = extractContractsFromTypeScript('src/basket.ts', src);
|
|
268
|
+
const shape = result.contracts[0].shape as { properties: Record<string, unknown> };
|
|
269
|
+
assert.deepEqual(shape.properties.items, { type: 'array', items: { type: 'string' } });
|
|
200
270
|
});
|
|
201
271
|
|
|
202
272
|
it('normalizes absolute paths to deterministic ids', () => {
|
|
@@ -28,7 +28,7 @@ interface Annotation {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
interface ExportedDeclaration {
|
|
31
|
-
kind: 'interface' | 'type' | 'enum'
|
|
31
|
+
kind: 'interface' | 'type' | 'enum';
|
|
32
32
|
symbol: string;
|
|
33
33
|
node: Parser.SyntaxNode;
|
|
34
34
|
}
|
|
@@ -184,8 +184,11 @@ function collectExportedDeclarations(root: Parser.SyntaxNode): ExportedDeclarati
|
|
|
184
184
|
continue;
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
+
// Function declarations are intentionally NOT extracted: a function
|
|
188
|
+
// signature carries no data shape worth contracting (the Week-1 reality
|
|
189
|
+
// test produced empty params/returns husks from every real repo).
|
|
187
190
|
const declaration = node.namedChildren.find((child) =>
|
|
188
|
-
['interface_declaration', 'type_alias_declaration', 'enum_declaration'
|
|
191
|
+
['interface_declaration', 'type_alias_declaration', 'enum_declaration'].includes(child.type),
|
|
189
192
|
);
|
|
190
193
|
|
|
191
194
|
if (!declaration) {
|
|
@@ -208,12 +211,7 @@ function collectExportedDeclarations(root: Parser.SyntaxNode): ExportedDeclarati
|
|
|
208
211
|
continue;
|
|
209
212
|
}
|
|
210
213
|
|
|
211
|
-
|
|
212
|
-
declarations.push({ kind: 'enum', symbol, node: declaration });
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
declarations.push({ kind: 'function', symbol, node: declaration });
|
|
214
|
+
declarations.push({ kind: 'enum', symbol, node: declaration });
|
|
217
215
|
}
|
|
218
216
|
|
|
219
217
|
return declarations;
|
|
@@ -223,6 +221,280 @@ function findChildByType(node: Parser.SyntaxNode, types: string[]): Parser.Synta
|
|
|
223
221
|
return node.namedChildren.find((child) => types.includes(child.type)) ?? null;
|
|
224
222
|
}
|
|
225
223
|
|
|
224
|
+
// ─── In-file type resolution ────────────────────────────────────────────────
|
|
225
|
+
// Modern TypeScript rarely writes shapes inline: types reference local
|
|
226
|
+
// interfaces, aliases, and z.infer<typeof Schema>. The context below lets the
|
|
227
|
+
// parser follow those references within the file instead of collapsing them
|
|
228
|
+
// to empty objects.
|
|
229
|
+
|
|
230
|
+
interface ResolveContext {
|
|
231
|
+
/** Top-level interface/type/enum declarations by symbol — exported or not. */
|
|
232
|
+
locals: Map<string, { kind: 'interface' | 'type' | 'enum'; node: Parser.SyntaxNode }>;
|
|
233
|
+
/** Top-level `const X = z.object(...)`-style initializers by symbol. */
|
|
234
|
+
zodSchemas: Map<string, Parser.SyntaxNode>;
|
|
235
|
+
/** Top-level literal consts (`const V = "3.0" as const`) for `typeof V`. */
|
|
236
|
+
constLiterals: Map<string, Schema>;
|
|
237
|
+
/** Symbols currently mid-resolution — cycle guard. */
|
|
238
|
+
resolving: Set<string>;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Set per extraction call in extractContractsFromTypeScript. Module-level so
|
|
242
|
+
// the deeply recursive parse functions don't all need a threaded parameter;
|
|
243
|
+
// extraction is synchronous, so there is no re-entrancy.
|
|
244
|
+
let currentContext: ResolveContext = { locals: new Map(), zodSchemas: new Map(), constLiterals: new Map(), resolving: new Set() };
|
|
245
|
+
|
|
246
|
+
function literalToSchema(node: Parser.SyntaxNode | null): Schema | null {
|
|
247
|
+
if (!node) return null;
|
|
248
|
+
// Unwrap `"3.0" as const` / `"3.0" satisfies X`.
|
|
249
|
+
if (node.type === 'as_expression' || node.type === 'satisfies_expression') {
|
|
250
|
+
return literalToSchema(node.namedChildren[0] ?? null);
|
|
251
|
+
}
|
|
252
|
+
if (node.type === 'string') return { type: 'string', enum: [node.text.slice(1, -1)] };
|
|
253
|
+
if (node.type === 'number') return { type: 'number', enum: [Number(node.text)] };
|
|
254
|
+
if (node.type === 'true' || node.type === 'false') return { type: 'boolean', enum: [node.type === 'true'] };
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function collectResolutionContext(root: Parser.SyntaxNode): ResolveContext {
|
|
259
|
+
const locals: ResolveContext['locals'] = new Map();
|
|
260
|
+
const zodSchemas: ResolveContext['zodSchemas'] = new Map();
|
|
261
|
+
const constLiterals: ResolveContext['constLiterals'] = new Map();
|
|
262
|
+
|
|
263
|
+
for (const child of root.namedChildren) {
|
|
264
|
+
const candidates = child.type === 'export_statement' ? child.namedChildren : [child];
|
|
265
|
+
for (const decl of candidates) {
|
|
266
|
+
if (decl.type === 'interface_declaration' || decl.type === 'type_alias_declaration' || decl.type === 'enum_declaration') {
|
|
267
|
+
const symbol = getIdentifierText(decl.childForFieldName('name'));
|
|
268
|
+
if (symbol) {
|
|
269
|
+
const kind = decl.type === 'interface_declaration' ? 'interface' : decl.type === 'type_alias_declaration' ? 'type' : 'enum';
|
|
270
|
+
locals.set(symbol, { kind, node: decl });
|
|
271
|
+
}
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
if (decl.type === 'lexical_declaration' || decl.type === 'variable_declaration') {
|
|
275
|
+
for (const declarator of decl.namedChildren.filter((c) => c.type === 'variable_declarator')) {
|
|
276
|
+
const symbol = getIdentifierText(declarator.childForFieldName('name'));
|
|
277
|
+
const value = declarator.childForFieldName('value');
|
|
278
|
+
if (!symbol || !value) continue;
|
|
279
|
+
if (value.type === 'call_expression') {
|
|
280
|
+
zodSchemas.set(symbol, value);
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const literal = literalToSchema(value);
|
|
284
|
+
if (literal) {
|
|
285
|
+
constLiterals.set(symbol, literal);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return { locals, zodSchemas, constLiterals, resolving: new Set() };
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function resolveLocalType(name: string, filePath: string, symbol: string, diagnostics: string[]): Schema | null {
|
|
296
|
+
const local = currentContext.locals.get(name);
|
|
297
|
+
if (!local) return null;
|
|
298
|
+
|
|
299
|
+
if (currentContext.resolving.has(name)) {
|
|
300
|
+
diagnostics.push(`${filePath} (${symbol}): Circular type reference '${name}'. Falling back to object.`);
|
|
301
|
+
return { type: 'object' };
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
currentContext.resolving.add(name);
|
|
305
|
+
try {
|
|
306
|
+
if (local.kind === 'interface') {
|
|
307
|
+
const body = local.node.childForFieldName('body') ?? findChildByType(local.node, ['interface_body']);
|
|
308
|
+
return body ? parseObjectShape(filePath, symbol, body, diagnostics) : { type: 'object' };
|
|
309
|
+
}
|
|
310
|
+
if (local.kind === 'enum') {
|
|
311
|
+
return parseEnumShape(local.node);
|
|
312
|
+
}
|
|
313
|
+
const valueNode = local.node.childForFieldName('value') ?? local.node.namedChildren.at(-1);
|
|
314
|
+
return valueNode ? parseTypeNode(filePath, symbol, valueNode, diagnostics) : { type: 'object' };
|
|
315
|
+
} finally {
|
|
316
|
+
currentContext.resolving.delete(name);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// ─── Static Zod interpreter ─────────────────────────────────────────────────
|
|
321
|
+
// Resolves `z.infer<typeof Schema>` without executing anything: walks the
|
|
322
|
+
// builder chain of the schema's initializer and maps the common combinators
|
|
323
|
+
// to the JSON-schema subset. Refinements that don't change shape (.min(),
|
|
324
|
+
// .email(), .describe(), …) are ignored; combinators we can't represent fall
|
|
325
|
+
// back to object with a diagnostic.
|
|
326
|
+
|
|
327
|
+
interface ZodConversion {
|
|
328
|
+
schema: Schema;
|
|
329
|
+
optional: boolean;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function zodChainCalls(node: Parser.SyntaxNode): { rootName: string; calls: Array<{ name: string; args: Parser.SyntaxNode | null }> } | null {
|
|
333
|
+
const calls: Array<{ name: string; args: Parser.SyntaxNode | null }> = [];
|
|
334
|
+
let current: Parser.SyntaxNode | null = node;
|
|
335
|
+
|
|
336
|
+
while (current && current.type === 'call_expression') {
|
|
337
|
+
const fn = current.childForFieldName('function');
|
|
338
|
+
if (!fn || fn.type !== 'member_expression') return null;
|
|
339
|
+
const property = fn.childForFieldName('property');
|
|
340
|
+
if (!property) return null;
|
|
341
|
+
calls.unshift({ name: property.text, args: current.childForFieldName('arguments') });
|
|
342
|
+
current = fn.childForFieldName('object');
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (!current || current.type !== 'identifier') return null;
|
|
346
|
+
return { rootName: current.text, calls };
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function firstArgument(args: Parser.SyntaxNode | null): Parser.SyntaxNode | null {
|
|
350
|
+
return args?.namedChildren[0] ?? null;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function zodBaseToSchema(
|
|
354
|
+
name: string,
|
|
355
|
+
args: Parser.SyntaxNode | null,
|
|
356
|
+
filePath: string,
|
|
357
|
+
symbol: string,
|
|
358
|
+
diagnostics: string[],
|
|
359
|
+
): ZodConversion {
|
|
360
|
+
switch (name) {
|
|
361
|
+
case 'string':
|
|
362
|
+
case 'uuid':
|
|
363
|
+
case 'email':
|
|
364
|
+
case 'url':
|
|
365
|
+
return { schema: { type: 'string' }, optional: false };
|
|
366
|
+
case 'number':
|
|
367
|
+
case 'int':
|
|
368
|
+
case 'bigint':
|
|
369
|
+
return { schema: { type: 'number' }, optional: false };
|
|
370
|
+
case 'boolean':
|
|
371
|
+
return { schema: { type: 'boolean' }, optional: false };
|
|
372
|
+
case 'date':
|
|
373
|
+
return { schema: { type: 'string', format: 'date-time' }, optional: false };
|
|
374
|
+
case 'null':
|
|
375
|
+
return { schema: { type: 'null' }, optional: false };
|
|
376
|
+
case 'literal': {
|
|
377
|
+
const value = firstArgument(args);
|
|
378
|
+
if (value?.type === 'string') return { schema: { type: 'string', enum: [value.text.slice(1, -1)] }, optional: false };
|
|
379
|
+
if (value?.type === 'number') return { schema: { type: 'number', enum: [Number(value.text)] }, optional: false };
|
|
380
|
+
if (value?.type === 'true' || value?.type === 'false') {
|
|
381
|
+
return { schema: { type: 'boolean', enum: [value.type === 'true'] }, optional: false };
|
|
382
|
+
}
|
|
383
|
+
return { schema: { type: 'object' }, optional: false };
|
|
384
|
+
}
|
|
385
|
+
case 'enum': {
|
|
386
|
+
const arrayArg = firstArgument(args);
|
|
387
|
+
const values = (arrayArg?.namedChildren ?? []).filter((c) => c.type === 'string').map((c) => c.text.slice(1, -1));
|
|
388
|
+
return { schema: { type: 'string', enum: values }, optional: false };
|
|
389
|
+
}
|
|
390
|
+
case 'array': {
|
|
391
|
+
const item = firstArgument(args);
|
|
392
|
+
const converted = item ? zodExpressionToSchema(item, filePath, symbol, diagnostics) : null;
|
|
393
|
+
return { schema: { type: 'array', items: converted?.schema ?? { type: 'object' } }, optional: false };
|
|
394
|
+
}
|
|
395
|
+
case 'optional': {
|
|
396
|
+
const inner = firstArgument(args);
|
|
397
|
+
const converted = inner ? zodExpressionToSchema(inner, filePath, symbol, diagnostics) : null;
|
|
398
|
+
return { schema: converted?.schema ?? { type: 'object' }, optional: true };
|
|
399
|
+
}
|
|
400
|
+
case 'object': {
|
|
401
|
+
const objectLiteral = firstArgument(args);
|
|
402
|
+
if (!objectLiteral || objectLiteral.type !== 'object') {
|
|
403
|
+
diagnostics.push(`${filePath} (${symbol}): z.object without an inline object literal. Falling back to object.`);
|
|
404
|
+
return { schema: { type: 'object' }, optional: false };
|
|
405
|
+
}
|
|
406
|
+
const properties: Record<string, unknown> = {};
|
|
407
|
+
const required: string[] = [];
|
|
408
|
+
for (const pair of objectLiteral.namedChildren) {
|
|
409
|
+
if (pair.type !== 'pair') continue;
|
|
410
|
+
const keyNode = pair.childForFieldName('key');
|
|
411
|
+
const key = getIdentifierText(keyNode) ?? keyNode?.text?.replace(/^['"]|['"]$/g, '');
|
|
412
|
+
const valueNode = pair.childForFieldName('value');
|
|
413
|
+
if (!key || !valueNode) continue;
|
|
414
|
+
const converted = zodExpressionToSchema(valueNode, filePath, symbol, diagnostics);
|
|
415
|
+
properties[key] = converted.schema;
|
|
416
|
+
if (!converted.optional) required.push(key);
|
|
417
|
+
}
|
|
418
|
+
return { schema: { type: 'object', properties, required }, optional: false };
|
|
419
|
+
}
|
|
420
|
+
default:
|
|
421
|
+
diagnostics.push(`${filePath} (${symbol}): Unsupported zod combinator 'z.${name}'. Falling back to object.`);
|
|
422
|
+
return { schema: { type: 'object' }, optional: false };
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
function applyZodModifier(conversion: ZodConversion, name: string): ZodConversion {
|
|
427
|
+
if (name === 'optional' || name === 'nullish' || name === 'default' || name === 'catch') {
|
|
428
|
+
return { ...conversion, optional: true };
|
|
429
|
+
}
|
|
430
|
+
if (name === 'array') {
|
|
431
|
+
return { schema: { type: 'array', items: conversion.schema }, optional: conversion.optional };
|
|
432
|
+
}
|
|
433
|
+
// Everything else (.min, .max, .email, .regex, .int, .nullable, .describe,
|
|
434
|
+
// .trim, .brand, …) refines values without changing the JSON shape.
|
|
435
|
+
return conversion;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function zodExpressionToSchema(node: Parser.SyntaxNode, filePath: string, symbol: string, diagnostics: string[]): ZodConversion {
|
|
439
|
+
// Bare reference to another top-level schema const: `user: UserSchema`
|
|
440
|
+
if (node.type === 'identifier') {
|
|
441
|
+
return resolveZodSchemaReference(node.text, filePath, symbol, diagnostics);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if (node.type !== 'call_expression') {
|
|
445
|
+
diagnostics.push(`${filePath} (${symbol}): Unsupported zod expression '${node.type}'. Falling back to object.`);
|
|
446
|
+
return { schema: { type: 'object' }, optional: false };
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
const chain = zodChainCalls(node);
|
|
450
|
+
if (!chain) {
|
|
451
|
+
diagnostics.push(`${filePath} (${symbol}): Unrecognized zod call chain. Falling back to object.`);
|
|
452
|
+
return { schema: { type: 'object' }, optional: false };
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
let conversion: ZodConversion;
|
|
456
|
+
let modifierStart: number;
|
|
457
|
+
|
|
458
|
+
if (chain.rootName === 'z') {
|
|
459
|
+
if (chain.calls.length === 0) {
|
|
460
|
+
return { schema: { type: 'object' }, optional: false };
|
|
461
|
+
}
|
|
462
|
+
conversion = zodBaseToSchema(chain.calls[0].name, chain.calls[0].args, filePath, symbol, diagnostics);
|
|
463
|
+
modifierStart = 1;
|
|
464
|
+
} else {
|
|
465
|
+
// `UserSchema.optional()` — chain rooted on another schema const.
|
|
466
|
+
conversion = resolveZodSchemaReference(chain.rootName, filePath, symbol, diagnostics);
|
|
467
|
+
modifierStart = 0;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
for (const call of chain.calls.slice(modifierStart)) {
|
|
471
|
+
conversion = applyZodModifier(conversion, call.name);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
return conversion;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function resolveZodSchemaReference(name: string, filePath: string, symbol: string, diagnostics: string[]): ZodConversion {
|
|
478
|
+
const target = currentContext.zodSchemas.get(name);
|
|
479
|
+
if (!target) {
|
|
480
|
+
diagnostics.push(`${filePath} (${symbol}): Schema reference '${name}' is not a top-level const in this file. Falling back to object.`);
|
|
481
|
+
return { schema: { type: 'object' }, optional: false };
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
const guardKey = `zod:${name}`;
|
|
485
|
+
if (currentContext.resolving.has(guardKey)) {
|
|
486
|
+
diagnostics.push(`${filePath} (${symbol}): Circular schema reference '${name}'. Falling back to object.`);
|
|
487
|
+
return { schema: { type: 'object' }, optional: false };
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
currentContext.resolving.add(guardKey);
|
|
491
|
+
try {
|
|
492
|
+
return zodExpressionToSchema(target, filePath, symbol, diagnostics);
|
|
493
|
+
} finally {
|
|
494
|
+
currentContext.resolving.delete(guardKey);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
226
498
|
function parseTypeNode(filePath: string, symbol: string, node: Parser.SyntaxNode, diagnostics: string[]): Schema {
|
|
227
499
|
if (node.type === 'type_annotation') {
|
|
228
500
|
const inner = node.namedChildren[0];
|
|
@@ -241,10 +513,53 @@ function parseTypeNode(filePath: string, symbol: string, node: Parser.SyntaxNode
|
|
|
241
513
|
return { type: 'string', format: 'date-time' };
|
|
242
514
|
}
|
|
243
515
|
|
|
516
|
+
// Follow references to interfaces/aliases/enums declared in this file.
|
|
517
|
+
const resolved = resolveLocalType(node.text, filePath, symbol, diagnostics);
|
|
518
|
+
if (resolved !== null) {
|
|
519
|
+
return resolved;
|
|
520
|
+
}
|
|
521
|
+
|
|
244
522
|
diagnostics.push(`${filePath} (${symbol}): Unsupported referenced type '${node.text}'. Falling back to object.`);
|
|
245
523
|
return { type: 'object' };
|
|
246
524
|
}
|
|
247
525
|
|
|
526
|
+
if (node.type === 'type_query') {
|
|
527
|
+
// `typeof CONST` where CONST is a top-level literal const resolves to that
|
|
528
|
+
// literal's enum schema (`const V = "3.0" as const` → string enum ["3.0"]).
|
|
529
|
+
const reference = node.namedChildren[0];
|
|
530
|
+
if (reference && ['identifier', 'type_identifier'].includes(reference.type)) {
|
|
531
|
+
const literal = currentContext.constLiterals.get(reference.text);
|
|
532
|
+
if (literal) {
|
|
533
|
+
return literal;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
diagnostics.push(`${filePath} (${symbol}): Unsupported node type 'type_query'. Falling back to object.`);
|
|
537
|
+
return { type: 'object' };
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
if (node.type === 'generic_type') {
|
|
541
|
+
const nameNode = node.childForFieldName('name') ?? node.namedChildren[0];
|
|
542
|
+
const nameText = nameNode?.text ?? '';
|
|
543
|
+
const typeArguments = findChildByType(node, ['type_arguments']);
|
|
544
|
+
const firstTypeArgument = typeArguments?.namedChildren[0] ?? null;
|
|
545
|
+
|
|
546
|
+
if (nameText === 'Array' && firstTypeArgument) {
|
|
547
|
+
return { type: 'array', items: parseTypeNode(filePath, symbol, firstTypeArgument, diagnostics) };
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// z.infer<typeof Schema> / z.input / z.output — resolve the referenced
|
|
551
|
+
// top-level zod const statically instead of collapsing to object.
|
|
552
|
+
if (['z.infer', 'z.input', 'z.output', 'z.TypeOf', 'TypeOf'].includes(nameText) && firstTypeArgument?.type === 'type_query') {
|
|
553
|
+
const reference = firstTypeArgument.namedChildren[0];
|
|
554
|
+
if (reference && ['identifier', 'type_identifier'].includes(reference.type)) {
|
|
555
|
+
return resolveZodSchemaReference(reference.text, filePath, symbol, diagnostics).schema;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
diagnostics.push(`${filePath} (${symbol}): Unsupported node type 'generic_type'. Falling back to object.`);
|
|
560
|
+
return { type: 'object' };
|
|
561
|
+
}
|
|
562
|
+
|
|
248
563
|
if (node.type === 'array_type') {
|
|
249
564
|
const element = node.namedChildren[0];
|
|
250
565
|
if (!element) {
|
|
@@ -259,6 +574,26 @@ function parseTypeNode(filePath: string, symbol: string, node: Parser.SyntaxNode
|
|
|
259
574
|
}
|
|
260
575
|
|
|
261
576
|
if (node.type === 'union_type') {
|
|
577
|
+
// `a | b | c` parses as nested binary unions — flatten before analysis.
|
|
578
|
+
const flattenUnion = (n: Parser.SyntaxNode): Parser.SyntaxNode[] =>
|
|
579
|
+
n.type === 'union_type' ? n.namedChildren.flatMap(flattenUnion) : [n];
|
|
580
|
+
const members = flattenUnion(node).filter((child) => child.type !== 'comment');
|
|
581
|
+
const nonNullMembers = members.filter((member) => member.text !== 'null' && member.text !== 'undefined');
|
|
582
|
+
|
|
583
|
+
// Nullable unions (T | null, T | undefined) unwrap to T — the dominant
|
|
584
|
+
// real-world union shape.
|
|
585
|
+
if (nonNullMembers.length === 1) {
|
|
586
|
+
return parseTypeNode(filePath, symbol, nonNullMembers[0], diagnostics);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
// Pure string-literal unions become enums: 'admin' | 'viewer' | 'user'.
|
|
590
|
+
const literalStrings = nonNullMembers.map((member) =>
|
|
591
|
+
member.type === 'literal_type' && member.namedChildren[0]?.type === 'string' ? member.namedChildren[0].text.slice(1, -1) : null,
|
|
592
|
+
);
|
|
593
|
+
if (nonNullMembers.length > 0 && literalStrings.every((value): value is string => value !== null)) {
|
|
594
|
+
return { type: 'string', enum: literalStrings };
|
|
595
|
+
}
|
|
596
|
+
|
|
262
597
|
diagnostics.push(`${filePath} (${symbol}): Union types are not supported in extraction. Falling back to object.`);
|
|
263
598
|
return { type: 'object' };
|
|
264
599
|
}
|
|
@@ -491,21 +826,7 @@ function parseDeclarationShape(filePath: string, declaration: ExportedDeclaratio
|
|
|
491
826
|
return parseTypeNode(filePath, declaration.symbol, valueNode, diagnostics);
|
|
492
827
|
}
|
|
493
828
|
|
|
494
|
-
|
|
495
|
-
return parseEnumShape(declaration.node);
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
const parameters = declaration.node.childForFieldName('parameters');
|
|
499
|
-
const returnType = declaration.node.childForFieldName('return_type');
|
|
500
|
-
|
|
501
|
-
return {
|
|
502
|
-
type: 'object',
|
|
503
|
-
properties: {
|
|
504
|
-
params: parseParametersShape(filePath, declaration.symbol, parameters, diagnostics),
|
|
505
|
-
returns: returnType ? parseTypeNode(filePath, declaration.symbol, returnType, diagnostics) : { type: 'object' },
|
|
506
|
-
},
|
|
507
|
-
required: ['params', 'returns'],
|
|
508
|
-
};
|
|
829
|
+
return parseEnumShape(declaration.node);
|
|
509
830
|
}
|
|
510
831
|
|
|
511
832
|
function parseAnnotations(content: string): Annotation[] {
|
|
@@ -567,6 +888,9 @@ export function extractContractsFromTypeScript(filePath: string, content: string
|
|
|
567
888
|
diagnostics.push(`${filePath}: Tree-sitter detected syntax errors; extraction may be partial.`);
|
|
568
889
|
}
|
|
569
890
|
|
|
891
|
+
// Fresh per-file resolution context (local declarations + zod schema consts).
|
|
892
|
+
currentContext = collectResolutionContext(tree.rootNode);
|
|
893
|
+
|
|
570
894
|
const declarations = collectExportedDeclarations(tree.rootNode);
|
|
571
895
|
|
|
572
896
|
for (const declaration of declarations) {
|
|
@@ -31,7 +31,7 @@ export function validateContractType(contractType: unknown, filePath: string): C
|
|
|
31
31
|
/**
|
|
32
32
|
* JSON Schema keywords that are explicitly NOT supported by Ferret.
|
|
33
33
|
* If any appear in a schema, a warning is emitted but the schema is still accepted.
|
|
34
|
-
* See:
|
|
34
|
+
* See: docs/CONTRACT-SCHEMA.md — Part 3
|
|
35
35
|
*/
|
|
36
36
|
const UNSUPPORTED_KEYWORDS = [
|
|
37
37
|
'$ref',
|
|
@@ -67,7 +67,7 @@ export function validateFerretSchema(shape: unknown, filePath: string): SchemaVa
|
|
|
67
67
|
warnings.push(
|
|
68
68
|
`⚠ Unsupported JSON Schema keyword: ${keyword} in ${filePath}\n` +
|
|
69
69
|
` Ferret supports a subset of JSON Schema.\n` +
|
|
70
|
-
` See:
|
|
70
|
+
` See: docs/CONTRACT-SCHEMA.md — Part 3`,
|
|
71
71
|
);
|
|
72
72
|
}
|
|
73
73
|
}
|