trigger.dev 3.0.0-beta.5 → 3.0.0-beta.51
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/Containerfile.prod +32 -4
- package/dist/index.js +2810 -918
- package/dist/index.js.map +1 -1
- package/dist/templates/trigger.config.ts.template +1 -1
- package/dist/workers/dev/worker-facade.js +71 -66
- package/dist/workers/dev/worker-setup.js +18 -23
- package/dist/workers/prod/entry-point.js +1439 -421
- package/dist/workers/prod/worker-facade.js +102 -72
- package/dist/workers/prod/worker-setup.js +14 -25
- package/package.json +15 -20
|
@@ -2,92 +2,71 @@
|
|
|
2
2
|
import {
|
|
3
3
|
ProdChildToWorkerMessages,
|
|
4
4
|
ProdWorkerToChildMessages,
|
|
5
|
-
TaskExecutor,
|
|
6
|
-
ZodIpcConnection,
|
|
7
|
-
DurableClock,
|
|
8
5
|
clock,
|
|
9
|
-
|
|
10
|
-
logLevels,
|
|
11
|
-
ZodSchemaParsedError
|
|
6
|
+
taskCatalog
|
|
12
7
|
} from "@trigger.dev/core/v3";
|
|
13
|
-
import "source-map-support/register.js";
|
|
14
8
|
import {
|
|
15
9
|
ConsoleInterceptor,
|
|
10
|
+
DevUsageManager,
|
|
11
|
+
DurableClock,
|
|
16
12
|
OtelTaskLogger,
|
|
17
|
-
|
|
13
|
+
ProdUsageManager,
|
|
14
|
+
TaskExecutor,
|
|
15
|
+
getEnvVar,
|
|
16
|
+
logLevels,
|
|
17
|
+
usage
|
|
18
|
+
} from "@trigger.dev/core/v3/workers";
|
|
19
|
+
import { ZodIpcConnection } from "@trigger.dev/core/v3/zodIpc";
|
|
20
|
+
import { ZodSchemaParsedError } from "@trigger.dev/core/v3/zodMessageHandler";
|
|
21
|
+
import "source-map-support/register.js";
|
|
22
|
+
import {
|
|
18
23
|
TaskRunErrorCodes,
|
|
19
24
|
TriggerTracer,
|
|
20
25
|
logger,
|
|
21
26
|
runtime
|
|
22
27
|
} from "@trigger.dev/core/v3";
|
|
23
|
-
|
|
24
|
-
// package.json
|
|
25
|
-
var version = "3.0.0-beta.5";
|
|
26
|
-
|
|
27
|
-
// src/workers/prod/worker-facade.ts
|
|
28
|
+
import { ProdRuntimeManager } from "@trigger.dev/core/v3/prod";
|
|
28
29
|
__WORKER_SETUP__;
|
|
29
30
|
__IMPORTED_PROJECT_CONFIG__;
|
|
30
|
-
var
|
|
31
|
-
var
|
|
31
|
+
var heartbeatIntervalMs = getEnvVar("USAGE_HEARTBEAT_INTERVAL_MS");
|
|
32
|
+
var usageEventUrl = getEnvVar("USAGE_EVENT_URL");
|
|
33
|
+
var triggerJWT = getEnvVar("TRIGGER_JWT");
|
|
34
|
+
var prodUsageManager = new ProdUsageManager(new DevUsageManager(), {
|
|
35
|
+
heartbeatIntervalMs: heartbeatIntervalMs ? parseInt(heartbeatIntervalMs, 10) : void 0,
|
|
36
|
+
url: usageEventUrl,
|
|
37
|
+
jwt: triggerJWT
|
|
38
|
+
});
|
|
39
|
+
usage.setGlobalUsageManager(prodUsageManager);
|
|
32
40
|
var durableClock = new DurableClock();
|
|
33
41
|
clock.setGlobalClock(durableClock);
|
|
34
42
|
var tracer = new TriggerTracer({ tracer: otelTracer, logger: otelLogger });
|
|
35
|
-
var consoleInterceptor = new ConsoleInterceptor(otelLogger);
|
|
43
|
+
var consoleInterceptor = new ConsoleInterceptor(otelLogger, true);
|
|
36
44
|
var triggerLogLevel = getEnvVar("TRIGGER_LOG_LEVEL");
|
|
37
45
|
var configLogLevel = triggerLogLevel ? triggerLogLevel : importedConfig ? importedConfig.logLevel : __PROJECT_CONFIG__.logLevel;
|
|
38
46
|
var otelTaskLogger = new OtelTaskLogger({
|
|
39
47
|
logger: otelLogger,
|
|
40
48
|
tracer,
|
|
41
|
-
level: logLevels.includes(configLogLevel) ? configLogLevel : "
|
|
49
|
+
level: logLevels.includes(configLogLevel) ? configLogLevel : "info"
|
|
42
50
|
});
|
|
43
51
|
logger.setGlobalTaskLogger(otelTaskLogger);
|
|
44
52
|
var TaskFileImports = {};
|
|
45
53
|
var TaskFiles = {};
|
|
46
54
|
__TASKS__;
|
|
47
|
-
|
|
48
|
-
const result = [];
|
|
55
|
+
(() => {
|
|
49
56
|
for (const [importName, taskFile] of Object.entries(TaskFiles)) {
|
|
50
57
|
const fileImports = TaskFileImports[importName];
|
|
51
58
|
for (const [exportName, task] of Object.entries(fileImports ?? {})) {
|
|
52
|
-
if (task.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
retry: task.__trigger.retry,
|
|
60
|
-
machine: task.__trigger.machine,
|
|
61
|
-
fns: task.__trigger.fns
|
|
62
|
-
});
|
|
59
|
+
if (typeof task === "object" && task !== null && "id" in task && typeof task.id === "string") {
|
|
60
|
+
if (taskCatalog.taskExists(task.id)) {
|
|
61
|
+
taskCatalog.registerTaskFileMetadata(task.id, {
|
|
62
|
+
exportName,
|
|
63
|
+
filePath: taskFile.filePath
|
|
64
|
+
});
|
|
65
|
+
}
|
|
63
66
|
}
|
|
64
67
|
}
|
|
65
68
|
}
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
function getTaskMetadata() {
|
|
69
|
-
const result = getTasks();
|
|
70
|
-
return result.map((task) => {
|
|
71
|
-
const { fns, ...metadata } = task;
|
|
72
|
-
return metadata;
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
var tasks = getTasks();
|
|
76
|
-
runtime.registerTasks(tasks);
|
|
77
|
-
var taskExecutors = /* @__PURE__ */ new Map();
|
|
78
|
-
for (const task of tasks) {
|
|
79
|
-
taskExecutors.set(
|
|
80
|
-
task.id,
|
|
81
|
-
new TaskExecutor(task, {
|
|
82
|
-
tracer,
|
|
83
|
-
tracingSDK,
|
|
84
|
-
consoleInterceptor,
|
|
85
|
-
projectConfig: __PROJECT_CONFIG__,
|
|
86
|
-
importedConfig,
|
|
87
|
-
handleErrorFn: handleError
|
|
88
|
-
})
|
|
89
|
-
);
|
|
90
|
-
}
|
|
69
|
+
})();
|
|
91
70
|
var _execution;
|
|
92
71
|
var _isRunning = false;
|
|
93
72
|
var zodIpc = new ZodIpcConnection({
|
|
@@ -102,7 +81,7 @@ var zodIpc = new ZodIpcConnection({
|
|
|
102
81
|
execution,
|
|
103
82
|
result: {
|
|
104
83
|
ok: false,
|
|
105
|
-
id: execution.
|
|
84
|
+
id: execution.run.id,
|
|
106
85
|
error: {
|
|
107
86
|
type: "INTERNAL_ERROR",
|
|
108
87
|
code: TaskRunErrorCodes.TASK_ALREADY_RUNNING
|
|
@@ -112,14 +91,14 @@ var zodIpc = new ZodIpcConnection({
|
|
|
112
91
|
return;
|
|
113
92
|
}
|
|
114
93
|
process.title = `trigger-prod-worker: ${execution.task.id} ${execution.run.id}`;
|
|
115
|
-
const
|
|
116
|
-
if (!
|
|
117
|
-
console.error(`Could not find
|
|
94
|
+
const task = taskCatalog.getTask(execution.task.id);
|
|
95
|
+
if (!task) {
|
|
96
|
+
console.error(`Could not find task ${execution.task.id}`);
|
|
118
97
|
await sender.send("TASK_RUN_COMPLETED", {
|
|
119
98
|
execution,
|
|
120
99
|
result: {
|
|
121
100
|
ok: false,
|
|
122
|
-
id: execution.
|
|
101
|
+
id: execution.run.id,
|
|
123
102
|
error: {
|
|
124
103
|
type: "INTERNAL_ERROR",
|
|
125
104
|
code: TaskRunErrorCodes.COULD_NOT_FIND_EXECUTOR
|
|
@@ -128,51 +107,102 @@ var zodIpc = new ZodIpcConnection({
|
|
|
128
107
|
});
|
|
129
108
|
return;
|
|
130
109
|
}
|
|
110
|
+
const executor = new TaskExecutor(task, {
|
|
111
|
+
tracer,
|
|
112
|
+
tracingSDK,
|
|
113
|
+
consoleInterceptor,
|
|
114
|
+
projectConfig: __PROJECT_CONFIG__,
|
|
115
|
+
importedConfig,
|
|
116
|
+
handleErrorFn: handleError
|
|
117
|
+
});
|
|
131
118
|
try {
|
|
132
119
|
_execution = execution;
|
|
133
120
|
_isRunning = true;
|
|
134
|
-
const
|
|
135
|
-
|
|
121
|
+
const measurement = usage.start();
|
|
122
|
+
const { result } = await executor.execute(execution, metadata, traceContext, measurement);
|
|
123
|
+
const usageSample = usage.stop(measurement);
|
|
124
|
+
return await sender.send("TASK_RUN_COMPLETED", {
|
|
136
125
|
execution,
|
|
137
|
-
result
|
|
126
|
+
result: {
|
|
127
|
+
...result,
|
|
128
|
+
usage: {
|
|
129
|
+
durationMs: usageSample.cpuTime
|
|
130
|
+
}
|
|
131
|
+
}
|
|
138
132
|
});
|
|
139
133
|
} finally {
|
|
140
134
|
_execution = void 0;
|
|
141
135
|
_isRunning = false;
|
|
142
136
|
}
|
|
143
137
|
},
|
|
144
|
-
TASK_RUN_COMPLETED_NOTIFICATION: async ({ completion
|
|
145
|
-
prodRuntimeManager.resumeTask(completion
|
|
138
|
+
TASK_RUN_COMPLETED_NOTIFICATION: async ({ completion }) => {
|
|
139
|
+
prodRuntimeManager.resumeTask(completion);
|
|
146
140
|
},
|
|
147
141
|
WAIT_COMPLETED_NOTIFICATION: async () => {
|
|
148
|
-
prodRuntimeManager.
|
|
142
|
+
prodRuntimeManager.resumeAfterDuration();
|
|
149
143
|
},
|
|
150
144
|
CLEANUP: async ({ flush, kill }, sender) => {
|
|
151
145
|
if (kill) {
|
|
152
|
-
await
|
|
146
|
+
await flushAll();
|
|
153
147
|
await sender.send("READY_TO_DISPOSE", void 0);
|
|
154
148
|
} else {
|
|
155
149
|
if (flush) {
|
|
156
|
-
await
|
|
150
|
+
await flushAll();
|
|
157
151
|
}
|
|
158
152
|
}
|
|
159
153
|
}
|
|
160
154
|
}
|
|
161
155
|
});
|
|
156
|
+
async function flushAll(timeoutInMs = 1e4) {
|
|
157
|
+
const now = performance.now();
|
|
158
|
+
console.log(`Flushing at ${now}`);
|
|
159
|
+
await Promise.all([flushUsage(), flushTracingSDK()]);
|
|
160
|
+
const duration = performance.now() - now;
|
|
161
|
+
console.log(`Flushed in ${duration}ms`);
|
|
162
|
+
}
|
|
163
|
+
async function flushUsage() {
|
|
164
|
+
const now = performance.now();
|
|
165
|
+
console.log(`Flushing usage at ${now}`);
|
|
166
|
+
await prodUsageManager.flush();
|
|
167
|
+
const duration = performance.now() - now;
|
|
168
|
+
console.log(`Flushed usage in ${duration}ms`);
|
|
169
|
+
}
|
|
170
|
+
async function flushTracingSDK() {
|
|
171
|
+
const now = performance.now();
|
|
172
|
+
console.log(`Flushing tracingSDK at ${now}`);
|
|
173
|
+
await tracingSDK.flush();
|
|
174
|
+
const duration = performance.now() - now;
|
|
175
|
+
console.log(`Flushed tracingSDK in ${duration}ms`);
|
|
176
|
+
}
|
|
177
|
+
process.on("SIGTERM", async () => {
|
|
178
|
+
});
|
|
162
179
|
var prodRuntimeManager = new ProdRuntimeManager(zodIpc, {
|
|
163
180
|
waitThresholdInMs: parseInt(process.env.TRIGGER_RUNTIME_WAIT_THRESHOLD_IN_MS ?? "30000", 10)
|
|
164
181
|
});
|
|
165
182
|
runtime.setGlobalRuntimeManager(prodRuntimeManager);
|
|
166
|
-
var
|
|
167
|
-
|
|
183
|
+
var taskMetadata = taskCatalog.getAllTaskMetadata();
|
|
184
|
+
if (typeof importedConfig?.machine === "string") {
|
|
185
|
+
taskMetadata = taskMetadata.map((task) => {
|
|
186
|
+
if (typeof task.machine?.preset !== "string") {
|
|
187
|
+
return {
|
|
188
|
+
...task,
|
|
189
|
+
machine: {
|
|
190
|
+
preset: importedConfig.machine
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
return task;
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
zodIpc.send("TASKS_READY", { tasks: taskMetadata }).catch((err) => {
|
|
168
198
|
if (err instanceof ZodSchemaParsedError) {
|
|
169
|
-
zodIpc.send("TASKS_FAILED_TO_PARSE", { zodIssues: err.error.issues, tasks:
|
|
199
|
+
zodIpc.send("TASKS_FAILED_TO_PARSE", { zodIssues: err.error.issues, tasks: taskMetadata });
|
|
170
200
|
} else {
|
|
171
201
|
console.error("Failed to send TASKS_READY message", err);
|
|
172
202
|
}
|
|
173
203
|
});
|
|
174
204
|
process.title = "trigger-prod-worker";
|
|
175
|
-
async function asyncHeartbeat(initialDelayInSeconds = 30, intervalInSeconds =
|
|
205
|
+
async function asyncHeartbeat(initialDelayInSeconds = 30, intervalInSeconds = 20) {
|
|
176
206
|
async function _doHeartbeat() {
|
|
177
207
|
while (true) {
|
|
178
208
|
if (_isRunning && _execution) {
|
|
@@ -1,35 +1,24 @@
|
|
|
1
|
+
// package.json
|
|
2
|
+
var version = "3.0.0-beta.51";
|
|
3
|
+
|
|
1
4
|
// src/workers/prod/worker-setup.ts
|
|
2
|
-
import {
|
|
5
|
+
import { taskCatalog } from "@trigger.dev/core/v3";
|
|
3
6
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from "@trigger.dev/core/v3";
|
|
7
|
+
TracingSDK,
|
|
8
|
+
StandardTaskCatalog
|
|
9
|
+
} from "@trigger.dev/core/v3/workers";
|
|
7
10
|
__SETUP_IMPORTED_PROJECT_CONFIG__;
|
|
8
11
|
var tracingSDK = new TracingSDK({
|
|
9
12
|
url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://0.0.0.0:4318",
|
|
10
|
-
resource: new Resource({
|
|
11
|
-
[SemanticInternalAttributes.CLI_VERSION]: "3.0.0"
|
|
12
|
-
}),
|
|
13
13
|
instrumentations: setupImportedConfig?.instrumentations ?? [],
|
|
14
|
-
diagLogLevel: process.env.OTEL_LOG_LEVEL ?? "none"
|
|
15
|
-
|
|
16
|
-
process.on("uncaughtException", (error, origin) => {
|
|
17
|
-
process.send?.({
|
|
18
|
-
type: "EVENT",
|
|
19
|
-
message: {
|
|
20
|
-
type: "UNCAUGHT_EXCEPTION",
|
|
21
|
-
payload: {
|
|
22
|
-
error: {
|
|
23
|
-
name: error.name,
|
|
24
|
-
message: error.message,
|
|
25
|
-
stack: error.stack
|
|
26
|
-
},
|
|
27
|
-
origin
|
|
28
|
-
},
|
|
29
|
-
version: "v1"
|
|
30
|
-
}
|
|
31
|
-
});
|
|
14
|
+
diagLogLevel: process.env.OTEL_LOG_LEVEL ?? "none",
|
|
15
|
+
forceFlushTimeoutMillis: process.env.OTEL_FORCE_FLUSH_TIMEOUT ? parseInt(process.env.OTEL_FORCE_FLUSH_TIMEOUT, 10) : 5e3
|
|
32
16
|
});
|
|
17
|
+
var otelTracer = tracingSDK.getTracer("trigger-prod-worker", version);
|
|
18
|
+
var otelLogger = tracingSDK.getLogger("trigger-prod-worker", version);
|
|
19
|
+
taskCatalog.setGlobalTaskCatalog(new StandardTaskCatalog());
|
|
33
20
|
export {
|
|
21
|
+
otelLogger,
|
|
22
|
+
otelTracer,
|
|
34
23
|
tracingSDK
|
|
35
24
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trigger.dev",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.51",
|
|
4
4
|
"description": "A Command-Line Interface for Trigger.dev (v3) projects",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -32,11 +32,10 @@
|
|
|
32
32
|
"type": "module",
|
|
33
33
|
"exports": "./dist/index.js",
|
|
34
34
|
"bin": {
|
|
35
|
-
"
|
|
35
|
+
"triggerdev": "./dist/index.js"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/gradient-string": "^1.1.2",
|
|
39
|
-
"@types/jsonlines": "^0.1.5",
|
|
40
39
|
"@types/mock-fs": "^4.13.1",
|
|
41
40
|
"@types/node": "18",
|
|
42
41
|
"@types/object-hash": "^3.0.6",
|
|
@@ -44,25 +43,23 @@
|
|
|
44
43
|
"@types/semver": "^7.3.13",
|
|
45
44
|
"@types/ws": "^8.5.3",
|
|
46
45
|
"cpy-cli": "^5.0.0",
|
|
46
|
+
"nodemon": "^3.0.1",
|
|
47
47
|
"npm-run-all": "^4.1.5",
|
|
48
|
-
"npm-watch": "^0.11.0",
|
|
49
48
|
"open": "^10.0.3",
|
|
50
49
|
"p-retry": "^6.1.0",
|
|
51
|
-
"rimraf": "^
|
|
50
|
+
"rimraf": "^5.0.7",
|
|
52
51
|
"tsup": "^8.0.1",
|
|
53
52
|
"type-fest": "^3.6.0",
|
|
54
53
|
"typescript": "^5.3.3",
|
|
55
|
-
"vitest": "^
|
|
54
|
+
"vitest": "^1.6.0",
|
|
56
55
|
"xdg-app-paths": "^8.3.0",
|
|
57
|
-
"@trigger.dev/core-apps": "3.0.0-beta.
|
|
56
|
+
"@trigger.dev/core-apps": "3.0.0-beta.51",
|
|
58
57
|
"@trigger.dev/tsconfig": "0.0.0"
|
|
59
58
|
},
|
|
60
|
-
"watch": {
|
|
61
|
-
"build:prod-containerfile": "src/Containerfile.prod"
|
|
62
|
-
},
|
|
63
59
|
"dependencies": {
|
|
60
|
+
"@anatine/esbuild-decorators": "^0.2.19",
|
|
64
61
|
"@clack/prompts": "^0.7.0",
|
|
65
|
-
"@depot/cli": "0.0.1-cli.2.
|
|
62
|
+
"@depot/cli": "0.0.1-cli.2.71.0",
|
|
66
63
|
"@opentelemetry/api": "^1.8.0",
|
|
67
64
|
"@opentelemetry/api-logs": "^0.49.1",
|
|
68
65
|
"@opentelemetry/exporter-logs-otlp-http": "^0.49.1",
|
|
@@ -75,7 +72,7 @@
|
|
|
75
72
|
"@opentelemetry/sdk-trace-base": "^1.22.0",
|
|
76
73
|
"@opentelemetry/sdk-trace-node": "^1.22.0",
|
|
77
74
|
"@opentelemetry/semantic-conventions": "^1.22.0",
|
|
78
|
-
"@trigger.dev/core": "
|
|
75
|
+
"@trigger.dev/core": "3.0.0-beta.51",
|
|
79
76
|
"@types/degit": "^2.8.3",
|
|
80
77
|
"chalk": "^5.2.0",
|
|
81
78
|
"chokidar": "^3.5.3",
|
|
@@ -85,19 +82,17 @@
|
|
|
85
82
|
"dotenv": "^16.4.4",
|
|
86
83
|
"esbuild": "^0.19.11",
|
|
87
84
|
"evt": "^2.4.13",
|
|
88
|
-
"execa": "^
|
|
85
|
+
"execa": "^9.1.0",
|
|
89
86
|
"find-up": "^7.0.0",
|
|
90
87
|
"glob": "^10.3.10",
|
|
91
88
|
"gradient-string": "^2.0.2",
|
|
92
89
|
"import-meta-resolve": "^4.0.0",
|
|
93
90
|
"ink": "^4.4.1",
|
|
94
|
-
"jsonc-parser": "
|
|
95
|
-
"jsonlines": "^0.1.1",
|
|
91
|
+
"jsonc-parser": "3.2.1",
|
|
96
92
|
"liquidjs": "^10.9.2",
|
|
97
93
|
"mock-fs": "^5.2.0",
|
|
98
94
|
"nanoid": "^4.0.2",
|
|
99
95
|
"node-fetch": "^3.3.0",
|
|
100
|
-
"npm-check-updates": "^16.12.2",
|
|
101
96
|
"object-hash": "^3.0.0",
|
|
102
97
|
"p-debounce": "^4.0.0",
|
|
103
98
|
"p-throttle": "^6.1.0",
|
|
@@ -107,12 +102,11 @@
|
|
|
107
102
|
"react-error-boundary": "^4.0.12",
|
|
108
103
|
"semver": "^7.5.0",
|
|
109
104
|
"simple-git": "^3.19.0",
|
|
110
|
-
"socket.io-client": "^4.7.4",
|
|
111
105
|
"source-map-support": "^0.5.21",
|
|
112
|
-
"supports-color": "^9.4.0",
|
|
113
106
|
"terminal-link": "^3.0.0",
|
|
114
107
|
"tiny-invariant": "^1.2.0",
|
|
115
108
|
"tsconfig-paths": "^4.2.0",
|
|
109
|
+
"typescript": "^5.4.0",
|
|
116
110
|
"update-check": "^1.5.4",
|
|
117
111
|
"url": "^0.11.1",
|
|
118
112
|
"ws": "^8.12.0",
|
|
@@ -131,9 +125,10 @@
|
|
|
131
125
|
"dev": "npm run clean && run-p dev:**",
|
|
132
126
|
"dev:main": "tsup --watch",
|
|
133
127
|
"dev:workers": "tsup --config tsup.workers.config.ts --watch",
|
|
134
|
-
"dev:
|
|
128
|
+
"dev:test": "nodemon -w src/Containerfile.prod -x npm run build:prod-containerfile",
|
|
135
129
|
"clean": "rimraf dist",
|
|
136
130
|
"start": "node dist/index.js",
|
|
137
|
-
"test": "vitest"
|
|
131
|
+
"test": "vitest",
|
|
132
|
+
"test:e2e": "vitest --run -c e2e/vite.config.js"
|
|
138
133
|
}
|
|
139
134
|
}
|