@bluelibs/runner 1.0.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.
Files changed (66) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +797 -0
  3. package/dist/DependencyProcessor.d.ts +49 -0
  4. package/dist/DependencyProcessor.js +178 -0
  5. package/dist/DependencyProcessor.js.map +1 -0
  6. package/dist/EventManager.d.ts +13 -0
  7. package/dist/EventManager.js +58 -0
  8. package/dist/EventManager.js.map +1 -0
  9. package/dist/ResourceInitializer.d.ts +13 -0
  10. package/dist/ResourceInitializer.js +54 -0
  11. package/dist/ResourceInitializer.js.map +1 -0
  12. package/dist/Store.d.ts +62 -0
  13. package/dist/Store.js +186 -0
  14. package/dist/Store.js.map +1 -0
  15. package/dist/TaskRunner.d.ts +22 -0
  16. package/dist/TaskRunner.js +93 -0
  17. package/dist/TaskRunner.js.map +1 -0
  18. package/dist/define.d.ts +10 -0
  19. package/dist/define.js +111 -0
  20. package/dist/define.js.map +1 -0
  21. package/dist/defs.d.ts +127 -0
  22. package/dist/defs.js +12 -0
  23. package/dist/defs.js.map +1 -0
  24. package/dist/errors.d.ts +8 -0
  25. package/dist/errors.js +12 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/globalEvents.d.ts +36 -0
  28. package/dist/globalEvents.js +45 -0
  29. package/dist/globalEvents.js.map +1 -0
  30. package/dist/globalResources.d.ts +8 -0
  31. package/dist/globalResources.js +19 -0
  32. package/dist/globalResources.js.map +1 -0
  33. package/dist/index.d.ts +49 -0
  34. package/dist/index.js +25 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/run.d.ts +32 -0
  37. package/dist/run.js +39 -0
  38. package/dist/run.js.map +1 -0
  39. package/dist/tools/findCircularDependencies.d.ts +16 -0
  40. package/dist/tools/findCircularDependencies.js +53 -0
  41. package/dist/tools/findCircularDependencies.js.map +1 -0
  42. package/package.json +50 -0
  43. package/src/DependencyProcessor.ts +243 -0
  44. package/src/EventManager.ts +84 -0
  45. package/src/ResourceInitializer.ts +69 -0
  46. package/src/Store.ts +250 -0
  47. package/src/TaskRunner.ts +135 -0
  48. package/src/__tests__/EventManager.test.ts +96 -0
  49. package/src/__tests__/ResourceInitializer.test.ts +109 -0
  50. package/src/__tests__/Store.test.ts +143 -0
  51. package/src/__tests__/TaskRunner.test.ts +135 -0
  52. package/src/__tests__/benchmark/benchmark.test.ts +146 -0
  53. package/src/__tests__/errors.test.ts +268 -0
  54. package/src/__tests__/globalEvents.test.ts +99 -0
  55. package/src/__tests__/index.ts +9 -0
  56. package/src/__tests__/run.hooks.test.ts +110 -0
  57. package/src/__tests__/run.test.ts +614 -0
  58. package/src/__tests__/tools/findCircularDependencies.test.ts +217 -0
  59. package/src/define.ts +142 -0
  60. package/src/defs.ts +221 -0
  61. package/src/errors.ts +22 -0
  62. package/src/globalEvents.ts +64 -0
  63. package/src/globalResources.ts +19 -0
  64. package/src/index.ts +28 -0
  65. package/src/run.ts +98 -0
  66. package/src/tools/findCircularDependencies.ts +69 -0
@@ -0,0 +1,22 @@
1
+ import { DependencyMapType, DependencyValuesType, ITask } from "./defs";
2
+ import { EventManager } from "./EventManager";
3
+ import { Store } from "./Store";
4
+ export declare class TaskRunner {
5
+ protected readonly store: Store;
6
+ protected readonly eventManager: EventManager;
7
+ protected readonly runnerStore: Map<string, (input: any) => Promise<any>>;
8
+ constructor(store: Store, eventManager: EventManager);
9
+ /**
10
+ * Begins the execution of an task. These are registered tasks and all sanity checks have been performed at this stage to ensure consistency of the object.
11
+ * This function can throw only if any of the event listeners or run function throws
12
+ */
13
+ run<TInput, TOutput extends Promise<any>, TDeps extends DependencyMapType>(task: ITask<TInput, TOutput, TDeps>, input: TInput, taskDependencies?: DependencyValuesType<TDeps>): Promise<TOutput | undefined>;
14
+ /**
15
+ * Creates the function with the chain of middleware.
16
+ * @param task
17
+ * @param input
18
+ * @param taskDependencies
19
+ * @returns
20
+ */
21
+ protected createRunnerWithMiddleware<TInput, TOutput extends Promise<any>, TDeps extends DependencyMapType>(task: ITask<TInput, TOutput, TDeps>, taskDependencies: DependencyValuesType<{}>): (input: any) => Promise<TOutput>;
22
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TaskRunner = void 0;
4
+ const globalEvents_1 = require("./globalEvents");
5
+ class TaskRunner {
6
+ store;
7
+ eventManager;
8
+ runnerStore = new Map();
9
+ constructor(store, eventManager) {
10
+ this.store = store;
11
+ this.eventManager = eventManager;
12
+ }
13
+ /**
14
+ * Begins the execution of an task. These are registered tasks and all sanity checks have been performed at this stage to ensure consistency of the object.
15
+ * This function can throw only if any of the event listeners or run function throws
16
+ */
17
+ async run(task, input, taskDependencies) {
18
+ let runner = this.runnerStore.get(task.id);
19
+ if (!runner) {
20
+ const storeTask = this.store.tasks.get(task.id);
21
+ const deps = taskDependencies || storeTask.computedDependencies;
22
+ runner = this.createRunnerWithMiddleware(task, deps);
23
+ this.runnerStore.set(task.id, runner);
24
+ }
25
+ // begin by dispatching the event of creating it.
26
+ // then ensure the hooks are called
27
+ // then ensure the middleware are called
28
+ await this.eventManager.emit(task.events.beforeRun, { input });
29
+ await this.eventManager.emit(globalEvents_1.globalEvents.tasks.beforeRun, {
30
+ task,
31
+ input,
32
+ });
33
+ let error;
34
+ try {
35
+ // craft the next function starting from the first next function
36
+ const output = await runner(input);
37
+ await this.eventManager.emit(task.events.afterRun, { input, output });
38
+ await this.eventManager.emit(globalEvents_1.globalEvents.tasks.afterRun, {
39
+ task,
40
+ input,
41
+ output,
42
+ });
43
+ return output;
44
+ }
45
+ catch (e) {
46
+ error = e;
47
+ // If you want to rewthrow the error, this should be done inside the onError event.
48
+ await this.eventManager.emit(task.events.onError, { error });
49
+ await this.eventManager.emit(globalEvents_1.globalEvents.tasks.onError, {
50
+ task,
51
+ error,
52
+ });
53
+ throw e;
54
+ }
55
+ }
56
+ /**
57
+ * Creates the function with the chain of middleware.
58
+ * @param task
59
+ * @param input
60
+ * @param taskDependencies
61
+ * @returns
62
+ */
63
+ createRunnerWithMiddleware(task, taskDependencies) {
64
+ // this is the final next()
65
+ let next = async (input) => {
66
+ return task.run.call(null, input, taskDependencies);
67
+ };
68
+ const existingMiddlewares = task.middleware;
69
+ const createdMiddlewares = [
70
+ ...this.store.getGlobalMiddlewares(existingMiddlewares.map((x) => x.id)),
71
+ ...existingMiddlewares,
72
+ ];
73
+ if (createdMiddlewares.length > 0) {
74
+ // we need to run the middleware in reverse order
75
+ // so we can chain the next function
76
+ for (let i = createdMiddlewares.length - 1; i >= 0; i--) {
77
+ const middleware = createdMiddlewares[i];
78
+ const storeMiddleware = this.store.middlewares.get(middleware.id); // we know it exists because at this stage all sanity checks have been done.
79
+ const nextFunction = next;
80
+ next = async (input) => {
81
+ return storeMiddleware.middleware.run({
82
+ taskDefinition: task,
83
+ input,
84
+ next: nextFunction,
85
+ }, storeMiddleware.computedDependencies);
86
+ };
87
+ }
88
+ }
89
+ return next;
90
+ }
91
+ }
92
+ exports.TaskRunner = TaskRunner;
93
+ //# sourceMappingURL=TaskRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../src/TaskRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ITask, ITaskDefinition, IResource, IResourceWithConfig, IResourceDefinintion, IEventDefinition, IMiddlewareDefinition, DependencyMapType, IMiddleware } from "./defs";
2
+ export declare function defineTask<Input = undefined, Output extends Promise<any> = any, Deps extends DependencyMapType = any, Test = any>(config: ITaskDefinition<Input, Output, Deps, Test>): ITask<Input, Output, Deps, Test>;
3
+ export declare function defineResource<TConfig = void, TValue = any, TDeps extends DependencyMapType = {}>(constConfig: IResourceDefinintion<TConfig, TValue, TDeps>): IResource<TConfig, TValue, TDeps>;
4
+ export declare function defineEvent<TPayload = any>(config: IEventDefinition<TPayload>): IEventDefinition<TPayload>;
5
+ export declare function defineMiddleware<TDeps extends DependencyMapType = {}>(config: IMiddlewareDefinition<TDeps>): IMiddleware<TDeps>;
6
+ export declare function isTask(definition: any): definition is ITask;
7
+ export declare function isResource(definition: any): definition is IResource;
8
+ export declare function isResourceWithConfig(definition: any): definition is IResourceWithConfig;
9
+ export declare function isEvent(definition: any): definition is IEventDefinition;
10
+ export declare function isMiddleware(definition: any): definition is IMiddleware;
package/dist/define.js ADDED
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineTask = defineTask;
4
+ exports.defineResource = defineResource;
5
+ exports.defineEvent = defineEvent;
6
+ exports.defineMiddleware = defineMiddleware;
7
+ exports.isTask = isTask;
8
+ exports.isResource = isResource;
9
+ exports.isResourceWithConfig = isResourceWithConfig;
10
+ exports.isEvent = isEvent;
11
+ exports.isMiddleware = isMiddleware;
12
+ const defs_1 = require("./defs");
13
+ const errors_1 = require("./errors");
14
+ function defineTask(config) {
15
+ const autorun = {};
16
+ // if (config.autorun) {
17
+ // if (config.autorun.on) {
18
+ // autorun.on = Array.isArray(config.autorun.on);
19
+ // autorun.schedule = config.autorun.schedule;
20
+ // }
21
+ // }
22
+ return {
23
+ [defs_1.symbols.task]: true,
24
+ id: config.id,
25
+ dependencies: config.dependencies || {},
26
+ middleware: config.middleware || [],
27
+ run: config.run,
28
+ on: config.on,
29
+ events: {
30
+ beforeRun: defineEvent({
31
+ id: `${config.id}.beforeRun`,
32
+ }),
33
+ afterRun: defineEvent({
34
+ id: `${config.id}.afterRun`,
35
+ }),
36
+ onError: defineEvent({
37
+ id: `${config.id}.onError`,
38
+ }),
39
+ },
40
+ // autorun,
41
+ };
42
+ }
43
+ function defineResource(constConfig) {
44
+ return {
45
+ [defs_1.symbols.resource]: true,
46
+ id: constConfig.id,
47
+ dependencies: constConfig.dependencies,
48
+ hooks: constConfig.hooks || [],
49
+ register: constConfig.register || [],
50
+ init: constConfig.init,
51
+ with: function (config) {
52
+ return {
53
+ [defs_1.symbols.resourceWithConfig]: true,
54
+ resource: this,
55
+ config,
56
+ };
57
+ },
58
+ events: {
59
+ beforeInit: defineEvent({
60
+ id: `${constConfig.id}.beforeInit`,
61
+ }),
62
+ afterInit: defineEvent({
63
+ id: `${constConfig.id}.afterInit`,
64
+ }),
65
+ onError: defineEvent({
66
+ id: `${constConfig.id}.onError`,
67
+ }),
68
+ },
69
+ };
70
+ }
71
+ function defineEvent(config) {
72
+ return {
73
+ [defs_1.symbols.event]: true,
74
+ ...config,
75
+ };
76
+ }
77
+ function defineMiddleware(config) {
78
+ const object = {
79
+ [defs_1.symbols.middleware]: true,
80
+ ...config,
81
+ dependencies: config.dependencies || {},
82
+ };
83
+ return {
84
+ ...object,
85
+ global() {
86
+ return {
87
+ ...object,
88
+ [defs_1.symbols.middlewareGlobal]: true,
89
+ global() {
90
+ throw errors_1.Errors.middlewareAlreadyGlobal(config.id);
91
+ },
92
+ };
93
+ },
94
+ };
95
+ }
96
+ function isTask(definition) {
97
+ return definition && definition[defs_1.symbols.task];
98
+ }
99
+ function isResource(definition) {
100
+ return definition && definition[defs_1.symbols.resource];
101
+ }
102
+ function isResourceWithConfig(definition) {
103
+ return definition && definition[defs_1.symbols.resourceWithConfig];
104
+ }
105
+ function isEvent(definition) {
106
+ return definition && definition[defs_1.symbols.event];
107
+ }
108
+ function isMiddleware(definition) {
109
+ return definition && definition[defs_1.symbols.middleware];
110
+ }
111
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"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"}
package/dist/defs.d.ts ADDED
@@ -0,0 +1,127 @@
1
+ export declare const symbols: {
2
+ task: symbol;
3
+ resource: symbol;
4
+ resourceWithConfig: symbol;
5
+ event: symbol;
6
+ middleware: symbol;
7
+ middlewareGlobal: symbol;
8
+ };
9
+ export interface IMeta {
10
+ title?: string;
11
+ description?: string;
12
+ tags: string[];
13
+ }
14
+ export interface ITaskMeta extends IMeta {
15
+ }
16
+ export interface IResourceMeta extends IMeta {
17
+ }
18
+ export interface IEventMeta extends IMeta {
19
+ }
20
+ export interface IMiddlewareMeta extends IMeta {
21
+ }
22
+ export type DependencyMapType = Record<string, ITask | IResource | IEventDefinition>;
23
+ export type DependencyValueType<T> = T extends ITask<infer I, infer O,
24
+ /** The infer D, while not used is crucial for making this work correctly, otherwise it forces input: unknown to a dependency that has a dependency. */
25
+ infer D> ? (...args: I extends unknown ? [] : [I]) => O : T extends IResource<any, infer V> ? V : T extends IEventDefinition<infer P> ? (input: P) => Promise<void> | never : never;
26
+ export type DependencyValuesType<T extends DependencyMapType> = {
27
+ [K in keyof T]: DependencyValueType<T[K]>;
28
+ };
29
+ export type RegisterableItems = IResource<void> | IResourceWithConfig<any> | ITaskDefinition | IMiddlewareDefinition | IEventDefinition;
30
+ export interface ITaskDefinition<TInput = any, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TEventDefinitionInput = null> {
31
+ id: string;
32
+ dependencies?: TDependencies | (() => TDependencies);
33
+ middleware?: IMiddlewareDefinition[];
34
+ on?: IEventDefinition<TEventDefinitionInput>;
35
+ meta?: ITaskMeta;
36
+ run: (input: TEventDefinitionInput extends null ? TInput : TEventDefinitionInput, dependencies: DependencyValuesType<TDependencies>) => TOutput;
37
+ }
38
+ export type BeforeRunEventPayload<TInput> = {
39
+ input: TInput;
40
+ };
41
+ export type AfterRunEventPayload<TInput, TOutput> = {
42
+ input: TInput;
43
+ output: TOutput;
44
+ };
45
+ export type OnErrorEventPayload = {
46
+ error: any;
47
+ };
48
+ export type BeforeInitEventPayload<TConfig> = {
49
+ config: TConfig;
50
+ };
51
+ export type AfterInitEventPayload<TConfig, TValue> = {
52
+ config: TConfig;
53
+ value: TValue;
54
+ };
55
+ /**
56
+ * This is the response after the definition has been prepared. TODO: better naming?
57
+ */
58
+ export interface ITask<TInput = any, TOutput extends Promise<any> = any, TDependencies extends DependencyMapType = {}, TEventDefinitionInput = null> extends ITaskDefinition<TInput, TOutput, TDependencies, TEventDefinitionInput> {
59
+ dependencies: TDependencies | (() => TDependencies);
60
+ computedDependencies?: DependencyValuesType<TDependencies>;
61
+ middleware: IMiddlewareDefinition[];
62
+ /**
63
+ * These events are automatically populated after the task has been defined.
64
+ */
65
+ events: {
66
+ beforeRun: IEventDefinition<BeforeRunEventPayload<TInput>>;
67
+ afterRun: IEventDefinition<AfterRunEventPayload<TInput, TOutput>>;
68
+ onError: IEventDefinition<OnErrorEventPayload>;
69
+ };
70
+ }
71
+ export interface IResourceDefinintion<TConfig = void, TValue = unknown, TDependencies extends DependencyMapType = {}> {
72
+ id: string;
73
+ dependencies?: TDependencies | ((config: TConfig) => TDependencies);
74
+ hooks?: IHookDefinition<TDependencies>[] | ((config: TConfig) => IHookDefinition<TDependencies>[]);
75
+ register?: Array<RegisterableItems> | ((config: TConfig) => Array<RegisterableItems>);
76
+ init?: (config: TConfig, dependencies: DependencyValuesType<TDependencies>) => Promise<TValue>;
77
+ meta?: IResourceMeta;
78
+ }
79
+ export interface IResource<TConfig = void, TValue = any, TDependencies extends DependencyMapType = any> extends IResourceDefinintion<TConfig, TValue, TDependencies> {
80
+ with(config: TConfig): IResourceWithConfig<TConfig, TValue, TDependencies>;
81
+ register: Array<RegisterableItems> | ((config: TConfig) => Array<RegisterableItems>);
82
+ /**
83
+ * These events are automatically populated after the task has been defined.
84
+ */
85
+ events: {
86
+ beforeInit: IEventDefinition<BeforeInitEventPayload<TConfig>>;
87
+ afterInit: IEventDefinition<AfterInitEventPayload<TConfig, TValue>>;
88
+ onError: IEventDefinition<OnErrorEventPayload>;
89
+ };
90
+ hooks: IHookDefinition<TDependencies>[] | ((config: TConfig) => IHookDefinition<TDependencies>[]);
91
+ }
92
+ export interface IResourceWithConfig<TConfig = any, TValue = any, TDependencies extends DependencyMapType = any> {
93
+ resource: IResource<TConfig, TValue, TDependencies>;
94
+ config: TConfig;
95
+ }
96
+ export interface IEvent<TPayload = any> {
97
+ id: string;
98
+ data: TPayload;
99
+ }
100
+ export type EventHandlerType<T = any> = (event: IEvent<T>) => any | Promise<any>;
101
+ export interface IEventDefinition<TPayload = void> {
102
+ id: string;
103
+ meta?: IEventMeta;
104
+ }
105
+ export interface IMiddlewareDefinition<TDependencies extends DependencyMapType = any> {
106
+ id: string;
107
+ dependencies?: TDependencies | (() => TDependencies);
108
+ run: (input: IMiddlewareExecutionInput, dependencies: DependencyValuesType<TDependencies>) => Promise<any>;
109
+ meta?: IMiddlewareMeta;
110
+ }
111
+ export interface IMiddleware<TDependencies extends DependencyMapType = any> extends IMiddlewareDefinition<TDependencies> {
112
+ dependencies: TDependencies | (() => TDependencies);
113
+ global(): IMiddleware<TDependencies>;
114
+ }
115
+ export interface IMiddlewareDefinitionConfigured<C extends Record<string, any> = {}> {
116
+ middleware: IMiddleware<C>;
117
+ config?: C;
118
+ }
119
+ export interface IMiddlewareExecutionInput {
120
+ taskDefinition?: ITask;
121
+ input: any;
122
+ next: (input?: any) => Promise<any>;
123
+ }
124
+ export interface IHookDefinition<D extends DependencyMapType = {}> {
125
+ event: IEventDefinition;
126
+ run: (event: IEvent, dependencies: DependencyValuesType<D>) => Promise<void> | void;
127
+ }
package/dist/defs.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.symbols = void 0;
4
+ exports.symbols = {
5
+ task: Symbol("task"),
6
+ resource: Symbol("resource"),
7
+ resourceWithConfig: Symbol("resourceWithConfig"),
8
+ event: Symbol("event"),
9
+ middleware: Symbol("middleware"),
10
+ middlewareGlobal: Symbol("middlewareGlobal"),
11
+ };
12
+ //# sourceMappingURL=defs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defs.js","sourceRoot":"","sources":["../src/defs.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC;CAC7C,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const Errors: {
2
+ duplicateRegistration: (type: string, id: string) => Error;
3
+ dependencyNotFound: (key: string) => Error;
4
+ unknownItemType: (item: any) => Error;
5
+ circularDependencies: (cycles: string[]) => Error;
6
+ eventNotFound: (id: string) => Error;
7
+ middlewareAlreadyGlobal: (id: string) => Error;
8
+ };
package/dist/errors.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Errors = void 0;
4
+ exports.Errors = {
5
+ duplicateRegistration: (type, id) => new Error(`${type} "${id}" already registered`),
6
+ dependencyNotFound: (key) => new Error(`Dependency ${key} not found. Did you forget to register it through a resource?`),
7
+ unknownItemType: (item) => new Error(`Unknown item type: ${item}`),
8
+ circularDependencies: (cycles) => new Error(`Circular dependencies detected: ${cycles.join(", ")}`),
9
+ eventNotFound: (id) => new Error(`Event "${id}" not found. Did you forget to register it?`),
10
+ middlewareAlreadyGlobal: (id) => new Error("Cannot call global on a global middleware: " + id),
11
+ };
12
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAEa,QAAA,MAAM,GAAG;IACpB,qBAAqB,EAAE,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAClD,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,EAAE,sBAAsB,CAAC;IAEjD,kBAAkB,EAAE,CAAC,GAAW,EAAE,EAAE,CAClC,IAAI,KAAK,CACP,cAAc,GAAG,+DAA+D,CACjF;IAEH,eAAe,EAAE,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAEvE,oBAAoB,EAAE,CAAC,MAAgB,EAAE,EAAE,CACzC,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAEnE,aAAa,EAAE,CAAC,EAAU,EAAE,EAAE,CAC5B,IAAI,KAAK,CAAC,UAAU,EAAE,6CAA6C,CAAC;IAEtE,uBAAuB,EAAE,CAAC,EAAU,EAAE,EAAE,CACtC,IAAI,KAAK,CAAC,6CAA6C,GAAG,EAAE,CAAC;CAChE,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { ITask, IResource } from "./defs";
2
+ export declare const globalEvents: {
3
+ beforeInit: import("./defs").IEventDefinition<any>;
4
+ afterInit: import("./defs").IEventDefinition<any>;
5
+ tasks: {
6
+ beforeRun: import("./defs").IEventDefinition<{
7
+ task: ITask<any, any, any>;
8
+ input: any;
9
+ }>;
10
+ afterRun: import("./defs").IEventDefinition<{
11
+ task: ITask<any, any, any>;
12
+ input: any;
13
+ output: any;
14
+ }>;
15
+ onError: import("./defs").IEventDefinition<{
16
+ error: Error;
17
+ task: ITask<any, any, any>;
18
+ }>;
19
+ };
20
+ resources: {
21
+ beforeInit: import("./defs").IEventDefinition<{
22
+ resource: IResource<any, any, any>;
23
+ config: any;
24
+ }>;
25
+ afterInit: import("./defs").IEventDefinition<{
26
+ resource: IResource<any, any, any>;
27
+ config: any;
28
+ value: any;
29
+ }>;
30
+ onError: import("./defs").IEventDefinition<{
31
+ error: Error;
32
+ resource: IResource<any, any, any>;
33
+ }>;
34
+ };
35
+ };
36
+ export declare const globalEventsArray: import("./defs").IEventDefinition<any>[];
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.globalEventsArray = exports.globalEvents = void 0;
4
+ const define_1 = require("./define");
5
+ exports.globalEvents = {
6
+ beforeInit: (0, define_1.defineEvent)({
7
+ id: "global.beforeInit",
8
+ }),
9
+ afterInit: (0, define_1.defineEvent)({
10
+ id: "global.afterInit",
11
+ }),
12
+ tasks: {
13
+ beforeRun: (0, define_1.defineEvent)({
14
+ id: "global.tasks.beforeRun",
15
+ }),
16
+ afterRun: (0, define_1.defineEvent)({
17
+ id: "global.tasks.afterRun",
18
+ }),
19
+ onError: (0, define_1.defineEvent)({
20
+ id: "global.tasks.onError",
21
+ }),
22
+ },
23
+ resources: {
24
+ beforeInit: (0, define_1.defineEvent)({
25
+ id: "global.resources.beforeInit",
26
+ }),
27
+ afterInit: (0, define_1.defineEvent)({
28
+ id: "global.resources.afterInit",
29
+ }),
30
+ onError: (0, define_1.defineEvent)({
31
+ id: "global.resources.onError",
32
+ }),
33
+ },
34
+ };
35
+ exports.globalEventsArray = [
36
+ exports.globalEvents.beforeInit,
37
+ exports.globalEvents.afterInit,
38
+ exports.globalEvents.tasks.beforeRun,
39
+ exports.globalEvents.tasks.afterRun,
40
+ exports.globalEvents.tasks.onError,
41
+ exports.globalEvents.resources.beforeInit,
42
+ exports.globalEvents.resources.afterInit,
43
+ exports.globalEvents.resources.onError,
44
+ ];
45
+ //# sourceMappingURL=globalEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globalEvents.js","sourceRoot":"","sources":["../src/globalEvents.ts"],"names":[],"mappings":";;;AAAA,qCAAuC;AAG1B,QAAA,YAAY,GAAG;IAC1B,UAAU,EAAE,IAAA,oBAAW,EAAC;QACtB,EAAE,EAAE,mBAAmB;KACxB,CAAC;IACF,SAAS,EAAE,IAAA,oBAAW,EAAC;QACrB,EAAE,EAAE,kBAAkB;KACvB,CAAC;IACF,KAAK,EAAE;QACL,SAAS,EAAE,IAAA,oBAAW,EAGnB;YACD,EAAE,EAAE,wBAAwB;SAC7B,CAAC;QACF,QAAQ,EAAE,IAAA,oBAAW,EAIlB;YACD,EAAE,EAAE,uBAAuB;SAC5B,CAAC;QACF,OAAO,EAAE,IAAA,oBAAW,EAGjB;YACD,EAAE,EAAE,sBAAsB;SAC3B,CAAC;KACH;IACD,SAAS,EAAE;QACT,UAAU,EAAE,IAAA,oBAAW,EAGpB;YACD,EAAE,EAAE,6BAA6B;SAClC,CAAC;QACF,SAAS,EAAE,IAAA,oBAAW,EAInB;YACD,EAAE,EAAE,4BAA4B;SACjC,CAAC;QACF,OAAO,EAAE,IAAA,oBAAW,EAGjB;YACD,EAAE,EAAE,0BAA0B;SAC/B,CAAC;KACH;CACF,CAAC;AAEW,QAAA,iBAAiB,GAAG;IAC/B,oBAAY,CAAC,UAAU;IACvB,oBAAY,CAAC,SAAS;IACtB,oBAAY,CAAC,KAAK,CAAC,SAAS;IAC5B,oBAAY,CAAC,KAAK,CAAC,QAAQ;IAC3B,oBAAY,CAAC,KAAK,CAAC,OAAO;IAC1B,oBAAY,CAAC,SAAS,CAAC,UAAU;IACjC,oBAAY,CAAC,SAAS,CAAC,SAAS;IAChC,oBAAY,CAAC,SAAS,CAAC,OAAO;CAC/B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { EventManager } from "./EventManager";
2
+ import { Store } from "./Store";
3
+ import { TaskRunner } from "./TaskRunner";
4
+ export declare const globalResources: {
5
+ store: import("./defs").IResource<Store, any, {}>;
6
+ eventManager: import("./defs").IResource<EventManager, any, {}>;
7
+ taskRunner: import("./defs").IResource<TaskRunner, any, {}>;
8
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.globalResources = void 0;
4
+ const define_1 = require("./define");
5
+ exports.globalResources = {
6
+ store: (0, define_1.defineResource)({
7
+ id: "global.store",
8
+ init: async (store) => store,
9
+ }),
10
+ eventManager: (0, define_1.defineResource)({
11
+ id: "global.eventManager",
12
+ init: async (em) => em,
13
+ }),
14
+ taskRunner: (0, define_1.defineResource)({
15
+ id: "global.taskRunner",
16
+ init: async (runner) => runner,
17
+ }),
18
+ };
19
+ //# sourceMappingURL=globalResources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globalResources.js","sourceRoot":"","sources":["../src/globalResources.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAK7B,QAAA,eAAe,GAAG;IAC7B,KAAK,EAAE,IAAA,uBAAc,EAAQ;QAC3B,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK;KAC7B,CAAC;IACF,YAAY,EAAE,IAAA,uBAAc,EAAe;QACzC,EAAE,EAAE,qBAAqB;QACzB,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;KACvB,CAAC;IACF,UAAU,EAAE,IAAA,uBAAc,EAAa;QACrC,EAAE,EAAE,mBAAmB;QACvB,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM;KAC/B,CAAC;CACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { defineTask, defineResource, defineEvent, defineMiddleware } from "./define";
2
+ import { run } from "./run";
3
+ declare const globals: {
4
+ events: {
5
+ beforeInit: import("./defs").IEventDefinition<any>;
6
+ afterInit: import("./defs").IEventDefinition<any>;
7
+ tasks: {
8
+ beforeRun: import("./defs").IEventDefinition<{
9
+ task: import("./defs").ITask<any, any, any>;
10
+ input: any;
11
+ }>;
12
+ afterRun: import("./defs").IEventDefinition<{
13
+ task: import("./defs").ITask<any, any, any>;
14
+ input: any;
15
+ output: any;
16
+ }>;
17
+ onError: import("./defs").IEventDefinition<{
18
+ error: Error;
19
+ task: import("./defs").ITask<any, any, any>;
20
+ }>;
21
+ };
22
+ resources: {
23
+ beforeInit: import("./defs").IEventDefinition<{
24
+ resource: import("./defs").IResource<any, any, any>;
25
+ config: any;
26
+ }>;
27
+ afterInit: import("./defs").IEventDefinition<{
28
+ resource: import("./defs").IResource<any, any, any>;
29
+ config: any;
30
+ value: any;
31
+ }>;
32
+ onError: import("./defs").IEventDefinition<{
33
+ error: Error;
34
+ resource: import("./defs").IResource<any, any, any>;
35
+ }>;
36
+ };
37
+ };
38
+ resources: {
39
+ store: import("./defs").IResource<import("./Store").Store, any, {}>;
40
+ eventManager: import("./defs").IResource<import("./EventManager").EventManager, any, {}>;
41
+ taskRunner: import("./defs").IResource<import("./TaskRunner").TaskRunner, any, {}>;
42
+ };
43
+ };
44
+ export { globals };
45
+ export { defineTask as task, defineResource as resource, defineEvent as event, defineMiddleware as middleware, run, };
46
+ export * as definitions from "./defs";
47
+ export { Store } from "./Store";
48
+ export { EventManager } from "./EventManager";
49
+ export { TaskRunner } from "./TaskRunner";
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TaskRunner = exports.EventManager = exports.Store = exports.definitions = exports.run = exports.middleware = exports.event = exports.resource = exports.task = exports.globals = void 0;
4
+ const define_1 = require("./define");
5
+ Object.defineProperty(exports, "task", { enumerable: true, get: function () { return define_1.defineTask; } });
6
+ Object.defineProperty(exports, "resource", { enumerable: true, get: function () { return define_1.defineResource; } });
7
+ Object.defineProperty(exports, "event", { enumerable: true, get: function () { return define_1.defineEvent; } });
8
+ Object.defineProperty(exports, "middleware", { enumerable: true, get: function () { return define_1.defineMiddleware; } });
9
+ const globalEvents_1 = require("./globalEvents");
10
+ const globalResources_1 = require("./globalResources");
11
+ const run_1 = require("./run");
12
+ Object.defineProperty(exports, "run", { enumerable: true, get: function () { return run_1.run; } });
13
+ const globals = {
14
+ events: globalEvents_1.globalEvents,
15
+ resources: globalResources_1.globalResources,
16
+ };
17
+ exports.globals = globals;
18
+ exports.definitions = require("./defs");
19
+ var Store_1 = require("./Store");
20
+ Object.defineProperty(exports, "Store", { enumerable: true, get: function () { return Store_1.Store; } });
21
+ var EventManager_1 = require("./EventManager");
22
+ Object.defineProperty(exports, "EventManager", { enumerable: true, get: function () { return EventManager_1.EventManager; } });
23
+ var TaskRunner_1 = require("./TaskRunner");
24
+ Object.defineProperty(exports, "TaskRunner", { enumerable: true, get: function () { return TaskRunner_1.TaskRunner; } });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAKkB;AAYF,qFAhBd,mBAAU,OAgBQ;AACA,yFAhBlB,uBAAc,OAgBY;AACX,sFAhBf,oBAAW,OAgBS;AACA,2FAhBpB,yBAAgB,OAgBc;AAdhC,iDAA8C;AAC9C,uDAAoD;AACpD,+BAA4B;AAa1B,oFAbO,SAAG,OAaP;AAXL,MAAM,OAAO,GAAG;IACd,MAAM,EAAE,2BAAY;IACpB,SAAS,EAAE,iCAAe;CAC3B,CAAC;AAEO,0BAAO;AAShB,wCAAsC;AACtC,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,2CAA0C;AAAjC,wGAAA,UAAU,OAAA"}