@queuebase/cli 1.4.0 → 1.5.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/dist/__tests__/generate.test.d.ts +2 -0
- package/dist/__tests__/generate.test.d.ts.map +1 -0
- package/dist/__tests__/generate.test.js +204 -0
- package/dist/__tests__/generate.test.js.map +1 -0
- package/dist/__tests__/manifest.test.d.ts +2 -0
- package/dist/__tests__/manifest.test.d.ts.map +1 -0
- package/dist/__tests__/manifest.test.js +41 -0
- package/dist/__tests__/manifest.test.js.map +1 -0
- package/dist/__tests__/sync-schedules.test.d.ts +2 -0
- package/dist/__tests__/sync-schedules.test.d.ts.map +1 -0
- package/dist/__tests__/sync-schedules.test.js +171 -0
- package/dist/__tests__/sync-schedules.test.js.map +1 -0
- package/dist/bin.js +7 -1
- package/dist/bin.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +3 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/generate.d.ts +2 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +10 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +36 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/schedule-queries.d.ts +59 -0
- package/dist/db/schedule-queries.d.ts.map +1 -0
- package/dist/db/schedule-queries.js +78 -0
- package/dist/db/schedule-queries.js.map +1 -0
- package/dist/generate.d.ts +12 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +103 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +12 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +15 -0
- package/dist/manifest.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -0
- package/dist/server.js.map +1 -1
- package/dist/sync-schedules.d.ts +4 -0
- package/dist/sync-schedules.d.ts.map +1 -0
- package/dist/sync-schedules.js +29 -0
- package/dist/sync-schedules.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/generate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { buildManifest, discoverRouterPath, generate, loadRouter, writeManifest, } from "../generate.js";
|
|
6
|
+
import { getManifestPath, readManifest } from "../manifest.js";
|
|
7
|
+
describe("discoverRouterPath", () => {
|
|
8
|
+
let tmpDir;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "qb-generate-"));
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
14
|
+
});
|
|
15
|
+
it("finds router at src/jobs/index.ts", async () => {
|
|
16
|
+
const routerDir = path.join(tmpDir, "src", "jobs");
|
|
17
|
+
fs.mkdirSync(routerDir, { recursive: true });
|
|
18
|
+
fs.writeFileSync(path.join(routerDir, "index.ts"), "export default {}");
|
|
19
|
+
const result = await discoverRouterPath(tmpDir);
|
|
20
|
+
expect(result).toBe(path.join(tmpDir, "src", "jobs", "index.ts"));
|
|
21
|
+
});
|
|
22
|
+
it("finds router at jobs/index.ts when src/jobs does not exist", async () => {
|
|
23
|
+
const routerDir = path.join(tmpDir, "jobs");
|
|
24
|
+
fs.mkdirSync(routerDir, { recursive: true });
|
|
25
|
+
fs.writeFileSync(path.join(routerDir, "index.ts"), "export default {}");
|
|
26
|
+
const result = await discoverRouterPath(tmpDir);
|
|
27
|
+
expect(result).toBe(path.join(tmpDir, "jobs", "index.ts"));
|
|
28
|
+
});
|
|
29
|
+
it("prefers src/jobs/index.ts over jobs/index.ts", async () => {
|
|
30
|
+
for (const dir of ["src/jobs", "jobs"]) {
|
|
31
|
+
const routerDir = path.join(tmpDir, dir);
|
|
32
|
+
fs.mkdirSync(routerDir, { recursive: true });
|
|
33
|
+
fs.writeFileSync(path.join(routerDir, "index.ts"), "export default {}");
|
|
34
|
+
}
|
|
35
|
+
const result = await discoverRouterPath(tmpDir);
|
|
36
|
+
expect(result).toBe(path.join(tmpDir, "src", "jobs", "index.ts"));
|
|
37
|
+
});
|
|
38
|
+
it("finds .js files", async () => {
|
|
39
|
+
const routerDir = path.join(tmpDir, "src", "jobs");
|
|
40
|
+
fs.mkdirSync(routerDir, { recursive: true });
|
|
41
|
+
fs.writeFileSync(path.join(routerDir, "index.js"), "export default {}");
|
|
42
|
+
const result = await discoverRouterPath(tmpDir);
|
|
43
|
+
expect(result).toBe(path.join(tmpDir, "src", "jobs", "index.js"));
|
|
44
|
+
});
|
|
45
|
+
it("throws when no router is found", async () => {
|
|
46
|
+
await expect(discoverRouterPath(tmpDir)).rejects.toThrow(/Could not find job router/);
|
|
47
|
+
});
|
|
48
|
+
it("reads routerPath from queuebase.config.js", async () => {
|
|
49
|
+
const customDir = path.join(tmpDir, "custom");
|
|
50
|
+
fs.mkdirSync(customDir, { recursive: true });
|
|
51
|
+
fs.writeFileSync(path.join(customDir, "router.ts"), "export default {}");
|
|
52
|
+
fs.writeFileSync(path.join(tmpDir, "queuebase.config.js"), "export default { routerPath: './custom/router.ts' }");
|
|
53
|
+
const result = await discoverRouterPath(tmpDir);
|
|
54
|
+
expect(result).toBe(path.join(tmpDir, "custom", "router.ts"));
|
|
55
|
+
});
|
|
56
|
+
it("throws when config exists but routerPath is missing", async () => {
|
|
57
|
+
fs.writeFileSync(path.join(tmpDir, "queuebase.config.js"), "export default {}");
|
|
58
|
+
await expect(discoverRouterPath(tmpDir)).rejects.toThrow(/missing routerPath/);
|
|
59
|
+
});
|
|
60
|
+
it("throws when config routerPath points to nonexistent file", async () => {
|
|
61
|
+
fs.writeFileSync(path.join(tmpDir, "queuebase.config.js"), "export default { routerPath: './nonexistent.ts' }");
|
|
62
|
+
await expect(discoverRouterPath(tmpDir)).rejects.toThrow(/does not exist/);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("buildManifest", () => {
|
|
66
|
+
it("builds manifest with all jobs, scheduled and unscheduled", () => {
|
|
67
|
+
const router = {
|
|
68
|
+
sendEmail: {
|
|
69
|
+
input: {},
|
|
70
|
+
handler: async () => { },
|
|
71
|
+
},
|
|
72
|
+
dailyReport: {
|
|
73
|
+
input: {},
|
|
74
|
+
handler: async () => { },
|
|
75
|
+
schedule: "every day at 9am",
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const manifest = buildManifest(router);
|
|
79
|
+
expect(manifest.version).toBe(1);
|
|
80
|
+
expect(manifest.generatedAt).toBeDefined();
|
|
81
|
+
expect(Object.keys(manifest.jobs)).toEqual(["sendEmail", "dailyReport"]);
|
|
82
|
+
expect(manifest.jobs.sendEmail).toEqual({});
|
|
83
|
+
expect(manifest.jobs.dailyReport).toEqual({
|
|
84
|
+
schedule: {
|
|
85
|
+
cronExpression: "0 9 * * *",
|
|
86
|
+
timezone: "UTC",
|
|
87
|
+
enabled: true,
|
|
88
|
+
overlap: "skip",
|
|
89
|
+
timeoutMs: null,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
it("builds manifest with no jobs", () => {
|
|
94
|
+
const router = {};
|
|
95
|
+
const manifest = buildManifest(router);
|
|
96
|
+
expect(manifest.version).toBe(1);
|
|
97
|
+
expect(manifest.jobs).toEqual({});
|
|
98
|
+
});
|
|
99
|
+
it("resolves schedule config objects", () => {
|
|
100
|
+
const router = {
|
|
101
|
+
weeklyCleanup: {
|
|
102
|
+
input: {},
|
|
103
|
+
handler: async () => { },
|
|
104
|
+
schedule: {
|
|
105
|
+
cron: "every monday at 9am",
|
|
106
|
+
timezone: "America/New_York",
|
|
107
|
+
enabled: false,
|
|
108
|
+
overlap: "allow",
|
|
109
|
+
timeout: "5m",
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
const manifest = buildManifest(router);
|
|
114
|
+
expect(manifest.jobs.weeklyCleanup).toEqual({
|
|
115
|
+
schedule: {
|
|
116
|
+
cronExpression: "0 9 * * 1",
|
|
117
|
+
timezone: "America/New_York",
|
|
118
|
+
enabled: false,
|
|
119
|
+
overlap: "allow",
|
|
120
|
+
timeoutMs: 300000,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe("writeManifest", () => {
|
|
126
|
+
let tmpDir;
|
|
127
|
+
beforeEach(() => {
|
|
128
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "qb-write-"));
|
|
129
|
+
});
|
|
130
|
+
afterEach(() => {
|
|
131
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
132
|
+
});
|
|
133
|
+
it("writes manifest JSON to .queuebase directory", () => {
|
|
134
|
+
const manifest = {
|
|
135
|
+
version: 1,
|
|
136
|
+
generatedAt: "2026-03-14T12:00:00.000Z",
|
|
137
|
+
jobs: { sendEmail: {} },
|
|
138
|
+
};
|
|
139
|
+
writeManifest(manifest, tmpDir);
|
|
140
|
+
const manifestPath = getManifestPath(tmpDir);
|
|
141
|
+
expect(fs.existsSync(manifestPath)).toBe(true);
|
|
142
|
+
const written = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
143
|
+
expect(written).toEqual(manifest);
|
|
144
|
+
});
|
|
145
|
+
it("creates .queuebase directory if it does not exist", () => {
|
|
146
|
+
const manifest = {
|
|
147
|
+
version: 1,
|
|
148
|
+
generatedAt: "2026-03-14T12:00:00.000Z",
|
|
149
|
+
jobs: {},
|
|
150
|
+
};
|
|
151
|
+
writeManifest(manifest, tmpDir);
|
|
152
|
+
expect(fs.existsSync(path.join(tmpDir, ".queuebase"))).toBe(true);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe("loadRouter", () => {
|
|
156
|
+
let tmpDir;
|
|
157
|
+
beforeEach(() => {
|
|
158
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "qb-load-"));
|
|
159
|
+
});
|
|
160
|
+
afterEach(() => {
|
|
161
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
162
|
+
});
|
|
163
|
+
it("loads a router from a JS file with default export", async () => {
|
|
164
|
+
const routerFile = path.join(tmpDir, "router.js");
|
|
165
|
+
fs.writeFileSync(routerFile, "export default { sendEmail: { input: {}, handler: async () => {} } }");
|
|
166
|
+
const router = await loadRouter(routerFile);
|
|
167
|
+
expect(router).toHaveProperty("sendEmail");
|
|
168
|
+
});
|
|
169
|
+
it("throws when file has no default export", async () => {
|
|
170
|
+
const routerFile = path.join(tmpDir, "router.js");
|
|
171
|
+
fs.writeFileSync(routerFile, 'export const foo = "bar"');
|
|
172
|
+
await expect(loadRouter(routerFile)).rejects.toThrow(/Expected default export/);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe("generate", () => {
|
|
176
|
+
let tmpDir;
|
|
177
|
+
beforeEach(() => {
|
|
178
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "qb-integration-"));
|
|
179
|
+
});
|
|
180
|
+
afterEach(() => {
|
|
181
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
182
|
+
});
|
|
183
|
+
it("discovers router, builds manifest, and writes to disk", async () => {
|
|
184
|
+
const routerDir = path.join(tmpDir, "src", "jobs");
|
|
185
|
+
fs.mkdirSync(routerDir, { recursive: true });
|
|
186
|
+
fs.writeFileSync(path.join(routerDir, "index.js"), `export default {
|
|
187
|
+
sendEmail: { input: {}, handler: async () => {} },
|
|
188
|
+
dailyReport: { input: {}, handler: async () => {}, schedule: "every day at 9am" },
|
|
189
|
+
}`);
|
|
190
|
+
const result = await generate(tmpDir);
|
|
191
|
+
expect(result.routerPath).toBe(path.join(tmpDir, "src", "jobs", "index.js"));
|
|
192
|
+
expect(result.manifest.version).toBe(1);
|
|
193
|
+
expect(Object.keys(result.manifest.jobs)).toEqual(["sendEmail", "dailyReport"]);
|
|
194
|
+
const dailyReport = result.manifest.jobs.dailyReport;
|
|
195
|
+
expect(dailyReport?.schedule?.cronExpression).toBe("0 9 * * *");
|
|
196
|
+
expect(result.manifest.jobs.sendEmail).toEqual({});
|
|
197
|
+
const fromDisk = readManifest(tmpDir);
|
|
198
|
+
expect(fromDisk).toEqual(result.manifest);
|
|
199
|
+
});
|
|
200
|
+
it("throws when no router file exists", async () => {
|
|
201
|
+
await expect(generate(tmpDir)).rejects.toThrow(/Could not find job router/);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=generate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.test.js","sourceRoot":"","sources":["../../src/__tests__/generate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/manifest.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { readManifest } from "../manifest.js";
|
|
6
|
+
describe("readManifest", () => {
|
|
7
|
+
let tmpDir;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "qb-manifest-"));
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
13
|
+
});
|
|
14
|
+
it("reads and parses a valid manifest file", () => {
|
|
15
|
+
const manifest = {
|
|
16
|
+
version: 1,
|
|
17
|
+
generatedAt: "2026-03-14T12:00:00.000Z",
|
|
18
|
+
jobs: {
|
|
19
|
+
sendEmail: {},
|
|
20
|
+
dailyReport: {
|
|
21
|
+
schedule: {
|
|
22
|
+
cronExpression: "0 9 * * *",
|
|
23
|
+
timezone: "UTC",
|
|
24
|
+
enabled: true,
|
|
25
|
+
overlap: "skip",
|
|
26
|
+
timeoutMs: 300000,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const qbDir = path.join(tmpDir, ".queuebase");
|
|
32
|
+
fs.mkdirSync(qbDir);
|
|
33
|
+
fs.writeFileSync(path.join(qbDir, "queuebase.manifest.json"), JSON.stringify(manifest, null, 2));
|
|
34
|
+
const result = readManifest(tmpDir);
|
|
35
|
+
expect(result).toEqual(manifest);
|
|
36
|
+
});
|
|
37
|
+
it("throws when manifest file does not exist", () => {
|
|
38
|
+
expect(() => readManifest(tmpDir)).toThrow(/Run `queuebase generate` first/);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=manifest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.test.js","sourceRoot":"","sources":["../../src/__tests__/manifest.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,MAAM,QAAQ,GAAa;YAC1B,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE;gBACL,SAAS,EAAE,EAAE;gBACb,WAAW,EAAE;oBACZ,QAAQ,EAAE;wBACT,cAAc,EAAE,WAAW;wBAC3B,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,MAAM;wBACf,SAAS,EAAE,MAAM;qBACjB;iBACD;aACD;SACD,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC9C,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpB,EAAE,CAAC,aAAa,CACf,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAyB,CAAC,EAC3C,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CACjC,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CACzC,gCAAgC,CAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schedules.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sync-schedules.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { syncSchedules } from "../sync-schedules.js";
|
|
4
|
+
vi.mock("@queuebase/core", async (importOriginal) => {
|
|
5
|
+
const actual = await importOriginal();
|
|
6
|
+
return {
|
|
7
|
+
...actual,
|
|
8
|
+
nextRun: vi.fn((expression, timezone) => {
|
|
9
|
+
return actual.nextRun(expression, timezone);
|
|
10
|
+
}),
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
import { nextRun } from "@queuebase/core";
|
|
14
|
+
function createTestDb() {
|
|
15
|
+
const db = new DatabaseSync(":memory:");
|
|
16
|
+
db.exec(`
|
|
17
|
+
CREATE TABLE IF NOT EXISTS schedules (
|
|
18
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
19
|
+
public_id TEXT NOT NULL UNIQUE,
|
|
20
|
+
job_name TEXT NOT NULL UNIQUE,
|
|
21
|
+
cron_expr TEXT NOT NULL,
|
|
22
|
+
timezone TEXT NOT NULL DEFAULT 'UTC',
|
|
23
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
24
|
+
dashboard_enabled INTEGER NOT NULL DEFAULT 1,
|
|
25
|
+
overlap TEXT NOT NULL DEFAULT 'skip',
|
|
26
|
+
timeout_ms INTEGER,
|
|
27
|
+
last_run_at INTEGER,
|
|
28
|
+
next_run_at INTEGER,
|
|
29
|
+
deleted_at INTEGER,
|
|
30
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
31
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
32
|
+
)
|
|
33
|
+
`);
|
|
34
|
+
return db;
|
|
35
|
+
}
|
|
36
|
+
function getScheduleRows(db) {
|
|
37
|
+
const stmt = db.prepare("SELECT * FROM schedules ORDER BY job_name");
|
|
38
|
+
return stmt.all();
|
|
39
|
+
}
|
|
40
|
+
describe("syncSchedules", () => {
|
|
41
|
+
let db;
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
db = createTestDb();
|
|
44
|
+
vi.clearAllMocks();
|
|
45
|
+
});
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
db.close();
|
|
48
|
+
});
|
|
49
|
+
it("inserts scheduled jobs from manifest", () => {
|
|
50
|
+
const manifest = {
|
|
51
|
+
version: 1,
|
|
52
|
+
generatedAt: "2026-03-16T00:00:00.000Z",
|
|
53
|
+
jobs: {
|
|
54
|
+
sendEmail: {},
|
|
55
|
+
dailyReport: {
|
|
56
|
+
schedule: {
|
|
57
|
+
cronExpression: "0 9 * * *",
|
|
58
|
+
timezone: "UTC",
|
|
59
|
+
enabled: true,
|
|
60
|
+
overlap: "skip",
|
|
61
|
+
timeoutMs: null,
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
weeklyCleanup: {
|
|
65
|
+
schedule: {
|
|
66
|
+
cronExpression: "0 0 * * 1",
|
|
67
|
+
timezone: "America/New_York",
|
|
68
|
+
enabled: true,
|
|
69
|
+
overlap: "allow",
|
|
70
|
+
timeoutMs: 300000,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
const count = syncSchedules(db, manifest);
|
|
76
|
+
expect(count).toBe(2);
|
|
77
|
+
const rows = getScheduleRows(db);
|
|
78
|
+
expect(rows).toHaveLength(2);
|
|
79
|
+
const daily = rows.find((r) => r.job_name === "dailyReport");
|
|
80
|
+
expect(daily).toBeDefined();
|
|
81
|
+
expect(daily.cron_expr).toBe("0 9 * * *");
|
|
82
|
+
expect(daily.timezone).toBe("UTC");
|
|
83
|
+
expect(daily.enabled).toBe(1);
|
|
84
|
+
expect(daily.overlap).toBe("skip");
|
|
85
|
+
expect(daily.next_run_at).toBeTypeOf("number");
|
|
86
|
+
const weekly = rows.find((r) => r.job_name === "weeklyCleanup");
|
|
87
|
+
expect(weekly).toBeDefined();
|
|
88
|
+
expect(weekly.timezone).toBe("America/New_York");
|
|
89
|
+
expect(weekly.overlap).toBe("allow");
|
|
90
|
+
expect(weekly.timeout_ms).toBe(300000);
|
|
91
|
+
});
|
|
92
|
+
it("wipes existing schedules before inserting", () => {
|
|
93
|
+
db.prepare("INSERT INTO schedules (public_id, job_name, cron_expr, timezone) VALUES (?, ?, ?, ?)").run("sched_old", "oldJob", "* * * * *", "UTC");
|
|
94
|
+
const manifest = {
|
|
95
|
+
version: 1,
|
|
96
|
+
generatedAt: "2026-03-16T00:00:00.000Z",
|
|
97
|
+
jobs: {
|
|
98
|
+
newJob: {
|
|
99
|
+
schedule: {
|
|
100
|
+
cronExpression: "0 12 * * *",
|
|
101
|
+
timezone: "UTC",
|
|
102
|
+
enabled: true,
|
|
103
|
+
overlap: "skip",
|
|
104
|
+
timeoutMs: null,
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
syncSchedules(db, manifest);
|
|
110
|
+
const rows = getScheduleRows(db);
|
|
111
|
+
expect(rows).toHaveLength(1);
|
|
112
|
+
expect(rows[0].job_name).toBe("newJob");
|
|
113
|
+
});
|
|
114
|
+
it("returns 0 when no jobs have schedules", () => {
|
|
115
|
+
const manifest = {
|
|
116
|
+
version: 1,
|
|
117
|
+
generatedAt: "2026-03-16T00:00:00.000Z",
|
|
118
|
+
jobs: {
|
|
119
|
+
sendEmail: {},
|
|
120
|
+
processPayment: {},
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
const count = syncSchedules(db, manifest);
|
|
124
|
+
expect(count).toBe(0);
|
|
125
|
+
expect(getScheduleRows(db)).toHaveLength(0);
|
|
126
|
+
});
|
|
127
|
+
it("inserts schedule with enabled = false", () => {
|
|
128
|
+
const manifest = {
|
|
129
|
+
version: 1,
|
|
130
|
+
generatedAt: "2026-03-16T00:00:00.000Z",
|
|
131
|
+
jobs: {
|
|
132
|
+
disabledJob: {
|
|
133
|
+
schedule: {
|
|
134
|
+
cronExpression: "0 9 * * *",
|
|
135
|
+
timezone: "UTC",
|
|
136
|
+
enabled: false,
|
|
137
|
+
overlap: "skip",
|
|
138
|
+
timeoutMs: null,
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
const count = syncSchedules(db, manifest);
|
|
144
|
+
expect(count).toBe(1);
|
|
145
|
+
const rows = getScheduleRows(db);
|
|
146
|
+
expect(rows[0].enabled).toBe(0);
|
|
147
|
+
});
|
|
148
|
+
it("skips schedule when nextRun returns null", () => {
|
|
149
|
+
const mockedNextRun = vi.mocked(nextRun);
|
|
150
|
+
mockedNextRun.mockReturnValueOnce(null);
|
|
151
|
+
const manifest = {
|
|
152
|
+
version: 1,
|
|
153
|
+
generatedAt: "2026-03-16T00:00:00.000Z",
|
|
154
|
+
jobs: {
|
|
155
|
+
badCron: {
|
|
156
|
+
schedule: {
|
|
157
|
+
cronExpression: "0 9 * * *",
|
|
158
|
+
timezone: "UTC",
|
|
159
|
+
enabled: true,
|
|
160
|
+
overlap: "skip",
|
|
161
|
+
timeoutMs: null,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
const count = syncSchedules(db, manifest);
|
|
167
|
+
expect(count).toBe(0);
|
|
168
|
+
expect(getScheduleRows(db)).toHaveLength(0);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=sync-schedules.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schedules.test.js","sourceRoot":"","sources":["../../src/__tests__/sync-schedules.test.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { devCommand } from './commands/dev.js';
|
|
3
|
+
import { generateCommand } from './commands/generate.js';
|
|
3
4
|
const args = process.argv.slice(2);
|
|
4
5
|
const command = args[0];
|
|
5
6
|
function printHelp() {
|
|
@@ -10,7 +11,8 @@ Usage:
|
|
|
10
11
|
queuebase <command> [options]
|
|
11
12
|
|
|
12
13
|
Commands:
|
|
13
|
-
dev
|
|
14
|
+
dev Start the local development server
|
|
15
|
+
generate Generate the job manifest file
|
|
14
16
|
|
|
15
17
|
Options:
|
|
16
18
|
--port <port> Port for the dev server (default: 3847)
|
|
@@ -55,6 +57,10 @@ async function main() {
|
|
|
55
57
|
});
|
|
56
58
|
break;
|
|
57
59
|
}
|
|
60
|
+
case 'generate': {
|
|
61
|
+
await generateCommand();
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
58
64
|
default:
|
|
59
65
|
console.error(`Unknown command: ${command}`);
|
|
60
66
|
printHelp();
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAqC,EAAE,CAAC;IAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAE5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;gBACtB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACzD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,UAAU,CAAC;gBACT,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrD,WAAW,EAAE,OAAO,CAAC,QAA8B;aACpD,CAAC,CAAC;YACH,MAAM;QACR,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,eAAe,EAAE,CAAC;YACxB,MAAM;QACR,CAAC;QAED;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,UAAe,
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,UAAe,QAyBlD"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -7,8 +7,9 @@ export function devCommand(options = {}) {
|
|
|
7
7
|
const callbackUrl = options.callbackUrl ??
|
|
8
8
|
process.env.QUEUEBASE_CALLBACK_URL ??
|
|
9
9
|
'http://localhost:3000/api/queuebase';
|
|
10
|
+
const cwd = process.cwd();
|
|
10
11
|
// Use a .queuebase directory in the current working directory
|
|
11
|
-
const dbPath = path.join(
|
|
12
|
+
const dbPath = path.join(cwd, '.queuebase', 'dev.db');
|
|
12
13
|
// Ensure .queuebase directory exists
|
|
13
14
|
const dbDir = path.dirname(dbPath);
|
|
14
15
|
if (!fs.existsSync(dbDir)) {
|
|
@@ -18,6 +19,7 @@ export function devCommand(options = {}) {
|
|
|
18
19
|
port,
|
|
19
20
|
dbPath,
|
|
20
21
|
callbackUrl,
|
|
22
|
+
cwd,
|
|
21
23
|
});
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=dev.js.map
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAO/C,MAAM,UAAU,UAAU,CAAC,UAAsB,EAAE;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,WAAW,GACf,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,qCAAqC,CAAC;IAExC,8DAA8D;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAO/C,MAAM,UAAU,UAAU,CAAC,UAAsB,EAAE;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,WAAW,GACf,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,qCAAqC,CAAC;IAExC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,8DAA8D;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEtD,qCAAqC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,eAAe,CAAC;QACd,IAAI;QACJ,MAAM;QACN,WAAW;QACX,GAAG;KACJ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,kBAcpC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { generate } from "../generate.js";
|
|
2
|
+
export async function generateCommand() {
|
|
3
|
+
const result = await generate();
|
|
4
|
+
const jobCount = Object.keys(result.manifest.jobs).length;
|
|
5
|
+
const scheduledCount = Object.values(result.manifest.jobs).filter((j) => j.schedule).length;
|
|
6
|
+
const relativePath = result.routerPath.replace(`${process.cwd()}/`, "");
|
|
7
|
+
console.info(`Found router at ${relativePath}`);
|
|
8
|
+
console.info(`Manifest written to .queuebase/queuebase.manifest.json (${jobCount} jobs, ${scheduledCount} scheduled)`);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,eAAe;IACpC,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;IAEhC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC1D,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAChE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CACjB,CAAC,MAAM,CAAC;IAET,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAExE,OAAO,CAAC,IAAI,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CACX,2DAA2D,QAAQ,UAAU,cAAc,aAAa,CACxG,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgFpD"}
|
package/dist/db/migrations.js
CHANGED
|
@@ -41,5 +41,41 @@ export function runMigrations(db) {
|
|
|
41
41
|
CREATE INDEX IF NOT EXISTS idx_job_logs_job_id
|
|
42
42
|
ON job_logs(job_id)
|
|
43
43
|
`);
|
|
44
|
+
db.exec(`
|
|
45
|
+
CREATE TABLE IF NOT EXISTS schedules (
|
|
46
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
47
|
+
public_id TEXT NOT NULL UNIQUE,
|
|
48
|
+
job_name TEXT NOT NULL UNIQUE,
|
|
49
|
+
cron_expr TEXT NOT NULL,
|
|
50
|
+
timezone TEXT NOT NULL DEFAULT 'UTC',
|
|
51
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
52
|
+
dashboard_enabled INTEGER NOT NULL DEFAULT 1,
|
|
53
|
+
overlap TEXT NOT NULL DEFAULT 'skip',
|
|
54
|
+
timeout_ms INTEGER,
|
|
55
|
+
last_run_at INTEGER,
|
|
56
|
+
next_run_at INTEGER,
|
|
57
|
+
deleted_at INTEGER,
|
|
58
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
59
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
60
|
+
)
|
|
61
|
+
`);
|
|
62
|
+
db.exec(`
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_schedules_next_run
|
|
64
|
+
ON schedules(next_run_at)
|
|
65
|
+
WHERE enabled = 1 AND dashboard_enabled = 1 AND deleted_at IS NULL
|
|
66
|
+
`);
|
|
67
|
+
// Add schedule_id FK to jobs if not already present
|
|
68
|
+
addColumnIfNotExists(db, "jobs", "schedule_id", "INTEGER REFERENCES schedules(id) ON DELETE SET NULL");
|
|
69
|
+
db.exec(`
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_schedule_id
|
|
71
|
+
ON jobs(schedule_id)
|
|
72
|
+
`);
|
|
73
|
+
}
|
|
74
|
+
function addColumnIfNotExists(db, table, column, definition) {
|
|
75
|
+
const info = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
76
|
+
const exists = info.some((col) => col.name === column);
|
|
77
|
+
if (!exists) {
|
|
78
|
+
db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
79
|
+
}
|
|
44
80
|
}
|
|
45
81
|
//# sourceMappingURL=migrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,EAAgB;IAC5C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;GAmBP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;GASP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,EAAgB;IAC5C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;GAmBP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;GASP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;GAiBP,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;;;;GAIP,CAAC,CAAC;IAEH,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,qDAAqD,CAAC,CAAC;IAEvG,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAC3B,EAAgB,EAChB,KAAa,EACb,MAAc,EACd,UAAkB;IAElB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC,GAAG,EAA6B,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,eAAe,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export interface ScheduleRow {
|
|
3
|
+
id: number;
|
|
4
|
+
public_id: string;
|
|
5
|
+
job_name: string;
|
|
6
|
+
cron_expr: string;
|
|
7
|
+
timezone: string;
|
|
8
|
+
enabled: number;
|
|
9
|
+
dashboard_enabled: number;
|
|
10
|
+
overlap: string;
|
|
11
|
+
timeout_ms: number | null;
|
|
12
|
+
last_run_at: number | null;
|
|
13
|
+
next_run_at: number | null;
|
|
14
|
+
deleted_at: number | null;
|
|
15
|
+
created_at: number;
|
|
16
|
+
updated_at: number;
|
|
17
|
+
}
|
|
18
|
+
export interface InsertScheduleParams {
|
|
19
|
+
jobName: string;
|
|
20
|
+
cronExpression: string;
|
|
21
|
+
timezone: string;
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
overlap: string;
|
|
24
|
+
timeoutMs: number | null;
|
|
25
|
+
nextRunAt: number | null;
|
|
26
|
+
}
|
|
27
|
+
export declare function insertSchedule(db: DatabaseSync, params: InsertScheduleParams): ScheduleRow;
|
|
28
|
+
export declare function updateSchedule(db: DatabaseSync, jobName: string, params: {
|
|
29
|
+
cronExpression: string;
|
|
30
|
+
timezone: string;
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
overlap: string;
|
|
33
|
+
timeoutMs: number | null;
|
|
34
|
+
nextRunAt: number | null;
|
|
35
|
+
}): void;
|
|
36
|
+
export declare function softDeleteSchedule(db: DatabaseSync, jobName: string): void;
|
|
37
|
+
export declare function getScheduleByJobName(db: DatabaseSync, jobName: string): ScheduleRow | null;
|
|
38
|
+
export declare function getScheduleById(db: DatabaseSync, id: number): ScheduleRow | null;
|
|
39
|
+
export declare function listActiveSchedules(db: DatabaseSync): ScheduleRow[];
|
|
40
|
+
export declare function listAllSchedules(db: DatabaseSync): ScheduleRow[];
|
|
41
|
+
/**
|
|
42
|
+
* Atomic claim: update next_run_at only if it still matches the expected value.
|
|
43
|
+
* Returns true if the claim succeeded (this worker owns the tick).
|
|
44
|
+
*/
|
|
45
|
+
export declare function claimScheduleTick(db: DatabaseSync, scheduleId: number, expectedNextRunAt: number, newNextRunAt: number): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check if there are any running jobs for a given schedule.
|
|
48
|
+
* Used for overlap="skip" policy.
|
|
49
|
+
*/
|
|
50
|
+
export declare function hasRunningJobsForSchedule(db: DatabaseSync, scheduleId: number): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Wipe all schedules — used during `queuebase dev` startup for clean sync.
|
|
53
|
+
*/
|
|
54
|
+
export declare function deleteAllSchedules(db: DatabaseSync): void;
|
|
55
|
+
/**
|
|
56
|
+
* Toggle dashboard_enabled for a schedule.
|
|
57
|
+
*/
|
|
58
|
+
export declare function setDashboardEnabled(db: DatabaseSync, scheduleId: number, enabled: boolean): void;
|
|
59
|
+
//# sourceMappingURL=schedule-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-queries.d.ts","sourceRoot":"","sources":["../../src/db/schedule-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,oBAAoB,GAC3B,WAAW,CAuBb;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IACN,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACA,IAAI,CAiBN;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAK1E;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAIpB;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE,MAAM,GACT,WAAW,GAAG,IAAI,CAIpB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,WAAW,EAAE,CAKnE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,WAAW,EAAE,CAGhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,YAAY,EAChB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,MAAM,GACnB,OAAO,CAUT;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,YAAY,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAMT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,YAAY,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,IAAI,CAKN"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { generatePublicId } from "@queuebase/core";
|
|
2
|
+
export function insertSchedule(db, params) {
|
|
3
|
+
const publicId = generatePublicId("sched");
|
|
4
|
+
const now = Date.now();
|
|
5
|
+
const stmt = db.prepare(`
|
|
6
|
+
INSERT INTO schedules (public_id, job_name, cron_expr, timezone, enabled, dashboard_enabled, overlap, timeout_ms, next_run_at, created_at, updated_at)
|
|
7
|
+
VALUES (?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?)
|
|
8
|
+
`);
|
|
9
|
+
stmt.run(publicId, params.jobName, params.cronExpression, params.timezone, params.enabled ? 1 : 0, params.overlap, params.timeoutMs, params.nextRunAt, now, now);
|
|
10
|
+
return getScheduleByJobName(db, params.jobName);
|
|
11
|
+
}
|
|
12
|
+
export function updateSchedule(db, jobName, params) {
|
|
13
|
+
const stmt = db.prepare(`
|
|
14
|
+
UPDATE schedules
|
|
15
|
+
SET cron_expr = ?, timezone = ?, enabled = ?, overlap = ?, timeout_ms = ?, next_run_at = ?, updated_at = ?, deleted_at = NULL
|
|
16
|
+
WHERE job_name = ?
|
|
17
|
+
`);
|
|
18
|
+
stmt.run(params.cronExpression, params.timezone, params.enabled ? 1 : 0, params.overlap, params.timeoutMs, params.nextRunAt, Date.now(), jobName);
|
|
19
|
+
}
|
|
20
|
+
export function softDeleteSchedule(db, jobName) {
|
|
21
|
+
const stmt = db.prepare("UPDATE schedules SET deleted_at = ?, updated_at = ? WHERE job_name = ? AND deleted_at IS NULL");
|
|
22
|
+
stmt.run(Date.now(), Date.now(), jobName);
|
|
23
|
+
}
|
|
24
|
+
export function getScheduleByJobName(db, jobName) {
|
|
25
|
+
const stmt = db.prepare("SELECT * FROM schedules WHERE job_name = ?");
|
|
26
|
+
const row = stmt.get(jobName);
|
|
27
|
+
return row ?? null;
|
|
28
|
+
}
|
|
29
|
+
export function getScheduleById(db, id) {
|
|
30
|
+
const stmt = db.prepare("SELECT * FROM schedules WHERE id = ?");
|
|
31
|
+
const row = stmt.get(id);
|
|
32
|
+
return row ?? null;
|
|
33
|
+
}
|
|
34
|
+
export function listActiveSchedules(db) {
|
|
35
|
+
const stmt = db.prepare("SELECT * FROM schedules WHERE enabled = 1 AND dashboard_enabled = 1 AND deleted_at IS NULL");
|
|
36
|
+
return stmt.all();
|
|
37
|
+
}
|
|
38
|
+
export function listAllSchedules(db) {
|
|
39
|
+
const stmt = db.prepare("SELECT * FROM schedules ORDER BY created_at ASC");
|
|
40
|
+
return stmt.all();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Atomic claim: update next_run_at only if it still matches the expected value.
|
|
44
|
+
* Returns true if the claim succeeded (this worker owns the tick).
|
|
45
|
+
*/
|
|
46
|
+
export function claimScheduleTick(db, scheduleId, expectedNextRunAt, newNextRunAt) {
|
|
47
|
+
const stmt = db.prepare(`
|
|
48
|
+
UPDATE schedules
|
|
49
|
+
SET next_run_at = ?, last_run_at = ?, updated_at = ?
|
|
50
|
+
WHERE id = ? AND next_run_at = ?
|
|
51
|
+
`);
|
|
52
|
+
const now = Date.now();
|
|
53
|
+
const result = stmt.run(newNextRunAt, now, now, scheduleId, expectedNextRunAt);
|
|
54
|
+
return result.changes > 0;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if there are any running jobs for a given schedule.
|
|
58
|
+
* Used for overlap="skip" policy.
|
|
59
|
+
*/
|
|
60
|
+
export function hasRunningJobsForSchedule(db, scheduleId) {
|
|
61
|
+
const stmt = db.prepare("SELECT 1 FROM jobs WHERE schedule_id = ? AND status = 'running' LIMIT 1");
|
|
62
|
+
const row = stmt.get(scheduleId);
|
|
63
|
+
return row != null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Wipe all schedules — used during `queuebase dev` startup for clean sync.
|
|
67
|
+
*/
|
|
68
|
+
export function deleteAllSchedules(db) {
|
|
69
|
+
db.exec("DELETE FROM schedules");
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Toggle dashboard_enabled for a schedule.
|
|
73
|
+
*/
|
|
74
|
+
export function setDashboardEnabled(db, scheduleId, enabled) {
|
|
75
|
+
const stmt = db.prepare("UPDATE schedules SET dashboard_enabled = ?, updated_at = ? WHERE id = ?");
|
|
76
|
+
stmt.run(enabled ? 1 : 0, Date.now(), scheduleId);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=schedule-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-queries.js","sourceRoot":"","sources":["../../src/db/schedule-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { JobRouter } from "@queuebase/core";
|
|
2
|
+
import type { Manifest } from "./manifest.js";
|
|
3
|
+
export declare function discoverRouterPath(cwd: string): Promise<string>;
|
|
4
|
+
export declare function buildManifest(router: JobRouter): Manifest;
|
|
5
|
+
export declare function writeManifest(manifest: Manifest, cwd: string): void;
|
|
6
|
+
export declare function loadRouter(routerPath: string): Promise<JobRouter>;
|
|
7
|
+
export interface GenerateResult {
|
|
8
|
+
manifest: Manifest;
|
|
9
|
+
routerPath: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function generate(cwd?: string): Promise<GenerateResult>;
|
|
12
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,eAAe,CAAC;AAoD3D,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCrE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAezD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CASnE;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAUvE;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CASpE"}
|
package/dist/generate.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { extractSchedules } from "@queuebase/core";
|
|
5
|
+
import { getManifestPath } from "./manifest.js";
|
|
6
|
+
const CONVENTION_PATHS = [
|
|
7
|
+
"src/jobs/index.ts",
|
|
8
|
+
"src/jobs/index.js",
|
|
9
|
+
"jobs/index.ts",
|
|
10
|
+
"jobs/index.js",
|
|
11
|
+
];
|
|
12
|
+
const CONFIG_FILENAMES = [
|
|
13
|
+
"queuebase.config.ts",
|
|
14
|
+
"queuebase.config.js",
|
|
15
|
+
];
|
|
16
|
+
async function importModule(filePath) {
|
|
17
|
+
const { tsImport } = await import("tsx/esm/api");
|
|
18
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
19
|
+
try {
|
|
20
|
+
const mod = (await tsImport(fileUrl, import.meta.url));
|
|
21
|
+
// tsx wraps ESM modules in an extra layer: mod.default is the actual
|
|
22
|
+
// module namespace. If the source has `export default X`, the namespace
|
|
23
|
+
// will have a .default property containing X. If not, there is no
|
|
24
|
+
// .default on the namespace, meaning no default export exists.
|
|
25
|
+
if (mod.default &&
|
|
26
|
+
typeof mod.default === "object" &&
|
|
27
|
+
Object.getPrototypeOf(mod.default) === null) {
|
|
28
|
+
const inner = mod.default;
|
|
29
|
+
if ("default" in inner) {
|
|
30
|
+
return { ...mod, default: inner.default };
|
|
31
|
+
}
|
|
32
|
+
// The inner module has no default export — remove the wrapping
|
|
33
|
+
const { default: _, ...rest } = mod;
|
|
34
|
+
return rest;
|
|
35
|
+
}
|
|
36
|
+
return mod;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new Error(`Failed to load ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function discoverRouterPath(cwd) {
|
|
43
|
+
for (const relative of CONVENTION_PATHS) {
|
|
44
|
+
const absolute = path.join(cwd, relative);
|
|
45
|
+
if (fs.existsSync(absolute)) {
|
|
46
|
+
return absolute;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const configName of CONFIG_FILENAMES) {
|
|
50
|
+
const configPath = path.join(cwd, configName);
|
|
51
|
+
if (fs.existsSync(configPath)) {
|
|
52
|
+
const configModule = await importModule(configPath);
|
|
53
|
+
const config = configModule.default;
|
|
54
|
+
if (!config || typeof config.routerPath !== "string") {
|
|
55
|
+
throw new Error(`Found ${configName} but it is missing routerPath. Export default { routerPath: './path/to/jobs/index.ts' }`);
|
|
56
|
+
}
|
|
57
|
+
const resolvedPath = path.resolve(cwd, config.routerPath);
|
|
58
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
59
|
+
throw new Error(`Config routerPath "${config.routerPath}" does not exist (resolved to ${resolvedPath}).`);
|
|
60
|
+
}
|
|
61
|
+
return resolvedPath;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Could not find job router. Expected a default export at one of:\n${CONVENTION_PATHS.map((p) => ` - ${p}`).join("\n")}\n\nOr create a queuebase.config.ts with a routerPath property.`);
|
|
65
|
+
}
|
|
66
|
+
export function buildManifest(router) {
|
|
67
|
+
const schedules = extractSchedules(router);
|
|
68
|
+
const scheduleMap = new Map(schedules.map((s) => [s.jobName, s.schedule]));
|
|
69
|
+
const jobs = {};
|
|
70
|
+
for (const jobName of Object.keys(router)) {
|
|
71
|
+
const schedule = scheduleMap.get(jobName);
|
|
72
|
+
jobs[jobName] = schedule ? { schedule } : {};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
version: 1,
|
|
76
|
+
generatedAt: new Date().toISOString(),
|
|
77
|
+
jobs,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function writeManifest(manifest, cwd) {
|
|
81
|
+
const manifestPath = getManifestPath(cwd);
|
|
82
|
+
const dir = path.dirname(manifestPath);
|
|
83
|
+
if (!fs.existsSync(dir)) {
|
|
84
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
87
|
+
}
|
|
88
|
+
export async function loadRouter(routerPath) {
|
|
89
|
+
const mod = await importModule(routerPath);
|
|
90
|
+
if (!mod.default || typeof mod.default !== "object") {
|
|
91
|
+
throw new Error(`Expected default export from ${routerPath}. Make sure your router file uses: export default createJobRouter({ ... })`);
|
|
92
|
+
}
|
|
93
|
+
return mod.default;
|
|
94
|
+
}
|
|
95
|
+
export async function generate(cwd) {
|
|
96
|
+
const resolvedCwd = cwd ?? process.cwd();
|
|
97
|
+
const routerPath = await discoverRouterPath(resolvedCwd);
|
|
98
|
+
const router = await loadRouter(routerPath);
|
|
99
|
+
const manifest = buildManifest(router);
|
|
100
|
+
writeManifest(manifest, resolvedCwd);
|
|
101
|
+
return { manifest, routerPath };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { createDevServer, type DevServerOptions } from './server.js';
|
|
2
2
|
export { devCommand } from './commands/dev.js';
|
|
3
|
+
export { generate, type GenerateResult } from './generate.js';
|
|
4
|
+
export { readManifest, type Manifest, type ManifestJob } from './manifest.js';
|
|
5
|
+
export { generateCommand } from './commands/generate.js';
|
|
3
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { createDevServer } from './server.js';
|
|
2
2
|
export { devCommand } from './commands/dev.js';
|
|
3
|
+
export { generate } from './generate.js';
|
|
4
|
+
export { readManifest } from './manifest.js';
|
|
5
|
+
export { generateCommand } from './commands/generate.js';
|
|
3
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAmC,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ResolvedSchedule } from "@queuebase/core";
|
|
2
|
+
export interface ManifestJob {
|
|
3
|
+
schedule?: ResolvedSchedule;
|
|
4
|
+
}
|
|
5
|
+
export interface Manifest {
|
|
6
|
+
version: number;
|
|
7
|
+
generatedAt: string;
|
|
8
|
+
jobs: Record<string, ManifestJob>;
|
|
9
|
+
}
|
|
10
|
+
export declare function getManifestPath(cwd: string): string;
|
|
11
|
+
export declare function readManifest(cwd: string): Manifest;
|
|
12
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAClC;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAWlD"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const MANIFEST_FILENAME = "queuebase.manifest.json";
|
|
4
|
+
export function getManifestPath(cwd) {
|
|
5
|
+
return path.join(cwd, ".queuebase", MANIFEST_FILENAME);
|
|
6
|
+
}
|
|
7
|
+
export function readManifest(cwd) {
|
|
8
|
+
const manifestPath = getManifestPath(cwd);
|
|
9
|
+
if (!fs.existsSync(manifestPath)) {
|
|
10
|
+
throw new Error(`Manifest not found at ${manifestPath}. Run \`queuebase generate\` first.`);
|
|
11
|
+
}
|
|
12
|
+
const raw = fs.readFileSync(manifestPath, "utf-8");
|
|
13
|
+
return JSON.parse(raw);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAa7B,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAEpD,MAAM,UAAU,eAAe,CAAC,GAAW;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACvC,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACd,yBAAyB,YAAY,qCAAqC,CAC1E,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;AACpC,CAAC"}
|
package/dist/server.d.ts
CHANGED
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAoIpE"}
|
package/dist/server.js
CHANGED
|
@@ -5,6 +5,8 @@ import { cors } from "hono/cors";
|
|
|
5
5
|
import { logger } from "hono/logger";
|
|
6
6
|
import { createSqliteClient } from "./db/client.js";
|
|
7
7
|
import { runMigrations } from "./db/migrations.js";
|
|
8
|
+
import { readManifest } from "./manifest.js";
|
|
9
|
+
import { syncSchedules } from "./sync-schedules.js";
|
|
8
10
|
import { enqueueJob, getJobByPublicId, getJobIdByPublicId, insertJobLog, listRecentJobs, } from "./db/queries.js";
|
|
9
11
|
import { createWorkerDb } from "./db/worker-db.js";
|
|
10
12
|
export function createDevServer(options) {
|
|
@@ -12,6 +14,10 @@ export function createDevServer(options) {
|
|
|
12
14
|
// Initialize SQLite database
|
|
13
15
|
const { db, close } = createSqliteClient(dbPath);
|
|
14
16
|
runMigrations(db);
|
|
17
|
+
// Sync schedules from manifest
|
|
18
|
+
const manifest = readManifest(options.cwd);
|
|
19
|
+
const scheduledCount = syncSchedules(db, manifest);
|
|
20
|
+
console.info(`📅 Synced ${scheduledCount} schedules`);
|
|
15
21
|
const workerDb = createWorkerDb(db);
|
|
16
22
|
// Create Hono app
|
|
17
23
|
const app = new Hono();
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schedules.d.ts","sourceRoot":"","sources":["../src/sync-schedules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAmC1E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { nextRun } from "@queuebase/core";
|
|
2
|
+
import { deleteAllSchedules, insertSchedule, } from "./db/schedule-queries.js";
|
|
3
|
+
export function syncSchedules(db, manifest) {
|
|
4
|
+
deleteAllSchedules(db);
|
|
5
|
+
let synced = 0;
|
|
6
|
+
for (const [jobName, job] of Object.entries(manifest.jobs)) {
|
|
7
|
+
if (!job.schedule) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
const { cronExpression, timezone, enabled, overlap, timeoutMs } = job.schedule;
|
|
11
|
+
const nextRunDate = nextRun(cronExpression, timezone);
|
|
12
|
+
if (nextRunDate === null) {
|
|
13
|
+
console.info(`⚠️ Skipping schedule for "${jobName}": nextRun returned null for "${cronExpression}"`);
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
insertSchedule(db, {
|
|
17
|
+
jobName,
|
|
18
|
+
cronExpression,
|
|
19
|
+
timezone,
|
|
20
|
+
enabled,
|
|
21
|
+
overlap,
|
|
22
|
+
timeoutMs,
|
|
23
|
+
nextRunAt: nextRunDate.getTime(),
|
|
24
|
+
});
|
|
25
|
+
synced++;
|
|
26
|
+
}
|
|
27
|
+
return synced;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sync-schedules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-schedules.js","sourceRoot":"","sources":["../src/sync-schedules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EACN,kBAAkB,EAClB,cAAc,GACd,MAAM,0BAA0B,CAAC;AAGlC,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,QAAkB;IACjE,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAEvB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACnB,SAAS;QACV,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAC9D,GAAG,CAAC,QAAQ,CAAC;QAEd,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CACX,8BAA8B,OAAO,iCAAiC,cAAc,GAAG,CACvF,CAAC;YACF,SAAS;QACV,CAAC;QAED,cAAc,CAAC,EAAE,EAAE;YAClB,OAAO;YACP,cAAc;YACd,QAAQ;YACR,OAAO;YACP,OAAO;YACP,SAAS;YACT,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE;SAChC,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC;IACV,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@queuebase/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"queuebase": "./dist/bin.js"
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@hono/node-server": "^1.13.7",
|
|
16
16
|
"hono": "^4.6.16",
|
|
17
|
-
"
|
|
18
|
-
"@queuebase/
|
|
17
|
+
"tsx": "^4.21.0",
|
|
18
|
+
"@queuebase/core": "1.5.0",
|
|
19
|
+
"@queuebase/worker": "1.5.0"
|
|
19
20
|
},
|
|
20
21
|
"devDependencies": {
|
|
21
22
|
"@types/node": "^22.10.5",
|