hzl-core 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/__tests__/concurrency/stress.test.js +13 -9
  2. package/dist/__tests__/concurrency/stress.test.js.map +1 -1
  3. package/dist/__tests__/properties/invariants.test.js +31 -10
  4. package/dist/__tests__/properties/invariants.test.js.map +1 -1
  5. package/dist/db/__tests__/transaction.test.d.ts +2 -0
  6. package/dist/db/__tests__/transaction.test.d.ts.map +1 -0
  7. package/dist/db/__tests__/transaction.test.js +67 -0
  8. package/dist/db/__tests__/transaction.test.js.map +1 -0
  9. package/dist/db/migrations/index.d.ts +8 -3
  10. package/dist/db/migrations/index.d.ts.map +1 -1
  11. package/dist/db/migrations/index.js +14 -3
  12. package/dist/db/migrations/index.js.map +1 -1
  13. package/dist/db/migrations/index.test.d.ts +2 -0
  14. package/dist/db/migrations/index.test.d.ts.map +1 -0
  15. package/dist/db/migrations/index.test.js +53 -0
  16. package/dist/db/migrations/index.test.js.map +1 -0
  17. package/dist/db/schema.d.ts +2 -2
  18. package/dist/db/schema.d.ts.map +1 -1
  19. package/dist/db/schema.js +3 -1
  20. package/dist/db/schema.js.map +1 -1
  21. package/dist/db/transaction.d.ts.map +1 -1
  22. package/dist/db/transaction.js +16 -4
  23. package/dist/db/transaction.js.map +1 -1
  24. package/dist/events/store.d.ts +3 -1
  25. package/dist/events/store.d.ts.map +1 -1
  26. package/dist/events/store.js +23 -9
  27. package/dist/events/store.js.map +1 -1
  28. package/dist/events/store.test.js +49 -2
  29. package/dist/events/store.test.js.map +1 -1
  30. package/dist/events/types.d.ts +1 -0
  31. package/dist/events/types.d.ts.map +1 -1
  32. package/dist/events/types.js +1 -0
  33. package/dist/events/types.js.map +1 -1
  34. package/dist/events/upcasters.d.ts +16 -0
  35. package/dist/events/upcasters.d.ts.map +1 -0
  36. package/dist/events/upcasters.js +35 -0
  37. package/dist/events/upcasters.js.map +1 -0
  38. package/dist/events/upcasters.test.d.ts +2 -0
  39. package/dist/events/upcasters.test.d.ts.map +1 -0
  40. package/dist/events/upcasters.test.js +47 -0
  41. package/dist/events/upcasters.test.js.map +1 -0
  42. package/dist/index.d.ts +2 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/index.test.js +0 -1
  47. package/dist/index.test.js.map +1 -1
  48. package/dist/projections/comments-checkpoints.d.ts +2 -2
  49. package/dist/projections/comments-checkpoints.d.ts.map +1 -1
  50. package/dist/projections/comments-checkpoints.js +4 -3
  51. package/dist/projections/comments-checkpoints.js.map +1 -1
  52. package/dist/projections/comments-checkpoints.test.js +30 -0
  53. package/dist/projections/comments-checkpoints.test.js.map +1 -1
  54. package/dist/projections/dependencies.d.ts +2 -2
  55. package/dist/projections/dependencies.d.ts.map +1 -1
  56. package/dist/projections/dependencies.js +5 -4
  57. package/dist/projections/dependencies.js.map +1 -1
  58. package/dist/projections/dependencies.test.js +29 -0
  59. package/dist/projections/dependencies.test.js.map +1 -1
  60. package/dist/projections/projects.d.ts +2 -2
  61. package/dist/projections/projects.d.ts.map +1 -1
  62. package/dist/projections/projects.js +8 -9
  63. package/dist/projections/projects.js.map +1 -1
  64. package/dist/projections/projects.test.js +34 -0
  65. package/dist/projections/projects.test.js.map +1 -1
  66. package/dist/projections/search.d.ts +2 -2
  67. package/dist/projections/search.d.ts.map +1 -1
  68. package/dist/projections/search.js +15 -12
  69. package/dist/projections/search.js.map +1 -1
  70. package/dist/projections/search.test.js +37 -0
  71. package/dist/projections/search.test.js.map +1 -1
  72. package/dist/projections/tags.d.ts +2 -2
  73. package/dist/projections/tags.d.ts.map +1 -1
  74. package/dist/projections/tags.js +4 -3
  75. package/dist/projections/tags.js.map +1 -1
  76. package/dist/projections/tags.test.js +29 -0
  77. package/dist/projections/tags.test.js.map +1 -1
  78. package/dist/projections/tasks-current.d.ts +2 -2
  79. package/dist/projections/tasks-current.d.ts.map +1 -1
  80. package/dist/projections/tasks-current.js +19 -14
  81. package/dist/projections/tasks-current.js.map +1 -1
  82. package/dist/projections/tasks-current.test.js +87 -0
  83. package/dist/projections/tasks-current.test.js.map +1 -1
  84. package/dist/projections/types.d.ts +14 -0
  85. package/dist/projections/types.d.ts.map +1 -1
  86. package/dist/projections/types.js +23 -1
  87. package/dist/projections/types.js.map +1 -1
  88. package/dist/services/search-service.js +1 -1
  89. package/dist/services/search-service.js.map +1 -1
  90. package/dist/services/search-service.test.js +23 -0
  91. package/dist/services/search-service.test.js.map +1 -1
  92. package/dist/services/task-service.d.ts +29 -4
  93. package/dist/services/task-service.d.ts.map +1 -1
  94. package/dist/services/task-service.js +272 -69
  95. package/dist/services/task-service.js.map +1 -1
  96. package/dist/services/task-service.test.js +313 -15
  97. package/dist/services/task-service.test.js.map +1 -1
  98. package/dist/services/workflow-service.test.js +525 -161
  99. package/dist/services/workflow-service.test.js.map +1 -1
  100. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"comments-checkpoints.js","sourceRoot":"","sources":["../../src/projections/comments-checkpoints.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,SAAS,GAGV,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,4BAA4B;IACvC,IAAI,GAAG,sBAAsB,CAAC;IAE9B,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,YAAY;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,SAAS,CAAC,kBAAkB;gBAC/B,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACzC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC1C,CAAC;IAEO,kBAAkB,CAAC,KAA6B,EAAE,EAAqB;QAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAwB,CAAC;QAC5C,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CACJ,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,MAAM,IAAI,IAAI,EACpB,KAAK,CAAC,QAAQ,IAAI,IAAI,EACtB,IAAI,CAAC,IAAI,EACT,KAAK,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAAC,KAA6B,EAAE,EAAqB;QACnF,MAAM,IAAI,GAAG,KAAK,CAAC,IAA8B,CAAC;QAClD,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CACJ,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,OAAO,EACb,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAC/B,KAAK,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"comments-checkpoints.js","sourceRoot":"","sources":["../../src/projections/comments-checkpoints.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,SAAS,GAGV,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,4BAA6B,SAAQ,gBAAgB;IAChE,IAAI,GAAG,sBAAsB,CAAC;IAE9B,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,YAAY;gBACzB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,SAAS,CAAC,kBAAkB;gBAC/B,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACzC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC1C,CAAC;IAEO,kBAAkB,CAAC,KAA6B,EAAE,EAAqB;QAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAwB,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE;;;KAG9B,CAAC,CAAC,GAAG,CACJ,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,MAAM,IAAI,IAAI,EACpB,KAAK,CAAC,QAAQ,IAAI,IAAI,EACtB,IAAI,CAAC,IAAI,EACT,KAAK,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAAC,KAA6B,EAAE,EAAqB;QACnF,MAAM,IAAI,GAAG,KAAK,CAAC,IAA8B,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE;;;KAGjC,CAAC,CAAC,GAAG,CACJ,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,OAAO,EACb,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAC/B,KAAK,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;CACF"}
@@ -66,6 +66,36 @@ describe('CommentsCheckpointsProjector', () => {
66
66
  expect(commentCount.cnt).toBe(0);
67
67
  expect(checkpointCount.cnt).toBe(0);
68
68
  });
69
+ it('re-prepares statements when db reference changes', () => {
70
+ const firstDb = createTestDb();
71
+ const secondDb = createTestDb();
72
+ const firstStore = new EventStore(firstDb);
73
+ const secondStore = new EventStore(secondDb);
74
+ const localProjector = new CommentsCheckpointsProjector();
75
+ try {
76
+ const firstEvent = firstStore.append({
77
+ task_id: 'TASK1',
78
+ type: EventType.CommentAdded,
79
+ data: { text: 'first comment' },
80
+ });
81
+ localProjector.apply(firstEvent, firstDb);
82
+ const secondEvent = secondStore.append({
83
+ task_id: 'TASK2',
84
+ type: EventType.CommentAdded,
85
+ data: { text: 'second comment' },
86
+ });
87
+ localProjector.apply(secondEvent, secondDb);
88
+ const comment = secondDb
89
+ .prepare('SELECT * FROM task_comments WHERE task_id = ?')
90
+ .get('TASK2');
91
+ expect(comment).toBeDefined();
92
+ expect(comment.text).toBe('second comment');
93
+ }
94
+ finally {
95
+ firstDb.close();
96
+ secondDb.close();
97
+ }
98
+ });
69
99
  });
70
100
  });
71
101
  //# sourceMappingURL=comments-checkpoints.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"comments-checkpoints.test.js","sourceRoot":"","sources":["../../src/projections/comments-checkpoints.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comments-checkpoints.test.js","sourceRoot":"","sources":["../../src/projections/comments-checkpoints.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type Database from 'libsql';
2
2
  import type { PersistedEventEnvelope } from '../events/store.js';
3
- import type { Projector } from './types.js';
4
- export declare class DependenciesProjector implements Projector {
3
+ import { CachingProjector } from './types.js';
4
+ export declare class DependenciesProjector extends CachingProjector {
5
5
  name: string;
6
6
  apply(event: PersistedEventEnvelope, db: Database.Database): void;
7
7
  reset(db: Database.Database): void;
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/projections/dependencies.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,qBAAsB,YAAW,SAAS;IACrD,IAAI,SAAkB;IAEtB,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAcjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,uBAAuB;CAMhC"}
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/projections/dependencies.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD,IAAI,SAAkB;IAEtB,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAcjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,uBAAuB;CAQhC"}
@@ -1,5 +1,6 @@
1
+ import { CachingProjector } from './types.js';
1
2
  import { EventType } from '../events/types.js';
2
- export class DependenciesProjector {
3
+ export class DependenciesProjector extends CachingProjector {
3
4
  name = 'dependencies';
4
5
  apply(event, db) {
5
6
  switch (event.type) {
@@ -22,18 +23,18 @@ export class DependenciesProjector {
22
23
  const dependsOn = data.depends_on;
23
24
  if (!dependsOn || dependsOn.length === 0)
24
25
  return;
25
- const insertStmt = db.prepare('INSERT OR IGNORE INTO task_dependencies (task_id, depends_on_id) VALUES (?, ?)');
26
+ const insertStmt = this.stmt(db, 'insertDependency', 'INSERT OR IGNORE INTO task_dependencies (task_id, depends_on_id) VALUES (?, ?)');
26
27
  for (const depId of dependsOn) {
27
28
  insertStmt.run(event.task_id, depId);
28
29
  }
29
30
  }
30
31
  handleDependencyAdded(event, db) {
31
32
  const data = event.data;
32
- db.prepare('INSERT OR IGNORE INTO task_dependencies (task_id, depends_on_id) VALUES (?, ?)').run(event.task_id, data.depends_on_id);
33
+ this.stmt(db, 'insertDependency', 'INSERT OR IGNORE INTO task_dependencies (task_id, depends_on_id) VALUES (?, ?)').run(event.task_id, data.depends_on_id);
33
34
  }
34
35
  handleDependencyRemoved(event, db) {
35
36
  const data = event.data;
36
- db.prepare('DELETE FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?').run(event.task_id, data.depends_on_id);
37
+ this.stmt(db, 'deleteDependency', 'DELETE FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?').run(event.task_id, data.depends_on_id);
37
38
  }
38
39
  }
39
40
  //# sourceMappingURL=dependencies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/projections/dependencies.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAA6C,MAAM,oBAAoB,CAAC;AAE1F,MAAM,OAAO,qBAAqB;IAChC,IAAI,GAAG,cAAc,CAAC;IAEtB,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,SAAS,CAAC,eAAe;gBAC5B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,SAAS,CAAC,iBAAiB;gBAC9B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC3C,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjD,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B,gFAAgF,CACjF,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,KAA6B,EAAE,EAAqB;QAChF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAsB,CAAC;QAC1C,EAAE,CAAC,OAAO,CACR,gFAAgF,CACjF,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAEO,uBAAuB,CAAC,KAA6B,EAAE,EAAqB;QAClF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAsB,CAAC;QAC1C,EAAE,CAAC,OAAO,CACR,uEAAuE,CACxE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;CACF"}
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/projections/dependencies.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,SAAS,EAA6C,MAAM,oBAAoB,CAAC;AAE1F,MAAM,OAAO,qBAAsB,SAAQ,gBAAgB;IACzD,IAAI,GAAG,cAAc,CAAC;IAEtB,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,SAAS,CAAC,eAAe;gBAC5B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,SAAS,CAAC,iBAAiB;gBAC9B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC3C,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,EAAE,EACF,kBAAkB,EAClB,gFAAgF,CACjF,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,KAA6B,EAAE,EAAqB;QAChF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAsB,CAAC;QAC1C,IAAI,CAAC,IAAI,CACP,EAAE,EACF,kBAAkB,EAClB,gFAAgF,CACjF,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAEO,uBAAuB,CAAC,KAA6B,EAAE,EAAqB;QAClF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAsB,CAAC;QAC1C,IAAI,CAAC,IAAI,CACP,EAAE,EACF,kBAAkB,EAClB,uEAAuE,CACxE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -91,6 +91,35 @@ describe('DependenciesProjector', () => {
91
91
  const count = db.prepare('SELECT COUNT(*) as cnt FROM task_dependencies').get();
92
92
  expect(count.cnt).toBe(0);
93
93
  });
94
+ it('re-prepares statements when db reference changes', () => {
95
+ const firstDb = createTestDb();
96
+ const secondDb = createTestDb();
97
+ const firstStore = new EventStore(firstDb);
98
+ const secondStore = new EventStore(secondDb);
99
+ const localProjector = new DependenciesProjector();
100
+ try {
101
+ const firstEvent = firstStore.append({
102
+ task_id: 'TASK1',
103
+ type: EventType.DependencyAdded,
104
+ data: { depends_on_id: 'DEP1' },
105
+ });
106
+ localProjector.apply(firstEvent, firstDb);
107
+ const secondEvent = secondStore.append({
108
+ task_id: 'TASK2',
109
+ type: EventType.DependencyAdded,
110
+ data: { depends_on_id: 'DEP2' },
111
+ });
112
+ localProjector.apply(secondEvent, secondDb);
113
+ const dep = secondDb
114
+ .prepare('SELECT * FROM task_dependencies WHERE task_id = ? AND depends_on_id = ?')
115
+ .get('TASK2', 'DEP2');
116
+ expect(dep).toBeDefined();
117
+ }
118
+ finally {
119
+ firstDb.close();
120
+ secondDb.close();
121
+ }
122
+ });
94
123
  });
95
124
  });
96
125
  //# sourceMappingURL=dependencies.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.test.js","sourceRoot":"","sources":["../../src/projections/dependencies.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dependencies.test.js","sourceRoot":"","sources":["../../src/projections/dependencies.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type Database from 'libsql';
2
2
  import type { PersistedEventEnvelope } from '../events/store.js';
3
- import type { Projector } from './types.js';
4
- export declare class ProjectsProjector implements Projector {
3
+ import { CachingProjector } from './types.js';
4
+ export declare class ProjectsProjector extends CachingProjector {
5
5
  name: string;
6
6
  apply(event: PersistedEventEnvelope, db: Database.Database): void;
7
7
  reset(db: Database.Database): void;
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/projections/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ5C,qBAAa,iBAAkB,YAAW,SAAS;IACjD,IAAI,SAAc;IAElB,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAcjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,oBAAoB;IAiC5B,OAAO,CAAC,oBAAoB;CAO7B"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/projections/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQ9C,qBAAa,iBAAkB,SAAQ,gBAAgB;IACrD,IAAI,SAAc;IAElB,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAcjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,oBAAoB;IA2C5B,OAAO,CAAC,oBAAoB;CAS7B"}
@@ -1,5 +1,6 @@
1
+ import { CachingProjector } from './types.js';
1
2
  import { EventType, } from '../events/types.js';
2
- export class ProjectsProjector {
3
+ export class ProjectsProjector extends CachingProjector {
3
4
  name = 'projects';
4
5
  apply(event, db) {
5
6
  switch (event.type) {
@@ -19,28 +20,26 @@ export class ProjectsProjector {
19
20
  }
20
21
  handleProjectCreated(event, db) {
21
22
  const data = event.data;
22
- db.prepare(`
23
+ this.stmt(db, 'insertProject', `
23
24
  INSERT OR IGNORE INTO projects (name, description, is_protected, created_at, last_event_id)
24
25
  VALUES (?, ?, ?, ?, ?)
25
26
  `).run(data.name, data.description ?? null, data.is_protected ? 1 : 0, event.timestamp, event.rowid);
26
27
  }
27
28
  handleProjectRenamed(event, db) {
28
29
  const data = event.data;
29
- const oldProject = db
30
- .prepare('SELECT * FROM projects WHERE name = ?')
31
- .get(data.old_name);
30
+ const oldProject = this.stmt(db, 'selectProjectByName', 'SELECT * FROM projects WHERE name = ?').get(data.old_name);
32
31
  if (!oldProject)
33
32
  return;
34
- db.prepare('DELETE FROM projects WHERE name = ?').run(data.old_name);
35
- db.prepare(`
33
+ this.stmt(db, 'deleteProjectByName', 'DELETE FROM projects WHERE name = ?').run(data.old_name);
34
+ this.stmt(db, 'insertProjectOnRename', `
36
35
  INSERT INTO projects (name, description, is_protected, created_at, last_event_id)
37
36
  VALUES (?, ?, ?, ?, ?)
38
37
  `).run(data.new_name, oldProject.description, oldProject.is_protected, oldProject.created_at, event.rowid);
39
- db.prepare('UPDATE tasks_current SET project = ? WHERE project = ?').run(data.new_name, data.old_name);
38
+ this.stmt(db, 'updateTasksCurrentProjectName', 'UPDATE tasks_current SET project = ? WHERE project = ?').run(data.new_name, data.old_name);
40
39
  }
41
40
  handleProjectDeleted(event, db) {
42
41
  const data = event.data;
43
- db.prepare('DELETE FROM projects WHERE name = ?').run(data.name);
42
+ this.stmt(db, 'deleteProjectByName', 'DELETE FROM projects WHERE name = ?').run(data.name);
44
43
  }
45
44
  }
46
45
  //# sourceMappingURL=projects.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/projections/projects.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,SAAS,GAIV,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,iBAAiB;IAC5B,IAAI,GAAG,UAAU,CAAC;IAElB,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,cAAc;gBAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,SAAS,CAAC,cAAc;gBAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,SAAS,CAAC,cAAc;gBAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAClC,CAAC;IAEO,oBAAoB,CAC1B,KAA6B,EAC7B,EAAqB;QAErB,MAAM,IAAI,GAAG,KAAK,CAAC,IAA0B,CAAC;QAC9C,EAAE,CAAC,OAAO,CACR;;;KAGD,CACA,CAAC,GAAG,CACH,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,IAAI,IAAI,EACxB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACzB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,KAAK,CACZ,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAC1B,KAA6B,EAC7B,EAAqB;QAErB,MAAM,IAAI,GAAG,KAAK,CAAC,IAA0B,CAAC;QAE9C,MAAM,UAAU,GAAG,EAAE;aAClB,OAAO,CAAC,uCAAuC,CAAC;aAChD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAEP,CAAC;QACd,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrE,EAAE,CAAC,OAAO,CACR;;;KAGD,CACA,CAAC,GAAG,CACH,IAAI,CAAC,QAAQ,EACb,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,YAAY,EACvB,UAAU,CAAC,UAAU,EACrB,KAAK,CAAC,KAAK,CACZ,CAAC;QAEF,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CACtE,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,CACd,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAC1B,KAA6B,EAC7B,EAAqB;QAErB,MAAM,IAAI,GAAG,KAAK,CAAC,IAA0B,CAAC;QAC9C,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;CACF"}
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/projections/projects.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,SAAS,GAIV,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,iBAAkB,SAAQ,gBAAgB;IACrD,IAAI,GAAG,UAAU,CAAC;IAElB,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,cAAc;gBAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,SAAS,CAAC,cAAc;gBAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,SAAS,CAAC,cAAc;gBAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAClC,CAAC;IAEO,oBAAoB,CAC1B,KAA6B,EAC7B,EAAqB;QAErB,MAAM,IAAI,GAAG,KAAK,CAAC,IAA0B,CAAC;QAC9C,IAAI,CAAC,IAAI,CACP,EAAE,EACF,eAAe,EACf;;;KAGD,CACA,CAAC,GAAG,CACH,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,IAAI,IAAI,EACxB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACzB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,KAAK,CACZ,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAC1B,KAA6B,EAC7B,EAAqB;QAErB,MAAM,IAAI,GAAG,KAAK,CAAC,IAA0B,CAAC;QAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,EAAE,EACF,qBAAqB,EACrB,uCAAuC,CACxC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAEN,CAAC;QACd,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,EAAE,qCAAqC,CAAC,CAAC,GAAG,CAC7E,IAAI,CAAC,QAAQ,CACd,CAAC;QACF,IAAI,CAAC,IAAI,CACP,EAAE,EACF,uBAAuB,EACvB;;;KAGD,CACA,CAAC,GAAG,CACH,IAAI,CAAC,QAAQ,EACb,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,YAAY,EACvB,UAAU,CAAC,UAAU,EACrB,KAAK,CAAC,KAAK,CACZ,CAAC;QAEF,IAAI,CAAC,IAAI,CACP,EAAE,EACF,+BAA+B,EAC/B,wDAAwD,CACzD,CAAC,GAAG,CACH,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,CACd,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAC1B,KAA6B,EAC7B,EAAqB;QAErB,MAAM,IAAI,GAAG,KAAK,CAAC,IAA0B,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,qBAAqB,EAAE,qCAAqC,CAAC,CAAC,GAAG,CAC7E,IAAI,CAAC,IAAI,CACV,CAAC;IACJ,CAAC;CACF"}
@@ -81,5 +81,39 @@ describe('ProjectsProjector', () => {
81
81
  const count = db.prepare('SELECT COUNT(*) as count FROM projects').get();
82
82
  expect(count.count).toBe(0);
83
83
  });
84
+ it('should re-prepare statements when db reference changes', () => {
85
+ const firstDb = createTestDb();
86
+ const secondDb = createTestDb();
87
+ const localProjector = new ProjectsProjector();
88
+ try {
89
+ const firstEvent = {
90
+ rowid: 1,
91
+ event_id: 'evt-1',
92
+ task_id: PROJECT_EVENT_TASK_ID,
93
+ type: EventType.ProjectCreated,
94
+ data: { name: 'first-project' },
95
+ timestamp: '2026-01-30T12:00:00.000Z',
96
+ };
97
+ localProjector.apply(firstEvent, firstDb);
98
+ const secondEvent = {
99
+ rowid: 2,
100
+ event_id: 'evt-2',
101
+ task_id: PROJECT_EVENT_TASK_ID,
102
+ type: EventType.ProjectCreated,
103
+ data: { name: 'second-project' },
104
+ timestamp: '2026-01-30T12:01:00.000Z',
105
+ };
106
+ localProjector.apply(secondEvent, secondDb);
107
+ const row = secondDb
108
+ .prepare('SELECT * FROM projects WHERE name = ?')
109
+ .get('second-project');
110
+ expect(row).toBeDefined();
111
+ expect(row.name).toBe('second-project');
112
+ }
113
+ finally {
114
+ firstDb.close();
115
+ secondDb.close();
116
+ }
117
+ });
84
118
  });
85
119
  //# sourceMappingURL=projects.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.test.js","sourceRoot":"","sources":["../../src/projections/projects.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projects.test.js","sourceRoot":"","sources":["../../src/projections/projects.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type Database from 'libsql';
2
2
  import type { PersistedEventEnvelope } from '../events/store.js';
3
- import type { Projector } from './types.js';
4
- export declare class SearchProjector implements Projector {
3
+ import { CachingProjector } from './types.js';
4
+ export declare class SearchProjector extends CachingProjector {
5
5
  name: string;
6
6
  apply(event: PersistedEventEnvelope, db: Database.Database): void;
7
7
  reset(db: Database.Database): void;
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/projections/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAK5C,qBAAa,eAAgB,YAAW,SAAS;IAC/C,IAAI,SAAY;IAEhB,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAWjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;CAqB1B"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/projections/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK9C,qBAAa,eAAgB,SAAQ,gBAAgB;IACnD,IAAI,SAAY;IAEhB,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAWjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,iBAAiB;CA0B1B"}
@@ -1,6 +1,7 @@
1
+ import { CachingProjector } from './types.js';
1
2
  import { EventType } from '../events/types.js';
2
- const SEARCHABLE_FIELDS = new Set(['title', 'description']);
3
- export class SearchProjector {
3
+ const SEARCHABLE_FIELDS = new Set(['title', 'description', 'tags']);
4
+ export class SearchProjector extends CachingProjector {
4
5
  name = 'search';
5
6
  apply(event, db) {
6
7
  switch (event.type) {
@@ -17,27 +18,29 @@ export class SearchProjector {
17
18
  }
18
19
  handleTaskCreated(event, db) {
19
20
  const data = event.data;
20
- db.prepare(`
21
- INSERT INTO task_search (task_id, title, description)
22
- VALUES (?, ?, ?)
23
- `).run(event.task_id, data.title, data.description ?? '');
21
+ const tags = Array.isArray(data.tags) ? data.tags.join(' ') : '';
22
+ this.stmt(db, 'insertTaskSearch', `
23
+ INSERT INTO task_search (task_id, title, description, tags)
24
+ VALUES (?, ?, ?, ?)
25
+ `).run(event.task_id, data.title, data.description ?? '', tags);
24
26
  }
25
27
  handleTaskUpdated(event, db) {
26
28
  const data = event.data;
27
29
  if (!SEARCHABLE_FIELDS.has(data.field))
28
30
  return;
29
31
  // Get current values from task_search (avoids N+1 query to tasks_current)
30
- const current = db.prepare('SELECT title, description FROM task_search WHERE task_id = ?').get(event.task_id);
32
+ const current = this.stmt(db, 'selectTaskSearchById', 'SELECT title, description, tags FROM task_search WHERE task_id = ?').get(event.task_id);
31
33
  if (!current)
32
34
  return;
33
35
  // Use the new value from the event for the changed field
34
36
  const title = data.field === 'title' ? data.new_value : current.title;
35
37
  const description = data.field === 'description' ? data.new_value ?? '' : current.description;
36
- db.prepare('DELETE FROM task_search WHERE task_id = ?').run(event.task_id);
37
- db.prepare(`
38
- INSERT INTO task_search (task_id, title, description)
39
- VALUES (?, ?, ?)
40
- `).run(event.task_id, title, description);
38
+ const tags = data.field === 'tags' ? (Array.isArray(data.new_value) ? data.new_value.join(' ') : '') : current.tags;
39
+ this.stmt(db, 'deleteTaskSearchById', 'DELETE FROM task_search WHERE task_id = ?').run(event.task_id);
40
+ this.stmt(db, 'insertTaskSearch', `
41
+ INSERT INTO task_search (task_id, title, description, tags)
42
+ VALUES (?, ?, ?, ?)
43
+ `).run(event.task_id, title, description, tags);
41
44
  }
42
45
  }
43
46
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/projections/search.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAA8C,MAAM,oBAAoB,CAAC;AAE3F,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAE5D,MAAM,OAAO,eAAe;IAC1B,IAAI,GAAG,QAAQ,CAAC;IAEhB,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACrC,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QAE/C,0EAA0E;QAC1E,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,8DAA8D,CAC/D,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAuD,CAAC;QAE3E,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,yDAAyD;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC,SAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAClF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAE,IAAI,CAAC,SAA2B,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QAEjH,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3E,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;CACF"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/projections/search.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,SAAS,EAA8C,MAAM,oBAAoB,CAAC;AAE3F,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;AAEpE,MAAM,OAAO,eAAgB,SAAQ,gBAAgB;IACnD,IAAI,GAAG,QAAQ,CAAC;IAEhB,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACrC,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE;;;KAGjC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QAE/C,0EAA0E;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,EAAE,EACF,sBAAsB,EACtB,oEAAoE,CACrE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAqE,CAAC;QAEzF,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,yDAAyD;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC,SAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAClF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAE,IAAI,CAAC,SAA2B,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACjH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,SAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QAElI,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB,EAAE,2CAA2C,CAAC,CAAC,GAAG,CACpF,KAAK,CAAC,OAAO,CACd,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE;;;KAGjC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -72,6 +72,43 @@ describe('SearchProjector', () => {
72
72
  const count = db.prepare('SELECT COUNT(*) as cnt FROM task_search').get();
73
73
  expect(count.cnt).toBe(0);
74
74
  });
75
+ it('re-prepares statements when db reference changes', () => {
76
+ const firstDb = createTestDb();
77
+ const secondDb = createTestDb();
78
+ const firstStore = new EventStore(firstDb);
79
+ const secondStore = new EventStore(secondDb);
80
+ const localProjector = new SearchProjector();
81
+ try {
82
+ const firstEvent = firstStore.append({
83
+ task_id: 'TASK1',
84
+ type: EventType.TaskCreated,
85
+ data: {
86
+ title: 'First title',
87
+ project: 'inbox',
88
+ description: 'First description',
89
+ },
90
+ });
91
+ localProjector.apply(firstEvent, firstDb);
92
+ const secondEvent = secondStore.append({
93
+ task_id: 'TASK2',
94
+ type: EventType.TaskCreated,
95
+ data: {
96
+ title: 'Second title',
97
+ project: 'inbox',
98
+ description: 'Second description',
99
+ },
100
+ });
101
+ localProjector.apply(secondEvent, secondDb);
102
+ const results = secondDb
103
+ .prepare("SELECT task_id FROM task_search WHERE task_search MATCH 'Second'")
104
+ .all();
105
+ expect(results.map(r => r.task_id)).toContain('TASK2');
106
+ }
107
+ finally {
108
+ firstDb.close();
109
+ secondDb.close();
110
+ }
111
+ });
75
112
  });
76
113
  });
77
114
  //# sourceMappingURL=search.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.test.js","sourceRoot":"","sources":["../../src/projections/search.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.test.js","sourceRoot":"","sources":["../../src/projections/search.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type Database from 'libsql';
2
2
  import type { PersistedEventEnvelope } from '../events/store.js';
3
- import type { Projector } from './types.js';
4
- export declare class TagsProjector implements Projector {
3
+ import { CachingProjector } from './types.js';
4
+ export declare class TagsProjector extends CachingProjector {
5
5
  name: string;
6
6
  apply(event: PersistedEventEnvelope, db: Database.Database): void;
7
7
  reset(db: Database.Database): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/projections/tags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,aAAc,YAAW,SAAS;IAC7C,IAAI,SAAU;IAEd,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAWjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,UAAU;CAQnB"}
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/projections/tags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,aAAc,SAAQ,gBAAgB;IACjD,IAAI,SAAU;IAEd,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAWjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,UAAU;CAUnB"}
@@ -1,5 +1,6 @@
1
+ import { CachingProjector } from './types.js';
1
2
  import { EventType } from '../events/types.js';
2
- export class TagsProjector {
3
+ export class TagsProjector extends CachingProjector {
3
4
  name = 'tags';
4
5
  apply(event, db) {
5
6
  switch (event.type) {
@@ -26,13 +27,13 @@ export class TagsProjector {
26
27
  if (data.field !== 'tags')
27
28
  return;
28
29
  const newTags = Array.isArray(data.new_value) ? data.new_value : [];
29
- db.prepare('DELETE FROM task_tags WHERE task_id = ?').run(event.task_id);
30
+ this.stmt(db, 'deleteTaskTags', 'DELETE FROM task_tags WHERE task_id = ?').run(event.task_id);
30
31
  if (newTags && newTags.length > 0) {
31
32
  this.insertTags(db, event.task_id, newTags);
32
33
  }
33
34
  }
34
35
  insertTags(db, taskId, tags) {
35
- const insertStmt = db.prepare('INSERT OR IGNORE INTO task_tags (task_id, tag) VALUES (?, ?)');
36
+ const insertStmt = this.stmt(db, 'insertTag', 'INSERT OR IGNORE INTO task_tags (task_id, tag) VALUES (?, ?)');
36
37
  for (const tag of tags) {
37
38
  insertStmt.run(taskId, tag);
38
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/projections/tags.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAA8C,MAAM,oBAAoB,CAAC;AAE3F,MAAM,OAAO,aAAa;IACxB,IAAI,GAAG,MAAM,CAAC;IAEd,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACnC,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEvC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO;QAElC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,SAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,EAAqB,EAAE,MAAc,EAAE,IAAc;QACtE,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B,8DAA8D,CAC/D,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/projections/tags.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,SAAS,EAA8C,MAAM,oBAAoB,CAAC;AAE3F,MAAM,OAAO,aAAc,SAAQ,gBAAgB;IACjD,IAAI,GAAG,MAAM,CAAC;IAEd,KAAK,CAAC,KAA6B,EAAE,EAAqB;QACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,SAAS,CAAC,WAAW;gBACxB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAqB;QACzB,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACnC,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEvC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEO,iBAAiB,CAAC,KAA6B,EAAE,EAAqB;QAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO;QAElC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,SAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,yCAAyC,CAAC,CAAC,GAAG,CAC5E,KAAK,CAAC,OAAO,CACd,CAAC;QACF,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,EAAqB,EAAE,MAAc,EAAE,IAAc;QACtE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,EAAE,EACF,WAAW,EACX,8DAA8D,CAC/D,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;CACF"}
@@ -63,6 +63,35 @@ describe('TagsProjector', () => {
63
63
  const count = db.prepare('SELECT COUNT(*) as cnt FROM task_tags').get();
64
64
  expect(count.cnt).toBe(0);
65
65
  });
66
+ it('re-prepares statements when db reference changes', () => {
67
+ const firstDb = createTestDb();
68
+ const secondDb = createTestDb();
69
+ const firstStore = new EventStore(firstDb);
70
+ const secondStore = new EventStore(secondDb);
71
+ const localProjector = new TagsProjector();
72
+ try {
73
+ const firstEvent = firstStore.append({
74
+ task_id: 'TASK1',
75
+ type: EventType.TaskCreated,
76
+ data: { title: 'First', project: 'inbox', tags: ['first'] },
77
+ });
78
+ localProjector.apply(firstEvent, firstDb);
79
+ const secondEvent = secondStore.append({
80
+ task_id: 'TASK2',
81
+ type: EventType.TaskCreated,
82
+ data: { title: 'Second', project: 'inbox', tags: ['second'] },
83
+ });
84
+ localProjector.apply(secondEvent, secondDb);
85
+ const tags = secondDb
86
+ .prepare('SELECT tag FROM task_tags WHERE task_id = ? ORDER BY tag')
87
+ .all('TASK2');
88
+ expect(tags.map(t => t.tag)).toEqual(['second']);
89
+ }
90
+ finally {
91
+ firstDb.close();
92
+ secondDb.close();
93
+ }
94
+ });
66
95
  });
67
96
  });
68
97
  //# sourceMappingURL=tags.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tags.test.js","sourceRoot":"","sources":["../../src/projections/tags.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tags.test.js","sourceRoot":"","sources":["../../src/projections/tags.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type Database from 'libsql';
2
2
  import type { PersistedEventEnvelope } from '../events/store.js';
3
- import type { Projector } from './types.js';
4
- export declare class TasksCurrentProjector implements Projector {
3
+ import { CachingProjector } from './types.js';
4
+ export declare class TasksCurrentProjector extends CachingProjector {
5
5
  name: string;
6
6
  apply(event: PersistedEventEnvelope, db: Database.Database): void;
7
7
  reset(db: Database.Database): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-current.d.ts","sourceRoot":"","sources":["../../src/projections/tasks-current.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAa5C,qBAAa,qBAAsB,YAAW,SAAS;IACrD,IAAI,SAAmB;IAEvB,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAuBjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,mBAAmB;IAiI3B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,wBAAwB;CAajC"}
1
+ {"version":3,"file":"tasks-current.d.ts","sourceRoot":"","sources":["../../src/projections/tasks-current.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAiB9C,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD,IAAI,SAAmB;IAEvB,KAAK,CAAC,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAuBjE,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIlC,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,mBAAmB;IAiI3B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,wBAAwB;CAajC"}