@glubean/sdk 0.2.0 → 0.2.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/dist/configure/http.d.ts +25 -0
- package/dist/configure/http.d.ts.map +1 -0
- package/dist/configure/http.js +88 -0
- package/dist/configure/http.js.map +1 -0
- package/dist/configure/index.d.ts +78 -0
- package/dist/configure/index.d.ts.map +1 -0
- package/dist/configure/index.js +78 -0
- package/dist/configure/index.js.map +1 -0
- package/dist/configure/plugin.d.ts +23 -0
- package/dist/configure/plugin.d.ts.map +1 -0
- package/dist/configure/plugin.js +81 -0
- package/dist/configure/plugin.js.map +1 -0
- package/dist/configure/runtime.d.ts +24 -0
- package/dist/configure/runtime.d.ts.map +1 -0
- package/dist/configure/runtime.js +45 -0
- package/dist/configure/runtime.js.map +1 -0
- package/dist/configure/template.d.ts +22 -0
- package/dist/configure/template.d.ts.map +1 -0
- package/dist/configure/template.js +34 -0
- package/dist/configure/template.js.map +1 -0
- package/dist/configure/vars.d.ts +20 -0
- package/dist/configure/vars.d.ts.map +1 -0
- package/dist/configure/vars.js +48 -0
- package/dist/configure/vars.js.map +1 -0
- package/dist/configure.d.ts +2 -150
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +2 -562
- package/dist/configure.js.map +1 -1
- package/dist/contract-artifacts.d.ts +268 -0
- package/dist/contract-artifacts.d.ts.map +1 -0
- package/dist/contract-artifacts.js +402 -0
- package/dist/contract-artifacts.js.map +1 -0
- package/dist/contract-core.d.ts +33 -1
- package/dist/contract-core.d.ts.map +1 -1
- package/dist/contract-core.js +51 -2
- package/dist/contract-core.js.map +1 -1
- package/dist/contract-http/adapter.d.ts.map +1 -1
- package/dist/contract-http/adapter.js +22 -7
- package/dist/contract-http/adapter.js.map +1 -1
- package/dist/contract-http/factory.d.ts.map +1 -1
- package/dist/contract-http/factory.js +13 -14
- package/dist/contract-http/factory.js.map +1 -1
- package/dist/contract-http/index.d.ts +4 -3
- package/dist/contract-http/index.d.ts.map +1 -1
- package/dist/contract-http/index.js +4 -3
- package/dist/contract-http/index.js.map +1 -1
- package/dist/contract-http/openapi.d.ts +56 -7
- package/dist/contract-http/openapi.d.ts.map +1 -1
- package/dist/contract-http/openapi.js +371 -21
- package/dist/contract-http/openapi.js.map +1 -1
- package/dist/contract-http/types.d.ts +2 -13
- package/dist/contract-http/types.d.ts.map +1 -1
- package/dist/contract-types.d.ts +59 -10
- package/dist/contract-types.d.ts.map +1 -1
- package/dist/expect.d.ts +13 -0
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +18 -0
- package/dist/expect.js.map +1 -1
- package/dist/index.d.ts +61 -518
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -835
- package/dist/index.js.map +1 -1
- package/dist/install-plugin.d.ts +94 -0
- package/dist/install-plugin.d.ts.map +1 -0
- package/dist/install-plugin.js +222 -0
- package/dist/install-plugin.js.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +1 -1
- package/dist/plugin.d.ts +45 -34
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +47 -34
- package/dist/plugin.js.map +1 -1
- package/dist/runtime-carrier.d.ts +142 -0
- package/dist/runtime-carrier.d.ts.map +1 -0
- package/dist/runtime-carrier.js +148 -0
- package/dist/runtime-carrier.js.map +1 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +2 -1
- package/dist/session.js.map +1 -1
- package/dist/test/builder.d.ts +249 -0
- package/dist/test/builder.d.ts.map +1 -0
- package/dist/test/builder.js +265 -0
- package/dist/test/builder.js.map +1 -0
- package/dist/test/each-builder.d.ts +244 -0
- package/dist/test/each-builder.d.ts.map +1 -0
- package/dist/test/each-builder.js +268 -0
- package/dist/test/each-builder.js.map +1 -0
- package/dist/test/extend.d.ts +59 -0
- package/dist/test/extend.d.ts.map +1 -0
- package/dist/test/extend.js +111 -0
- package/dist/test/extend.js.map +1 -0
- package/dist/test/utils.d.ts +39 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/test/utils.js +91 -0
- package/dist/test/utils.js.map +1 -0
- package/dist/types.d.ts +89 -111
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/contract-http/markdown.d.ts +0 -10
- package/dist/contract-http/markdown.d.ts.map +0 -1
- package/dist/contract-http/markdown.js +0 -21
- package/dist/contract-http/markdown.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/contract-http/openapi.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/contract-http/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMpE,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAyMD;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,2BAA2B,CAAC,eAAe,EAAE,gBAAgB,CAAC,GACzE,eAAe,GAAG,IAAI,CA6QxB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EAAE,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,eAAe,CA8DjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,eAIlC,CAAC"}
|
|
@@ -1,38 +1,388 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenAPI generation for HTTP contracts.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Two public functions:
|
|
5
|
+
* - `buildOpenApiPartForHttp(contract)` → partial OpenAPI document for a
|
|
6
|
+
* single HTTP contract. Used as HTTP adapter's `artifacts.openapi`
|
|
7
|
+
* producer.
|
|
8
|
+
* - `mergeOpenApiParts(parts, options)` → combine partial docs into a
|
|
9
|
+
* full OpenAPI document with info / tags / components / paths. Used as
|
|
10
|
+
* `openapiArtifact.merge`.
|
|
8
11
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
12
|
+
* Logic ported from `packages/mcp/src/index.ts` `contractsToOpenApi` (CAR-1
|
|
13
|
+
* Phase 2 — the two-way split of the former 250-line monolith:
|
|
14
|
+
* per-contract path+operation build stays with the HTTP adapter, final
|
|
15
|
+
* assembly moves to the artifact kind). Behavior is byte-for-byte
|
|
16
|
+
* preserved; `packages/mcp/src/openapi-integration.test.ts` guards the
|
|
17
|
+
* contract.
|
|
11
18
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Internal helpers
|
|
21
|
+
// =============================================================================
|
|
22
|
+
/**
|
|
23
|
+
* Map HttpSecurityScheme to OpenAPI securitySchemes entry + scheme name.
|
|
24
|
+
* Uses instanceName to disambiguate when multiple instances use different
|
|
25
|
+
* apiKey/oauth2 configurations (bearer/basic are canonical and shared).
|
|
26
|
+
*/
|
|
27
|
+
function securityToOpenApi(security, instanceName) {
|
|
28
|
+
if (!security)
|
|
29
|
+
return null;
|
|
30
|
+
if (security === "bearer")
|
|
31
|
+
return { name: "bearerAuth", scheme: { type: "http", scheme: "bearer" } };
|
|
32
|
+
if (security === "basic")
|
|
33
|
+
return { name: "basicAuth", scheme: { type: "http", scheme: "basic" } };
|
|
34
|
+
if (typeof security === "object" && security !== null) {
|
|
35
|
+
const s = security;
|
|
36
|
+
const suffix = instanceName ? `_${instanceName}` : "";
|
|
37
|
+
if (s.type === "apiKey")
|
|
38
|
+
return {
|
|
39
|
+
name: `apiKeyAuth${suffix}`,
|
|
40
|
+
scheme: { type: "apiKey", name: s.name, in: s.in },
|
|
41
|
+
};
|
|
42
|
+
if (s.type === "oauth2")
|
|
43
|
+
return {
|
|
44
|
+
name: `oauth2Auth${suffix}`,
|
|
45
|
+
scheme: { type: "oauth2", flows: s.flows },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Read HTTP fields from either nested (v0.2+) or flat (pre-v0.2 fixture)
|
|
52
|
+
* shape. Mirrors MCP's former `toLegacyHttpContract` dual-read.
|
|
53
|
+
*/
|
|
54
|
+
function readContractFields(c) {
|
|
55
|
+
const cAny = c;
|
|
56
|
+
const schemas = cAny.schemas;
|
|
57
|
+
return {
|
|
58
|
+
security: schemas?.security ?? cAny.security,
|
|
59
|
+
requestBody: schemas?.request?.body ?? cAny.requestSchema,
|
|
60
|
+
requestContentType: schemas?.request?.contentType ??
|
|
61
|
+
cAny.requestContentType,
|
|
62
|
+
requestHeaders: schemas?.request?.headers ?? cAny.requestHeaders,
|
|
63
|
+
requestExample: schemas?.request?.example ?? cAny.requestExample,
|
|
64
|
+
requestExamples: (schemas?.request?.examples ??
|
|
65
|
+
cAny.requestExamples),
|
|
19
66
|
};
|
|
67
|
+
}
|
|
68
|
+
function readCaseFields(cas) {
|
|
69
|
+
const csAny = cas;
|
|
70
|
+
const cs_schemas = csAny.schemas;
|
|
71
|
+
const response = cs_schemas?.response;
|
|
72
|
+
const protocolExpect = csAny.protocolExpect;
|
|
73
|
+
return {
|
|
74
|
+
status: response?.status ?? protocolExpect?.status,
|
|
75
|
+
responseBody: response?.body ?? csAny.responseSchema,
|
|
76
|
+
responseContentType: response?.contentType ??
|
|
77
|
+
csAny.responseContentType,
|
|
78
|
+
responseHeaders: response?.headers ?? csAny.responseHeaders,
|
|
79
|
+
examples: (response?.examples ??
|
|
80
|
+
csAny.examples),
|
|
81
|
+
paramSchemas: (cs_schemas?.params ??
|
|
82
|
+
csAny.paramSchemas),
|
|
83
|
+
querySchemas: (cs_schemas?.query ??
|
|
84
|
+
csAny.querySchemas),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// =============================================================================
|
|
88
|
+
// Per-contract builder (HTTP adapter's artifacts.openapi producer)
|
|
89
|
+
// =============================================================================
|
|
90
|
+
/**
|
|
91
|
+
* Build a partial OpenAPI document for a single HTTP contract.
|
|
92
|
+
*
|
|
93
|
+
* Returns an object containing only the fields this contract contributes:
|
|
94
|
+
* a single `paths[apiPath][method]` entry, the `tags` it references (from
|
|
95
|
+
* `feature`), and the `components.securitySchemes` entry it needs (if any).
|
|
96
|
+
* Cross-contract fields (`openapi`, `info`, full `tags` array, full
|
|
97
|
+
* `components`) are materialized by `mergeOpenApiParts`.
|
|
98
|
+
*
|
|
99
|
+
* Returns `null` for non-HTTP protocols or malformed targets; the render
|
|
100
|
+
* pipeline drops null parts.
|
|
101
|
+
*/
|
|
102
|
+
export function buildOpenApiPartForHttp(projection) {
|
|
103
|
+
const c = projection;
|
|
104
|
+
if (c.protocol !== "http")
|
|
105
|
+
return null;
|
|
106
|
+
const match = c.target.match(/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+(.+)$/i);
|
|
107
|
+
if (!match)
|
|
108
|
+
return null;
|
|
109
|
+
const method = match[1].toLowerCase();
|
|
110
|
+
let apiPath = match[2];
|
|
111
|
+
// Convert :param to {param} for OpenAPI
|
|
112
|
+
apiPath = apiPath.replace(/:(\w+)/g, "{$1}");
|
|
113
|
+
// Dual-shape field reads (nested v0.2+ / flat pre-v0.2 fixtures)
|
|
114
|
+
const fields = readContractFields(c);
|
|
115
|
+
// Collect security scheme
|
|
116
|
+
const secMapping = securityToOpenApi(fields.security, c.instanceName);
|
|
20
117
|
const responses = {};
|
|
21
|
-
for (const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
118
|
+
for (const cas of c.cases) {
|
|
119
|
+
const casFields = readCaseFields(cas);
|
|
120
|
+
const statusCode = String(casFields.status ?? 200);
|
|
121
|
+
const contentType = casFields.responseContentType ?? "application/json";
|
|
122
|
+
if (!responses[statusCode]) {
|
|
123
|
+
responses[statusCode] = {
|
|
124
|
+
description: cas.description ?? "",
|
|
125
|
+
contents: {},
|
|
126
|
+
headers: {},
|
|
26
127
|
};
|
|
27
128
|
}
|
|
129
|
+
const resp = responses[statusCode];
|
|
130
|
+
if (!resp.contents[contentType]) {
|
|
131
|
+
resp.contents[contentType] = { examples: {} };
|
|
132
|
+
}
|
|
133
|
+
const bucket = resp.contents[contentType];
|
|
134
|
+
// First non-undefined schema per (status, contentType) wins.
|
|
135
|
+
if (!bucket.schema && casFields.responseBody) {
|
|
136
|
+
bucket.schema = casFields.responseBody;
|
|
137
|
+
}
|
|
138
|
+
// Examples merge. Prefix with case key to guarantee uniqueness.
|
|
139
|
+
if (casFields.examples) {
|
|
140
|
+
for (const [exName, ex] of Object.entries(casFields.examples)) {
|
|
141
|
+
const fullName = exName === "default" ? cas.key : `${cas.key}_${exName}`;
|
|
142
|
+
bucket.examples[fullName] = ex;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Response headers merge at status level (first wins per header name).
|
|
146
|
+
if (casFields.responseHeaders) {
|
|
147
|
+
const headersSchema = casFields.responseHeaders;
|
|
148
|
+
if (headersSchema?.properties) {
|
|
149
|
+
for (const [headerName, headerSchema] of Object.entries(headersSchema.properties)) {
|
|
150
|
+
if (!resp.headers[headerName]) {
|
|
151
|
+
resp.headers[headerName] = { schema: headerSchema };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
28
156
|
}
|
|
29
|
-
|
|
30
|
-
|
|
157
|
+
// Finalize response shape for OpenAPI
|
|
158
|
+
const openApiResponses = {};
|
|
159
|
+
for (const [status, resp] of Object.entries(responses)) {
|
|
160
|
+
const out = { description: resp.description };
|
|
161
|
+
const contentOut = {};
|
|
162
|
+
for (const [ctype, bucket] of Object.entries(resp.contents)) {
|
|
163
|
+
if (bucket.schema || Object.keys(bucket.examples).length > 0) {
|
|
164
|
+
const entry = {};
|
|
165
|
+
if (bucket.schema)
|
|
166
|
+
entry.schema = bucket.schema;
|
|
167
|
+
if (Object.keys(bucket.examples).length > 0)
|
|
168
|
+
entry.examples = bucket.examples;
|
|
169
|
+
contentOut[ctype] = entry;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (Object.keys(contentOut).length > 0)
|
|
173
|
+
out.content = contentOut;
|
|
174
|
+
if (Object.keys(resp.headers).length > 0)
|
|
175
|
+
out.headers = resp.headers;
|
|
176
|
+
openApiResponses[status] = out;
|
|
177
|
+
}
|
|
178
|
+
// Build operation
|
|
179
|
+
const operation = {
|
|
180
|
+
operationId: c.id,
|
|
181
|
+
summary: c.description,
|
|
182
|
+
responses: openApiResponses,
|
|
183
|
+
};
|
|
184
|
+
if (c.feature)
|
|
185
|
+
operation.tags = [c.feature];
|
|
186
|
+
// Contract-level deprecated flag
|
|
187
|
+
if (c.deprecated) {
|
|
188
|
+
operation.deprecated = true;
|
|
189
|
+
operation["x-deprecated-reason"] = c.deprecated;
|
|
190
|
+
}
|
|
191
|
+
// Contract-level OpenAPI extensions (x-* keys)
|
|
192
|
+
if (c.extensions) {
|
|
193
|
+
for (const [extKey, extVal] of Object.entries(c.extensions)) {
|
|
194
|
+
operation[extKey] = extVal;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Operation-level security from contract instance
|
|
198
|
+
if (secMapping) {
|
|
199
|
+
operation.security = [{ [secMapping.name]: [] }];
|
|
200
|
+
}
|
|
201
|
+
else if (fields.security === null) {
|
|
202
|
+
operation.security = []; // explicitly public
|
|
203
|
+
}
|
|
204
|
+
const mergeFieldLevel = (target, source) => {
|
|
205
|
+
if (!source)
|
|
206
|
+
return;
|
|
207
|
+
for (const [name, meta] of Object.entries(source)) {
|
|
208
|
+
if (!target[name])
|
|
209
|
+
target[name] = {};
|
|
210
|
+
const slot = target[name];
|
|
211
|
+
if (slot.schema === undefined && meta.schema !== undefined)
|
|
212
|
+
slot.schema = meta.schema;
|
|
213
|
+
if (slot.description === undefined && meta.description !== undefined)
|
|
214
|
+
slot.description = meta.description;
|
|
215
|
+
if (slot.required === undefined && meta.required !== undefined)
|
|
216
|
+
slot.required = meta.required;
|
|
217
|
+
if (slot.deprecated === undefined && meta.deprecated !== undefined)
|
|
218
|
+
slot.deprecated = meta.deprecated;
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const mergedParamMetas = {};
|
|
222
|
+
const mergedQueryMetas = {};
|
|
223
|
+
for (const cas of c.cases) {
|
|
224
|
+
const casFields = readCaseFields(cas);
|
|
225
|
+
mergeFieldLevel(mergedParamMetas, casFields.paramSchemas);
|
|
226
|
+
mergeFieldLevel(mergedQueryMetas, casFields.querySchemas);
|
|
227
|
+
}
|
|
228
|
+
// Extract path parameters from URL and attach merged metadata
|
|
229
|
+
const paramMatches = apiPath.matchAll(/\{(\w+)\}/g);
|
|
230
|
+
const pathParams = [...paramMatches].map((m) => {
|
|
231
|
+
const name = m[1];
|
|
232
|
+
const meta = mergedParamMetas[name];
|
|
233
|
+
return {
|
|
234
|
+
name,
|
|
235
|
+
in: "path",
|
|
236
|
+
required: meta?.required ?? true,
|
|
237
|
+
schema: meta?.schema ?? { type: "string" },
|
|
238
|
+
...(meta?.description ? { description: meta.description } : {}),
|
|
239
|
+
...(meta?.deprecated ? { deprecated: true } : {}),
|
|
240
|
+
};
|
|
241
|
+
});
|
|
242
|
+
// Query parameters (only ones with metadata)
|
|
243
|
+
const queryParams = Object.entries(mergedQueryMetas).map(([name, meta]) => ({
|
|
244
|
+
name,
|
|
245
|
+
in: "query",
|
|
246
|
+
required: meta.required ?? false,
|
|
247
|
+
schema: meta.schema ?? { type: "string" },
|
|
248
|
+
...(meta.description ? { description: meta.description } : {}),
|
|
249
|
+
...(meta.deprecated ? { deprecated: true } : {}),
|
|
250
|
+
}));
|
|
251
|
+
// Request header parameters from contract-level request.headers schema.
|
|
252
|
+
const headerParams = [];
|
|
253
|
+
const reqHeadersSchema = fields.requestHeaders;
|
|
254
|
+
if (reqHeadersSchema &&
|
|
255
|
+
typeof reqHeadersSchema === "object" &&
|
|
256
|
+
reqHeadersSchema.properties) {
|
|
257
|
+
const requiredList = Array.isArray(reqHeadersSchema.required)
|
|
258
|
+
? reqHeadersSchema.required
|
|
259
|
+
: [];
|
|
260
|
+
for (const [headerName, headerSchema] of Object.entries(reqHeadersSchema.properties)) {
|
|
261
|
+
headerParams.push({
|
|
262
|
+
name: headerName,
|
|
263
|
+
in: "header",
|
|
264
|
+
required: requiredList.includes(headerName),
|
|
265
|
+
schema: headerSchema,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const allParams = [...pathParams, ...queryParams, ...headerParams];
|
|
270
|
+
if (allParams.length > 0)
|
|
271
|
+
operation.parameters = allParams;
|
|
272
|
+
// Request body (schema + examples)
|
|
273
|
+
if (fields.requestBody ||
|
|
274
|
+
fields.requestExample !== undefined ||
|
|
275
|
+
fields.requestExamples) {
|
|
276
|
+
const reqContentType = fields.requestContentType ?? "application/json";
|
|
277
|
+
const contentEntry = {};
|
|
278
|
+
if (fields.requestBody)
|
|
279
|
+
contentEntry.schema = fields.requestBody;
|
|
280
|
+
const exMap = {};
|
|
281
|
+
if (fields.requestExample !== undefined) {
|
|
282
|
+
exMap.default = { value: fields.requestExample };
|
|
283
|
+
}
|
|
284
|
+
if (fields.requestExamples) {
|
|
285
|
+
for (const [k, v] of Object.entries(fields.requestExamples)) {
|
|
286
|
+
exMap[k] = v;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (Object.keys(exMap).length > 0)
|
|
290
|
+
contentEntry.examples = exMap;
|
|
291
|
+
operation.requestBody = {
|
|
292
|
+
content: { [reqContentType]: contentEntry },
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
// Assemble the partial doc
|
|
296
|
+
const partial = {
|
|
31
297
|
paths: {
|
|
32
|
-
[
|
|
298
|
+
[apiPath]: {
|
|
33
299
|
[method]: operation,
|
|
34
300
|
},
|
|
35
301
|
},
|
|
36
302
|
};
|
|
303
|
+
if (c.feature) {
|
|
304
|
+
partial.tags = [{ name: c.feature }];
|
|
305
|
+
}
|
|
306
|
+
if (secMapping) {
|
|
307
|
+
partial.components = {
|
|
308
|
+
securitySchemes: { [secMapping.name]: secMapping.scheme },
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
return partial;
|
|
312
|
+
}
|
|
313
|
+
// =============================================================================
|
|
314
|
+
// Merge: combine partial docs into a full OpenAPI document
|
|
315
|
+
// =============================================================================
|
|
316
|
+
/**
|
|
317
|
+
* Combine per-contract partials into a full OpenAPI 3.1 document.
|
|
318
|
+
*
|
|
319
|
+
* - `paths`: deep-merge at 2 levels (same path, different methods combine)
|
|
320
|
+
* - `components.securitySchemes`: union by name (first wins on collision;
|
|
321
|
+
* name uniqueness is handled at part construction via `instanceName` suffix)
|
|
322
|
+
* - `tags`: dedupe by name across parts
|
|
323
|
+
* - `info`: built from options.title / options.version (defaults match MCP)
|
|
324
|
+
* - `servers`: from options, if present
|
|
325
|
+
*
|
|
326
|
+
* Null / non-contributing parts are filtered by the render pipeline before
|
|
327
|
+
* reaching here.
|
|
328
|
+
*/
|
|
329
|
+
export function mergeOpenApiParts(parts, options) {
|
|
330
|
+
const paths = {};
|
|
331
|
+
const tagsByName = new Map();
|
|
332
|
+
const securitySchemes = {};
|
|
333
|
+
for (const part of parts) {
|
|
334
|
+
const partPaths = (part.paths ?? {});
|
|
335
|
+
for (const [apiPath, methods] of Object.entries(partPaths)) {
|
|
336
|
+
if (!paths[apiPath])
|
|
337
|
+
paths[apiPath] = {};
|
|
338
|
+
for (const [method, operation] of Object.entries(methods)) {
|
|
339
|
+
// Same path + method collision shouldn't happen (ids unique) but if it
|
|
340
|
+
// does, first-wins matches MCP's Object.assign semantics.
|
|
341
|
+
if (!paths[apiPath][method]) {
|
|
342
|
+
paths[apiPath][method] = operation;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
const partTags = (part.tags ?? []);
|
|
347
|
+
for (const tag of partTags) {
|
|
348
|
+
if (tag?.name && !tagsByName.has(tag.name))
|
|
349
|
+
tagsByName.set(tag.name, tag);
|
|
350
|
+
}
|
|
351
|
+
const partSchemes = (part.components ?? {}).securitySchemes;
|
|
352
|
+
if (partSchemes) {
|
|
353
|
+
for (const [name, scheme] of Object.entries(partSchemes)) {
|
|
354
|
+
if (!securitySchemes[name])
|
|
355
|
+
securitySchemes[name] = scheme;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
const title = options?.title ?? "API Specification";
|
|
360
|
+
const version = options?.version ?? "1.0.0";
|
|
361
|
+
const doc = {
|
|
362
|
+
openapi: "3.1.0",
|
|
363
|
+
info: { title, version },
|
|
364
|
+
};
|
|
365
|
+
if (options?.servers && options.servers.length > 0) {
|
|
366
|
+
doc.servers = options.servers;
|
|
367
|
+
}
|
|
368
|
+
if (tagsByName.size > 0) {
|
|
369
|
+
doc.tags = [...tagsByName.values()];
|
|
370
|
+
}
|
|
371
|
+
if (Object.keys(securitySchemes).length > 0) {
|
|
372
|
+
doc.components = { securitySchemes };
|
|
373
|
+
}
|
|
374
|
+
doc.paths = paths;
|
|
375
|
+
return doc;
|
|
37
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* Empty OpenAPI 3.1 skeleton returned when no HTTP contract contributes a
|
|
379
|
+
* part (e.g. a project with only gRPC / GraphQL contracts, or an empty
|
|
380
|
+
* project). Used as `openapiArtifact.empty` so callers always receive a
|
|
381
|
+
* valid `OpenApiDocument`.
|
|
382
|
+
*/
|
|
383
|
+
export const emptyOpenApiDocument = {
|
|
384
|
+
openapi: "3.1.0",
|
|
385
|
+
info: { title: "", version: "0.0.0" },
|
|
386
|
+
paths: {},
|
|
387
|
+
};
|
|
38
388
|
//# sourceMappingURL=openapi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/contract-http/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,UAAU,mBAAmB,CACjC,UAA0E;IAE1E,qEAAqE;IACrE,MAAM,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC;IAExD,MAAM,SAAS,GAA4B;QACzC,OAAO,EAAE,UAAU,CAAC,WAAW;QAC/B,WAAW,EAAE,UAAU,CAAC,EAAE;KAC3B,CAAC;IAEF,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,SAAS,CAAC,MAAM,CAAC,GAAG;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;IAEhC,OAAO;QACL,KAAK,EAAE;YACL,CAAC,IAAI,CAAC,EAAE;gBACN,CAAC,MAAM,CAAC,EAAE,SAAS;aACpB;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/contract-http/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* ContractCase, ContractExpect, etc.).
|
|
11
11
|
*/
|
|
12
12
|
import type { HttpClient, SchemaLike, TestContext } from "../types.js";
|
|
13
|
-
import type {
|
|
13
|
+
import type { BaseCaseSpec, Extensions } from "../contract-types.js";
|
|
14
14
|
/**
|
|
15
15
|
* HTTP security scheme declaration for contract instances.
|
|
16
16
|
* Maps to OpenAPI `securitySchemes`. Authoritative metadata, not docs-only.
|
|
@@ -69,7 +69,7 @@ export interface ContractExpect<T = unknown> {
|
|
|
69
69
|
/** Named response examples (OpenAPI docs). */
|
|
70
70
|
examples?: Record<string, ContractExample<T>>;
|
|
71
71
|
}
|
|
72
|
-
export interface ContractCase<T = unknown, S = void> {
|
|
72
|
+
export interface ContractCase<T = unknown, S = void> extends BaseCaseSpec {
|
|
73
73
|
/** Per-case HTTP client override. */
|
|
74
74
|
client?: HttpClient;
|
|
75
75
|
/** Why this case exists — required. */
|
|
@@ -95,17 +95,6 @@ export interface ContractCase<T = unknown, S = void> {
|
|
|
95
95
|
teardown?: (ctx: TestContext, state: S) => Promise<void>;
|
|
96
96
|
/** Business-logic verify — runs after status and schema validation. */
|
|
97
97
|
verify?: (ctx: TestContext, res: T) => Promise<void>;
|
|
98
|
-
/** Not yet executable; reason shown in skip message. */
|
|
99
|
-
deferred?: string;
|
|
100
|
-
/** Deprecated; value is the reason. */
|
|
101
|
-
deprecated?: string;
|
|
102
|
-
/** Additional tags (merged with contract-level tags). */
|
|
103
|
-
tags?: string[];
|
|
104
|
-
severity?: CaseSeverity;
|
|
105
|
-
requires?: CaseRequires;
|
|
106
|
-
defaultRun?: CaseDefaultRun;
|
|
107
|
-
/** Per-case OpenAPI extensions. */
|
|
108
|
-
extensions?: Extensions;
|
|
109
98
|
}
|
|
110
99
|
/**
|
|
111
100
|
* Structured request specification. Can be a bare SchemaLike (JSON body
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contract-http/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/contract-http/types.ts"],"names":[],"mappings":"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"}
|
package/dist/contract-types.d.ts
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* and `internal/40-discovery/proposals/contract-flow.md` v9 for design.
|
|
19
19
|
*/
|
|
20
20
|
import type { Test, TestContext } from "./types.js";
|
|
21
|
+
import type { KnownArtifacts, KnownArtifactParts, KnownArtifactOptions } from "./index.js";
|
|
21
22
|
/**
|
|
22
23
|
* Case lifecycle.
|
|
23
24
|
*
|
|
@@ -73,6 +74,24 @@ export interface FailureClassification {
|
|
|
73
74
|
retryable?: boolean;
|
|
74
75
|
message?: string;
|
|
75
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Minimum shape every case spec must satisfy. Adapter-specific case specs
|
|
79
|
+
* (HttpContractCase / GrpcContractCase / GraphqlContractCase / ...) extend
|
|
80
|
+
* this with protocol-specific fields.
|
|
81
|
+
*
|
|
82
|
+
* Core (`dispatchContract`) reads these fields directly from `spec.cases[key]`.
|
|
83
|
+
* Adapter-specific fields are opaque to core and passed through to the adapter.
|
|
84
|
+
*/
|
|
85
|
+
export interface BaseCaseSpec {
|
|
86
|
+
description?: string;
|
|
87
|
+
deferred?: string;
|
|
88
|
+
deprecated?: string;
|
|
89
|
+
severity?: CaseSeverity;
|
|
90
|
+
requires?: CaseRequires;
|
|
91
|
+
defaultRun?: CaseDefaultRun;
|
|
92
|
+
tags?: string[];
|
|
93
|
+
extensions?: Extensions;
|
|
94
|
+
}
|
|
76
95
|
/**
|
|
77
96
|
* Protocol-agnostic case metadata. `schemas` is plugin-defined payload shape,
|
|
78
97
|
* opaque to core.
|
|
@@ -182,7 +201,17 @@ export interface ContractProtocolAdapter<Spec = unknown, RuntimeSchemas = unknow
|
|
|
182
201
|
* protocol-agnostic skeleton (no `schemas` / `meta`). See `contract-flow.md`
|
|
183
202
|
* §3.5.3 rule 3.
|
|
184
203
|
*/
|
|
185
|
-
|
|
204
|
+
/**
|
|
205
|
+
* Convert the runtime projection (may contain live refs like Zod schemas)
|
|
206
|
+
* into the JSON-safe `Extracted` form consumed by downstream (scanner /
|
|
207
|
+
* MCP / CLI / cloud). SDK's `dispatchContract` calls this unconditionally
|
|
208
|
+
* at contract construction and stores the result on the carrier as
|
|
209
|
+
* `_extracted` — scanner reads that directly. Adapter is responsible for
|
|
210
|
+
* knowing which fields are schemas (convert Zod → JSON Schema) vs literal
|
|
211
|
+
* example data (pass through) vs protocol-specific metadata that must
|
|
212
|
+
* survive normalize (e.g. HTTP `security`).
|
|
213
|
+
*/
|
|
214
|
+
normalize: (projection: ContractProjection<RuntimeSchemas, RuntimeMeta> & {
|
|
186
215
|
id: string;
|
|
187
216
|
}) => ExtractedContractProjection<SafeSchemas, SafeMeta>;
|
|
188
217
|
/**
|
|
@@ -197,16 +226,23 @@ export interface ContractProtocolAdapter<Spec = unknown, RuntimeSchemas = unknow
|
|
|
197
226
|
}>;
|
|
198
227
|
}) => FailureClassification | undefined;
|
|
199
228
|
/**
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
229
|
+
* Artifact producers declared by this adapter. Each entry is a
|
|
230
|
+
* per-contract renderer for a registered artifact kind (see
|
|
231
|
+
* `@glubean/sdk`'s `ArtifactKind` + `renderArtifact` / `KnownArtifacts`).
|
|
232
|
+
* Producers return the kind's Part type; cross-contract merging is the
|
|
233
|
+
* kind's responsibility.
|
|
234
|
+
*
|
|
235
|
+
* Keyed by `ArtifactKind.name`. Third-party plugins add new keys by
|
|
236
|
+
* augmenting `KnownArtifacts` / `KnownArtifactParts` / `KnownArtifactOptions`
|
|
237
|
+
* at the package root via `declare module "@glubean/sdk"`.
|
|
238
|
+
*
|
|
239
|
+
* Replaces the deprecated per-adapter `toMarkdown?` / `toOpenApi?` hooks
|
|
240
|
+
* (removed after v0.2.x) which polluted the generic interface with
|
|
241
|
+
* protocol-specific artifacts (OpenAPI is HTTP-only).
|
|
208
242
|
*/
|
|
209
|
-
|
|
243
|
+
artifacts?: {
|
|
244
|
+
[K in keyof KnownArtifacts]?: (projection: ExtractedContractProjection<SafeSchemas, SafeMeta>, options?: KnownArtifactOptions[K]) => KnownArtifactParts[K];
|
|
245
|
+
};
|
|
210
246
|
/**
|
|
211
247
|
* Optional: render the `target` string for display. HTTP: "POST /users"
|
|
212
248
|
* stays as-is. gRPC: "Greeter/SayHello" might become "Greeter.SayHello()".
|
|
@@ -277,6 +313,19 @@ export interface ProtocolContract<Spec = unknown, PayloadSchemas = unknown, Meta
|
|
|
277
313
|
readonly _projection: ContractProjection<PayloadSchemas, Meta> & {
|
|
278
314
|
id: string;
|
|
279
315
|
};
|
|
316
|
+
/**
|
|
317
|
+
* JSON-safe extracted projection — result of `adapter.normalize(_projection)`,
|
|
318
|
+
* computed by the dispatcher at contract construction. Scanner / MCP / CLI
|
|
319
|
+
* / cloud read this field directly as the canonical safe form. Never
|
|
320
|
+
* contains live refs (Zod schemas converted to plain JSON Schema etc.).
|
|
321
|
+
*
|
|
322
|
+
* Typed with the same generic slot as `_projection` for structural
|
|
323
|
+
* compatibility; at runtime it is always the Safe shape produced by
|
|
324
|
+
* the adapter's `normalize`.
|
|
325
|
+
*/
|
|
326
|
+
readonly _extracted: ExtractedContractProjection<PayloadSchemas, Meta> & {
|
|
327
|
+
id: string;
|
|
328
|
+
};
|
|
280
329
|
/**
|
|
281
330
|
* Adapter-private runtime spec carrier. Holds the merged executable spec
|
|
282
331
|
* (scoped-factory defaults + contract spec) used by `executeCaseInFlow`
|