Skip to content

Commit cc68e77

Browse files
jkniestRihanArfan
andcommitted
fix: alow to run tasks via nitro cli (#4188)
Co-authored-by: Rihan Arfan <me@file.properties>
1 parent ff18934 commit cc68e77

2 files changed

Lines changed: 68 additions & 13 deletions

File tree

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
1-
import { H3 } from "h3";
1+
import { H3, type H3Event } from "h3";
22
import { runTask } from "../task.ts";
33

44
import { scheduledTasks, tasks } from "#nitro/virtual/tasks";
55

6+
const taskHandler = async (event: H3Event) => {
7+
const name = event.context.params?.name;
8+
const body = (await event.req.json().catch(() => ({}))) as Record<string, unknown>;
9+
const payload = {
10+
...Object.fromEntries(event.url.searchParams.entries()),
11+
...((body.payload as Record<string, unknown>) ?? body),
12+
};
13+
return await runTask(name!, {
14+
context: { waitUntil: event.req.waitUntil },
15+
payload,
16+
});
17+
};
18+
619
const app: H3 = new H3()
720
.get("/_nitro/tasks", async () => {
821
const _tasks = await Promise.all(
@@ -16,17 +29,7 @@ const app: H3 = new H3()
1629
scheduledTasks,
1730
};
1831
})
19-
.get("/_nitro/tasks/:name", async (event) => {
20-
const name = event.context.params?.name;
21-
const body = (await event.req.json().catch(() => ({}))) as Record<string, unknown>;
22-
const payload = {
23-
...Object.fromEntries(event.url.searchParams.entries()),
24-
...body,
25-
};
26-
return await runTask(name!, {
27-
context: { waitUntil: event.req.waitUntil },
28-
payload,
29-
});
30-
});
32+
.get("/_nitro/tasks/:name", taskHandler)
33+
.post("/_nitro/tasks/:name", taskHandler);
3134

3235
export default app;

test/presets/nitro-dev.test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,58 @@ describe("nitro:preset:nitro-dev", async () => {
2222
expect(status).toBe(200);
2323
});
2424

25+
describe("tasks", () => {
26+
it("GET /_nitro/tasks lists tasks", async () => {
27+
const { data, status } = await callHandler({ url: "/_nitro/tasks" });
28+
expect(status).toBe(200);
29+
expect(data.tasks).toBeTypeOf("object");
30+
expect(data.tasks.test).toMatchObject({ description: "task to debug" });
31+
expect(data.tasks["db:migrate"]).toMatchObject({
32+
description: "Run database migrations",
33+
});
34+
expect(data.scheduledTasks).toEqual(
35+
expect.arrayContaining([
36+
expect.objectContaining({ cron: "* * * * *", tasks: ["test"] }),
37+
])
38+
);
39+
});
40+
41+
it("GET /_nitro/tasks/:name runs a task", async () => {
42+
const { data, status } = await callHandler({
43+
url: "/_nitro/tasks/db:migrate",
44+
});
45+
expect(status).toBe(200);
46+
expect(data.result).toBe("Success");
47+
});
48+
49+
it("POST /_nitro/tasks/:name runs a task", async () => {
50+
const { data, status } = await callHandler({
51+
url: "/_nitro/tasks/db:migrate",
52+
method: "POST",
53+
});
54+
expect(status).toBe(200);
55+
expect(data.result).toBe("Success");
56+
});
57+
58+
it("POST /_nitro/tasks/:name accepts payload", async () => {
59+
const { data, status } = await callHandler({
60+
url: "/_nitro/tasks/test",
61+
method: "POST",
62+
body: JSON.stringify({ payload: { key: "value" } }),
63+
});
64+
expect(status).toBe(200);
65+
expect(data.result.payload.key).toBe("value");
66+
});
67+
68+
it("GET /_nitro/tasks/:name accepts query params as payload", async () => {
69+
const { data, status } = await callHandler({
70+
url: "/_nitro/tasks/test?key=value",
71+
});
72+
expect(status).toBe(200);
73+
expect(data.result.payload.key).toBe("value");
74+
});
75+
});
76+
2577
describe("openAPI", () => {
2678
let spec: OpenAPI3;
2779
it("/_openapi.json", async () => {

0 commit comments

Comments
 (0)