@auto-engineer/server-generator-apollo-emmett 1.123.0 → 1.124.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @auto-engineer/server-generator-apollo-emmett@1.123.0 build /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.124.0 build /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
3
3
  > tsc && tsx ../../scripts/fix-esm-imports.ts && rm -rf dist/src/codegen/templates && mkdir -p dist/src/codegen && cp -r src/codegen/templates dist/src/codegen/templates && cp src/server.ts dist/src && cp -r src/utils dist/src && cp -r src/domain dist/src
4
4
 
5
5
  Fixed ESM imports in dist/
@@ -1,14 +1,14 @@
1
1
 
2
- > @auto-engineer/server-generator-apollo-emmett@1.122.0 test /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.123.0 test /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
3
3
  > vitest run --reporter=dot
4
4
 
5
5
 
6
6
   RUN  v3.2.4 /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
7
7
 
8
- ·······································································································································································································································-······················
8
+ ····································································································································································································································-·························
9
9
 
10
10
   Test Files  34 passed | 1 skipped (35)
11
11
   Tests  253 passed | 1 skipped (254)
12
-  Start at  18:00:09
13
-  Duration  27.06s (transform 4.62s, setup 0ms, collect 53.77s, tests 10.96s, environment 9ms, prepare 5.84s)
12
+  Start at  13:15:09
13
+  Duration  33.88s (transform 6.25s, setup 0ms, collect 67.65s, tests 16.57s, environment 8ms, prepare 6.25s)
14
14
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @auto-engineer/server-generator-apollo-emmett@1.122.0 type-check /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.123.0 type-check /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
3
3
  > tsc --noEmit --project tsconfig.json
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # @auto-engineer/server-generator-apollo-emmett
2
2
 
3
+ ## 1.124.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`5598a2a`](https://github.com/BeOnAuto/auto-engineer/commit/5598a2a3fc9b0eb012418ad5fec36920a0015045) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: rewrite system prompt with emmett patterns and import rules
8
+ - **server-implementer**: extract shared buildContextSections utility
9
+ - **server-implementer**: extract shared loadContextFiles utility
10
+ - **server-implementer**: change loadSharedContext to return Record<string, string>
11
+ - **server-implementer**: add ketchup plan for generator/implementer hardening
12
+
13
+ - [`432a674`](https://github.com/BeOnAuto/auto-engineer/commit/432a67401bc2547938173f2a5581b761c7c24457) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: add shared findFilesToImplement with priority ordering
14
+
15
+ ### Patch Changes
16
+
17
+ - [`eadca44`](https://github.com/BeOnAuto/auto-engineer/commit/eadca44c44f5e9b75fc9fae66d116b964635845c) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: use Date default instead of null in projection specs
18
+
19
+ - [`6e5085a`](https://github.com/BeOnAuto/auto-engineer/commit/6e5085a538ab40614149d6b2cbf376b51078f661) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: typed variable return pattern in decide template
20
+
21
+ - [`4c9dcd5`](https://github.com/BeOnAuto/auto-engineer/commit/4c9dcd5cfa2a5fbaba6e04414181dd89f2a7b76b) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **global**: mark all structural fix bursts as done in ketchup plan
22
+
23
+ - [`91ff56c`](https://github.com/BeOnAuto/auto-engineer/commit/91ff56c6cc7d8b8ead31ea61c52fcaa996c6343e) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: update missed projection spec snapshot
24
+
25
+ - [`0281ce0`](https://github.com/BeOnAuto/auto-engineer/commit/0281ce022c94149c093ded3d1f6c1a3cf7aba691) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: strengthen system prompt for scaffolded structure
26
+
27
+ - [`c081fe8`](https://github.com/BeOnAuto/auto-engineer/commit/c081fe8485b26c5339442c1a19d0e9161061d4cb) Thanks [@github-actions[bot]](https://github.com/github-actions%5Bbot%5D)! - - **global**: replace claude with gemini
28
+ - **global**: version packages
29
+
30
+ - [`396d141`](https://github.com/BeOnAuto/auto-engineer/commit/396d14171aa378396308fd3d7003195ecfa65769) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: add structural guard to projection template
31
+
32
+ - [`e0fc22f`](https://github.com/BeOnAuto/auto-engineer/commit/e0fc22f173ec87502c6fd081653026a43c9b08d8) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **global**: update ketchup plan for structural generator/implementer fixes
33
+
34
+ - [`1dc4f85`](https://github.com/BeOnAuto/auto-engineer/commit/1dc4f85391d843ba423d28332f684296c5bbd8e6) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **global**: remove unused project references from tsconfig.json
35
+
36
+ - [`3ab3305`](https://github.com/BeOnAuto/auto-engineer/commit/3ab3305b51269affbb2aa678d05e0d410cb3f4fb) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: use shared findFilesToImplement in runSlice
37
+
38
+ - [`e2d3097`](https://github.com/BeOnAuto/auto-engineer/commit/e2d3097e5af288b3f1c69fe1e455a0d2d370e38c) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: use Record<string, never> in state template
39
+
40
+ - [`5617b86`](https://github.com/BeOnAuto/auto-engineer/commit/5617b86137edd5a880494d37a8645e4d16dba40f) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: use shared findFilesToImplement and extractCodeBlock
41
+
42
+ - Updated dependencies [[`eadca44`](https://github.com/BeOnAuto/auto-engineer/commit/eadca44c44f5e9b75fc9fae66d116b964635845c), [`6e5085a`](https://github.com/BeOnAuto/auto-engineer/commit/6e5085a538ab40614149d6b2cbf376b51078f661), [`5598a2a`](https://github.com/BeOnAuto/auto-engineer/commit/5598a2a3fc9b0eb012418ad5fec36920a0015045), [`4c9dcd5`](https://github.com/BeOnAuto/auto-engineer/commit/4c9dcd5cfa2a5fbaba6e04414181dd89f2a7b76b), [`432a674`](https://github.com/BeOnAuto/auto-engineer/commit/432a67401bc2547938173f2a5581b761c7c24457), [`91ff56c`](https://github.com/BeOnAuto/auto-engineer/commit/91ff56c6cc7d8b8ead31ea61c52fcaa996c6343e), [`0281ce0`](https://github.com/BeOnAuto/auto-engineer/commit/0281ce022c94149c093ded3d1f6c1a3cf7aba691), [`c081fe8`](https://github.com/BeOnAuto/auto-engineer/commit/c081fe8485b26c5339442c1a19d0e9161061d4cb), [`396d141`](https://github.com/BeOnAuto/auto-engineer/commit/396d14171aa378396308fd3d7003195ecfa65769), [`e0fc22f`](https://github.com/BeOnAuto/auto-engineer/commit/e0fc22f173ec87502c6fd081653026a43c9b08d8), [`1dc4f85`](https://github.com/BeOnAuto/auto-engineer/commit/1dc4f85391d843ba423d28332f684296c5bbd8e6), [`3ab3305`](https://github.com/BeOnAuto/auto-engineer/commit/3ab3305b51269affbb2aa678d05e0d410cb3f4fb), [`e2d3097`](https://github.com/BeOnAuto/auto-engineer/commit/e2d3097e5af288b3f1c69fe1e455a0d2d370e38c), [`5617b86`](https://github.com/BeOnAuto/auto-engineer/commit/5617b86137edd5a880494d37a8645e4d16dba40f)]:
43
+ - @auto-engineer/message-bus@1.124.0
44
+ - @auto-engineer/narrative@1.124.0
45
+
3
46
  ## 1.123.0
4
47
 
5
48
  ### Minor Changes
@@ -113,10 +113,12 @@ describe('decide.ts.ejs', () => {
113
113
 
114
114
  // All event fields come from command input — use ...command.data to pass them through.
115
115
 
116
- // return {
116
+ // IMPLEMENT: Use a typed variable to prevent type widening:
117
+ // const result: ListingCreated = {
117
118
  // type: 'ListingCreated',
118
119
  // data: { ...command.data },
119
120
  // };
121
+ // return result;
120
122
 
121
123
  throw new IllegalStateError('Not yet implemented: ' + command.type);
122
124
  }
@@ -258,10 +260,12 @@ describe('decide.ts.ejs', () => {
258
260
  // Fields NOT in command input → produce dynamically (never hardcode):
259
261
  // removedAt: Date — derive from _state, generate at runtime (e.g., crypto.randomUUID()), or compute from command.data
260
262
 
261
- // return {
263
+ // IMPLEMENT: Use a typed variable to prevent type widening:
264
+ // const result: ListingRemoved = {
262
265
  // type: 'ListingRemoved',
263
- // data: { ...command.data, /* + dynamically produce: removedAt */ },
266
+ // data: { ...command.data, /* + produce: removedAt */ },
264
267
  // };
268
+ // return result;
265
269
 
266
270
  throw new IllegalStateError('Not yet implemented: ' + command.type);
267
271
  }
@@ -421,10 +425,12 @@ describe('decide.ts.ejs', () => {
421
425
 
422
426
  // All event fields come from command input — use ...command.data to pass them through.
423
427
 
424
- // return {
428
+ // IMPLEMENT: Use a typed variable to prevent type widening:
429
+ // const result: ListingCreated = {
425
430
  // type: 'ListingCreated',
426
431
  // data: { ...command.data },
427
432
  // };
433
+ // return result;
428
434
 
429
435
  throw new IllegalStateError('Not yet implemented: ' + command.type);
430
436
  }
@@ -635,10 +641,12 @@ describe('decide.ts.ejs', () => {
635
641
  // Fields NOT in command input → produce dynamically (never hardcode):
636
642
  // items: Array<object> — derive from _state, generate at runtime (e.g., crypto.randomUUID()), or compute from command.data
637
643
 
638
- // return {
644
+ // IMPLEMENT: Use a typed variable to prevent type widening:
645
+ // const result: ItemsSuggested = {
639
646
  // type: 'ItemsSuggested',
640
- // data: { ...command.data, /* + dynamically produce: items */ },
647
+ // data: { ...command.data, /* + produce: items */ },
641
648
  // };
649
+ // return result;
642
650
 
643
651
  throw new IllegalStateError('Not yet implemented: ' + command.type);
644
652
  }
@@ -127,10 +127,12 @@ for (const scenario of scenarios) {
127
127
  // All event fields come from command input — use ...command.data to pass them through.
128
128
  <% } -%>
129
129
 
130
- // return {
131
- // type: '<%= fallbackEventTypes[0] ?? 'TODO_EVENT_TYPE' %>',
132
- // data: { ...command.data<%= nonCommandFields.length > 0 ? `, /* + dynamically produce: ${nonCommandFields.map(f => f.name).join(', ')} */` : '' %> },
130
+ // IMPLEMENT: Use a typed variable to prevent type widening:
131
+ // const result: <%= pascalCase(fallbackEventTypes[0] ?? 'TODO_EVENT_TYPE') %> = {
132
+ // type: '<%= fallbackEventTypes[0] %>',
133
+ // data: { ...command.data<%= nonCommandFields.length > 0 ? `, /* + produce: ${nonCommandFields.map(f => f.name).join(', ')} */` : '' %> },
133
134
  // };
135
+ // return result;
134
136
 
135
137
  throw new IllegalStateError('Not yet implemented: ' + command.type);
136
138
  }
@@ -132,7 +132,7 @@ describe('state.ts.ejs', () => {
132
132
  */
133
133
 
134
134
  // TODO: Replace with a discriminated union of domain states for the current slice
135
- export type State = {};
135
+ export type State = Record<string, never>;
136
136
 
137
137
  // TODO: Replace the Return with the initial domain state of the current slice
138
138
  export const initialState = (): State => {
@@ -43,7 +43,7 @@
43
43
  */
44
44
 
45
45
  // TODO: Replace with a discriminated union of domain states for the current slice
46
- export type State = {};
46
+ export type State = Record<string, never>;
47
47
 
48
48
  // TODO: Replace the Return with the initial domain state of the current slice
49
49
  export const initialState = (): State => {
@@ -1772,6 +1772,8 @@ describe('projection.specs.ts.ejs', () => {
1772
1772
 
1773
1773
  type AllEvents = WorkoutRecorded;
1774
1774
 
1775
+ // Auto-generated — do not change this function, its imports, or type parameters.
1776
+ // Only implement the case bodies inside evolve.
1775
1777
  export const projection = inMemorySingleStreamProjection<WorkoutHistory, AllEvents>({
1776
1778
  collectionName: 'WorkoutHistoryProjection',
1777
1779
  canHandle: ['WorkoutRecorded'],
@@ -227,6 +227,8 @@ describe('projection.ts.ejs', () => {
227
227
 
228
228
  type AllEvents = ListingCreated | ListingRemoved;
229
229
 
230
+ // Auto-generated — do not change this function, its imports, or type parameters.
231
+ // Only implement the case bodies inside evolve.
230
232
  export const projection = inMemorySingleStreamProjection<AvailableListings, AllEvents>({
231
233
  collectionName: 'AvailablePropertiesProjection',
232
234
  canHandle: ['ListingCreated', 'ListingRemoved'],
@@ -582,6 +584,8 @@ describe('projection.ts.ejs', () => {
582
584
 
583
585
  type AllEvents = TodoAdded;
584
586
 
587
+ // Auto-generated — do not change this function, its imports, or type parameters.
588
+ // Only implement the case bodies inside evolve.
585
589
  export const projection = inMemorySingleStreamProjection<TodoSummary, AllEvents>({
586
590
  collectionName: 'TodoSummaryProjection',
587
591
  canHandle: ['TodoAdded'],
@@ -809,6 +813,8 @@ describe('projection.ts.ejs', () => {
809
813
 
810
814
  type AllEvents = UserJoinedProject;
811
815
 
816
+ // Auto-generated — do not change this function, its imports, or type parameters.
817
+ // Only implement the case bodies inside evolve.
812
818
  export const projection = inMemorySingleStreamProjection<UserProject, AllEvents>({
813
819
  collectionName: 'UserProjectsProjection',
814
820
  canHandle: ['UserJoinedProject'],
@@ -34,7 +34,10 @@ function isQueryAction(whenText, queryName) {
34
34
  }
35
35
 
36
36
  function formatSpecValue(value, tsType) {
37
- if (value === null || value === undefined) return 'null';
37
+ if (value === null || value === undefined) {
38
+ if (tsType === 'Date') return "new Date('2000-01-01T00:00:00.000Z')";
39
+ return 'null';
40
+ }
38
41
  if ((tsType === 'string' || tsType === 'ID') && typeof value === 'string') return `'${value}'`;
39
42
  if (tsType === 'number' || tsType === 'boolean') return String(value);
40
43
  if (tsType === 'Date') return `new Date('${value}')`;
@@ -59,6 +59,8 @@ interface Internal<%= pascalCase(targetName || 'State') %> extends <%= pascalCas
59
59
  <% } %>
60
60
  type AllEvents = <%= allEventTypes %>;
61
61
 
62
+ // Auto-generated — do not change this function, its imports, or type parameters.
63
+ // Only implement the case bodies inside evolve.
62
64
  export const projection = inMemorySingleStreamProjection<
63
65
  <%= pascalCase(slice.server?.data?.items?.[0]?.target?.name || 'UnknownState') %>,
64
66
  AllEvents
package/package.json CHANGED
@@ -32,8 +32,8 @@
32
32
  "uuid": "^13.0.0",
33
33
  "web-streams-polyfill": "^4.1.0",
34
34
  "zod": "^3.22.4",
35
- "@auto-engineer/narrative": "1.123.0",
36
- "@auto-engineer/message-bus": "1.123.0"
35
+ "@auto-engineer/message-bus": "1.124.0",
36
+ "@auto-engineer/narrative": "1.124.0"
37
37
  },
38
38
  "publishConfig": {
39
39
  "access": "public"
@@ -44,9 +44,9 @@
44
44
  "typescript": "^5.8.3",
45
45
  "vitest": "^3.2.4",
46
46
  "tsx": "^4.19.2",
47
- "@auto-engineer/cli": "1.123.0"
47
+ "@auto-engineer/cli": "1.124.0"
48
48
  },
49
- "version": "1.123.0",
49
+ "version": "1.124.0",
50
50
  "scripts": {
51
51
  "generate:server": "tsx src/cli/index.ts",
52
52
  "build": "tsc && tsx ../../scripts/fix-esm-imports.ts && rm -rf dist/src/codegen/templates && mkdir -p dist/src/codegen && cp -r src/codegen/templates dist/src/codegen/templates && cp src/server.ts dist/src && cp -r src/utils dist/src && cp -r src/domain dist/src",
@@ -113,10 +113,12 @@ describe('decide.ts.ejs', () => {
113
113
 
114
114
  // All event fields come from command input — use ...command.data to pass them through.
115
115
 
116
- // return {
116
+ // IMPLEMENT: Use a typed variable to prevent type widening:
117
+ // const result: ListingCreated = {
117
118
  // type: 'ListingCreated',
118
119
  // data: { ...command.data },
119
120
  // };
121
+ // return result;
120
122
 
121
123
  throw new IllegalStateError('Not yet implemented: ' + command.type);
122
124
  }
@@ -258,10 +260,12 @@ describe('decide.ts.ejs', () => {
258
260
  // Fields NOT in command input → produce dynamically (never hardcode):
259
261
  // removedAt: Date — derive from _state, generate at runtime (e.g., crypto.randomUUID()), or compute from command.data
260
262
 
261
- // return {
263
+ // IMPLEMENT: Use a typed variable to prevent type widening:
264
+ // const result: ListingRemoved = {
262
265
  // type: 'ListingRemoved',
263
- // data: { ...command.data, /* + dynamically produce: removedAt */ },
266
+ // data: { ...command.data, /* + produce: removedAt */ },
264
267
  // };
268
+ // return result;
265
269
 
266
270
  throw new IllegalStateError('Not yet implemented: ' + command.type);
267
271
  }
@@ -421,10 +425,12 @@ describe('decide.ts.ejs', () => {
421
425
 
422
426
  // All event fields come from command input — use ...command.data to pass them through.
423
427
 
424
- // return {
428
+ // IMPLEMENT: Use a typed variable to prevent type widening:
429
+ // const result: ListingCreated = {
425
430
  // type: 'ListingCreated',
426
431
  // data: { ...command.data },
427
432
  // };
433
+ // return result;
428
434
 
429
435
  throw new IllegalStateError('Not yet implemented: ' + command.type);
430
436
  }
@@ -635,10 +641,12 @@ describe('decide.ts.ejs', () => {
635
641
  // Fields NOT in command input → produce dynamically (never hardcode):
636
642
  // items: Array<object> — derive from _state, generate at runtime (e.g., crypto.randomUUID()), or compute from command.data
637
643
 
638
- // return {
644
+ // IMPLEMENT: Use a typed variable to prevent type widening:
645
+ // const result: ItemsSuggested = {
639
646
  // type: 'ItemsSuggested',
640
- // data: { ...command.data, /* + dynamically produce: items */ },
647
+ // data: { ...command.data, /* + produce: items */ },
641
648
  // };
649
+ // return result;
642
650
 
643
651
  throw new IllegalStateError('Not yet implemented: ' + command.type);
644
652
  }
@@ -127,10 +127,12 @@ for (const scenario of scenarios) {
127
127
  // All event fields come from command input — use ...command.data to pass them through.
128
128
  <% } -%>
129
129
 
130
- // return {
131
- // type: '<%= fallbackEventTypes[0] ?? 'TODO_EVENT_TYPE' %>',
132
- // data: { ...command.data<%= nonCommandFields.length > 0 ? `, /* + dynamically produce: ${nonCommandFields.map(f => f.name).join(', ')} */` : '' %> },
130
+ // IMPLEMENT: Use a typed variable to prevent type widening:
131
+ // const result: <%= pascalCase(fallbackEventTypes[0] ?? 'TODO_EVENT_TYPE') %> = {
132
+ // type: '<%= fallbackEventTypes[0] %>',
133
+ // data: { ...command.data<%= nonCommandFields.length > 0 ? `, /* + produce: ${nonCommandFields.map(f => f.name).join(', ')} */` : '' %> },
133
134
  // };
135
+ // return result;
134
136
 
135
137
  throw new IllegalStateError('Not yet implemented: ' + command.type);
136
138
  }
@@ -132,7 +132,7 @@ describe('state.ts.ejs', () => {
132
132
  */
133
133
 
134
134
  // TODO: Replace with a discriminated union of domain states for the current slice
135
- export type State = {};
135
+ export type State = Record<string, never>;
136
136
 
137
137
  // TODO: Replace the Return with the initial domain state of the current slice
138
138
  export const initialState = (): State => {
@@ -43,7 +43,7 @@
43
43
  */
44
44
 
45
45
  // TODO: Replace with a discriminated union of domain states for the current slice
46
- export type State = {};
46
+ export type State = Record<string, never>;
47
47
 
48
48
  // TODO: Replace the Return with the initial domain state of the current slice
49
49
  export const initialState = (): State => {
@@ -1772,6 +1772,8 @@ describe('projection.specs.ts.ejs', () => {
1772
1772
 
1773
1773
  type AllEvents = WorkoutRecorded;
1774
1774
 
1775
+ // Auto-generated — do not change this function, its imports, or type parameters.
1776
+ // Only implement the case bodies inside evolve.
1775
1777
  export const projection = inMemorySingleStreamProjection<WorkoutHistory, AllEvents>({
1776
1778
  collectionName: 'WorkoutHistoryProjection',
1777
1779
  canHandle: ['WorkoutRecorded'],
@@ -227,6 +227,8 @@ describe('projection.ts.ejs', () => {
227
227
 
228
228
  type AllEvents = ListingCreated | ListingRemoved;
229
229
 
230
+ // Auto-generated — do not change this function, its imports, or type parameters.
231
+ // Only implement the case bodies inside evolve.
230
232
  export const projection = inMemorySingleStreamProjection<AvailableListings, AllEvents>({
231
233
  collectionName: 'AvailablePropertiesProjection',
232
234
  canHandle: ['ListingCreated', 'ListingRemoved'],
@@ -582,6 +584,8 @@ describe('projection.ts.ejs', () => {
582
584
 
583
585
  type AllEvents = TodoAdded;
584
586
 
587
+ // Auto-generated — do not change this function, its imports, or type parameters.
588
+ // Only implement the case bodies inside evolve.
585
589
  export const projection = inMemorySingleStreamProjection<TodoSummary, AllEvents>({
586
590
  collectionName: 'TodoSummaryProjection',
587
591
  canHandle: ['TodoAdded'],
@@ -809,6 +813,8 @@ describe('projection.ts.ejs', () => {
809
813
 
810
814
  type AllEvents = UserJoinedProject;
811
815
 
816
+ // Auto-generated — do not change this function, its imports, or type parameters.
817
+ // Only implement the case bodies inside evolve.
812
818
  export const projection = inMemorySingleStreamProjection<UserProject, AllEvents>({
813
819
  collectionName: 'UserProjectsProjection',
814
820
  canHandle: ['UserJoinedProject'],
@@ -34,7 +34,10 @@ function isQueryAction(whenText, queryName) {
34
34
  }
35
35
 
36
36
  function formatSpecValue(value, tsType) {
37
- if (value === null || value === undefined) return 'null';
37
+ if (value === null || value === undefined) {
38
+ if (tsType === 'Date') return "new Date('2000-01-01T00:00:00.000Z')";
39
+ return 'null';
40
+ }
38
41
  if ((tsType === 'string' || tsType === 'ID') && typeof value === 'string') return `'${value}'`;
39
42
  if (tsType === 'number' || tsType === 'boolean') return String(value);
40
43
  if (tsType === 'Date') return `new Date('${value}')`;
@@ -59,6 +59,8 @@ interface Internal<%= pascalCase(targetName || 'State') %> extends <%= pascalCas
59
59
  <% } %>
60
60
  type AllEvents = <%= allEventTypes %>;
61
61
 
62
+ // Auto-generated — do not change this function, its imports, or type parameters.
63
+ // Only implement the case bodies inside evolve.
62
64
  export const projection = inMemorySingleStreamProjection<
63
65
  <%= pascalCase(slice.server?.data?.items?.[0]?.target?.name || 'UnknownState') %>,
64
66
  AllEvents