light-async-queue 1.0.1 → 2.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.
- package/README.md +334 -40
- package/dist/src/constants.d.ts +68 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +75 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/dashboard/Dashboard.d.ts +70 -0
- package/dist/src/dashboard/Dashboard.d.ts.map +1 -0
- package/dist/src/dashboard/Dashboard.js +308 -0
- package/dist/src/dashboard/Dashboard.js.map +1 -0
- package/dist/src/dashboard/index.d.ts +3 -0
- package/dist/src/dashboard/index.d.ts.map +1 -0
- package/dist/src/dashboard/index.js +2 -0
- package/dist/src/dashboard/index.js.map +1 -0
- package/dist/src/index.d.ts +13 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/queue/Backoff.d.ts.map +1 -1
- package/dist/src/queue/Backoff.js +2 -1
- package/dist/src/queue/Backoff.js.map +1 -1
- package/dist/src/queue/Job.d.ts +35 -4
- package/dist/src/queue/Job.d.ts.map +1 -1
- package/dist/src/queue/Job.js +97 -12
- package/dist/src/queue/Job.js.map +1 -1
- package/dist/src/queue/Queue.d.ts +73 -3
- package/dist/src/queue/Queue.d.ts.map +1 -1
- package/dist/src/queue/Queue.js +359 -36
- package/dist/src/queue/Queue.js.map +1 -1
- package/dist/src/queue/Scheduler.d.ts.map +1 -1
- package/dist/src/queue/Scheduler.js +8 -1
- package/dist/src/queue/Scheduler.js.map +1 -1
- package/dist/src/storage/FileStore.d.ts.map +1 -1
- package/dist/src/storage/FileStore.js +4 -3
- package/dist/src/storage/FileStore.js.map +1 -1
- package/dist/src/storage/MemoryStore.d.ts.map +1 -1
- package/dist/src/storage/MemoryStore.js +2 -1
- package/dist/src/storage/MemoryStore.js.map +1 -1
- package/dist/src/types.d.ts +85 -10
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +4 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/CronParser.d.ts +12 -0
- package/dist/src/utils/CronParser.d.ts.map +1 -0
- package/dist/src/utils/CronParser.js +28 -0
- package/dist/src/utils/CronParser.js.map +1 -0
- package/dist/src/utils/RateLimiter.d.ts +37 -0
- package/dist/src/utils/RateLimiter.d.ts.map +1 -0
- package/dist/src/utils/RateLimiter.js +68 -0
- package/dist/src/utils/RateLimiter.js.map +1 -0
- package/dist/src/utils/WebhookManager.d.ts +29 -0
- package/dist/src/utils/WebhookManager.d.ts.map +1 -0
- package/dist/src/utils/WebhookManager.js +82 -0
- package/dist/src/utils/WebhookManager.js.map +1 -0
- package/dist/src/worker/Worker.d.ts +2 -2
- package/dist/src/worker/Worker.d.ts.map +1 -1
- package/dist/src/worker/Worker.js +60 -38
- package/dist/src/worker/Worker.js.map +1 -1
- package/dist/src/worker/childProcessor.js +23 -7
- package/dist/src/worker/childProcessor.js.map +1 -1
- package/package.json +27 -5
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { fork } from
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { fork } from "node:child_process";
|
|
2
|
+
import { WorkerMessageType, WorkerSignalType, WorkerResponseType, } from "../types.js";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
4
5
|
const __filename = fileURLToPath(import.meta.url);
|
|
5
6
|
const __dirname = dirname(__filename);
|
|
6
7
|
/**
|
|
@@ -22,29 +23,29 @@ export class Worker {
|
|
|
22
23
|
*/
|
|
23
24
|
async initialize() {
|
|
24
25
|
return new Promise((resolve, reject) => {
|
|
25
|
-
const childProcessorPath = join(__dirname,
|
|
26
|
+
const childProcessorPath = join(__dirname, "childProcessor.js");
|
|
26
27
|
this.childProcess = fork(childProcessorPath, [], {
|
|
27
|
-
stdio: [
|
|
28
|
+
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
28
29
|
});
|
|
29
30
|
// Handle ready signal from child
|
|
30
31
|
const readyHandler = (message) => {
|
|
31
|
-
if (message.type ===
|
|
32
|
+
if (message.type === WorkerSignalType.READY) {
|
|
32
33
|
this.isReady = true;
|
|
33
|
-
this.childProcess?.off(
|
|
34
|
+
this.childProcess?.off("message", readyHandler);
|
|
34
35
|
// Send processor function to child
|
|
35
36
|
this.sendProcessorToChild()
|
|
36
37
|
.then(() => resolve())
|
|
37
38
|
.catch(reject);
|
|
38
39
|
}
|
|
39
40
|
};
|
|
40
|
-
this.childProcess.on(
|
|
41
|
+
this.childProcess.on("message", readyHandler);
|
|
41
42
|
// Handle child process errors
|
|
42
|
-
this.childProcess.on(
|
|
43
|
-
console.error(
|
|
43
|
+
this.childProcess.on("error", (error) => {
|
|
44
|
+
console.error("[Worker] Child process error:", error);
|
|
44
45
|
reject(error);
|
|
45
46
|
});
|
|
46
47
|
// Handle unexpected exit during initialization
|
|
47
|
-
this.childProcess.on(
|
|
48
|
+
this.childProcess.on("exit", (code, signal) => {
|
|
48
49
|
if (!this.isReady) {
|
|
49
50
|
reject(new Error(`Child process exited during initialization: code=${code}, signal=${signal}`));
|
|
50
51
|
}
|
|
@@ -52,7 +53,7 @@ export class Worker {
|
|
|
52
53
|
// Timeout after 5 seconds
|
|
53
54
|
setTimeout(() => {
|
|
54
55
|
if (!this.isReady) {
|
|
55
|
-
reject(new Error(
|
|
56
|
+
reject(new Error("Worker initialization timeout"));
|
|
56
57
|
}
|
|
57
58
|
}, 5000);
|
|
58
59
|
});
|
|
@@ -63,12 +64,12 @@ export class Worker {
|
|
|
63
64
|
async sendProcessorToChild() {
|
|
64
65
|
return new Promise((resolve, reject) => {
|
|
65
66
|
if (!this.childProcess) {
|
|
66
|
-
reject(new Error(
|
|
67
|
+
reject(new Error("Child process not initialized"));
|
|
67
68
|
return;
|
|
68
69
|
}
|
|
69
70
|
// Convert processor function to string
|
|
70
71
|
const processorCode = this.processor.toString();
|
|
71
|
-
this.childProcess.send({ type:
|
|
72
|
+
this.childProcess.send({ type: WorkerMessageType.SET_PROCESSOR, code: processorCode }, (error) => {
|
|
72
73
|
if (error) {
|
|
73
74
|
reject(error);
|
|
74
75
|
}
|
|
@@ -81,23 +82,36 @@ export class Worker {
|
|
|
81
82
|
/**
|
|
82
83
|
* Execute a job in the child process
|
|
83
84
|
*/
|
|
84
|
-
async execute(job) {
|
|
85
|
+
async execute(job, jobWithMethods) {
|
|
85
86
|
if (!this.childProcess || !this.isReady) {
|
|
86
|
-
throw new Error(
|
|
87
|
+
throw new Error("Worker not initialized");
|
|
87
88
|
}
|
|
88
89
|
if (this.currentJobId) {
|
|
89
|
-
throw new Error(
|
|
90
|
+
throw new Error("Worker is already processing a job");
|
|
90
91
|
}
|
|
91
92
|
this.currentJobId = job.id;
|
|
92
93
|
return new Promise((resolve, reject) => {
|
|
93
94
|
if (!this.childProcess) {
|
|
94
|
-
reject(new Error(
|
|
95
|
+
reject(new Error("Child process not available"));
|
|
95
96
|
return;
|
|
96
97
|
}
|
|
97
|
-
|
|
98
|
+
const exitHandler = (code, signal) => {
|
|
99
|
+
if (this.currentJobId === job.id) {
|
|
100
|
+
this.childProcess?.off("exit", exitHandler);
|
|
101
|
+
this.childProcess?.off("message", messageHandler);
|
|
102
|
+
this.currentJobId = null;
|
|
103
|
+
this.isReady = false;
|
|
104
|
+
resolve({
|
|
105
|
+
success: false,
|
|
106
|
+
error: `Worker crashed: code=${code}, signal=${signal}`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
};
|
|
98
110
|
const messageHandler = (message) => {
|
|
99
|
-
if (message.type ===
|
|
100
|
-
|
|
111
|
+
if (message.type === WorkerResponseType.RESULT &&
|
|
112
|
+
message.jobId === job.id) {
|
|
113
|
+
this.childProcess?.off("message", messageHandler);
|
|
114
|
+
this.childProcess?.off("exit", exitHandler);
|
|
101
115
|
this.currentJobId = null;
|
|
102
116
|
if (message.result.success) {
|
|
103
117
|
resolve({
|
|
@@ -112,24 +126,19 @@ export class Worker {
|
|
|
112
126
|
});
|
|
113
127
|
}
|
|
114
128
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
this.currentJobId = null;
|
|
122
|
-
this.isReady = false;
|
|
123
|
-
resolve({
|
|
124
|
-
success: false,
|
|
125
|
-
error: `Worker crashed: code=${code}, signal=${signal}`,
|
|
126
|
-
});
|
|
129
|
+
else if (message.type === "progress" && message.jobId === job.id) {
|
|
130
|
+
if (jobWithMethods?.updateProgress) {
|
|
131
|
+
jobWithMethods.updateProgress(message.progress).catch((err) => {
|
|
132
|
+
console.error("[Worker] Error updating progress:", err);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
127
135
|
}
|
|
128
136
|
};
|
|
129
|
-
this.childProcess.
|
|
137
|
+
this.childProcess.on("message", messageHandler);
|
|
138
|
+
this.childProcess.once("exit", exitHandler);
|
|
130
139
|
// Send job to child process
|
|
131
140
|
this.childProcess.send({
|
|
132
|
-
type:
|
|
141
|
+
type: WorkerMessageType.EXECUTE,
|
|
133
142
|
job,
|
|
134
143
|
});
|
|
135
144
|
});
|
|
@@ -150,17 +159,30 @@ export class Worker {
|
|
|
150
159
|
resolve();
|
|
151
160
|
return;
|
|
152
161
|
}
|
|
153
|
-
this.childProcess.once(
|
|
162
|
+
this.childProcess.once("exit", () => {
|
|
154
163
|
this.childProcess = null;
|
|
155
164
|
this.isReady = false;
|
|
156
165
|
this.currentJobId = null;
|
|
157
166
|
resolve();
|
|
158
167
|
});
|
|
159
|
-
|
|
168
|
+
try {
|
|
169
|
+
this.childProcess.kill();
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
const err = error;
|
|
173
|
+
if (err.code === "EPERM" || err.code === "ESRCH") {
|
|
174
|
+
this.childProcess = null;
|
|
175
|
+
this.isReady = false;
|
|
176
|
+
this.currentJobId = null;
|
|
177
|
+
resolve();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
160
182
|
// Force kill after 5 seconds
|
|
161
183
|
setTimeout(() => {
|
|
162
184
|
if (this.childProcess) {
|
|
163
|
-
this.childProcess.kill(
|
|
185
|
+
this.childProcess.kill("SIGKILL");
|
|
164
186
|
}
|
|
165
187
|
}, 5000);
|
|
166
188
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Worker.js","sourceRoot":"","sources":["../../../src/worker/Worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Worker.js","sourceRoot":"","sources":["../../../src/worker/Worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { WorkerMessageType, WorkerResponseType, WorkerSignalType } from '../types.js';
|
|
1
2
|
/**
|
|
2
3
|
* Child process script that executes jobs in isolation
|
|
3
4
|
* Communicates with parent via IPC
|
|
@@ -8,16 +9,32 @@ let processorFn = null;
|
|
|
8
9
|
* Handle messages from parent process
|
|
9
10
|
*/
|
|
10
11
|
process.on('message', async (message) => {
|
|
11
|
-
if (message.type ===
|
|
12
|
+
if (message.type === WorkerMessageType.EXECUTE) {
|
|
12
13
|
const { job } = message;
|
|
13
14
|
try {
|
|
14
15
|
// Execute the job processor
|
|
15
16
|
if (!processorFn) {
|
|
16
17
|
throw new Error('Processor function not set');
|
|
17
18
|
}
|
|
18
|
-
|
|
19
|
+
// Create job object with methods
|
|
20
|
+
const jobWithMethods = {
|
|
21
|
+
...job,
|
|
22
|
+
updateProgress: async (progress) => {
|
|
23
|
+
if (process.send) {
|
|
24
|
+
process.send({
|
|
25
|
+
type: 'progress',
|
|
26
|
+
jobId: job.id,
|
|
27
|
+
progress,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
log: (message) => {
|
|
32
|
+
console.log(`[Job ${job.id}] ${message}`);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const result = await processorFn(jobWithMethods);
|
|
19
36
|
const response = {
|
|
20
|
-
type:
|
|
37
|
+
type: WorkerResponseType.RESULT,
|
|
21
38
|
jobId: job.id,
|
|
22
39
|
result: {
|
|
23
40
|
success: true,
|
|
@@ -28,7 +45,7 @@ process.on('message', async (message) => {
|
|
|
28
45
|
}
|
|
29
46
|
catch (error) {
|
|
30
47
|
const response = {
|
|
31
|
-
type:
|
|
48
|
+
type: WorkerResponseType.RESULT,
|
|
32
49
|
jobId: job.id,
|
|
33
50
|
result: {
|
|
34
51
|
success: false,
|
|
@@ -38,7 +55,7 @@ process.on('message', async (message) => {
|
|
|
38
55
|
process.send(response);
|
|
39
56
|
}
|
|
40
57
|
}
|
|
41
|
-
else if (message.type ===
|
|
58
|
+
else if (message.type === WorkerMessageType.SET_PROCESSOR) {
|
|
42
59
|
// Receive the processor function code as a string and evaluate it
|
|
43
60
|
// This is sent from the parent during worker initialization
|
|
44
61
|
try {
|
|
@@ -64,7 +81,6 @@ process.on('unhandledRejection', (reason) => {
|
|
|
64
81
|
});
|
|
65
82
|
// Signal ready
|
|
66
83
|
if (process.send) {
|
|
67
|
-
process.send({ type:
|
|
84
|
+
process.send({ type: WorkerSignalType.READY });
|
|
68
85
|
}
|
|
69
|
-
export {};
|
|
70
86
|
//# sourceMappingURL=childProcessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"childProcessor.js","sourceRoot":"","sources":["../../../src/worker/childProcessor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"childProcessor.js","sourceRoot":"","sources":["../../../src/worker/childProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErH;;;GAGG;AAEH,mCAAmC;AACnC,IAAI,WAAW,GAAgD,IAAI,CAAC;AAEpE;;GAEG;AACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;IACrD,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAExB,IAAI,CAAC;YACH,4BAA4B;YAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YAED,iCAAiC;YACjC,MAAM,cAAc,GAAG;gBACrB,GAAG,GAAG;gBACN,cAAc,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;oBACzC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;wBACjB,OAAO,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,UAAU;4BAChB,KAAK,EAAE,GAAG,CAAC,EAAE;4BACb,QAAQ;yBACT,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE;oBACvB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;gBAC5C,CAAC;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,CAAC;YAEjD,MAAM,QAAQ,GAAmB;gBAC/B,IAAI,EAAE,kBAAkB,CAAC,MAAM;gBAC/B,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,MAAM,EAAE;oBACN,OAAO,EAAE,IAAI;oBACb,MAAM;iBACP;aACF,CAAC;YAEF,OAAO,CAAC,IAAK,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAmB;gBAC/B,IAAI,EAAE,kBAAkB,CAAC,MAAM;gBAC/B,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,MAAM,EAAE;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D;aACF,CAAC;YAEF,OAAO,CAAC,IAAK,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,CAAC,aAAa,EAAE,CAAC;QAC5D,kEAAkE;QAClE,4DAA4D;QAC5D,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAEnC,WAAW,GAAG,IAAI,CAAC,IAAI,aAAa,GAAG,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "light-async-queue",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Production-ready Redis-free async job queue
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Production-ready Redis-free async job queue - BullMQ alternative with file persistence",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
7
7
|
"types": "./dist/src/index.d.ts",
|
|
@@ -34,7 +34,24 @@
|
|
|
34
34
|
"task-queue",
|
|
35
35
|
"background-jobs",
|
|
36
36
|
"redis-free",
|
|
37
|
-
"typescript"
|
|
37
|
+
"typescript",
|
|
38
|
+
"bullmq",
|
|
39
|
+
"bull",
|
|
40
|
+
"cron",
|
|
41
|
+
"scheduler",
|
|
42
|
+
"job-dependencies",
|
|
43
|
+
"rate-limiting",
|
|
44
|
+
"webhooks",
|
|
45
|
+
"event-driven",
|
|
46
|
+
"progress-tracking",
|
|
47
|
+
"priority-queue",
|
|
48
|
+
"delayed-jobs",
|
|
49
|
+
"repeating-jobs",
|
|
50
|
+
"dashboard",
|
|
51
|
+
"monitoring",
|
|
52
|
+
"websocket",
|
|
53
|
+
"real-time",
|
|
54
|
+
"ui"
|
|
38
55
|
],
|
|
39
56
|
"author": "Akshay Gaikwad <gaikwad.akshay79@gmail.com>",
|
|
40
57
|
"license": "MIT",
|
|
@@ -46,9 +63,14 @@
|
|
|
46
63
|
"url": "https://github.com/gaikwadakshay79/light-async-queue/issues"
|
|
47
64
|
},
|
|
48
65
|
"homepage": "https://github.com/gaikwadakshay79/light-async-queue#readme",
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"cron-parser": "^5.5.0",
|
|
68
|
+
"ws": "^8.15.0"
|
|
69
|
+
},
|
|
49
70
|
"devDependencies": {
|
|
50
71
|
"@eslint/js": "^10.0.1",
|
|
51
72
|
"@types/node": "^20.10.0",
|
|
73
|
+
"@types/ws": "^8.5.10",
|
|
52
74
|
"@typescript-eslint/eslint-plugin": "^8.56.0",
|
|
53
75
|
"@typescript-eslint/parser": "^8.56.0",
|
|
54
76
|
"@vitest/coverage-v8": "^4.0.18",
|
|
@@ -58,11 +80,11 @@
|
|
|
58
80
|
"vitest": "^4.0.18"
|
|
59
81
|
},
|
|
60
82
|
"scripts": {
|
|
61
|
-
"build": "tsc",
|
|
83
|
+
"build": "tsc --project tsconfig.build.json",
|
|
84
|
+
"build:examples": "tsc --project tsconfig.examples.json",
|
|
62
85
|
"dev": "tsc --watch",
|
|
63
86
|
"lint": "eslint src test --ext .ts",
|
|
64
87
|
"lint:fix": "eslint src test --ext .ts --fix",
|
|
65
|
-
"example": "pnpm run build && node dist/example/basic.js",
|
|
66
88
|
"test": "vitest run",
|
|
67
89
|
"test:watch": "vitest",
|
|
68
90
|
"test:coverage": "vitest run --coverage",
|