@specferret/core 0.1.2 → 0.1.4

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.
Files changed (81) hide show
  1. package/dist/context/index.d.ts +5 -1
  2. package/dist/context/index.d.ts.map +1 -1
  3. package/dist/context/index.js +47 -1
  4. package/dist/context/index.js.map +1 -1
  5. package/dist/extractor/__fixtures__/typescript/generics.d.ts +6 -0
  6. package/dist/extractor/__fixtures__/typescript/generics.d.ts.map +1 -0
  7. package/dist/extractor/__fixtures__/typescript/generics.js +2 -0
  8. package/dist/extractor/__fixtures__/typescript/generics.js.map +1 -0
  9. package/dist/extractor/__fixtures__/typescript/intersections.d.ts +6 -0
  10. package/dist/extractor/__fixtures__/typescript/intersections.d.ts.map +1 -0
  11. package/dist/extractor/__fixtures__/typescript/intersections.js +2 -0
  12. package/dist/extractor/__fixtures__/typescript/intersections.js.map +1 -0
  13. package/dist/extractor/__fixtures__/typescript/optional-nested.d.ts +8 -0
  14. package/dist/extractor/__fixtures__/typescript/optional-nested.d.ts.map +1 -0
  15. package/dist/extractor/__fixtures__/typescript/optional-nested.js +2 -0
  16. package/dist/extractor/__fixtures__/typescript/optional-nested.js.map +1 -0
  17. package/dist/extractor/__fixtures__/typescript/unions.d.ts +5 -0
  18. package/dist/extractor/__fixtures__/typescript/unions.d.ts.map +1 -0
  19. package/dist/extractor/__fixtures__/typescript/unions.js +2 -0
  20. package/dist/extractor/__fixtures__/typescript/unions.js.map +1 -0
  21. package/dist/extractor/__fixtures__/typescript/unsupported-syntax.d.ts +7 -0
  22. package/dist/extractor/__fixtures__/typescript/unsupported-syntax.d.ts.map +1 -0
  23. package/dist/extractor/__fixtures__/typescript/unsupported-syntax.js +2 -0
  24. package/dist/extractor/__fixtures__/typescript/unsupported-syntax.js.map +1 -0
  25. package/dist/extractor/contract-types.d.ts +5 -0
  26. package/dist/extractor/contract-types.d.ts.map +1 -0
  27. package/dist/extractor/contract-types.js +8 -0
  28. package/dist/extractor/contract-types.js.map +1 -0
  29. package/dist/extractor/frontmatter.d.ts +2 -1
  30. package/dist/extractor/frontmatter.d.ts.map +1 -1
  31. package/dist/extractor/frontmatter.js +12 -6
  32. package/dist/extractor/frontmatter.js.map +1 -1
  33. package/dist/extractor/typescript.d.ts +6 -1
  34. package/dist/extractor/typescript.d.ts.map +1 -1
  35. package/dist/extractor/typescript.js +403 -185
  36. package/dist/extractor/typescript.js.map +1 -1
  37. package/dist/extractor/validator.d.ts +9 -0
  38. package/dist/extractor/validator.d.ts.map +1 -1
  39. package/dist/extractor/validator.js +28 -9
  40. package/dist/extractor/validator.js.map +1 -1
  41. package/dist/index.d.ts +13 -12
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +13 -12
  44. package/dist/index.js.map +1 -1
  45. package/dist/reconciler/index.d.ts +10 -0
  46. package/dist/reconciler/index.d.ts.map +1 -1
  47. package/dist/reconciler/index.js +76 -0
  48. package/dist/reconciler/index.js.map +1 -1
  49. package/package.json +4 -1
  50. package/src/config.ts +48 -0
  51. package/src/context/index.test.ts +274 -0
  52. package/src/context/index.ts +178 -0
  53. package/src/extractor/__fixtures__/typescript/generics.golden.json +36 -0
  54. package/src/extractor/__fixtures__/typescript/generics.ts +5 -0
  55. package/src/extractor/__fixtures__/typescript/intersections.golden.json +18 -0
  56. package/src/extractor/__fixtures__/typescript/intersections.ts +5 -0
  57. package/src/extractor/__fixtures__/typescript/optional-nested.golden.json +41 -0
  58. package/src/extractor/__fixtures__/typescript/optional-nested.ts +7 -0
  59. package/src/extractor/__fixtures__/typescript/unions.golden.json +30 -0
  60. package/src/extractor/__fixtures__/typescript/unions.ts +4 -0
  61. package/src/extractor/__fixtures__/typescript/unsupported-syntax.golden.json +20 -0
  62. package/src/extractor/__fixtures__/typescript/unsupported-syntax.ts +6 -0
  63. package/src/extractor/contract-types.ts +11 -0
  64. package/src/extractor/frontmatter.test.ts +217 -0
  65. package/src/extractor/frontmatter.ts +77 -0
  66. package/src/extractor/hash.ts +26 -0
  67. package/src/extractor/typescript.test.ts +339 -0
  68. package/src/extractor/typescript.ts +597 -0
  69. package/src/extractor/validator.test.ts +228 -0
  70. package/src/extractor/validator.ts +199 -0
  71. package/src/index.ts +16 -0
  72. package/src/reconciler/import-suggestions.test.ts +101 -0
  73. package/src/reconciler/import-suggestions.ts +157 -0
  74. package/src/reconciler/index.test.ts +248 -0
  75. package/src/reconciler/index.ts +445 -0
  76. package/src/store/factory.ts +54 -0
  77. package/src/store/postgres.ts +84 -0
  78. package/src/store/sqlite.test.ts +272 -0
  79. package/src/store/sqlite.ts +278 -0
  80. package/src/store/types.ts +100 -0
  81. package/src/utils/paths.ts +24 -0
@@ -1,4 +1,6 @@
1
1
  import type { DBStore } from "../store/types.js";
2
+ export declare const CONTEXT_VERSION: "2.0";
3
+ export declare const CONTEXT_SCHEMA_VERSION: "1.0.0";
2
4
  export interface ContextContract {
3
5
  id: string;
4
6
  type: string;
@@ -12,12 +14,14 @@ export interface ContextEdge {
12
14
  to: string;
13
15
  }
14
16
  export interface FerretContext {
15
- version: "2.0";
17
+ version: typeof CONTEXT_VERSION;
18
+ schemaVersion: typeof CONTEXT_SCHEMA_VERSION;
16
19
  generated: string;
17
20
  contracts: ContextContract[];
18
21
  edges: ContextEdge[];
19
22
  needsReview: string[];
20
23
  }
24
+ export declare function readContextFile(contextPath: string): FerretContext;
21
25
  /**
22
26
  * Reads the full graph from the store and writes .ferret/context.json.
23
27
  * Called automatically at the end of every ferret scan.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA4Ef"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,eAAO,MAAM,eAAe,EAAG,KAAc,CAAC;AAC9C,eAAO,MAAM,sBAAsB,EAAG,OAAgB,CAAC;AAUvD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,eAAe,CAAC;IAChC,aAAa,EAAE,OAAO,sBAAsB,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAyCD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAalE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
@@ -1,5 +1,50 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
+ export const CONTEXT_VERSION = "2.0";
4
+ export const CONTEXT_SCHEMA_VERSION = "1.0.0";
5
+ function normalizeContext(raw) {
6
+ if (!raw || typeof raw !== "object") {
7
+ throw new Error("ferret: invalid context.json format. Run 'ferret scan' to regenerate .ferret/context.json.");
8
+ }
9
+ const candidate = raw;
10
+ const contextVersion = candidate.version;
11
+ if (contextVersion !== CONTEXT_VERSION) {
12
+ throw new Error(`ferret: unsupported context.json version '${String(contextVersion)}'. Run 'ferret scan' with the current CLI to regenerate .ferret/context.json.`);
13
+ }
14
+ const schemaVersion = candidate.schemaVersion;
15
+ if (schemaVersion !== undefined && schemaVersion !== CONTEXT_SCHEMA_VERSION) {
16
+ throw new Error(`ferret: unsupported context schemaVersion '${String(schemaVersion)}'. Run 'ferret scan' with the current CLI to migrate .ferret/context.json.`);
17
+ }
18
+ // Known migration path: V2 payloads created before schemaVersion was introduced.
19
+ const legacy = candidate;
20
+ return {
21
+ version: CONTEXT_VERSION,
22
+ schemaVersion: CONTEXT_SCHEMA_VERSION,
23
+ generated: typeof legacy.generated === "string"
24
+ ? legacy.generated
25
+ : new Date(0).toISOString(),
26
+ contracts: Array.isArray(legacy.contracts)
27
+ ? legacy.contracts
28
+ : [],
29
+ edges: Array.isArray(legacy.edges) ? legacy.edges : [],
30
+ needsReview: Array.isArray(legacy.needsReview)
31
+ ? legacy.needsReview
32
+ : [],
33
+ };
34
+ }
35
+ export function readContextFile(contextPath) {
36
+ try {
37
+ const raw = fs.readFileSync(contextPath, "utf-8");
38
+ return normalizeContext(JSON.parse(raw));
39
+ }
40
+ catch (error) {
41
+ const message = error instanceof Error ? error.message : String(error);
42
+ if (message.startsWith("ferret:")) {
43
+ throw error;
44
+ }
45
+ throw new Error(`ferret: unable to read .ferret/context.json (${message}). Run 'ferret scan' to regenerate it.`);
46
+ }
47
+ }
3
48
  /**
4
49
  * Reads the full graph from the store and writes .ferret/context.json.
5
50
  * Called automatically at the end of every ferret scan.
@@ -51,7 +96,8 @@ export async function writeContext(store, projectRoot) {
51
96
  .filter((c) => needsReviewNodeIds.has(c.node_id) || c.status === "needs-review")
52
97
  .map((c) => c.id);
53
98
  const context = {
54
- version: "2.0",
99
+ version: CONTEXT_VERSION,
100
+ schemaVersion: CONTEXT_SCHEMA_VERSION,
55
101
  generated: new Date().toISOString(),
56
102
  contracts: contextContracts,
57
103
  edges,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface PaginatedResponse<T> {
2
+ items: T[];
3
+ total: number;
4
+ nextCursor?: string;
5
+ }
6
+ //# sourceMappingURL=generics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generics.d.ts","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/generics.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generics.js","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/generics.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export type UserIdentity = {
2
+ id: string;
3
+ } & {
4
+ tenantId: string;
5
+ };
6
+ //# sourceMappingURL=intersections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersections.d.ts","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/intersections.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG;IACF,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=intersections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersections.js","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/intersections.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export interface SearchResult {
2
+ id: string;
3
+ metadata?: {
4
+ tags?: string[];
5
+ score: number;
6
+ };
7
+ }
8
+ //# sourceMappingURL=optional-nested.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional-nested.d.ts","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/optional-nested.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=optional-nested.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optional-nested.js","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/optional-nested.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export interface MaybeUser {
2
+ id: string | null;
3
+ displayName?: string | null;
4
+ }
5
+ //# sourceMappingURL=unions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unions.d.ts","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/unions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=unions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unions.js","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/unions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export type RouteMap<T extends string> = {
2
+ [K in T]: {
3
+ method: 'GET' | 'POST';
4
+ secured?: boolean;
5
+ };
6
+ };
7
+ //# sourceMappingURL=unsupported-syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsupported-syntax.d.ts","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/unsupported-syntax.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI;KACtC,CAAC,IAAI,CAAC,GAAG;QACR,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=unsupported-syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsupported-syntax.js","sourceRoot":"","sources":["../../../../src/extractor/__fixtures__/typescript/unsupported-syntax.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export declare const CONTRACT_TYPES: readonly ["api", "table", "type", "event", "flow", "config"];
2
+ export type ContractType = (typeof CONTRACT_TYPES)[number];
3
+ export declare function isContractType(value: unknown): value is ContractType;
4
+ export declare function formatAllowedContractTypes(): string;
5
+ //# sourceMappingURL=contract-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-types.d.ts","sourceRoot":"","sources":["../../src/extractor/contract-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,8DAA+D,CAAC;AAE3F,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD"}
@@ -0,0 +1,8 @@
1
+ export const CONTRACT_TYPES = ['api', 'table', 'type', 'event', 'flow', 'config'];
2
+ export function isContractType(value) {
3
+ return typeof value === 'string' && CONTRACT_TYPES.includes(value);
4
+ }
5
+ export function formatAllowedContractTypes() {
6
+ return CONTRACT_TYPES.join(', ');
7
+ }
8
+ //# sourceMappingURL=contract-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-types.js","sourceRoot":"","sources":["../../src/extractor/contract-types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAI3F,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -1,9 +1,10 @@
1
+ import type { ContractType } from './contract-types.js';
1
2
  export interface ExtractionResult {
2
3
  filePath: string;
3
4
  fileType: 'spec' | 'code';
4
5
  contracts: Array<{
5
6
  id: string;
6
- type: string;
7
+ type: ContractType;
7
8
  shape: object;
8
9
  shape_hash: string;
9
10
  imports: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/extractor/frontmatter.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC,CAAC;IACH,WAAW,EAAE,aAAa,GAAG,aAAa,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,gBAAgB,CAuClB"}
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/extractor/frontmatter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,YAAY,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC,CAAC;IACH,WAAW,EAAE,aAAa,GAAG,aAAa,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CA4C3F"}
@@ -1,7 +1,7 @@
1
1
  // Synchronous only. No async. No await. Anywhere in this file.
2
2
  // Extractor layer — turns a spec file into an ExtractionResult using gray-matter.
3
3
  import matter from 'gray-matter';
4
- import { validateFerretSchema } from './validator.js';
4
+ import { validateContractType, validateFerretSchema } from './validator.js';
5
5
  import { hashSchema } from './hash.js';
6
6
  /**
7
7
  * Extracts a FerretContract from a spec file's YAML frontmatter.
@@ -25,23 +25,29 @@ export function extractFromSpecFile(filePath, fileContent) {
25
25
  warning: 'no-frontmatter',
26
26
  };
27
27
  }
28
- const missingFields = ['id', 'type', 'shape'].filter(f => !ferret[f]);
28
+ const missingFields = ['id', 'type', 'shape'].filter((f) => !ferret[f]);
29
29
  if (missingFields.length > 0) {
30
30
  throw new Error(`Missing required frontmatter fields in ${filePath}: ${missingFields.join(', ')}`);
31
31
  }
32
+ const typeValidation = validateContractType(ferret.type, filePath);
33
+ if (!typeValidation.valid) {
34
+ throw new Error(typeValidation.error);
35
+ }
32
36
  // validateFerretSchema never throws — only warns on unsupported keywords
33
37
  const validation = validateFerretSchema(ferret.shape, filePath);
34
- validation.warnings.forEach(w => process.stderr.write(w + '\n'));
38
+ validation.warnings.forEach((w) => process.stderr.write(w + '\n'));
35
39
  return {
36
40
  filePath,
37
41
  fileType: 'spec',
38
- contracts: [{
42
+ contracts: [
43
+ {
39
44
  id: ferret.id,
40
- type: ferret.type,
45
+ type: typeValidation.value,
41
46
  shape: ferret.shape,
42
47
  shape_hash: hashSchema(ferret.shape),
43
48
  imports: Array.isArray(ferret.imports) ? ferret.imports : [],
44
- }],
49
+ },
50
+ ],
45
51
  extractedBy: 'gray-matter',
46
52
  extractedAt: Date.now(),
47
53
  };
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/extractor/frontmatter.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kFAAkF;AAElF,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiBvC;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,WAAmB;IAEnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,QAAQ;YACR,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;YACvB,OAAO,EAAE,gBAAgB;SAC1B,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,0CAA0C,QAAQ,KAAK,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,QAAQ;QACR,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,CAAC;gBACV,EAAE,EAAE,MAAM,CAAC,EAAY;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAc;gBAC3B,KAAK,EAAE,MAAM,CAAC,KAAe;gBAC7B,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;gBACpC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAmB,CAAC,CAAC,CAAC,EAAE;aACzE,CAAC;QACF,WAAW,EAAE,aAAa;QAC1B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;KACxB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/extractor/frontmatter.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kFAAkF;AAElF,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAkBvC;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,WAAmB;IACvE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,QAAQ;YACR,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;YACvB,OAAO,EAAE,gBAAgB;SAC1B,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,KAAK,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,yEAAyE;IACzE,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAEnE,OAAO;QACL,QAAQ;QACR,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE;YACT;gBACE,EAAE,EAAE,MAAM,CAAC,EAAY;gBACvB,IAAI,EAAE,cAAc,CAAC,KAAK;gBAC1B,KAAK,EAAE,MAAM,CAAC,KAAe;gBAC7B,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;gBACpC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,OAAoB,CAAC,CAAC,CAAC,EAAE;aAC3E;SACF;QACD,WAAW,EAAE,aAAa;QAC1B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;KACxB,CAAC;AACJ,CAAC"}
@@ -1,13 +1,18 @@
1
- export type ContractType = "api" | "table" | "type" | "event" | "flow" | "config";
1
+ import { type ContractType } from './contract-types.js';
2
+ export type { ContractType } from './contract-types.js';
2
3
  export interface ExtractedCodeContract {
3
4
  id: string;
4
5
  type: ContractType;
5
6
  shape: Record<string, unknown>;
6
7
  sourceSymbol: string;
7
8
  filePath: string;
9
+ idSource?: 'inferred' | 'annotated';
8
10
  }
9
11
  export interface TypeScriptExtractionResult {
10
12
  contracts: ExtractedCodeContract[];
13
+ /** Hard failures — annotation parse errors, unmatched annotations, tree-sitter parse failures. */
14
+ errors: string[];
15
+ /** Soft warnings — unsupported type fallbacks, partial extractions. Detection succeeded but schema is approximate. */
11
16
  diagnostics: string[];
12
17
  }
13
18
  export declare function extractContractsFromTypeScript(filePath: string, content: string): TypeScriptExtractionResult;
@@ -1 +1 @@
1
- {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/extractor/typescript.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,KAAK,GACL,OAAO,GACP,MAAM,GACN,OAAO,GACP,MAAM,GACN,QAAQ,CAAC;AAEb,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;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA4PD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,0BAA0B,CAgC5B"}
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;AAggBD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,0BAA0B,CA+D5G"}