@queuebase/cli 1.4.0 → 1.5.1
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__/schedule-ticker.test.d.ts +2 -0
- package/dist/__tests__/schedule-ticker.test.d.ts.map +1 -0
- package/dist/__tests__/schedule-ticker.test.js +185 -0
- package/dist/__tests__/schedule-ticker.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/queries.d.ts +2 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +4 -4
- package/dist/db/queries.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/schedule-ticker.d.ts +16 -0
- package/dist/schedule-ticker.d.ts.map +1 -0
- package/dist/schedule-ticker.js +63 -0
- package/dist/schedule-ticker.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +13 -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,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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAClD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAoC,CAAC;IACxE,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,UAAkB,EAAE,QAAiB,EAAE,EAAE;YACvD,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC;KACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,SAAS,YAAY;IACnB,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IACxC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;GAiBP,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,EAAgB;IACvC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,GAAG,EAAoC,CAAC;AACtD,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,EAAgB,CAAC;IAErB,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,YAAY,EAAE,CAAC;QACpB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE;gBACJ,SAAS,EAAE,EAAE;gBACb,WAAW,EAAE;oBACX,QAAQ,EAAE;wBACR,cAAc,EAAE,WAAW;wBAC3B,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,MAAM;wBACf,SAAS,EAAE,IAAI;qBAChB;iBACF;gBACD,aAAa,EAAE;oBACb,QAAQ,EAAE;wBACR,cAAc,EAAE,WAAW;wBAC3B,QAAQ,EAAE,kBAAkB;wBAC5B,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,OAAO;wBAChB,SAAS,EAAE,MAAM;qBAClB;iBACF;aACF;SACF,CAAC;QAEF,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE1C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,KAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,KAAM,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,eAAe,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,MAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,EAAE,CAAC,OAAO,CACR,sFAAsF,CACvF,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE;gBACJ,MAAM,EAAE;oBACN,QAAQ,EAAE;wBACR,cAAc,EAAE,YAAY;wBAC5B,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,MAAM;wBACf,SAAS,EAAE,IAAI;qBAChB;iBACF;aACF;SACF,CAAC;QAEF,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE5B,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE;gBACJ,SAAS,EAAE,EAAE;gBACb,cAAc,EAAE,EAAE;aACnB;SACF,CAAC;QAEF,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE1C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE;gBACJ,WAAW,EAAE;oBACX,QAAQ,EAAE;wBACR,cAAc,EAAE,WAAW;wBAC3B,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,MAAM;wBACf,SAAS,EAAE,IAAI;qBAChB;iBACF;aACF;SACF,CAAC;QAEF,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE1C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzC,aAAa,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE;gBACJ,OAAO,EAAE;oBACP,QAAQ,EAAE;wBACR,cAAc,EAAE,WAAW;wBAC3B,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,MAAM;wBACf,SAAS,EAAE,IAAI;qBAChB;iBACF;aACF;SACF,CAAC;QAEF,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE1C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
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"}
|
package/dist/db/queries.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface EnqueueParams {
|
|
|
5
5
|
payload: unknown;
|
|
6
6
|
callbackUrl: string;
|
|
7
7
|
options?: EnqueueOptions;
|
|
8
|
+
scheduleId?: number;
|
|
8
9
|
}
|
|
9
10
|
export declare function enqueueJob(db: DatabaseSync, params: EnqueueParams): {
|
|
10
11
|
jobId: string;
|
|
@@ -28,6 +29,7 @@ interface JobRow {
|
|
|
28
29
|
backoff_strategy: string;
|
|
29
30
|
backoff_delay: number;
|
|
30
31
|
callback_url: string;
|
|
32
|
+
schedule_id: number | null;
|
|
31
33
|
}
|
|
32
34
|
export declare function getJobByPublicId(db: DatabaseSync, publicId: string): JobRow | null;
|
|
33
35
|
export declare function listRecentJobs(db: DatabaseSync, limit?: number): JobRow[];
|
package/dist/db/queries.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,KAAK,cAAc,EAAgC,MAAM,iBAAiB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,KAAK,cAAc,EAAgC,MAAM,iBAAiB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,aAAa,GACpB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CA0BnB;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,YAAY,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI,CAKN;AAED,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,YAAY,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,SAAM,GAAG,MAAM,EAAE,CAKtE"}
|
package/dist/db/queries.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { generatePublicId, parseDelay } from "@queuebase/core";
|
|
2
2
|
export function enqueueJob(db, params) {
|
|
3
|
-
const { name, payload, callbackUrl, options = {} } = params;
|
|
3
|
+
const { name, payload, callbackUrl, options = {}, scheduleId } = params;
|
|
4
4
|
const publicId = generatePublicId();
|
|
5
5
|
const now = Date.now();
|
|
6
6
|
const delay = options.delay ? parseDelay(options.delay) : 0;
|
|
7
7
|
const stmt = db.prepare(`
|
|
8
|
-
INSERT INTO jobs (public_id, name, payload, status, attempt, max_attempts, run_at, created_at, backoff_strategy, backoff_delay, callback_url)
|
|
9
|
-
VALUES (?, ?, ?, 'pending', 1, ?, ?, ?, ?, ?, ?)
|
|
8
|
+
INSERT INTO jobs (public_id, name, payload, status, attempt, max_attempts, run_at, created_at, backoff_strategy, backoff_delay, callback_url, schedule_id)
|
|
9
|
+
VALUES (?, ?, ?, 'pending', 1, ?, ?, ?, ?, ?, ?, ?)
|
|
10
10
|
`);
|
|
11
|
-
stmt.run(publicId, name, JSON.stringify(payload), (options.retries ?? 0) + 1, now + delay, now, options.backoff ?? "exponential", options.backoffDelay ?? 1000, callbackUrl);
|
|
11
|
+
stmt.run(publicId, name, JSON.stringify(payload), (options.retries ?? 0) + 1, now + delay, now, options.backoff ?? "exponential", options.backoffDelay ?? 1000, callbackUrl, scheduleId ?? null);
|
|
12
12
|
return { jobId: publicId };
|
|
13
13
|
}
|
|
14
14
|
export function getJobIdByPublicId(db, publicId) {
|
package/dist/db/queries.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAUpF,MAAM,UAAU,UAAU,CACxB,EAAgB,EAChB,MAAqB;IAErB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAExE,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CACN,QAAQ,EACR,IAAI,EACJ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAC1B,GAAG,GAAG,KAAK,EACX,GAAG,EACH,OAAO,CAAC,OAAO,IAAI,aAAa,EAChC,OAAO,CAAC,YAAY,IAAI,IAAI,EAC5B,WAAW,EACX,UAAU,IAAI,IAAI,CACnB,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,EAAgB,EAChB,QAAgB;IAEhB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAA+B,CAAC;IAC7D,OAAO,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,EAAgB,EAChB,KAAa,EACb,KAAa;IAEb,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,oDAAoD,CACrD,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAsBD,MAAM,UAAU,gBAAgB,CAC9B,EAAgB,EAChB,QAAgB;IAEhB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAuB,CAAC;IACrD,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAgB,EAAE,KAAK,GAAG,GAAG;IAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,oDAAoD,CACrD,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAwB,CAAC;AAChD,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 IN ('running', 'pending') 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"}
|