@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 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/spec-ferret-validation-spec-kit/actions/runs/23962649755
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/spec-ferret
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;AA8gBD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,0BAA0B,CA+D5G"}
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
- const declaration = node.namedChildren.find((child) => ['interface_declaration', 'type_alias_declaration', 'enum_declaration', 'function_declaration'].includes(child.type));
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
- if (declaration.type === 'enum_declaration') {
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
- if (declaration.kind === 'enum') {
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: spec/CONTRACT-SCHEMA.md — Part 3
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: spec/CONTRACT-SCHEMA.md — Part 3`);
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.8.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/spec-ferret.git"
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": "object"
10
+ "type": "string"
11
11
  },
12
12
  "displayName": {
13
- "type": "object"
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 enum and function signatures from exported declarations', () => {
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, 2);
50
- const enumContract = result.contracts.find((contract) => contract.sourceSymbol === 'UserRole');
51
- const functionContract = result.contracts.find((contract) => contract.sourceSymbol === 'getUser');
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('records diagnostics for unsupported unions', () => {
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('does not mark rest parameters as required', () => {
185
+ it('resolves references to interfaces and aliases declared in the same file', () => {
167
186
  const src = `
168
- export function log(message: string, ...args: string[]): void {}
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/log.ts', 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
- properties: { params: { required: string[] } };
175
- };
176
- const paramsRequired = shape.properties.params.required;
177
- assert.ok(paramsRequired.includes('message'), 'message should be required');
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('extracts function with typed parameters', () => {
210
+ it('resolves z.infer<typeof Schema> through the static zod interpreter', () => {
182
211
  const src = `
183
- export function getUser(id: string, active: boolean): void {}
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
- const shape = result.contracts[0].shape as {
189
- properties: {
190
- params: { properties: Record<string, unknown>; required: string[] };
191
- };
192
- };
193
- assert.deepEqual(shape.properties.params.properties['id'], {
194
- type: 'string',
195
- });
196
- assert.deepEqual(shape.properties.params.properties['active'], {
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' | 'function';
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', 'function_declaration'].includes(child.type),
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
- if (declaration.type === 'enum_declaration') {
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
- if (declaration.kind === 'enum') {
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: spec/CONTRACT-SCHEMA.md — Part 3
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: spec/CONTRACT-SCHEMA.md — Part 3`,
70
+ ` See: docs/CONTRACT-SCHEMA.md — Part 3`,
71
71
  );
72
72
  }
73
73
  }