@seamward/cli 0.1.0-alpha.10
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/LICENSE +31 -0
- package/README.md +428 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +659 -0
- package/dist/cli.js.map +1 -0
- package/dist/connection-key.d.ts +5 -0
- package/dist/connection-key.js +6 -0
- package/dist/connection-key.js.map +1 -0
- package/dist/contract-sync.d.ts +134 -0
- package/dist/contract-sync.js +603 -0
- package/dist/contract-sync.js.map +1 -0
- package/dist/discovery.d.ts +47 -0
- package/dist/discovery.js +496 -0
- package/dist/discovery.js.map +1 -0
- package/dist/existing-webhook-binding.d.ts +9 -0
- package/dist/existing-webhook-binding.js +196 -0
- package/dist/existing-webhook-binding.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/observation-sync.d.ts +28 -0
- package/dist/observation-sync.js +101 -0
- package/dist/observation-sync.js.map +1 -0
- package/dist/project-metadata.d.ts +7 -0
- package/dist/project-metadata.js +104 -0
- package/dist/project-metadata.js.map +1 -0
- package/dist/remote-api.d.ts +10 -0
- package/dist/remote-api.js +61 -0
- package/dist/remote-api.js.map +1 -0
- package/dist/setup-engine.d.ts +127 -0
- package/dist/setup-engine.js +765 -0
- package/dist/setup-engine.js.map +1 -0
- package/dist/setup-plan.d.ts +197 -0
- package/dist/setup-plan.js +1240 -0
- package/dist/setup-plan.js.map +1 -0
- package/dist/source-instrumentation.d.ts +10 -0
- package/dist/source-instrumentation.js +291 -0
- package/dist/source-instrumentation.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/examples/node-service/README.md +42 -0
- package/examples/node-service/contracts/orders.openapi.yaml +18 -0
- package/examples/node-service/package.json +11 -0
- package/examples/node-service/src/server.ts +13 -0
- package/package.json +58 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile, realpath, stat } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { createJsonSchemaOperation, importOpenApiOperations, } from "@seamward/contracts";
|
|
5
|
+
import { parse as parseYaml } from "yaml";
|
|
6
|
+
import { parseConnectionKey } from "./connection-key.js";
|
|
7
|
+
import { SeamwardRemoteApiError, remoteInvalidResponse, remoteNetworkError, remoteResponseError, } from "./remote-api.js";
|
|
8
|
+
import { applySetupPlan, inspectSetupActionEvidence, inspectSetupCompletionState, recordActivatedContractVersion, recordRegisteredContractAction, } from "./setup-plan.js";
|
|
9
|
+
async function requireCurrentSourceEvidence(plan, root) {
|
|
10
|
+
const evidence = await inspectSetupActionEvidence(plan, root);
|
|
11
|
+
const instrumentation = evidence.filter(({ actionType }) => actionType === "instrument_operation");
|
|
12
|
+
if (instrumentation.length === 0 ||
|
|
13
|
+
instrumentation.some(({ status }) => status !== "source_verified")) {
|
|
14
|
+
throw new Error("Source verification required before contract activation");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function previewPlanContractActivation(plan, root, status, options) {
|
|
18
|
+
await requireCurrentSourceEvidence(plan, root);
|
|
19
|
+
const completion = await inspectSetupCompletionState(plan, root);
|
|
20
|
+
const target = status.contracts.find(({ id }) => id === options.contractVersionId);
|
|
21
|
+
if (!target)
|
|
22
|
+
throw new Error("Contract target conflicts with the setup plan");
|
|
23
|
+
if (options.reason === "promote") {
|
|
24
|
+
const registeredByPlan = completion.state.completedActions.some(({ actionId, evidence }) => plan.actions.some((action) => action.id === actionId && action.type === "register_contract") && evidence === `registered_contract:${target.id}`);
|
|
25
|
+
if (!registeredByPlan) {
|
|
26
|
+
throw new Error("Contract target is not owned by the current setup plan");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const reconcile = options.reason === "promote" &&
|
|
30
|
+
target.lifecycleStatus === "active" &&
|
|
31
|
+
status.activeContractVersionId === target.id;
|
|
32
|
+
if ((options.reason === "promote" &&
|
|
33
|
+
target.lifecycleStatus !== "draft" &&
|
|
34
|
+
!reconcile) ||
|
|
35
|
+
(options.reason === "rollback" && target.lifecycleStatus !== "superseded")) {
|
|
36
|
+
throw new Error("Contract target conflicts with the requested lifecycle");
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
planFingerprint: plan.fingerprint,
|
|
40
|
+
stateFingerprint: completion.fingerprint,
|
|
41
|
+
contractVersionId: target.id,
|
|
42
|
+
expectedActiveContractVersionId: status.activeContractVersionId,
|
|
43
|
+
reason: options.reason,
|
|
44
|
+
reconcile,
|
|
45
|
+
integrationId: status.integrationId,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export async function validatePlanContractActivation(plan, root, preview) {
|
|
49
|
+
if (preview.planFingerprint !== plan.fingerprint) {
|
|
50
|
+
throw new Error("Contract activation plan fingerprint does not match");
|
|
51
|
+
}
|
|
52
|
+
const completion = await inspectSetupCompletionState(plan, root);
|
|
53
|
+
if (completion.fingerprint !== preview.stateFingerprint) {
|
|
54
|
+
throw new Error("Setup state changed after contract activation preview");
|
|
55
|
+
}
|
|
56
|
+
await requireCurrentSourceEvidence(plan, root);
|
|
57
|
+
}
|
|
58
|
+
async function readDetailedContractStatus(options) {
|
|
59
|
+
const endpoint = apiEndpoint(options.endpoint ?? "https://api.seamward.com");
|
|
60
|
+
const { integrationId } = parseConnectionKey(options.connectionKey);
|
|
61
|
+
if (!options.apiKey)
|
|
62
|
+
throw new Error("A scoped Seamward API key is required");
|
|
63
|
+
const contracts = [];
|
|
64
|
+
let activeContractVersionId;
|
|
65
|
+
let cursor = null;
|
|
66
|
+
const seenCursors = new Set();
|
|
67
|
+
let pages = 0;
|
|
68
|
+
do {
|
|
69
|
+
pages += 1;
|
|
70
|
+
if (pages > 100)
|
|
71
|
+
throw remoteInvalidResponse();
|
|
72
|
+
const query = new URLSearchParams({ limit: "100" });
|
|
73
|
+
if (cursor)
|
|
74
|
+
query.set("cursor", cursor);
|
|
75
|
+
let response;
|
|
76
|
+
try {
|
|
77
|
+
response = await (options.fetchFn ?? fetch)(`${endpoint}/v1/integrations/${encodeURIComponent(integrationId)}/contracts?${query}`, {
|
|
78
|
+
headers: { authorization: `Bearer ${options.apiKey}` },
|
|
79
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? 15_000),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
throw remoteNetworkError();
|
|
84
|
+
}
|
|
85
|
+
if (response.status !== 200)
|
|
86
|
+
throw await remoteResponseError(response);
|
|
87
|
+
const payload = (await response.json());
|
|
88
|
+
if ((payload.activeContractVersionId !== null &&
|
|
89
|
+
typeof payload.activeContractVersionId !== "string") ||
|
|
90
|
+
!Array.isArray(payload.contracts) ||
|
|
91
|
+
(payload.nextCursor !== null && typeof payload.nextCursor !== "string") ||
|
|
92
|
+
payload.contracts.some((contract) => typeof contract.id !== "string" ||
|
|
93
|
+
typeof contract.declaredVersion !== "string" ||
|
|
94
|
+
(contract.fingerprint !== undefined &&
|
|
95
|
+
(typeof contract.fingerprint !== "string" ||
|
|
96
|
+
!/^sha256:[a-f0-9]{64}$/.test(contract.fingerprint))) ||
|
|
97
|
+
(contract.importedFrom !== undefined &&
|
|
98
|
+
!["openapi", "json-schema", "inferred"].includes(String(contract.importedFrom))) ||
|
|
99
|
+
(contract.operations !== undefined &&
|
|
100
|
+
(!Array.isArray(contract.operations) ||
|
|
101
|
+
contract.operations.some((operation) => typeof operation !== "object" ||
|
|
102
|
+
operation === null ||
|
|
103
|
+
typeof operation.operationKey !== "string" ||
|
|
104
|
+
!["inbound", "outbound"].includes(String(operation.direction)) ||
|
|
105
|
+
![
|
|
106
|
+
"http-api",
|
|
107
|
+
"http-webhook",
|
|
108
|
+
"scheduled-feed",
|
|
109
|
+
"queue",
|
|
110
|
+
].includes(String(operation.protocol)) ||
|
|
111
|
+
(operation.method !== null &&
|
|
112
|
+
typeof operation.method !== "string") ||
|
|
113
|
+
(operation.routeTemplate !== null &&
|
|
114
|
+
typeof operation.routeTemplate !== "string") ||
|
|
115
|
+
(operation.eventType !== null &&
|
|
116
|
+
typeof operation.eventType !== "string") ||
|
|
117
|
+
!["request", "response", "message"].includes(String(operation.payloadLocation)) ||
|
|
118
|
+
(operation.statusSelector !== null &&
|
|
119
|
+
typeof operation.statusSelector !== "string") ||
|
|
120
|
+
typeof operation.fingerprint !== "string" ||
|
|
121
|
+
!/^sha256:[a-f0-9]{64}$/.test(operation.fingerprint)))) ||
|
|
122
|
+
!["draft", "active", "superseded"].includes(String(contract.lifecycleStatus)))) {
|
|
123
|
+
throw remoteInvalidResponse();
|
|
124
|
+
}
|
|
125
|
+
if (activeContractVersionId !== undefined &&
|
|
126
|
+
activeContractVersionId !== payload.activeContractVersionId) {
|
|
127
|
+
throw remoteInvalidResponse();
|
|
128
|
+
}
|
|
129
|
+
activeContractVersionId = payload.activeContractVersionId;
|
|
130
|
+
contracts.push(...payload.contracts.map((contract) => ({
|
|
131
|
+
id: contract.id,
|
|
132
|
+
declaredVersion: contract.declaredVersion,
|
|
133
|
+
...(typeof contract.fingerprint === "string"
|
|
134
|
+
? { fingerprint: contract.fingerprint }
|
|
135
|
+
: {}),
|
|
136
|
+
...(typeof contract.importedFrom === "string"
|
|
137
|
+
? {
|
|
138
|
+
importedFrom: contract.importedFrom,
|
|
139
|
+
}
|
|
140
|
+
: {}),
|
|
141
|
+
...(Array.isArray(contract.operations)
|
|
142
|
+
? {
|
|
143
|
+
operations: contract.operations,
|
|
144
|
+
}
|
|
145
|
+
: {}),
|
|
146
|
+
lifecycleStatus: contract.lifecycleStatus,
|
|
147
|
+
})));
|
|
148
|
+
cursor = payload.nextCursor;
|
|
149
|
+
if (cursor) {
|
|
150
|
+
if (seenCursors.has(cursor))
|
|
151
|
+
throw remoteInvalidResponse();
|
|
152
|
+
seenCursors.add(cursor);
|
|
153
|
+
}
|
|
154
|
+
} while (cursor);
|
|
155
|
+
if (activeContractVersionId === undefined)
|
|
156
|
+
throw remoteInvalidResponse();
|
|
157
|
+
return {
|
|
158
|
+
integrationId,
|
|
159
|
+
activeContractVersionId,
|
|
160
|
+
contracts,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
export async function readContractStatus(options) {
|
|
164
|
+
const status = await readDetailedContractStatus(options);
|
|
165
|
+
return {
|
|
166
|
+
integrationId: status.integrationId,
|
|
167
|
+
activeContractVersionId: status.activeContractVersionId,
|
|
168
|
+
contracts: status.contracts.map(({ id, declaredVersion, lifecycleStatus }) => ({
|
|
169
|
+
id,
|
|
170
|
+
declaredVersion,
|
|
171
|
+
lifecycleStatus,
|
|
172
|
+
})),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
async function findMatchingActivePlanContract(plan, rootDirectory, status, options) {
|
|
176
|
+
const root = path.resolve(rootDirectory);
|
|
177
|
+
const selected = selectedContract(plan, options.file);
|
|
178
|
+
const binding = selected.format === "json_schema"
|
|
179
|
+
? validateBinding(options.jsonSchemaBinding)
|
|
180
|
+
: undefined;
|
|
181
|
+
const { document } = await contractDocument(await resolveContractFile(root, selected.file), options.includeExamples === true, selected.fingerprint);
|
|
182
|
+
const expectedOperations = validateContractForScope(plan, selected, document, binding);
|
|
183
|
+
const { integrationId } = parseConnectionKey(options.connectionKey);
|
|
184
|
+
if (status.integrationId !== integrationId) {
|
|
185
|
+
throw new Error("Contract status belongs to another Integration");
|
|
186
|
+
}
|
|
187
|
+
const active = status.contracts.find(({ id }) => id === status.activeContractVersionId);
|
|
188
|
+
if (!active)
|
|
189
|
+
return null;
|
|
190
|
+
const documentFingerprint = `sha256:${createHash("sha256")
|
|
191
|
+
.update(JSON.stringify(document), "utf8")
|
|
192
|
+
.digest("hex")}`;
|
|
193
|
+
const importedFrom = selected.format === "openapi" ? "openapi" : "json-schema";
|
|
194
|
+
const storedOperations = active.operations
|
|
195
|
+
? [...active.operations].sort((left, right) => left.operationKey.localeCompare(right.operationKey))
|
|
196
|
+
: [];
|
|
197
|
+
const reviewedOperations = [...expectedOperations].sort((left, right) => left.operationKey.localeCompare(right.operationKey));
|
|
198
|
+
const operationsMatch = storedOperations.length === reviewedOperations.length &&
|
|
199
|
+
storedOperations.every((stored, index) => {
|
|
200
|
+
const reviewed = reviewedOperations[index];
|
|
201
|
+
if (!reviewed)
|
|
202
|
+
return false;
|
|
203
|
+
const schemaFingerprint = `sha256:${createHash("sha256")
|
|
204
|
+
.update(JSON.stringify(reviewed.schema), "utf8")
|
|
205
|
+
.digest("hex")}`;
|
|
206
|
+
return (stored.operationKey === reviewed.operationKey &&
|
|
207
|
+
stored.direction === reviewed.direction &&
|
|
208
|
+
stored.protocol === reviewed.protocol &&
|
|
209
|
+
stored.method === (reviewed.method ?? null) &&
|
|
210
|
+
stored.routeTemplate === (reviewed.routeTemplate ?? null) &&
|
|
211
|
+
stored.eventType === (reviewed.eventType ?? null) &&
|
|
212
|
+
stored.payloadLocation === reviewed.payloadLocation &&
|
|
213
|
+
stored.statusSelector === (reviewed.statusSelector ?? null) &&
|
|
214
|
+
stored.fingerprint === schemaFingerprint);
|
|
215
|
+
});
|
|
216
|
+
return active.lifecycleStatus === "active" &&
|
|
217
|
+
active.declaredVersion === options.declaredVersion &&
|
|
218
|
+
active.fingerprint === documentFingerprint &&
|
|
219
|
+
active.importedFrom === importedFrom &&
|
|
220
|
+
operationsMatch
|
|
221
|
+
? active
|
|
222
|
+
: null;
|
|
223
|
+
}
|
|
224
|
+
export async function readMatchingActivePlanContract(plan, rootDirectory, options) {
|
|
225
|
+
const detailed = await readDetailedContractStatus(options);
|
|
226
|
+
const match = await findMatchingActivePlanContract(plan, rootDirectory, detailed, options);
|
|
227
|
+
return {
|
|
228
|
+
status: {
|
|
229
|
+
integrationId: detailed.integrationId,
|
|
230
|
+
activeContractVersionId: detailed.activeContractVersionId,
|
|
231
|
+
contracts: detailed.contracts.map(({ id, declaredVersion, lifecycleStatus }) => ({
|
|
232
|
+
id,
|
|
233
|
+
declaredVersion,
|
|
234
|
+
lifecycleStatus,
|
|
235
|
+
})),
|
|
236
|
+
},
|
|
237
|
+
match,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
export async function reconcileActivePlanContract(plan, rootDirectory, options) {
|
|
241
|
+
await requireCurrentSourceEvidence(plan, path.resolve(rootDirectory));
|
|
242
|
+
const { match, status } = await readMatchingActivePlanContract(plan, rootDirectory, options);
|
|
243
|
+
if (!match || match.id !== options.contractVersionId) {
|
|
244
|
+
throw new SeamwardRemoteApiError("contract_activation_conflict", false, 409);
|
|
245
|
+
}
|
|
246
|
+
const contractAction = plan.actions.find((action) => action.type === "register_contract" &&
|
|
247
|
+
action.file === (options.file ?? selectedContract(plan).file));
|
|
248
|
+
if (!contractAction) {
|
|
249
|
+
throw new Error("Active contract is not owned by the current setup plan");
|
|
250
|
+
}
|
|
251
|
+
await recordRegisteredContractAction(plan, rootDirectory, contractAction.id, match.id);
|
|
252
|
+
await recordActivatedContractVersion(plan, rootDirectory, match.id);
|
|
253
|
+
return {
|
|
254
|
+
integrationId: status.integrationId,
|
|
255
|
+
activeContractVersionId: match.id,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function apiEndpoint(value) {
|
|
259
|
+
const url = new URL(value);
|
|
260
|
+
const local = url.hostname === "localhost" ||
|
|
261
|
+
url.hostname === "127.0.0.1" ||
|
|
262
|
+
url.hostname === "::1";
|
|
263
|
+
if (url.protocol !== "https:" && !(url.protocol === "http:" && local)) {
|
|
264
|
+
throw new Error("Seamward API endpoint must use HTTPS unless it is local");
|
|
265
|
+
}
|
|
266
|
+
url.pathname = url.pathname.replace(/\/$/, "");
|
|
267
|
+
url.search = "";
|
|
268
|
+
url.hash = "";
|
|
269
|
+
return url.toString().replace(/\/$/, "");
|
|
270
|
+
}
|
|
271
|
+
const maxContractBytes = 1_000_000;
|
|
272
|
+
async function resolveContractFile(rootDirectory, relativeFile) {
|
|
273
|
+
const root = await realpath(rootDirectory);
|
|
274
|
+
const requested = path.resolve(root, relativeFile.split("/").join(path.sep));
|
|
275
|
+
const resolved = await realpath(requested);
|
|
276
|
+
const relative = path.relative(root, resolved);
|
|
277
|
+
if (relative === ".." ||
|
|
278
|
+
relative.startsWith(`..${path.sep}`) ||
|
|
279
|
+
path.isAbsolute(relative)) {
|
|
280
|
+
throw new Error(`Contract path escapes the project boundary: ${relativeFile}`);
|
|
281
|
+
}
|
|
282
|
+
return resolved;
|
|
283
|
+
}
|
|
284
|
+
function stripExampleFields(value) {
|
|
285
|
+
let removed = 0;
|
|
286
|
+
const visit = (input, depth) => {
|
|
287
|
+
if (depth > 100)
|
|
288
|
+
throw new Error("Contract document nesting is too deep");
|
|
289
|
+
if (Array.isArray(input))
|
|
290
|
+
return input.map((item) => visit(item, depth + 1));
|
|
291
|
+
if (typeof input !== "object" || input === null)
|
|
292
|
+
return input;
|
|
293
|
+
return Object.fromEntries(Object.entries(input).flatMap(([key, item]) => {
|
|
294
|
+
if (/^(?:example|examples|x-code-?samples)$/i.test(key)) {
|
|
295
|
+
removed += 1;
|
|
296
|
+
return [];
|
|
297
|
+
}
|
|
298
|
+
return [[key, visit(item, depth + 1)]];
|
|
299
|
+
}));
|
|
300
|
+
};
|
|
301
|
+
return { document: visit(value, 0), removed };
|
|
302
|
+
}
|
|
303
|
+
async function contractDocument(file, includeExamples, expectedFingerprint) {
|
|
304
|
+
const fileStat = await stat(file);
|
|
305
|
+
if (fileStat.size > maxContractBytes) {
|
|
306
|
+
throw new Error(`Contract document exceeds ${maxContractBytes} bytes`);
|
|
307
|
+
}
|
|
308
|
+
const content = await readFile(file, "utf8");
|
|
309
|
+
const fingerprint = `sha256:${createHash("sha256").update(content).digest("hex")}`;
|
|
310
|
+
if (fingerprint !== expectedFingerprint) {
|
|
311
|
+
throw new Error("Contract document changed after the setup plan was reviewed");
|
|
312
|
+
}
|
|
313
|
+
const parsed = /\.ya?ml$/i.test(file)
|
|
314
|
+
? parseYaml(content)
|
|
315
|
+
: JSON.parse(content);
|
|
316
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
317
|
+
throw new Error("Contract document must be an object");
|
|
318
|
+
}
|
|
319
|
+
if (includeExamples) {
|
|
320
|
+
return {
|
|
321
|
+
document: parsed,
|
|
322
|
+
removedExampleFields: 0,
|
|
323
|
+
byteSize: fileStat.size,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
const stripped = stripExampleFields(parsed);
|
|
327
|
+
return {
|
|
328
|
+
document: stripped.document,
|
|
329
|
+
removedExampleFields: stripped.removed,
|
|
330
|
+
byteSize: fileStat.size,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function selectedContract(plan, file) {
|
|
334
|
+
const contracts = plan.discovery.contracts;
|
|
335
|
+
const scope = plan.integrationScope;
|
|
336
|
+
const assignedContracts = plan.actions.flatMap((action) => {
|
|
337
|
+
if (action.type !== "register_contract" ||
|
|
338
|
+
!action.contract ||
|
|
339
|
+
!action.integrationScope ||
|
|
340
|
+
!scope ||
|
|
341
|
+
action.integrationScope.direction !== scope.direction ||
|
|
342
|
+
action.integrationScope.protocol !== scope.protocol ||
|
|
343
|
+
action.file !== action.contract.file) {
|
|
344
|
+
return [];
|
|
345
|
+
}
|
|
346
|
+
return [action.contract];
|
|
347
|
+
});
|
|
348
|
+
if (file) {
|
|
349
|
+
const discovered = contracts.find((candidate) => candidate.file === file);
|
|
350
|
+
if (!discovered)
|
|
351
|
+
throw new Error(`Contract was not discovered: ${file}`);
|
|
352
|
+
const selected = assignedContracts.find((candidate) => candidate.file === file);
|
|
353
|
+
if (!selected) {
|
|
354
|
+
throw new Error(`Contract is not assigned to the selected Integration scope: ${file}`);
|
|
355
|
+
}
|
|
356
|
+
return selected;
|
|
357
|
+
}
|
|
358
|
+
if (assignedContracts.length !== 1) {
|
|
359
|
+
throw new Error(assignedContracts.length === 0
|
|
360
|
+
? "No contract is assigned to the selected Integration scope"
|
|
361
|
+
: "Multiple contracts are assigned; select exactly one with --file");
|
|
362
|
+
}
|
|
363
|
+
const selected = assignedContracts[0];
|
|
364
|
+
if (!selected) {
|
|
365
|
+
throw new Error("No contract is assigned to the selected Integration scope");
|
|
366
|
+
}
|
|
367
|
+
return selected;
|
|
368
|
+
}
|
|
369
|
+
export async function previewPlanContract(plan, rootDirectory, connectionKey, options = {}) {
|
|
370
|
+
const { integrationId } = parseConnectionKey(connectionKey);
|
|
371
|
+
const selected = selectedContract(plan, options.file);
|
|
372
|
+
const operationBinding = selected.format === "json_schema"
|
|
373
|
+
? validateBinding(options.jsonSchemaBinding)
|
|
374
|
+
: undefined;
|
|
375
|
+
const { document, byteSize, removedExampleFields } = await contractDocument(await resolveContractFile(rootDirectory, selected.file), options.includeExamples === true, selected.fingerprint);
|
|
376
|
+
validateContractForScope(plan, selected, document, operationBinding);
|
|
377
|
+
return {
|
|
378
|
+
integrationId,
|
|
379
|
+
file: selected.file,
|
|
380
|
+
format: selected.format,
|
|
381
|
+
fingerprint: selected.fingerprint,
|
|
382
|
+
byteSize,
|
|
383
|
+
removedExampleFields,
|
|
384
|
+
...(operationBinding ? { operationBinding } : {}),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
function validateBinding(binding) {
|
|
388
|
+
if (!binding)
|
|
389
|
+
throw new Error("JSON Schema requires an operation binding");
|
|
390
|
+
const allowed = new Set([
|
|
391
|
+
"method",
|
|
392
|
+
"routeTemplate",
|
|
393
|
+
"eventType",
|
|
394
|
+
"payloadLocation",
|
|
395
|
+
"statusSelector",
|
|
396
|
+
]);
|
|
397
|
+
if (Object.keys(binding).some((key) => !allowed.has(key))) {
|
|
398
|
+
throw new Error("JSON Schema operation binding contains unsupported fields");
|
|
399
|
+
}
|
|
400
|
+
if (typeof binding.routeTemplate !== "string" ||
|
|
401
|
+
binding.routeTemplate.length < 1 ||
|
|
402
|
+
binding.routeTemplate.length > 512 ||
|
|
403
|
+
!["request", "response", "message"].includes(binding.payloadLocation)) {
|
|
404
|
+
throw new Error("JSON Schema operation binding is invalid");
|
|
405
|
+
}
|
|
406
|
+
return binding;
|
|
407
|
+
}
|
|
408
|
+
function validateContractForScope(plan, contract, document, binding) {
|
|
409
|
+
const scope = plan.integrationScope;
|
|
410
|
+
if (!scope) {
|
|
411
|
+
throw new Error("The setup plan does not select an Integration scope");
|
|
412
|
+
}
|
|
413
|
+
let operations;
|
|
414
|
+
try {
|
|
415
|
+
operations =
|
|
416
|
+
contract.format === "openapi"
|
|
417
|
+
? importOpenApiOperations(document, scope)
|
|
418
|
+
: [
|
|
419
|
+
createJsonSchemaOperation({
|
|
420
|
+
...scope,
|
|
421
|
+
...validateBinding(binding),
|
|
422
|
+
schema: document,
|
|
423
|
+
}),
|
|
424
|
+
];
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
throw new Error(`Contract is invalid for the selected ${scope.direction} ${scope.protocol} Integration scope: ${error.message}`);
|
|
428
|
+
}
|
|
429
|
+
if (operations.length === 0) {
|
|
430
|
+
throw new Error(`Contract contains no supported operations for the selected ${scope.direction} ${scope.protocol} Integration scope: ${contract.file}`);
|
|
431
|
+
}
|
|
432
|
+
return operations;
|
|
433
|
+
}
|
|
434
|
+
export async function registerPlanContracts(plan, rootDirectory, options) {
|
|
435
|
+
const root = path.resolve(rootDirectory);
|
|
436
|
+
const contract = selectedContract(plan, options.file);
|
|
437
|
+
await applySetupPlan(plan, root);
|
|
438
|
+
const endpoint = apiEndpoint(options.endpoint ?? "https://api.seamward.com");
|
|
439
|
+
const { integrationId } = parseConnectionKey(options.connectionKey);
|
|
440
|
+
if (!options.apiKey)
|
|
441
|
+
throw new Error("A scoped Seamward API key is required");
|
|
442
|
+
if (!options.declaredVersion.trim()) {
|
|
443
|
+
throw new Error("A declared contract version is required");
|
|
444
|
+
}
|
|
445
|
+
const binding = contract.format === "json_schema"
|
|
446
|
+
? validateBinding(options.jsonSchemaBinding)
|
|
447
|
+
: undefined;
|
|
448
|
+
const fetchFn = options.fetchFn ?? fetch;
|
|
449
|
+
const registered = [];
|
|
450
|
+
const { document, removedExampleFields } = await contractDocument(await resolveContractFile(root, contract.file), options.includeExamples === true, contract.fingerprint);
|
|
451
|
+
validateContractForScope(plan, contract, document, binding);
|
|
452
|
+
const body = {
|
|
453
|
+
declaredVersion: options.declaredVersion,
|
|
454
|
+
expectedScope: plan.integrationScope,
|
|
455
|
+
format: contract.format === "openapi" ? "openapi" : "json-schema",
|
|
456
|
+
document,
|
|
457
|
+
...(binding ? { operation: binding } : {}),
|
|
458
|
+
};
|
|
459
|
+
const request = () => fetchFn(`${endpoint}/v1/integrations/${encodeURIComponent(integrationId)}/contracts`, {
|
|
460
|
+
method: "POST",
|
|
461
|
+
headers: {
|
|
462
|
+
authorization: `Bearer ${options.apiKey}`,
|
|
463
|
+
"content-type": "application/json",
|
|
464
|
+
},
|
|
465
|
+
body: JSON.stringify(body),
|
|
466
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? 15_000),
|
|
467
|
+
});
|
|
468
|
+
let response;
|
|
469
|
+
try {
|
|
470
|
+
response = await request();
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
try {
|
|
474
|
+
response = await request();
|
|
475
|
+
}
|
|
476
|
+
catch {
|
|
477
|
+
throw remoteNetworkError();
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (response.status !== 201)
|
|
481
|
+
throw await remoteResponseError(response);
|
|
482
|
+
const payload = (await response.json());
|
|
483
|
+
if (typeof payload.contract?.id !== "string" ||
|
|
484
|
+
payload.contract.lifecycleStatus !== "draft") {
|
|
485
|
+
throw remoteInvalidResponse();
|
|
486
|
+
}
|
|
487
|
+
registered.push({
|
|
488
|
+
file: contract.file,
|
|
489
|
+
contractVersionId: payload.contract.id,
|
|
490
|
+
status: "draft",
|
|
491
|
+
removedExampleFields,
|
|
492
|
+
});
|
|
493
|
+
if (options.writeCompletion) {
|
|
494
|
+
const action = plan.actions.find((candidate) => candidate.type === "register_contract" &&
|
|
495
|
+
candidate.file === contract.file);
|
|
496
|
+
if (!action) {
|
|
497
|
+
throw new Error("Registered contract is not owned by the setup plan");
|
|
498
|
+
}
|
|
499
|
+
await recordRegisteredContractAction(plan, root, action.id, payload.contract.id);
|
|
500
|
+
}
|
|
501
|
+
return { integrationId, registered, skipped: [] };
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* @deprecated This compatibility API bypasses setup-plan ownership and local
|
|
505
|
+
* source-evidence checks. Use previewPlanContractActivation followed by
|
|
506
|
+
* activatePlanContractVersion for every new integration.
|
|
507
|
+
*/
|
|
508
|
+
export async function activateContractVersion(options) {
|
|
509
|
+
const endpoint = apiEndpoint(options.endpoint ?? "https://api.seamward.com");
|
|
510
|
+
const { integrationId } = parseConnectionKey(options.connectionKey);
|
|
511
|
+
if (!options.apiKey)
|
|
512
|
+
throw new Error("A scoped Seamward API key is required");
|
|
513
|
+
if (!options.contractVersionId ||
|
|
514
|
+
options.contractVersionId.length > 128 ||
|
|
515
|
+
/[\u0000-\u001f\u007f]/.test(options.contractVersionId)) {
|
|
516
|
+
throw new Error("A valid contract version ID is required");
|
|
517
|
+
}
|
|
518
|
+
if (options.expectedActiveContractVersionId !== null &&
|
|
519
|
+
(!options.expectedActiveContractVersionId ||
|
|
520
|
+
options.expectedActiveContractVersionId.length > 128 ||
|
|
521
|
+
/[\u0000-\u001f\u007f]/.test(options.expectedActiveContractVersionId))) {
|
|
522
|
+
throw new Error("A valid expected active contract version ID is required");
|
|
523
|
+
}
|
|
524
|
+
const fetchFn = options.fetchFn ?? fetch;
|
|
525
|
+
let response;
|
|
526
|
+
try {
|
|
527
|
+
response = await fetchFn(`${endpoint}/v1/integrations/${encodeURIComponent(integrationId)}/contracts/${encodeURIComponent(options.contractVersionId)}/activate`, {
|
|
528
|
+
method: "POST",
|
|
529
|
+
headers: {
|
|
530
|
+
authorization: `Bearer ${options.apiKey}`,
|
|
531
|
+
"content-type": "application/json",
|
|
532
|
+
},
|
|
533
|
+
body: JSON.stringify({
|
|
534
|
+
expectedActiveContractVersionId: options.expectedActiveContractVersionId,
|
|
535
|
+
reason: options.reason,
|
|
536
|
+
}),
|
|
537
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? 15_000),
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
catch {
|
|
541
|
+
throw remoteNetworkError();
|
|
542
|
+
}
|
|
543
|
+
if (response.status !== 200)
|
|
544
|
+
throw await remoteResponseError(response);
|
|
545
|
+
const payload = (await response.json());
|
|
546
|
+
if (typeof payload.activationId !== "string" ||
|
|
547
|
+
typeof payload.activeContractVersionId !== "string" ||
|
|
548
|
+
(payload.previousActiveContractVersionId !== null &&
|
|
549
|
+
typeof payload.previousActiveContractVersionId !== "string") ||
|
|
550
|
+
typeof payload.revision !== "number") {
|
|
551
|
+
throw remoteInvalidResponse();
|
|
552
|
+
}
|
|
553
|
+
return {
|
|
554
|
+
integrationId,
|
|
555
|
+
activationId: payload.activationId,
|
|
556
|
+
activeContractVersionId: payload.activeContractVersionId,
|
|
557
|
+
previousActiveContractVersionId: payload.previousActiveContractVersionId,
|
|
558
|
+
revision: payload.revision,
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
export async function activatePlanContractVersion(plan, root, preview, options) {
|
|
562
|
+
await validatePlanContractActivation(plan, root, preview);
|
|
563
|
+
let result;
|
|
564
|
+
if (preview.reconcile) {
|
|
565
|
+
const currentStatus = await readContractStatus(options);
|
|
566
|
+
if (currentStatus.activeContractVersionId !== preview.contractVersionId) {
|
|
567
|
+
throw new SeamwardRemoteApiError("contract_activation_conflict", false, 409);
|
|
568
|
+
}
|
|
569
|
+
result = {
|
|
570
|
+
integrationId: currentStatus.integrationId,
|
|
571
|
+
activeContractVersionId: preview.contractVersionId,
|
|
572
|
+
reconciled: true,
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
try {
|
|
577
|
+
result = await activateContractVersion({
|
|
578
|
+
...options,
|
|
579
|
+
contractVersionId: preview.contractVersionId,
|
|
580
|
+
expectedActiveContractVersionId: preview.expectedActiveContractVersionId,
|
|
581
|
+
reason: preview.reason,
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
catch (error) {
|
|
585
|
+
if (!(error instanceof SeamwardRemoteApiError) ||
|
|
586
|
+
error.code !== "contract_activation_conflict") {
|
|
587
|
+
throw error;
|
|
588
|
+
}
|
|
589
|
+
const refreshedStatus = await readContractStatus(options);
|
|
590
|
+
if (refreshedStatus.activeContractVersionId !== preview.contractVersionId) {
|
|
591
|
+
throw error;
|
|
592
|
+
}
|
|
593
|
+
result = {
|
|
594
|
+
integrationId: refreshedStatus.integrationId,
|
|
595
|
+
activeContractVersionId: preview.contractVersionId,
|
|
596
|
+
reconciled: true,
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
await recordActivatedContractVersion(plan, root, result.activeContractVersionId);
|
|
601
|
+
return result;
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=contract-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-sync.js","sourceRoot":"","sources":["../src/contract-sync.ts"],"names":[],"mappings":"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"}
|