openworkflow 0.4.0 → 0.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/README.md +57 -46
- package/dist/backend-postgres/index.d.ts +44 -0
- package/dist/backend-postgres/index.d.ts.map +1 -0
- package/dist/backend-postgres/index.js +535 -0
- package/dist/backend-postgres/index.js.map +1 -0
- package/dist/backend-postgres/postgres.d.ts +42 -0
- package/dist/backend-postgres/postgres.d.ts.map +1 -0
- package/dist/backend-postgres/postgres.js +234 -0
- package/dist/backend-postgres/postgres.js.map +1 -0
- package/dist/backend-sqlite/index.d.ts +42 -0
- package/dist/backend-sqlite/index.d.ts.map +1 -0
- package/dist/backend-sqlite/index.js +655 -0
- package/dist/backend-sqlite/index.js.map +1 -0
- package/dist/backend-sqlite/sqlite.d.ts +61 -0
- package/dist/backend-sqlite/sqlite.d.ts.map +1 -0
- package/dist/backend-sqlite/sqlite.js +247 -0
- package/dist/backend-sqlite/sqlite.js.map +1 -0
- package/dist/backend.d.ts +21 -89
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +0 -21
- package/dist/backend.js.map +1 -1
- package/dist/bin/openworkflow.d.ts +3 -0
- package/dist/bin/openworkflow.d.ts.map +1 -0
- package/dist/bin/openworkflow.js +44 -0
- package/dist/bin/openworkflow.js.map +1 -0
- package/dist/client.d.ts +68 -80
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +83 -53
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/{duration.d.ts → core/duration.d.ts} +5 -2
- package/dist/core/duration.d.ts.map +1 -0
- package/dist/{duration.js → core/duration.js} +9 -6
- package/dist/core/duration.js.map +1 -0
- package/dist/core/error.d.ts +14 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +18 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/json.d.ts +5 -0
- package/dist/core/json.d.ts.map +1 -0
- package/dist/core/json.js +2 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/result.d.ts +22 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +17 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/retry.d.ts +7 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +7 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/step.d.ts +89 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +66 -0
- package/dist/core/step.js.map +1 -0
- package/dist/core/workflow.d.ts +63 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +35 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/execution.d.ts +69 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +188 -0
- package/dist/execution.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +8 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +5 -0
- package/dist/internal.js.map +1 -0
- package/dist/pg/backend.d.ts +42 -0
- package/dist/pg/backend.d.ts.map +1 -0
- package/dist/pg/backend.js +534 -0
- package/dist/pg/backend.js.map +1 -0
- package/dist/pg/index.d.ts +3 -0
- package/dist/pg/index.d.ts.map +1 -0
- package/dist/pg/index.js +3 -0
- package/dist/pg/index.js.map +1 -0
- package/dist/pg/postgres.d.ts +42 -0
- package/dist/pg/postgres.d.ts.map +1 -0
- package/dist/pg/postgres.js +234 -0
- package/dist/pg/postgres.js.map +1 -0
- package/dist/pg/scripts/db-migrate.d.ts +2 -0
- package/dist/pg/scripts/db-migrate.d.ts.map +1 -0
- package/dist/pg/scripts/db-migrate.js +5 -0
- package/dist/pg/scripts/db-migrate.js.map +1 -0
- package/dist/pg/scripts/db-reset.d.ts +2 -0
- package/dist/pg/scripts/db-reset.d.ts.map +1 -0
- package/dist/pg/scripts/db-reset.js +6 -0
- package/dist/pg/scripts/db-reset.js.map +1 -0
- package/dist/pg/scripts/squawk.d.ts +2 -0
- package/dist/pg/scripts/squawk.d.ts.map +1 -0
- package/dist/pg/scripts/squawk.js +17 -0
- package/dist/pg/scripts/squawk.js.map +1 -0
- package/dist/pg/vitest.global-setup.d.ts +3 -0
- package/dist/pg/vitest.global-setup.d.ts.map +1 -0
- package/dist/pg/vitest.global-setup.js +8 -0
- package/dist/pg/vitest.global-setup.js.map +1 -0
- package/dist/registry.d.ts +27 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +49 -0
- package/dist/registry.js.map +1 -0
- package/dist/sqlite/backend.d.ts +40 -0
- package/dist/sqlite/backend.d.ts.map +1 -0
- package/dist/sqlite/backend.js +654 -0
- package/dist/sqlite/backend.js.map +1 -0
- package/dist/sqlite/index.d.ts +3 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +3 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/sqlite.d.ts +61 -0
- package/dist/sqlite/sqlite.d.ts.map +1 -0
- package/dist/sqlite/sqlite.js +247 -0
- package/dist/sqlite/sqlite.js.map +1 -0
- package/dist/testing/backend.testsuite.d.ts +20 -0
- package/dist/testing/backend.testsuite.d.ts.map +1 -0
- package/dist/testing/backend.testsuite.js +1091 -0
- package/dist/testing/backend.testsuite.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/worker.d.ts +10 -3
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +29 -195
- package/dist/worker.js.map +1 -1
- package/dist/workflow.d.ts +60 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +49 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +16 -6
- package/dist/duration.d.ts.map +0 -1
- package/dist/duration.js.map +0 -1
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js.map +0 -1
- /package/dist/{schema.d.ts → core/schema.d.ts} +0 -0
- /package/dist/{schema.js → core/schema.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../sqlite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,KAAK,QAAQ,EACb,WAAW,EACX,UAAU,EACV,OAAO,EACP,YAAY,EACZ,GAAG,EACH,eAAe,EACf,MAAM,EACN,QAAQ,EACR,KAAK,EACL,OAAO,GACR,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../sqlite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAEL,WAAW,EACX,UAAU,EACV,OAAO,EACP,YAAY,EACZ,GAAG,EACH,eAAe,EACf,MAAM,EACN,QAAQ,EACR,KAAK,EACL,OAAO,GACR,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
export type Database = DatabaseSync;
|
|
3
|
+
/**
|
|
4
|
+
* newDatabase creates a new SQLite database connection.
|
|
5
|
+
* @param path - Database file path (or ":memory:") for testing
|
|
6
|
+
* @returns SQLite database connection
|
|
7
|
+
*/
|
|
8
|
+
export declare function newDatabase(path: string): Database;
|
|
9
|
+
/**
|
|
10
|
+
* migrations returns the list of migration SQL statements.
|
|
11
|
+
* @returns Migration SQL statements
|
|
12
|
+
*/
|
|
13
|
+
export declare function migrations(): string[];
|
|
14
|
+
/**
|
|
15
|
+
* migrate applies pending migrations to the database. Does nothing if the
|
|
16
|
+
* database is already up to date.
|
|
17
|
+
* @param db - SQLite database
|
|
18
|
+
*/
|
|
19
|
+
export declare function migrate(db: Database): void;
|
|
20
|
+
/**
|
|
21
|
+
* Helper to generate UUIDs (SQLite doesn't have built-in UUID generation)
|
|
22
|
+
* @returns A UUID string
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateUUID(): string;
|
|
25
|
+
/**
|
|
26
|
+
* Helper to get current timestamp in ISO8601 format
|
|
27
|
+
* @returns ISO8601 timestamp string
|
|
28
|
+
*/
|
|
29
|
+
export declare function now(): string;
|
|
30
|
+
/**
|
|
31
|
+
* Helper to add milliseconds to a date and return ISO8601 string
|
|
32
|
+
* @param date - ISO8601 date string
|
|
33
|
+
* @param ms - Milliseconds to add
|
|
34
|
+
* @returns Updated ISO8601 date string
|
|
35
|
+
*/
|
|
36
|
+
export declare function addMilliseconds(date: string, ms: number): string;
|
|
37
|
+
/**
|
|
38
|
+
* Helper to serialize JSON for SQLite storage
|
|
39
|
+
* @param value - Value to serialize
|
|
40
|
+
* @returns JSON string or null
|
|
41
|
+
*/
|
|
42
|
+
export declare function toJSON(value: unknown): string | null;
|
|
43
|
+
/**
|
|
44
|
+
* Helper to deserialize JSON from SQLite storage
|
|
45
|
+
* @param value - JSON string or null
|
|
46
|
+
* @returns Parsed value
|
|
47
|
+
*/
|
|
48
|
+
export declare function fromJSON(value: string | null): unknown;
|
|
49
|
+
/**
|
|
50
|
+
* Helper to convert Date to ISO8601 string for SQLite
|
|
51
|
+
* @param date - Date or null
|
|
52
|
+
* @returns ISO8601 date string or null
|
|
53
|
+
*/
|
|
54
|
+
export declare function toISO(date: Date | null): string | null;
|
|
55
|
+
/**
|
|
56
|
+
* Helper to convert ISO8601 string from SQLite to Date
|
|
57
|
+
* @param dateStr - ISO8601 date string or null
|
|
58
|
+
* @returns Date or null
|
|
59
|
+
*/
|
|
60
|
+
export declare function fromISO(dateStr: string | null): Date | null;
|
|
61
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../sqlite/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,QAAQ,GAAG,YAAY,CAAC;AAEpC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAQlD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,EAAE,CA2IrC;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAQ1C;AAyBD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAE3D"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { DatabaseSync } from "node:sqlite";
|
|
3
|
+
/**
|
|
4
|
+
* newDatabase creates a new SQLite database connection.
|
|
5
|
+
* @param path - Database file path (or ":memory:") for testing
|
|
6
|
+
* @returns SQLite database connection
|
|
7
|
+
*/
|
|
8
|
+
export function newDatabase(path) {
|
|
9
|
+
const db = new DatabaseSync(path);
|
|
10
|
+
// Only enable WAL mode for file-based databases
|
|
11
|
+
if (path !== ":memory:") {
|
|
12
|
+
db.exec("PRAGMA journal_mode = WAL;");
|
|
13
|
+
}
|
|
14
|
+
db.exec("PRAGMA foreign_keys = ON;");
|
|
15
|
+
return db;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* migrations returns the list of migration SQL statements.
|
|
19
|
+
* @returns Migration SQL statements
|
|
20
|
+
*/
|
|
21
|
+
export function migrations() {
|
|
22
|
+
return [
|
|
23
|
+
// 0 - init
|
|
24
|
+
`BEGIN;
|
|
25
|
+
|
|
26
|
+
CREATE TABLE IF NOT EXISTS "openworkflow_migrations" (
|
|
27
|
+
"version" INTEGER NOT NULL PRIMARY KEY
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
INSERT OR IGNORE INTO "openworkflow_migrations" ("version")
|
|
31
|
+
VALUES (0);
|
|
32
|
+
|
|
33
|
+
COMMIT;`,
|
|
34
|
+
// 1 - add workflow_runs and step_attempts tables
|
|
35
|
+
`BEGIN;
|
|
36
|
+
|
|
37
|
+
PRAGMA defer_foreign_keys = ON;
|
|
38
|
+
|
|
39
|
+
CREATE TABLE IF NOT EXISTS "workflow_runs" (
|
|
40
|
+
"namespace_id" TEXT NOT NULL,
|
|
41
|
+
"id" TEXT NOT NULL,
|
|
42
|
+
--
|
|
43
|
+
"workflow_name" TEXT NOT NULL,
|
|
44
|
+
"version" TEXT,
|
|
45
|
+
"status" TEXT NOT NULL,
|
|
46
|
+
"idempotency_key" TEXT,
|
|
47
|
+
"config" TEXT NOT NULL,
|
|
48
|
+
"context" TEXT,
|
|
49
|
+
"input" TEXT,
|
|
50
|
+
"output" TEXT,
|
|
51
|
+
"error" TEXT,
|
|
52
|
+
"attempts" INTEGER NOT NULL,
|
|
53
|
+
"parent_step_attempt_namespace_id" TEXT,
|
|
54
|
+
"parent_step_attempt_id" TEXT,
|
|
55
|
+
"worker_id" TEXT,
|
|
56
|
+
"available_at" TEXT,
|
|
57
|
+
"deadline_at" TEXT,
|
|
58
|
+
"started_at" TEXT,
|
|
59
|
+
"finished_at" TEXT,
|
|
60
|
+
"created_at" TEXT NOT NULL,
|
|
61
|
+
"updated_at" TEXT NOT NULL,
|
|
62
|
+
PRIMARY KEY ("namespace_id", "id"),
|
|
63
|
+
FOREIGN KEY ("parent_step_attempt_namespace_id", "parent_step_attempt_id")
|
|
64
|
+
REFERENCES "step_attempts" ("namespace_id", "id")
|
|
65
|
+
ON DELETE SET NULL
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
CREATE TABLE IF NOT EXISTS "step_attempts" (
|
|
69
|
+
"namespace_id" TEXT NOT NULL,
|
|
70
|
+
"id" TEXT NOT NULL,
|
|
71
|
+
--
|
|
72
|
+
"workflow_run_id" TEXT NOT NULL,
|
|
73
|
+
"step_name" TEXT NOT NULL,
|
|
74
|
+
"kind" TEXT NOT NULL,
|
|
75
|
+
"status" TEXT NOT NULL,
|
|
76
|
+
"config" TEXT NOT NULL,
|
|
77
|
+
"context" TEXT,
|
|
78
|
+
"output" TEXT,
|
|
79
|
+
"error" TEXT,
|
|
80
|
+
"child_workflow_run_namespace_id" TEXT,
|
|
81
|
+
"child_workflow_run_id" TEXT,
|
|
82
|
+
"started_at" TEXT,
|
|
83
|
+
"finished_at" TEXT,
|
|
84
|
+
"created_at" TEXT NOT NULL,
|
|
85
|
+
"updated_at" TEXT NOT NULL,
|
|
86
|
+
PRIMARY KEY ("namespace_id", "id"),
|
|
87
|
+
FOREIGN KEY ("namespace_id", "workflow_run_id")
|
|
88
|
+
REFERENCES "workflow_runs" ("namespace_id", "id")
|
|
89
|
+
ON DELETE CASCADE,
|
|
90
|
+
FOREIGN KEY ("child_workflow_run_namespace_id", "child_workflow_run_id")
|
|
91
|
+
REFERENCES "workflow_runs" ("namespace_id", "id")
|
|
92
|
+
ON DELETE SET NULL
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
INSERT OR IGNORE INTO "openworkflow_migrations" ("version")
|
|
96
|
+
VALUES (1);
|
|
97
|
+
|
|
98
|
+
COMMIT;`,
|
|
99
|
+
// 2 - foreign keys
|
|
100
|
+
`BEGIN;
|
|
101
|
+
|
|
102
|
+
-- Foreign keys are defined in migration 1 since SQLite requires them during table creation
|
|
103
|
+
-- This migration exists for version parity with PostgreSQL backend
|
|
104
|
+
|
|
105
|
+
INSERT OR IGNORE INTO "openworkflow_migrations" ("version")
|
|
106
|
+
VALUES (2);
|
|
107
|
+
|
|
108
|
+
COMMIT;`,
|
|
109
|
+
// 3 - validate foreign keys
|
|
110
|
+
`BEGIN;
|
|
111
|
+
|
|
112
|
+
-- Foreign key validation happens automatically in SQLite when PRAGMA foreign_keys = ON
|
|
113
|
+
-- This migration exists for version parity with PostgreSQL backend
|
|
114
|
+
|
|
115
|
+
INSERT OR IGNORE INTO "openworkflow_migrations" ("version")
|
|
116
|
+
VALUES (3);
|
|
117
|
+
|
|
118
|
+
COMMIT;`,
|
|
119
|
+
// 4 - indexes
|
|
120
|
+
`BEGIN;
|
|
121
|
+
|
|
122
|
+
CREATE INDEX IF NOT EXISTS "workflow_runs_status_available_at_created_at_idx"
|
|
123
|
+
ON "workflow_runs" ("namespace_id", "status", "available_at", "created_at");
|
|
124
|
+
|
|
125
|
+
CREATE INDEX IF NOT EXISTS "workflow_runs_workflow_name_idempotency_key_created_at_idx"
|
|
126
|
+
ON "workflow_runs" ("namespace_id", "workflow_name", "idempotency_key", "created_at");
|
|
127
|
+
|
|
128
|
+
CREATE INDEX IF NOT EXISTS "workflow_runs_parent_step_idx"
|
|
129
|
+
ON "workflow_runs" ("parent_step_attempt_namespace_id", "parent_step_attempt_id")
|
|
130
|
+
WHERE parent_step_attempt_namespace_id IS NOT NULL AND parent_step_attempt_id IS NOT NULL;
|
|
131
|
+
|
|
132
|
+
CREATE INDEX IF NOT EXISTS "workflow_runs_created_at_desc_idx"
|
|
133
|
+
ON "workflow_runs" ("namespace_id", "created_at" DESC);
|
|
134
|
+
|
|
135
|
+
CREATE INDEX IF NOT EXISTS "workflow_runs_status_created_at_desc_idx"
|
|
136
|
+
ON "workflow_runs" ("namespace_id", "status", "created_at" DESC);
|
|
137
|
+
|
|
138
|
+
CREATE INDEX IF NOT EXISTS "workflow_runs_workflow_name_status_created_at_desc_idx"
|
|
139
|
+
ON "workflow_runs" ("namespace_id", "workflow_name", "status", "created_at" DESC);
|
|
140
|
+
|
|
141
|
+
CREATE INDEX IF NOT EXISTS "step_attempts_workflow_run_created_at_idx"
|
|
142
|
+
ON "step_attempts" ("namespace_id", "workflow_run_id", "created_at");
|
|
143
|
+
|
|
144
|
+
CREATE INDEX IF NOT EXISTS "step_attempts_workflow_run_step_name_created_at_idx"
|
|
145
|
+
ON "step_attempts" ("namespace_id", "workflow_run_id", "step_name", "created_at");
|
|
146
|
+
|
|
147
|
+
CREATE INDEX IF NOT EXISTS "step_attempts_child_workflow_run_idx"
|
|
148
|
+
ON "step_attempts" ("child_workflow_run_namespace_id", "child_workflow_run_id")
|
|
149
|
+
WHERE child_workflow_run_namespace_id IS NOT NULL AND child_workflow_run_id IS NOT NULL;
|
|
150
|
+
|
|
151
|
+
INSERT OR IGNORE INTO "openworkflow_migrations" ("version")
|
|
152
|
+
VALUES (4);
|
|
153
|
+
|
|
154
|
+
COMMIT;`,
|
|
155
|
+
];
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* migrate applies pending migrations to the database. Does nothing if the
|
|
159
|
+
* database is already up to date.
|
|
160
|
+
* @param db - SQLite database
|
|
161
|
+
*/
|
|
162
|
+
export function migrate(db) {
|
|
163
|
+
const currentMigrationVersion = getCurrentMigrationVersion(db);
|
|
164
|
+
for (const [i, migrationSql] of migrations().entries()) {
|
|
165
|
+
if (i <= currentMigrationVersion)
|
|
166
|
+
continue; // already applied
|
|
167
|
+
db.exec(migrationSql);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* getCurrentMigrationVersion returns the current migration version of the database.
|
|
172
|
+
* @param db - SQLite database
|
|
173
|
+
* @returns Current migration version
|
|
174
|
+
*/
|
|
175
|
+
function getCurrentMigrationVersion(db) {
|
|
176
|
+
// check if migrations table exists
|
|
177
|
+
const existsStmt = db.prepare(`
|
|
178
|
+
SELECT COUNT(*) as count
|
|
179
|
+
FROM sqlite_master
|
|
180
|
+
WHERE type = 'table' AND name = 'openworkflow_migrations'
|
|
181
|
+
`);
|
|
182
|
+
const existsResult = existsStmt.get();
|
|
183
|
+
if (!existsResult || existsResult.count === 0)
|
|
184
|
+
return -1;
|
|
185
|
+
// get current version
|
|
186
|
+
const versionStmt = db.prepare(`SELECT MAX("version") AS "version" FROM "openworkflow_migrations";`);
|
|
187
|
+
const versionResult = versionStmt.get();
|
|
188
|
+
return versionResult?.version ?? -1;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Helper to generate UUIDs (SQLite doesn't have built-in UUID generation)
|
|
192
|
+
* @returns A UUID string
|
|
193
|
+
*/
|
|
194
|
+
export function generateUUID() {
|
|
195
|
+
return randomUUID();
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Helper to get current timestamp in ISO8601 format
|
|
199
|
+
* @returns ISO8601 timestamp string
|
|
200
|
+
*/
|
|
201
|
+
export function now() {
|
|
202
|
+
return new Date().toISOString();
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Helper to add milliseconds to a date and return ISO8601 string
|
|
206
|
+
* @param date - ISO8601 date string
|
|
207
|
+
* @param ms - Milliseconds to add
|
|
208
|
+
* @returns Updated ISO8601 date string
|
|
209
|
+
*/
|
|
210
|
+
export function addMilliseconds(date, ms) {
|
|
211
|
+
const d = new Date(date);
|
|
212
|
+
d.setMilliseconds(d.getMilliseconds() + ms);
|
|
213
|
+
return d.toISOString();
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Helper to serialize JSON for SQLite storage
|
|
217
|
+
* @param value - Value to serialize
|
|
218
|
+
* @returns JSON string or null
|
|
219
|
+
*/
|
|
220
|
+
export function toJSON(value) {
|
|
221
|
+
return value === null || value === undefined ? null : JSON.stringify(value);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Helper to deserialize JSON from SQLite storage
|
|
225
|
+
* @param value - JSON string or null
|
|
226
|
+
* @returns Parsed value
|
|
227
|
+
*/
|
|
228
|
+
export function fromJSON(value) {
|
|
229
|
+
return value === null ? null : JSON.parse(value);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Helper to convert Date to ISO8601 string for SQLite
|
|
233
|
+
* @param date - Date or null
|
|
234
|
+
* @returns ISO8601 date string or null
|
|
235
|
+
*/
|
|
236
|
+
export function toISO(date) {
|
|
237
|
+
return date ? date.toISOString() : null;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Helper to convert ISO8601 string from SQLite to Date
|
|
241
|
+
* @param dateStr - ISO8601 date string or null
|
|
242
|
+
* @returns Date or null
|
|
243
|
+
*/
|
|
244
|
+
export function fromISO(dateStr) {
|
|
245
|
+
return dateStr ? new Date(dateStr) : null;
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../sqlite/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Backend } from "openworkflow/internal";
|
|
2
|
+
/**
|
|
3
|
+
* Options for the Backend test suite.
|
|
4
|
+
*/
|
|
5
|
+
export interface TestBackendOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Creates a new isolated Backend instance.
|
|
8
|
+
*/
|
|
9
|
+
setup: () => Promise<Backend>;
|
|
10
|
+
/**
|
|
11
|
+
* Cleans up a Backend instance.
|
|
12
|
+
*/
|
|
13
|
+
teardown: (backend: Backend) => Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Runs the Backend test suite.
|
|
17
|
+
* @param options - Test suite options
|
|
18
|
+
*/
|
|
19
|
+
export declare function testBackend(options: TestBackendOptions): void;
|
|
20
|
+
//# sourceMappingURL=backend.testsuite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.testsuite.d.ts","sourceRoot":"","sources":["../../testing/backend.testsuite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA4B,MAAM,uBAAuB,CAAC;AAG/E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B;;OAEG;IACH,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CA8sC7D"}
|