@forgehive/task 0.1.6 → 0.1.7
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/index.d.ts +25 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -75
- package/dist/index.js.map +1 -1
- package/dist/test/safe-run.test.js +55 -29
- package/dist/test/safe-run.test.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +102 -86
- package/src/test/safe-run.test.ts +58 -31
package/dist/index.d.ts
CHANGED
|
@@ -27,7 +27,29 @@ export interface TaskRecord<InputType = unknown, OutputType = unknown> {
|
|
|
27
27
|
/** Boundary execution data */
|
|
28
28
|
boundaries?: Record<string, unknown>;
|
|
29
29
|
}
|
|
30
|
+
export type BoundaryLog<I extends unknown[] = unknown[], O = unknown> = {
|
|
31
|
+
input: I;
|
|
32
|
+
output: O | null;
|
|
33
|
+
error: string | null;
|
|
34
|
+
};
|
|
35
|
+
export type BoundaryLogsFor<B extends Boundaries> = {
|
|
36
|
+
[K in keyof B]: B[K] extends (...args: infer I) => Promise<infer O> ? BoundaryLog<I, O>[] : BoundaryLog[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Represents the execution record of a task, including input, output, error, and boundary data
|
|
40
|
+
*/
|
|
41
|
+
export interface ExecutionRecord<InputType = unknown, OutputType = unknown, B extends Boundaries = Boundaries> {
|
|
42
|
+
/** The input arguments passed to the task */
|
|
43
|
+
input: InputType;
|
|
44
|
+
/** The output returned by the task (if successful) */
|
|
45
|
+
output?: OutputType | null;
|
|
46
|
+
/** The error message if the task failed */
|
|
47
|
+
error?: string;
|
|
48
|
+
/** Boundary execution data */
|
|
49
|
+
boundaries: BoundaryLogsFor<B>;
|
|
50
|
+
}
|
|
30
51
|
export interface TaskInstanceType<Func extends BaseFunction = BaseFunction, B extends Boundaries = Boundaries> {
|
|
52
|
+
version: string;
|
|
31
53
|
getMode: () => Mode;
|
|
32
54
|
setMode: (mode: Mode) => void;
|
|
33
55
|
setSchema: (base: Schema<Record<string, SchemaType>>) => void;
|
|
@@ -48,7 +70,7 @@ export interface TaskInstanceType<Func extends BaseFunction = BaseFunction, B ex
|
|
|
48
70
|
resetMock: <K extends keyof B>(name: K) => void;
|
|
49
71
|
resetMocks: () => void;
|
|
50
72
|
run: (argv?: Parameters<Func>[0]) => Promise<ReturnType<Func>>;
|
|
51
|
-
safeRun: (argv?: Parameters<Func>[0]) => Promise<[
|
|
73
|
+
safeRun: (argv?: Parameters<Func>[0]) => Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>;
|
|
52
74
|
}
|
|
53
75
|
export type InferSchemaType<S> = S extends Schema<any> ? InferSchema<S> : Record<string, unknown>;
|
|
54
76
|
export type TaskFunction<S, B extends Boundaries> = (argv: InferSchemaType<S>, boundaries: WrappedBoundaries<B>) => Promise<any>;
|
|
@@ -58,6 +80,7 @@ type BoundaryData = Array<{
|
|
|
58
80
|
}>;
|
|
59
81
|
export declare const Task: {
|
|
60
82
|
new <B extends Boundaries = Boundaries, Func extends BaseFunction = BaseFunction>(fn: Func, conf?: TaskConfig<B>): {
|
|
83
|
+
version: string;
|
|
61
84
|
_fn: Func;
|
|
62
85
|
_mode: Mode;
|
|
63
86
|
_coolDown: number;
|
|
@@ -104,7 +127,7 @@ export declare const Task: {
|
|
|
104
127
|
mode?: Mode;
|
|
105
128
|
}): WrappedBoundaries<B>;
|
|
106
129
|
asBoundary(): (args: Parameters<Func>[0]) => Promise<ReturnType<Func>>;
|
|
107
|
-
safeRun(argv?: Parameters<Func>[0]): Promise<[
|
|
130
|
+
safeRun(argv?: Parameters<Func>[0]): Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>;
|
|
108
131
|
run(argv?: Parameters<Func>[0]): Promise<ReturnType<Func>>;
|
|
109
132
|
};
|
|
110
133
|
};
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ const Task = class Task {
|
|
|
13
13
|
boundariesData: undefined
|
|
14
14
|
}) {
|
|
15
15
|
var _a, _b, _c;
|
|
16
|
+
this.version = '0.1.7';
|
|
16
17
|
this._accumulatedBoundariesData = {};
|
|
17
18
|
// For storing mocks
|
|
18
19
|
this._boundaryMocks = {};
|
|
@@ -173,27 +174,11 @@ const Task = class Task {
|
|
|
173
174
|
}
|
|
174
175
|
async safeRun(argv) {
|
|
175
176
|
var _a;
|
|
176
|
-
//
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const errorDetails = (_a = validation.error) === null || _a === void 0 ? void 0 : _a.errors.map(err => `${err.path.join('.')}: ${err.message}`).join(', ');
|
|
182
|
-
const errorMessage = errorDetails
|
|
183
|
-
? `Invalid input on: ${errorDetails}`
|
|
184
|
-
: 'Invalid input';
|
|
185
|
-
// Emit the validation error
|
|
186
|
-
this.emit({
|
|
187
|
-
input: argv,
|
|
188
|
-
error: errorMessage
|
|
189
|
-
});
|
|
190
|
-
return [new Error(errorMessage), null, null];
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
catch (error) {
|
|
194
|
-
return [error instanceof Error ? error : new Error(String(error)), null, null];
|
|
195
|
-
}
|
|
196
|
-
}
|
|
177
|
+
// Initialize log item
|
|
178
|
+
const logItem = {
|
|
179
|
+
input: argv,
|
|
180
|
+
boundaries: {}
|
|
181
|
+
};
|
|
197
182
|
// Create fresh boundaries for this execution
|
|
198
183
|
const executionBoundaries = this._createBounderies({
|
|
199
184
|
definition: this._boundariesDefinition,
|
|
@@ -205,67 +190,64 @@ const Task = class Task {
|
|
|
205
190
|
const boundary = executionBoundaries[name];
|
|
206
191
|
boundary.startRun();
|
|
207
192
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
//
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
// Get the current accumulated data for this boundary
|
|
223
|
-
const currentData = this._accumulatedBoundariesData[name];
|
|
224
|
-
// Add the new run data
|
|
225
|
-
if (Array.isArray(runData) && runData.length > 0) {
|
|
226
|
-
// Cast the run data to the correct type
|
|
227
|
-
this._accumulatedBoundariesData[name] = [...currentData, ...runData];
|
|
193
|
+
// Handle schema validation
|
|
194
|
+
if (this._schema) {
|
|
195
|
+
const validation = this._schema.safeParse(argv);
|
|
196
|
+
if (!validation.success) {
|
|
197
|
+
const errorDetails = (_a = validation.error) === null || _a === void 0 ? void 0 : _a.errors.map(err => `${err.path.join('.')}: ${err.message}`).join(', ');
|
|
198
|
+
const errorMessage = errorDetails
|
|
199
|
+
? `Invalid input on: ${errorDetails}`
|
|
200
|
+
: 'Invalid input';
|
|
201
|
+
logItem.error = errorMessage;
|
|
202
|
+
logItem.boundaries = {};
|
|
203
|
+
// Add boundary elements empty
|
|
204
|
+
for (const name in executionBoundaries) {
|
|
205
|
+
logItem.boundaries[name] = [];
|
|
228
206
|
}
|
|
207
|
+
this.emit(logItem);
|
|
208
|
+
return [null, new Error(errorMessage), logItem];
|
|
229
209
|
}
|
|
230
|
-
// Emit the success event with boundary data
|
|
231
|
-
this.emit({
|
|
232
|
-
input: argv,
|
|
233
|
-
output,
|
|
234
|
-
boundaries: boundariesRunLog
|
|
235
|
-
});
|
|
236
|
-
return [null, output, boundariesRunLog];
|
|
237
210
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
211
|
+
let output = null;
|
|
212
|
+
let error = null;
|
|
213
|
+
try {
|
|
214
|
+
// Execute the task function
|
|
215
|
+
output = await this._fn(argv, executionBoundaries);
|
|
216
|
+
logItem.output = output;
|
|
217
|
+
}
|
|
218
|
+
catch (caughtError) {
|
|
219
|
+
const errorMessage = caughtError instanceof Error ? caughtError.message : String(caughtError);
|
|
220
|
+
logItem.error = errorMessage;
|
|
221
|
+
error = new Error(errorMessage);
|
|
222
|
+
}
|
|
223
|
+
// Process boundary data after execution (both success and error cases)
|
|
224
|
+
const boundariesRunLog = {};
|
|
225
|
+
for (const name in executionBoundaries) {
|
|
226
|
+
const boundary = executionBoundaries[name];
|
|
227
|
+
const runData = boundary.getRunData();
|
|
228
|
+
// Add to the run log
|
|
229
|
+
boundariesRunLog[name] = runData;
|
|
230
|
+
// Accumulate in the task's total boundaries data
|
|
231
|
+
if (!this._accumulatedBoundariesData[name]) {
|
|
232
|
+
this._accumulatedBoundariesData[name] = [];
|
|
233
|
+
}
|
|
234
|
+
// Get the current accumulated data for this boundary
|
|
235
|
+
const currentData = this._accumulatedBoundariesData[name];
|
|
236
|
+
// Add the new run data
|
|
237
|
+
if (Array.isArray(runData) && runData.length > 0) {
|
|
238
|
+
// Cast the run data to the correct type
|
|
239
|
+
this._accumulatedBoundariesData[name] = [...currentData, ...runData];
|
|
257
240
|
}
|
|
258
|
-
// Emit the error event with boundary data
|
|
259
|
-
this.emit({
|
|
260
|
-
input: argv,
|
|
261
|
-
error: error instanceof Error ? error.message : String(error),
|
|
262
|
-
boundaries: boundariesRunLog
|
|
263
|
-
});
|
|
264
|
-
return [error instanceof Error ? error : new Error(String(error)), null, boundariesRunLog];
|
|
265
241
|
}
|
|
242
|
+
// Set boundaries in log item before emitting
|
|
243
|
+
logItem.boundaries = boundariesRunLog;
|
|
244
|
+
// Emit the log item
|
|
245
|
+
this.emit(logItem);
|
|
246
|
+
// Return the error, output and log item
|
|
247
|
+
return [output, error, logItem];
|
|
266
248
|
}
|
|
267
249
|
async run(argv) {
|
|
268
|
-
const [
|
|
250
|
+
const [result, error] = await this.safeRun(argv);
|
|
269
251
|
if (error) {
|
|
270
252
|
throw error;
|
|
271
253
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const index_1 = require("../index");
|
|
4
4
|
describe('Task safeRun tests', () => {
|
|
5
|
-
it('returns [
|
|
5
|
+
it('returns [result, null, record] on successful execution', async () => {
|
|
6
6
|
// Create a simple schema
|
|
7
7
|
const schema = new index_1.Schema({
|
|
8
8
|
value: index_1.Schema.number()
|
|
@@ -19,14 +19,20 @@ describe('Task safeRun tests', () => {
|
|
|
19
19
|
return { result, success: true };
|
|
20
20
|
});
|
|
21
21
|
// Call safeRun with valid input
|
|
22
|
-
const [
|
|
22
|
+
const [result, error, record] = await successTask.safeRun({ value: 5 });
|
|
23
23
|
// Verify success case
|
|
24
24
|
expect(error).toBeNull();
|
|
25
25
|
expect(result).toEqual({ result: 10, success: true });
|
|
26
|
-
expect(
|
|
27
|
-
expect(
|
|
26
|
+
expect(record).not.toBeNull();
|
|
27
|
+
expect(record).toHaveProperty('boundaries.fetchData');
|
|
28
|
+
expect(record.boundaries.fetchData).toHaveLength(1);
|
|
29
|
+
// useful to check types on record
|
|
30
|
+
const data = record.boundaries.fetchData[0];
|
|
31
|
+
expect(data.input).toEqual([5]);
|
|
32
|
+
expect(data.output).toEqual(10);
|
|
33
|
+
expect(data.error).toBeUndefined();
|
|
28
34
|
});
|
|
29
|
-
it('returns [
|
|
35
|
+
it('returns [null, error, record] on failed execution', async () => {
|
|
30
36
|
// Create a simple schema
|
|
31
37
|
const schema = new index_1.Schema({
|
|
32
38
|
value: index_1.Schema.number()
|
|
@@ -46,15 +52,23 @@ describe('Task safeRun tests', () => {
|
|
|
46
52
|
return { result, success: true };
|
|
47
53
|
});
|
|
48
54
|
// Call safeRun with problematic input that will cause an error
|
|
49
|
-
const [
|
|
55
|
+
const [result, error, record] = await errorTask.safeRun({ value: -5 });
|
|
50
56
|
// Verify error case
|
|
51
|
-
expect(error).
|
|
52
|
-
expect(error
|
|
57
|
+
expect(error).not.toBeNull();
|
|
58
|
+
expect(error instanceof Error).toBe(true);
|
|
59
|
+
if (error instanceof Error) {
|
|
60
|
+
expect(error.message).toContain('Value cannot be negative');
|
|
61
|
+
}
|
|
53
62
|
expect(result).toBeNull();
|
|
54
|
-
expect(
|
|
55
|
-
expect(
|
|
63
|
+
expect(record).not.toBeNull();
|
|
64
|
+
expect(record).toHaveProperty('boundaries.fetchData');
|
|
65
|
+
expect(record.boundaries.fetchData).toHaveLength(1);
|
|
66
|
+
const data = record.boundaries.fetchData[0];
|
|
67
|
+
expect(data.input).toEqual([-5]);
|
|
68
|
+
expect(data.error).toContain('Value cannot be negative');
|
|
69
|
+
expect(data.output).toBeUndefined();
|
|
56
70
|
});
|
|
57
|
-
it('returns [
|
|
71
|
+
it('returns [null, error, record] on schema validation failure', async () => {
|
|
58
72
|
// Create a schema that requires a positive number
|
|
59
73
|
const schema = new index_1.Schema({
|
|
60
74
|
value: index_1.Schema.number().min(1, 'Value must be positive')
|
|
@@ -71,12 +85,20 @@ describe('Task safeRun tests', () => {
|
|
|
71
85
|
return { result, success: true };
|
|
72
86
|
});
|
|
73
87
|
// Call safeRun with invalid input that will fail schema validation
|
|
74
|
-
const [
|
|
88
|
+
const [result, error, record] = await validationTask.safeRun({ value: 0 });
|
|
75
89
|
// Verify validation error case
|
|
76
90
|
expect(error).toBeInstanceOf(Error);
|
|
77
|
-
expect(error
|
|
91
|
+
expect(error instanceof Error).toBe(true);
|
|
92
|
+
if (error instanceof Error) {
|
|
93
|
+
expect(error.message).toContain('Value must be positive');
|
|
94
|
+
}
|
|
78
95
|
expect(result).toBeNull();
|
|
79
|
-
expect(
|
|
96
|
+
expect(record).not.toBeNull();
|
|
97
|
+
expect(record.input).toEqual({ value: 0 });
|
|
98
|
+
expect(record.error).toContain('Value must be positive');
|
|
99
|
+
expect(record.boundaries).toEqual({
|
|
100
|
+
fetchData: []
|
|
101
|
+
});
|
|
80
102
|
});
|
|
81
103
|
it('properly calls the listener with safeRun and run', async () => {
|
|
82
104
|
// Create a schema
|
|
@@ -106,12 +128,18 @@ describe('Task safeRun tests', () => {
|
|
|
106
128
|
// First call should be for safeRun with value 10
|
|
107
129
|
expect(originalListener).toHaveBeenNthCalledWith(1, expect.objectContaining({
|
|
108
130
|
input: { value: 10 },
|
|
109
|
-
output: 20
|
|
131
|
+
output: 20,
|
|
132
|
+
boundaries: {
|
|
133
|
+
fetchData: expect.any(Array)
|
|
134
|
+
}
|
|
110
135
|
}));
|
|
111
136
|
// Second call should be for run with value 20
|
|
112
137
|
expect(originalListener).toHaveBeenNthCalledWith(2, expect.objectContaining({
|
|
113
138
|
input: { value: 20 },
|
|
114
|
-
output: 40
|
|
139
|
+
output: 40,
|
|
140
|
+
boundaries: {
|
|
141
|
+
fetchData: expect.any(Array)
|
|
142
|
+
}
|
|
115
143
|
}));
|
|
116
144
|
});
|
|
117
145
|
it('handles multiple boundary calls correctly', async () => {
|
|
@@ -135,25 +163,23 @@ describe('Task safeRun tests', () => {
|
|
|
135
163
|
return { doubled, total };
|
|
136
164
|
});
|
|
137
165
|
// Call safeRun
|
|
138
|
-
const [
|
|
166
|
+
const [result, error, record] = await multiBoundaryTask.safeRun({ values: [1, 2, 3] });
|
|
139
167
|
// Verify success
|
|
140
168
|
expect(error).toBeNull();
|
|
141
169
|
expect(result).toEqual({
|
|
142
170
|
doubled: [2, 4, 6],
|
|
143
171
|
total: 12
|
|
144
172
|
});
|
|
145
|
-
// Verify
|
|
146
|
-
expect(
|
|
147
|
-
expect(
|
|
148
|
-
expect(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
expect(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
expect(
|
|
155
|
-
// @ts-expect-error - we know the boundaryLogs is not null here
|
|
156
|
-
expect(boundaryLogs.sumValues[0].input).toEqual([[2, 4, 6]]);
|
|
173
|
+
// Verify record structure
|
|
174
|
+
expect(record).not.toBeNull();
|
|
175
|
+
expect(record).toHaveProperty('boundaries.doubleValue');
|
|
176
|
+
expect(record).toHaveProperty('boundaries.sumValues');
|
|
177
|
+
expect(record.boundaries.doubleValue).toHaveLength(3);
|
|
178
|
+
expect(record.boundaries.sumValues).toHaveLength(1);
|
|
179
|
+
expect(record.boundaries.doubleValue[0]).toEqual({ input: [1], output: 2 });
|
|
180
|
+
expect(record.boundaries.doubleValue[1]).toEqual({ input: [2], output: 4 });
|
|
181
|
+
expect(record.boundaries.doubleValue[2]).toEqual({ input: [3], output: 6 });
|
|
182
|
+
expect(record.boundaries.sumValues[0]).toEqual({ input: [[2, 4, 6]], output: 12 });
|
|
157
183
|
});
|
|
158
184
|
});
|
|
159
185
|
//# sourceMappingURL=safe-run.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-run.test.js","sourceRoot":"","sources":["../../src/test/safe-run.test.ts"],"names":[],"mappings":";;AAAA,oCAA6C;AAE7C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"safe-run.test.js","sourceRoot":"","sources":["../../src/test/safe-run.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -38,7 +38,37 @@ export interface TaskRecord<InputType = unknown, OutputType = unknown> {
|
|
|
38
38
|
boundaries?: Record<string, unknown>;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
// Make BoundaryLog generic
|
|
42
|
+
export type BoundaryLog<I extends unknown[] = unknown[], O = unknown> = {
|
|
43
|
+
input: I
|
|
44
|
+
output: O | null
|
|
45
|
+
error: string | null
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Mapped type for boundaries
|
|
49
|
+
export type BoundaryLogsFor<B extends Boundaries> = {
|
|
50
|
+
[K in keyof B]: B[K] extends (...args: infer I) => Promise<infer O>
|
|
51
|
+
? BoundaryLog<I, O>[]
|
|
52
|
+
: BoundaryLog[]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Represents the execution record of a task, including input, output, error, and boundary data
|
|
57
|
+
*/
|
|
58
|
+
export interface ExecutionRecord<InputType = unknown, OutputType = unknown, B extends Boundaries = Boundaries> {
|
|
59
|
+
/** The input arguments passed to the task */
|
|
60
|
+
input: InputType
|
|
61
|
+
/** The output returned by the task (if successful) */
|
|
62
|
+
output?: OutputType | null
|
|
63
|
+
/** The error message if the task failed */
|
|
64
|
+
error?: string
|
|
65
|
+
/** Boundary execution data */
|
|
66
|
+
boundaries: BoundaryLogsFor<B>
|
|
67
|
+
}
|
|
68
|
+
|
|
41
69
|
export interface TaskInstanceType<Func extends BaseFunction = BaseFunction, B extends Boundaries = Boundaries> {
|
|
70
|
+
version: string
|
|
71
|
+
|
|
42
72
|
getMode: () => Mode
|
|
43
73
|
setMode: (mode: Mode) => void
|
|
44
74
|
setSchema: (base: Schema<Record<string, SchemaType>>) => void
|
|
@@ -68,7 +98,7 @@ export interface TaskInstanceType<Func extends BaseFunction = BaseFunction, B ex
|
|
|
68
98
|
resetMocks: () => void
|
|
69
99
|
|
|
70
100
|
run: (argv?: Parameters<Func>[0]) => Promise<ReturnType<Func>>
|
|
71
|
-
safeRun: (argv?: Parameters<Func>[0]) => Promise<[
|
|
101
|
+
safeRun: (argv?: Parameters<Func>[0]) => Promise<[ReturnType<Func> | null, Error | null, ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>]>
|
|
72
102
|
}
|
|
73
103
|
|
|
74
104
|
// Helper type to infer schema type
|
|
@@ -87,6 +117,8 @@ export const Task = class Task<
|
|
|
87
117
|
B extends Boundaries = Boundaries,
|
|
88
118
|
Func extends BaseFunction = BaseFunction
|
|
89
119
|
> implements TaskInstanceType<Func, B> {
|
|
120
|
+
public version: string = '0.1.7'
|
|
121
|
+
|
|
90
122
|
_fn: Func
|
|
91
123
|
_mode: Mode
|
|
92
124
|
_coolDown: number
|
|
@@ -303,31 +335,15 @@ export const Task = class Task<
|
|
|
303
335
|
}
|
|
304
336
|
}
|
|
305
337
|
|
|
306
|
-
async safeRun (argv?: Parameters<Func>[0]): Promise<[
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const errorMessage = errorDetails
|
|
317
|
-
? `Invalid input on: ${errorDetails}`
|
|
318
|
-
: 'Invalid input'
|
|
319
|
-
|
|
320
|
-
// Emit the validation error
|
|
321
|
-
this.emit({
|
|
322
|
-
input: argv,
|
|
323
|
-
error: errorMessage
|
|
324
|
-
})
|
|
325
|
-
|
|
326
|
-
return [new Error(errorMessage), null, null]
|
|
327
|
-
}
|
|
328
|
-
} catch (error) {
|
|
329
|
-
return [error instanceof Error ? error : new Error(String(error)), null, null]
|
|
330
|
-
}
|
|
338
|
+
async safeRun (argv?: Parameters<Func>[0]): Promise<[
|
|
339
|
+
ReturnType<Func> | null,
|
|
340
|
+
Error | null,
|
|
341
|
+
ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B>
|
|
342
|
+
]> {
|
|
343
|
+
// Initialize log item
|
|
344
|
+
const logItem: ExecutionRecord<Parameters<Func>[0], ReturnType<Func>, B> = {
|
|
345
|
+
input: argv as Parameters<Func>[0],
|
|
346
|
+
boundaries: {} as BoundaryLogsFor<B>
|
|
331
347
|
}
|
|
332
348
|
|
|
333
349
|
// Create fresh boundaries for this execution
|
|
@@ -343,85 +359,85 @@ export const Task = class Task<
|
|
|
343
359
|
boundary.startRun()
|
|
344
360
|
}
|
|
345
361
|
|
|
362
|
+
// Handle schema validation
|
|
363
|
+
if (this._schema) {
|
|
364
|
+
const validation = this._schema.safeParse(argv)
|
|
365
|
+
if (!validation.success) {
|
|
366
|
+
const errorDetails = validation.error?.errors.map(err =>
|
|
367
|
+
`${err.path.join('.')}: ${err.message}`
|
|
368
|
+
).join(', ')
|
|
369
|
+
|
|
370
|
+
const errorMessage = errorDetails
|
|
371
|
+
? `Invalid input on: ${errorDetails}`
|
|
372
|
+
: 'Invalid input'
|
|
373
|
+
|
|
374
|
+
logItem.error = errorMessage
|
|
375
|
+
logItem.boundaries = {} as BoundaryLogsFor<B>
|
|
376
|
+
|
|
377
|
+
// Add boundary elements empty
|
|
378
|
+
for (const name in executionBoundaries) {
|
|
379
|
+
logItem.boundaries[name as keyof B] = [] as unknown as BoundaryLogsFor<B>[typeof name]
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
this.emit(logItem)
|
|
383
|
+
return [null, new Error(errorMessage), logItem]
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
let output: ReturnType<Func> | null = null
|
|
388
|
+
let error: Error | null = null
|
|
389
|
+
|
|
346
390
|
try {
|
|
347
391
|
// Execute the task function
|
|
348
|
-
|
|
392
|
+
output = await this._fn(
|
|
349
393
|
argv as Parameters<Func>[0],
|
|
350
394
|
executionBoundaries as unknown as Parameters<Func>[1]
|
|
351
395
|
)
|
|
352
396
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
397
|
+
logItem.output = output
|
|
398
|
+
} catch (caughtError) {
|
|
399
|
+
const errorMessage = caughtError instanceof Error ? caughtError.message : String(caughtError)
|
|
400
|
+
logItem.error = errorMessage
|
|
401
|
+
error = new Error(errorMessage)
|
|
402
|
+
}
|
|
359
403
|
|
|
360
|
-
|
|
361
|
-
|
|
404
|
+
// Process boundary data after execution (both success and error cases)
|
|
405
|
+
const boundariesRunLog: BoundaryLogsFor<B> = {} as BoundaryLogsFor<B>
|
|
362
406
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
}
|
|
407
|
+
for (const name in executionBoundaries) {
|
|
408
|
+
const boundary = executionBoundaries[name]
|
|
409
|
+
const runData = boundary.getRunData()
|
|
367
410
|
|
|
368
|
-
|
|
369
|
-
|
|
411
|
+
// Add to the run log
|
|
412
|
+
boundariesRunLog[name as keyof B] = runData as unknown as BoundaryLogsFor<B>[typeof name]
|
|
370
413
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
this._accumulatedBoundariesData[name] = [...currentData, ...(runData as BoundaryData)]
|
|
375
|
-
}
|
|
414
|
+
// Accumulate in the task's total boundaries data
|
|
415
|
+
if (!this._accumulatedBoundariesData[name]) {
|
|
416
|
+
this._accumulatedBoundariesData[name] = []
|
|
376
417
|
}
|
|
377
418
|
|
|
378
|
-
//
|
|
379
|
-
this.
|
|
380
|
-
input: argv,
|
|
381
|
-
output,
|
|
382
|
-
boundaries: boundariesRunLog
|
|
383
|
-
})
|
|
419
|
+
// Get the current accumulated data for this boundary
|
|
420
|
+
const currentData = this._accumulatedBoundariesData[name]
|
|
384
421
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
for (const name in executionBoundaries) {
|
|
391
|
-
const boundary = executionBoundaries[name]
|
|
392
|
-
const runData = boundary.getRunData()
|
|
393
|
-
|
|
394
|
-
// Add to the run log
|
|
395
|
-
boundariesRunLog[name] = runData
|
|
396
|
-
|
|
397
|
-
// Accumulate in the task's total boundaries data
|
|
398
|
-
if (!this._accumulatedBoundariesData[name]) {
|
|
399
|
-
this._accumulatedBoundariesData[name] = []
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
// Get the current accumulated data for this boundary
|
|
403
|
-
const currentData = this._accumulatedBoundariesData[name]
|
|
404
|
-
|
|
405
|
-
// Add the new run data
|
|
406
|
-
if (Array.isArray(runData) && runData.length > 0) {
|
|
407
|
-
// Cast the run data to the correct type
|
|
408
|
-
this._accumulatedBoundariesData[name] = [...currentData, ...(runData as BoundaryData)]
|
|
409
|
-
}
|
|
422
|
+
// Add the new run data
|
|
423
|
+
if (Array.isArray(runData) && runData.length > 0) {
|
|
424
|
+
// Cast the run data to the correct type
|
|
425
|
+
this._accumulatedBoundariesData[name] = [...currentData, ...(runData as BoundaryData)]
|
|
410
426
|
}
|
|
427
|
+
}
|
|
411
428
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
input: argv,
|
|
415
|
-
error: error instanceof Error ? error.message : String(error),
|
|
416
|
-
boundaries: boundariesRunLog
|
|
417
|
-
})
|
|
429
|
+
// Set boundaries in log item before emitting
|
|
430
|
+
logItem.boundaries = boundariesRunLog
|
|
418
431
|
|
|
419
|
-
|
|
420
|
-
|
|
432
|
+
// Emit the log item
|
|
433
|
+
this.emit(logItem)
|
|
434
|
+
|
|
435
|
+
// Return the error, output and log item
|
|
436
|
+
return [output, error, logItem]
|
|
421
437
|
}
|
|
422
438
|
|
|
423
439
|
async run (argv?: Parameters<Func>[0]): Promise<ReturnType<Func>> {
|
|
424
|
-
const [
|
|
440
|
+
const [result, error] = await this.safeRun(argv)
|
|
425
441
|
|
|
426
442
|
if (error) {
|
|
427
443
|
throw error
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createTask, Schema } from '../index'
|
|
2
2
|
|
|
3
3
|
describe('Task safeRun tests', () => {
|
|
4
|
-
it('returns [
|
|
4
|
+
it('returns [result, null, record] on successful execution', async () => {
|
|
5
5
|
// Create a simple schema
|
|
6
6
|
const schema = new Schema({
|
|
7
7
|
value: Schema.number()
|
|
@@ -25,16 +25,23 @@ describe('Task safeRun tests', () => {
|
|
|
25
25
|
)
|
|
26
26
|
|
|
27
27
|
// Call safeRun with valid input
|
|
28
|
-
const [
|
|
28
|
+
const [result, error, record] = await successTask.safeRun({ value: 5 })
|
|
29
29
|
|
|
30
30
|
// Verify success case
|
|
31
31
|
expect(error).toBeNull()
|
|
32
32
|
expect(result).toEqual({ result: 10, success: true })
|
|
33
|
-
expect(
|
|
34
|
-
expect(
|
|
33
|
+
expect(record).not.toBeNull()
|
|
34
|
+
expect(record).toHaveProperty('boundaries.fetchData')
|
|
35
|
+
expect(record.boundaries.fetchData).toHaveLength(1)
|
|
36
|
+
|
|
37
|
+
// useful to check types on record
|
|
38
|
+
const data = record.boundaries.fetchData[0]
|
|
39
|
+
expect(data.input).toEqual([5])
|
|
40
|
+
expect(data.output).toEqual(10)
|
|
41
|
+
expect(data.error).toBeUndefined()
|
|
35
42
|
})
|
|
36
43
|
|
|
37
|
-
it('returns [
|
|
44
|
+
it('returns [null, error, record] on failed execution', async () => {
|
|
38
45
|
// Create a simple schema
|
|
39
46
|
const schema = new Schema({
|
|
40
47
|
value: Schema.number()
|
|
@@ -61,17 +68,26 @@ describe('Task safeRun tests', () => {
|
|
|
61
68
|
)
|
|
62
69
|
|
|
63
70
|
// Call safeRun with problematic input that will cause an error
|
|
64
|
-
const [
|
|
71
|
+
const [result, error, record] = await errorTask.safeRun({ value: -5 })
|
|
65
72
|
|
|
66
73
|
// Verify error case
|
|
67
|
-
expect(error).
|
|
68
|
-
expect(error
|
|
74
|
+
expect(error).not.toBeNull()
|
|
75
|
+
expect(error instanceof Error).toBe(true)
|
|
76
|
+
if (error instanceof Error) {
|
|
77
|
+
expect(error.message).toContain('Value cannot be negative')
|
|
78
|
+
}
|
|
69
79
|
expect(result).toBeNull()
|
|
70
|
-
expect(
|
|
71
|
-
expect(
|
|
80
|
+
expect(record).not.toBeNull()
|
|
81
|
+
expect(record).toHaveProperty('boundaries.fetchData')
|
|
82
|
+
expect(record.boundaries.fetchData).toHaveLength(1)
|
|
83
|
+
|
|
84
|
+
const data = record.boundaries.fetchData[0]
|
|
85
|
+
expect(data.input).toEqual([-5])
|
|
86
|
+
expect(data.error).toContain('Value cannot be negative')
|
|
87
|
+
expect(data.output).toBeUndefined()
|
|
72
88
|
})
|
|
73
89
|
|
|
74
|
-
it('returns [
|
|
90
|
+
it('returns [null, error, record] on schema validation failure', async () => {
|
|
75
91
|
// Create a schema that requires a positive number
|
|
76
92
|
const schema = new Schema({
|
|
77
93
|
value: Schema.number().min(1, 'Value must be positive')
|
|
@@ -95,13 +111,21 @@ describe('Task safeRun tests', () => {
|
|
|
95
111
|
)
|
|
96
112
|
|
|
97
113
|
// Call safeRun with invalid input that will fail schema validation
|
|
98
|
-
const [
|
|
114
|
+
const [result, error, record] = await validationTask.safeRun({ value: 0 })
|
|
99
115
|
|
|
100
116
|
// Verify validation error case
|
|
101
117
|
expect(error).toBeInstanceOf(Error)
|
|
102
|
-
expect(error
|
|
118
|
+
expect(error instanceof Error).toBe(true)
|
|
119
|
+
if (error instanceof Error) {
|
|
120
|
+
expect(error.message).toContain('Value must be positive')
|
|
121
|
+
}
|
|
103
122
|
expect(result).toBeNull()
|
|
104
|
-
expect(
|
|
123
|
+
expect(record).not.toBeNull()
|
|
124
|
+
expect(record.input).toEqual({ value: 0 })
|
|
125
|
+
expect(record.error).toContain('Value must be positive')
|
|
126
|
+
expect(record.boundaries).toEqual({
|
|
127
|
+
fetchData: []
|
|
128
|
+
})
|
|
105
129
|
})
|
|
106
130
|
|
|
107
131
|
it('properly calls the listener with safeRun and run', async () => {
|
|
@@ -145,7 +169,10 @@ describe('Task safeRun tests', () => {
|
|
|
145
169
|
1,
|
|
146
170
|
expect.objectContaining({
|
|
147
171
|
input: { value: 10 },
|
|
148
|
-
output: 20
|
|
172
|
+
output: 20,
|
|
173
|
+
boundaries: {
|
|
174
|
+
fetchData: expect.any(Array)
|
|
175
|
+
}
|
|
149
176
|
})
|
|
150
177
|
)
|
|
151
178
|
|
|
@@ -154,7 +181,10 @@ describe('Task safeRun tests', () => {
|
|
|
154
181
|
2,
|
|
155
182
|
expect.objectContaining({
|
|
156
183
|
input: { value: 20 },
|
|
157
|
-
output: 40
|
|
184
|
+
output: 40,
|
|
185
|
+
boundaries: {
|
|
186
|
+
fetchData: expect.any(Array)
|
|
187
|
+
}
|
|
158
188
|
})
|
|
159
189
|
)
|
|
160
190
|
})
|
|
@@ -187,7 +217,7 @@ describe('Task safeRun tests', () => {
|
|
|
187
217
|
)
|
|
188
218
|
|
|
189
219
|
// Call safeRun
|
|
190
|
-
const [
|
|
220
|
+
const [result, error, record] = await multiBoundaryTask.safeRun({ values: [1, 2, 3] })
|
|
191
221
|
|
|
192
222
|
// Verify success
|
|
193
223
|
expect(error).toBeNull()
|
|
@@ -196,19 +226,16 @@ describe('Task safeRun tests', () => {
|
|
|
196
226
|
total: 12
|
|
197
227
|
})
|
|
198
228
|
|
|
199
|
-
// Verify
|
|
200
|
-
expect(
|
|
201
|
-
expect(
|
|
202
|
-
expect(
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
expect(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
expect(boundaryLogs.sumValues).toHaveLength(1)
|
|
211
|
-
// @ts-expect-error - we know the boundaryLogs is not null here
|
|
212
|
-
expect(boundaryLogs.sumValues[0].input).toEqual([[2, 4, 6]])
|
|
229
|
+
// Verify record structure
|
|
230
|
+
expect(record).not.toBeNull()
|
|
231
|
+
expect(record).toHaveProperty('boundaries.doubleValue')
|
|
232
|
+
expect(record).toHaveProperty('boundaries.sumValues')
|
|
233
|
+
|
|
234
|
+
expect(record.boundaries.doubleValue).toHaveLength(3)
|
|
235
|
+
expect(record.boundaries.sumValues).toHaveLength(1)
|
|
236
|
+
expect(record.boundaries.doubleValue[0]).toEqual({ input: [1], output: 2 })
|
|
237
|
+
expect(record.boundaries.doubleValue[1]).toEqual({ input: [2], output: 4 })
|
|
238
|
+
expect(record.boundaries.doubleValue[2]).toEqual({ input: [3], output: 6 })
|
|
239
|
+
expect(record.boundaries.sumValues[0]).toEqual({ input: [[2, 4, 6]], output: 12 })
|
|
213
240
|
})
|
|
214
241
|
})
|