@contractspec/example.workflow-system 1.57.0 → 1.59.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 (209) hide show
  1. package/dist/approval/approval.enum.d.ts +2 -7
  2. package/dist/approval/approval.enum.d.ts.map +1 -1
  3. package/dist/approval/approval.enum.js +20 -26
  4. package/dist/approval/approval.event.d.ts +108 -114
  5. package/dist/approval/approval.event.d.ts.map +1 -1
  6. package/dist/approval/approval.event.js +103 -210
  7. package/dist/approval/approval.handler.d.ts +17 -18
  8. package/dist/approval/approval.handler.d.ts.map +1 -1
  9. package/dist/approval/approval.operations.d.ts +429 -435
  10. package/dist/approval/approval.operations.d.ts.map +1 -1
  11. package/dist/approval/approval.operations.js +364 -339
  12. package/dist/approval/approval.schema.d.ts +86 -91
  13. package/dist/approval/approval.schema.d.ts.map +1 -1
  14. package/dist/approval/approval.schema.js +71 -107
  15. package/dist/approval/index.d.ts +8 -5
  16. package/dist/approval/index.d.ts.map +1 -0
  17. package/dist/approval/index.js +484 -5
  18. package/dist/browser/approval/approval.enum.js +22 -0
  19. package/dist/browser/approval/approval.event.js +112 -0
  20. package/dist/browser/approval/approval.operations.js +369 -0
  21. package/dist/browser/approval/approval.schema.js +73 -0
  22. package/dist/browser/approval/index.js +484 -0
  23. package/dist/browser/docs/index.js +103 -0
  24. package/dist/browser/docs/workflow-system.docblock.js +103 -0
  25. package/dist/browser/entities/approval.js +119 -0
  26. package/dist/browser/entities/index.js +508 -0
  27. package/dist/browser/entities/instance.js +161 -0
  28. package/dist/browser/entities/step.js +124 -0
  29. package/dist/browser/entities/workflow.js +82 -0
  30. package/dist/browser/example.js +42 -0
  31. package/dist/browser/handlers/index.js +253 -0
  32. package/dist/browser/handlers/workflow.handlers.js +253 -0
  33. package/dist/browser/index.js +3120 -0
  34. package/dist/browser/instance/index.js +677 -0
  35. package/dist/browser/instance/instance.enum.js +15 -0
  36. package/dist/browser/instance/instance.event.js +164 -0
  37. package/dist/browser/instance/instance.handler.js +356 -0
  38. package/dist/browser/instance/instance.operations.js +9 -0
  39. package/dist/browser/instance/instance.schema.js +101 -0
  40. package/dist/browser/presentations/index.js +109 -0
  41. package/dist/browser/seeders/index.js +3 -0
  42. package/dist/browser/shared/index.js +3 -0
  43. package/dist/browser/shared/mock-data.js +11 -0
  44. package/dist/browser/shared/types.js +0 -0
  45. package/dist/browser/state-machine/index.js +6 -0
  46. package/dist/browser/tests/operations.test-spec.js +6 -0
  47. package/dist/browser/ui/WorkflowDashboard.js +3 -0
  48. package/dist/browser/ui/hooks/index.js +50 -0
  49. package/dist/browser/ui/hooks/useWorkflowList.js +50 -0
  50. package/dist/browser/ui/index.js +54 -0
  51. package/dist/browser/ui/renderers/index.js +227 -0
  52. package/dist/browser/ui/renderers/workflow.markdown.js +227 -0
  53. package/dist/browser/workflow/index.js +21 -0
  54. package/dist/browser/workflow/workflow.enum.js +36 -0
  55. package/dist/browser/workflow/workflow.event.js +6 -0
  56. package/dist/browser/workflow/workflow.handler.js +5 -0
  57. package/dist/browser/workflow/workflow.operations.js +8 -0
  58. package/dist/browser/workflow/workflow.schema.js +151 -0
  59. package/dist/browser/workflow-system.capability.js +5 -0
  60. package/dist/browser/workflow-system.feature.js +3 -0
  61. package/dist/docs/index.d.ts +2 -1
  62. package/dist/docs/index.d.ts.map +1 -0
  63. package/dist/docs/index.js +104 -1
  64. package/dist/docs/workflow-system.docblock.d.ts +2 -1
  65. package/dist/docs/workflow-system.docblock.d.ts.map +1 -0
  66. package/dist/docs/workflow-system.docblock.js +45 -56
  67. package/dist/entities/approval.d.ts +35 -40
  68. package/dist/entities/approval.d.ts.map +1 -1
  69. package/dist/entities/approval.js +116 -124
  70. package/dist/entities/index.d.ts +132 -137
  71. package/dist/entities/index.d.ts.map +1 -1
  72. package/dist/entities/index.js +506 -29
  73. package/dist/entities/instance.d.ts +46 -51
  74. package/dist/entities/instance.d.ts.map +1 -1
  75. package/dist/entities/instance.js +158 -164
  76. package/dist/entities/step.d.ts +31 -36
  77. package/dist/entities/step.d.ts.map +1 -1
  78. package/dist/entities/step.js +122 -132
  79. package/dist/entities/workflow.d.ts +22 -27
  80. package/dist/entities/workflow.d.ts.map +1 -1
  81. package/dist/entities/workflow.js +80 -99
  82. package/dist/example.d.ts +2 -6
  83. package/dist/example.d.ts.map +1 -1
  84. package/dist/example.js +41 -55
  85. package/dist/handlers/index.d.ts +2 -2
  86. package/dist/handlers/index.d.ts.map +1 -0
  87. package/dist/handlers/index.js +254 -3
  88. package/dist/handlers/workflow.handlers.d.ts +107 -106
  89. package/dist/handlers/workflow.handlers.d.ts.map +1 -1
  90. package/dist/handlers/workflow.handlers.js +237 -246
  91. package/dist/index.d.ts +15 -26
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +3121 -26
  94. package/dist/instance/index.d.ts +8 -5
  95. package/dist/instance/index.d.ts.map +1 -0
  96. package/dist/instance/index.js +677 -5
  97. package/dist/instance/instance.enum.d.ts +1 -6
  98. package/dist/instance/instance.enum.d.ts.map +1 -1
  99. package/dist/instance/instance.enum.js +14 -18
  100. package/dist/instance/instance.event.d.ts +313 -319
  101. package/dist/instance/instance.event.d.ts.map +1 -1
  102. package/dist/instance/instance.event.js +151 -279
  103. package/dist/instance/instance.handler.d.ts +21 -22
  104. package/dist/instance/instance.handler.d.ts.map +1 -1
  105. package/dist/instance/instance.handler.js +352 -89
  106. package/dist/instance/instance.operations.d.ts +819 -825
  107. package/dist/instance/instance.operations.d.ts.map +1 -1
  108. package/dist/instance/instance.operations.js +10 -464
  109. package/dist/instance/instance.schema.d.ts +196 -201
  110. package/dist/instance/instance.schema.d.ts.map +1 -1
  111. package/dist/instance/instance.schema.js +97 -167
  112. package/dist/presentations/index.d.ts +23 -28
  113. package/dist/presentations/index.d.ts.map +1 -1
  114. package/dist/presentations/index.js +104 -334
  115. package/dist/seeders/index.d.ts +4 -8
  116. package/dist/seeders/index.d.ts.map +1 -1
  117. package/dist/seeders/index.js +4 -19
  118. package/dist/shared/index.d.ts +6 -3
  119. package/dist/shared/index.d.ts.map +1 -0
  120. package/dist/shared/index.js +4 -3
  121. package/dist/shared/mock-data.d.ts +16 -16
  122. package/dist/shared/mock-data.d.ts.map +1 -1
  123. package/dist/shared/mock-data.js +11 -11
  124. package/dist/shared/types.d.ts +69 -72
  125. package/dist/shared/types.d.ts.map +1 -1
  126. package/dist/shared/types.js +1 -0
  127. package/dist/state-machine/index.d.ts +92 -95
  128. package/dist/state-machine/index.d.ts.map +1 -1
  129. package/dist/state-machine/index.js +6 -157
  130. package/dist/tests/operations.test-spec.d.ts +4 -9
  131. package/dist/tests/operations.test-spec.d.ts.map +1 -1
  132. package/dist/tests/operations.test-spec.js +7 -123
  133. package/dist/ui/WorkflowDashboard.d.ts +1 -6
  134. package/dist/ui/WorkflowDashboard.d.ts.map +1 -1
  135. package/dist/ui/WorkflowDashboard.js +3 -222
  136. package/dist/ui/hooks/index.d.ts +2 -2
  137. package/dist/ui/hooks/index.d.ts.map +1 -0
  138. package/dist/ui/hooks/index.js +51 -5
  139. package/dist/ui/hooks/useWorkflowList.d.ts +15 -19
  140. package/dist/ui/hooks/useWorkflowList.d.ts.map +1 -1
  141. package/dist/ui/hooks/useWorkflowList.js +47 -51
  142. package/dist/ui/index.d.ts +7 -6
  143. package/dist/ui/index.d.ts.map +1 -0
  144. package/dist/ui/index.js +55 -6
  145. package/dist/ui/renderers/index.d.ts +2 -2
  146. package/dist/ui/renderers/index.d.ts.map +1 -0
  147. package/dist/ui/renderers/index.js +227 -2
  148. package/dist/ui/renderers/workflow.markdown.d.ts +13 -14
  149. package/dist/ui/renderers/workflow.markdown.d.ts.map +1 -1
  150. package/dist/ui/renderers/workflow.markdown.js +223 -229
  151. package/dist/workflow/index.d.ts +8 -5
  152. package/dist/workflow/index.d.ts.map +1 -0
  153. package/dist/workflow/index.js +22 -6
  154. package/dist/workflow/workflow.enum.d.ts +4 -9
  155. package/dist/workflow/workflow.enum.d.ts.map +1 -1
  156. package/dist/workflow/workflow.enum.js +32 -42
  157. package/dist/workflow/workflow.event.d.ts +112 -118
  158. package/dist/workflow/workflow.event.d.ts.map +1 -1
  159. package/dist/workflow/workflow.event.js +7 -150
  160. package/dist/workflow/workflow.handler.d.ts +23 -24
  161. package/dist/workflow/workflow.handler.d.ts.map +1 -1
  162. package/dist/workflow/workflow.handler.js +6 -66
  163. package/dist/workflow/workflow.operations.d.ts +847 -853
  164. package/dist/workflow/workflow.operations.d.ts.map +1 -1
  165. package/dist/workflow/workflow.operations.js +9 -345
  166. package/dist/workflow/workflow.schema.d.ts +229 -234
  167. package/dist/workflow/workflow.schema.d.ts.map +1 -1
  168. package/dist/workflow/workflow.schema.js +146 -243
  169. package/dist/workflow-system.capability.d.ts +3 -8
  170. package/dist/workflow-system.capability.d.ts.map +1 -1
  171. package/dist/workflow-system.capability.js +6 -34
  172. package/dist/workflow-system.feature.d.ts +1 -6
  173. package/dist/workflow-system.feature.d.ts.map +1 -1
  174. package/dist/workflow-system.feature.js +4 -346
  175. package/package.json +415 -93
  176. package/dist/approval/approval.enum.js.map +0 -1
  177. package/dist/approval/approval.event.js.map +0 -1
  178. package/dist/approval/approval.handler.js +0 -72
  179. package/dist/approval/approval.handler.js.map +0 -1
  180. package/dist/approval/approval.operations.js.map +0 -1
  181. package/dist/approval/approval.schema.js.map +0 -1
  182. package/dist/docs/workflow-system.docblock.js.map +0 -1
  183. package/dist/entities/approval.js.map +0 -1
  184. package/dist/entities/index.js.map +0 -1
  185. package/dist/entities/instance.js.map +0 -1
  186. package/dist/entities/step.js.map +0 -1
  187. package/dist/entities/workflow.js.map +0 -1
  188. package/dist/example.js.map +0 -1
  189. package/dist/handlers/workflow.handlers.js.map +0 -1
  190. package/dist/instance/instance.enum.js.map +0 -1
  191. package/dist/instance/instance.event.js.map +0 -1
  192. package/dist/instance/instance.handler.js.map +0 -1
  193. package/dist/instance/instance.operations.js.map +0 -1
  194. package/dist/instance/instance.schema.js.map +0 -1
  195. package/dist/presentations/index.js.map +0 -1
  196. package/dist/seeders/index.js.map +0 -1
  197. package/dist/shared/mock-data.js.map +0 -1
  198. package/dist/state-machine/index.js.map +0 -1
  199. package/dist/tests/operations.test-spec.js.map +0 -1
  200. package/dist/ui/WorkflowDashboard.js.map +0 -1
  201. package/dist/ui/hooks/useWorkflowList.js.map +0 -1
  202. package/dist/ui/renderers/workflow.markdown.js.map +0 -1
  203. package/dist/workflow/workflow.enum.js.map +0 -1
  204. package/dist/workflow/workflow.event.js.map +0 -1
  205. package/dist/workflow/workflow.handler.js.map +0 -1
  206. package/dist/workflow/workflow.operations.js.map +0 -1
  207. package/dist/workflow/workflow.schema.js.map +0 -1
  208. package/dist/workflow-system.capability.js.map +0 -1
  209. package/dist/workflow-system.feature.js.map +0 -1
@@ -1,263 +1,254 @@
1
+ // @bun
2
+ // src/handlers/workflow.handlers.ts
1
3
  import { web } from "@contractspec/lib.runtime-sandbox";
2
-
3
- //#region src/handlers/workflow.handlers.ts
4
- const { generateId } = web;
4
+ var { generateId } = web;
5
5
  function rowToDefinition(row) {
6
- return {
7
- id: row.id,
8
- projectId: row.projectId,
9
- organizationId: row.organizationId,
10
- name: row.name,
11
- description: row.description ?? void 0,
12
- type: row.type,
13
- status: row.status,
14
- createdAt: new Date(row.createdAt),
15
- updatedAt: new Date(row.updatedAt)
16
- };
6
+ return {
7
+ id: row.id,
8
+ projectId: row.projectId,
9
+ organizationId: row.organizationId,
10
+ name: row.name,
11
+ description: row.description ?? undefined,
12
+ type: row.type,
13
+ status: row.status,
14
+ createdAt: new Date(row.createdAt),
15
+ updatedAt: new Date(row.updatedAt)
16
+ };
17
17
  }
18
18
  function rowToStep(row) {
19
- return {
20
- id: row.id,
21
- definitionId: row.definitionId,
22
- name: row.name,
23
- description: row.description ?? void 0,
24
- stepOrder: row.stepOrder,
25
- type: row.type,
26
- requiredRoles: row.requiredRoles ? JSON.parse(row.requiredRoles) : [],
27
- autoApproveCondition: row.autoApproveCondition ?? void 0,
28
- timeoutHours: row.timeoutHours ?? void 0,
29
- createdAt: new Date(row.createdAt)
30
- };
19
+ return {
20
+ id: row.id,
21
+ definitionId: row.definitionId,
22
+ name: row.name,
23
+ description: row.description ?? undefined,
24
+ stepOrder: row.stepOrder,
25
+ type: row.type,
26
+ requiredRoles: row.requiredRoles ? JSON.parse(row.requiredRoles) : [],
27
+ autoApproveCondition: row.autoApproveCondition ?? undefined,
28
+ timeoutHours: row.timeoutHours ?? undefined,
29
+ createdAt: new Date(row.createdAt)
30
+ };
31
31
  }
32
32
  function rowToInstance(row) {
33
- return {
34
- id: row.id,
35
- projectId: row.projectId,
36
- definitionId: row.definitionId,
37
- status: row.status,
38
- currentStepId: row.currentStepId ?? void 0,
39
- data: row.data ? JSON.parse(row.data) : void 0,
40
- requestedBy: row.requestedBy,
41
- startedAt: new Date(row.startedAt),
42
- completedAt: row.completedAt ? new Date(row.completedAt) : void 0
43
- };
33
+ return {
34
+ id: row.id,
35
+ projectId: row.projectId,
36
+ definitionId: row.definitionId,
37
+ status: row.status,
38
+ currentStepId: row.currentStepId ?? undefined,
39
+ data: row.data ? JSON.parse(row.data) : undefined,
40
+ requestedBy: row.requestedBy,
41
+ startedAt: new Date(row.startedAt),
42
+ completedAt: row.completedAt ? new Date(row.completedAt) : undefined
43
+ };
44
44
  }
45
45
  function rowToApproval(row) {
46
- return {
47
- id: row.id,
48
- instanceId: row.instanceId,
49
- stepId: row.stepId,
50
- status: row.status,
51
- actorId: row.actorId ?? void 0,
52
- comment: row.comment ?? void 0,
53
- decidedAt: row.decidedAt ? new Date(row.decidedAt) : void 0,
54
- createdAt: new Date(row.createdAt)
55
- };
46
+ return {
47
+ id: row.id,
48
+ instanceId: row.instanceId,
49
+ stepId: row.stepId,
50
+ status: row.status,
51
+ actorId: row.actorId ?? undefined,
52
+ comment: row.comment ?? undefined,
53
+ decidedAt: row.decidedAt ? new Date(row.decidedAt) : undefined,
54
+ createdAt: new Date(row.createdAt)
55
+ };
56
56
  }
57
57
  function createWorkflowHandlers(db) {
58
- /**
59
- * List workflow definitions
60
- */
61
- async function listDefinitions(input) {
62
- const { projectId, status, search, limit = 20, offset = 0 } = input;
63
- let whereClause = "WHERE projectId = ?";
64
- const params = [projectId];
65
- if (status && status !== "all") {
66
- whereClause += " AND status = ?";
67
- params.push(status);
68
- }
69
- if (search) {
70
- whereClause += " AND name LIKE ?";
71
- params.push(`%${search}%`);
72
- }
73
- const total = (await db.query(`SELECT COUNT(*) as count FROM workflow_definition ${whereClause}`, params)).rows[0]?.count ?? 0;
74
- return {
75
- definitions: (await db.query(`SELECT * FROM workflow_definition ${whereClause} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`, [
76
- ...params,
77
- limit,
78
- offset
79
- ])).rows.map(rowToDefinition),
80
- total
81
- };
82
- }
83
- /**
84
- * Create a workflow definition
85
- */
86
- async function createDefinition(input, context) {
87
- const id = generateId("wfdef");
88
- const now = (/* @__PURE__ */ new Date()).toISOString();
89
- await db.execute(`INSERT INTO workflow_definition (id, projectId, organizationId, name, description, type, status, createdAt, updatedAt)
58
+ async function listDefinitions(input) {
59
+ const { projectId, status, search, limit = 20, offset = 0 } = input;
60
+ let whereClause = "WHERE projectId = ?";
61
+ const params = [projectId];
62
+ if (status && status !== "all") {
63
+ whereClause += " AND status = ?";
64
+ params.push(status);
65
+ }
66
+ if (search) {
67
+ whereClause += " AND name LIKE ?";
68
+ params.push(`%${search}%`);
69
+ }
70
+ const countResult = (await db.query(`SELECT COUNT(*) as count FROM workflow_definition ${whereClause}`, params)).rows;
71
+ const total = countResult[0]?.count ?? 0;
72
+ const rows = (await db.query(`SELECT * FROM workflow_definition ${whereClause} ORDER BY updatedAt DESC LIMIT ? OFFSET ?`, [...params, limit, offset])).rows;
73
+ return {
74
+ definitions: rows.map(rowToDefinition),
75
+ total
76
+ };
77
+ }
78
+ async function createDefinition(input, context) {
79
+ const id = generateId("wfdef");
80
+ const now = new Date().toISOString();
81
+ await db.execute(`INSERT INTO workflow_definition (id, projectId, organizationId, name, description, type, status, createdAt, updatedAt)
90
82
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
91
- id,
92
- context.projectId,
93
- context.organizationId,
94
- input.name,
95
- input.description ?? null,
96
- input.type ?? "APPROVAL",
97
- "DRAFT",
98
- now,
99
- now
100
- ]);
101
- const rows = (await db.query(`SELECT * FROM workflow_definition WHERE id = ?`, [id])).rows;
102
- return rowToDefinition(rows[0]);
103
- }
104
- /**
105
- * Add a step to a workflow definition
106
- */
107
- async function addStep(input) {
108
- const id = generateId("wfstep");
109
- const now = (/* @__PURE__ */ new Date()).toISOString();
110
- const nextOrder = ((await db.query(`SELECT MAX(stepOrder) as maxOrder FROM workflow_step WHERE definitionId = ?`, [input.definitionId])).rows[0]?.maxOrder ?? 0) + 1;
111
- await db.execute(`INSERT INTO workflow_step (id, definitionId, name, description, stepOrder, type, requiredRoles, autoApproveCondition, timeoutHours, createdAt)
83
+ id,
84
+ context.projectId,
85
+ context.organizationId,
86
+ input.name,
87
+ input.description ?? null,
88
+ input.type ?? "APPROVAL",
89
+ "DRAFT",
90
+ now,
91
+ now
92
+ ]);
93
+ const rows = (await db.query(`SELECT * FROM workflow_definition WHERE id = ?`, [id])).rows;
94
+ return rowToDefinition(rows[0]);
95
+ }
96
+ async function addStep(input) {
97
+ const id = generateId("wfstep");
98
+ const now = new Date().toISOString();
99
+ const maxOrderResult = (await db.query(`SELECT MAX(stepOrder) as maxOrder FROM workflow_step WHERE definitionId = ?`, [input.definitionId])).rows;
100
+ const nextOrder = (maxOrderResult[0]?.maxOrder ?? 0) + 1;
101
+ await db.execute(`INSERT INTO workflow_step (id, definitionId, name, description, stepOrder, type, requiredRoles, autoApproveCondition, timeoutHours, createdAt)
112
102
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
113
- id,
114
- input.definitionId,
115
- input.name,
116
- input.description ?? null,
117
- nextOrder,
118
- input.type ?? "APPROVAL",
119
- JSON.stringify(input.requiredRoles),
120
- input.autoApproveCondition ?? null,
121
- input.timeoutHours ?? null,
122
- now
123
- ]);
124
- const rows = (await db.query(`SELECT * FROM workflow_step WHERE id = ?`, [id])).rows;
125
- return rowToStep(rows[0]);
126
- }
127
- /**
128
- * Get steps for a workflow definition
129
- */
130
- async function getSteps(definitionId) {
131
- return (await db.query(`SELECT * FROM workflow_step WHERE definitionId = ? ORDER BY stepOrder`, [definitionId])).rows.map(rowToStep);
132
- }
133
- /**
134
- * List workflow instances
135
- */
136
- async function listInstances(input) {
137
- const { projectId, definitionId, status, requestedBy, limit = 20, offset = 0 } = input;
138
- let whereClause = "WHERE projectId = ?";
139
- const params = [projectId];
140
- if (definitionId) {
141
- whereClause += " AND definitionId = ?";
142
- params.push(definitionId);
143
- }
144
- if (status && status !== "all") {
145
- whereClause += " AND status = ?";
146
- params.push(status);
147
- }
148
- if (requestedBy) {
149
- whereClause += " AND requestedBy = ?";
150
- params.push(requestedBy);
151
- }
152
- const total = (await db.query(`SELECT COUNT(*) as count FROM workflow_instance ${whereClause}`, params)).rows[0]?.count ?? 0;
153
- return {
154
- instances: (await db.query(`SELECT * FROM workflow_instance ${whereClause} ORDER BY startedAt DESC LIMIT ? OFFSET ?`, [
155
- ...params,
156
- limit,
157
- offset
158
- ])).rows.map(rowToInstance),
159
- total
160
- };
161
- }
162
- /**
163
- * Start a workflow instance
164
- */
165
- async function startInstance(input, context) {
166
- const id = generateId("wfinst");
167
- const now = (/* @__PURE__ */ new Date()).toISOString();
168
- const firstStepId = (await db.query(`SELECT * FROM workflow_step WHERE definitionId = ? ORDER BY stepOrder LIMIT 1`, [input.definitionId])).rows[0]?.id ?? null;
169
- await db.execute(`INSERT INTO workflow_instance (id, projectId, definitionId, status, currentStepId, data, requestedBy, startedAt)
103
+ id,
104
+ input.definitionId,
105
+ input.name,
106
+ input.description ?? null,
107
+ nextOrder,
108
+ input.type ?? "APPROVAL",
109
+ JSON.stringify(input.requiredRoles),
110
+ input.autoApproveCondition ?? null,
111
+ input.timeoutHours ?? null,
112
+ now
113
+ ]);
114
+ const rows = (await db.query(`SELECT * FROM workflow_step WHERE id = ?`, [id])).rows;
115
+ return rowToStep(rows[0]);
116
+ }
117
+ async function getSteps(definitionId) {
118
+ const rows = (await db.query(`SELECT * FROM workflow_step WHERE definitionId = ? ORDER BY stepOrder`, [definitionId])).rows;
119
+ return rows.map(rowToStep);
120
+ }
121
+ async function listInstances(input) {
122
+ const {
123
+ projectId,
124
+ definitionId,
125
+ status,
126
+ requestedBy,
127
+ limit = 20,
128
+ offset = 0
129
+ } = input;
130
+ let whereClause = "WHERE projectId = ?";
131
+ const params = [projectId];
132
+ if (definitionId) {
133
+ whereClause += " AND definitionId = ?";
134
+ params.push(definitionId);
135
+ }
136
+ if (status && status !== "all") {
137
+ whereClause += " AND status = ?";
138
+ params.push(status);
139
+ }
140
+ if (requestedBy) {
141
+ whereClause += " AND requestedBy = ?";
142
+ params.push(requestedBy);
143
+ }
144
+ const countResult = (await db.query(`SELECT COUNT(*) as count FROM workflow_instance ${whereClause}`, params)).rows;
145
+ const total = countResult[0]?.count ?? 0;
146
+ const rows = (await db.query(`SELECT * FROM workflow_instance ${whereClause} ORDER BY startedAt DESC LIMIT ? OFFSET ?`, [...params, limit, offset])).rows;
147
+ return {
148
+ instances: rows.map(rowToInstance),
149
+ total
150
+ };
151
+ }
152
+ async function startInstance(input, context) {
153
+ const id = generateId("wfinst");
154
+ const now = new Date().toISOString();
155
+ const steps = (await db.query(`SELECT * FROM workflow_step WHERE definitionId = ? ORDER BY stepOrder LIMIT 1`, [input.definitionId])).rows;
156
+ const firstStepId = steps[0]?.id ?? null;
157
+ await db.execute(`INSERT INTO workflow_instance (id, projectId, definitionId, status, currentStepId, data, requestedBy, startedAt)
170
158
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
171
- id,
172
- context.projectId,
173
- input.definitionId,
174
- firstStepId ? "IN_PROGRESS" : "PENDING",
175
- firstStepId,
176
- input.data ? JSON.stringify(input.data) : null,
177
- context.requestedBy,
178
- now
179
- ]);
180
- if (firstStepId) await db.execute(`INSERT INTO workflow_approval (id, instanceId, stepId, status, createdAt)
181
- VALUES (?, ?, ?, ?, ?)`, [
182
- generateId("wfappr"),
183
- id,
184
- firstStepId,
185
- "PENDING",
186
- now
187
- ]);
188
- const rows = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [id])).rows;
189
- return rowToInstance(rows[0]);
190
- }
191
- /**
192
- * Approve current step
193
- */
194
- async function approveStep(input, context) {
195
- const now = (/* @__PURE__ */ new Date()).toISOString();
196
- const instances = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId])).rows;
197
- if (!instances[0]) throw new Error("NOT_FOUND");
198
- const instance = instances[0];
199
- await db.execute(`UPDATE workflow_approval SET status = 'APPROVED', actorId = ?, comment = ?, decidedAt = ?
159
+ id,
160
+ context.projectId,
161
+ input.definitionId,
162
+ firstStepId ? "IN_PROGRESS" : "PENDING",
163
+ firstStepId,
164
+ input.data ? JSON.stringify(input.data) : null,
165
+ context.requestedBy,
166
+ now
167
+ ]);
168
+ if (firstStepId) {
169
+ await db.execute(`INSERT INTO workflow_approval (id, instanceId, stepId, status, createdAt)
170
+ VALUES (?, ?, ?, ?, ?)`, [generateId("wfappr"), id, firstStepId, "PENDING", now]);
171
+ }
172
+ const rows = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [id])).rows;
173
+ return rowToInstance(rows[0]);
174
+ }
175
+ async function approveStep(input, context) {
176
+ const now = new Date().toISOString();
177
+ const instances = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [
178
+ input.instanceId
179
+ ])).rows;
180
+ if (!instances[0]) {
181
+ throw new Error("NOT_FOUND");
182
+ }
183
+ const instance = instances[0];
184
+ await db.execute(`UPDATE workflow_approval SET status = 'APPROVED', actorId = ?, comment = ?, decidedAt = ?
200
185
  WHERE instanceId = ? AND stepId = ? AND status = 'PENDING'`, [
201
- context.actorId,
202
- input.comment ?? null,
203
- now,
204
- input.instanceId,
205
- instance.currentStepId
206
- ]);
207
- const currentStep = (await db.query(`SELECT * FROM workflow_step WHERE id = ?`, [instance.currentStepId])).rows;
208
- const nextSteps = (await db.query(`SELECT * FROM workflow_step WHERE definitionId = ? AND stepOrder > ? ORDER BY stepOrder LIMIT 1`, [instance.definitionId, currentStep[0]?.stepOrder ?? 0])).rows;
209
- if (nextSteps[0]) {
210
- await db.execute(`UPDATE workflow_instance SET currentStepId = ? WHERE id = ?`, [nextSteps[0].id, input.instanceId]);
211
- await db.execute(`INSERT INTO workflow_approval (id, instanceId, stepId, status, createdAt)
186
+ context.actorId,
187
+ input.comment ?? null,
188
+ now,
189
+ input.instanceId,
190
+ instance.currentStepId
191
+ ]);
192
+ const currentStep = (await db.query(`SELECT * FROM workflow_step WHERE id = ?`, [
193
+ instance.currentStepId
194
+ ])).rows;
195
+ const nextSteps = (await db.query(`SELECT * FROM workflow_step WHERE definitionId = ? AND stepOrder > ? ORDER BY stepOrder LIMIT 1`, [instance.definitionId, currentStep[0]?.stepOrder ?? 0])).rows;
196
+ if (nextSteps[0]) {
197
+ await db.execute(`UPDATE workflow_instance SET currentStepId = ? WHERE id = ?`, [nextSteps[0].id, input.instanceId]);
198
+ await db.execute(`INSERT INTO workflow_approval (id, instanceId, stepId, status, createdAt)
212
199
  VALUES (?, ?, ?, ?, ?)`, [
213
- generateId("wfappr"),
214
- input.instanceId,
215
- nextSteps[0].id,
216
- "PENDING",
217
- now
218
- ]);
219
- } else await db.execute(`UPDATE workflow_instance SET status = 'COMPLETED', currentStepId = NULL, completedAt = ? WHERE id = ?`, [now, input.instanceId]);
220
- const updated = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId])).rows;
221
- return rowToInstance(updated[0]);
222
- }
223
- /**
224
- * Reject current step
225
- */
226
- async function rejectStep(input, context) {
227
- const now = (/* @__PURE__ */ new Date()).toISOString();
228
- const instances = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId])).rows;
229
- if (!instances[0]) throw new Error("NOT_FOUND");
230
- await db.execute(`UPDATE workflow_approval SET status = 'REJECTED', actorId = ?, comment = ?, decidedAt = ?
200
+ generateId("wfappr"),
201
+ input.instanceId,
202
+ nextSteps[0].id,
203
+ "PENDING",
204
+ now
205
+ ]);
206
+ } else {
207
+ await db.execute(`UPDATE workflow_instance SET status = 'COMPLETED', currentStepId = NULL, completedAt = ? WHERE id = ?`, [now, input.instanceId]);
208
+ }
209
+ const updated = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [
210
+ input.instanceId
211
+ ])).rows;
212
+ return rowToInstance(updated[0]);
213
+ }
214
+ async function rejectStep(input, context) {
215
+ const now = new Date().toISOString();
216
+ const instances = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [
217
+ input.instanceId
218
+ ])).rows;
219
+ if (!instances[0]) {
220
+ throw new Error("NOT_FOUND");
221
+ }
222
+ await db.execute(`UPDATE workflow_approval SET status = 'REJECTED', actorId = ?, comment = ?, decidedAt = ?
231
223
  WHERE instanceId = ? AND stepId = ? AND status = 'PENDING'`, [
232
- context.actorId,
233
- input.reason,
234
- now,
235
- input.instanceId,
236
- instances[0].currentStepId
237
- ]);
238
- await db.execute(`UPDATE workflow_instance SET status = 'REJECTED', completedAt = ? WHERE id = ?`, [now, input.instanceId]);
239
- const updated = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [input.instanceId])).rows;
240
- return rowToInstance(updated[0]);
241
- }
242
- /**
243
- * Get approvals for an instance
244
- */
245
- async function getApprovals(instanceId) {
246
- return (await db.query(`SELECT * FROM workflow_approval WHERE instanceId = ? ORDER BY createdAt`, [instanceId])).rows.map(rowToApproval);
247
- }
248
- return {
249
- listDefinitions,
250
- createDefinition,
251
- addStep,
252
- getSteps,
253
- listInstances,
254
- startInstance,
255
- approveStep,
256
- rejectStep,
257
- getApprovals
258
- };
224
+ context.actorId,
225
+ input.reason,
226
+ now,
227
+ input.instanceId,
228
+ instances[0].currentStepId
229
+ ]);
230
+ await db.execute(`UPDATE workflow_instance SET status = 'REJECTED', completedAt = ? WHERE id = ?`, [now, input.instanceId]);
231
+ const updated = (await db.query(`SELECT * FROM workflow_instance WHERE id = ?`, [
232
+ input.instanceId
233
+ ])).rows;
234
+ return rowToInstance(updated[0]);
235
+ }
236
+ async function getApprovals(instanceId) {
237
+ const rows = (await db.query(`SELECT * FROM workflow_approval WHERE instanceId = ? ORDER BY createdAt`, [instanceId])).rows;
238
+ return rows.map(rowToApproval);
239
+ }
240
+ return {
241
+ listDefinitions,
242
+ createDefinition,
243
+ addStep,
244
+ getSteps,
245
+ listInstances,
246
+ startInstance,
247
+ approveStep,
248
+ rejectStep,
249
+ getApprovals
250
+ };
259
251
  }
260
-
261
- //#endregion
262
- export { createWorkflowHandlers };
263
- //# sourceMappingURL=workflow.handlers.js.map
252
+ export {
253
+ createWorkflowHandlers
254
+ };
package/dist/index.d.ts CHANGED
@@ -1,26 +1,15 @@
1
- import { ApprovalDecisionEnum, ApprovalStatusEnum } from "./approval/approval.enum.js";
2
- import { ApprovalDecidedEvent, ApprovalDelegatedEvent, ApprovalEscalatedEvent, ApprovalRequestedEvent } from "./approval/approval.event.js";
3
- import { ApprovalRequestRecord, HandlerContext, WorkflowDefinitionRecord, WorkflowInstanceRecord, WorkflowStepRecord } from "./shared/types.js";
4
- import { AddApprovalCommentContract, DelegateApprovalContract, GetApprovalContract, ListMyApprovalsContract, SubmitDecisionContract } from "./approval/approval.operations.js";
5
- import { ApprovalCommentModel, ApprovalRequestModel } from "./approval/approval.schema.js";
6
- import "./approval/index.js";
7
- import { AddWorkflowStepInput, ApproveStepInput, CreateWorkflowDefinitionInput, ListWorkflowDefinitionsInput, ListWorkflowDefinitionsOutput, ListWorkflowInstancesInput, ListWorkflowInstancesOutput, RejectStepInput, StartWorkflowInput, WorkflowApproval, WorkflowDefinition, WorkflowHandlers, WorkflowInstance, WorkflowStep, createWorkflowHandlers } from "./handlers/workflow.handlers.js";
8
- import { ApprovalModeEnum, StepTypeEnum, TriggerTypeEnum, WorkflowStatusEnum } from "./workflow/workflow.enum.js";
9
- import { AddStepInputModel, CreateWorkflowInputModel, UpdateWorkflowInputModel, WorkflowDefinitionModel, WorkflowStepModel } from "./workflow/workflow.schema.js";
10
- import { AddStepContract, CreateWorkflowContract, GetWorkflowContract, ListWorkflowsContract, PublishWorkflowContract, UpdateWorkflowContract } from "./workflow/workflow.operations.js";
11
- import { StepAddedEvent, WorkflowCreatedEvent, WorkflowPublishedEvent, WorkflowUpdatedEvent } from "./workflow/workflow.event.js";
12
- import "./workflow/index.js";
13
- import { InstanceStatusEnum } from "./instance/instance.enum.js";
14
- import { StartWorkflowInputModel, TransitionInputModel, TransitionResultModel, WorkflowInstanceModel } from "./instance/instance.schema.js";
15
- import { CancelWorkflowContract, GetInstanceContract, ListInstancesContract, PauseWorkflowContract, ResumeWorkflowContract, StartWorkflowContract, TransitionWorkflowContract } from "./instance/instance.operations.js";
16
- import { InstanceCancelledEvent, InstanceCompletedEvent, InstanceFailedEvent, InstancePausedEvent, InstanceResumedEvent, InstanceStartedEvent, InstanceTimedOutEvent, StepEnteredEvent, StepExitedEvent } from "./instance/instance.event.js";
17
- import "./instance/index.js";
18
- import { mockDataStore } from "./shared/mock-data.js";
19
- import { BasicStateMachineEngine, IStateMachineEngine, StateMachineDefinition, StateMachineState, StateMachineStep, TransitionContext, TransitionDefinition, TransitionResult, buildStateMachineDefinition, createInitialState, createStateMachineEngine } from "./state-machine/index.js";
20
- import { ApprovalDetailPresentation, ApprovalFormPresentation, ApprovalInboxPresentation, InstanceDetailPresentation, InstanceListPresentation, PendingApprovalsBadgePresentation, ProgressTrackerPresentation, WorkflowDesignerPresentation, WorkflowDetailPresentation, WorkflowListPresentation, WorkflowMetricsPresentation, WorkflowSystemPresentations } from "./presentations/index.js";
21
- import { WorkflowSystemFeature } from "./workflow-system.feature.js";
22
- import { workflowDashboardMarkdownRenderer, workflowDefinitionListMarkdownRenderer, workflowInstanceDetailMarkdownRenderer } from "./ui/renderers/workflow.markdown.js";
23
- import { WorkflowDashboard } from "./ui/WorkflowDashboard.js";
24
- import { WorkflowStats, useWorkflowList } from "./ui/hooks/useWorkflowList.js";
25
- import "./ui/index.js";
26
- export { AddApprovalCommentContract, AddStepContract, AddStepInputModel, AddWorkflowStepInput, ApprovalCommentModel, ApprovalDecidedEvent, ApprovalDecisionEnum, ApprovalDelegatedEvent, ApprovalDetailPresentation, ApprovalEscalatedEvent, ApprovalFormPresentation, ApprovalInboxPresentation, ApprovalModeEnum, ApprovalRequestModel, ApprovalRequestRecord, ApprovalRequestedEvent, ApprovalStatusEnum, ApproveStepInput, BasicStateMachineEngine, CancelWorkflowContract, CreateWorkflowContract, CreateWorkflowDefinitionInput, CreateWorkflowInputModel, DelegateApprovalContract, GetApprovalContract, GetInstanceContract, GetWorkflowContract, HandlerContext, IStateMachineEngine, InstanceCancelledEvent, InstanceCompletedEvent, InstanceDetailPresentation, InstanceFailedEvent, InstanceListPresentation, InstancePausedEvent, InstanceResumedEvent, InstanceStartedEvent, InstanceStatusEnum, InstanceTimedOutEvent, ListInstancesContract, ListMyApprovalsContract, ListWorkflowDefinitionsInput, ListWorkflowDefinitionsOutput, ListWorkflowInstancesInput, ListWorkflowInstancesOutput, ListWorkflowsContract, PauseWorkflowContract, PendingApprovalsBadgePresentation, ProgressTrackerPresentation, PublishWorkflowContract, RejectStepInput, ResumeWorkflowContract, StartWorkflowContract, StartWorkflowInput, StartWorkflowInputModel, StateMachineDefinition, StateMachineState, StateMachineStep, StepAddedEvent, StepEnteredEvent, StepExitedEvent, StepTypeEnum, SubmitDecisionContract, TransitionContext, TransitionDefinition, TransitionInputModel, TransitionResult, TransitionResultModel, TransitionWorkflowContract, TriggerTypeEnum, UpdateWorkflowContract, UpdateWorkflowInputModel, WorkflowApproval, WorkflowCreatedEvent, WorkflowDashboard, WorkflowDefinition, WorkflowDefinitionModel, WorkflowDefinitionRecord, WorkflowDesignerPresentation, WorkflowDetailPresentation, WorkflowHandlers, WorkflowInstance, WorkflowInstanceModel, WorkflowInstanceRecord, WorkflowListPresentation, WorkflowMetricsPresentation, WorkflowPublishedEvent, WorkflowStats, WorkflowStatusEnum, WorkflowStep, WorkflowStepModel, WorkflowStepRecord, WorkflowSystemFeature, WorkflowSystemPresentations, WorkflowUpdatedEvent, buildStateMachineDefinition, createInitialState, createStateMachineEngine, createWorkflowHandlers, mockDataStore, useWorkflowList, workflowDashboardMarkdownRenderer, workflowDefinitionListMarkdownRenderer, workflowInstanceDetailMarkdownRenderer };
1
+ /**
2
+ * Workflow System Example
3
+ *
4
+ * Demonstrates a complete workflow/approval system with state machine engine.
5
+ */
6
+ export * from './workflow';
7
+ export * from './instance';
8
+ export * from './approval';
9
+ export * from './shared';
10
+ export * from './handlers/workflow.handlers';
11
+ export * from './state-machine';
12
+ export * from './presentations';
13
+ export * from './workflow-system.feature';
14
+ export * from './ui';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAG3B,cAAc,UAAU,CAAC;AACzB,cAAc,8BAA8B,CAAC;AAI7C,cAAc,iBAAiB,CAAC;AAEhC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,MAAM,CAAC"}