openworkflow 0.5.0 → 0.6.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.
Files changed (193) hide show
  1. package/README.md +40 -347
  2. package/dist/{testing → backend-test}/backend.testsuite.d.ts +1 -1
  3. package/dist/backend-test/backend.testsuite.d.ts.map +1 -0
  4. package/dist/{testing → backend-test}/backend.testsuite.js +8 -9
  5. package/dist/backend-test/index.d.ts +2 -0
  6. package/dist/backend-test/index.d.ts.map +1 -0
  7. package/dist/{testing → backend-test}/index.js +0 -1
  8. package/dist/backend.js +0 -1
  9. package/dist/backend.testsuite.d.ts +20 -0
  10. package/dist/backend.testsuite.d.ts.map +1 -0
  11. package/dist/backend.testsuite.js +1090 -0
  12. package/dist/bin/openworkflow.js +0 -1
  13. package/dist/chaos.test.d.ts +2 -0
  14. package/dist/chaos.test.d.ts.map +1 -0
  15. package/dist/chaos.test.js +88 -0
  16. package/dist/client.js +0 -1
  17. package/dist/client.test.d.ts +2 -0
  18. package/dist/client.test.d.ts.map +1 -0
  19. package/dist/client.test.js +311 -0
  20. package/dist/core/duration.js +0 -1
  21. package/dist/core/duration.test.d.ts +2 -0
  22. package/dist/core/duration.test.d.ts.map +1 -0
  23. package/dist/core/duration.test.js +263 -0
  24. package/dist/core/error.js +0 -1
  25. package/dist/core/error.test.d.ts +2 -0
  26. package/dist/core/error.test.d.ts.map +1 -0
  27. package/dist/core/error.test.js +60 -0
  28. package/dist/core/json.js +0 -1
  29. package/dist/core/result.js +0 -1
  30. package/dist/core/result.test.d.ts +2 -0
  31. package/dist/core/result.test.d.ts.map +1 -0
  32. package/dist/core/result.test.js +11 -0
  33. package/dist/core/retry.js +0 -1
  34. package/dist/core/schema.js +0 -1
  35. package/dist/core/step.js +0 -1
  36. package/dist/core/step.test.d.ts +2 -0
  37. package/dist/core/step.test.d.ts.map +1 -0
  38. package/dist/core/step.test.js +266 -0
  39. package/dist/core/workflow.js +0 -1
  40. package/dist/core/workflow.test.d.ts +2 -0
  41. package/dist/core/workflow.test.d.ts.map +1 -0
  42. package/dist/core/workflow.test.js +113 -0
  43. package/dist/driver.d.ts +116 -0
  44. package/dist/driver.d.ts.map +1 -0
  45. package/dist/driver.js +1 -0
  46. package/dist/execution.js +0 -1
  47. package/dist/execution.test.d.ts +2 -0
  48. package/dist/execution.test.d.ts.map +1 -0
  49. package/dist/execution.test.js +381 -0
  50. package/dist/factory.d.ts +74 -0
  51. package/dist/factory.d.ts.map +1 -0
  52. package/dist/factory.js +72 -0
  53. package/dist/index.js +0 -1
  54. package/dist/internal.d.ts +4 -5
  55. package/dist/internal.d.ts.map +1 -1
  56. package/dist/internal.js +1 -4
  57. package/dist/{backend-sqlite/index.d.ts → node-sqlite/backend.d.ts} +14 -4
  58. package/dist/node-sqlite/backend.d.ts.map +1 -0
  59. package/dist/{backend-sqlite/index.js → node-sqlite/backend.js} +23 -5
  60. package/dist/node-sqlite/index.d.ts +11 -0
  61. package/dist/node-sqlite/index.d.ts.map +1 -0
  62. package/dist/node-sqlite/index.js +7 -0
  63. package/dist/{backend-sqlite → node-sqlite}/sqlite.d.ts +2 -3
  64. package/dist/node-sqlite/sqlite.d.ts.map +1 -0
  65. package/dist/{backend-sqlite → node-sqlite}/sqlite.js +0 -1
  66. package/dist/{pg → postgres}/backend.d.ts +3 -1
  67. package/dist/postgres/backend.d.ts.map +1 -0
  68. package/dist/{pg → postgres}/backend.js +5 -5
  69. package/dist/postgres/backend.test.d.ts +2 -0
  70. package/dist/postgres/backend.test.d.ts.map +1 -0
  71. package/dist/postgres/backend.test.js +19 -0
  72. package/dist/postgres/driver.d.ts +81 -0
  73. package/dist/postgres/driver.d.ts.map +1 -0
  74. package/dist/postgres/driver.js +63 -0
  75. package/dist/postgres/index.d.ts +11 -0
  76. package/dist/postgres/index.d.ts.map +1 -0
  77. package/dist/postgres/index.js +7 -0
  78. package/dist/postgres/internal.d.ts +2 -0
  79. package/dist/postgres/internal.d.ts.map +1 -0
  80. package/dist/postgres/internal.js +1 -0
  81. package/dist/postgres/postgres.d.ts.map +1 -0
  82. package/dist/{backend-postgres → postgres}/postgres.js +0 -1
  83. package/dist/postgres/postgres.test.d.ts +2 -0
  84. package/dist/postgres/postgres.test.d.ts.map +1 -0
  85. package/dist/postgres/postgres.test.js +45 -0
  86. package/dist/postgres/scripts/db-migrate.d.ts.map +1 -0
  87. package/dist/{pg → postgres}/scripts/db-migrate.js +0 -1
  88. package/dist/postgres/scripts/db-reset.d.ts.map +1 -0
  89. package/dist/{pg → postgres}/scripts/db-reset.js +0 -1
  90. package/dist/{pg → postgres}/scripts/squawk.d.ts.map +1 -1
  91. package/dist/{pg → postgres}/scripts/squawk.js +0 -1
  92. package/dist/postgres/vitest.global-setup.d.ts.map +1 -0
  93. package/dist/{pg → postgres}/vitest.global-setup.js +0 -1
  94. package/dist/postgres.d.ts +2 -0
  95. package/dist/postgres.d.ts.map +1 -0
  96. package/dist/postgres.js +1 -0
  97. package/dist/registry.js +0 -1
  98. package/dist/registry.test.d.ts +2 -0
  99. package/dist/registry.test.d.ts.map +1 -0
  100. package/dist/registry.test.js +109 -0
  101. package/dist/sqlite/backend.d.ts +3 -1
  102. package/dist/sqlite/backend.d.ts.map +1 -1
  103. package/dist/sqlite/backend.js +5 -5
  104. package/dist/sqlite/backend.test.d.ts +2 -0
  105. package/dist/sqlite/backend.test.d.ts.map +1 -0
  106. package/dist/sqlite/backend.test.js +50 -0
  107. package/dist/sqlite/driver.d.ts +79 -0
  108. package/dist/sqlite/driver.d.ts.map +1 -0
  109. package/dist/sqlite/driver.js +62 -0
  110. package/dist/sqlite/index.d.ts +12 -2
  111. package/dist/sqlite/index.d.ts.map +1 -1
  112. package/dist/sqlite/index.js +11 -3
  113. package/dist/sqlite/internal.d.ts +2 -0
  114. package/dist/sqlite/internal.d.ts.map +1 -0
  115. package/dist/sqlite/internal.js +1 -0
  116. package/dist/sqlite/sqlite.js +0 -1
  117. package/dist/sqlite/sqlite.test.d.ts +2 -0
  118. package/dist/sqlite/sqlite.test.d.ts.map +1 -0
  119. package/dist/sqlite/sqlite.test.js +171 -0
  120. package/dist/sqlite.d.ts +2 -0
  121. package/dist/sqlite.d.ts.map +1 -0
  122. package/dist/sqlite.js +1 -0
  123. package/dist/tsconfig.tsbuildinfo +1 -1
  124. package/dist/worker.js +0 -1
  125. package/dist/worker.test.d.ts +2 -0
  126. package/dist/worker.test.d.ts.map +1 -0
  127. package/dist/worker.test.js +900 -0
  128. package/dist/workflow.js +0 -1
  129. package/dist/workflow.test.d.ts +2 -0
  130. package/dist/workflow.test.d.ts.map +1 -0
  131. package/dist/workflow.test.js +84 -0
  132. package/package.json +19 -5
  133. package/dist/backend-postgres/index.d.ts +0 -44
  134. package/dist/backend-postgres/index.d.ts.map +0 -1
  135. package/dist/backend-postgres/index.js +0 -535
  136. package/dist/backend-postgres/index.js.map +0 -1
  137. package/dist/backend-postgres/postgres.d.ts.map +0 -1
  138. package/dist/backend-postgres/postgres.js.map +0 -1
  139. package/dist/backend-sqlite/index.d.ts.map +0 -1
  140. package/dist/backend-sqlite/index.js.map +0 -1
  141. package/dist/backend-sqlite/sqlite.d.ts.map +0 -1
  142. package/dist/backend-sqlite/sqlite.js.map +0 -1
  143. package/dist/backend.js.map +0 -1
  144. package/dist/bin/openworkflow.js.map +0 -1
  145. package/dist/client.js.map +0 -1
  146. package/dist/config.d.ts +0 -34
  147. package/dist/config.d.ts.map +0 -1
  148. package/dist/config.js +0 -49
  149. package/dist/config.js.map +0 -1
  150. package/dist/core/duration.js.map +0 -1
  151. package/dist/core/error.js.map +0 -1
  152. package/dist/core/json.js.map +0 -1
  153. package/dist/core/result.js.map +0 -1
  154. package/dist/core/retry.js.map +0 -1
  155. package/dist/core/schema.js.map +0 -1
  156. package/dist/core/step.js.map +0 -1
  157. package/dist/core/workflow.js.map +0 -1
  158. package/dist/execution.js.map +0 -1
  159. package/dist/index.js.map +0 -1
  160. package/dist/internal.js.map +0 -1
  161. package/dist/pg/backend.d.ts.map +0 -1
  162. package/dist/pg/backend.js.map +0 -1
  163. package/dist/pg/index.d.ts +0 -3
  164. package/dist/pg/index.d.ts.map +0 -1
  165. package/dist/pg/index.js +0 -3
  166. package/dist/pg/index.js.map +0 -1
  167. package/dist/pg/postgres.d.ts +0 -42
  168. package/dist/pg/postgres.d.ts.map +0 -1
  169. package/dist/pg/postgres.js +0 -234
  170. package/dist/pg/postgres.js.map +0 -1
  171. package/dist/pg/scripts/db-migrate.d.ts.map +0 -1
  172. package/dist/pg/scripts/db-migrate.js.map +0 -1
  173. package/dist/pg/scripts/db-reset.d.ts.map +0 -1
  174. package/dist/pg/scripts/db-reset.js.map +0 -1
  175. package/dist/pg/scripts/squawk.js.map +0 -1
  176. package/dist/pg/vitest.global-setup.d.ts.map +0 -1
  177. package/dist/pg/vitest.global-setup.js.map +0 -1
  178. package/dist/registry.js.map +0 -1
  179. package/dist/sqlite/backend.js.map +0 -1
  180. package/dist/sqlite/index.js.map +0 -1
  181. package/dist/sqlite/sqlite.js.map +0 -1
  182. package/dist/testing/backend.testsuite.d.ts.map +0 -1
  183. package/dist/testing/backend.testsuite.js.map +0 -1
  184. package/dist/testing/index.d.ts +0 -2
  185. package/dist/testing/index.d.ts.map +0 -1
  186. package/dist/testing/index.js.map +0 -1
  187. package/dist/worker.js.map +0 -1
  188. package/dist/workflow.js.map +0 -1
  189. /package/dist/{backend-postgres → postgres}/postgres.d.ts +0 -0
  190. /package/dist/{pg → postgres}/scripts/db-migrate.d.ts +0 -0
  191. /package/dist/{pg → postgres}/scripts/db-reset.d.ts +0 -0
  192. /package/dist/{pg → postgres}/scripts/squawk.d.ts +0 -0
  193. /package/dist/{pg → postgres}/vitest.global-setup.d.ts +0 -0
@@ -0,0 +1,171 @@
1
+ import { migrate, migrations, newDatabase } from "./sqlite.js";
2
+ import { randomUUID } from "node:crypto";
3
+ import { existsSync, unlinkSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import path from "node:path";
6
+ import { afterEach, beforeEach, describe, expect, test } from "vitest";
7
+ // Helper to get the current migration version (exported for testing)
8
+ // Note: This function exists in sqlite.ts but isn't exported, so we'll
9
+ // test it indirectly through migrate() and by checking the migrations table
10
+ function getMigrationVersion(db) {
11
+ const existsStmt = db.prepare(`
12
+ SELECT COUNT(*) as count
13
+ FROM sqlite_master
14
+ WHERE type = 'table' AND name = 'openworkflow_migrations'
15
+ `);
16
+ const existsResult = existsStmt.get();
17
+ if (!existsResult || existsResult.count === 0)
18
+ return -1;
19
+ const versionStmt = db.prepare(`SELECT MAX("version") AS "version" FROM "openworkflow_migrations";`);
20
+ const versionResult = versionStmt.get();
21
+ return versionResult?.version ?? -1;
22
+ }
23
+ describe("sqlite", () => {
24
+ let db;
25
+ let dbPath;
26
+ beforeEach(() => {
27
+ // Use a unique file path for each test to ensure isolation
28
+ dbPath = path.join(tmpdir(), `test_${randomUUID()}.db`);
29
+ db = newDatabase(dbPath);
30
+ });
31
+ afterEach(() => {
32
+ db.close();
33
+ const walPath = `${dbPath}-wal`;
34
+ const shmPath = `${dbPath}-shm`;
35
+ // clean up the test database, WAL, and SHM files if they exist
36
+ if (existsSync(dbPath)) {
37
+ unlinkSync(dbPath);
38
+ }
39
+ if (existsSync(walPath)) {
40
+ unlinkSync(walPath);
41
+ }
42
+ if (existsSync(shmPath)) {
43
+ unlinkSync(shmPath);
44
+ }
45
+ });
46
+ describe("migrations()", () => {
47
+ test("returns migration SQL statements with correct table names", () => {
48
+ const migs = migrations();
49
+ expect(migs.length).toBeGreaterThan(0);
50
+ // Check that migrations reference the openworkflow_migrations table
51
+ for (const mig of migs) {
52
+ expect(mig).toContain("openworkflow_migrations");
53
+ }
54
+ // Verify first migration creates the migrations table
55
+ expect(migs[0]).toContain('CREATE TABLE IF NOT EXISTS "openworkflow_migrations"');
56
+ expect(migs[0]).toContain('"version"');
57
+ });
58
+ test("migrations create workflow_runs and step_attempts tables", () => {
59
+ const migs = migrations();
60
+ // Migration 1 should create workflow_runs and step_attempts
61
+ const migration1 = migs[1];
62
+ expect(migration1).toContain('CREATE TABLE IF NOT EXISTS "workflow_runs"');
63
+ expect(migration1).toContain('CREATE TABLE IF NOT EXISTS "step_attempts"');
64
+ });
65
+ });
66
+ describe("migrate()", () => {
67
+ test("runs database migrations idempotently", () => {
68
+ // First migration
69
+ migrate(db);
70
+ const version1 = getMigrationVersion(db);
71
+ expect(version1).toBeGreaterThanOrEqual(0);
72
+ // Second migration - should not cause errors
73
+ migrate(db);
74
+ const version2 = getMigrationVersion(db);
75
+ expect(version2).toBe(version1); // Version should not change
76
+ // Third migration - should still work
77
+ migrate(db);
78
+ const version3 = getMigrationVersion(db);
79
+ expect(version3).toBe(version1);
80
+ });
81
+ test("tracks migration versions correctly", () => {
82
+ // Before migration, version should be -1 (table doesn't exist)
83
+ let version = getMigrationVersion(db);
84
+ expect(version).toBe(-1);
85
+ // After migration, version should be the latest migration version
86
+ migrate(db);
87
+ version = getMigrationVersion(db);
88
+ const allMigrations = migrations();
89
+ const expectedLatestVersion = allMigrations.length - 1;
90
+ expect(version).toBe(expectedLatestVersion);
91
+ });
92
+ test("applies migrations incrementally", () => {
93
+ // Create the migrations table manually with version 0
94
+ db.exec(`
95
+ CREATE TABLE IF NOT EXISTS "openworkflow_migrations" (
96
+ "version" INTEGER NOT NULL PRIMARY KEY
97
+ );
98
+ INSERT OR IGNORE INTO "openworkflow_migrations" ("version")
99
+ VALUES (0);
100
+ `);
101
+ let version = getMigrationVersion(db);
102
+ expect(version).toBe(0);
103
+ // Run migrate - should apply remaining migrations
104
+ migrate(db);
105
+ version = getMigrationVersion(db);
106
+ const allMigrations = migrations();
107
+ const expectedLatestVersion = allMigrations.length - 1;
108
+ expect(version).toBe(expectedLatestVersion);
109
+ });
110
+ test("creates all required tables after migration", () => {
111
+ migrate(db);
112
+ // Check that migrations table exists
113
+ const migrationsCheck = db
114
+ .prepare(`
115
+ SELECT COUNT(*) as count
116
+ FROM sqlite_master
117
+ WHERE type = 'table' AND name = 'openworkflow_migrations'
118
+ `)
119
+ .get();
120
+ expect(migrationsCheck.count).toBe(1);
121
+ // Check that workflow_runs table exists
122
+ const workflowRunsCheck = db
123
+ .prepare(`
124
+ SELECT COUNT(*) as count
125
+ FROM sqlite_master
126
+ WHERE type = 'table' AND name = 'workflow_runs'
127
+ `)
128
+ .get();
129
+ expect(workflowRunsCheck.count).toBe(1);
130
+ // Check that step_attempts table exists
131
+ const stepAttemptsCheck = db
132
+ .prepare(`
133
+ SELECT COUNT(*) as count
134
+ FROM sqlite_master
135
+ WHERE type = 'table' AND name = 'step_attempts'
136
+ `)
137
+ .get();
138
+ expect(stepAttemptsCheck.count).toBe(1);
139
+ });
140
+ });
141
+ describe("migration version tracking", () => {
142
+ test("migrations table stores version numbers correctly", () => {
143
+ migrate(db);
144
+ const versionStmt = db.prepare(`SELECT "version" FROM "openworkflow_migrations" ORDER BY "version";`);
145
+ const versions = versionStmt.all();
146
+ // Should have all migration versions from 0 to latest
147
+ const allMigrations = migrations();
148
+ const expectedLatestVersion = allMigrations.length - 1;
149
+ expect(versions.length).toBe(expectedLatestVersion + 1);
150
+ for (let i = 0; i <= expectedLatestVersion; i++) {
151
+ const version = versions[i];
152
+ expect(version).toBeDefined();
153
+ expect(version?.version).toBe(i);
154
+ }
155
+ });
156
+ test("migrations can be run multiple times safely with INSERT OR IGNORE", () => {
157
+ migrate(db);
158
+ const versionAfterFirst = getMigrationVersion(db);
159
+ // Run migrations again
160
+ migrate(db);
161
+ const versionAfterSecond = getMigrationVersion(db);
162
+ expect(versionAfterSecond).toBe(versionAfterFirst);
163
+ // Check that version entries aren't duplicated
164
+ const versionStmt = db.prepare(`SELECT COUNT(*) as count FROM "openworkflow_migrations";`);
165
+ const countResult = versionStmt.get();
166
+ const allMigrations = migrations();
167
+ const expectedCount = allMigrations.length;
168
+ expect(countResult.count).toBe(expectedCount);
169
+ });
170
+ });
171
+ });
@@ -0,0 +1,2 @@
1
+ export { BackendSqlite } from "./sqlite/backend.js";
2
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/sqlite.js ADDED
@@ -0,0 +1 @@
1
+ export { BackendSqlite } from "./sqlite/backend.js";