@pogodisco/task-runner 0.0.1 → 0.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from "./main";
package/dist/main.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ export type LogEvent = "start" | "finish" | "data" | "deferred" | "skipped" | "background" | "parallel" | "success" | "fail";
2
+ export type TaskLogger = (event: LogEvent, key: string, meta?: any) => void;
3
+ export interface SchemaOptions {
4
+ log?: TaskLogger;
5
+ }
6
+ export type TaskState = "pending" | "skipped" | "failed" | "success";
7
+ export type TaskDefinition<F extends (...args: any) => any, T extends TaskMap, I extends Record<string, any>> = {
8
+ fn: F;
9
+ dependencies?: string[];
10
+ abort?: boolean;
11
+ bg?: boolean;
12
+ runIf?: ((results: TaskResultsData<T, I>) => boolean | Promise<boolean>)[];
13
+ argMap?: (results: TaskResultsData<T, I>) => Parameters<F>[0];
14
+ };
15
+ export type TaskMap = Record<string, TaskDefinition<any, any, any>>;
16
+ type SuccessData<T> = T extends {
17
+ ok: true;
18
+ data: infer D;
19
+ } ? D : never;
20
+ export type TaskResultsData<T extends TaskMap, I> = {
21
+ _init: I;
22
+ } & {
23
+ [K in keyof T]: TDResultData<T[K]>;
24
+ };
25
+ type TDResultData<TD extends TaskDefinition<any, any, any>> = TD extends TaskDefinition<infer F, any, any> ? SuccessData<Awaited<ReturnType<F>>> : never;
26
+ export type TasksFromFns<T extends Record<string, (...args: any) => any>> = {
27
+ [K in keyof T]: TaskDefinition<T[K], any, any>;
28
+ };
29
+ export type TaskSchemaWithContracts<T extends TaskMap, I extends Record<string, any>, O> = {
30
+ [K in keyof T]: T[K] extends TaskDefinition<infer F, any, any> ? TaskDefinition<F, T, I> : never;
31
+ } & {
32
+ _init?: I;
33
+ _output: (results: TaskResultsData<T, I>) => O;
34
+ };
35
+ export declare function defineSchema<T extends TaskMap, I extends Record<string, any>, O>(schema: {
36
+ [K in keyof T]: T[K] extends TaskDefinition<infer F, any, any> ? TaskDefinition<F, T, I> : never;
37
+ } & {
38
+ _output: (results: TaskResultsData<T, I>) => O;
39
+ }): TaskSchemaWithContracts<T, I, O>;
40
+ export declare const runSchema: <T extends TaskMap, I extends Record<string, any>, O>(schema: TaskSchemaWithContracts<T, I, O>, initArgs: I, options?: SchemaOptions | undefined) => Promise<import("@pogodisco/response").TResponse<{
41
+ _output: O;
42
+ _status: Record<keyof T, TaskState>;
43
+ }>>;
44
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
package/dist/main.js ADDED
@@ -0,0 +1,154 @@
1
+ import { isFailure, isSuccess, withResponse, } from "@pogodisco/response";
2
+ // --- defineSchema ---
3
+ export function defineSchema(schema) {
4
+ preflightCheck(schema);
5
+ return schema;
6
+ }
7
+ // --- preflight check ---
8
+ function preflightCheck(schema) {
9
+ const keys = new Set();
10
+ for (const key in schema) {
11
+ if (key === "_output" || key === "_init")
12
+ continue;
13
+ if (keys.has(key))
14
+ throw new Error(`Duplicate task key: ${key}`);
15
+ keys.add(key);
16
+ const task = schema[key];
17
+ if (!task)
18
+ continue;
19
+ if (task.abort === undefined)
20
+ task.abort = true;
21
+ if (task.bg === undefined)
22
+ task.bg = false;
23
+ if (task.runIf === undefined)
24
+ task.runIf = [];
25
+ }
26
+ const visited = new Set();
27
+ const stack = new Set();
28
+ const visit = (taskKey) => {
29
+ if (taskKey === "_output" || taskKey === "_init")
30
+ return;
31
+ if (stack.has(taskKey))
32
+ throw new Error(`Circular dependency: ${[...stack, taskKey].join(" -> ")}`);
33
+ if (visited.has(taskKey))
34
+ return;
35
+ stack.add(taskKey);
36
+ const task = schema[taskKey];
37
+ const deps = task?.dependencies ?? [];
38
+ for (const dep of deps) {
39
+ if (!(dep in schema))
40
+ throw new Error(`Task "${taskKey}" depends on unknown "${dep}"`);
41
+ visit(dep);
42
+ }
43
+ stack.delete(taskKey);
44
+ visited.add(taskKey);
45
+ };
46
+ for (const key of Object.keys(schema))
47
+ visit(key);
48
+ }
49
+ // --- mark dependents skipped ---
50
+ function markDependentsSkipped(schema, status, key) {
51
+ for (const k of Object.keys(schema)) {
52
+ const task = schema[k];
53
+ if ((task.dependencies ?? []).includes(key) &&
54
+ status[k] === "pending") {
55
+ status[k] = "skipped";
56
+ markDependentsSkipped(schema, status, k);
57
+ }
58
+ }
59
+ }
60
+ // --- runSchema, storing **only success data** ---
61
+ export const runSchema = withResponse(async (schema, initArgs, options) => {
62
+ try {
63
+ const logger = options?.log;
64
+ const localSchema = {
65
+ ...schema,
66
+ _init: { fn: (x) => x, argMap: () => initArgs },
67
+ };
68
+ const taskKeys = Object.keys(localSchema).filter((k) => k !== "_output" && k !== "_init");
69
+ const results = {
70
+ _init: initArgs,
71
+ };
72
+ const status = {};
73
+ for (const key of taskKeys)
74
+ status[key] = "pending";
75
+ let progress = true;
76
+ let safety = 0;
77
+ const maxIterations = taskKeys.length * 2;
78
+ while (progress && safety < maxIterations) {
79
+ progress = false;
80
+ safety++;
81
+ for (const key of taskKeys) {
82
+ const task = localSchema[key];
83
+ if (status[key] !== "pending")
84
+ continue;
85
+ const deps = task.dependencies ?? [];
86
+ if (!deps.every((d) => status[d] === "success"))
87
+ continue;
88
+ if (task.runIf?.length) {
89
+ const runIfResults = await Promise.all(task.runIf.map((fn) => fn(results)));
90
+ if (!runIfResults.every(Boolean)) {
91
+ status[key] = "skipped";
92
+ logger?.("skipped", String(key), {
93
+ reason: "runIf",
94
+ results: runIfResults,
95
+ });
96
+ markDependentsSkipped(localSchema, status, key);
97
+ continue;
98
+ }
99
+ }
100
+ const args = task.argMap?.(results);
101
+ if (task.bg) {
102
+ logger?.("background", String(key), args);
103
+ Promise.resolve().then(async () => {
104
+ try {
105
+ await (args !== undefined ? task.fn(args) : task.fn());
106
+ logger?.("success", String(key));
107
+ }
108
+ catch (err) {
109
+ logger?.("fail", String(key), err);
110
+ }
111
+ });
112
+ status[key] = "success";
113
+ results[key] = undefined;
114
+ progress = true;
115
+ continue;
116
+ }
117
+ logger?.("start", String(key), args);
118
+ try {
119
+ const result = args !== undefined ? await task.fn(args) : await task.fn();
120
+ if (isFailure(result)) {
121
+ status[key] = "failed";
122
+ logger?.("fail", String(key), result);
123
+ if (task.abort)
124
+ throw result;
125
+ }
126
+ else if (isSuccess(result)) {
127
+ status[key] = "success";
128
+ results[key] = result.data;
129
+ logger?.("success", String(key), result);
130
+ }
131
+ }
132
+ catch (err) {
133
+ status[key] = "failed";
134
+ logger?.("fail", String(key), err);
135
+ if (task.abort)
136
+ throw err;
137
+ }
138
+ progress = true;
139
+ }
140
+ }
141
+ const pendingKeys = taskKeys.filter((k) => status[k] === "pending");
142
+ if (pendingKeys.length)
143
+ throw new Error(`Unresolved tasks (possible circular deps): ${pendingKeys.join(", ")}`);
144
+ const output = schema._output(results);
145
+ logger?.("finish", "_schema", { results, status, output });
146
+ return { _output: output, _status: status };
147
+ }
148
+ catch (err) {
149
+ throw err;
150
+ }
151
+ });
152
+ /// utility fn wrapper around runSchema
153
+ //
154
+ //
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pogodisco/task-runner",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -22,6 +22,9 @@
22
22
  "types": "./dist/index.d.ts"
23
23
  }
24
24
  },
25
+ "files": [
26
+ "dist"
27
+ ],
25
28
  "scripts": {
26
29
  "prepublishOnly": "npm run build",
27
30
  "build": "tsc",
package/src/main.ts DELETED
@@ -1,283 +0,0 @@
1
- import {
2
- isFailure,
3
- isSuccess,
4
- withResponse,
5
- type SuccessResponse,
6
- } from "@pogodisco/response";
7
-
8
- // --- logging / options ---
9
- export type LogEvent =
10
- | "start"
11
- | "finish"
12
- | "data"
13
- | "deferred"
14
- | "skipped"
15
- | "background"
16
- | "parallel"
17
- | "success"
18
- | "fail";
19
-
20
- export type TaskLogger = (event: LogEvent, key: string, meta?: any) => void;
21
-
22
- export interface SchemaOptions {
23
- log?: TaskLogger;
24
- }
25
-
26
- // --- core types ---
27
- export type TaskState = "pending" | "skipped" | "failed" | "success";
28
-
29
- // --- task definition ---
30
- export type TaskDefinition<
31
- F extends (...args: any) => any,
32
- T extends TaskMap,
33
- I extends Record<string, any>,
34
- > = {
35
- fn: F;
36
- dependencies?: string[];
37
- abort?: boolean;
38
- bg?: boolean;
39
- runIf?: ((results: TaskResultsData<T, I>) => boolean | Promise<boolean>)[];
40
- argMap?: (results: TaskResultsData<T, I>) => Parameters<F>[0];
41
- };
42
-
43
- export type TaskMap = Record<string, TaskDefinition<any, any, any>>;
44
-
45
- type TaskFnResult<TD extends TaskDefinition<any, any, any>> = Awaited<
46
- ReturnType<TD["fn"]>
47
- >;
48
-
49
- type SuccessData<T> = T extends { ok: true; data: infer D } ? D : never;
50
-
51
- // --- **results only store unwrapped success data** ---
52
- // export type TaskResultsData<T extends TaskMap, I> = { _init: I } & {
53
- // [K in keyof T]: TDResultData<T[K]>;
54
- // };
55
-
56
- export type TaskResultsData<T extends TaskMap, I> = { _init: I } & {
57
- [K in keyof T]: TDResultData<T[K]>;
58
- };
59
-
60
- type TDResultData<TD extends TaskDefinition<any, any, any>> =
61
- TD extends TaskDefinition<infer F, any, any>
62
- ? SuccessData<Awaited<ReturnType<F>>>
63
- : never;
64
-
65
- type ReturnTypeSuccessData<F extends (...args: any) => any> = Awaited<
66
- ReturnType<F>
67
- > extends SuccessResponse<infer D>
68
- ? D
69
- : never;
70
-
71
- // --- helper to create task definitions from functions ---
72
- export type TasksFromFns<T extends Record<string, (...args: any) => any>> = {
73
- [K in keyof T]: TaskDefinition<T[K], any, any>;
74
- };
75
-
76
- // --- typed schema ---
77
- export type TaskSchemaWithContracts<T extends TaskMap, I, O> = {
78
- [K in keyof T]: T[K] extends TaskDefinition<infer F, any, any>
79
- ? TaskDefinition<F, T, I>
80
- : never;
81
- } & {
82
- _init?: I;
83
- _output: (results: TaskResultsData<T, I>) => O;
84
- };
85
-
86
- // --- defineSchema ---
87
- export function defineSchema<T extends TaskMap, I, O>(
88
- schema: {
89
- [K in keyof T]: T[K] extends TaskDefinition<infer F, any, any>
90
- ? TaskDefinition<F, T, I>
91
- : never;
92
- } & { _output: (results: TaskResultsData<T, I>) => O },
93
- ): TaskSchemaWithContracts<T, I, O> {
94
- preflightCheck(schema);
95
- return schema as any;
96
- }
97
-
98
- // --- preflight check ---
99
- function preflightCheck<T extends TaskMap>(
100
- schema: T | (T & { _output?: any }),
101
- ) {
102
- const keys = new Set<string>();
103
- for (const key in schema) {
104
- if (key === "_output" || key === "_init") continue;
105
- if (keys.has(key)) throw new Error(`Duplicate task key: ${key}`);
106
- keys.add(key);
107
-
108
- const task = (schema as T)[key];
109
- if (!task) continue;
110
- if (task.abort === undefined) task.abort = true;
111
- if (task.bg === undefined) task.bg = false;
112
- if (task.runIf === undefined) task.runIf = [];
113
- }
114
-
115
- const visited = new Set<string>();
116
- const stack = new Set<string>();
117
- const visit = (taskKey: string) => {
118
- if (taskKey === "_output" || taskKey === "_init") return;
119
- if (stack.has(taskKey))
120
- throw new Error(
121
- `Circular dependency: ${[...stack, taskKey].join(" -> ")}`,
122
- );
123
- if (visited.has(taskKey)) return;
124
-
125
- stack.add(taskKey);
126
- const task = (schema as T)[taskKey];
127
- const deps = task?.dependencies ?? [];
128
- for (const dep of deps) {
129
- if (!(dep in schema))
130
- throw new Error(`Task "${taskKey}" depends on unknown "${dep}"`);
131
- visit(dep);
132
- }
133
- stack.delete(taskKey);
134
- visited.add(taskKey);
135
- };
136
-
137
- for (const key of Object.keys(schema)) visit(key);
138
- }
139
-
140
- // --- mark dependents skipped ---
141
- function markDependentsSkipped<T extends TaskMap>(
142
- schema: T,
143
- status: Record<keyof T, TaskState>,
144
- key: keyof T,
145
- ) {
146
- for (const k of Object.keys(schema) as (keyof T)[]) {
147
- const task = schema[k];
148
- if (
149
- (task.dependencies ?? []).includes(key as string) &&
150
- status[k] === "pending"
151
- ) {
152
- status[k] = "skipped";
153
- markDependentsSkipped(schema, status, k);
154
- }
155
- }
156
- }
157
-
158
- // --- runSchema, storing **only success data** ---
159
- export const runSchema = withResponse(
160
- async <T extends TaskMap, I, O>(
161
- schema: TaskSchemaWithContracts<T, I, O>,
162
- initArgs: I,
163
- options?: SchemaOptions,
164
- ): Promise<{ _output: O; _status: Record<keyof T, TaskState> }> => {
165
- try {
166
- const logger: TaskLogger | undefined = options?.log;
167
-
168
- const localSchema = {
169
- ...schema,
170
- _init: { fn: (x: I) => x, argMap: () => initArgs },
171
- } as unknown as T & { _init: TaskDefinition<(x: I) => I, T, I> };
172
-
173
- const taskKeys = Object.keys(localSchema).filter(
174
- (k) => k !== "_output" && k !== "_init",
175
- ) as (keyof typeof localSchema)[];
176
-
177
- const results: Partial<TaskResultsData<T, I>> = {
178
- _init: initArgs,
179
- } as any;
180
-
181
- const status: { [K in keyof typeof localSchema]?: TaskState } = {};
182
- for (const key of taskKeys) status[key] = "pending";
183
-
184
- let progress = true;
185
- let safety = 0;
186
- const maxIterations = taskKeys.length * 2;
187
-
188
- while (progress && safety < maxIterations) {
189
- progress = false;
190
- safety++;
191
-
192
- for (const key of taskKeys) {
193
- const task = localSchema[key];
194
- if (status[key] !== "pending") continue;
195
-
196
- const deps = task.dependencies ?? [];
197
- if (
198
- !deps.every(
199
- (d) => status[d as keyof typeof localSchema] === "success",
200
- )
201
- )
202
- continue;
203
-
204
- if (task.runIf?.length) {
205
- const runIfResults = await Promise.all(
206
- task.runIf.map((fn) => fn(results as TaskResultsData<T, I>)),
207
- );
208
- if (!runIfResults.every(Boolean)) {
209
- status[key] = "skipped";
210
- logger?.("skipped", String(key), {
211
- reason: "runIf",
212
- results: runIfResults,
213
- });
214
- markDependentsSkipped(localSchema, status as any, key as any);
215
- continue;
216
- }
217
- }
218
-
219
- const args = task.argMap?.(results as TaskResultsData<T, I>);
220
-
221
- if (task.bg) {
222
- logger?.("background", String(key), args);
223
- Promise.resolve().then(async () => {
224
- try {
225
- await (args !== undefined ? task.fn(args) : task.fn());
226
- logger?.("success", String(key));
227
- } catch (err) {
228
- logger?.("fail", String(key), err);
229
- }
230
- });
231
- status[key] = "success";
232
- (results as any)[key] = undefined;
233
- progress = true;
234
- continue;
235
- }
236
-
237
- logger?.("start", String(key), args);
238
-
239
- try {
240
- const result =
241
- args !== undefined ? await task.fn(args) : await task.fn();
242
-
243
- if (isFailure(result)) {
244
- status[key] = "failed";
245
- logger?.("fail", String(key), result);
246
- if (task.abort) throw result;
247
- } else if (isSuccess(result)) {
248
- status[key] = "success";
249
- (results as any)[key] = result.data; // ✅ unwrap data automatically
250
- logger?.("success", String(key), result);
251
- }
252
- } catch (err) {
253
- status[key] = "failed";
254
- logger?.("fail", String(key), err);
255
- if (task.abort) throw err;
256
- }
257
-
258
- progress = true;
259
- }
260
- }
261
-
262
- const pendingKeys = taskKeys.filter(
263
- (k) => status[k as keyof typeof status] === "pending",
264
- );
265
- if (pendingKeys.length)
266
- throw new Error(
267
- `Unresolved tasks (possible circular deps): ${pendingKeys.join(", ")}`,
268
- );
269
-
270
- const output = schema._output(results as TaskResultsData<T, I>);
271
- logger?.("finish", "_schema", { results, status, output });
272
-
273
- return { _output: output, _status: status as Record<keyof T, TaskState> };
274
- } catch (err) {
275
- console.error("🔥 runSchema crashed before finish:", err);
276
- throw err;
277
- }
278
- },
279
- );
280
-
281
- /// utility fn wrapper around runSchema
282
- //
283
- //
package/tsconfig.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "composite": true,
4
- "declaration": true,
5
- "declarationMap": true,
6
- "outDir": "dist",
7
- "rootDir": "src",
8
- "module": "ESNext",
9
- "target": "ESNext",
10
- "moduleResolution": "Node",
11
- "skipLibCheck": true
12
- },
13
- "include": ["src"],
14
- "exclude": ["dist", "node_modules"]
15
- }
File without changes