@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.
Files changed (61) hide show
  1. package/dist/__tests__/generate.test.d.ts +2 -0
  2. package/dist/__tests__/generate.test.d.ts.map +1 -0
  3. package/dist/__tests__/generate.test.js +204 -0
  4. package/dist/__tests__/generate.test.js.map +1 -0
  5. package/dist/__tests__/manifest.test.d.ts +2 -0
  6. package/dist/__tests__/manifest.test.d.ts.map +1 -0
  7. package/dist/__tests__/manifest.test.js +41 -0
  8. package/dist/__tests__/manifest.test.js.map +1 -0
  9. package/dist/__tests__/schedule-ticker.test.d.ts +2 -0
  10. package/dist/__tests__/schedule-ticker.test.d.ts.map +1 -0
  11. package/dist/__tests__/schedule-ticker.test.js +185 -0
  12. package/dist/__tests__/schedule-ticker.test.js.map +1 -0
  13. package/dist/__tests__/sync-schedules.test.d.ts +2 -0
  14. package/dist/__tests__/sync-schedules.test.d.ts.map +1 -0
  15. package/dist/__tests__/sync-schedules.test.js +171 -0
  16. package/dist/__tests__/sync-schedules.test.js.map +1 -0
  17. package/dist/bin.js +7 -1
  18. package/dist/bin.js.map +1 -1
  19. package/dist/commands/dev.d.ts.map +1 -1
  20. package/dist/commands/dev.js +3 -1
  21. package/dist/commands/dev.js.map +1 -1
  22. package/dist/commands/generate.d.ts +2 -0
  23. package/dist/commands/generate.d.ts.map +1 -0
  24. package/dist/commands/generate.js +10 -0
  25. package/dist/commands/generate.js.map +1 -0
  26. package/dist/db/migrations.d.ts.map +1 -1
  27. package/dist/db/migrations.js +36 -0
  28. package/dist/db/migrations.js.map +1 -1
  29. package/dist/db/queries.d.ts +2 -0
  30. package/dist/db/queries.d.ts.map +1 -1
  31. package/dist/db/queries.js +4 -4
  32. package/dist/db/queries.js.map +1 -1
  33. package/dist/db/schedule-queries.d.ts +59 -0
  34. package/dist/db/schedule-queries.d.ts.map +1 -0
  35. package/dist/db/schedule-queries.js +78 -0
  36. package/dist/db/schedule-queries.js.map +1 -0
  37. package/dist/generate.d.ts +12 -0
  38. package/dist/generate.d.ts.map +1 -0
  39. package/dist/generate.js +103 -0
  40. package/dist/generate.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +3 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/manifest.d.ts +12 -0
  46. package/dist/manifest.d.ts.map +1 -0
  47. package/dist/manifest.js +15 -0
  48. package/dist/manifest.js.map +1 -0
  49. package/dist/schedule-ticker.d.ts +16 -0
  50. package/dist/schedule-ticker.d.ts.map +1 -0
  51. package/dist/schedule-ticker.js +63 -0
  52. package/dist/schedule-ticker.js.map +1 -0
  53. package/dist/server.d.ts +1 -0
  54. package/dist/server.d.ts.map +1 -1
  55. package/dist/server.js +13 -0
  56. package/dist/server.js.map +1 -1
  57. package/dist/sync-schedules.d.ts +4 -0
  58. package/dist/sync-schedules.d.ts.map +1 -0
  59. package/dist/sync-schedules.js +29 -0
  60. package/dist/sync-schedules.js.map +1 -0
  61. 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":"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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 Start the local development server
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;AAE/C,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;;;;;;;;;;;;;;;;;;CAkBb,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;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
+ {"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,QAsBlD"}
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"}
@@ -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(process.cwd(), '.queuebase', 'dev.db');
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
@@ -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,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEhE,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;KACZ,CAAC,CAAC;AACL,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,2 @@
1
+ export declare function generateCommand(): Promise<void>;
2
+ //# sourceMappingURL=generate.d.ts.map
@@ -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,CA+CpD"}
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"}
@@ -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"}
@@ -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[];
@@ -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;CAC1B;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,aAAa,GACpB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAyBnB;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;CACtB;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"}
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"}
@@ -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) {
@@ -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;AASpF,MAAM,UAAU,UAAU,CACxB,EAAgB,EAChB,MAAqB;IAErB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE5D,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,CACZ,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;AAqBD,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"}
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"}