@critical-path/core 0.35.0 → 0.36.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 (187) hide show
  1. package/README.md +11 -0
  2. package/dist/engine/index.d.ts +2 -0
  3. package/dist/engine/index.d.ts.map +1 -1
  4. package/dist/engine/index.js +25 -2
  5. package/dist/engine/index.js.map +1 -1
  6. package/dist/types/index.d.ts +11 -0
  7. package/dist/types/index.d.ts.map +1 -1
  8. package/package.json +5 -1
  9. package/CHANGELOG.md +0 -584
  10. package/dist/deliverables.test.d.ts +0 -2
  11. package/dist/deliverables.test.d.ts.map +0 -1
  12. package/dist/deliverables.test.js +0 -232
  13. package/dist/deliverables.test.js.map +0 -1
  14. package/dist/domain/calendar.test.d.ts +0 -2
  15. package/dist/domain/calendar.test.d.ts.map +0 -1
  16. package/dist/domain/calendar.test.js +0 -181
  17. package/dist/domain/calendar.test.js.map +0 -1
  18. package/dist/domain/cpm.test.d.ts +0 -2
  19. package/dist/domain/cpm.test.d.ts.map +0 -1
  20. package/dist/domain/cpm.test.js +0 -166
  21. package/dist/domain/cpm.test.js.map +0 -1
  22. package/dist/domain/ddd.test.d.ts +0 -2
  23. package/dist/domain/ddd.test.d.ts.map +0 -1
  24. package/dist/domain/ddd.test.js +0 -349
  25. package/dist/domain/ddd.test.js.map +0 -1
  26. package/dist/domain/ladder.test.d.ts +0 -2
  27. package/dist/domain/ladder.test.d.ts.map +0 -1
  28. package/dist/domain/ladder.test.js +0 -213
  29. package/dist/domain/ladder.test.js.map +0 -1
  30. package/dist/domain/metrics.test.d.ts +0 -2
  31. package/dist/domain/metrics.test.d.ts.map +0 -1
  32. package/dist/domain/metrics.test.js +0 -252
  33. package/dist/domain/metrics.test.js.map +0 -1
  34. package/dist/domain/task-duration.test.d.ts +0 -2
  35. package/dist/domain/task-duration.test.d.ts.map +0 -1
  36. package/dist/domain/task-duration.test.js +0 -307
  37. package/dist/domain/task-duration.test.js.map +0 -1
  38. package/dist/domain/workload.test.d.ts +0 -2
  39. package/dist/domain/workload.test.d.ts.map +0 -1
  40. package/dist/domain/workload.test.js +0 -261
  41. package/dist/domain/workload.test.js.map +0 -1
  42. package/dist/engine/actor.test.d.ts +0 -2
  43. package/dist/engine/actor.test.d.ts.map +0 -1
  44. package/dist/engine/actor.test.js +0 -54
  45. package/dist/engine/actor.test.js.map +0 -1
  46. package/dist/engine/authorization.test.d.ts +0 -2
  47. package/dist/engine/authorization.test.d.ts.map +0 -1
  48. package/dist/engine/authorization.test.js +0 -154
  49. package/dist/engine/authorization.test.js.map +0 -1
  50. package/dist/engine/cascade.test.d.ts +0 -2
  51. package/dist/engine/cascade.test.d.ts.map +0 -1
  52. package/dist/engine/cascade.test.js +0 -99
  53. package/dist/engine/cascade.test.js.map +0 -1
  54. package/dist/engine/config.test.d.ts +0 -2
  55. package/dist/engine/config.test.d.ts.map +0 -1
  56. package/dist/engine/config.test.js +0 -46
  57. package/dist/engine/config.test.js.map +0 -1
  58. package/dist/engine/entity-events.test.d.ts +0 -2
  59. package/dist/engine/entity-events.test.d.ts.map +0 -1
  60. package/dist/engine/entity-events.test.js +0 -61
  61. package/dist/engine/entity-events.test.js.map +0 -1
  62. package/dist/index.test.d.ts +0 -2
  63. package/dist/index.test.d.ts.map +0 -1
  64. package/dist/index.test.js +0 -429
  65. package/dist/index.test.js.map +0 -1
  66. package/dist/plugins/plugins.test.d.ts +0 -2
  67. package/dist/plugins/plugins.test.d.ts.map +0 -1
  68. package/dist/plugins/plugins.test.js +0 -137
  69. package/dist/plugins/plugins.test.js.map +0 -1
  70. package/dist/schemas/schemas.test.d.ts +0 -2
  71. package/dist/schemas/schemas.test.d.ts.map +0 -1
  72. package/dist/schemas/schemas.test.js +0 -58
  73. package/dist/schemas/schemas.test.js.map +0 -1
  74. package/dist/status.test.d.ts +0 -2
  75. package/dist/status.test.d.ts.map +0 -1
  76. package/dist/status.test.js +0 -295
  77. package/dist/status.test.js.map +0 -1
  78. package/dist/storage/storage.test.d.ts +0 -2
  79. package/dist/storage/storage.test.d.ts.map +0 -1
  80. package/dist/storage/storage.test.js +0 -236
  81. package/dist/storage/storage.test.js.map +0 -1
  82. package/dist/store/conformance.test.d.ts +0 -2
  83. package/dist/store/conformance.test.d.ts.map +0 -1
  84. package/dist/store/conformance.test.js +0 -15
  85. package/dist/store/conformance.test.js.map +0 -1
  86. package/dist/store/firebase.test.d.ts +0 -2
  87. package/dist/store/firebase.test.d.ts.map +0 -1
  88. package/dist/store/firebase.test.js +0 -103
  89. package/dist/store/firebase.test.js.map +0 -1
  90. package/dist/store/query.test.d.ts +0 -2
  91. package/dist/store/query.test.d.ts.map +0 -1
  92. package/dist/store/query.test.js +0 -89
  93. package/dist/store/query.test.js.map +0 -1
  94. package/dist/store/sqlite.test.d.ts +0 -2
  95. package/dist/store/sqlite.test.d.ts.map +0 -1
  96. package/dist/store/sqlite.test.js +0 -177
  97. package/dist/store/sqlite.test.js.map +0 -1
  98. package/dist/task-state.test.d.ts +0 -2
  99. package/dist/task-state.test.d.ts.map +0 -1
  100. package/dist/task-state.test.js +0 -423
  101. package/dist/task-state.test.js.map +0 -1
  102. package/dist/use-case-validation.test.d.ts +0 -2
  103. package/dist/use-case-validation.test.d.ts.map +0 -1
  104. package/dist/use-case-validation.test.js +0 -281
  105. package/dist/use-case-validation.test.js.map +0 -1
  106. package/dist/utils/fractional-index.test.d.ts +0 -2
  107. package/dist/utils/fractional-index.test.d.ts.map +0 -1
  108. package/dist/utils/fractional-index.test.js +0 -182
  109. package/dist/utils/fractional-index.test.js.map +0 -1
  110. package/dist/utils/key.test.d.ts +0 -2
  111. package/dist/utils/key.test.d.ts.map +0 -1
  112. package/dist/utils/key.test.js +0 -65
  113. package/dist/utils/key.test.js.map +0 -1
  114. package/dist/utils/mentions.test.d.ts +0 -2
  115. package/dist/utils/mentions.test.d.ts.map +0 -1
  116. package/dist/utils/mentions.test.js +0 -114
  117. package/dist/utils/mentions.test.js.map +0 -1
  118. package/dist/webhooks/webhooks.test.d.ts +0 -2
  119. package/dist/webhooks/webhooks.test.d.ts.map +0 -1
  120. package/dist/webhooks/webhooks.test.js +0 -154
  121. package/dist/webhooks/webhooks.test.js.map +0 -1
  122. package/src/deliverables.test.ts +0 -284
  123. package/src/domain/authorization.ts +0 -82
  124. package/src/domain/calendar.test.ts +0 -216
  125. package/src/domain/calendar.ts +0 -502
  126. package/src/domain/cpm.test.ts +0 -189
  127. package/src/domain/cpm.ts +0 -258
  128. package/src/domain/custom-fields.ts +0 -172
  129. package/src/domain/ddd.test.ts +0 -442
  130. package/src/domain/entities.ts +0 -798
  131. package/src/domain/errors.ts +0 -38
  132. package/src/domain/events.ts +0 -369
  133. package/src/domain/graph.ts +0 -70
  134. package/src/domain/index.ts +0 -12
  135. package/src/domain/ladder.test.ts +0 -251
  136. package/src/domain/ladder.ts +0 -474
  137. package/src/domain/metrics.test.ts +0 -288
  138. package/src/domain/metrics.ts +0 -497
  139. package/src/domain/task-duration.test.ts +0 -354
  140. package/src/domain/workload.test.ts +0 -311
  141. package/src/domain/workload.ts +0 -457
  142. package/src/engine/actor.test.ts +0 -63
  143. package/src/engine/authorization.test.ts +0 -199
  144. package/src/engine/cascade.test.ts +0 -121
  145. package/src/engine/config.test.ts +0 -51
  146. package/src/engine/entity-events.test.ts +0 -67
  147. package/src/engine/index.ts +0 -2472
  148. package/src/index.test.ts +0 -514
  149. package/src/index.ts +0 -9
  150. package/src/plugins/index.ts +0 -103
  151. package/src/plugins/plugins.test.ts +0 -161
  152. package/src/schemas/index.ts +0 -402
  153. package/src/schemas/schemas.test.ts +0 -116
  154. package/src/status.test.ts +0 -354
  155. package/src/storage/file-storage.ts +0 -200
  156. package/src/storage/firebase-storage.ts +0 -209
  157. package/src/storage/index.ts +0 -3
  158. package/src/storage/s3.ts +0 -151
  159. package/src/storage/storage.test.ts +0 -274
  160. package/src/store/conformance.test.ts +0 -15
  161. package/src/store/firebase.test.ts +0 -131
  162. package/src/store/firebase.ts +0 -658
  163. package/src/store/index.ts +0 -623
  164. package/src/store/query.test.ts +0 -110
  165. package/src/store/query.ts +0 -113
  166. package/src/store/sqlite.test.ts +0 -218
  167. package/src/store/sqlite.ts +0 -1480
  168. package/src/task-state.test.ts +0 -506
  169. package/src/testing/conformance.ts +0 -319
  170. package/src/testing/index.ts +0 -1
  171. package/src/types/index.ts +0 -859
  172. package/src/use-case-validation.test.ts +0 -324
  173. package/src/utils/fractional-index.test.ts +0 -228
  174. package/src/utils/fractional-index.ts +0 -254
  175. package/src/utils/index.ts +0 -7
  176. package/src/utils/key.test.ts +0 -76
  177. package/src/utils/key.ts +0 -62
  178. package/src/utils/mentions.test.ts +0 -132
  179. package/src/utils/mentions.ts +0 -131
  180. package/src/utils/status.ts +0 -419
  181. package/src/utils/workflow.ts +0 -306
  182. package/src/webhooks/dispatcher.ts +0 -190
  183. package/src/webhooks/index.ts +0 -2
  184. package/src/webhooks/signature.ts +0 -57
  185. package/src/webhooks/webhooks.test.ts +0 -201
  186. package/tsconfig.json +0 -8
  187. package/tsconfig.tsbuildinfo +0 -1
@@ -1,281 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { CriticalPathEngine, DEFAULT_SOFTWARE_WORKFLOW, DEFAULT_VFX_WORKFLOW } from './index.js';
3
- describe('Critical Path Use Case Validation Suite', () => {
4
- describe('Use Case 1: Software Development (Product Planning & Issue Tracking)', () => {
5
- it('supports full software development lifecycle with epics, sprints, dependencies, custom fields, and workflow transitions', async () => {
6
- const engine = new CriticalPathEngine();
7
- // 1. Create Workflow & Project
8
- const softwareProject = await engine.createProject({
9
- key: 'DEV',
10
- name: 'Mobile App Project',
11
- description: 'Software development project for mobile client',
12
- workflow: DEFAULT_SOFTWARE_WORKFLOW,
13
- customFieldDefinitions: [
14
- { id: 'cf_story_points', key: 'storyPoints', label: 'Story Points', type: 'number' },
15
- { id: 'cf_severity', key: 'severity', label: 'Severity', type: 'single_select', options: ['low', 'medium', 'high', 'critical'] }
16
- ]
17
- });
18
- expect(softwareProject.id).toBeDefined();
19
- // 2. Setup Team and Sprint Iteration
20
- const devTeam = await engine.createTeam({
21
- name: 'Frontend Core Team',
22
- memberIds: ['dev_alice', 'dev_bob', 'lead_charlie']
23
- });
24
- const sprint = await engine.createIteration({
25
- projectId: softwareProject.id,
26
- name: 'Sprint 24',
27
- type: 'sprint',
28
- startDate: '2026-09-01T00:00:00.000Z',
29
- endDate: '2026-09-14T00:00:00.000Z',
30
- status: 'active'
31
- });
32
- // 3. Epics / Task Containers
33
- const authEpic = await engine.createContainer({
34
- projectId: softwareProject.id,
35
- name: 'OAuth2 & Biometric Auth Epic',
36
- type: 'epic'
37
- });
38
- // 4. Tasks & Subtasks
39
- // Feature task under Auth Epic
40
- const featureTask = await engine.createTask({
41
- projectId: softwareProject.id,
42
- title: 'Implement FaceID & TouchID Login',
43
- description: 'Add biometric authentication flow to iOS and Android builds',
44
- status: 'backlog',
45
- priority: 'high',
46
- taskType: 'feature',
47
- reporterId: 'lead_charlie',
48
- reviewerId: 'lead_charlie',
49
- teamId: devTeam.id,
50
- containerId: authEpic.id,
51
- iterationId: sprint.id,
52
- estimatedHours: 16,
53
- customFields: {
54
- storyPoints: 5,
55
- severity: 'high'
56
- }
57
- });
58
- // Bug task blocking the feature release
59
- const bugTask = await engine.createTask({
60
- projectId: softwareProject.id,
61
- title: 'Fix OAuth Token Expiry Edge Case',
62
- description: 'Token refresh fails when app is backgrounded over 24 hours',
63
- status: 'todo',
64
- priority: 'urgent',
65
- taskType: 'bug',
66
- assigneeId: 'dev_alice',
67
- reporterId: 'dev_bob',
68
- reviewerId: 'lead_charlie',
69
- iterationId: sprint.id,
70
- estimatedHours: 4,
71
- customFields: {
72
- storyPoints: 2,
73
- severity: 'critical'
74
- }
75
- });
76
- // Subtask under Feature Task
77
- const subTask = await engine.createTask({
78
- projectId: softwareProject.id,
79
- title: 'iOS LocalAuthentication Bridge',
80
- status: 'todo',
81
- priority: 'high',
82
- taskType: 'subtask',
83
- assigneeId: 'dev_bob',
84
- parentId: featureTask.id,
85
- estimatedHours: 8
86
- });
87
- expect(subTask.parentId).toBe(featureTask.id);
88
- // 5. Blocker Dependency: FeatureTask depends on BugTask being resolved first
89
- await engine.store.addDependency({
90
- taskId: featureTask.id,
91
- dependsOnTaskId: bugTask.id,
92
- type: 'blocking'
93
- });
94
- const bugGraph = await engine.getTaskDependencyGraph(bugTask.id);
95
- expect(bugGraph.downstreamTasks.map((t) => t.id)).toContain(featureTask.id);
96
- // 6. Execution & Workflow Transitions
97
- // Move Feature from Backlog -> Todo -> In Progress
98
- await engine.updateTask(featureTask.id, { status: 'todo' });
99
- await engine.updateTask(featureTask.id, {
100
- status: 'in_progress',
101
- assigneeId: 'dev_alice',
102
- actualStartDate: '2026-09-02T09:00:00.000Z'
103
- });
104
- // Log progress and hours
105
- const updatedFeature = await engine.updateTask(featureTask.id, {
106
- loggedHours: 10,
107
- progress: 60
108
- });
109
- expect(updatedFeature?.loggedHours).toBe(10);
110
- expect(updatedFeature?.progress).toBe(60);
111
- // Transition In Progress -> In Review
112
- const reviewTask = await engine.updateTask(featureTask.id, { status: 'in_review' });
113
- expect(reviewTask?.status).toBe('in_review');
114
- // Invalid Transition Check: Try to transition back from Done to Backlog directly (not allowed by workflow)
115
- const doneTask = await engine.updateTask(featureTask.id, { status: 'done', actualEndDate: '2026-09-05T17:00:00.000Z' });
116
- expect(doneTask?.status).toBe('done');
117
- await expect(engine.updateTask(featureTask.id, { status: 'backlog' })).rejects.toThrow();
118
- // Check Lifecycle State
119
- const lifecycle = await engine.getTaskLifecycleState(featureTask.id);
120
- expect(lifecycle?.isDone).toBe(true);
121
- expect(lifecycle?.semanticStatus).toBe('completed');
122
- });
123
- });
124
- describe('Use Case 2: Visual Effects (VFX) Production', () => {
125
- it('supports VFX shot deliverable hierarchies, drafting/bidding, artist/vendor assignment, and multi-stage review workflows', async () => {
126
- const engine = new CriticalPathEngine();
127
- // 1. Setup VFX Project with DEFAULT_VFX_WORKFLOW
128
- const vfxProject = await engine.createProject({
129
- key: 'FX_MOP',
130
- name: 'Feature Film - Movie Project',
131
- description: 'VFX shot production for sequence SEQ_101',
132
- workflow: DEFAULT_VFX_WORKFLOW,
133
- customFieldDefinitions: [
134
- { id: 'cf_bid_days', key: 'bidDays', label: 'Bid Days', type: 'number' },
135
- { id: 'cf_bid_amount', key: 'bidAmountUSD', label: 'Bid Amount ($)', type: 'number' },
136
- { id: 'cf_frame_count', key: 'frameCount', label: 'Frame Count', type: 'number' },
137
- { id: 'cf_resolution', key: 'resolution', label: 'Resolution', type: 'single_select', options: ['2K', '4K', '8K'] },
138
- { id: 'cf_vfx_version', key: 'vfxVersion', label: 'VFX Version', type: 'text' },
139
- { id: 'cf_review_url', key: 'reviewMediaUrl', label: 'Review Media URL', type: 'text' }
140
- ]
141
- });
142
- // 2. Outsource Vendor & Internal Department Teams
143
- const vendorTeam = await engine.createTeam({
144
- name: 'Outsource Vendor Studio X',
145
- description: '3D Simulation & FX Vendor Studio',
146
- memberIds: ['vendor_lead_mark', 'vendor_artist_joe']
147
- });
148
- const internalLeadTeam = await engine.createTeam({
149
- name: 'Internal VFX Supervisors',
150
- memberIds: ['vfx_sup_sarah', 'comp_lead_dave']
151
- });
152
- expect(vendorTeam.id).toBeDefined();
153
- expect(internalLeadTeam.id).toBeDefined();
154
- // 3. Hierarchy Deliverables: Sequence Container -> Shot Container
155
- const sequenceContainer = await engine.createContainer({
156
- projectId: vfxProject.id,
157
- name: 'SEQ_101 - Desert Canyon Chase',
158
- type: 'sequence'
159
- });
160
- const shotContainer = await engine.createContainer({
161
- projectId: vfxProject.id,
162
- name: 'SHOT_101_010 - Hero Vehicle Explosion',
163
- type: 'shot',
164
- parentId: sequenceContainer.id
165
- });
166
- expect(shotContainer.parentId).toBe(sequenceContainer.id);
167
- // 4. Draft & Bidding Phase
168
- // Create VFX Task for FX Simulation department under SHOT_101_010
169
- const fxBiddingTask = await engine.createTask({
170
- projectId: vfxProject.id,
171
- title: 'FX Simulation - Fire & Vehicle Debris',
172
- description: 'Heavy pyro explosion and fracturing geometry',
173
- status: 'bidding', // Starts in Draft & Bidding
174
- priority: 'high',
175
- taskType: 'vfx_task',
176
- reporterId: 'vfx_sup_sarah',
177
- containerId: shotContainer.id,
178
- teamId: vendorTeam.id,
179
- customFields: {
180
- bidDays: 12.5,
181
- bidAmountUSD: 15000,
182
- frameCount: 180,
183
- resolution: '4K',
184
- vfxVersion: 'v000'
185
- }
186
- });
187
- expect(fxBiddingTask.status).toBe('bidding');
188
- expect(fxBiddingTask.customFields?.bidAmountUSD).toBe(15000);
189
- // Element Subtask
190
- const dustElementTask = await engine.createTask({
191
- projectId: vfxProject.id,
192
- title: 'Secondary Dust Cloud Elements',
193
- status: 'bidding',
194
- priority: 'medium',
195
- taskType: 'subtask',
196
- parentId: fxBiddingTask.id,
197
- customFields: { bidDays: 3 }
198
- });
199
- expect(dustElementTask.parentId).toBe(fxBiddingTask.id);
200
- // 5. Award Bids & Transition to In Production
201
- const awardedTask = await engine.updateTask(fxBiddingTask.id, {
202
- status: 'awarded'
203
- });
204
- expect(awardedTask?.status).toBe('awarded');
205
- // Assign to Vendor Artist and start production
206
- const productionTask = await engine.updateTask(fxBiddingTask.id, {
207
- status: 'in_production',
208
- assigneeId: 'vendor_artist_joe',
209
- reviewerId: 'comp_lead_dave',
210
- customFields: {
211
- ...fxBiddingTask.customFields,
212
- vfxVersion: 'v001'
213
- }
214
- });
215
- expect(productionTask?.status).toBe('in_production');
216
- expect(productionTask?.assigneeId).toBe('vendor_artist_joe');
217
- // 6. Review & Approval Process
218
- // Artist finishes v001 and submits to Internal Review
219
- const internalReviewTask = await engine.updateTask(fxBiddingTask.id, {
220
- status: 'internal_review',
221
- customFields: {
222
- ...productionTask?.customFields,
223
- vfxVersion: 'v001',
224
- reviewMediaUrl: 'https://vfx-pipeline.studio.com/reviews/SHOT_101_010_FX_v001.mov'
225
- }
226
- });
227
- expect(internalReviewTask?.status).toBe('internal_review');
228
- // Internal Lead rejects v001 and requests revisions with notes
229
- await engine.store.addComment({
230
- taskId: fxBiddingTask.id,
231
- authorId: 'comp_lead_dave',
232
- content: 'Fire velocity looks great, but debris needs 20% more scale and air resistance.'
233
- });
234
- const revisionTask = await engine.updateTask(fxBiddingTask.id, {
235
- status: 'revision_requested'
236
- });
237
- expect(revisionTask?.status).toBe('revision_requested');
238
- // Artist addresses revisions -> In Production -> Resubmits v002 to Internal Review
239
- await engine.updateTask(fxBiddingTask.id, {
240
- status: 'in_production',
241
- customFields: {
242
- ...revisionTask?.customFields,
243
- vfxVersion: 'v002'
244
- }
245
- });
246
- const internalReviewPass = await engine.updateTask(fxBiddingTask.id, {
247
- status: 'internal_review',
248
- customFields: {
249
- ...revisionTask?.customFields,
250
- vfxVersion: 'v002',
251
- reviewMediaUrl: 'https://vfx-pipeline.studio.com/reviews/SHOT_101_010_FX_v002.mov'
252
- }
253
- });
254
- expect(internalReviewPass?.status).toBe('internal_review');
255
- // Internal Lead approves and passes shot to Client Review
256
- const clientReviewTask = await engine.updateTask(fxBiddingTask.id, {
257
- status: 'client_review'
258
- });
259
- expect(clientReviewTask?.status).toBe('client_review');
260
- // Director / Client Supervisor approves final shot
261
- await engine.store.addComment({
262
- taskId: fxBiddingTask.id,
263
- authorId: 'vfx_sup_sarah',
264
- content: 'Client Supervisor approved v002 for final comp assembly.'
265
- });
266
- const finalApprovedTask = await engine.updateTask(fxBiddingTask.id, {
267
- status: 'approved',
268
- progress: 100
269
- });
270
- expect(finalApprovedTask?.status).toBe('approved');
271
- expect(finalApprovedTask?.progress).toBe(100);
272
- // Verify task lifecycle status shows completed
273
- const lifecycle = await engine.getTaskLifecycleState(fxBiddingTask.id);
274
- expect(lifecycle?.isDone).toBe(true);
275
- // Verify audit log history recorded all approval steps
276
- const activities = await engine.store.getActivities({ taskId: fxBiddingTask.id });
277
- expect(activities.length).toBeGreaterThanOrEqual(6);
278
- });
279
- });
280
- });
281
- //# sourceMappingURL=use-case-validation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-case-validation.test.js","sourceRoot":"","sources":["../src/use-case-validation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEjG,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,QAAQ,CAAC,sEAAsE,EAAE,GAAG,EAAE;QACpF,EAAE,CAAC,yHAAyH,EAAE,KAAK,IAAI,EAAE;YACvI,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAExC,+BAA+B;YAC/B,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;gBACjD,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,oBAAoB;gBAC1B,WAAW,EAAE,gDAAgD;gBAC7D,QAAQ,EAAE,yBAAyB;gBACnC,sBAAsB,EAAE;oBACtB,EAAE,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACpF,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE;iBACjI;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAEzC,qCAAqC;YACrC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBACtC,IAAI,EAAE,oBAAoB;gBAC1B,SAAS,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC;aACpD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;gBAC1C,SAAS,EAAE,eAAe,CAAC,EAAE;gBAC7B,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,0BAA0B;gBACrC,OAAO,EAAE,0BAA0B;gBACnC,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;gBAC5C,SAAS,EAAE,eAAe,CAAC,EAAE;gBAC7B,IAAI,EAAE,8BAA8B;gBACpC,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YAEH,sBAAsB;YACtB,+BAA+B;YAC/B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBAC1C,SAAS,EAAE,eAAe,CAAC,EAAE;gBAC7B,KAAK,EAAE,kCAAkC;gBACzC,WAAW,EAAE,6DAA6D;gBAC1E,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,cAAc;gBAC1B,UAAU,EAAE,cAAc;gBAC1B,MAAM,EAAE,OAAO,CAAC,EAAE;gBAClB,WAAW,EAAE,QAAQ,CAAC,EAAE;gBACxB,WAAW,EAAE,MAAM,CAAC,EAAE;gBACtB,cAAc,EAAE,EAAE;gBAClB,YAAY,EAAE;oBACZ,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,MAAM;iBACjB;aACF,CAAC,CAAC;YAEH,wCAAwC;YACxC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBACtC,SAAS,EAAE,eAAe,CAAC,EAAE;gBAC7B,KAAK,EAAE,kCAAkC;gBACzC,WAAW,EAAE,4DAA4D;gBACzE,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,WAAW;gBACvB,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,cAAc;gBAC1B,WAAW,EAAE,MAAM,CAAC,EAAE;gBACtB,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE;oBACZ,WAAW,EAAE,CAAC;oBACd,QAAQ,EAAE,UAAU;iBACrB;aACF,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBACtC,SAAS,EAAE,eAAe,CAAC,EAAE;gBAC7B,KAAK,EAAE,gCAAgC;gBACvC,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,WAAW,CAAC,EAAE;gBACxB,cAAc,EAAE,CAAC;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAE9C,6EAA6E;YAC7E,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;gBAC/B,MAAM,EAAE,WAAW,CAAC,EAAE;gBACtB,eAAe,EAAE,OAAO,CAAC,EAAE;gBAC3B,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjE,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAE5E,sCAAsC;YACtC,mDAAmD;YACnD,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE;gBACtC,MAAM,EAAE,aAAa;gBACrB,UAAU,EAAE,WAAW;gBACvB,eAAe,EAAE,0BAA0B;aAC5C,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE;gBAC7D,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YACH,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE1C,sCAAsC;YACtC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE7C,2GAA2G;YAC3G,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,0BAA0B,EAAE,CAAC,CAAC;YACxH,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,MAAM,CACV,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CACzD,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAEpB,wBAAwB;YACxB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;QAC3D,EAAE,CAAC,yHAAyH,EAAE,KAAK,IAAI,EAAE;YACvI,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAExC,iDAAiD;YACjD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;gBAC5C,GAAG,EAAE,QAAQ;gBACb,IAAI,EAAE,8BAA8B;gBACpC,WAAW,EAAE,0CAA0C;gBACvD,QAAQ,EAAE,oBAAoB;gBAC9B,sBAAsB,EAAE;oBACtB,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxE,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACrF,EAAE,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACjF,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;oBACnH,EAAE,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;oBAC/E,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE;iBACxF;aACF,CAAC,CAAC;YAEH,kDAAkD;YAClD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBACzC,IAAI,EAAE,2BAA2B;gBACjC,WAAW,EAAE,kCAAkC;gBAC/C,SAAS,EAAE,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;aACrD,CAAC,CAAC;YAEH,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBAC/C,IAAI,EAAE,0BAA0B;gBAChC,SAAS,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAE1C,kEAAkE;YAClE,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;gBACrD,SAAS,EAAE,UAAU,CAAC,EAAE;gBACxB,IAAI,EAAE,+BAA+B;gBACrC,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;gBACjD,SAAS,EAAE,UAAU,CAAC,EAAE;gBACxB,IAAI,EAAE,uCAAuC;gBAC7C,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,iBAAiB,CAAC,EAAE;aAC/B,CAAC,CAAC;YAEH,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAE1D,2BAA2B;YAC3B,kEAAkE;YAClE,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBAC5C,SAAS,EAAE,UAAU,CAAC,EAAE;gBACxB,KAAK,EAAE,uCAAuC;gBAC9C,WAAW,EAAE,8CAA8C;gBAC3D,MAAM,EAAE,SAAS,EAAE,4BAA4B;gBAC/C,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,UAAU;gBACpB,UAAU,EAAE,eAAe;gBAC3B,WAAW,EAAE,aAAa,CAAC,EAAE;gBAC7B,MAAM,EAAE,UAAU,CAAC,EAAE;gBACrB,YAAY,EAAE;oBACZ,OAAO,EAAE,IAAI;oBACb,YAAY,EAAE,KAAK;oBACnB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,IAAI;oBAChB,UAAU,EAAE,MAAM;iBACnB;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE7D,kBAAkB;YAClB,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBAC9C,SAAS,EAAE,UAAU,CAAC,EAAE;gBACxB,KAAK,EAAE,+BAA+B;gBACtC,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,aAAa,CAAC,EAAE;gBAC1B,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAExD,8CAA8C;YAC9C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE;gBAC5D,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;YACH,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE5C,+CAA+C;YAC/C,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE;gBAC/D,MAAM,EAAE,eAAe;gBACvB,UAAU,EAAE,mBAAmB;gBAC/B,UAAU,EAAE,gBAAgB;gBAC5B,YAAY,EAAE;oBACZ,GAAG,aAAa,CAAC,YAAY;oBAC7B,UAAU,EAAE,MAAM;iBACnB;aACF,CAAC,CAAC;YACH,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACrD,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAE7D,+BAA+B;YAC/B,sDAAsD;YACtD,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE;gBACnE,MAAM,EAAE,iBAAiB;gBACzB,YAAY,EAAE;oBACZ,GAAG,cAAc,EAAE,YAAY;oBAC/B,UAAU,EAAE,MAAM;oBAClB,cAAc,EAAE,kEAAkE;iBACnF;aACF,CAAC,CAAC;YACH,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAE3D,+DAA+D;YAC/D,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC5B,MAAM,EAAE,aAAa,CAAC,EAAE;gBACxB,QAAQ,EAAE,gBAAgB;gBAC1B,OAAO,EAAE,gFAAgF;aAC1F,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE;gBAC7D,MAAM,EAAE,oBAAoB;aAC7B,CAAC,CAAC;YACH,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAExD,mFAAmF;YACnF,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE;gBACxC,MAAM,EAAE,eAAe;gBACvB,YAAY,EAAE;oBACZ,GAAG,YAAY,EAAE,YAAY;oBAC7B,UAAU,EAAE,MAAM;iBACnB;aACF,CAAC,CAAC;YAEH,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE;gBACnE,MAAM,EAAE,iBAAiB;gBACzB,YAAY,EAAE;oBACZ,GAAG,YAAY,EAAE,YAAY;oBAC7B,UAAU,EAAE,MAAM;oBAClB,cAAc,EAAE,kEAAkE;iBACnF;aACF,CAAC,CAAC;YACH,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAE3D,0DAA0D;YAC1D,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE;gBACjE,MAAM,EAAE,eAAe;aACxB,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEvD,mDAAmD;YACnD,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC5B,MAAM,EAAE,aAAa,CAAC,EAAE;gBACxB,QAAQ,EAAE,eAAe;gBACzB,OAAO,EAAE,0DAA0D;aACpE,CAAC,CAAC;YAEH,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE;gBAClE,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,GAAG;aACd,CAAC,CAAC;YACH,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9C,+CAA+C;YAC/C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAErC,uDAAuD;YACvD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;YAClF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=fractional-index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fractional-index.test.d.ts","sourceRoot":"","sources":["../../src/utils/fractional-index.test.ts"],"names":[],"mappings":""}
@@ -1,182 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { encodeInteger, decodeInteger, getInitialKey, generateKeyBetween, generateNKeysBetween, compareOrderIndices } from './fractional-index.js';
3
- describe('fractional-index', () => {
4
- describe('encodeInteger and decodeInteger', () => {
5
- it('encodes and decodes non-negative integers', () => {
6
- const cases = [0, 1, 2, 9, 10, 61, 62, 100, 1000, 3843, 3844];
7
- for (const n of cases) {
8
- const encoded = encodeInteger(n);
9
- expect(decodeInteger(encoded)).toBe(n);
10
- }
11
- });
12
- it('encodes and decodes negative integers', () => {
13
- const cases = [-1, -2, -10, -62, -100, -1000];
14
- for (const n of cases) {
15
- const encoded = encodeInteger(n);
16
- expect(decodeInteger(encoded)).toBe(n);
17
- }
18
- });
19
- it('strictly maintains lexicographical sorting across integers', () => {
20
- const sequence = [-100, -62, -10, -2, -1, 0, 1, 2, 9, 10, 61, 62, 100, 3843, 3844];
21
- const encoded = sequence.map((n) => encodeInteger(n));
22
- for (let i = 0; i < encoded.length - 1; i++) {
23
- expect(encoded[i] < encoded[i + 1]).toBe(true);
24
- expect(compareOrderIndices(encoded[i], encoded[i + 1])).toBeLessThan(0);
25
- }
26
- // Reversing and sorting with compareOrderIndices or standard sort() restores exact order
27
- const reversed = [...encoded].reverse();
28
- expect(reversed.sort(compareOrderIndices)).toEqual(encoded);
29
- expect([...encoded].reverse().sort()).toEqual(encoded);
30
- });
31
- });
32
- describe('getInitialKey', () => {
33
- it('generates spaced initial keys', () => {
34
- const k0 = getInitialKey(0);
35
- const k1 = getInitialKey(1);
36
- const k2 = getInitialKey(2);
37
- expect(k0).toBe('a0');
38
- expect(k1).toBe('a2');
39
- expect(k2).toBe('a4');
40
- expect(k0 < k1).toBe(true);
41
- expect(k1 < k2).toBe(true);
42
- });
43
- });
44
- describe('generateKeyBetween', () => {
45
- it('returns default initial key when both bounds are null/undefined', () => {
46
- expect(generateKeyBetween(null, null)).toBe('a0');
47
- expect(generateKeyBetween(undefined, undefined)).toBe('a0');
48
- expect(generateKeyBetween('', '')).toBe('a0');
49
- });
50
- it('generates a key before an upper bound', () => {
51
- const b0 = 'a0';
52
- const beforeB0 = generateKeyBetween(null, b0);
53
- expect(beforeB0 < b0).toBe(true);
54
- const b1 = 'a1';
55
- const beforeB1 = generateKeyBetween(null, b1);
56
- expect(beforeB1 < b1).toBe(true);
57
- const bFractional = 'a0V';
58
- const beforeFractional = generateKeyBetween(null, bFractional);
59
- expect(beforeFractional < bFractional).toBe(true);
60
- });
61
- it('generates a key after a lower bound', () => {
62
- const a0 = 'a0';
63
- const afterA0 = generateKeyBetween(a0, null);
64
- expect(a0 < afterA0).toBe(true);
65
- const aFractional = 'a0V';
66
- const afterFractional = generateKeyBetween(aFractional, null);
67
- expect(aFractional < afterFractional).toBe(true);
68
- });
69
- it('generates key between spaced integers', () => {
70
- const a = 'a0';
71
- const b = 'a2';
72
- const mid = generateKeyBetween(a, b);
73
- expect(mid).toBe('a1');
74
- expect(a < mid).toBe(true);
75
- expect(mid < b).toBe(true);
76
- });
77
- it('generates fractional key between adjacent integers', () => {
78
- const a = 'a0';
79
- const b = 'a1';
80
- const mid = generateKeyBetween(a, b);
81
- expect(a < mid).toBe(true);
82
- expect(mid < b).toBe(true);
83
- });
84
- it('handles nested fractional insertions without degradation', () => {
85
- let current = 'a0';
86
- const target = 'a1';
87
- // Perform 50 sequential midpoint insertions
88
- for (let i = 0; i < 50; i++) {
89
- const next = generateKeyBetween(current, target);
90
- expect(current < next).toBe(true);
91
- expect(next < target).toBe(true);
92
- current = next;
93
- }
94
- });
95
- it('handles repeated insertions directly after the same lower bound', () => {
96
- const lower = 'a0';
97
- let upper = 'a1';
98
- // Repeatedly drop a card just below the first card
99
- for (let i = 0; i < 50; i++) {
100
- const next = generateKeyBetween(lower, upper);
101
- expect(lower < next).toBe(true);
102
- expect(next < upper).toBe(true);
103
- upper = next;
104
- }
105
- });
106
- it('keeps keys strictly ordered under random insertions', () => {
107
- const keys = ['a0', 'a1'];
108
- let seed = 42;
109
- const random = () => {
110
- seed = (seed * 1103515245 + 12345) % 2147483648;
111
- return seed / 2147483648;
112
- };
113
- for (let i = 0; i < 500; i++) {
114
- const idx = Math.floor(random() * (keys.length + 1));
115
- const next = generateKeyBetween(keys[idx - 1] ?? null, keys[idx] ?? null);
116
- keys.splice(idx, 0, next);
117
- }
118
- for (let i = 1; i < keys.length; i++) {
119
- expect(keys[i - 1] < keys[i]).toBe(true);
120
- }
121
- });
122
- it('throws when the lower bound does not sort before the upper bound', () => {
123
- expect(() => generateKeyBetween('a1', 'a0')).toThrow(RangeError);
124
- expect(() => generateKeyBetween('a0', 'a0')).toThrow(RangeError);
125
- });
126
- });
127
- describe('generateNKeysBetween', () => {
128
- it('returns empty array for count <= 0', () => {
129
- expect(generateNKeysBetween('a0', 'a2', 0)).toEqual([]);
130
- expect(generateNKeysBetween('a0', 'a2', -1)).toEqual([]);
131
- });
132
- it('generates 1 key matching generateKeyBetween', () => {
133
- const keys = generateNKeysBetween('a0', 'a2', 1);
134
- expect(keys.length).toBe(1);
135
- expect(keys[0]).toBe('a1');
136
- });
137
- it('generates N keys in strictly ascending order between a and b', () => {
138
- const count = 5;
139
- const a = 'a0';
140
- const b = 'a1';
141
- const keys = generateNKeysBetween(a, b, count);
142
- expect(keys.length).toBe(count);
143
- // Check strictly greater than a
144
- expect(a < keys[0]).toBe(true);
145
- // Check strictly increasing
146
- for (let i = 0; i < keys.length - 1; i++) {
147
- expect(keys[i] < keys[i + 1]).toBe(true);
148
- }
149
- // Check strictly less than b
150
- expect(keys[count - 1] < b).toBe(true);
151
- });
152
- it('generates N keys at swimlane start (a is null)', () => {
153
- const count = 3;
154
- const b = 'a0';
155
- const keys = generateNKeysBetween(null, b, count);
156
- expect(keys.length).toBe(count);
157
- for (let i = 0; i < keys.length - 1; i++) {
158
- expect(keys[i] < keys[i + 1]).toBe(true);
159
- }
160
- expect(keys[count - 1] < b).toBe(true);
161
- });
162
- it('generates N keys at swimlane end (b is null)', () => {
163
- const count = 4;
164
- const a = 'a5';
165
- const keys = generateNKeysBetween(a, null, count);
166
- expect(keys.length).toBe(count);
167
- expect(a < keys[0]).toBe(true);
168
- for (let i = 0; i < keys.length - 1; i++) {
169
- expect(keys[i] < keys[i + 1]).toBe(true);
170
- }
171
- });
172
- it('generates N keys in empty swimlane (both null)', () => {
173
- const count = 6;
174
- const keys = generateNKeysBetween(null, null, count);
175
- expect(keys.length).toBe(count);
176
- for (let i = 0; i < keys.length - 1; i++) {
177
- expect(keys[i] < keys[i + 1]).toBe(true);
178
- }
179
- });
180
- });
181
- });
182
- //# sourceMappingURL=fractional-index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fractional-index.test.js","sourceRoot":"","sources":["../../src/utils/fractional-index.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=key.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key.test.d.ts","sourceRoot":"","sources":["../../src/utils/key.test.ts"],"names":[],"mappings":""}
@@ -1,65 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { generateProjectKey, validateProjectKey, formatTaskKey, isTempTaskId } from './key.js';
3
- describe('Project Key Utilities', () => {
4
- describe('generateProjectKey', () => {
5
- it('generates a key for a single word name', () => {
6
- expect(generateProjectKey('Operative')).toBe('OPE');
7
- expect(generateProjectKey('App')).toBe('APP');
8
- expect(generateProjectKey('Go')).toBe('GO');
9
- });
10
- it('generates a key for multi-word names', () => {
11
- expect(generateProjectKey('Mobile App')).toBe('MA');
12
- expect(generateProjectKey('Frontend Core Platform')).toBe('FCP');
13
- expect(generateProjectKey('Very Long Project Name Here')).toBe('VLPN');
14
- });
15
- it('handles special characters and whitespace', () => {
16
- expect(generateProjectKey(' v2.0 ')).toBe('V20');
17
- expect(generateProjectKey('Project #1')).toBe('P1');
18
- });
19
- it('returns default PRJ fallback for empty input', () => {
20
- expect(generateProjectKey('')).toBe('PRJ');
21
- expect(generateProjectKey(' ')).toBe('PRJ');
22
- });
23
- });
24
- describe('validateProjectKey', () => {
25
- it('returns true for valid keys', () => {
26
- expect(validateProjectKey('CP')).toBe(true);
27
- expect(validateProjectKey('PROJ')).toBe(true);
28
- expect(validateProjectKey('APP123')).toBe(true);
29
- });
30
- it('returns false for invalid keys', () => {
31
- expect(validateProjectKey('A')).toBe(false); // too short
32
- expect(validateProjectKey('TOOLONGKEY')).toBe(false); // too long
33
- expect(validateProjectKey('proj')).toBe(false); // lowercase
34
- expect(validateProjectKey('P-1')).toBe(false); // special char
35
- expect(validateProjectKey('')).toBe(false);
36
- });
37
- });
38
- describe('formatTaskKey', () => {
39
- it('formats project key and task number', () => {
40
- expect(formatTaskKey('MOB', 42)).toBe('MOB-42');
41
- expect(formatTaskKey('op', 1)).toBe('OP-1');
42
- });
43
- it('uses fallback for missing project key', () => {
44
- expect(formatTaskKey('', 10)).toBe('TASK-10');
45
- });
46
- });
47
- describe('isTempTaskId', () => {
48
- it('detects temp_ prefixed IDs', () => {
49
- expect(isTempTaskId('temp_123456_abc')).toBe(true);
50
- expect(isTempTaskId('#temp_123456_abc')).toBe(true);
51
- });
52
- it('detects temp- prefixed IDs', () => {
53
- expect(isTempTaskId('temp-task-1')).toBe(true);
54
- expect(isTempTaskId('#temp-task-1')).toBe(true);
55
- });
56
- it('returns false for permanent or invalid IDs', () => {
57
- expect(isTempTaskId('task_123')).toBe(false);
58
- expect(isTempTaskId('PROJ-1')).toBe(false);
59
- expect(isTempTaskId(null)).toBe(false);
60
- expect(isTempTaskId(undefined)).toBe(false);
61
- expect(isTempTaskId('')).toBe(false);
62
- });
63
- });
64
- });
65
- //# sourceMappingURL=key.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key.test.js","sourceRoot":"","sources":["../../src/utils/key.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mentions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mentions.test.d.ts","sourceRoot":"","sources":["../../src/utils/mentions.test.ts"],"names":[],"mappings":""}