async-queue-runner 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_cjs/action.js +11 -0
- package/_cjs/index.js +9 -0
- package/_cjs/package.json +38 -0
- package/_cjs/queue.js +62 -0
- package/_cjs/runner.js +31 -0
- package/_cjs/types.js +2 -0
- package/_cjs/utils.js +42 -0
- package/_esm/action.js +7 -0
- package/_esm/index.js +3 -0
- package/_esm/package.json +38 -0
- package/_esm/queue.js +58 -0
- package/_esm/runner.js +27 -0
- package/_esm/types.js +1 -0
- package/_esm/utils.js +38 -0
- package/_types/action.d.ts +9 -0
- package/_types/index.d.ts +4 -0
- package/_types/queue.d.ts +19 -0
- package/_types/runner.d.ts +11 -0
- package/_types/types.d.ts +15 -0
- package/_types/utils.d.ts +16 -0
- package/package.json +38 -0
package/_cjs/action.js
ADDED
package/_cjs/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.util = exports.Action = exports.AsyncQueue = void 0;
|
|
4
|
+
var queue_js_1 = require("./queue.js");
|
|
5
|
+
Object.defineProperty(exports, "AsyncQueue", { enumerable: true, get: function () { return queue_js_1.AsyncQueue; } });
|
|
6
|
+
var action_js_1 = require("./action.js");
|
|
7
|
+
Object.defineProperty(exports, "Action", { enumerable: true, get: function () { return action_js_1.Action; } });
|
|
8
|
+
var utils_js_1 = require("./utils.js");
|
|
9
|
+
Object.defineProperty(exports, "util", { enumerable: true, get: function () { return utils_js_1.util; } });
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "async-queue-runner",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Library to run in parallel extendable queue of tasks",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"compile": "tsc --project ./tsconfig.json",
|
|
8
|
+
"copy:package:json": "copyfiles ./package.json ./built/ && copyfiles ./package.json ./built/_esm/ && copyfiles ./package.json ./built/_cjs/",
|
|
9
|
+
"build:all": "tsc -p ./tsconfig.esm.json && tsc -p ./tsconfig.cjs.json && tsc -p ./tsconfig.types.json",
|
|
10
|
+
"build": "del-cli ./built/ && npm run build:all && npm run copy:package:json",
|
|
11
|
+
"watch": "tsc --watch --project ./tsconfig.json",
|
|
12
|
+
"test": "jest"
|
|
13
|
+
},
|
|
14
|
+
"exports": {
|
|
15
|
+
"./*": {
|
|
16
|
+
"types": "./_types/*.d.ts",
|
|
17
|
+
"require": "./_cjs/*.js",
|
|
18
|
+
"import": "./_esm/*.js",
|
|
19
|
+
"default": "./_esm/*.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"types": "./index.d.ts",
|
|
23
|
+
"keywords": [],
|
|
24
|
+
"author": "Eugeny Dementev",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@jest/globals": "^29.7.0",
|
|
28
|
+
"@tsconfig/node20": "^20.1.2",
|
|
29
|
+
"@types/node": "^20.11.26",
|
|
30
|
+
"copyfiles": "^2.4.1",
|
|
31
|
+
"del-cli": "^5.1.0",
|
|
32
|
+
"jest": "^29.7.0",
|
|
33
|
+
"ts-jest": "^29.1.2"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"typescript": "^5.4.2"
|
|
37
|
+
}
|
|
38
|
+
}
|
package/_cjs/queue.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AsyncQueue = void 0;
|
|
4
|
+
const action_js_1 = require("./action.js");
|
|
5
|
+
class AsyncQueue {
|
|
6
|
+
name = 'default queue name';
|
|
7
|
+
queue = [];
|
|
8
|
+
end;
|
|
9
|
+
loopAction = false;
|
|
10
|
+
context = {
|
|
11
|
+
push: this.push,
|
|
12
|
+
stop: () => { this.loopAction = false; },
|
|
13
|
+
extend: (obj) => Object.assign(this.context, obj),
|
|
14
|
+
};
|
|
15
|
+
constructor(opts) {
|
|
16
|
+
this.queue = opts.actions;
|
|
17
|
+
this.name = opts.name;
|
|
18
|
+
this.end = opts.end;
|
|
19
|
+
this.push = this.push.bind(this);
|
|
20
|
+
}
|
|
21
|
+
async delay(timeout) {
|
|
22
|
+
return new Promise((res) => setTimeout(res, timeout));
|
|
23
|
+
}
|
|
24
|
+
async run(context) {
|
|
25
|
+
this.loopAction = true;
|
|
26
|
+
Object.assign(this.context, context);
|
|
27
|
+
try {
|
|
28
|
+
while (this.loopAction) {
|
|
29
|
+
if (this.queue.length === 0) {
|
|
30
|
+
this.loopAction = false;
|
|
31
|
+
console.log('Queue stopped');
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
const item = this.queue.shift();
|
|
35
|
+
const action = this.processQueueItem(item);
|
|
36
|
+
await this.iterate(action);
|
|
37
|
+
}
|
|
38
|
+
this.end();
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
console.log(`Queue(${this.name} failed`);
|
|
42
|
+
console.error(e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async iterate(action) {
|
|
46
|
+
const actionName = action.constructor.name || 'some undefined';
|
|
47
|
+
console.log(`Queue(${this.name}): running ${actionName} action`);
|
|
48
|
+
await action.execute(this.context);
|
|
49
|
+
await this.delay(action.delay);
|
|
50
|
+
}
|
|
51
|
+
push(actions) {
|
|
52
|
+
this.queue.unshift(...actions);
|
|
53
|
+
}
|
|
54
|
+
processQueueItem(item) {
|
|
55
|
+
if (item instanceof action_js_1.Action) {
|
|
56
|
+
return item;
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
return new item;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.AsyncQueue = AsyncQueue;
|
package/_cjs/runner.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueueRunner = void 0;
|
|
4
|
+
const queue_js_1 = require("./queue.js");
|
|
5
|
+
class QueueRunner {
|
|
6
|
+
queues = new Map();
|
|
7
|
+
listeners = [];
|
|
8
|
+
add(actions, context = {}, name = this.getName()) {
|
|
9
|
+
const queue = new queue_js_1.AsyncQueue({
|
|
10
|
+
name, actions,
|
|
11
|
+
end: () => {
|
|
12
|
+
this.queues.delete(name);
|
|
13
|
+
this.endEvent(name);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
this.queues.set(name, queue);
|
|
17
|
+
queue.run(context);
|
|
18
|
+
}
|
|
19
|
+
addEndListener(listener) {
|
|
20
|
+
this.listeners.push(listener);
|
|
21
|
+
}
|
|
22
|
+
endEvent(name) {
|
|
23
|
+
for (const listener of this.listeners) {
|
|
24
|
+
listener(name, this.queues.size);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
getName() {
|
|
28
|
+
return Math.random().toString(36).substring(2, 10);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.QueueRunner = QueueRunner;
|
package/_cjs/types.js
ADDED
package/_cjs/utils.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.util = exports.Delay = void 0;
|
|
4
|
+
const action_js_1 = require("./action.js");
|
|
5
|
+
class Delay extends action_js_1.Action {
|
|
6
|
+
async execute() {
|
|
7
|
+
return new Promise(res => {
|
|
8
|
+
setTimeout(res, this.delay);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.Delay = Delay;
|
|
13
|
+
exports.util = {
|
|
14
|
+
delay(timeout) {
|
|
15
|
+
return new Delay({ delay: timeout });
|
|
16
|
+
},
|
|
17
|
+
if(condition, branches) {
|
|
18
|
+
class IfAction extends action_js_1.Action {
|
|
19
|
+
async execute(context) {
|
|
20
|
+
const result = await condition(context);
|
|
21
|
+
if (result) {
|
|
22
|
+
context.push(branches.then);
|
|
23
|
+
}
|
|
24
|
+
else if (branches.else) {
|
|
25
|
+
context.push(branches.else);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return new IfAction();
|
|
30
|
+
},
|
|
31
|
+
valid(validator, actions) {
|
|
32
|
+
class Validator extends action_js_1.Action {
|
|
33
|
+
async execute(context) {
|
|
34
|
+
const valid = await validator(context);
|
|
35
|
+
if (valid) {
|
|
36
|
+
context.push(actions);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return new Validator();
|
|
41
|
+
},
|
|
42
|
+
};
|
package/_esm/action.js
ADDED
package/_esm/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "async-queue-runner",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Library to run in parallel extendable queue of tasks",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"compile": "tsc --project ./tsconfig.json",
|
|
8
|
+
"copy:package:json": "copyfiles ./package.json ./built/ && copyfiles ./package.json ./built/_esm/ && copyfiles ./package.json ./built/_cjs/",
|
|
9
|
+
"build:all": "tsc -p ./tsconfig.esm.json && tsc -p ./tsconfig.cjs.json && tsc -p ./tsconfig.types.json",
|
|
10
|
+
"build": "del-cli ./built/ && npm run build:all && npm run copy:package:json",
|
|
11
|
+
"watch": "tsc --watch --project ./tsconfig.json",
|
|
12
|
+
"test": "jest"
|
|
13
|
+
},
|
|
14
|
+
"exports": {
|
|
15
|
+
"./*": {
|
|
16
|
+
"types": "./_types/*.d.ts",
|
|
17
|
+
"require": "./_cjs/*.js",
|
|
18
|
+
"import": "./_esm/*.js",
|
|
19
|
+
"default": "./_esm/*.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"types": "./index.d.ts",
|
|
23
|
+
"keywords": [],
|
|
24
|
+
"author": "Eugeny Dementev",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@jest/globals": "^29.7.0",
|
|
28
|
+
"@tsconfig/node20": "^20.1.2",
|
|
29
|
+
"@types/node": "^20.11.26",
|
|
30
|
+
"copyfiles": "^2.4.1",
|
|
31
|
+
"del-cli": "^5.1.0",
|
|
32
|
+
"jest": "^29.7.0",
|
|
33
|
+
"ts-jest": "^29.1.2"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"typescript": "^5.4.2"
|
|
37
|
+
}
|
|
38
|
+
}
|
package/_esm/queue.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Action } from './action.js';
|
|
2
|
+
export class AsyncQueue {
|
|
3
|
+
name = 'default queue name';
|
|
4
|
+
queue = [];
|
|
5
|
+
end;
|
|
6
|
+
loopAction = false;
|
|
7
|
+
context = {
|
|
8
|
+
push: this.push,
|
|
9
|
+
stop: () => { this.loopAction = false; },
|
|
10
|
+
extend: (obj) => Object.assign(this.context, obj),
|
|
11
|
+
};
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
this.queue = opts.actions;
|
|
14
|
+
this.name = opts.name;
|
|
15
|
+
this.end = opts.end;
|
|
16
|
+
this.push = this.push.bind(this);
|
|
17
|
+
}
|
|
18
|
+
async delay(timeout) {
|
|
19
|
+
return new Promise((res) => setTimeout(res, timeout));
|
|
20
|
+
}
|
|
21
|
+
async run(context) {
|
|
22
|
+
this.loopAction = true;
|
|
23
|
+
Object.assign(this.context, context);
|
|
24
|
+
try {
|
|
25
|
+
while (this.loopAction) {
|
|
26
|
+
if (this.queue.length === 0) {
|
|
27
|
+
this.loopAction = false;
|
|
28
|
+
console.log('Queue stopped');
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
const item = this.queue.shift();
|
|
32
|
+
const action = this.processQueueItem(item);
|
|
33
|
+
await this.iterate(action);
|
|
34
|
+
}
|
|
35
|
+
this.end();
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
console.log(`Queue(${this.name} failed`);
|
|
39
|
+
console.error(e);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async iterate(action) {
|
|
43
|
+
const actionName = action.constructor.name || 'some undefined';
|
|
44
|
+
console.log(`Queue(${this.name}): running ${actionName} action`);
|
|
45
|
+
await action.execute(this.context);
|
|
46
|
+
await this.delay(action.delay);
|
|
47
|
+
}
|
|
48
|
+
push(actions) {
|
|
49
|
+
this.queue.unshift(...actions);
|
|
50
|
+
}
|
|
51
|
+
processQueueItem(item) {
|
|
52
|
+
if (item instanceof Action) {
|
|
53
|
+
return item;
|
|
54
|
+
}
|
|
55
|
+
else
|
|
56
|
+
return new item;
|
|
57
|
+
}
|
|
58
|
+
}
|
package/_esm/runner.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AsyncQueue } from "./queue.js";
|
|
2
|
+
export class QueueRunner {
|
|
3
|
+
queues = new Map();
|
|
4
|
+
listeners = [];
|
|
5
|
+
add(actions, context = {}, name = this.getName()) {
|
|
6
|
+
const queue = new AsyncQueue({
|
|
7
|
+
name, actions,
|
|
8
|
+
end: () => {
|
|
9
|
+
this.queues.delete(name);
|
|
10
|
+
this.endEvent(name);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
this.queues.set(name, queue);
|
|
14
|
+
queue.run(context);
|
|
15
|
+
}
|
|
16
|
+
addEndListener(listener) {
|
|
17
|
+
this.listeners.push(listener);
|
|
18
|
+
}
|
|
19
|
+
endEvent(name) {
|
|
20
|
+
for (const listener of this.listeners) {
|
|
21
|
+
listener(name, this.queues.size);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
getName() {
|
|
25
|
+
return Math.random().toString(36).substring(2, 10);
|
|
26
|
+
}
|
|
27
|
+
}
|
package/_esm/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/_esm/utils.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Action } from "./action.js";
|
|
2
|
+
export class Delay extends Action {
|
|
3
|
+
async execute() {
|
|
4
|
+
return new Promise(res => {
|
|
5
|
+
setTimeout(res, this.delay);
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export const util = {
|
|
10
|
+
delay(timeout) {
|
|
11
|
+
return new Delay({ delay: timeout });
|
|
12
|
+
},
|
|
13
|
+
if(condition, branches) {
|
|
14
|
+
class IfAction extends Action {
|
|
15
|
+
async execute(context) {
|
|
16
|
+
const result = await condition(context);
|
|
17
|
+
if (result) {
|
|
18
|
+
context.push(branches.then);
|
|
19
|
+
}
|
|
20
|
+
else if (branches.else) {
|
|
21
|
+
context.push(branches.else);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return new IfAction();
|
|
26
|
+
},
|
|
27
|
+
valid(validator, actions) {
|
|
28
|
+
class Validator extends Action {
|
|
29
|
+
async execute(context) {
|
|
30
|
+
const valid = await validator(context);
|
|
31
|
+
if (valid) {
|
|
32
|
+
context.push(actions);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return new Validator();
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IAction, QueueContext } from "./types.js";
|
|
2
|
+
export type Options = {
|
|
3
|
+
delay?: number;
|
|
4
|
+
};
|
|
5
|
+
export declare abstract class Action<C> implements IAction {
|
|
6
|
+
delay: number;
|
|
7
|
+
constructor(opts?: Options);
|
|
8
|
+
abstract execute(context: C & QueueContext): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IAction, QueueAction, QueueContext } from './types.js';
|
|
2
|
+
export type QueueOpts = {
|
|
3
|
+
actions: QueueAction[];
|
|
4
|
+
name: string;
|
|
5
|
+
end: () => void;
|
|
6
|
+
};
|
|
7
|
+
export declare class AsyncQueue {
|
|
8
|
+
name: string;
|
|
9
|
+
queue: QueueAction[];
|
|
10
|
+
end: () => void;
|
|
11
|
+
loopAction: boolean;
|
|
12
|
+
context: QueueContext;
|
|
13
|
+
constructor(opts: QueueOpts);
|
|
14
|
+
delay(timeout: number): Promise<unknown>;
|
|
15
|
+
run(context: object): Promise<void>;
|
|
16
|
+
iterate(action: IAction): Promise<void>;
|
|
17
|
+
push(actions: QueueAction[]): void;
|
|
18
|
+
processQueueItem(item: QueueAction): IAction;
|
|
19
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IAction } from "./types.js";
|
|
2
|
+
type EndListener = (name: string, size: number) => void;
|
|
3
|
+
export declare class QueueRunner {
|
|
4
|
+
queues: Map<any, any>;
|
|
5
|
+
listeners: EndListener[];
|
|
6
|
+
add(actions: IAction[], context?: object, name?: string): void;
|
|
7
|
+
addEndListener(listener: EndListener): void;
|
|
8
|
+
endEvent(name: string): void;
|
|
9
|
+
getName(): string;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface IAction {
|
|
2
|
+
delay: number;
|
|
3
|
+
execute: (context: any) => Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
export type ActionClass = new (...args: any[]) => IAction;
|
|
6
|
+
export type QueueAction = IAction | ActionClass;
|
|
7
|
+
export type Branches = {
|
|
8
|
+
then: QueueAction[];
|
|
9
|
+
else?: QueueAction[];
|
|
10
|
+
};
|
|
11
|
+
export type QueueContext = {
|
|
12
|
+
push: (actions: QueueAction[]) => void;
|
|
13
|
+
extend: (obj: Partial<object>) => void;
|
|
14
|
+
stop: () => void;
|
|
15
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Action } from "./action.js";
|
|
2
|
+
import { Branches, QueueContext, IAction } from "./types.js";
|
|
3
|
+
export declare class Delay extends Action<null> {
|
|
4
|
+
execute(): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare const util: {
|
|
7
|
+
delay(timeout: number): Delay;
|
|
8
|
+
if<C>(condition: (context: C) => Promise<boolean>, branches: Branches): {
|
|
9
|
+
execute(context: C & QueueContext): Promise<void>;
|
|
10
|
+
delay: number;
|
|
11
|
+
};
|
|
12
|
+
valid<C_1>(validator: (context: C_1) => Promise<boolean>, actions: IAction[]): {
|
|
13
|
+
execute(context: C_1 & QueueContext): Promise<void>;
|
|
14
|
+
delay: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "async-queue-runner",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Library to run in parallel extendable queue of tasks",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"compile": "tsc --project ./tsconfig.json",
|
|
8
|
+
"copy:package:json": "copyfiles ./package.json ./built/ && copyfiles ./package.json ./built/_esm/ && copyfiles ./package.json ./built/_cjs/",
|
|
9
|
+
"build:all": "tsc -p ./tsconfig.esm.json && tsc -p ./tsconfig.cjs.json && tsc -p ./tsconfig.types.json",
|
|
10
|
+
"build": "del-cli ./built/ && npm run build:all && npm run copy:package:json",
|
|
11
|
+
"watch": "tsc --watch --project ./tsconfig.json",
|
|
12
|
+
"test": "jest"
|
|
13
|
+
},
|
|
14
|
+
"exports": {
|
|
15
|
+
"./*": {
|
|
16
|
+
"types": "./_types/*.d.ts",
|
|
17
|
+
"require": "./_cjs/*.js",
|
|
18
|
+
"import": "./_esm/*.js",
|
|
19
|
+
"default": "./_esm/*.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"types": "./index.d.ts",
|
|
23
|
+
"keywords": [],
|
|
24
|
+
"author": "Eugeny Dementev",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@jest/globals": "^29.7.0",
|
|
28
|
+
"@tsconfig/node20": "^20.1.2",
|
|
29
|
+
"@types/node": "^20.11.26",
|
|
30
|
+
"copyfiles": "^2.4.1",
|
|
31
|
+
"del-cli": "^5.1.0",
|
|
32
|
+
"jest": "^29.7.0",
|
|
33
|
+
"ts-jest": "^29.1.2"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"typescript": "^5.4.2"
|
|
37
|
+
}
|
|
38
|
+
}
|