@certd/pipeline 1.21.1 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/{d/access → access}/api.d.ts +2 -2
- package/dist/access/api.js +2 -0
- package/dist/{d/access → access}/decorator.d.ts +1 -1
- package/dist/access/decorator.js +34 -0
- package/dist/access/index.d.ts +3 -0
- package/dist/access/index.js +4 -0
- package/dist/{d/access → access}/registry.d.ts +1 -1
- package/dist/access/registry.js +4 -0
- package/dist/{d/context → context}/index.d.ts +1 -1
- package/dist/context/index.js +2 -0
- package/dist/{d/core → core}/context.d.ts +1 -1
- package/dist/core/context.js +66 -0
- package/dist/{d/core → core}/executor.d.ts +8 -8
- package/dist/core/executor.js +273 -0
- package/dist/{d/core → core}/file-store.d.ts +6 -1
- package/dist/core/file-store.js +41 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.js +6 -0
- package/dist/{d/core → core}/run-history.d.ts +1 -1
- package/dist/core/run-history.js +143 -0
- package/dist/core/storage.js +120 -0
- package/dist/d.ts/fast-crud.js +2 -0
- package/dist/d.ts/index.js +3 -0
- package/dist/d.ts/pipeline.d.ts +123 -0
- package/dist/d.ts/pipeline.js +31 -0
- package/dist/decorator/common.js +12 -0
- package/dist/decorator/index.d.ts +2 -0
- package/dist/decorator/index.js +3 -0
- package/dist/decorator/utils.js +43 -0
- package/dist/dt/fast-crud.d.ts +107 -0
- package/dist/dt/fast-crud.js +2 -0
- package/dist/dt/index.d.ts +2 -0
- package/dist/dt/index.js +3 -0
- package/dist/dt/pipeline.js +31 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +11 -0
- package/dist/{d/plugin → plugin}/api.d.ts +7 -6
- package/dist/plugin/api.js +54 -0
- package/dist/{d/plugin → plugin}/decorator.d.ts +1 -1
- package/dist/plugin/decorator.js +74 -0
- package/dist/plugin/index.d.ts +3 -0
- package/dist/plugin/index.js +4 -0
- package/dist/plugin/registry.d.ts +3 -0
- package/dist/plugin/registry.js +3 -0
- package/dist/{d/plugin → plugin}/test/echo-plugin.d.ts +1 -1
- package/dist/plugin/test/echo-plugin.js +37 -0
- package/dist/registry/index.d.ts +1 -0
- package/dist/registry/index.js +2 -0
- package/dist/registry/registry.js +46 -0
- package/dist/service/email.js +2 -0
- package/dist/service/index.d.ts +1 -0
- package/dist/service/index.js +2 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/util.file.js +15 -0
- package/dist/utils/util.log.js +32 -0
- package/dist/utils/util.promise.d.ts +2 -0
- package/dist/utils/util.promise.js +26 -0
- package/dist/utils/util.request.js +56 -0
- package/dist/utils/util.shell.d.ts +23 -0
- package/dist/utils/util.shell.js +136 -0
- package/dist/utils/util.sleep.js +8 -0
- package/dist/utils/util.sp.d.ts +22 -0
- package/dist/utils/util.sp.js +91 -0
- package/fix-esm-import-paths.js +96 -0
- package/package.json +15 -12
- package/tsconfig.json +32 -14
- package/tsconfig.tsbuildinfo +1 -0
- package/dist/bundle.js +0 -23
- package/dist/d/access/index.d.ts +0 -3
- package/dist/d/core/index.d.ts +0 -5
- package/dist/d/decorator/index.d.ts +0 -2
- package/dist/d/index.d.ts +0 -11
- package/dist/d/plugin/index.d.ts +0 -3
- package/dist/d/plugin/registry.d.ts +0 -3
- package/dist/d/registry/index.d.ts +0 -1
- package/dist/d/service/index.d.ts +0 -1
- package/dist/d/utils/index.d.ts +0 -7
- package/dist/d/utils/util.promise.d.ts +0 -1
- package/rollup.config.js +0 -43
- package/vite.config.js +0 -59
- /package/dist/{d/core → core}/storage.d.ts +0 -0
- /package/dist/{d/d.ts → d.ts}/fast-crud.d.ts +0 -0
- /package/dist/{d/d.ts → d.ts}/index.d.ts +0 -0
- /package/dist/{d/decorator → decorator}/common.d.ts +0 -0
- /package/dist/{d/decorator → decorator}/utils.d.ts +0 -0
- /package/dist/{d/d.ts → dt}/pipeline.d.ts +0 -0
- /package/dist/{d/registry → registry}/registry.d.ts +0 -0
- /package/dist/{d/service → service}/email.d.ts +0 -0
- /package/dist/{d/utils → utils}/util.file.d.ts +0 -0
- /package/dist/{d/utils → utils}/util.log.d.ts +0 -0
- /package/dist/{d/utils → utils}/util.request.d.ts +0 -0
- /package/dist/{d/utils → utils}/util.sleep.d.ts +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* 升级midway,支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))
|
|
11
|
+
* 支持lego,海量DNS提供商 ([0bc6d0a](https://github.com/certd/certd/commit/0bc6d0a211920fb0084d705e1db67ee1e7262c44))
|
|
12
|
+
* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))
|
|
13
|
+
|
|
14
|
+
## [1.21.2](https://github.com/certd/certd/compare/v1.21.1...v1.21.2) (2024-07-08)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @certd/pipeline
|
|
17
|
+
|
|
6
18
|
## [1.21.1](https://github.com/certd/certd/compare/v1.21.0...v1.21.1) (2024-07-08)
|
|
7
19
|
|
|
8
20
|
**Note:** Version bump only for package @certd/pipeline
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Registrable } from "../registry";
|
|
2
|
-
import { FormItemProps } from "../
|
|
1
|
+
import { Registrable } from "../registry/index.js";
|
|
2
|
+
import { FormItemProps } from "../dt/index.js";
|
|
3
3
|
export type AccessInputDefine = FormItemProps & {
|
|
4
4
|
title: string;
|
|
5
5
|
required?: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AccessDefine, AccessInputDefine } from "./api";
|
|
1
|
+
import { AccessDefine, AccessInputDefine } from "./api.js";
|
|
2
2
|
export declare const ACCESS_CLASS_KEY = "pipeline:access";
|
|
3
3
|
export declare const ACCESS_INPUT_KEY = "pipeline:access:input";
|
|
4
4
|
export declare function IsAccess(define: AccessDefine): ClassDecorator;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Decorator } from "../decorator/index.js";
|
|
2
|
+
import _ from "lodash-es";
|
|
3
|
+
import { accessRegistry } from "./registry.js";
|
|
4
|
+
// 提供一个唯一 key
|
|
5
|
+
export const ACCESS_CLASS_KEY = "pipeline:access";
|
|
6
|
+
export const ACCESS_INPUT_KEY = "pipeline:access:input";
|
|
7
|
+
export function IsAccess(define) {
|
|
8
|
+
return (target) => {
|
|
9
|
+
target = Decorator.target(target);
|
|
10
|
+
const inputs = {};
|
|
11
|
+
const properties = Decorator.getClassProperties(target);
|
|
12
|
+
for (const property in properties) {
|
|
13
|
+
const input = Reflect.getMetadata(ACCESS_INPUT_KEY, target, property);
|
|
14
|
+
if (input) {
|
|
15
|
+
inputs[property] = input;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
_.merge(define, { input: inputs });
|
|
19
|
+
Reflect.defineMetadata(ACCESS_CLASS_KEY, define, target);
|
|
20
|
+
target.define = define;
|
|
21
|
+
accessRegistry.register(define.name, {
|
|
22
|
+
define,
|
|
23
|
+
target,
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function AccessInput(input) {
|
|
28
|
+
return (target, propertyKey) => {
|
|
29
|
+
target = Decorator.target(target, propertyKey);
|
|
30
|
+
// const _type = Reflect.getMetadata("design:type", target, propertyKey);
|
|
31
|
+
Reflect.defineMetadata(ACCESS_INPUT_KEY, input, target, propertyKey);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjY2Vzcy9kZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sQ0FBQyxNQUFNLFdBQVcsQ0FBQztBQUMxQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLGFBQWE7QUFDYixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQztBQUV4RCxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQW9CO0lBQzNDLE9BQU8sQ0FBQyxNQUFXLEVBQUUsRUFBRTtRQUNyQixNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQyxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELEtBQUssTUFBTSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0QsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNuQyxPQUFPLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN2QixjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDbkMsTUFBTTtZQUNOLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUF5QjtJQUNuRCxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFO1FBQzdCLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMvQyx5RUFBeUU7UUFDekUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from "./api.js";
|
|
2
|
+
export * from "./registry.js";
|
|
3
|
+
export * from "./decorator.js";
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWNjZXNzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZ0JBQWdCLENBQUMifQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Registry } from "../registry";
|
|
1
|
+
import { Registry } from "../registry/index.js";
|
|
2
2
|
export declare const accessRegistry: Registry<unknown>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Registry } from "../registry/index.js";
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
export const accessRegistry = new Registry("access");
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWNjZXNzL3JlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxhQUFhO0FBQ2IsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { MemoryStorage } from "./storage.js";
|
|
2
|
+
const CONTEXT_VERSION_KEY = "contextVersion";
|
|
3
|
+
export class ContextFactory {
|
|
4
|
+
storage;
|
|
5
|
+
memoryStorage;
|
|
6
|
+
constructor(storage) {
|
|
7
|
+
this.storage = storage;
|
|
8
|
+
this.memoryStorage = new MemoryStorage();
|
|
9
|
+
}
|
|
10
|
+
getContext(scope, namespace) {
|
|
11
|
+
return new StorageContext(scope, namespace, this.storage);
|
|
12
|
+
}
|
|
13
|
+
getMemoryContext(scope, namespace) {
|
|
14
|
+
return new StorageContext(scope, namespace, this.memoryStorage);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class StorageContext {
|
|
18
|
+
storage;
|
|
19
|
+
namespace;
|
|
20
|
+
scope;
|
|
21
|
+
_version = 0;
|
|
22
|
+
_initialVersion = 0;
|
|
23
|
+
constructor(scope, namespace, storage) {
|
|
24
|
+
this.storage = storage;
|
|
25
|
+
this.scope = scope;
|
|
26
|
+
this.namespace = namespace;
|
|
27
|
+
}
|
|
28
|
+
async initVersion() {
|
|
29
|
+
const version = await this.getInt(CONTEXT_VERSION_KEY);
|
|
30
|
+
this._initialVersion = version;
|
|
31
|
+
this._version = version;
|
|
32
|
+
}
|
|
33
|
+
async updateVersion() {
|
|
34
|
+
if (this._version === this._initialVersion) {
|
|
35
|
+
this._version++;
|
|
36
|
+
}
|
|
37
|
+
await this.set(CONTEXT_VERSION_KEY, this._version.toString());
|
|
38
|
+
}
|
|
39
|
+
async get(key) {
|
|
40
|
+
const version = key === CONTEXT_VERSION_KEY ? 0 : this._version;
|
|
41
|
+
return await this.storage.get(this.scope, this.namespace, version.toString(), key);
|
|
42
|
+
}
|
|
43
|
+
async set(key, value) {
|
|
44
|
+
const version = key === CONTEXT_VERSION_KEY ? 0 : this._version;
|
|
45
|
+
return await this.storage.set(this.scope, this.namespace, version.toString(), key, value);
|
|
46
|
+
}
|
|
47
|
+
async getInt(key) {
|
|
48
|
+
const str = await this.get(key);
|
|
49
|
+
if (str) {
|
|
50
|
+
return parseInt(str);
|
|
51
|
+
}
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
async getObj(key) {
|
|
55
|
+
const str = await this.get(key);
|
|
56
|
+
if (str) {
|
|
57
|
+
const store = JSON.parse(str);
|
|
58
|
+
return store.value;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
async setObj(key, value) {
|
|
63
|
+
await this.set(key, JSON.stringify({ value }));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV2RCxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO0FBVzdDLE1BQU0sT0FBTyxjQUFjO0lBQ3pCLE9BQU8sQ0FBVztJQUNsQixhQUFhLENBQVc7SUFFeEIsWUFBWSxPQUFpQjtRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhLEVBQUUsU0FBaUI7UUFDekMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLFNBQWlCO1FBQy9DLE9BQU8sSUFBSSxjQUFjLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbEUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGNBQWM7SUFDekIsT0FBTyxDQUFXO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixLQUFLLENBQVM7SUFFZCxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUNwQixZQUFZLEtBQWEsRUFBRSxTQUFpQixFQUFFLE9BQWlCO1FBQzdELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYTtRQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ25CLE1BQU0sT0FBTyxHQUFHLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hFLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hFLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELEtBQUssQ0FBQyxNQUFNLENBQVUsR0FBVztRQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFVLEdBQVcsRUFBRSxLQUFRO1FBQ3pDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YifQ==
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { NotificationWhen, Pipeline, ResultType, Runnable, Stage } from "../
|
|
2
|
-
import { RunHistory, RunnableCollection } from "./run-history";
|
|
3
|
-
import { ContextFactory, IContext } from "./context";
|
|
4
|
-
import { IStorage } from "./storage";
|
|
1
|
+
import { NotificationWhen, Pipeline, ResultType, Runnable, Stage } from "../dt/index.js";
|
|
2
|
+
import { RunHistory, RunnableCollection } from "./run-history.js";
|
|
3
|
+
import { ContextFactory, IContext } from "./context.js";
|
|
4
|
+
import { IStorage } from "./storage.js";
|
|
5
5
|
import { Logger } from "log4js";
|
|
6
|
-
import { IAccessService } from "../access";
|
|
7
|
-
import { IEmailService } from "../service";
|
|
6
|
+
import { IAccessService } from "../access/index.js";
|
|
7
|
+
import { IEmailService } from "../service/index.js";
|
|
8
8
|
export type ExecutorOptions = {
|
|
9
9
|
userId: any;
|
|
10
10
|
pipeline: Pipeline;
|
|
@@ -24,12 +24,12 @@ export declare class Executor {
|
|
|
24
24
|
lastRuntime: RunHistory;
|
|
25
25
|
options: ExecutorOptions;
|
|
26
26
|
canceled: boolean;
|
|
27
|
-
onChanged: (history: RunHistory) => void
|
|
27
|
+
onChanged: (history: RunHistory) => Promise<void>;
|
|
28
28
|
constructor(options: ExecutorOptions);
|
|
29
29
|
init(): Promise<void>;
|
|
30
30
|
cancel(): Promise<void>;
|
|
31
31
|
run(runtimeId: any, triggerType: string): Promise<void>;
|
|
32
|
-
runWithHistory(runnable: Runnable, runnableType: string, run: () => Promise<void>): Promise<ResultType.success | ResultType.skip>;
|
|
32
|
+
runWithHistory(runnable: Runnable, runnableType: string, run: () => Promise<void>): Promise<ResultType.success | ResultType.canceled | ResultType.skip>;
|
|
33
33
|
private runStages;
|
|
34
34
|
runStage(stage: Stage): Promise<ResultType.success | ResultType.error>;
|
|
35
35
|
compositionResultType(resList: ResultType[]): ResultType.success | ResultType.error;
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { ConcurrencyStrategy, ResultType, RunStrategy } from "../dt/index.js";
|
|
2
|
+
import _ from "lodash-es";
|
|
3
|
+
import { RunHistory, RunnableCollection } from "./run-history.js";
|
|
4
|
+
import { pluginRegistry } from "../plugin/index.js";
|
|
5
|
+
import { ContextFactory } from "./context.js";
|
|
6
|
+
import { logger } from "../utils/util.log.js";
|
|
7
|
+
import { createAxiosService } from "../utils/util.request.js";
|
|
8
|
+
import { Decorator } from "../decorator/index.js";
|
|
9
|
+
import { FileStore } from "./file-store.js";
|
|
10
|
+
export class Executor {
|
|
11
|
+
pipeline;
|
|
12
|
+
runtime;
|
|
13
|
+
contextFactory;
|
|
14
|
+
logger;
|
|
15
|
+
pipelineContext;
|
|
16
|
+
lastStatusMap;
|
|
17
|
+
lastRuntime;
|
|
18
|
+
options;
|
|
19
|
+
canceled = false;
|
|
20
|
+
onChanged;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.options = options;
|
|
23
|
+
this.pipeline = _.cloneDeep(options.pipeline);
|
|
24
|
+
this.onChanged = async (history) => {
|
|
25
|
+
await options.onChanged(history);
|
|
26
|
+
};
|
|
27
|
+
this.pipeline.userId = options.userId;
|
|
28
|
+
this.contextFactory = new ContextFactory(options.storage);
|
|
29
|
+
this.logger = logger;
|
|
30
|
+
this.pipelineContext = this.contextFactory.getContext("pipeline", this.pipeline.id);
|
|
31
|
+
}
|
|
32
|
+
async init() {
|
|
33
|
+
const lastRuntime = await this.pipelineContext.getObj(`lastRuntime`);
|
|
34
|
+
this.lastRuntime = lastRuntime;
|
|
35
|
+
this.lastStatusMap = new RunnableCollection(lastRuntime?.pipeline);
|
|
36
|
+
}
|
|
37
|
+
async cancel() {
|
|
38
|
+
this.canceled = true;
|
|
39
|
+
this.runtime?.cancel(this.pipeline);
|
|
40
|
+
await this.onChanged(this.runtime);
|
|
41
|
+
}
|
|
42
|
+
async run(runtimeId = 0, triggerType) {
|
|
43
|
+
try {
|
|
44
|
+
await this.init();
|
|
45
|
+
const trigger = { type: triggerType };
|
|
46
|
+
// 读取last
|
|
47
|
+
this.runtime = new RunHistory(runtimeId, trigger, this.pipeline);
|
|
48
|
+
this.logger.info(`pipeline.${this.pipeline.id} start`);
|
|
49
|
+
await this.notification("start");
|
|
50
|
+
await this.runWithHistory(this.pipeline, "pipeline", async () => {
|
|
51
|
+
await this.runStages(this.pipeline);
|
|
52
|
+
});
|
|
53
|
+
if (this.lastRuntime && this.lastRuntime.pipeline.status?.status === ResultType.error) {
|
|
54
|
+
await this.notification("turnToSuccess");
|
|
55
|
+
}
|
|
56
|
+
await this.notification("success");
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
await this.notification("error", e);
|
|
60
|
+
this.logger.error("pipeline 执行失败", e);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await this.pipelineContext.setObj("lastRuntime", this.runtime);
|
|
64
|
+
this.logger.info(`pipeline.${this.pipeline.id} end`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async runWithHistory(runnable, runnableType, run) {
|
|
68
|
+
runnable.runnableType = runnableType;
|
|
69
|
+
this.runtime.start(runnable);
|
|
70
|
+
await this.onChanged(this.runtime);
|
|
71
|
+
if (runnable.strategy?.runStrategy === RunStrategy.SkipWhenSucceed) {
|
|
72
|
+
//如果是成功后跳过策略
|
|
73
|
+
const lastNode = this.lastStatusMap.get(runnable.id);
|
|
74
|
+
const lastResult = lastNode?.status?.status;
|
|
75
|
+
const lastInput = JSON.stringify(lastNode?.status?.input);
|
|
76
|
+
let inputChanged = false;
|
|
77
|
+
if (runnableType === "step") {
|
|
78
|
+
const step = runnable;
|
|
79
|
+
const input = JSON.stringify(step.input);
|
|
80
|
+
if (input != null && lastInput !== input) {
|
|
81
|
+
//参数有变化
|
|
82
|
+
inputChanged = true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (lastResult != null && lastResult === ResultType.success && !inputChanged) {
|
|
86
|
+
this.runtime.skip(runnable);
|
|
87
|
+
await this.onChanged(this.runtime);
|
|
88
|
+
return ResultType.skip;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const intervalFlushLogId = setInterval(async () => {
|
|
92
|
+
await this.onChanged(this.runtime);
|
|
93
|
+
}, 5000);
|
|
94
|
+
// const timeout = runnable.timeout ?? 20 * 60 * 1000;
|
|
95
|
+
try {
|
|
96
|
+
if (this.canceled) {
|
|
97
|
+
return ResultType.canceled;
|
|
98
|
+
}
|
|
99
|
+
await run();
|
|
100
|
+
this.runtime.success(runnable);
|
|
101
|
+
return ResultType.success;
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
this.runtime.error(runnable, e);
|
|
105
|
+
throw e;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this.runtime.finally(runnable);
|
|
109
|
+
clearInterval(intervalFlushLogId);
|
|
110
|
+
await this.onChanged(this.runtime);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async runStages(pipeline) {
|
|
114
|
+
const resList = [];
|
|
115
|
+
for (const stage of pipeline.stages) {
|
|
116
|
+
const res = await this.runWithHistory(stage, "stage", async () => {
|
|
117
|
+
await this.runStage(stage);
|
|
118
|
+
});
|
|
119
|
+
resList.push(res);
|
|
120
|
+
}
|
|
121
|
+
return this.compositionResultType(resList);
|
|
122
|
+
}
|
|
123
|
+
async runStage(stage) {
|
|
124
|
+
const runnerList = [];
|
|
125
|
+
for (const task of stage.tasks) {
|
|
126
|
+
const runner = async () => {
|
|
127
|
+
return this.runWithHistory(task, "task", async () => {
|
|
128
|
+
await this.runTask(task);
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
runnerList.push(runner);
|
|
132
|
+
}
|
|
133
|
+
let resList = [];
|
|
134
|
+
if (stage.concurrency === ConcurrencyStrategy.Parallel) {
|
|
135
|
+
const pList = [];
|
|
136
|
+
for (const item of runnerList) {
|
|
137
|
+
pList.push(item());
|
|
138
|
+
}
|
|
139
|
+
resList = await Promise.all(pList);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
for (let i = 0; i < runnerList.length; i++) {
|
|
143
|
+
const runner = runnerList[i];
|
|
144
|
+
resList[i] = await runner();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return this.compositionResultType(resList);
|
|
148
|
+
}
|
|
149
|
+
compositionResultType(resList) {
|
|
150
|
+
let hasSuccess = false;
|
|
151
|
+
for (const type of resList) {
|
|
152
|
+
if (type === ResultType.error) {
|
|
153
|
+
return ResultType.error;
|
|
154
|
+
}
|
|
155
|
+
if (type === ResultType.success) {
|
|
156
|
+
hasSuccess = true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (hasSuccess) {
|
|
160
|
+
return ResultType.success;
|
|
161
|
+
}
|
|
162
|
+
return ResultType.error;
|
|
163
|
+
}
|
|
164
|
+
async runTask(task) {
|
|
165
|
+
const resList = [];
|
|
166
|
+
for (const step of task.steps) {
|
|
167
|
+
step.runnableType = "step";
|
|
168
|
+
const res = await this.runWithHistory(step, "step", async () => {
|
|
169
|
+
await this.runStep(step);
|
|
170
|
+
});
|
|
171
|
+
resList.push(res);
|
|
172
|
+
}
|
|
173
|
+
return this.compositionResultType(resList);
|
|
174
|
+
}
|
|
175
|
+
async runStep(step) {
|
|
176
|
+
const currentLogger = this.runtime._loggers[step.id];
|
|
177
|
+
const lastStatus = this.lastStatusMap.get(step.id);
|
|
178
|
+
//执行任务
|
|
179
|
+
const plugin = pluginRegistry.get(step.type);
|
|
180
|
+
// @ts-ignore
|
|
181
|
+
const instance = new plugin.target();
|
|
182
|
+
// @ts-ignore
|
|
183
|
+
const define = plugin.define;
|
|
184
|
+
//从outputContext读取输入参数
|
|
185
|
+
Decorator.inject(define.input, instance, step.input, (item, key) => {
|
|
186
|
+
if (item.component?.name === "pi-output-selector") {
|
|
187
|
+
const contextKey = step.input[key];
|
|
188
|
+
if (contextKey != null) {
|
|
189
|
+
const value = this.runtime.context[contextKey];
|
|
190
|
+
if (value == null) {
|
|
191
|
+
currentLogger.warn(`[step init] input ${define.title} is null`);
|
|
192
|
+
}
|
|
193
|
+
step.input[key] = value;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
const http = createAxiosService({ logger: currentLogger });
|
|
198
|
+
const taskCtx = {
|
|
199
|
+
pipeline: this.pipeline,
|
|
200
|
+
step,
|
|
201
|
+
lastStatus,
|
|
202
|
+
http,
|
|
203
|
+
logger: currentLogger,
|
|
204
|
+
accessService: this.options.accessService,
|
|
205
|
+
emailService: this.options.emailService,
|
|
206
|
+
pipelineContext: this.pipelineContext,
|
|
207
|
+
userContext: this.contextFactory.getContext("user", this.options.userId),
|
|
208
|
+
fileStore: new FileStore({
|
|
209
|
+
scope: this.pipeline.id,
|
|
210
|
+
parent: this.runtime.id,
|
|
211
|
+
rootDir: this.options.fileRootDir,
|
|
212
|
+
}),
|
|
213
|
+
};
|
|
214
|
+
instance.setCtx(taskCtx);
|
|
215
|
+
await instance.onInstance();
|
|
216
|
+
await instance.execute();
|
|
217
|
+
if (instance._result.clearLastStatus) {
|
|
218
|
+
this.lastStatusMap.clear();
|
|
219
|
+
}
|
|
220
|
+
//输出到output context
|
|
221
|
+
_.forEach(define.output, (item, key) => {
|
|
222
|
+
step.status.output[key] = instance[key];
|
|
223
|
+
const stepOutputKey = `step.${step.id}.${key}`;
|
|
224
|
+
this.runtime.context[stepOutputKey] = instance[key];
|
|
225
|
+
});
|
|
226
|
+
step.status.files = instance.getFiles();
|
|
227
|
+
}
|
|
228
|
+
async notification(when, error) {
|
|
229
|
+
if (!this.pipeline.notifications) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
let subject = "";
|
|
233
|
+
let content = "";
|
|
234
|
+
if (when === "start") {
|
|
235
|
+
subject = `【CertD】开始执行,${this.pipeline.title}, buildId:${this.runtime.id}`;
|
|
236
|
+
content = subject;
|
|
237
|
+
}
|
|
238
|
+
else if (when === "success") {
|
|
239
|
+
subject = `【CertD】执行成功,${this.pipeline.title}, buildId:${this.runtime.id}`;
|
|
240
|
+
content = subject;
|
|
241
|
+
}
|
|
242
|
+
else if (when === "turnToSuccess") {
|
|
243
|
+
subject = `【CertD】执行成功(错误转成功),${this.pipeline.title}, buildId:${this.runtime.id}`;
|
|
244
|
+
content = subject;
|
|
245
|
+
}
|
|
246
|
+
else if (when === "error") {
|
|
247
|
+
subject = `【CertD】执行失败,${this.pipeline.title}, buildId:${this.runtime.id}`;
|
|
248
|
+
content = `<pre>${error.message}</pre>`;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
for (const notification of this.pipeline.notifications) {
|
|
254
|
+
if (!notification.when.includes(when)) {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (notification.type === "email") {
|
|
258
|
+
try {
|
|
259
|
+
this.options.emailService?.send({
|
|
260
|
+
userId: this.pipeline.userId,
|
|
261
|
+
subject,
|
|
262
|
+
content,
|
|
263
|
+
receivers: notification.options.receivers,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
logger.error("send email error", e);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQThCLFVBQVUsRUFBWSxXQUFXLEVBQXFCLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkksT0FBTyxDQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRSxPQUFPLEVBQW9DLGNBQWMsRUFBdUIsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsY0FBYyxFQUFZLE1BQU0sY0FBYyxDQUFDO0FBRXhELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBWTVDLE1BQU0sT0FBTyxRQUFRO0lBQ25CLFFBQVEsQ0FBVztJQUNuQixPQUFPLENBQWM7SUFDckIsY0FBYyxDQUFpQjtJQUMvQixNQUFNLENBQVM7SUFDZixlQUFlLENBQVk7SUFDM0IsYUFBYSxDQUFzQjtJQUNuQyxXQUFXLENBQWM7SUFDekIsT0FBTyxDQUFrQjtJQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLFNBQVMsQ0FBeUM7SUFDbEQsWUFBWSxPQUF3QjtRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxFQUFFLE9BQW1CLEVBQUUsRUFBRTtZQUM3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
|
|
@@ -4,6 +4,11 @@ export type FileStoreOptions = {
|
|
|
4
4
|
scope: string;
|
|
5
5
|
parent: string;
|
|
6
6
|
};
|
|
7
|
+
export interface IFileStore {
|
|
8
|
+
readFile(filePath: string): Buffer | null;
|
|
9
|
+
writeFile(filename: string, file: Buffer): string;
|
|
10
|
+
deleteByParent(scope: string, parent: string): void;
|
|
11
|
+
}
|
|
7
12
|
export declare class FileStore {
|
|
8
13
|
rootDir: string;
|
|
9
14
|
scope: string;
|
|
@@ -11,6 +16,6 @@ export declare class FileStore {
|
|
|
11
16
|
constructor(options?: FileStoreOptions);
|
|
12
17
|
readFile(filePath: string): Buffer | null;
|
|
13
18
|
writeFile(filename: string, file: Buffer): string;
|
|
14
|
-
|
|
19
|
+
protected buildFilePath(filename: string): string;
|
|
15
20
|
deleteByParent(scope: string, parent: string): void;
|
|
16
21
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { fileUtils } from "../utils/index.js";
|
|
2
|
+
import dayjs from "dayjs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import { logger } from "../utils/index.js";
|
|
6
|
+
export class FileStore {
|
|
7
|
+
rootDir;
|
|
8
|
+
scope;
|
|
9
|
+
parent;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.rootDir = fileUtils.getFileRootDir(options?.rootDir);
|
|
12
|
+
this.scope = options?.scope || "0";
|
|
13
|
+
this.parent = options?.parent || "0";
|
|
14
|
+
}
|
|
15
|
+
readFile(filePath) {
|
|
16
|
+
if (!fs.existsSync(filePath)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return fs.readFileSync(filePath);
|
|
20
|
+
}
|
|
21
|
+
writeFile(filename, file) {
|
|
22
|
+
const localPath = this.buildFilePath(filename);
|
|
23
|
+
fs.writeFileSync(localPath, file);
|
|
24
|
+
logger.info(`写入文件:${localPath}`);
|
|
25
|
+
return localPath;
|
|
26
|
+
}
|
|
27
|
+
buildFilePath(filename) {
|
|
28
|
+
const parentDir = path.join(this.rootDir, this.scope + "", this.parent + "", dayjs().format("YYYY-MM-DD"));
|
|
29
|
+
if (!fs.existsSync(parentDir)) {
|
|
30
|
+
fs.mkdirSync(parentDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
return path.join(parentDir, filename);
|
|
33
|
+
}
|
|
34
|
+
deleteByParent(scope, parent) {
|
|
35
|
+
const dir = path.join(this.rootDir, scope, parent);
|
|
36
|
+
if (fs.existsSync(dir)) {
|
|
37
|
+
fs.unlinkSync(dir);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2ZpbGUtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWMzQyxNQUFNLE9BQU8sU0FBUztJQUNwQixPQUFPLENBQVM7SUFDaEIsS0FBSyxDQUFTO0lBQ2QsTUFBTSxDQUFTO0lBQ2YsWUFBWSxPQUEwQjtRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxFQUFFLEtBQUssSUFBSSxHQUFHLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUSxDQUFDLFFBQWdCO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBZ0IsRUFBRSxJQUFZO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFL0MsRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVTLGFBQWEsQ0FBQyxRQUFnQjtRQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM5QixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBYSxFQUFFLE1BQWM7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./executor.js";
|
|
2
|
+
export * from "./run-history.js";
|
|
3
|
+
export * from "./context.js";
|
|
4
|
+
export * from "./storage.js";
|
|
5
|
+
export * from "./file-store.js";
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsaUJBQWlCLENBQUMifQ==
|