@oomol-lab/open-flow 0.1.0-alpha.9 → 0.1.0-beta.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/README.md +5 -1
- package/dist/browser/DesignerIcon-DjgOMYI5.js +2065 -0
- package/dist/browser/createResourceDialog-DNBueSYZ.js +505 -0
- package/dist/browser/{dist-n9WmBm5w.js → dist-BKuSVKCC.js} +1 -1
- package/dist/browser/dist-BMRLCebL.js +1893 -0
- package/dist/browser/{dist-DWzdGVm9.js → dist-By46o5UV.js} +74 -74
- package/dist/browser/dist-CP0883sY.js +4 -0
- package/dist/browser/{dist-B0Q2Mn0n.js → dist-Cc0y2Pli.js} +809 -810
- package/dist/browser/dist-CeSZ2xSM.js +444 -0
- package/dist/browser/{dist-Bc9TvHYl.js → dist-Dg_VXC8f.js} +134 -135
- package/dist/browser/{dist-DhsGR_K3.js → dist-DmuE3M0R.js} +47 -48
- package/dist/browser/{dist-D5mdziGP.js → dist-DpDLsYtO.js} +18 -19
- package/dist/browser/dist-DxahK_I8.js +2688 -0
- package/dist/browser/{dist-DXgEYMFx.js → dist-meg_oHVR.js} +230 -230
- package/dist/browser/{esm-YIGXG-Js.js → esm-yhVU_KbQ.js} +14 -15
- package/dist/browser/flow-authoring-module.d.ts +2 -2
- package/dist/browser/flow-authoring-node.d.ts +9 -4
- package/dist/browser/flow-authoring.d.ts +2 -1
- package/dist/browser/flow-authoring.js +752 -162
- package/dist/browser/flow-change.d.ts +122 -13
- package/dist/browser/flow-change.js +326 -96
- package/dist/browser/flow-notifications.d.ts +5 -0
- package/dist/browser/flowChanges-B2ttnaj9.js +12265 -0
- package/dist/browser/{flowRunInputEditorStore-DXOyyY7o.js → flowRunInputEditorStore-DDidwd8h.js} +1528 -783
- package/dist/browser/{flowWorkspace-D7-rBA1-.js → flowWorkspace-Dr8-Hut9.js} +42428 -42499
- package/dist/browser/getPseudoElementBounds-5LArT6Xc.js +7147 -0
- package/dist/browser/icons-KIOgjHpD.js +730 -0
- package/dist/browser/languages-DgJehE1g.js +62 -0
- package/dist/browser/lib-C5Ipyfps.js +7856 -0
- package/dist/browser/licenses.md +119 -1
- package/dist/browser/main-DmjVyuWr.js +76 -0
- package/dist/browser/{markdownContent-ColGUxHy.js → markdownContent-DUfLdnUt.js} +4811 -4795
- package/dist/browser/theme.css +63 -0
- package/dist/browser/theme.css.d.ts +1 -0
- package/dist/browser/typeScriptSession-_TgJ_7Oq.js +2578 -0
- package/dist/browser/waitNotificationInputs-BPulOxYt.js +26 -0
- package/dist/browser/workbench-contract.d.ts +2 -1
- package/dist/browser/workbench.css +1 -1
- package/dist/browser/workbench.d.ts +47 -1
- package/dist/browser/workbench.js +1524 -1768
- package/dist/browser/workbenchSelect-CbXrdwxW.js +1375 -0
- package/dist/common/connector-action.d.ts +6 -0
- package/dist/common/connector-action.js +37 -29
- package/dist/common/control-api-conformance.d.ts +1 -0
- package/dist/common/control-api-conformance.js +171 -51
- package/dist/common/control-api-errors.d.ts +28 -0
- package/dist/common/control-api.d.ts +80 -21
- package/dist/common/control-api.js +311 -131
- package/dist/common/flow-encoding.d.ts +2 -2
- package/dist/common/flow-encoding.js +28 -9
- package/dist/common/flow-notifications.d.ts +5 -0
- package/dist/common/flow-semantics.d.ts +4 -0
- package/dist/common/flow-semantics.js +3544 -1098
- package/dist/common/integration-trigger.d.ts +1 -0
- package/dist/common/licenses.md +1 -25
- package/dist/common/localization.d.ts +21 -0
- package/dist/common/localization.js +62 -0
- package/dist/common/provider-triggers.js +4 -1
- package/dist/common/run-events.js +2 -1
- package/dist/common/run-lifecycle.d.ts +17 -2
- package/dist/common/run-lifecycle.js +53 -2
- package/dist/common/runtime-contract.d.ts +1 -1
- package/dist/common/runtime-contract.js +27 -0
- package/dist/common/scheduler.d.ts +68 -7
- package/dist/common/scheduler.js +528 -240
- package/dist/index.d.ts +2 -1
- package/package.json +10 -1
- package/dist/browser/addNodeOptions-DRndy4EK.js +0 -6910
- package/dist/browser/createLucideIcon-CqjqCezK.js +0 -5537
- package/dist/browser/createResourceDialog-A64dDFCG.js +0 -467
- package/dist/browser/dist-CUkceEvN.js +0 -1620
- package/dist/browser/dist-CVtP-E2c.js +0 -1543
- package/dist/browser/dist-DQVavPcf.js +0 -2328
- package/dist/browser/field-CKGQHCIi.js +0 -312
|
@@ -17,4 +17,10 @@ export interface ConnectorActionPorts {
|
|
|
17
17
|
readonly nullable: boolean;
|
|
18
18
|
}[];
|
|
19
19
|
}
|
|
20
|
+
export interface ConnectorRuntimeInputPort {
|
|
21
|
+
readonly handle: string;
|
|
22
|
+
readonly jsonSchema: unknown;
|
|
23
|
+
readonly nullable: boolean;
|
|
24
|
+
}
|
|
20
25
|
export declare function connectorActionPorts(inputSchema: unknown, outputSchema: unknown): ConnectorActionPorts;
|
|
26
|
+
export declare function normalizeConnectorRuntimeInputs<Value>(ports: readonly ConnectorRuntimeInputPort[], inputs: Readonly<Record<string, Value>>): Readonly<Record<string, Value>>;
|
|
@@ -3,82 +3,90 @@ var e = Array.isArray, t = (e) => typeof e == "object" && !!e, n = (n) => t(n) &
|
|
|
3
3
|
//#endregion
|
|
4
4
|
//#region src/connector/common/actionSchema.ts
|
|
5
5
|
function i(e, t) {
|
|
6
|
-
let n =
|
|
6
|
+
let n = o(e);
|
|
7
7
|
return {
|
|
8
8
|
inputs: n,
|
|
9
9
|
initialInputs: n.flatMap((e) => e.value === void 0 ? [] : [{
|
|
10
10
|
handle: e.handle,
|
|
11
11
|
value: e.value
|
|
12
12
|
}]),
|
|
13
|
-
outputs:
|
|
13
|
+
outputs: s(t)
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
|
-
function a(e) {
|
|
16
|
+
function a(e, t) {
|
|
17
|
+
let n = new Map(e.map((e) => [e.handle, e])), r = {};
|
|
18
|
+
for (let [e, i] of Object.entries(t)) {
|
|
19
|
+
let t = n.get(e);
|
|
20
|
+
i == null && t?.nullable == 1 && !f(t.jsonSchema) || (r[e] = i);
|
|
21
|
+
}
|
|
22
|
+
return r;
|
|
23
|
+
}
|
|
24
|
+
function o(e) {
|
|
17
25
|
let t = r(e);
|
|
18
26
|
if (t == null || t.type != "object" && t.properties == null) throw Error("Connector action inputSchema must be an object schema.");
|
|
19
27
|
let n = r(t.properties);
|
|
20
28
|
if (n == null) return [];
|
|
21
|
-
let i =
|
|
29
|
+
let i = d(t.required);
|
|
22
30
|
return Object.entries(n).map(([e, n]) => {
|
|
23
|
-
let r = !i.has(e) ||
|
|
31
|
+
let r = !i.has(e) || f(n, t);
|
|
24
32
|
return {
|
|
25
|
-
description:
|
|
33
|
+
description: l(t, n),
|
|
26
34
|
handle: e,
|
|
27
|
-
json_schema:
|
|
35
|
+
json_schema: c(t, n),
|
|
28
36
|
nullable: r,
|
|
29
|
-
value:
|
|
37
|
+
value: u(t, n, r)
|
|
30
38
|
};
|
|
31
39
|
});
|
|
32
40
|
}
|
|
33
|
-
function
|
|
41
|
+
function s(e) {
|
|
34
42
|
let t = r(e), n = r(t?.properties);
|
|
35
43
|
if (t != null && (t.type == "object" || n != null)) {
|
|
36
44
|
if (n == null) return [];
|
|
37
|
-
let e =
|
|
45
|
+
let e = d(t.required);
|
|
38
46
|
return Object.entries(n).map(([n, r]) => ({
|
|
39
|
-
description:
|
|
47
|
+
description: l(t, r),
|
|
40
48
|
handle: n,
|
|
41
|
-
json_schema:
|
|
42
|
-
nullable: !e.has(n) ||
|
|
49
|
+
json_schema: c(t, r),
|
|
50
|
+
nullable: !e.has(n) || f(r, t)
|
|
43
51
|
}));
|
|
44
52
|
}
|
|
45
53
|
return [{
|
|
46
|
-
description:
|
|
54
|
+
description: l(t, e),
|
|
47
55
|
handle: "output",
|
|
48
56
|
json_schema: e,
|
|
49
|
-
nullable:
|
|
57
|
+
nullable: f(e)
|
|
50
58
|
}];
|
|
51
59
|
}
|
|
52
|
-
function
|
|
60
|
+
function c(e, t) {
|
|
53
61
|
let n = r(t);
|
|
54
62
|
if (n == null) return t;
|
|
55
63
|
let i = Object.assign({}, n);
|
|
56
64
|
return i.$defs == null && e.$defs != null && (i.$defs = e.$defs), i.definitions == null && e.definitions != null && (i.definitions = e.definitions), i;
|
|
57
65
|
}
|
|
58
|
-
function
|
|
59
|
-
for (let n of
|
|
66
|
+
function l(e, t) {
|
|
67
|
+
for (let n of p(e, t)) if (typeof n.description == "string") return n.description;
|
|
60
68
|
}
|
|
61
|
-
function
|
|
62
|
-
for (let n of
|
|
69
|
+
function u(e, t, n) {
|
|
70
|
+
for (let n of p(e, t)) if (Object.hasOwn(n, "default")) return n.default;
|
|
63
71
|
return n ? null : void 0;
|
|
64
72
|
}
|
|
65
|
-
function
|
|
73
|
+
function d(e) {
|
|
66
74
|
return Array.isArray(e) ? new Set(e.filter((e) => typeof e == "string")) : /* @__PURE__ */ new Set();
|
|
67
75
|
}
|
|
68
|
-
function
|
|
76
|
+
function f(e, t = e, n = /* @__PURE__ */ new Set()) {
|
|
69
77
|
let i = r(e);
|
|
70
78
|
if (i == null) return !1;
|
|
71
79
|
if (Object.hasOwn(i, "type")) return i.type == "null" || Array.isArray(i.type) && i.type.includes("null");
|
|
72
80
|
if (Object.hasOwn(i, "enum")) return Array.isArray(i.enum) && i.enum.includes(null);
|
|
73
|
-
for (let e of ["anyOf", "oneOf"]) if (Object.hasOwn(i, e)) return Array.isArray(i[e]) && i[e].some((e) =>
|
|
81
|
+
for (let e of ["anyOf", "oneOf"]) if (Object.hasOwn(i, e)) return Array.isArray(i[e]) && i[e].some((e) => f(e, t, n));
|
|
74
82
|
let a = typeof i.$ref == "string" ? i.$ref : void 0;
|
|
75
83
|
if (a == null || n.has(a)) return !1;
|
|
76
|
-
let o =
|
|
84
|
+
let o = m(t, a);
|
|
77
85
|
if (o === void 0) return !1;
|
|
78
86
|
let s = new Set(n);
|
|
79
|
-
return s.add(a),
|
|
87
|
+
return s.add(a), f(o, t, s);
|
|
80
88
|
}
|
|
81
|
-
function
|
|
89
|
+
function p(e, t) {
|
|
82
90
|
let n = [], i = /* @__PURE__ */ new Set(), a = t;
|
|
83
91
|
for (;;) {
|
|
84
92
|
let t = r(a);
|
|
@@ -86,12 +94,12 @@ function f(e, t) {
|
|
|
86
94
|
n.push(t);
|
|
87
95
|
let o = typeof t.$ref == "string" ? t.$ref : void 0;
|
|
88
96
|
if (o == null || i.has(o)) return n;
|
|
89
|
-
let s =
|
|
97
|
+
let s = m(e, o);
|
|
90
98
|
if (s === void 0) return n;
|
|
91
99
|
i.add(o), a = s;
|
|
92
100
|
}
|
|
93
101
|
}
|
|
94
|
-
function
|
|
102
|
+
function m(e, t) {
|
|
95
103
|
if (t == "#") return e;
|
|
96
104
|
if (!t.startsWith("#/")) return;
|
|
97
105
|
let n = e;
|
|
@@ -103,4 +111,4 @@ function p(e, t) {
|
|
|
103
111
|
return n;
|
|
104
112
|
}
|
|
105
113
|
//#endregion
|
|
106
|
-
export { i as connectorActionPorts };
|
|
114
|
+
export { i as connectorActionPorts, a as normalizeConnectorRuntimeInputs };
|
|
@@ -5,6 +5,7 @@ export interface ControlApiConformanceHarness {
|
|
|
5
5
|
}
|
|
6
6
|
export interface ControlApiConformanceCase {
|
|
7
7
|
readonly name: string;
|
|
8
|
+
readonly runtime?: true;
|
|
8
9
|
verify(harness: ControlApiConformanceHarness): Promise<void>;
|
|
9
10
|
}
|
|
10
11
|
export declare const controlApiConformanceCases: readonly ControlApiConformanceCase[];
|
|
@@ -38,9 +38,11 @@ function s(e, t) {
|
|
|
38
38
|
async function c(e, t, n) {
|
|
39
39
|
return i(e.status, t, `${n} status`), a(await e.json().catch(() => r(`${n} body: expected JSON.`)), `${n} body`);
|
|
40
40
|
}
|
|
41
|
-
async function l(e, t, n,
|
|
42
|
-
let
|
|
43
|
-
i(
|
|
41
|
+
async function l(e, t, n, o, l) {
|
|
42
|
+
let u = await c(e, t, o), d = a(u.error, `${o} error`);
|
|
43
|
+
i(d.code, n, `${o} error code`);
|
|
44
|
+
let f = s(d.message, `${o} error message`);
|
|
45
|
+
l != null && !f.includes(l) && r(`${o} error message: expected ${JSON.stringify(l)} in ${JSON.stringify(f)}.`), i(u.version, 1, `${o} version`);
|
|
44
46
|
}
|
|
45
47
|
function u(e, t, n = {}) {
|
|
46
48
|
let r = new Headers(n.headers);
|
|
@@ -62,17 +64,18 @@ function d(e, t, n) {
|
|
|
62
64
|
async function f(e, t, n) {
|
|
63
65
|
return c(await d(e, t, n), 201, "Create Flow");
|
|
64
66
|
}
|
|
65
|
-
function p(e, t, n, r) {
|
|
67
|
+
function p(e, t, n, r, i = `change-${crypto.randomUUID()}`) {
|
|
66
68
|
return u(e, `/v1/flows/${encodeURIComponent(t)}/draft/changes`, {
|
|
67
69
|
body: JSON.stringify({
|
|
68
70
|
expectedRevisionId: n,
|
|
69
71
|
operations: r,
|
|
70
72
|
version: 1
|
|
71
73
|
}),
|
|
74
|
+
headers: { "idempotency-key": i },
|
|
72
75
|
method: "POST"
|
|
73
76
|
});
|
|
74
77
|
}
|
|
75
|
-
function m(e, t, n, r = "marker") {
|
|
78
|
+
function m(e, t, n, r = "marker", i) {
|
|
76
79
|
return p(e, t, n, [{
|
|
77
80
|
kind: "graph.node.create",
|
|
78
81
|
node: {
|
|
@@ -88,7 +91,7 @@ function m(e, t, n, r = "marker") {
|
|
|
88
91
|
},
|
|
89
92
|
nodeId: r,
|
|
90
93
|
target: { kind: "flow" }
|
|
91
|
-
}]);
|
|
94
|
+
}], i);
|
|
92
95
|
}
|
|
93
96
|
function h(e, t) {
|
|
94
97
|
return s(a(e.revision, `${t} revision`).revisionId, `${t} revisionId`);
|
|
@@ -104,7 +107,17 @@ function g(e, t, r, i, a) {
|
|
|
104
107
|
method: "POST"
|
|
105
108
|
});
|
|
106
109
|
}
|
|
107
|
-
function _(e, t, n, r
|
|
110
|
+
async function _(e, t, n, r) {
|
|
111
|
+
let o = await c(t, n, r), l = s(o.operationId, `${r} operationId`);
|
|
112
|
+
for (let t = 0; o.status == "pending" && t < 100; t += 1) await new Promise((e) => setTimeout(e, 10)), o = await c(await u(e, `/v1/flows/${s(o.flowId, `${r} flowId`)}/publish-operations/${l}`), 200, `${r} operation`);
|
|
113
|
+
i(o.status, "succeeded", `${r} terminal status`);
|
|
114
|
+
let d = s(o.publicationId, `${r} publicationId`), f = a((await c(await u(e, `/v1/flows/${s(o.flowId, `${r} flowId`)}/live`), 200, `${r} Live`)).publication, `${r} Publication`);
|
|
115
|
+
return i(f.publicationId, d, `${r} Live Publication`), {
|
|
116
|
+
operation: o,
|
|
117
|
+
publication: f
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function v(e, t, n, r, i) {
|
|
108
121
|
return u(e, `/v1/flows/${encodeURIComponent(t)}/publications/${encodeURIComponent(n)}/rollback`, {
|
|
109
122
|
body: JSON.stringify({
|
|
110
123
|
expectedLivePublicationId: r,
|
|
@@ -114,7 +127,7 @@ function _(e, t, n, r, i) {
|
|
|
114
127
|
method: "POST"
|
|
115
128
|
});
|
|
116
129
|
}
|
|
117
|
-
function
|
|
130
|
+
function y(e, t, n) {
|
|
118
131
|
return u(e, "/v1/runs", {
|
|
119
132
|
body: JSON.stringify({
|
|
120
133
|
inputs: {},
|
|
@@ -125,7 +138,46 @@ function v(e, t, n) {
|
|
|
125
138
|
method: "POST"
|
|
126
139
|
});
|
|
127
140
|
}
|
|
128
|
-
var
|
|
141
|
+
var b = [
|
|
142
|
+
{
|
|
143
|
+
name: "manages deployment Variables with stable limits and exact-case identity",
|
|
144
|
+
async verify(e) {
|
|
145
|
+
i(await c(await u(e, "/v1/variables"), 200, "List empty Variables"), {
|
|
146
|
+
variables: [],
|
|
147
|
+
version: 1
|
|
148
|
+
}, "Empty Variables");
|
|
149
|
+
let t = (t, n, r = { value: n }) => u(e, `/v1/variables/${encodeURIComponent(t)}`, {
|
|
150
|
+
body: JSON.stringify(r),
|
|
151
|
+
method: "PUT"
|
|
152
|
+
}), n = await c(await t("Token", ""), 200, "Create Variable");
|
|
153
|
+
i(Object.keys(n).toSorted(), [
|
|
154
|
+
"name",
|
|
155
|
+
"updatedAt",
|
|
156
|
+
"value",
|
|
157
|
+
"version"
|
|
158
|
+
], "Variable fields"), i(n.name, "Token", "Variable name"), i(n.value, "", "Empty Variable value"), i(n.version, 1, "Variable version"), s(n.updatedAt, "Variable updatedAt"), i(await c(await u(e, "/v1/variables/Token"), 200, "Read Variable"), n, "Read Variable"), i(await c(await t("Token", ""), 200, "Put same Variable"), n, "Same Variable update");
|
|
159
|
+
for (let e of [
|
|
160
|
+
"A",
|
|
161
|
+
"Z",
|
|
162
|
+
"a",
|
|
163
|
+
"token"
|
|
164
|
+
]) await c(await t(e, e), 200, `Create ${e} Variable`);
|
|
165
|
+
i(o((await c(await u(e, "/v1/variables"), 200, "List Variables")).variables, "Variables").map((e) => a(e, "Variable").name), [
|
|
166
|
+
"A",
|
|
167
|
+
"Token",
|
|
168
|
+
"Z",
|
|
169
|
+
"a",
|
|
170
|
+
"token"
|
|
171
|
+
], "Variable binary order");
|
|
172
|
+
let r = `${"值".repeat(21845)}x`;
|
|
173
|
+
i(new TextEncoder().encode(r).byteLength, 65536, "Variable UTF-8 boundary fixture"), await c(await t("BIG", r), 200, "Create maximum Variable value"), await l(await t("BIG", `${r}x`), 400, "variable.invalid", "Reject oversized Variable value"), await l(await t("OO_TOKEN", "value"), 400, "variable.invalid", "Reject reserved Variable name"), await l(await t("bad-name", "value"), 400, "variable.invalid", "Reject invalid Variable name"), await l(await t("EXTRA", "value", {
|
|
174
|
+
extra: !0,
|
|
175
|
+
value: "value"
|
|
176
|
+
}), 400, "variable.invalid", "Reject extra Variable field"), await l(await u(e, "/v1/variables/MISSING"), 404, "variable.not-found", "Read missing Variable"), await l(await u(e, "/v1/variables/MISSING", { method: "DELETE" }), 404, "variable.not-found", "Delete missing Variable"), i(await c(await u(e, "/v1/variables/Token", { method: "DELETE" }), 200, "Delete Variable"), { version: 1 }, "Delete response");
|
|
177
|
+
for (let e = 0; e < 195; e += 1) await c(await t(`V${String(e).padStart(3, "0")}`, "value"), 200, `Fill Variable ${e}`);
|
|
178
|
+
await l(await t("V195", "value"), 409, "variable.limit-reached", "Reject Variable over limit"), i((await c(await t("A", "updated"), 200, "Update full Variable catalog")).value, "updated", "Full catalog update");
|
|
179
|
+
}
|
|
180
|
+
},
|
|
129
181
|
{
|
|
130
182
|
name: "creates, replays, lists, reads, renames, and retires a Flow",
|
|
131
183
|
async verify(e) {
|
|
@@ -148,24 +200,25 @@ var y = [
|
|
|
148
200
|
{
|
|
149
201
|
name: "commits immutable Draft Revisions for one Flow",
|
|
150
202
|
async verify(e) {
|
|
151
|
-
let t = await f(e, "Draft flow", "draft-flow"), n = s(t.flowId, "Draft Flow flowId"), r = s(t.draftRevisionId, "Draft Flow revisionId"), o = await c(await m(e, n, r), 200, "Change Draft"), d = h(o, "Changed Draft");
|
|
152
|
-
i(a(o.revision, "Changed Draft revision").parentRevisionId, r, "Changed Draft parent"), await l(await p(e, n, d, [{
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
jsonSchema: { type: "boolean" },
|
|
161
|
-
nullable: !1,
|
|
162
|
-
value: !0
|
|
163
|
-
}]
|
|
164
|
-
},
|
|
203
|
+
let t = await f(e, "Draft flow", "draft-flow"), n = s(t.flowId, "Draft Flow flowId"), r = s(t.draftRevisionId, "Draft Flow revisionId"), o = await c(await m(e, n, r, "marker", "draft-change"), 200, "Change Draft"), d = h(o, "Changed Draft");
|
|
204
|
+
i(a(o.revision, "Changed Draft revision").parentRevisionId, r, "Changed Draft parent"), i(await c(await m(e, n, r, "marker", "draft-change"), 200, "Replay Draft change"), o, "Replayed Draft change"), await l(await m(e, n, r, "another-marker", "draft-change"), 409, "flow.conflict", "Conflicting Draft change replay"), await l(await m(e, n, d, "marker"), 400, "flow.invalid", "Duplicate Draft Node", "A Node with this ID already exists"), await l(await p(e, n, d, [{
|
|
205
|
+
before: [{
|
|
206
|
+
handle: "ready",
|
|
207
|
+
jsonSchema: { type: "boolean" },
|
|
208
|
+
nullable: !1,
|
|
209
|
+
value: !0
|
|
210
|
+
}],
|
|
211
|
+
kind: "graph.node.values.set",
|
|
165
212
|
nodeId: "marker",
|
|
166
|
-
target: { kind: "flow" }
|
|
213
|
+
target: { kind: "flow" },
|
|
214
|
+
value: [{
|
|
215
|
+
handle: "ready",
|
|
216
|
+
jsonSchema: { type: "boolean" },
|
|
217
|
+
nullable: !1,
|
|
218
|
+
value: !0
|
|
219
|
+
}]
|
|
167
220
|
}]), 400, "flow.invalid", "No-op Draft change"), await l(await m(e, n, r, "stale"), 412, "flow.revision-conflict", "Stale Draft change"), i(a(a(a(a((await c(await u(e, `/v1/flows/${n}/revisions/${r}`), 200, "Read old Revision")).content, "Old content").document, "Old document").graph, "Old graph").nodes, "Old nodes"), {}, "Old Revision nodes"), i((await c(await u(e, `/v1/flows/${n}/draft`), 200, "Read Draft")).revisionId, d, "Draft revisionId");
|
|
168
|
-
let g = await c(await u(e, `/v1/flows/${n}/draft/sync
|
|
221
|
+
let g = await c(await u(e, `/v1/flows/${n}/draft/sync`), 200, "Sync Draft");
|
|
169
222
|
i(g.kind, "snapshot", "Draft sync kind"), i(a(g.draft, "Draft snapshot").revisionId, d, "Draft snapshot revisionId");
|
|
170
223
|
}
|
|
171
224
|
},
|
|
@@ -221,7 +274,7 @@ var y = [
|
|
|
221
274
|
method: "POST"
|
|
222
275
|
}), h = await c(await m(), 202, "Create Draft Run"), g = s(h.runId, "Draft Run runId");
|
|
223
276
|
i(await c(await m(), 200, "Replay Draft Run"), h, "Replayed Draft Run"), await l(await u(e, `/v1/runs/${g}/result`), 409, "run.not-terminal", "Read queued Run result");
|
|
224
|
-
let _ = await c(await u(e, p, {
|
|
277
|
+
let _ = s((await c(await u(e, p, {
|
|
225
278
|
body: JSON.stringify({
|
|
226
279
|
engineContract: n,
|
|
227
280
|
inputs: {},
|
|
@@ -229,16 +282,83 @@ var y = [
|
|
|
229
282
|
}),
|
|
230
283
|
headers: { "idempotency-key": "draft-run-second" },
|
|
231
284
|
method: "POST"
|
|
232
|
-
}), 202, "Create second Draft Run"), v = await c(await u(e, `/v1/flows/${r}/runs?limit=1`), 200, "List Runs");
|
|
233
|
-
i(o(v.runs, "Runs").map((e) => a(e, "Run").runId), [
|
|
285
|
+
}), 202, "Create second Draft Run")).runId, "Second Draft Run"), v = await c(await u(e, `/v1/flows/${r}/runs?limit=1`), 200, "List Runs");
|
|
286
|
+
i(o(v.runs, "Runs").map((e) => a(e, "Run").runId), [_], "Listed Runs");
|
|
287
|
+
let y = s(v.nextCursor, "Run cursor");
|
|
288
|
+
i(o((await c(await u(e, `/v1/flows/${r}/runs?limit=1&cursor=${encodeURIComponent(y)}`), 200, "List next Runs")).runs, "Next Runs").map((e) => a(e, "Run").runId), [g], "Listed next Runs"), i((await c(await u(e, `/v1/runs/${g}/cancel`, {
|
|
234
289
|
body: JSON.stringify({ version: 1 }),
|
|
235
290
|
method: "POST"
|
|
236
|
-
}), 200, "Cancel Run")).status, "canceled", "Canceled Run status"), i((await c(await u(e, `/v1/runs/${g}/result`), 200, "Read canceled Run result")).status, "canceled", "Canceled Run result"), i((await c(await u(e, `/v1/runs/${g}/events`), 200, "Read canceled Run events")).done, !0, "Canceled Run events"), i((await c(await u(e, `/v1/runs/${
|
|
291
|
+
}), 200, "Cancel Run")).status, "canceled", "Canceled Run status"), i((await c(await u(e, `/v1/runs/${g}/result`), 200, "Read canceled Run result")).status, "canceled", "Canceled Run result"), i((await c(await u(e, `/v1/runs/${g}/events`), 200, "Read canceled Run events")).done, !0, "Canceled Run events"), i((await c(await u(e, `/v1/runs/${_}/cancel`, {
|
|
237
292
|
body: JSON.stringify({ version: 1 }),
|
|
238
293
|
method: "POST"
|
|
239
294
|
}), 200, "Cancel second Draft Run")).status, "canceled", "Second canceled Run status");
|
|
240
295
|
}
|
|
241
296
|
},
|
|
297
|
+
{
|
|
298
|
+
name: "pauses, resolves, resumes, and cancels waiting Draft Runs",
|
|
299
|
+
runtime: !0,
|
|
300
|
+
async verify(e) {
|
|
301
|
+
let t = await f(e, "Wait flow", "wait-flow"), d = s(t.flowId, "Wait Flow flowId"), m = `/v1/flows/${d}/revisions/${h(await c(await p(e, d, s(t.draftRevisionId, "Wait Flow revisionId"), [{
|
|
302
|
+
kind: "graph.node.create",
|
|
303
|
+
node: {
|
|
304
|
+
actions: ["approve", "reject"],
|
|
305
|
+
concurrency: 1,
|
|
306
|
+
input: {
|
|
307
|
+
handle: "value",
|
|
308
|
+
jsonSchema: {},
|
|
309
|
+
nullable: !0,
|
|
310
|
+
value: null
|
|
311
|
+
},
|
|
312
|
+
inputs: { value: {
|
|
313
|
+
kind: "value",
|
|
314
|
+
value: { request: 1 }
|
|
315
|
+
} },
|
|
316
|
+
kind: "wait",
|
|
317
|
+
prompt: "Approve request 1?"
|
|
318
|
+
},
|
|
319
|
+
nodeId: "approval",
|
|
320
|
+
target: { kind: "flow" }
|
|
321
|
+
}]), 200, "Create Wait"), "Wait Revision")}/runs`, g = async (t, r) => c(await u(e, m, {
|
|
322
|
+
body: JSON.stringify({
|
|
323
|
+
engineContract: n,
|
|
324
|
+
inputs: {},
|
|
325
|
+
version: 1
|
|
326
|
+
}),
|
|
327
|
+
headers: { "idempotency-key": t },
|
|
328
|
+
method: "POST"
|
|
329
|
+
}), 202, r), _ = await g("wait-run", "Create Wait Run"), v = s(_.runId, "Wait Run runId"), y = _;
|
|
330
|
+
for (let t = 0; y.status != "waiting" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), y = await c(await u(e, `/v1/runs/${v}`), 200, "Read Wait Run");
|
|
331
|
+
i(y.status, "waiting", "Wait Run status");
|
|
332
|
+
let b = a(y.waiting, "Active Wait");
|
|
333
|
+
i(b.actions, ["approve", "reject"], "Wait actions"), i(b.nodeId, "approval", "Wait node"), i(b.prompt, "Approve request 1?", "Wait prompt"), s(b.expiresAt, "Wait expiry"), s(b.waitingSince, "Wait start");
|
|
334
|
+
let x = s(b.waitId, "Wait id");
|
|
335
|
+
i(o((await c(await u(e, `/v1/flows/${d}/runs?status=waiting`), 200, "List waiting Runs")).runs, "Waiting Runs").map((e) => a(e, "Waiting Run").runId), [v], "Waiting Run list");
|
|
336
|
+
let S = await c(await u(e, `/v1/runs/${v}/events`), 200, "Read waiting Run events");
|
|
337
|
+
i(S.done, !1, "Waiting events done"), o(S.events, "Waiting events").some((e) => a(e, "Waiting event").kind == "run.waiting") || r("Waiting Run must contain run.waiting."), await l(await u(e, `/v1/runs/${v}/result`), 409, "run.not-terminal", "Read waiting Run result");
|
|
338
|
+
let C = `/v1/runs/${v}/waits/${x}/resolve`, w = (t) => u(e, C, {
|
|
339
|
+
body: JSON.stringify({
|
|
340
|
+
action: t,
|
|
341
|
+
version: 1
|
|
342
|
+
}),
|
|
343
|
+
method: "POST"
|
|
344
|
+
});
|
|
345
|
+
await l(await w("continue"), 400, "run.invalid", "Reject unsupported Wait action");
|
|
346
|
+
let T = await c(await w("approve"), 200, "Approve Wait");
|
|
347
|
+
i(T.action, "approve", "Approved action"), i(T.resolutionAccepted, !0, "Approved resolution"), i(T.status, "queued", "Resolved Run status"), s(T.resolvedAt, "Wait resolution time");
|
|
348
|
+
let E = await c(await w("reject"), 200, "Reject resolved Wait");
|
|
349
|
+
i(E.action, "approve", "Winning action"), i(E.resolutionAccepted, !1, "Competing resolution");
|
|
350
|
+
for (let t = 0; y.status != "completed" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), y = await c(await u(e, `/v1/runs/${v}`), 200, "Read resumed Run");
|
|
351
|
+
i(y.status, "completed", "Resumed Run status"), i(y.waiting, void 0, "Completed Wait projection");
|
|
352
|
+
let D = await c(await w("approve"), 200, "Replay approved Wait");
|
|
353
|
+
i(D.resolutionAccepted, !0, "Replayed resolution"), i(D.status, "completed", "Replayed terminal status"), i(o((await c(await u(e, `/v1/runs/${v}/events`), 200, "Read resumed Run events")).events, "Completed events").filter((e) => a(e, "Completed event").kind == "run.resolved").length, 1, "Resolved event count");
|
|
354
|
+
let O = await g("wait-run-cancel", "Create cancelable Wait Run"), k = s(O.runId, "Cancelable Wait Run id"), A = O;
|
|
355
|
+
for (let t = 0; A.status != "waiting" && t < 200; t += 1) await new Promise((e) => setTimeout(e, 10)), A = await c(await u(e, `/v1/runs/${k}`), 200, "Read cancelable Wait Run");
|
|
356
|
+
i(A.status, "waiting", "Cancelable Wait status"), i((await c(await u(e, `/v1/runs/${k}/cancel`, {
|
|
357
|
+
body: JSON.stringify({ version: 1 }),
|
|
358
|
+
method: "POST"
|
|
359
|
+
}), 200, "Cancel waiting Run")).status, "canceled", "Canceled waiting Run status");
|
|
360
|
+
}
|
|
361
|
+
},
|
|
242
362
|
{
|
|
243
363
|
name: "rejects invalid and missing Flow control targets",
|
|
244
364
|
async verify(e) {
|
|
@@ -280,35 +400,35 @@ var y = [
|
|
|
280
400
|
await l(await p(c, "unsupported-engine/v1", "unsupported-run"), 409, "engine.unsupported", "Run unsupported Engine"), await l(await p(r, n, "missing-revision-run"), 404, "flow.not-found", "Run missing Revision");
|
|
281
401
|
}
|
|
282
402
|
}
|
|
283
|
-
],
|
|
403
|
+
], x = [{
|
|
284
404
|
name: "publishes one immutable Flow with idempotent Live CAS",
|
|
285
405
|
async verify(e) {
|
|
286
406
|
let t = await f(e, "Publication flow", "publication-flow"), n = s(t.flowId, "Publication Flow flowId"), r = s(t.draftRevisionId, "Publication Flow revisionId");
|
|
287
407
|
i((await c(await u(e, `/v1/flows/${n}/live`), 200, "Read Live")).status, "not-published", "Initial Live status");
|
|
288
|
-
let a = () => g(e, n, r, null, "publication-first"), o = await
|
|
289
|
-
i(await c(await a(),
|
|
290
|
-
let
|
|
291
|
-
i(
|
|
408
|
+
let a = () => g(e, n, r, null, "publication-first"), o = await _(e, await a(), 202, "Publish Flow"), d = o.publication, p = s(d.publicationId, "Publication id");
|
|
409
|
+
i(await c(await a(), 202, "Replay Publish"), o.operation, "Replayed Publish operation"), await l(await g(e, n, r, p, "publication-first"), 409, "publication.conflict", "Conflicting replay"), i((await c(await u(e, `/v1/flows/${n}/live`), 200, "Read published Live")).publication, d, "Live Publication");
|
|
410
|
+
let m = await c(await u(e, `/v1/flows/${n}/publications?includeTotal=true`), 200, "List Publications");
|
|
411
|
+
i(m.publications, [d], "Publication history"), i(m.total, 1, "Publication total"), await l(await u(e, `/v1/flows/${n}/revisions/${r}/publications`, {
|
|
292
412
|
body: JSON.stringify({
|
|
293
413
|
engineContract: "unsupported-engine/v1",
|
|
294
|
-
expectedLivePublicationId:
|
|
414
|
+
expectedLivePublicationId: p,
|
|
295
415
|
version: 1
|
|
296
416
|
}),
|
|
297
417
|
headers: { "idempotency-key": "unsupported-publication" },
|
|
298
418
|
method: "POST"
|
|
299
|
-
}), 409, "engine.unsupported", "Publish unsupported Engine"), await l(await g(e, n, "00000000-0000-7000-8000-000000000002",
|
|
419
|
+
}), 409, "engine.unsupported", "Publish unsupported Engine"), await l(await g(e, n, "00000000-0000-7000-8000-000000000002", p, "missing-revision-publication"), 404, "flow.not-found", "Publish missing Revision"), await l(await v(e, n, "00000000-0000-7000-8000-000000000004", p, "missing-rollback"), 404, "publication.not-found", "Rollback missing Publication"), await l(await y(e, "00000000-0000-7000-8000-000000000004", "missing-publication-run"), 404, "publication.not-found", "Run missing Publication");
|
|
300
420
|
}
|
|
301
421
|
}, {
|
|
302
422
|
name: "rolls back immutable history and fixes a Live Run target",
|
|
303
423
|
async verify(e) {
|
|
304
|
-
let t = await f(e, "Rollback flow", "rollback-flow"), n = s(t.flowId, "Rollback Flow flowId"), r = s(t.draftRevisionId, "Rollback Flow revisionId"), a =
|
|
305
|
-
await l(await
|
|
306
|
-
let
|
|
307
|
-
i(
|
|
308
|
-
let
|
|
309
|
-
i(
|
|
424
|
+
let t = await f(e, "Rollback flow", "rollback-flow"), n = s(t.flowId, "Rollback Flow flowId"), r = s(t.draftRevisionId, "Rollback Flow revisionId"), a = (await _(e, await g(e, n, r, null, "publish-first"), 202, "Publish first Revision")).publication, o = s(a.publicationId, "First Publication"), d = (await _(e, await g(e, n, h(await c(await m(e, n, r), 200, "Change Draft"), "Second Revision"), o, "publish-second"), 202, "Publish second Revision")).publication, p = s(d.publicationId, "Second Publication");
|
|
425
|
+
await l(await y(e, o, "stale-live-run"), 412, "live.conflict", "Run stale Publication");
|
|
426
|
+
let b = () => v(e, n, o, p, "rollback-first"), x = await c(await b(), 201, "Rollback Flow"), S = s(x.publicationId, "Rollback Publication");
|
|
427
|
+
i(x.operation, "rollback", "Rollback operation"), i(x.sourcePublicationId, o, "Rollback source"), i(await c(await b(), 200, "Replay Rollback"), x, "Replayed Rollback");
|
|
428
|
+
let C = await c(await y(e, S, "rollback-run"), 202, "Create Live Run");
|
|
429
|
+
i(C.flowId, n, "Live Run flowId"), i(C.revisionId, r, "Live Run revisionId"), await c(await u(e, `/v1/flows/${n}`, { method: "DELETE" }), 202, "Retire Flow"), await l(await y(e, S, "retired-run"), 409, "flow.busy", "Run retired Flow");
|
|
310
430
|
}
|
|
311
|
-
}],
|
|
431
|
+
}], S = [{
|
|
312
432
|
name: "exposes one deployment-scoped Trigger Key catalog",
|
|
313
433
|
async verify(e) {
|
|
314
434
|
let t = await c(await u(e, "/v1/trigger-keys"), 200, "List Trigger Keys"), n = await c(await u(e, "/v1/trigger-keys/catalog"), 200, "List Trigger definitions"), r = o(t.keys, "Trigger Keys").map((e) => a(e, "Trigger Key")), d = o(n.definitions, "Trigger definitions").map((e) => a(e, "Trigger definition"));
|
|
@@ -344,20 +464,20 @@ var y = [
|
|
|
344
464
|
},
|
|
345
465
|
nodeId: "webhook",
|
|
346
466
|
target: { kind: "flow" }
|
|
347
|
-
}]), 200, "Create Trigger nodes"), "Trigger Revision"), l =
|
|
348
|
-
i(
|
|
349
|
-
for (let e of
|
|
350
|
-
let
|
|
467
|
+
}]), 200, "Create Trigger nodes"), "Trigger Revision"), l = (await _(e, await g(e, n, r, null, "trigger-publication"), 202, "Publish Trigger Flow")).publication, d = s(l.publicationId, "Trigger Publication"), m = `/v1/flows/${n}/triggers`, v = o((await c(await u(e, m), 200, "List Trigger bindings")).bindings, "Trigger bindings").map((e) => a(e, "Trigger binding"));
|
|
468
|
+
i(v.map((e) => e.triggerNodeId), ["cron", "webhook"], "Trigger binding order");
|
|
469
|
+
for (let e of v) i(e.currentPublicationId, d, "Trigger Publication");
|
|
470
|
+
let y = `${m}/webhook`, b = s(a((await c(await u(e, y), 200, "Read Webhook")).binding, "Webhook").endpointUrl, "Webhook endpoint"), x = (t) => u(e, `${y}/${t}`, {
|
|
351
471
|
body: JSON.stringify({ version: 1 }),
|
|
352
472
|
method: "POST"
|
|
353
473
|
});
|
|
354
|
-
i((await c(await
|
|
474
|
+
i((await c(await x("pause"), 200, "Pause Webhook")).operatorState, "paused", "Paused state"), i((await e.request(new Request(b, { method: "POST" }))).status, 404, "Paused callback"), i((await c(await x("resume"), 200, "Resume Webhook")).operatorState, "active", "Resumed state"), i((await e.request(new Request(b, { method: "POST" }))).status, 200, "Resumed callback"), await _(e, await g(e, n, h(await c(await p(e, n, r, [{
|
|
355
475
|
kind: "graph.node.delete",
|
|
356
476
|
nodeId: "webhook",
|
|
357
477
|
target: { kind: "flow" }
|
|
358
|
-
}]), 200, "Delete Webhook"), "Retired Trigger Revision"),
|
|
478
|
+
}]), 200, "Delete Webhook"), "Retired Trigger Revision"), d, "retire-trigger"), 202, "Publish retired Trigger"), i(a((await c(await u(e, y), 200, "Read retired Webhook")).binding, "Retired Webhook").currentPublicationId, void 0, "Retired Publication");
|
|
359
479
|
}
|
|
360
|
-
}],
|
|
480
|
+
}], C = [{
|
|
361
481
|
name: "projects the deployment Connector catalog and authorized Connections",
|
|
362
482
|
async verify(e) {
|
|
363
483
|
let t = o((await c(await u(e, "/v1/connector/providers"), 200, "List Connector Providers")).providers, "Connector Providers").map((e) => a(e, "Connector Provider")), n = o((await c(await u(e, "/v1/connector/actions"), 200, "List Connector Actions")).actions, "Connector Actions").map((e) => a(e, "Connector Action"));
|
|
@@ -379,4 +499,4 @@ var y = [
|
|
|
379
499
|
}
|
|
380
500
|
}];
|
|
381
501
|
//#endregion
|
|
382
|
-
export {
|
|
502
|
+
export { C as connectorControlApiConformanceCases, b as controlApiConformanceCases, x as publicationControlApiConformanceCases, S as triggerControlApiConformanceCases };
|
|
@@ -3,6 +3,7 @@ export declare const controlErrorCode: {
|
|
|
3
3
|
readonly authorizationDenied: 'authorization.denied';
|
|
4
4
|
readonly bindingUnresolved: 'binding.unresolved';
|
|
5
5
|
readonly connectorActionNotFound: 'connector.action-not-found';
|
|
6
|
+
readonly connectorUnconfigured: 'connector.unconfigured';
|
|
6
7
|
readonly connectorUnavailable: 'connector.unavailable';
|
|
7
8
|
readonly engineUnavailable: 'engine.unavailable';
|
|
8
9
|
readonly engineUnsupported: 'engine.unsupported';
|
|
@@ -17,6 +18,8 @@ export declare const controlErrorCode: {
|
|
|
17
18
|
readonly pageInvalidCursor: 'page.invalid-cursor';
|
|
18
19
|
readonly publicationConflict: 'publication.conflict';
|
|
19
20
|
readonly publicationNotFound: 'publication.not-found';
|
|
21
|
+
readonly publicationUnsupported: 'publication.unsupported';
|
|
22
|
+
readonly publishOperationNotFound: 'publication.operation-not-found';
|
|
20
23
|
readonly routeNotFound: 'route.not-found';
|
|
21
24
|
readonly runConflict: 'run.conflict';
|
|
22
25
|
readonly runEventsExpired: 'run.events-expired';
|
|
@@ -24,9 +27,13 @@ export declare const controlErrorCode: {
|
|
|
24
27
|
readonly runNotFound: 'run.not-found';
|
|
25
28
|
readonly runNotTerminal: 'run.not-terminal';
|
|
26
29
|
readonly runOverloaded: 'run.overloaded';
|
|
30
|
+
readonly runWaitNotFound: 'run.wait-not-found';
|
|
27
31
|
readonly triggerKeyInvalid: 'trigger-key.invalid';
|
|
28
32
|
readonly triggerKeyNotFound: 'trigger-key.not-found';
|
|
29
33
|
readonly triggerNotFound: 'trigger.not-found';
|
|
34
|
+
readonly variableInvalid: 'variable.invalid';
|
|
35
|
+
readonly variableLimitReached: 'variable.limit-reached';
|
|
36
|
+
readonly variableNotFound: 'variable.not-found';
|
|
30
37
|
};
|
|
31
38
|
export type ControlErrorCode = (typeof controlErrorCode)[keyof typeof controlErrorCode];
|
|
32
39
|
export declare const controlErrorMetadata: {
|
|
@@ -42,6 +49,9 @@ export declare const controlErrorMetadata: {
|
|
|
42
49
|
readonly "connector.action-not-found": {
|
|
43
50
|
readonly status: 404;
|
|
44
51
|
};
|
|
52
|
+
readonly "connector.unconfigured": {
|
|
53
|
+
readonly status: 503;
|
|
54
|
+
};
|
|
45
55
|
readonly "connector.unavailable": {
|
|
46
56
|
readonly status: 503;
|
|
47
57
|
};
|
|
@@ -84,6 +94,12 @@ export declare const controlErrorMetadata: {
|
|
|
84
94
|
readonly "publication.not-found": {
|
|
85
95
|
readonly status: 404;
|
|
86
96
|
};
|
|
97
|
+
readonly "publication.unsupported": {
|
|
98
|
+
readonly status: 409;
|
|
99
|
+
};
|
|
100
|
+
readonly "publication.operation-not-found": {
|
|
101
|
+
readonly status: 404;
|
|
102
|
+
};
|
|
87
103
|
readonly "route.not-found": {
|
|
88
104
|
readonly status: 404;
|
|
89
105
|
};
|
|
@@ -105,6 +121,9 @@ export declare const controlErrorMetadata: {
|
|
|
105
121
|
readonly "run.overloaded": {
|
|
106
122
|
readonly status: 429;
|
|
107
123
|
};
|
|
124
|
+
readonly "run.wait-not-found": {
|
|
125
|
+
readonly status: 404;
|
|
126
|
+
};
|
|
108
127
|
readonly "trigger-key.invalid": {
|
|
109
128
|
readonly status: 409;
|
|
110
129
|
};
|
|
@@ -114,4 +133,13 @@ export declare const controlErrorMetadata: {
|
|
|
114
133
|
readonly "trigger.not-found": {
|
|
115
134
|
readonly status: 404;
|
|
116
135
|
};
|
|
136
|
+
readonly "variable.invalid": {
|
|
137
|
+
readonly status: 400;
|
|
138
|
+
};
|
|
139
|
+
readonly "variable.limit-reached": {
|
|
140
|
+
readonly status: 409;
|
|
141
|
+
};
|
|
142
|
+
readonly "variable.not-found": {
|
|
143
|
+
readonly status: 404;
|
|
144
|
+
};
|
|
117
145
|
};
|