@forgehive/runner 0.1.2 → 0.1.4
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/README.md +111 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/test/describe.test.d.ts +2 -0
- package/dist/test/describe.test.d.ts.map +1 -0
- package/dist/test/describe.test.js +87 -0
- package/dist/test/describe.test.js.map +1 -0
- package/package.json +10 -11
- package/src/index.ts +14 -6
- package/src/test/describe.test.ts +106 -0
package/README.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# @forgehive/runner
|
|
2
|
+
|
|
3
|
+
A task runner library for managing and executing tasks with proper type safety and error handling.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @forgehive/runner
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
The `@forgehive/runner` package provides a way to manage and execute tasks with:
|
|
14
|
+
|
|
15
|
+
- Type-safe task execution
|
|
16
|
+
- Custom argument parsing
|
|
17
|
+
- Task description and schema inspection
|
|
18
|
+
- Error handling
|
|
19
|
+
|
|
20
|
+
## Basic Usage
|
|
21
|
+
|
|
22
|
+
Here's a simple example of using the runner:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { Runner } from '@forgehive/runner';
|
|
26
|
+
import { Task, Schema } from '@forgehive/task';
|
|
27
|
+
|
|
28
|
+
// Create a runner
|
|
29
|
+
const runner = new Runner();
|
|
30
|
+
|
|
31
|
+
// Create a task
|
|
32
|
+
const task = new Task(({ name }: { name: string }) => {
|
|
33
|
+
return `Hello, ${name}!`;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Load the task
|
|
37
|
+
runner.load('greet', task);
|
|
38
|
+
|
|
39
|
+
// Run the task
|
|
40
|
+
const result = await runner.run('greet', { name: 'John' });
|
|
41
|
+
console.log(result); // "Hello, John!"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Custom Argument Parsing
|
|
45
|
+
|
|
46
|
+
You can provide custom argument parsing:
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
interface CustomArgs {
|
|
50
|
+
task: string;
|
|
51
|
+
args: {
|
|
52
|
+
name: string;
|
|
53
|
+
age: number;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const runner = new Runner<CustomArgs>((data) => ({
|
|
58
|
+
taskName: data.task,
|
|
59
|
+
args: data.args
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
// Now the runner expects data in this format
|
|
63
|
+
await runner.run('greet', { name: 'John', age: 30 });
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Task Description
|
|
67
|
+
|
|
68
|
+
You can inspect task details:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
const runner = new Runner();
|
|
72
|
+
const task = new Task(({ name }: { name: string }) => {
|
|
73
|
+
return `Hello, ${name}!`;
|
|
74
|
+
});
|
|
75
|
+
task.setDescription('A greeting task');
|
|
76
|
+
|
|
77
|
+
runner.load('greet', task);
|
|
78
|
+
|
|
79
|
+
// Get task details
|
|
80
|
+
const details = runner.describe();
|
|
81
|
+
console.log(details);
|
|
82
|
+
// {
|
|
83
|
+
// greet: {
|
|
84
|
+
// name: 'greet',
|
|
85
|
+
// description: 'A greeting task',
|
|
86
|
+
// schema: { ... }
|
|
87
|
+
// }
|
|
88
|
+
// }
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## API Reference
|
|
92
|
+
|
|
93
|
+
### `Runner` Class
|
|
94
|
+
|
|
95
|
+
- `constructor(parseArgumentsFn?)`: Creates a new runner with optional custom argument parsing
|
|
96
|
+
- `load(name: string, task: TaskInstanceType)`: Loads a task with the given name
|
|
97
|
+
- `run(name: string, args: unknown)`: Runs a task with the given arguments
|
|
98
|
+
- `getTask(name: string)`: Gets a task by name
|
|
99
|
+
- `getTasks()`: Gets all loaded tasks
|
|
100
|
+
- `getTaskList()`: Gets list of task names
|
|
101
|
+
- `describe()`: Returns details about all loaded tasks
|
|
102
|
+
- `setHandler(handlerFn)`: Sets a custom handler for task execution
|
|
103
|
+
|
|
104
|
+
### Types
|
|
105
|
+
|
|
106
|
+
- `RunnerParsedArguments`: Base interface for parsed arguments
|
|
107
|
+
- `TaskRecord`: Record type for task data
|
|
108
|
+
|
|
109
|
+
## License
|
|
110
|
+
|
|
111
|
+
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { TaskInstanceType, BaseFunction } from '@forgehive/task';
|
|
2
|
+
import { type SchemaDescription } from '@forgehive/schema';
|
|
2
3
|
type TaskRecord<T extends TaskInstanceType = TaskInstanceType> = {
|
|
3
4
|
task: T;
|
|
4
5
|
};
|
|
@@ -23,7 +24,11 @@ export declare class Runner<InputType = unknown, ParseResult extends RunnerParse
|
|
|
23
24
|
* @returns Output data
|
|
24
25
|
*/
|
|
25
26
|
private defaultHandler;
|
|
26
|
-
describe():
|
|
27
|
+
describe(): Record<string, {
|
|
28
|
+
name: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
schema?: SchemaDescription;
|
|
31
|
+
}>;
|
|
27
32
|
load<T extends BaseFunction>(name: string, task: TaskInstanceType<T>): void;
|
|
28
33
|
getTask<T extends BaseFunction = BaseFunction>(name: string): TaskInstanceType<T> | undefined;
|
|
29
34
|
getTasks(): Tasks;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,KAAK,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI;IAC/D,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AAGvC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,MAAM,CAAC,SAAS,GAAG,OAAO,EAAE,WAAW,SAAS,qBAAqB,GAAG,qBAAqB;IACjG,MAAM,EAAE,KAAK,CAAA;IACb,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,WAAW,CAAA;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;gBAEzC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,WAAW;IAsB/D;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAIlE;;;;OAIG;YACW,cAAc;IAM5B,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAe9F,IAAI,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3E,OAAO,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS;IAU7F,QAAQ,IAAI,KAAK;IAIjB,WAAW,IAAI,MAAM,EAAE;IAIjB,GAAG,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAC7E,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAgBvB;AAED,eAAe,MAAM,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -39,11 +39,16 @@ class Runner {
|
|
|
39
39
|
return res;
|
|
40
40
|
}
|
|
41
41
|
describe() {
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
const tasks = this._tasks;
|
|
43
|
+
const result = {};
|
|
44
|
+
for (const [name, { task }] of Object.entries(tasks)) {
|
|
45
|
+
result[name] = {
|
|
46
|
+
name,
|
|
47
|
+
description: task.getDescription(),
|
|
48
|
+
schema: task.describe()
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
47
52
|
}
|
|
48
53
|
load(name, task) {
|
|
49
54
|
this._tasks[name] = { task };
|
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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.test.d.ts","sourceRoot":"","sources":["../../src/test/describe.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("../index");
|
|
4
|
+
const task_1 = require("@forgehive/task");
|
|
5
|
+
describe('Runner describe', () => {
|
|
6
|
+
it('should return task details including name, description and schema', () => {
|
|
7
|
+
const runner = new index_1.Runner();
|
|
8
|
+
const schema = new task_1.Schema({
|
|
9
|
+
value: task_1.Schema.number()
|
|
10
|
+
});
|
|
11
|
+
const task = new task_1.Task(({ value }) => {
|
|
12
|
+
return value;
|
|
13
|
+
}, {
|
|
14
|
+
schema
|
|
15
|
+
});
|
|
16
|
+
task.setDescription('A test task that processes numbers');
|
|
17
|
+
runner.load('testTask', task);
|
|
18
|
+
const result = runner.describe();
|
|
19
|
+
expect(result).toEqual({
|
|
20
|
+
testTask: {
|
|
21
|
+
name: 'testTask',
|
|
22
|
+
description: 'A test task that processes numbers',
|
|
23
|
+
schema: {
|
|
24
|
+
value: {
|
|
25
|
+
type: 'number'
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it('should handle tasks without description or schema', () => {
|
|
32
|
+
const runner = new index_1.Runner();
|
|
33
|
+
const task = new task_1.Task(() => {
|
|
34
|
+
return 'test';
|
|
35
|
+
});
|
|
36
|
+
runner.load('simpleTask', task);
|
|
37
|
+
const result = runner.describe();
|
|
38
|
+
expect(result).toEqual({
|
|
39
|
+
simpleTask: {
|
|
40
|
+
name: 'simpleTask',
|
|
41
|
+
description: undefined,
|
|
42
|
+
schema: {}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it('should handle multiple tasks with task: prefix', () => {
|
|
47
|
+
const runner = new index_1.Runner();
|
|
48
|
+
const runTask = (0, task_1.createTask)(new task_1.Schema({
|
|
49
|
+
descriptorName: task_1.Schema.string(),
|
|
50
|
+
args: task_1.Schema.mixedRecord()
|
|
51
|
+
}), {}, async () => 'running');
|
|
52
|
+
runTask.setDescription('Executes the task');
|
|
53
|
+
const createTaskInstance = (0, task_1.createTask)(new task_1.Schema({
|
|
54
|
+
descriptorName: task_1.Schema.string()
|
|
55
|
+
}), {}, async ({ descriptorName }) => {
|
|
56
|
+
return descriptorName;
|
|
57
|
+
});
|
|
58
|
+
createTaskInstance.setDescription('Creates a new task');
|
|
59
|
+
runner.load('task:run', runTask);
|
|
60
|
+
runner.load('task:create', createTaskInstance);
|
|
61
|
+
const result = runner.describe();
|
|
62
|
+
expect(result).toEqual({
|
|
63
|
+
'task:run': {
|
|
64
|
+
name: 'task:run',
|
|
65
|
+
description: 'Executes the task',
|
|
66
|
+
schema: {
|
|
67
|
+
descriptorName: {
|
|
68
|
+
type: 'string'
|
|
69
|
+
},
|
|
70
|
+
args: {
|
|
71
|
+
type: 'mixedRecord'
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
'task:create': {
|
|
76
|
+
name: 'task:create',
|
|
77
|
+
description: 'Creates a new task',
|
|
78
|
+
schema: {
|
|
79
|
+
descriptorName: {
|
|
80
|
+
type: 'string'
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=describe.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.test.js","sourceRoot":"","sources":["../../src/test/describe.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgehive/runner",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -12,15 +12,9 @@
|
|
|
12
12
|
"@forgehive/task": "^0.1.1"
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
|
-
"scripts": {
|
|
16
|
-
"build": "tsc",
|
|
17
|
-
"dev": "tsc --watch",
|
|
18
|
-
"clean": "rm -rf dist",
|
|
19
|
-
"test": "jest"
|
|
20
|
-
},
|
|
21
15
|
"dependencies": {
|
|
22
|
-
"@forgehive/schema": "0.1.
|
|
23
|
-
"@forgehive/task": "0.1.
|
|
16
|
+
"@forgehive/schema": "0.1.4",
|
|
17
|
+
"@forgehive/task": "0.1.4"
|
|
24
18
|
},
|
|
25
19
|
"devDependencies": {
|
|
26
20
|
"@types/jest": "^29.5.12",
|
|
@@ -29,5 +23,10 @@
|
|
|
29
23
|
"ts-jest": "^29.1.2",
|
|
30
24
|
"typescript": "^5.3.3"
|
|
31
25
|
},
|
|
32
|
-
"
|
|
33
|
-
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"dev": "tsc --watch",
|
|
29
|
+
"clean": "rm -rf dist",
|
|
30
|
+
"test": "jest"
|
|
31
|
+
}
|
|
32
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
2
|
import { TaskInstanceType, BaseFunction } from '@forgehive/task'
|
|
3
|
+
import { type SchemaDescription } from '@forgehive/schema'
|
|
3
4
|
|
|
4
5
|
type TaskRecord<T extends TaskInstanceType = TaskInstanceType> = {
|
|
5
6
|
task: T
|
|
@@ -59,12 +60,19 @@ export class Runner<InputType = unknown, ParseResult extends RunnerParsedArgumen
|
|
|
59
60
|
return res
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
describe():
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
describe(): Record<string, { name: string; description?: string; schema?: SchemaDescription }> {
|
|
64
|
+
const tasks = this._tasks
|
|
65
|
+
const result: Record<string, { name: string; description?: string; schema?: SchemaDescription }> = {}
|
|
66
|
+
|
|
67
|
+
for (const [name, { task }] of Object.entries(tasks)) {
|
|
68
|
+
result[name] = {
|
|
69
|
+
name,
|
|
70
|
+
description: task.getDescription(),
|
|
71
|
+
schema: task.describe()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return result
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
load<T extends BaseFunction>(name: string, task: TaskInstanceType<T>): void {
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Runner } from '../index'
|
|
2
|
+
import { Task, Schema, createTask } from '@forgehive/task'
|
|
3
|
+
|
|
4
|
+
describe('Runner describe', () => {
|
|
5
|
+
it('should return task details including name, description and schema', () => {
|
|
6
|
+
const runner = new Runner()
|
|
7
|
+
const schema = new Schema({
|
|
8
|
+
value: Schema.number()
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
const task = new Task(({ value }: { value: number }) => {
|
|
12
|
+
return value
|
|
13
|
+
}, {
|
|
14
|
+
schema
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
task.setDescription('A test task that processes numbers')
|
|
18
|
+
|
|
19
|
+
runner.load('testTask', task)
|
|
20
|
+
const result = runner.describe()
|
|
21
|
+
|
|
22
|
+
expect(result).toEqual({
|
|
23
|
+
testTask: {
|
|
24
|
+
name: 'testTask',
|
|
25
|
+
description: 'A test task that processes numbers',
|
|
26
|
+
schema: {
|
|
27
|
+
value: {
|
|
28
|
+
type: 'number'
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('should handle tasks without description or schema', () => {
|
|
36
|
+
const runner = new Runner()
|
|
37
|
+
const task = new Task(() => {
|
|
38
|
+
return 'test'
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
runner.load('simpleTask', task)
|
|
42
|
+
const result = runner.describe()
|
|
43
|
+
|
|
44
|
+
expect(result).toEqual({
|
|
45
|
+
simpleTask: {
|
|
46
|
+
name: 'simpleTask',
|
|
47
|
+
description: undefined,
|
|
48
|
+
schema: {}
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('should handle multiple tasks with task: prefix', () => {
|
|
54
|
+
const runner = new Runner()
|
|
55
|
+
|
|
56
|
+
const runTask = createTask(
|
|
57
|
+
new Schema({
|
|
58
|
+
descriptorName: Schema.string(),
|
|
59
|
+
args: Schema.mixedRecord()
|
|
60
|
+
}),
|
|
61
|
+
{},
|
|
62
|
+
async () => 'running'
|
|
63
|
+
)
|
|
64
|
+
runTask.setDescription('Executes the task')
|
|
65
|
+
|
|
66
|
+
const createTaskInstance = createTask(
|
|
67
|
+
new Schema({
|
|
68
|
+
descriptorName: Schema.string()
|
|
69
|
+
}),
|
|
70
|
+
{},
|
|
71
|
+
async ({ descriptorName }) => {
|
|
72
|
+
return descriptorName
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
createTaskInstance.setDescription('Creates a new task')
|
|
76
|
+
|
|
77
|
+
runner.load('task:run', runTask)
|
|
78
|
+
runner.load('task:create', createTaskInstance)
|
|
79
|
+
|
|
80
|
+
const result = runner.describe()
|
|
81
|
+
|
|
82
|
+
expect(result).toEqual({
|
|
83
|
+
'task:run': {
|
|
84
|
+
name: 'task:run',
|
|
85
|
+
description: 'Executes the task',
|
|
86
|
+
schema: {
|
|
87
|
+
descriptorName: {
|
|
88
|
+
type: 'string'
|
|
89
|
+
},
|
|
90
|
+
args: {
|
|
91
|
+
type: 'mixedRecord'
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
'task:create': {
|
|
96
|
+
name: 'task:create',
|
|
97
|
+
description: 'Creates a new task',
|
|
98
|
+
schema: {
|
|
99
|
+
descriptorName: {
|
|
100
|
+
type: 'string'
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
})
|