@glubean/scanner 0.1.35 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contract-extraction.d.ts +135 -108
- package/dist/contract-extraction.d.ts.map +1 -1
- package/dist/contract-extraction.js +204 -127
- package/dist/contract-extraction.js.map +1 -1
- package/dist/index.d.ts +18 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -12
- package/dist/index.js.map +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +70 -25
- package/dist/scanner.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -2,12 +2,18 @@
|
|
|
2
2
|
* Runtime contract extraction — dynamically imports .contract.ts modules
|
|
3
3
|
* and extracts metadata from exported contract objects.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Scanner is duck-typing-only (no @glubean/sdk dependency). We recognize
|
|
6
|
+
* shapes without importing types.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
8
|
+
* Output:
|
|
9
|
+
* - NormalizedContractMeta — JSON-safe contract projection (mirrors
|
|
10
|
+
* ExtractedContractProjection from sdk, plus `exportName`)
|
|
11
|
+
* - NormalizedFlowMeta — JSON-safe flow projection (mirrors
|
|
12
|
+
* ExtractedFlowProjection, plus `exportName`)
|
|
13
|
+
*
|
|
14
|
+
* Schema conversion: anywhere scanner sees a value with `.toJSONSchema()`
|
|
15
|
+
* it invokes that method. This handles Zod schemas embedded inside
|
|
16
|
+
* adapter-defined `schemas` opaque blobs without knowing the protocol.
|
|
11
17
|
*/
|
|
12
18
|
/** Case lifecycle. */
|
|
13
19
|
export type CaseLifecycle = "active" | "deferred" | "deprecated";
|
|
@@ -30,7 +36,11 @@ export interface NormalizedParamMeta {
|
|
|
30
36
|
required?: boolean;
|
|
31
37
|
deprecated?: boolean;
|
|
32
38
|
}
|
|
33
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Protocol-agnostic case metadata. Mirrors sdk's `ExtractedCaseMeta`.
|
|
41
|
+
* `schemas` and `meta` are adapter-defined JSON-safe blobs; scanner treats
|
|
42
|
+
* them as opaque but converts any embedded `.toJSONSchema()` methods.
|
|
43
|
+
*/
|
|
34
44
|
export interface NormalizedCaseMeta {
|
|
35
45
|
key: string;
|
|
36
46
|
description?: string;
|
|
@@ -40,129 +50,106 @@ export interface NormalizedCaseMeta {
|
|
|
40
50
|
deprecatedReason?: string;
|
|
41
51
|
requires?: CaseRequires;
|
|
42
52
|
defaultRun?: CaseDefaultRun;
|
|
43
|
-
|
|
44
|
-
/** Protocol-specific expectations. HTTP: { status: 200 }, gRPC: { code: 0 } */
|
|
45
|
-
protocolExpect?: Record<string, unknown>;
|
|
46
|
-
responseSchema: unknown | null;
|
|
47
|
-
/** Response headers schema (OpenAPI + runtime validation) */
|
|
48
|
-
responseHeaders?: unknown | null;
|
|
49
|
-
/** Response content-type (HTTP-specific) */
|
|
50
|
-
responseContentType?: string;
|
|
51
|
-
/** Named response examples for OpenAPI docs */
|
|
52
|
-
examples?: Record<string, NormalizedExample>;
|
|
53
|
-
/** Per-path-param metadata */
|
|
54
|
-
paramSchemas?: Record<string, NormalizedParamMeta>;
|
|
55
|
-
/** Per-query-param metadata */
|
|
56
|
-
querySchemas?: Record<string, NormalizedParamMeta>;
|
|
57
|
-
/** Fully merged extensions (defaults < contract < case). Keys are x-* OpenAPI extensions. */
|
|
53
|
+
tags?: string[];
|
|
58
54
|
extensions?: Record<string, unknown>;
|
|
55
|
+
/** Adapter-defined payload shape (opaque to scanner). */
|
|
56
|
+
schemas?: unknown;
|
|
57
|
+
/** Adapter-defined free-form meta (opaque). */
|
|
58
|
+
meta?: unknown;
|
|
59
59
|
}
|
|
60
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Protocol-agnostic contract metadata. Mirrors `ExtractedContractProjection`.
|
|
62
|
+
*/
|
|
61
63
|
export interface NormalizedContractMeta {
|
|
62
64
|
id: string;
|
|
63
65
|
exportName: string;
|
|
64
66
|
protocol: string;
|
|
65
|
-
/** Protocol-agnostic target
|
|
67
|
+
/** Protocol-agnostic target (HTTP: "POST /users"). */
|
|
66
68
|
target: string;
|
|
67
69
|
description?: string;
|
|
68
70
|
feature?: string;
|
|
69
71
|
instanceName?: string;
|
|
70
|
-
|
|
71
|
-
schemaMount?: string;
|
|
72
|
-
requestSchema: unknown | null;
|
|
73
|
-
/** Request content type (HTTP-specific; default application/json) */
|
|
74
|
-
requestContentType?: string;
|
|
75
|
-
/** Contract-level deprecation reason (propagates to all cases) */
|
|
72
|
+
tags?: string[];
|
|
76
73
|
deprecated?: string;
|
|
77
|
-
/** Contract-level merged extensions (defaults < contract). Keys are x-* OpenAPI extensions. */
|
|
78
74
|
extensions?: Record<string, unknown>;
|
|
79
|
-
|
|
75
|
+
schemas?: unknown;
|
|
76
|
+
meta?: unknown;
|
|
80
77
|
cases: NormalizedCaseMeta[];
|
|
81
78
|
}
|
|
82
79
|
/**
|
|
83
|
-
* @deprecated Alias for NormalizedContractMeta. Use
|
|
80
|
+
* @deprecated Alias for NormalizedContractMeta. Use directly.
|
|
84
81
|
*/
|
|
85
82
|
export type ExtractedContract = NormalizedContractMeta;
|
|
86
|
-
/**
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Single step in a flow projection. Discriminated by `kind`.
|
|
85
|
+
*/
|
|
86
|
+
export type NormalizedFlowStep = {
|
|
87
|
+
kind: "contract-call";
|
|
88
|
+
name?: string;
|
|
89
|
+
contractId: string;
|
|
90
|
+
caseKey: string;
|
|
91
|
+
protocol: string;
|
|
92
|
+
target: string;
|
|
93
|
+
inputs?: NormalizedFieldMapping[];
|
|
94
|
+
outputs?: NormalizedFieldMapping[];
|
|
95
|
+
} | {
|
|
96
|
+
kind: "compute";
|
|
97
|
+
name?: string;
|
|
98
|
+
reads: string[];
|
|
99
|
+
writes: string[];
|
|
100
|
+
};
|
|
101
|
+
export interface NormalizedFieldMapping {
|
|
102
|
+
target: string;
|
|
103
|
+
source: {
|
|
104
|
+
kind: "path";
|
|
105
|
+
path: string;
|
|
106
|
+
} | {
|
|
107
|
+
kind: "literal";
|
|
108
|
+
value: unknown;
|
|
109
|
+
} | {
|
|
110
|
+
kind: "pass-through";
|
|
111
|
+
};
|
|
93
112
|
}
|
|
94
113
|
/**
|
|
95
|
-
*
|
|
96
|
-
* HttpContract extends Array<Test> and has id + endpoint.
|
|
114
|
+
* Protocol-agnostic flow metadata. Mirrors `ExtractedFlowProjection`.
|
|
97
115
|
*/
|
|
98
|
-
export
|
|
116
|
+
export interface NormalizedFlowMeta {
|
|
99
117
|
id: string;
|
|
100
|
-
|
|
118
|
+
exportName: string;
|
|
119
|
+
protocol: "flow";
|
|
101
120
|
description?: string;
|
|
102
|
-
|
|
103
|
-
instanceName?: string;
|
|
104
|
-
security?: unknown;
|
|
105
|
-
deprecated?: string;
|
|
121
|
+
tags?: string[];
|
|
106
122
|
extensions?: Record<string, unknown>;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
toJSONSchema?: () => unknown;
|
|
118
|
-
};
|
|
119
|
-
responseContentType?: string;
|
|
120
|
-
example?: unknown;
|
|
121
|
-
examples?: Record<string, {
|
|
122
|
-
value: unknown;
|
|
123
|
-
summary?: string;
|
|
124
|
-
description?: string;
|
|
125
|
-
}>;
|
|
126
|
-
paramSchemas?: Record<string, {
|
|
127
|
-
schema?: {
|
|
128
|
-
toJSONSchema?: () => unknown;
|
|
129
|
-
};
|
|
130
|
-
description?: string;
|
|
131
|
-
required?: boolean;
|
|
132
|
-
deprecated?: boolean;
|
|
133
|
-
}>;
|
|
134
|
-
querySchemas?: Record<string, {
|
|
135
|
-
schema?: {
|
|
136
|
-
toJSONSchema?: () => unknown;
|
|
137
|
-
};
|
|
138
|
-
description?: string;
|
|
139
|
-
required?: boolean;
|
|
140
|
-
deprecated?: boolean;
|
|
141
|
-
}>;
|
|
142
|
-
description?: string;
|
|
143
|
-
deferred?: string;
|
|
144
|
-
deprecated?: string;
|
|
145
|
-
severity?: string;
|
|
146
|
-
lifecycle?: string;
|
|
147
|
-
requires?: string;
|
|
148
|
-
defaultRun?: string;
|
|
149
|
-
extensions?: Record<string, unknown>;
|
|
123
|
+
setupDynamic?: true;
|
|
124
|
+
steps: NormalizedFlowStep[];
|
|
125
|
+
}
|
|
126
|
+
/** Result of extracting contracts/flows from one or more files. */
|
|
127
|
+
export interface ExtractionResult {
|
|
128
|
+
contracts: NormalizedContractMeta[];
|
|
129
|
+
flows?: NormalizedFlowMeta[];
|
|
130
|
+
errors: Array<{
|
|
131
|
+
file: string;
|
|
132
|
+
error: string;
|
|
150
133
|
}>;
|
|
151
|
-
}
|
|
134
|
+
}
|
|
152
135
|
/**
|
|
153
|
-
* Check if a value looks like a ProtocolContract
|
|
154
|
-
* ProtocolContract extends Array<Test> and has _projection with protocol + target.
|
|
136
|
+
* Check if a value looks like a ProtocolContract.
|
|
137
|
+
* ProtocolContract extends Array<Test> and has `_projection` with protocol + target.
|
|
138
|
+
* (HTTP contracts now go through the same shape since the rewrite.)
|
|
155
139
|
*/
|
|
156
140
|
export declare function isProtocolContract(val: unknown): val is {
|
|
157
141
|
_projection: {
|
|
142
|
+
id?: string;
|
|
158
143
|
protocol: string;
|
|
159
144
|
target: string;
|
|
160
145
|
description?: string;
|
|
161
146
|
feature?: string;
|
|
162
147
|
instanceName?: string;
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
148
|
+
tags?: string[];
|
|
149
|
+
deprecated?: string;
|
|
150
|
+
extensions?: Record<string, unknown>;
|
|
151
|
+
schemas?: unknown;
|
|
152
|
+
meta?: unknown;
|
|
166
153
|
cases: Array<{
|
|
167
154
|
key: string;
|
|
168
155
|
description?: string;
|
|
@@ -172,28 +159,68 @@ export declare function isProtocolContract(val: unknown): val is {
|
|
|
172
159
|
deprecatedReason?: string;
|
|
173
160
|
requires?: string;
|
|
174
161
|
defaultRun?: string;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
162
|
+
tags?: string[];
|
|
163
|
+
extensions?: Record<string, unknown>;
|
|
164
|
+
schemas?: unknown;
|
|
165
|
+
meta?: unknown;
|
|
179
166
|
}>;
|
|
180
|
-
protocolMeta?: Record<string, unknown>;
|
|
181
167
|
};
|
|
182
168
|
};
|
|
183
169
|
/**
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
170
|
+
* Check if a value looks like a FlowContract.
|
|
171
|
+
* FlowContract extends Array<Test> and has `_flow.protocol === "flow"`.
|
|
172
|
+
*
|
|
173
|
+
* May also carry `_extracted` — a pre-computed ExtractedFlowProjection
|
|
174
|
+
* populated by the SDK's flow builder via `normalizeFlow(_flow)`. When
|
|
175
|
+
* present it is the source of truth for scanner output (full field
|
|
176
|
+
* mappings, compute reads/writes). When absent we degrade to duck-typing
|
|
177
|
+
* `_flow` directly (no lens proxy tracing in scanner since it is
|
|
178
|
+
* dependency-free).
|
|
179
|
+
*/
|
|
180
|
+
export declare function isFlowContract(val: unknown): val is {
|
|
181
|
+
_flow: {
|
|
182
|
+
id: string;
|
|
183
|
+
protocol: "flow";
|
|
184
|
+
description?: string;
|
|
185
|
+
tags?: string[];
|
|
186
|
+
extensions?: Record<string, unknown>;
|
|
187
|
+
setup?: (...args: any[]) => unknown;
|
|
188
|
+
teardown?: (...args: any[]) => unknown;
|
|
189
|
+
steps: Array<any>;
|
|
190
|
+
};
|
|
191
|
+
_extracted?: {
|
|
192
|
+
id: string;
|
|
193
|
+
protocol: "flow";
|
|
194
|
+
description?: string;
|
|
195
|
+
tags?: string[];
|
|
196
|
+
extensions?: Record<string, unknown>;
|
|
197
|
+
setupDynamic?: true;
|
|
198
|
+
steps: Array<any>;
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* Convert a live schema (Zod/Valibot/etc.) to a JSON Schema plain object.
|
|
203
|
+
* Falls back to passing through or null.
|
|
187
204
|
*/
|
|
188
205
|
export declare function schemaToJsonSchema(schema: unknown): unknown | null;
|
|
189
206
|
/**
|
|
190
|
-
*
|
|
191
|
-
*
|
|
207
|
+
* Recursively walk a value converting any embedded Zod/valibot schemas
|
|
208
|
+
* (detected by `.toJSONSchema()` method) to plain JSON Schema objects.
|
|
209
|
+
* Other values pass through as-is.
|
|
210
|
+
*
|
|
211
|
+
* Used by scanner to produce JSON-safe output even when adapter didn't run
|
|
212
|
+
* `.normalize()` (e.g. when we read `_projection` directly).
|
|
213
|
+
*/
|
|
214
|
+
export declare function deepNormalizeSchemas(value: unknown, depth?: number): unknown;
|
|
215
|
+
/**
|
|
216
|
+
* Extract contracts + flows from a single file by dynamic import.
|
|
217
|
+
* One file's import failure does not block others.
|
|
192
218
|
*/
|
|
193
219
|
export declare function extractContractFromFile(filePath: string): Promise<ExtractionResult>;
|
|
194
220
|
/**
|
|
195
|
-
* Extract contracts from all
|
|
196
|
-
* Each file is imported independently — one file's failure does not block others.
|
|
221
|
+
* Extract contracts + flows from all recognized files in a project.
|
|
197
222
|
*/
|
|
198
223
|
export declare function extractContractsFromProject(dir: string): Promise<ExtractionResult>;
|
|
224
|
+
/** @deprecated Removed in v0.2 — HTTP now goes through isProtocolContract. */
|
|
225
|
+
export declare function isHttpContract(_val: unknown): never;
|
|
199
226
|
//# sourceMappingURL=contract-extraction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-extraction.d.ts","sourceRoot":"","sources":["../src/contract-extraction.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"contract-extraction.d.ts","sourceRoot":"","sources":["../src/contract-extraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,18 @@
|
|
|
2
2
|
* Runtime contract extraction — dynamically imports .contract.ts modules
|
|
3
3
|
* and extracts metadata from exported contract objects.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Scanner is duck-typing-only (no @glubean/sdk dependency). We recognize
|
|
6
|
+
* shapes without importing types.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
8
|
+
* Output:
|
|
9
|
+
* - NormalizedContractMeta — JSON-safe contract projection (mirrors
|
|
10
|
+
* ExtractedContractProjection from sdk, plus `exportName`)
|
|
11
|
+
* - NormalizedFlowMeta — JSON-safe flow projection (mirrors
|
|
12
|
+
* ExtractedFlowProjection, plus `exportName`)
|
|
13
|
+
*
|
|
14
|
+
* Schema conversion: anywhere scanner sees a value with `.toJSONSchema()`
|
|
15
|
+
* it invokes that method. This handles Zod schemas embedded inside
|
|
16
|
+
* adapter-defined `schemas` opaque blobs without knowing the protocol.
|
|
11
17
|
*/
|
|
12
18
|
import { pathToFileURL } from "node:url";
|
|
13
19
|
import { resolve, basename } from "node:path";
|
|
@@ -16,32 +22,41 @@ import { readdirSync, statSync } from "node:fs";
|
|
|
16
22
|
// Duck typing
|
|
17
23
|
// =============================================================================
|
|
18
24
|
/**
|
|
19
|
-
* Check if a value looks like
|
|
20
|
-
*
|
|
21
|
-
|
|
22
|
-
export function isHttpContract(val) {
|
|
23
|
-
return (Array.isArray(val) &&
|
|
24
|
-
typeof val.id === "string" &&
|
|
25
|
-
typeof val.endpoint === "string");
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Check if a value looks like a ProtocolContract (duck-typing).
|
|
29
|
-
* ProtocolContract extends Array<Test> and has _projection with protocol + target.
|
|
25
|
+
* Check if a value looks like a ProtocolContract.
|
|
26
|
+
* ProtocolContract extends Array<Test> and has `_projection` with protocol + target.
|
|
27
|
+
* (HTTP contracts now go through the same shape since the rewrite.)
|
|
30
28
|
*/
|
|
31
29
|
export function isProtocolContract(val) {
|
|
32
30
|
return (Array.isArray(val) &&
|
|
33
31
|
typeof val._projection === "object" &&
|
|
34
32
|
val._projection !== null &&
|
|
35
33
|
typeof val._projection.protocol === "string" &&
|
|
36
|
-
typeof val._projection.target === "string"
|
|
34
|
+
typeof val._projection.target === "string" &&
|
|
35
|
+
val._projection.protocol !== "flow");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if a value looks like a FlowContract.
|
|
39
|
+
* FlowContract extends Array<Test> and has `_flow.protocol === "flow"`.
|
|
40
|
+
*
|
|
41
|
+
* May also carry `_extracted` — a pre-computed ExtractedFlowProjection
|
|
42
|
+
* populated by the SDK's flow builder via `normalizeFlow(_flow)`. When
|
|
43
|
+
* present it is the source of truth for scanner output (full field
|
|
44
|
+
* mappings, compute reads/writes). When absent we degrade to duck-typing
|
|
45
|
+
* `_flow` directly (no lens proxy tracing in scanner since it is
|
|
46
|
+
* dependency-free).
|
|
47
|
+
*/
|
|
48
|
+
export function isFlowContract(val) {
|
|
49
|
+
return (Array.isArray(val) &&
|
|
50
|
+
typeof val._flow === "object" &&
|
|
51
|
+
val._flow !== null &&
|
|
52
|
+
val._flow.protocol === "flow");
|
|
37
53
|
}
|
|
38
54
|
// =============================================================================
|
|
39
|
-
// Schema conversion
|
|
55
|
+
// Schema conversion — embedded .toJSONSchema() recursive walk
|
|
40
56
|
// =============================================================================
|
|
41
57
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* Returns null if the schema is not a Zod type or conversion fails.
|
|
58
|
+
* Convert a live schema (Zod/Valibot/etc.) to a JSON Schema plain object.
|
|
59
|
+
* Falls back to passing through or null.
|
|
45
60
|
*/
|
|
46
61
|
export function schemaToJsonSchema(schema) {
|
|
47
62
|
if (!schema || typeof schema !== "object")
|
|
@@ -56,104 +71,55 @@ export function schemaToJsonSchema(schema) {
|
|
|
56
71
|
}
|
|
57
72
|
return null;
|
|
58
73
|
}
|
|
59
|
-
// =============================================================================
|
|
60
|
-
// Mapping functions
|
|
61
|
-
// =============================================================================
|
|
62
74
|
/**
|
|
63
|
-
*
|
|
75
|
+
* Recursively walk a value converting any embedded Zod/valibot schemas
|
|
76
|
+
* (detected by `.toJSONSchema()` method) to plain JSON Schema objects.
|
|
77
|
+
* Other values pass through as-is.
|
|
78
|
+
*
|
|
79
|
+
* Used by scanner to produce JSON-safe output even when adapter didn't run
|
|
80
|
+
* `.normalize()` (e.g. when we read `_projection` directly).
|
|
64
81
|
*/
|
|
65
|
-
function
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
for (const [k, v] of Object.entries(m)) {
|
|
79
|
-
result[k] = {
|
|
80
|
-
schema: schemaToJsonSchema(v.schema),
|
|
81
|
-
description: v.description,
|
|
82
|
-
required: v.required,
|
|
83
|
-
deprecated: v.deprecated,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
return result;
|
|
87
|
-
};
|
|
88
|
-
// Normalize examples: prefer meta.examples, fall back to meta.example (single)
|
|
89
|
-
let examples;
|
|
90
|
-
if (meta.examples) {
|
|
91
|
-
examples = {};
|
|
92
|
-
for (const [name, ex] of Object.entries(meta.examples)) {
|
|
93
|
-
examples[name] = { value: ex.value, summary: ex.summary, description: ex.description };
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
else if (meta.example !== undefined) {
|
|
97
|
-
examples = { default: { value: meta.example } };
|
|
98
|
-
}
|
|
99
|
-
cases.push({
|
|
100
|
-
key,
|
|
101
|
-
description: meta.description,
|
|
102
|
-
lifecycle,
|
|
103
|
-
severity: meta.severity ?? "warning",
|
|
104
|
-
deferredReason: meta.deferred,
|
|
105
|
-
deprecatedReason: meta.deprecated,
|
|
106
|
-
requires: meta.requires,
|
|
107
|
-
defaultRun: meta.defaultRun,
|
|
108
|
-
schemaMount: "response.body",
|
|
109
|
-
protocolExpect: meta.expectStatus != null
|
|
110
|
-
? { status: meta.expectStatus }
|
|
111
|
-
: undefined,
|
|
112
|
-
responseSchema: schemaToJsonSchema(meta.responseSchema),
|
|
113
|
-
responseHeaders: schemaToJsonSchema(meta.responseHeaders),
|
|
114
|
-
responseContentType: meta.responseContentType,
|
|
115
|
-
examples,
|
|
116
|
-
paramSchemas: mapParamMeta(meta.paramSchemas),
|
|
117
|
-
querySchemas: mapParamMeta(meta.querySchemas),
|
|
118
|
-
extensions: meta.extensions,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
82
|
+
export function deepNormalizeSchemas(value, depth = 0) {
|
|
83
|
+
if (depth > 20)
|
|
84
|
+
return value;
|
|
85
|
+
if (value == null)
|
|
86
|
+
return value;
|
|
87
|
+
if (typeof value !== "object")
|
|
88
|
+
return value;
|
|
89
|
+
// Has toJSONSchema? Convert it.
|
|
90
|
+
if (typeof value.toJSONSchema === "function") {
|
|
91
|
+
const converted = schemaToJsonSchema(value);
|
|
92
|
+
if (converted != null)
|
|
93
|
+
return converted;
|
|
94
|
+
return null;
|
|
121
95
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
security: value.security,
|
|
131
|
-
schemaMount: "response.body",
|
|
132
|
-
requestSchema: schemaToJsonSchema(value.request),
|
|
133
|
-
requestContentType: value.requestContentType,
|
|
134
|
-
deprecated: value.deprecated,
|
|
135
|
-
extensions: value.extensions,
|
|
136
|
-
cases,
|
|
137
|
-
};
|
|
96
|
+
if (Array.isArray(value)) {
|
|
97
|
+
return value.map((v) => deepNormalizeSchemas(v, depth + 1));
|
|
98
|
+
}
|
|
99
|
+
const out = {};
|
|
100
|
+
for (const [k, v] of Object.entries(value)) {
|
|
101
|
+
out[k] = deepNormalizeSchemas(v, depth + 1);
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
138
104
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
105
|
+
// =============================================================================
|
|
106
|
+
// Mapping: projection → NormalizedContractMeta
|
|
107
|
+
// =============================================================================
|
|
142
108
|
function protocolContractToNormalized(value, exportName) {
|
|
143
109
|
const proj = value._projection;
|
|
144
110
|
return {
|
|
145
|
-
id: proj.id ?? exportName,
|
|
111
|
+
id: proj.id ?? exportName,
|
|
146
112
|
exportName,
|
|
147
113
|
protocol: proj.protocol,
|
|
148
114
|
target: proj.target,
|
|
149
115
|
description: proj.description,
|
|
150
116
|
feature: proj.feature,
|
|
151
117
|
instanceName: proj.instanceName,
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
118
|
+
tags: proj.tags,
|
|
119
|
+
deprecated: proj.deprecated,
|
|
120
|
+
extensions: proj.extensions,
|
|
121
|
+
schemas: proj.schemas != null ? deepNormalizeSchemas(proj.schemas) : undefined,
|
|
122
|
+
meta: proj.meta,
|
|
157
123
|
cases: (proj.cases ?? []).map((c) => ({
|
|
158
124
|
key: c.key,
|
|
159
125
|
description: c.description,
|
|
@@ -163,29 +129,122 @@ function protocolContractToNormalized(value, exportName) {
|
|
|
163
129
|
deprecatedReason: c.deprecatedReason,
|
|
164
130
|
requires: c.requires,
|
|
165
131
|
defaultRun: c.defaultRun,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
132
|
+
tags: c.tags,
|
|
133
|
+
extensions: c.extensions,
|
|
134
|
+
schemas: c.schemas != null ? deepNormalizeSchemas(c.schemas) : undefined,
|
|
135
|
+
meta: c.meta,
|
|
170
136
|
})),
|
|
171
137
|
};
|
|
172
138
|
}
|
|
139
|
+
function flowContractToNormalized(value, exportName) {
|
|
140
|
+
// Prefer the pre-computed extracted projection. The SDK's flow builder
|
|
141
|
+
// populates `_extracted` via `normalizeFlow(_flow)` — this path carries
|
|
142
|
+
// full FieldMapping data for `.step()` lenses and reads/writes for
|
|
143
|
+
// `.compute()` nodes. Scanner just attaches `exportName`.
|
|
144
|
+
if (value._extracted) {
|
|
145
|
+
const ex = value._extracted;
|
|
146
|
+
return {
|
|
147
|
+
id: ex.id,
|
|
148
|
+
exportName,
|
|
149
|
+
protocol: "flow",
|
|
150
|
+
description: ex.description,
|
|
151
|
+
tags: ex.tags,
|
|
152
|
+
extensions: ex.extensions,
|
|
153
|
+
setupDynamic: ex.setupDynamic,
|
|
154
|
+
steps: (ex.steps ?? []).map((s) => {
|
|
155
|
+
if (s.kind === "compute") {
|
|
156
|
+
return {
|
|
157
|
+
kind: "compute",
|
|
158
|
+
name: s.name,
|
|
159
|
+
reads: s.reads ?? [],
|
|
160
|
+
writes: s.writes ?? [],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
kind: "contract-call",
|
|
165
|
+
name: s.name,
|
|
166
|
+
contractId: s.contractId ?? "",
|
|
167
|
+
caseKey: s.caseKey ?? "",
|
|
168
|
+
protocol: s.protocol ?? "",
|
|
169
|
+
target: s.target ?? "",
|
|
170
|
+
inputs: s.inputs,
|
|
171
|
+
outputs: s.outputs,
|
|
172
|
+
};
|
|
173
|
+
}),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Fallback: duck-type `_flow` directly. Lens tracing is unavailable
|
|
177
|
+
// here (scanner is dep-free); callers downstream lose FieldMappings +
|
|
178
|
+
// compute reads/writes. In practice this only fires for flows
|
|
179
|
+
// constructed outside the canonical SDK path (e.g. test fixtures).
|
|
180
|
+
const f = value._flow;
|
|
181
|
+
return {
|
|
182
|
+
id: f.id,
|
|
183
|
+
exportName,
|
|
184
|
+
protocol: "flow",
|
|
185
|
+
description: f.description,
|
|
186
|
+
tags: f.tags,
|
|
187
|
+
extensions: f.extensions,
|
|
188
|
+
setupDynamic: f.setup ? true : undefined,
|
|
189
|
+
steps: (f.steps ?? []).map((s) => {
|
|
190
|
+
if (s.kind === "compute") {
|
|
191
|
+
return { kind: "compute", name: s.name, reads: [], writes: [] };
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
kind: "contract-call",
|
|
195
|
+
name: s.name,
|
|
196
|
+
contractId: s.contract?._projection?.id ?? s.ref?.contractId ?? "",
|
|
197
|
+
caseKey: s.caseKey ?? s.ref?.caseKey ?? "",
|
|
198
|
+
protocol: s.ref?.protocol ?? "",
|
|
199
|
+
target: s.ref?.target ?? "",
|
|
200
|
+
};
|
|
201
|
+
}),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// =============================================================================
|
|
205
|
+
// FlowBuilder auto-build
|
|
206
|
+
// =============================================================================
|
|
207
|
+
/**
|
|
208
|
+
* If `val` is an unbuilt FlowBuilder (from `contract.flow(id).step(...)`
|
|
209
|
+
* without a trailing `.build()`), call `.build()` to resolve it to a
|
|
210
|
+
* FlowContract. Scanner is dep-free, so we duck-type the builder shape.
|
|
211
|
+
*/
|
|
212
|
+
function autoBuildFlowBuilder(val) {
|
|
213
|
+
if (typeof val === "object" &&
|
|
214
|
+
val !== null &&
|
|
215
|
+
val.__glubean_type === "flow-builder" &&
|
|
216
|
+
typeof val.build === "function") {
|
|
217
|
+
try {
|
|
218
|
+
return val.build();
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return val;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return val;
|
|
225
|
+
}
|
|
173
226
|
// =============================================================================
|
|
174
227
|
// File-level extraction
|
|
175
228
|
// =============================================================================
|
|
176
229
|
/**
|
|
177
|
-
* Extract contracts from a single file by dynamic import.
|
|
178
|
-
*
|
|
230
|
+
* Extract contracts + flows from a single file by dynamic import.
|
|
231
|
+
* One file's import failure does not block others.
|
|
179
232
|
*/
|
|
180
233
|
export async function extractContractFromFile(filePath) {
|
|
181
234
|
const contracts = [];
|
|
235
|
+
const flows = [];
|
|
182
236
|
const errors = [];
|
|
183
237
|
const absolutePath = resolve(filePath);
|
|
184
238
|
try {
|
|
185
239
|
const mod = await import(pathToFileURL(absolutePath).href);
|
|
186
|
-
for (const [exportName,
|
|
187
|
-
|
|
188
|
-
|
|
240
|
+
for (const [exportName, rawValue] of Object.entries(mod)) {
|
|
241
|
+
// Auto-resolve unbuilt FlowBuilder exports. User code like
|
|
242
|
+
// `export const signup = contract.flow(...).step(...)` returns a
|
|
243
|
+
// FlowBuilder (not a FlowContract) because `.build()` is optional.
|
|
244
|
+
// Scanner must build it to reach the `_flow` projection.
|
|
245
|
+
const value = autoBuildFlowBuilder(rawValue);
|
|
246
|
+
if (isFlowContract(value)) {
|
|
247
|
+
flows.push(flowContractToNormalized(value, exportName));
|
|
189
248
|
}
|
|
190
249
|
else if (isProtocolContract(value)) {
|
|
191
250
|
contracts.push(protocolContractToNormalized(value, exportName));
|
|
@@ -196,15 +255,15 @@ export async function extractContractFromFile(filePath) {
|
|
|
196
255
|
const message = err instanceof Error ? err.message : String(err);
|
|
197
256
|
errors.push({ file: absolutePath, error: message });
|
|
198
257
|
}
|
|
199
|
-
return { contracts, errors };
|
|
258
|
+
return { contracts, flows: flows.length > 0 ? flows : undefined, errors };
|
|
200
259
|
}
|
|
201
260
|
// =============================================================================
|
|
202
261
|
// Project-level extraction
|
|
203
262
|
// =============================================================================
|
|
204
263
|
/**
|
|
205
|
-
* Find all .contract.{ts,js,mjs} files in a directory tree.
|
|
264
|
+
* Find all .contract.{ts,js,mjs} and .flow.{ts,js,mjs} files in a directory tree.
|
|
206
265
|
*/
|
|
207
|
-
function
|
|
266
|
+
function findContractAndFlowFiles(dir) {
|
|
208
267
|
const files = [];
|
|
209
268
|
const walk = (d) => {
|
|
210
269
|
for (const entry of readdirSync(d)) {
|
|
@@ -213,28 +272,46 @@ function findContractFiles(dir) {
|
|
|
213
272
|
continue;
|
|
214
273
|
if (statSync(full).isDirectory())
|
|
215
274
|
walk(full);
|
|
216
|
-
else
|
|
217
|
-
|
|
275
|
+
else {
|
|
276
|
+
const base = basename(entry);
|
|
277
|
+
if (base.includes(".contract.") || base.includes(".flow.")) {
|
|
278
|
+
files.push(full);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
218
281
|
}
|
|
219
282
|
};
|
|
220
283
|
walk(dir);
|
|
221
284
|
return files;
|
|
222
285
|
}
|
|
223
286
|
/**
|
|
224
|
-
* Extract contracts from all
|
|
225
|
-
* Each file is imported independently — one file's failure does not block others.
|
|
287
|
+
* Extract contracts + flows from all recognized files in a project.
|
|
226
288
|
*/
|
|
227
289
|
export async function extractContractsFromProject(dir) {
|
|
228
|
-
const
|
|
229
|
-
if (
|
|
290
|
+
const files = findContractAndFlowFiles(dir);
|
|
291
|
+
if (files.length === 0)
|
|
230
292
|
return { contracts: [], errors: [] };
|
|
231
293
|
const allContracts = [];
|
|
294
|
+
const allFlows = [];
|
|
232
295
|
const allErrors = [];
|
|
233
|
-
for (const filePath of
|
|
234
|
-
const { contracts, errors } = await extractContractFromFile(filePath);
|
|
296
|
+
for (const filePath of files) {
|
|
297
|
+
const { contracts, flows, errors } = await extractContractFromFile(filePath);
|
|
235
298
|
allContracts.push(...contracts);
|
|
299
|
+
if (flows)
|
|
300
|
+
allFlows.push(...flows);
|
|
236
301
|
allErrors.push(...errors);
|
|
237
302
|
}
|
|
238
|
-
return {
|
|
303
|
+
return {
|
|
304
|
+
contracts: allContracts,
|
|
305
|
+
flows: allFlows.length > 0 ? allFlows : undefined,
|
|
306
|
+
errors: allErrors,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
// =============================================================================
|
|
310
|
+
// Backward-compat: isHttpContract — removed permanently in v0.2.
|
|
311
|
+
// =============================================================================
|
|
312
|
+
/** @deprecated Removed in v0.2 — HTTP now goes through isProtocolContract. */
|
|
313
|
+
export function isHttpContract(_val) {
|
|
314
|
+
throw new Error("isHttpContract() was removed in v0.2. HTTP contracts now use the unified " +
|
|
315
|
+
"isProtocolContract() shape (_projection.protocol === 'http').");
|
|
239
316
|
}
|
|
240
317
|
//# sourceMappingURL=contract-extraction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-extraction.js","sourceRoot":"","sources":["../src/contract-extraction.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"contract-extraction.js","sourceRoot":"","sources":["../src/contract-extraction.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,13 +3,19 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Scanner for Glubean test files.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* - **Static analysis**: Uses regex patterns to extract metadata
|
|
8
|
-
* without importing files. Works everywhere.
|
|
9
|
-
* - **Runtime extraction**: Imports test files via tsx subprocess and reads
|
|
10
|
-
* metadata from the SDK's global registry (100% accurate).
|
|
6
|
+
* Two independent extraction paths:
|
|
11
7
|
*
|
|
12
|
-
*
|
|
8
|
+
* - **Static analysis (tests)** — regex-based, no `import()`. Discovers
|
|
9
|
+
* `test()` / `test.each()` / `test.pick()` call sites and returns case
|
|
10
|
+
* metadata from source alone. Always safe; never executes user code.
|
|
11
|
+
*
|
|
12
|
+
* - **Runtime extraction (contracts + flows)** — dynamic `import()` of
|
|
13
|
+
* `.contract.ts` and `.flow.ts` files. Recognizes `ProtocolContract`
|
|
14
|
+
* (via `_projection.protocol`) and `FlowContract` (via
|
|
15
|
+
* `_flow.protocol === "flow"`). Required because contracts/flows
|
|
16
|
+
* encode schemas and cases as runtime object shapes.
|
|
17
|
+
*
|
|
18
|
+
* @example Static analysis
|
|
13
19
|
* ```ts
|
|
14
20
|
* import { createScanner } from "@glubean/scanner";
|
|
15
21
|
*
|
|
@@ -18,12 +24,11 @@
|
|
|
18
24
|
* console.log(`Found ${result.testCount} tests`);
|
|
19
25
|
* ```
|
|
20
26
|
*
|
|
21
|
-
* @example
|
|
27
|
+
* @example Runtime contract extraction
|
|
22
28
|
* ```ts
|
|
23
|
-
* import {
|
|
29
|
+
* import { extractContractsFromProject } from "@glubean/scanner";
|
|
24
30
|
*
|
|
25
|
-
* const
|
|
26
|
-
* const exports = extractFromSource(content);
|
|
31
|
+
* const { contracts, flows, errors } = await extractContractsFromProject(".");
|
|
27
32
|
* ```
|
|
28
33
|
*/
|
|
29
34
|
export { isSpecVersionSupported, SPEC_VERSION, SUPPORTED_SPEC_VERSIONS } from "./spec.js";
|
|
@@ -32,8 +37,9 @@ export { Scanner } from "./scanner.js";
|
|
|
32
37
|
export type { FileSystem, Hasher, MetadataExtractor } from "./scanner.js";
|
|
33
38
|
export { createStaticExtractor, extractAliasesFromSource, extractContractCases, extractFromSource, isGlubeanFile } from "./extractor-static.js";
|
|
34
39
|
export type { ContractStaticMeta, ContractCaseStaticMeta } from "./extractor-static.js";
|
|
35
|
-
export { extractContractFromFile, extractContractsFromProject,
|
|
36
|
-
|
|
40
|
+
export { extractContractFromFile, extractContractsFromProject, isProtocolContract, isFlowContract, isHttpContract, // deprecated-throw, kept for diagnostic
|
|
41
|
+
schemaToJsonSchema, deepNormalizeSchemas, } from "./contract-extraction.js";
|
|
42
|
+
export type { NormalizedContractMeta, NormalizedCaseMeta, NormalizedExample, NormalizedParamMeta, NormalizedFlowMeta, NormalizedFlowStep, NormalizedFieldMapping, ExtractedContract, ExtractionResult, CaseLifecycle, CaseSeverity, CaseRequires, CaseDefaultRun, } from "./contract-extraction.js";
|
|
37
43
|
export { nodeFs, nodeHasher } from "./fs.js";
|
|
38
44
|
import { Scanner } from "./scanner.js";
|
|
39
45
|
import type { ScanOptions, ScanResult, ValidationResult } from "./types.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAG1F,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGlH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAG1E,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAChJ,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGxF,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,kBAAkB,EAClB,cAAc,EACd,cAAc,EAAE,wCAAwC;AACxD,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAU5E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAE5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,WAAW,GAAE,MAAqB,GAAG,OAAO,CAGzE"}
|
package/dist/index.js
CHANGED
|
@@ -3,13 +3,19 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Scanner for Glubean test files.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* - **Static analysis**: Uses regex patterns to extract metadata
|
|
8
|
-
* without importing files. Works everywhere.
|
|
9
|
-
* - **Runtime extraction**: Imports test files via tsx subprocess and reads
|
|
10
|
-
* metadata from the SDK's global registry (100% accurate).
|
|
6
|
+
* Two independent extraction paths:
|
|
11
7
|
*
|
|
12
|
-
*
|
|
8
|
+
* - **Static analysis (tests)** — regex-based, no `import()`. Discovers
|
|
9
|
+
* `test()` / `test.each()` / `test.pick()` call sites and returns case
|
|
10
|
+
* metadata from source alone. Always safe; never executes user code.
|
|
11
|
+
*
|
|
12
|
+
* - **Runtime extraction (contracts + flows)** — dynamic `import()` of
|
|
13
|
+
* `.contract.ts` and `.flow.ts` files. Recognizes `ProtocolContract`
|
|
14
|
+
* (via `_projection.protocol`) and `FlowContract` (via
|
|
15
|
+
* `_flow.protocol === "flow"`). Required because contracts/flows
|
|
16
|
+
* encode schemas and cases as runtime object shapes.
|
|
17
|
+
*
|
|
18
|
+
* @example Static analysis
|
|
13
19
|
* ```ts
|
|
14
20
|
* import { createScanner } from "@glubean/scanner";
|
|
15
21
|
*
|
|
@@ -18,12 +24,11 @@
|
|
|
18
24
|
* console.log(`Found ${result.testCount} tests`);
|
|
19
25
|
* ```
|
|
20
26
|
*
|
|
21
|
-
* @example
|
|
27
|
+
* @example Runtime contract extraction
|
|
22
28
|
* ```ts
|
|
23
|
-
* import {
|
|
29
|
+
* import { extractContractsFromProject } from "@glubean/scanner";
|
|
24
30
|
*
|
|
25
|
-
* const
|
|
26
|
-
* const exports = extractFromSource(content);
|
|
31
|
+
* const { contracts, flows, errors } = await extractContractsFromProject(".");
|
|
27
32
|
* ```
|
|
28
33
|
*/
|
|
29
34
|
// Re-export spec constants
|
|
@@ -32,8 +37,9 @@ export { isSpecVersionSupported, SPEC_VERSION, SUPPORTED_SPEC_VERSIONS } from ".
|
|
|
32
37
|
export { Scanner } from "./scanner.js";
|
|
33
38
|
// Re-export static analysis extractor
|
|
34
39
|
export { createStaticExtractor, extractAliasesFromSource, extractContractCases, extractFromSource, isGlubeanFile } from "./extractor-static.js";
|
|
35
|
-
// Re-export runtime contract extraction
|
|
36
|
-
export { extractContractFromFile, extractContractsFromProject,
|
|
40
|
+
// Re-export runtime contract + flow extraction
|
|
41
|
+
export { extractContractFromFile, extractContractsFromProject, isProtocolContract, isFlowContract, isHttpContract, // deprecated-throw, kept for diagnostic
|
|
42
|
+
schemaToJsonSchema, deepNormalizeSchemas, } from "./contract-extraction.js";
|
|
37
43
|
// Re-export file system implementations
|
|
38
44
|
export { nodeFs, nodeHasher } from "./fs.js";
|
|
39
45
|
// Imports for convenience functions
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,2BAA2B;AAC3B,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAK1F,yCAAyC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,sCAAsC;AACtC,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGhJ,+CAA+C;AAC/C,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,kBAAkB,EAClB,cAAc,EACd,cAAc,EAAE,wCAAwC;AACxD,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAiBlC,wCAAwC;AACxC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE7C,oCAAoC;AACpC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,6CAA6C;AAC7C,MAAM,cAAc,GAAG,IAAI,OAAO,CAChC,MAAM,EACN,UAAU,EACV,YAAY,EACZ,qBAAqB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CACvD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,OAAqB;IACrD,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,cAAsB,YAAY;IAC9D,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/scanner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAY,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElG,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,uCAAuC;IACvC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,sDAAsD;IACtD,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GACpD,aAAa,CAAC,MAAM,CAAC,CAAC;IACzB,yBAAyB;IACzB,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACpC,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/C,+BAA+B;IAC/B,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,8BAA8B;AAC9B,MAAM,WAAW,MAAM;IACrB,8DAA8D;IAC9D,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C;AAED,sDAAsD;AACtD,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAqBlG;;;;GAIG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAoB;gBAG7C,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,MAAqB,EAClC,SAAS,CAAC,EAAE,iBAAiB;IAiB/B;;;OAGG;YACW,cAAc;IAmB5B;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwEtD;;;;;;OAMG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;CAqMxE"}
|
package/dist/scanner.js
CHANGED
|
@@ -11,12 +11,16 @@ const DEFAULT_SKIP_DIRS = ["node_modules", ".git", "dist", "build"];
|
|
|
11
11
|
const DEFAULT_EXTENSIONS = [".ts", ".js", ".mjs"];
|
|
12
12
|
const TEST_FILE_SUFFIXES = [".test.ts", ".test.js", ".test.mjs"];
|
|
13
13
|
const CONTRACT_FILE_SUFFIXES = [".contract.ts", ".contract.js", ".contract.mjs"];
|
|
14
|
+
const FLOW_FILE_SUFFIXES = [".flow.ts", ".flow.js", ".flow.mjs"];
|
|
14
15
|
function isTestFile(filePath) {
|
|
15
16
|
return TEST_FILE_SUFFIXES.some((suffix) => filePath.endsWith(suffix));
|
|
16
17
|
}
|
|
17
18
|
function isContractFile(filePath) {
|
|
18
19
|
return CONTRACT_FILE_SUFFIXES.some((suffix) => filePath.endsWith(suffix));
|
|
19
20
|
}
|
|
21
|
+
function isFlowFile(filePath) {
|
|
22
|
+
return FLOW_FILE_SUFFIXES.some((suffix) => filePath.endsWith(suffix));
|
|
23
|
+
}
|
|
20
24
|
/**
|
|
21
25
|
* Scanner class for extracting test metadata from a directory.
|
|
22
26
|
*
|
|
@@ -89,9 +93,10 @@ export class Scanner {
|
|
|
89
93
|
warnings.push("Failed to parse package.json");
|
|
90
94
|
}
|
|
91
95
|
}
|
|
92
|
-
// Check for at least one test or
|
|
96
|
+
// Check for at least one test, contract, or flow file
|
|
93
97
|
let foundTestFile = false;
|
|
94
98
|
let foundContractFile = false;
|
|
99
|
+
let foundFlowFile = false;
|
|
95
100
|
try {
|
|
96
101
|
for await (const filePath of this.fs.walk(dir, {
|
|
97
102
|
extensions: DEFAULT_EXTENSIONS,
|
|
@@ -101,16 +106,18 @@ export class Scanner {
|
|
|
101
106
|
foundTestFile = true;
|
|
102
107
|
else if (isContractFile(filePath))
|
|
103
108
|
foundContractFile = true;
|
|
104
|
-
if (
|
|
109
|
+
else if (isFlowFile(filePath))
|
|
110
|
+
foundFlowFile = true;
|
|
111
|
+
if (foundTestFile || foundContractFile || foundFlowFile)
|
|
105
112
|
break;
|
|
106
113
|
}
|
|
107
114
|
}
|
|
108
115
|
catch (err) {
|
|
109
116
|
errors.push(`Failed to scan directory: ${err}`);
|
|
110
117
|
}
|
|
111
|
-
if (!foundTestFile && !foundContractFile) {
|
|
112
|
-
errors.push("No test or
|
|
113
|
-
"Ensure your files are named *.test.ts or *.
|
|
118
|
+
if (!foundTestFile && !foundContractFile && !foundFlowFile) {
|
|
119
|
+
errors.push("No test, contract, or flow files found. " +
|
|
120
|
+
"Ensure your files are named *.test.ts, *.contract.ts, or *.flow.ts.");
|
|
114
121
|
}
|
|
115
122
|
return {
|
|
116
123
|
valid: errors.length === 0,
|
|
@@ -155,14 +162,17 @@ export class Scanner {
|
|
|
155
162
|
}
|
|
156
163
|
// Phase 1: collect .extend() aliases from all .ts files
|
|
157
164
|
const aliases = await this.collectAliases(dir, skipDirs, extensions);
|
|
158
|
-
// Phase 2: collect test
|
|
165
|
+
// Phase 2: collect test, contract, and flow files
|
|
159
166
|
const testFiles = [];
|
|
160
167
|
const contractFiles = [];
|
|
168
|
+
const flowFiles = [];
|
|
161
169
|
for await (const filePath of this.fs.walk(dir, { extensions, skipDirs })) {
|
|
162
170
|
if (isTestFile(filePath))
|
|
163
171
|
testFiles.push(filePath);
|
|
164
172
|
else if (isContractFile(filePath))
|
|
165
173
|
contractFiles.push(filePath);
|
|
174
|
+
else if (isFlowFile(filePath))
|
|
175
|
+
flowFiles.push(filePath);
|
|
166
176
|
}
|
|
167
177
|
// Phase 3: Extract test metadata from each test file
|
|
168
178
|
for (const filePath of testFiles) {
|
|
@@ -185,11 +195,14 @@ export class Scanner {
|
|
|
185
195
|
warnings.push(`Failed to extract metadata from ${filePath}: ${err}`);
|
|
186
196
|
}
|
|
187
197
|
}
|
|
188
|
-
// Phase 4: Extract contract metadata from contract files
|
|
198
|
+
// Phase 4: Extract contract metadata from contract AND flow files.
|
|
199
|
+
// Both file types can export contracts (a .flow.ts that composes contracts
|
|
200
|
+
// inline is a common pattern). Duplicates across files are handled by
|
|
201
|
+
// downstream consumers treating the contract id as authoritative.
|
|
189
202
|
// Uses shared runtime extraction (supports both old and .with() syntax).
|
|
190
203
|
// Falls back to static regex if runtime import fails.
|
|
191
204
|
const contracts = [];
|
|
192
|
-
for (const filePath of contractFiles) {
|
|
205
|
+
for (const filePath of [...contractFiles, ...flowFiles]) {
|
|
193
206
|
const absolutePath = this.fs.resolve ? this.fs.resolve(filePath) : filePath;
|
|
194
207
|
const result = await extractContractFromFile(absolutePath);
|
|
195
208
|
if (result.contracts.length > 0) {
|
|
@@ -204,20 +217,24 @@ export class Scanner {
|
|
|
204
217
|
feature: ec.feature,
|
|
205
218
|
deprecated: ec.deprecated,
|
|
206
219
|
line: 0,
|
|
207
|
-
cases: ec.cases.map((c) =>
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
220
|
+
cases: ec.cases.map((c) => {
|
|
221
|
+
// schemas is adapter-opaque; for HTTP it has { response: {...} }
|
|
222
|
+
const schemas = c.schemas;
|
|
223
|
+
return {
|
|
224
|
+
key: c.key,
|
|
225
|
+
description: c.description,
|
|
226
|
+
expectStatus: schemas?.response?.status,
|
|
227
|
+
deferred: c.deferredReason,
|
|
228
|
+
deprecated: c.deprecatedReason,
|
|
229
|
+
lifecycle: c.lifecycle,
|
|
230
|
+
severity: c.severity,
|
|
231
|
+
requires: c.requires,
|
|
232
|
+
defaultRun: c.defaultRun,
|
|
233
|
+
hasHeaderSchema: schemas?.response?.headers != null,
|
|
234
|
+
hasExample: schemas?.response?.examples != null,
|
|
235
|
+
line: 0,
|
|
236
|
+
};
|
|
237
|
+
}),
|
|
221
238
|
});
|
|
222
239
|
}
|
|
223
240
|
}
|
|
@@ -254,9 +271,36 @@ export class Scanner {
|
|
|
254
271
|
}
|
|
255
272
|
}
|
|
256
273
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
274
|
+
// Phase 5: Extract flow metadata from flow files.
|
|
275
|
+
// extractContractFromFile already returns both contracts and flows; we also
|
|
276
|
+
// call it on .flow.ts files so single-file flow modules are picked up.
|
|
277
|
+
const flows = [];
|
|
278
|
+
const allFlowSourceFiles = [...flowFiles, ...contractFiles]; // contract files can also export flows
|
|
279
|
+
const seenFlowIds = new Set();
|
|
280
|
+
for (const filePath of allFlowSourceFiles) {
|
|
281
|
+
const absolutePath = this.fs.resolve ? this.fs.resolve(filePath) : filePath;
|
|
282
|
+
const result = await extractContractFromFile(absolutePath);
|
|
283
|
+
if (result.flows) {
|
|
284
|
+
for (const flow of result.flows) {
|
|
285
|
+
if (!seenFlowIds.has(flow.id)) {
|
|
286
|
+
flows.push(flow);
|
|
287
|
+
seenFlowIds.add(flow.id);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Errors already surfaced in contract phase for shared files; only add
|
|
292
|
+
// new errors for flow-only files
|
|
293
|
+
if (flowFiles.includes(filePath) && result.errors.length > 0) {
|
|
294
|
+
for (const err of result.errors) {
|
|
295
|
+
warnings.push(`Flow import failed: ${err.file} — ${err.error}`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (Object.keys(files).length === 0 &&
|
|
300
|
+
contracts.length === 0 &&
|
|
301
|
+
flows.length === 0) {
|
|
302
|
+
warnings.push("No Glubean test, contract, or flow files found. " +
|
|
303
|
+
"Ensure your files are named *.test.ts, *.contract.ts, or *.flow.ts.");
|
|
260
304
|
}
|
|
261
305
|
return {
|
|
262
306
|
specVersion,
|
|
@@ -266,6 +310,7 @@ export class Scanner {
|
|
|
266
310
|
tags: Array.from(allTags),
|
|
267
311
|
warnings,
|
|
268
312
|
contracts,
|
|
313
|
+
...(flows.length > 0 ? { flows } : {}),
|
|
269
314
|
};
|
|
270
315
|
}
|
|
271
316
|
}
|
package/dist/scanner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Scanner types - shared between scanner consumers.
|
|
3
3
|
*/
|
|
4
4
|
import type { ContractStaticMeta } from "./extractor-static.js";
|
|
5
|
+
import type { NormalizedFlowMeta } from "./contract-extraction.js";
|
|
5
6
|
/** Export metadata for a single test export */
|
|
6
7
|
export interface ExportMeta {
|
|
7
8
|
type: "test";
|
|
@@ -95,6 +96,11 @@ export interface BundleMetadata {
|
|
|
95
96
|
* Independent from test exports — consumed by projection/coverage tools.
|
|
96
97
|
*/
|
|
97
98
|
contracts?: ContractStaticMeta[];
|
|
99
|
+
/**
|
|
100
|
+
* Flow metadata extracted from .flow.ts files (v0.2+).
|
|
101
|
+
* Populated from the scanner's runtime extractor (`_extracted` on FlowContract).
|
|
102
|
+
*/
|
|
103
|
+
flows?: NormalizedFlowMeta[];
|
|
98
104
|
}
|
|
99
105
|
/** Result of scanning a directory */
|
|
100
106
|
export interface ScanResult {
|
|
@@ -115,6 +121,11 @@ export interface ScanResult {
|
|
|
115
121
|
* Independent from test exports — consumed by projection/coverage tools.
|
|
116
122
|
*/
|
|
117
123
|
contracts: ContractStaticMeta[];
|
|
124
|
+
/**
|
|
125
|
+
* Flow metadata extracted from .flow.ts files (v0.2+).
|
|
126
|
+
* Independent from contracts — consumed by projection/visualization tools.
|
|
127
|
+
*/
|
|
128
|
+
flows?: NormalizedFlowMeta[];
|
|
118
129
|
}
|
|
119
130
|
/** Options for scanning */
|
|
120
131
|
export interface ScanOptions {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|