@wpkernel/pipeline 0.12.2-beta.0 → 0.12.3-beta.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/async-utils.d.ts +14 -0
- package/dist/async-utils.d.ts.map +1 -1
- package/dist/async-utils.js +18 -17
- package/dist/createExtension.d.ts +7 -1
- package/dist/createExtension.d.ts.map +1 -1
- package/dist/createExtension.js +0 -4
- package/dist/createPipeline.js +0 -4
- package/dist/dependency-graph.d.ts +6 -0
- package/dist/dependency-graph.d.ts.map +1 -1
- package/dist/dependency-graph.js +73 -69
- package/dist/error-factory.d.ts +1 -1
- package/dist/error-factory.js +0 -4
- package/dist/executor.js +0 -4
- package/dist/extensions/index.js +0 -4
- package/dist/extensions/official.js +0 -4
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +61 -66
- package/dist/helper.d.ts +27 -16
- package/dist/helper.d.ts.map +1 -1
- package/dist/helper.js +0 -4
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -25
- package/dist/internal/diagnostic-manager.js +0 -4
- package/dist/internal/extension-coordinator.js +0 -4
- package/dist/internal/helper-execution.js +0 -4
- package/dist/internal/pipeline-program-utils.d.ts +127 -0
- package/dist/internal/pipeline-program-utils.d.ts.map +1 -0
- package/dist/internal/pipeline-program-utils.js +161 -0
- package/dist/internal/pipeline-runner.d.ts +1 -1
- package/dist/internal/pipeline-runner.d.ts.map +1 -1
- package/dist/internal/pipeline-runner.js +329 -247
- package/dist/internal/pipeline-runner.types.d.ts +89 -1
- package/dist/internal/pipeline-runner.types.d.ts.map +1 -1
- package/dist/registration.js +0 -4
- package/dist/rollback.d.ts +94 -0
- package/dist/rollback.d.ts.map +1 -0
- package/dist/rollback.js +46 -0
- package/dist/types.d.ts +36 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/async-utils.d.ts
CHANGED
|
@@ -48,4 +48,18 @@ export declare function maybeTry<T>(run: () => MaybePromise<T>, onError: (error:
|
|
|
48
48
|
* @internal
|
|
49
49
|
*/
|
|
50
50
|
export declare function processSequentially<T>(items: readonly T[], handler: (item: T, index: number) => MaybePromise<void>, direction?: 'forward' | 'reverse'): MaybePromise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* A small abstraction representing a state transformer that may be async.
|
|
53
|
+
*
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
export type Program<S> = (state: S) => MaybePromise<S>;
|
|
57
|
+
/**
|
|
58
|
+
* Right-to-left composition for {@link Program} functions that short-circuits
|
|
59
|
+
* on promises while preserving synchronous execution when possible.
|
|
60
|
+
*
|
|
61
|
+
* @param {...any} fns
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
export declare const composeK: <S>(...fns: Program<S>[]) => Program<S>;
|
|
51
65
|
//# sourceMappingURL=async-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-utils.d.ts","sourceRoot":"","sources":["../src/async-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAS3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EACnC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,GAC9C,YAAY,CAAC,OAAO,CAAC,CAMvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACzB,GAAG,EAAE,MAAM,YAAY,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,GAC1C,YAAY,CAAC,CAAC,CAAC,CAYjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACpC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,EACvD,SAAS,GAAE,SAAS,GAAG,SAAqB,GAC1C,YAAY,CAAC,IAAI,CAAC,CAgCpB"}
|
|
1
|
+
{"version":3,"file":"async-utils.d.ts","sourceRoot":"","sources":["../src/async-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAS3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EACnC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,GAC9C,YAAY,CAAC,OAAO,CAAC,CAMvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACzB,GAAG,EAAE,MAAM,YAAY,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,GAC1C,YAAY,CAAC,CAAC,CAAC,CAYjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACpC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,EACvD,SAAS,GAAE,SAAS,GAAG,SAAqB,GAC1C,YAAY,CAAC,IAAI,CAAC,CAgCpB;AAED;;;;GAIG;AAEH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC;AACvD;;;;;;GAMG;AAEH,eAAO,MAAM,QAAQ,GACnB,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,KAAG,OAAO,CAAC,CAAC,CAKlC,CAAC"}
|
package/dist/async-utils.js
CHANGED
|
@@ -1,39 +1,40 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @wpkernel/pipeline
|
|
3
|
-
* @license EUPL-1.2
|
|
4
|
-
*/
|
|
5
1
|
function c(t) {
|
|
6
2
|
return (typeof t != "object" || t === null) && typeof t != "function" ? !1 : typeof t.then == "function";
|
|
7
3
|
}
|
|
8
|
-
function
|
|
4
|
+
function m(t, e) {
|
|
9
5
|
return c(t) ? Promise.resolve(t).then(e) : e(t);
|
|
10
6
|
}
|
|
11
|
-
function
|
|
7
|
+
function l(t, e) {
|
|
12
8
|
try {
|
|
13
9
|
const r = t();
|
|
14
|
-
return c(r) ? Promise.resolve(r).catch((
|
|
10
|
+
return c(r) ? Promise.resolve(r).catch((n) => e(n)) : r;
|
|
15
11
|
} catch (r) {
|
|
16
12
|
return e(r);
|
|
17
13
|
}
|
|
18
14
|
}
|
|
19
15
|
function p(t, e, r = "forward") {
|
|
20
|
-
const
|
|
21
|
-
if (
|
|
16
|
+
const n = t.length;
|
|
17
|
+
if (n === 0)
|
|
22
18
|
return;
|
|
23
|
-
const
|
|
24
|
-
for (let
|
|
25
|
-
const y = t[
|
|
19
|
+
const h = (o) => r === "forward" ? o < n : o >= 0, f = (o) => r === "forward" ? o + 1 : o - 1, u = (o) => {
|
|
20
|
+
for (let s = o; h(s); s = f(s)) {
|
|
21
|
+
const y = t[s], i = e(y, s);
|
|
26
22
|
if (c(i))
|
|
27
23
|
return Promise.resolve(i).then(
|
|
28
|
-
() => u(f(
|
|
24
|
+
() => u(f(s))
|
|
29
25
|
);
|
|
30
26
|
}
|
|
31
|
-
},
|
|
32
|
-
return u(
|
|
27
|
+
}, a = r === "forward" ? 0 : n - 1;
|
|
28
|
+
return u(a);
|
|
33
29
|
}
|
|
30
|
+
const w = (...t) => (e) => t.reduceRight(
|
|
31
|
+
(r, n) => m(r, n),
|
|
32
|
+
e
|
|
33
|
+
);
|
|
34
34
|
export {
|
|
35
|
+
w as composeK,
|
|
35
36
|
c as isPromiseLike,
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
m as maybeThen,
|
|
38
|
+
l as maybeTry,
|
|
38
39
|
p as processSequentially
|
|
39
40
|
};
|
|
@@ -2,7 +2,13 @@ import { MaybePromise, PipelineExtension, PipelineExtensionHook, PipelineExtensi
|
|
|
2
2
|
interface CreatePipelineExtensionBaseOptions {
|
|
3
3
|
readonly key?: string;
|
|
4
4
|
}
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Options for creating a pipeline extension using the dynamic register pattern.
|
|
7
|
+
*
|
|
8
|
+
* @category Pipeline
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface CreatePipelineExtensionWithRegister<TPipeline, TContext, TOptions, TArtifact> extends CreatePipelineExtensionBaseOptions {
|
|
6
12
|
readonly register: (pipeline: TPipeline) => MaybePromise<void | PipelineExtensionHook<TContext, TOptions, TArtifact> | PipelineExtensionHookRegistration<TContext, TOptions, TArtifact>>;
|
|
7
13
|
}
|
|
8
14
|
interface CreatePipelineExtensionWithSetup<TPipeline, TContext, TOptions, TArtifact> extends CreatePipelineExtensionBaseOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createExtension.d.ts","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,iCAAiC,EACjC,0BAA0B,EAC1B,MAAM,YAAY,CAAC;AAEpB,UAAU,kCAAkC;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,
|
|
1
|
+
{"version":3,"file":"createExtension.d.ts","sourceRoot":"","sources":["../src/createExtension.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,iCAAiC,EACjC,0BAA0B,EAC1B,MAAM,YAAY,CAAC;AAEpB,UAAU,kCAAkC;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,mCAAmC,CACnD,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,CACR,SAAQ,kCAAkC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAClB,QAAQ,EAAE,SAAS,KACf,YAAY,CACd,IAAI,GACJ,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,GACpD,iCAAiC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAClE,CAAC;CACF;AAED,UAAU,gCAAgC,CACzC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,CACR,SAAQ,kCAAkC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAC7D,QAAQ,CAAC,IAAI,CAAC,EACX,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,GACpD,iCAAiC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,0BAA0B,CAAC;CAChD;AAED,MAAM,MAAM,8BAA8B,CACzC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,IAEP,mCAAmC,CACnC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,CACR,GACD,gCAAgC,CAChC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,CACR,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoJG;AACH,wBAAgB,uBAAuB,CACtC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EAET,OAAO,EAAE,8BAA8B,CACtC,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,CACT,GACC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAoD7D"}
|
package/dist/createExtension.js
CHANGED
package/dist/createPipeline.js
CHANGED
|
@@ -2,10 +2,6 @@ import { maybeThen as E, isPromiseLike as h } from "./async-utils.js";
|
|
|
2
2
|
import { registerHelper as v, handleExtensionRegisterResult as w } from "./registration.js";
|
|
3
3
|
import { initDiagnosticManager as V } from "./internal/diagnostic-manager.js";
|
|
4
4
|
import { initPipelineRunner as $ } from "./internal/pipeline-runner.js";
|
|
5
|
-
/**
|
|
6
|
-
* @wpkernel/pipeline
|
|
7
|
-
* @license EUPL-1.2
|
|
8
|
-
*/
|
|
9
5
|
function L(r) {
|
|
10
6
|
const i = r.fragmentKind ?? "fragment", s = r.builderKind ?? "builder", a = r.createError ?? ((e, n) => new Error(`[${e}] ${n}`)), l = [], d = [], f = [], o = [], u = V({
|
|
11
7
|
options: r,
|
|
@@ -28,6 +28,12 @@ export interface CreateDependencyGraphOptions<THelper> {
|
|
|
28
28
|
readonly onUnresolvedHelpers?: (options: {
|
|
29
29
|
readonly unresolved: RegisteredHelper<THelper>[];
|
|
30
30
|
}) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Optional set of helper keys that are considered “already satisfied”.
|
|
33
|
+
* Useful when a pipeline run intentionally omits certain helpers (e.g. IR
|
|
34
|
+
* fragments) but builders still declare them as dependencies.
|
|
35
|
+
*/
|
|
36
|
+
readonly providedKeys?: readonly string[];
|
|
31
37
|
}
|
|
32
38
|
/**
|
|
33
39
|
* Creates a unique identifier for a registered helper.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../src/dependency-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE5D;;;;GAIG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAaD;;;;GAIG;AACH,MAAM,WAAW,sBAAsB,CAAC,OAAO;IAC9C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,4BAA4B,CAAC,OAAO;IACpD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAC9B,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,KAClC,IAAI,CAAC;IACV,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE;QACxC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;KACjD,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../src/dependency-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE5D;;;;GAIG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAaD;;;;GAIG;AACH,MAAM,WAAW,sBAAsB,CAAC,OAAO;IAC9C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,4BAA4B,CAAC,OAAO;IACpD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAC9B,KAAK,EAAE,sBAAsB,CAAC,OAAO,CAAC,KAClC,IAAI,CAAC;IACV,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE;QACxC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;KACjD,KAAK,IAAI,CAAC;IACX;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC7B,MAAM,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACzC,KAAK,EAAE,MAAM,GACX,MAAM,CAER;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,gBAAgB,EAC9D,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAC5B,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAC1B,MAAM,CAUR;AAoPD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,SAAS,gBAAgB,EACrE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,EACpC,OAAO,EAAE,4BAA4B,CAAC,OAAO,CAAC,GAAG,SAAS,EAC1D,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,KAAK,GACnD;IACF,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACpC,CAgBA"}
|
package/dist/dependency-graph.js
CHANGED
|
@@ -1,105 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
* @wpkernel/pipeline
|
|
3
|
-
* @license EUPL-1.2
|
|
4
|
-
*/
|
|
5
|
-
function k(n, e) {
|
|
1
|
+
function M(n, e) {
|
|
6
2
|
return `${n.kind}:${n.key}#${e}`;
|
|
7
3
|
}
|
|
8
|
-
function
|
|
4
|
+
function u(n, e) {
|
|
9
5
|
return n.helper.priority !== e.helper.priority ? e.helper.priority - n.helper.priority : n.helper.key !== e.helper.key ? n.helper.key.localeCompare(e.helper.key) : n.index - e.index;
|
|
10
6
|
}
|
|
11
7
|
function y(n) {
|
|
12
|
-
const e = /* @__PURE__ */ new Map(),
|
|
13
|
-
for (const
|
|
14
|
-
e.set(
|
|
15
|
-
return { adjacency: e, indegree:
|
|
8
|
+
const e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
9
|
+
for (const o of n)
|
|
10
|
+
e.set(o.id, /* @__PURE__ */ new Set()), t.set(o.id, 0), r.set(o.id, o);
|
|
11
|
+
return { adjacency: e, indegree: t, entryById: r };
|
|
16
12
|
}
|
|
17
13
|
function a(n, e) {
|
|
18
|
-
const
|
|
14
|
+
const t = [];
|
|
19
15
|
for (const r of n)
|
|
20
|
-
for (const
|
|
16
|
+
for (const o of r.helper.dependsOn)
|
|
21
17
|
h(
|
|
22
18
|
n,
|
|
23
19
|
e,
|
|
24
|
-
|
|
20
|
+
o,
|
|
25
21
|
r.id
|
|
26
|
-
) ||
|
|
22
|
+
) || t.push({
|
|
27
23
|
dependant: r,
|
|
28
|
-
dependencyKey:
|
|
24
|
+
dependencyKey: o
|
|
29
25
|
});
|
|
30
|
-
return
|
|
26
|
+
return t;
|
|
31
27
|
}
|
|
32
|
-
function h(n, e,
|
|
33
|
-
const
|
|
34
|
-
({ helper:
|
|
28
|
+
function h(n, e, t, r) {
|
|
29
|
+
const o = n.filter(
|
|
30
|
+
({ helper: s }) => s.key === t
|
|
35
31
|
);
|
|
36
|
-
if (
|
|
32
|
+
if (o.length === 0)
|
|
37
33
|
return !1;
|
|
38
|
-
for (const
|
|
39
|
-
const
|
|
40
|
-
if (!
|
|
34
|
+
for (const s of o) {
|
|
35
|
+
const c = e.adjacency.get(s.id);
|
|
36
|
+
if (!c)
|
|
41
37
|
continue;
|
|
42
|
-
|
|
38
|
+
c.add(r);
|
|
43
39
|
const i = e.indegree.get(r) ?? 0;
|
|
44
40
|
e.indegree.set(r, i + 1);
|
|
45
41
|
}
|
|
46
42
|
return !0;
|
|
47
43
|
}
|
|
48
44
|
function g(n, e) {
|
|
49
|
-
const
|
|
45
|
+
const t = n.filter(
|
|
50
46
|
(i) => (e.indegree.get(i.id) ?? 0) === 0
|
|
51
47
|
);
|
|
52
|
-
|
|
53
|
-
const r = [],
|
|
54
|
-
for (;
|
|
55
|
-
const i =
|
|
48
|
+
t.sort(u);
|
|
49
|
+
const r = [], o = new Map(e.indegree), s = /* @__PURE__ */ new Set();
|
|
50
|
+
for (; t.length > 0; ) {
|
|
51
|
+
const i = t.shift();
|
|
56
52
|
if (!i)
|
|
57
53
|
break;
|
|
58
|
-
r.push(i),
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
61
|
-
for (const
|
|
62
|
-
const
|
|
63
|
-
if (
|
|
54
|
+
r.push(i), s.add(i.id);
|
|
55
|
+
const p = e.adjacency.get(i.id);
|
|
56
|
+
if (p)
|
|
57
|
+
for (const d of p) {
|
|
58
|
+
const l = (o.get(d) ?? 0) - 1;
|
|
59
|
+
if (o.set(d, l), l !== 0)
|
|
64
60
|
continue;
|
|
65
|
-
const
|
|
66
|
-
|
|
61
|
+
const f = e.entryById.get(d);
|
|
62
|
+
f && (t.push(f), t.sort(u));
|
|
67
63
|
}
|
|
68
64
|
}
|
|
69
|
-
const
|
|
70
|
-
return { ordered: r, unresolved:
|
|
65
|
+
const c = n.filter((i) => !s.has(i.id));
|
|
66
|
+
return { ordered: r, unresolved: c };
|
|
71
67
|
}
|
|
72
|
-
function
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const u = Array.from(i.entries()).map(
|
|
83
|
-
([s, p]) => `"${s}" → [${p.map((l) => `"${l}"`).join(", ")}]`
|
|
84
|
-
).join(", ");
|
|
85
|
-
throw o(
|
|
86
|
-
"ValidationError",
|
|
87
|
-
`Helpers depend on unknown helpers: ${u}.`
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
const { ordered: c, unresolved: d } = g(n, r);
|
|
91
|
-
if (d.length > 0) {
|
|
92
|
-
e?.onUnresolvedHelpers?.({ unresolved: d });
|
|
93
|
-
const i = d.map((u) => u.helper.key);
|
|
94
|
-
throw o(
|
|
95
|
-
"ValidationError",
|
|
96
|
-
`Detected unresolved pipeline helpers: ${i.join(", ")}.`
|
|
97
|
-
);
|
|
68
|
+
function k(n, e, t) {
|
|
69
|
+
if (n.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
if (e?.onMissingDependency)
|
|
72
|
+
for (const s of n)
|
|
73
|
+
e.onMissingDependency(s);
|
|
74
|
+
const r = /* @__PURE__ */ new Map();
|
|
75
|
+
for (const s of n) {
|
|
76
|
+
const c = s.dependant.helper.key, i = r.get(c) ?? [];
|
|
77
|
+
i.push(s.dependencyKey), r.set(c, i);
|
|
98
78
|
}
|
|
99
|
-
|
|
79
|
+
const o = Array.from(r.entries()).map(
|
|
80
|
+
([s, c]) => `"${s}" → [${c.map((i) => `"${i}"`).join(", ")}]`
|
|
81
|
+
).join(", ");
|
|
82
|
+
throw t(
|
|
83
|
+
"ValidationError",
|
|
84
|
+
`Helpers depend on unknown helpers: ${o}.`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
function w(n, e, t) {
|
|
88
|
+
if (n.length === 0)
|
|
89
|
+
return;
|
|
90
|
+
e?.onUnresolvedHelpers && e.onUnresolvedHelpers({ unresolved: n });
|
|
91
|
+
const r = n.map((o) => o.helper.key);
|
|
92
|
+
throw t(
|
|
93
|
+
"ValidationError",
|
|
94
|
+
`Detected unresolved pipeline helpers: ${r.join(", ")}.`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
function j(n, e, t) {
|
|
98
|
+
const r = y(n), o = a(n, r), s = new Set(e?.providedKeys ?? []), c = o.filter(
|
|
99
|
+
(d) => !s.has(d.dependencyKey)
|
|
100
|
+
);
|
|
101
|
+
k(c, e, t);
|
|
102
|
+
const { ordered: i, unresolved: p } = g(n, r);
|
|
103
|
+
return w(p, e, t), { order: i, adjacency: r.adjacency };
|
|
100
104
|
}
|
|
101
105
|
export {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
106
|
+
u as compareHelpers,
|
|
107
|
+
j as createDependencyGraph,
|
|
108
|
+
M as createHelperId
|
|
105
109
|
};
|
package/dist/error-factory.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export declare function createDefaultError(code: string, message: string): Error
|
|
|
24
24
|
/**
|
|
25
25
|
* Creates an error factory that wraps a custom error class.
|
|
26
26
|
*
|
|
27
|
-
* @param
|
|
27
|
+
* @param create - A function that creates an Error instance based on a code and message.
|
|
28
28
|
* @param create
|
|
29
29
|
* @returns An error factory function
|
|
30
30
|
*
|
package/dist/error-factory.js
CHANGED
package/dist/executor.js
CHANGED
package/dist/extensions/index.js
CHANGED
package/dist/extensions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,sCAAsC,EACtC,0BAA0B,EAC1B,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EACZ,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,sCAAsC,EACtC,0BAA0B,EAC1B,MAAM,SAAS,CAAC;AASjB;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;CACpE;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS;IACpE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC,SAAS,CAAC,CAAC;CACxD;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAC1C,KAAK,EAAE,OAAO,GACZ,sCAAsC,CAoBxC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAC9D,KAAK,EAAE,SAAS,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EACnE,SAAS,EAAE,0BAA0B,EACrC,OAAO,EAAE,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EACpE,eAAe,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAChD,YAAY,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;CACjE,CAAC,CA8DD;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EACnE,OAAO,EAAE,SAAS,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,GACvE,YAAY,CAAC,IAAI,CAAC,CAcpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EACrE,OAAO,EAAE,SAAS,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EACzE,KAAK,EAAE,SAAS,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EACnE,eAAe,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAChD,YAAY,CAAC,IAAI,CAAC,CA0BpB;AAED,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EACX,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,GACzB,MAAM,0BAA0B,CAAC"}
|
package/dist/extensions.js
CHANGED
|
@@ -1,93 +1,88 @@
|
|
|
1
|
-
import { processSequentially as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
function x(t) {
|
|
7
|
-
if (t instanceof Error) {
|
|
8
|
-
const { name: n, message: o, stack: e } = t, r = t.cause;
|
|
1
|
+
import { processSequentially as f, isPromiseLike as k, maybeTry as p, maybeThen as l } from "./async-utils.js";
|
|
2
|
+
import { runRollbackStack as b } from "./rollback.js";
|
|
3
|
+
function E(o) {
|
|
4
|
+
if (o instanceof Error) {
|
|
5
|
+
const { name: r, message: e, stack: s } = o, n = o.cause;
|
|
9
6
|
return {
|
|
10
|
-
name:
|
|
11
|
-
message:
|
|
12
|
-
stack:
|
|
13
|
-
cause:
|
|
7
|
+
name: r,
|
|
8
|
+
message: e,
|
|
9
|
+
stack: s,
|
|
10
|
+
cause: n
|
|
14
11
|
};
|
|
15
12
|
}
|
|
16
|
-
return typeof
|
|
17
|
-
message:
|
|
13
|
+
return typeof o == "string" ? {
|
|
14
|
+
message: o
|
|
18
15
|
} : {};
|
|
19
16
|
}
|
|
20
|
-
function
|
|
21
|
-
let
|
|
22
|
-
const
|
|
23
|
-
(i) => i.lifecycle ===
|
|
24
|
-
),
|
|
25
|
-
context:
|
|
26
|
-
options:
|
|
27
|
-
lifecycle:
|
|
28
|
-
},
|
|
29
|
-
() =>
|
|
30
|
-
const
|
|
31
|
-
...
|
|
32
|
-
artifact:
|
|
17
|
+
function R(o, r, e, s) {
|
|
18
|
+
let n = e.artifact;
|
|
19
|
+
const c = [], t = o.filter(
|
|
20
|
+
(i) => i.lifecycle === r
|
|
21
|
+
), m = {
|
|
22
|
+
context: e.context,
|
|
23
|
+
options: e.options,
|
|
24
|
+
lifecycle: r
|
|
25
|
+
}, h = p(
|
|
26
|
+
() => f(t, (i) => {
|
|
27
|
+
const u = i.hook({
|
|
28
|
+
...m,
|
|
29
|
+
artifact: n
|
|
33
30
|
});
|
|
34
|
-
if (k(
|
|
35
|
-
return Promise.resolve(
|
|
36
|
-
a && (a.artifact !== void 0 && (
|
|
31
|
+
if (k(u))
|
|
32
|
+
return Promise.resolve(u).then((a) => {
|
|
33
|
+
a && (a.artifact !== void 0 && (n = a.artifact), c.push({
|
|
37
34
|
hook: i,
|
|
38
35
|
result: a
|
|
39
36
|
}));
|
|
40
37
|
});
|
|
41
|
-
if (
|
|
42
|
-
return
|
|
38
|
+
if (u)
|
|
39
|
+
return u.artifact !== void 0 && (n = u.artifact), void c.push({
|
|
43
40
|
hook: i,
|
|
44
|
-
result:
|
|
41
|
+
result: u
|
|
45
42
|
});
|
|
46
43
|
}),
|
|
47
|
-
(i) =>
|
|
48
|
-
d(
|
|
44
|
+
(i) => l(
|
|
45
|
+
d(c, t, s),
|
|
49
46
|
() => {
|
|
50
47
|
throw i;
|
|
51
48
|
}
|
|
52
49
|
)
|
|
53
50
|
);
|
|
54
|
-
return
|
|
51
|
+
return l(h, () => ({ artifact: n, results: c }));
|
|
55
52
|
}
|
|
56
|
-
function
|
|
57
|
-
return
|
|
58
|
-
const
|
|
59
|
-
if (!
|
|
53
|
+
function g(o) {
|
|
54
|
+
return f(o, (r) => {
|
|
55
|
+
const e = r.result.commit;
|
|
56
|
+
if (!e)
|
|
60
57
|
return;
|
|
61
|
-
const
|
|
62
|
-
if (k(
|
|
63
|
-
return
|
|
58
|
+
const s = e();
|
|
59
|
+
if (k(s))
|
|
60
|
+
return s.then(() => {
|
|
64
61
|
});
|
|
65
62
|
});
|
|
66
63
|
}
|
|
67
|
-
function d(
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
"forward"
|
|
86
|
-
);
|
|
64
|
+
function d(o, r, e) {
|
|
65
|
+
const s = r.map((t) => t.key), n = s, c = o.map((t) => ({
|
|
66
|
+
result: t.result,
|
|
67
|
+
hook: t.hook
|
|
68
|
+
})).filter((t) => t.result.rollback).map((t) => ({
|
|
69
|
+
key: t.hook.key,
|
|
70
|
+
run: t.result.rollback
|
|
71
|
+
}));
|
|
72
|
+
return b(c, {
|
|
73
|
+
source: "extension",
|
|
74
|
+
onError: ({ error: t }) => {
|
|
75
|
+
e({
|
|
76
|
+
error: t,
|
|
77
|
+
extensionKeys: s,
|
|
78
|
+
hookSequence: n
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
87
82
|
}
|
|
88
83
|
export {
|
|
89
|
-
|
|
90
|
-
|
|
84
|
+
g as commitExtensionResults,
|
|
85
|
+
E as createRollbackErrorMetadata,
|
|
91
86
|
d as rollbackExtensionResults,
|
|
92
|
-
|
|
87
|
+
R as runExtensionHooks
|
|
93
88
|
};
|
package/dist/helper.d.ts
CHANGED
|
@@ -32,6 +32,14 @@ import { CreateHelperOptions, Helper, HelperKind, PipelineReporter } from './typ
|
|
|
32
32
|
* - Validates dependency chains and reports missing/circular dependencies
|
|
33
33
|
* - Ensures helpers run in correct order regardless of registration sequence
|
|
34
34
|
*
|
|
35
|
+
* ### Apply results & rollback
|
|
36
|
+
* Helpers typically perform their work by mutating the provided `fragment` or `output` in place and optionally calling `next()` to continue the chain.
|
|
37
|
+
* For more advanced scenarios, a helper can **also return** a result object:
|
|
38
|
+
* - `output` — an updated output value to feed into subsequent helpers
|
|
39
|
+
* - `rollback` — a rollback operation created via `createPipelineRollback`, which will be executed if the pipeline fails after this helper completes
|
|
40
|
+
*
|
|
41
|
+
* Returning a result object is opt-in; existing helpers that return `void` remain valid and continue to behave as before.
|
|
42
|
+
*
|
|
35
43
|
* ## Architecture
|
|
36
44
|
*
|
|
37
45
|
* Helpers form directed acyclic graphs (DAGs) where each node represents a transformation
|
|
@@ -41,7 +49,7 @@ import { CreateHelperOptions, Helper, HelperKind, PipelineReporter } from './typ
|
|
|
41
49
|
* This design enables:
|
|
42
50
|
* - **Composability**: Combine helpers from different packages without conflicts
|
|
43
51
|
* - **Extensibility**: Third-party helpers integrate seamlessly via dependency declarations
|
|
44
|
-
* - **Reliability**:
|
|
52
|
+
* - **Reliability**: Helper-level rollback (via `createPipelineRollback`) ensures atomic behaviour across helper chains
|
|
45
53
|
* - **Observability**: Built-in diagnostics and reporter integration for debugging
|
|
46
54
|
*
|
|
47
55
|
* @param options
|
|
@@ -84,46 +92,49 @@ import { CreateHelperOptions, Helper, HelperKind, PipelineReporter } from './typ
|
|
|
84
92
|
* });
|
|
85
93
|
* ```
|
|
86
94
|
*
|
|
87
|
-
* @example Builder helper with rollback
|
|
95
|
+
* @example Builder helper with rollback result
|
|
88
96
|
* ```typescript
|
|
89
|
-
* import {
|
|
97
|
+
* import { createHelper, createPipelineRollback } from '@wpkernel/pipeline';
|
|
90
98
|
*
|
|
91
99
|
* const writeFileHelper = createHelper({
|
|
92
100
|
* key: 'write-file',
|
|
93
101
|
* kind: 'builder',
|
|
94
|
-
* apply: ({
|
|
102
|
+
* apply: ({ output, context }) => {
|
|
95
103
|
* const path = context.outputPath;
|
|
96
|
-
* const
|
|
104
|
+
* const before = [...output]; // Capture current in-memory state
|
|
97
105
|
*
|
|
98
|
-
*
|
|
106
|
+
* output.push(context.fileContent);
|
|
99
107
|
*
|
|
100
108
|
* return {
|
|
101
|
-
* commit: createPipelineCommit(
|
|
102
|
-
* () => context.reporter.info(`Wrote ${path}`)
|
|
103
|
-
* ),
|
|
104
109
|
* rollback: createPipelineRollback(
|
|
105
|
-
* () =>
|
|
106
|
-
*
|
|
110
|
+
* () => {
|
|
111
|
+
* output.length = 0;
|
|
112
|
+
* output.push(...before);
|
|
113
|
+
* },
|
|
114
|
+
* {
|
|
115
|
+
* key: 'write-file',
|
|
116
|
+
* label: 'Restore file output state',
|
|
117
|
+
* }
|
|
107
118
|
* ),
|
|
108
119
|
* };
|
|
109
120
|
* },
|
|
110
121
|
* });
|
|
111
122
|
* ```
|
|
112
123
|
*
|
|
113
|
-
* @example Async helper with error handling
|
|
124
|
+
* @example Async helper with transformed output and error handling
|
|
114
125
|
* ```typescript
|
|
115
126
|
* const formatCodeHelper = createHelper({
|
|
116
127
|
* key: 'format-code',
|
|
117
128
|
* kind: 'builder',
|
|
118
129
|
* dependsOn: ['write-file'],
|
|
119
|
-
* apply: async ({
|
|
130
|
+
* apply: async ({ output, context }) => {
|
|
120
131
|
* try {
|
|
121
|
-
* const formatted = await prettier.format(
|
|
132
|
+
* const formatted = await prettier.format(output.join(''), {
|
|
122
133
|
* parser: 'php',
|
|
123
134
|
* });
|
|
124
|
-
* return {
|
|
135
|
+
* return { output: formatted.split('') }; // Optionally return a new output value
|
|
125
136
|
* } catch (error) {
|
|
126
|
-
* context.reporter.
|
|
137
|
+
* context.reporter.warn?.('Formatting failed', { error });
|
|
127
138
|
* throw error;
|
|
128
139
|
* }
|
|
129
140
|
* },
|
package/dist/helper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,mBAAmB,EACnB,MAAM,EACN,UAAU,EAEV,gBAAgB,EAChB,MAAM,SAAS,CAAC;AAEjB
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,mBAAmB,EACnB,MAAM,EACN,UAAU,EAEV,gBAAgB,EAChB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6IG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EACR,MAAM,EACN,OAAO,EACP,SAAS,SAAS,gBAAgB,GAAG,gBAAgB,EACrD,KAAK,SAAS,UAAU,GAAG,UAAU,EAErC,OAAO,EAAE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,GACvE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CA8BrD"}
|