@auto-engineer/server-generator-apollo-emmett 1.139.0 → 1.140.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.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +4 -4
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +17 -0
- package/DEBUG.md +4 -4
- package/dist/src/codegen/extract/data-sink.d.ts +2 -2
- package/dist/src/codegen/extract/data-sink.d.ts.map +1 -1
- package/dist/src/codegen/extract/data-sink.js +2 -2
- package/dist/src/codegen/extract/data-sink.js.map +1 -1
- package/dist/src/codegen/extract/events.d.ts +3 -3
- package/dist/src/codegen/extract/events.d.ts.map +1 -1
- package/dist/src/codegen/extract/events.js +11 -11
- package/dist/src/codegen/extract/events.js.map +1 -1
- package/dist/src/codegen/extract/gwt.d.ts +2 -2
- package/dist/src/codegen/extract/gwt.d.ts.map +1 -1
- package/dist/src/codegen/extract/gwt.js +2 -2
- package/dist/src/codegen/extract/gwt.js.map +1 -1
- package/dist/src/codegen/extract/imports.d.ts +4 -4
- package/dist/src/codegen/extract/imports.d.ts.map +1 -1
- package/dist/src/codegen/extract/imports.js +8 -8
- package/dist/src/codegen/extract/imports.js.map +1 -1
- package/dist/src/codegen/extract/messages.d.ts +2 -2
- package/dist/src/codegen/extract/messages.d.ts.map +1 -1
- package/dist/src/codegen/extract/messages.js +9 -9
- package/dist/src/codegen/extract/messages.js.map +1 -1
- package/dist/src/codegen/extract/projection.d.ts +7 -7
- package/dist/src/codegen/extract/projection.d.ts.map +1 -1
- package/dist/src/codegen/extract/projection.js +3 -3
- package/dist/src/codegen/extract/projection.js.map +1 -1
- package/dist/src/codegen/extract/query.d.ts +2 -2
- package/dist/src/codegen/extract/query.d.ts.map +1 -1
- package/dist/src/codegen/extract/query.js.map +1 -1
- package/dist/src/codegen/extract/slice-normalizer.d.ts +4 -4
- package/dist/src/codegen/extract/slice-normalizer.d.ts.map +1 -1
- package/dist/src/codegen/extract/slice-normalizer.js +7 -7
- package/dist/src/codegen/extract/slice-normalizer.js.map +1 -1
- package/dist/src/codegen/extract/states.d.ts +3 -3
- package/dist/src/codegen/extract/states.d.ts.map +1 -1
- package/dist/src/codegen/extract/states.js.map +1 -1
- package/dist/src/codegen/extract/step-converter.d.ts +7 -7
- package/dist/src/codegen/extract/step-converter.d.ts.map +1 -1
- package/dist/src/codegen/extract/step-converter.js +12 -12
- package/dist/src/codegen/extract/step-converter.js.map +1 -1
- package/dist/src/codegen/extract/step-types.d.ts +4 -4
- package/dist/src/codegen/extract/step-types.d.ts.map +1 -1
- package/dist/src/codegen/extract/step-types.js +1 -1
- package/dist/src/codegen/extract/step-types.js.map +1 -1
- package/dist/src/codegen/scaffoldFromSchema.d.ts +12 -12
- package/dist/src/codegen/scaffoldFromSchema.d.ts.map +1 -1
- package/dist/src/codegen/scaffoldFromSchema.js +113 -101
- package/dist/src/codegen/scaffoldFromSchema.js.map +1 -1
- package/dist/src/codegen/templates/command/commands.specs.ts +3 -3
- package/dist/src/codegen/templates/command/decide.specs.specs.ts +52 -52
- package/dist/src/codegen/templates/command/decide.specs.ts +12 -12
- package/dist/src/codegen/templates/command/decide.specs.ts.ejs +1 -1
- package/dist/src/codegen/templates/command/events.specs.ts +3 -3
- package/dist/src/codegen/templates/command/evolve.specs.ts +3 -3
- package/dist/src/codegen/templates/command/handle.specs.ts +13 -13
- package/dist/src/codegen/templates/command/mutation.resolver.specs.ts +19 -19
- package/dist/src/codegen/templates/command/register.specs.ts +3 -3
- package/dist/src/codegen/templates/command/state.specs.ts +3 -3
- package/dist/src/codegen/templates/query/events.specs.ts +4 -4
- package/dist/src/codegen/templates/query/projection.specs.specs.ts +60 -60
- package/dist/src/codegen/templates/query/projection.specs.ts +54 -29
- package/dist/src/codegen/templates/query/projection.specs.ts.ejs +2 -2
- package/dist/src/codegen/templates/query/query.resolver.specs.ts +63 -63
- package/dist/src/codegen/templates/query/query.resolver.ts.ejs +1 -1
- package/dist/src/codegen/templates/query/state.specs.ts +9 -9
- package/dist/src/codegen/templates/react/react.specs.specs.ts +15 -15
- package/dist/src/codegen/templates/react/react.specs.ts +16 -16
- package/dist/src/codegen/templates/react/react.specs.ts.ejs +9 -9
- package/dist/src/codegen/templates/react/react.ts.ejs +5 -5
- package/dist/src/codegen/templates/react/react.ts.specs.ts +33 -33
- package/dist/src/codegen/templates/react/register.specs.ts +7 -7
- package/dist/src/codegen/templates/react/register.ts.ejs +4 -4
- package/dist/src/codegen/test-data/specVariant1.d.ts.map +1 -1
- package/dist/src/codegen/test-data/specVariant1.js +3 -2
- package/dist/src/codegen/test-data/specVariant1.js.map +1 -1
- package/dist/src/codegen/types.d.ts +2 -2
- package/dist/src/codegen/types.d.ts.map +1 -1
- package/dist/src/commands/generate-server.d.ts +21 -21
- package/dist/src/commands/generate-server.d.ts.map +1 -1
- package/dist/src/commands/generate-server.js +81 -63
- package/dist/src/commands/generate-server.js.map +1 -1
- package/dist/src/commands/initialize-server.d.ts.map +1 -1
- package/dist/src/commands/initialize-server.js +2 -2
- package/dist/src/commands/initialize-server.js.map +1 -1
- package/dist/src/domain/flows/shared/types.d.ts +14 -0
- package/dist/src/domain/flows/shared/types.d.ts.map +1 -0
- package/dist/src/domain/flows/shared/types.js +2 -0
- package/dist/src/domain/flows/shared/types.js.map +1 -0
- package/dist/src/domain/flows/shared/types.ts +15 -0
- package/dist/src/domain/narratives/shared/types.d.ts +14 -0
- package/dist/src/domain/narratives/shared/types.d.ts.map +1 -0
- package/dist/src/domain/narratives/shared/types.js +2 -0
- package/dist/src/domain/narratives/shared/types.js.map +1 -0
- package/dist/src/domain/narratives/shared/types.ts +15 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/server.js +3 -3
- package/dist/src/server.js.map +1 -1
- package/dist/src/server.ts +3 -3
- package/dist/src/utils/loadRegisterFiles.d.ts +2 -2
- package/dist/src/utils/loadRegisterFiles.d.ts.map +1 -1
- package/dist/src/utils/loadRegisterFiles.js.map +1 -1
- package/dist/src/utils/loadRegisterFiles.ts +5 -5
- package/dist/src/utils/loadResolvers.js +1 -1
- package/dist/src/utils/loadResolvers.js.map +1 -1
- package/dist/src/utils/loadResolvers.ts +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/codegen/extract/data-sink.ts +5 -5
- package/src/codegen/extract/events.ts +15 -15
- package/src/codegen/extract/gwt.ts +4 -4
- package/src/codegen/extract/imports.specs.ts +19 -19
- package/src/codegen/extract/imports.ts +13 -13
- package/src/codegen/extract/messages.specs.ts +30 -30
- package/src/codegen/extract/messages.ts +16 -16
- package/src/codegen/extract/projection.specs.ts +22 -22
- package/src/codegen/extract/projection.ts +9 -9
- package/src/codegen/extract/query.ts +2 -2
- package/src/codegen/extract/slice-normalizer.specs.ts +11 -11
- package/src/codegen/extract/slice-normalizer.ts +14 -14
- package/src/codegen/extract/states.ts +4 -4
- package/src/codegen/extract/step-converter.specs.ts +9 -9
- package/src/codegen/extract/step-converter.ts +15 -15
- package/src/codegen/extract/step-types.specs.ts +12 -12
- package/src/codegen/extract/step-types.ts +4 -4
- package/src/codegen/findEventSource.specs.ts +23 -23
- package/src/codegen/scaffoldErrors.specs.ts +4 -4
- package/src/codegen/scaffoldFromSchema.filter.specs.ts +32 -32
- package/src/codegen/scaffoldFromSchema.ts +146 -132
- package/src/codegen/templates/command/commands.specs.ts +3 -3
- package/src/codegen/templates/command/decide.specs.specs.ts +52 -52
- package/src/codegen/templates/command/decide.specs.ts +12 -12
- package/src/codegen/templates/command/decide.specs.ts.ejs +1 -1
- package/src/codegen/templates/command/events.specs.ts +3 -3
- package/src/codegen/templates/command/evolve.specs.ts +3 -3
- package/src/codegen/templates/command/handle.specs.ts +13 -13
- package/src/codegen/templates/command/mutation.resolver.specs.ts +19 -19
- package/src/codegen/templates/command/register.specs.ts +3 -3
- package/src/codegen/templates/command/state.specs.ts +3 -3
- package/src/codegen/templates/query/events.specs.ts +4 -4
- package/src/codegen/templates/query/projection.specs.specs.ts +60 -60
- package/src/codegen/templates/query/projection.specs.ts +54 -29
- package/src/codegen/templates/query/projection.specs.ts.ejs +2 -2
- package/src/codegen/templates/query/query.resolver.specs.ts +63 -63
- package/src/codegen/templates/query/query.resolver.ts.ejs +1 -1
- package/src/codegen/templates/query/state.specs.ts +9 -9
- package/src/codegen/templates/react/react.specs.specs.ts +15 -15
- package/src/codegen/templates/react/react.specs.ts +16 -16
- package/src/codegen/templates/react/react.specs.ts.ejs +9 -9
- package/src/codegen/templates/react/react.ts.ejs +5 -5
- package/src/codegen/templates/react/react.ts.specs.ts +33 -33
- package/src/codegen/templates/react/register.specs.ts +7 -7
- package/src/codegen/templates/react/register.ts.ejs +4 -4
- package/src/codegen/test-data/specVariant1.json +1 -1
- package/src/codegen/test-data/specVariant1.ts +3 -2
- package/src/codegen/test-data/specVariant2.json +1 -1
- package/src/codegen/types.ts +2 -2
- package/src/commands/generate-server.specs.ts +81 -79
- package/src/commands/generate-server.ts +110 -88
- package/src/commands/initialize-server.specs.ts +4 -4
- package/src/commands/initialize-server.ts +5 -2
- package/src/domain/flows/shared/types.ts +15 -0
- package/src/domain/narratives/shared/types.ts +15 -0
- package/src/index.ts +1 -1
- package/src/server.ts +3 -3
- package/src/utils/loadRegisterFiles.ts +5 -5
- package/src/utils/loadResolvers.ts +1 -1
|
@@ -2,20 +2,20 @@ import { mkdtemp, readFile, rm } from 'node:fs/promises';
|
|
|
2
2
|
import { tmpdir } from 'node:os';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
import type {
|
|
5
|
+
import type { CommandMoment, Model, QueryMoment, Scene } from '@auto-engineer/narrative';
|
|
6
6
|
import fs from 'fs-extra';
|
|
7
7
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
8
8
|
import { ScaffoldError, TemplateRenderError } from '../codegen/scaffoldFromSchema';
|
|
9
9
|
import type { GenerateServerCommand, GenerateServerEvents, GenerationState } from './generate-server';
|
|
10
10
|
import {
|
|
11
11
|
cleanServerDir,
|
|
12
|
+
createMomentGeneratedEvent,
|
|
12
13
|
createServerFailureEvent,
|
|
13
|
-
createSliceGeneratedEvent,
|
|
14
14
|
deriveModelPath,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
emitMomentGeneratedForAffected,
|
|
16
|
+
emitMomentGeneratedForAll,
|
|
17
|
+
emitMomentGenerationFailedForDuplicates,
|
|
18
|
+
emitMomentGenerationFailedForFieldIssues,
|
|
19
19
|
saveGenerationState,
|
|
20
20
|
writeBiomeConfig,
|
|
21
21
|
writeHealthResolver,
|
|
@@ -29,7 +29,7 @@ const makeCommand = (): GenerateServerCommand => ({
|
|
|
29
29
|
correlationId: 'cor-1',
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
const
|
|
32
|
+
const makeMoment = (name: string): CommandMoment => ({
|
|
33
33
|
name,
|
|
34
34
|
type: 'command',
|
|
35
35
|
client: { specs: [] },
|
|
@@ -38,14 +38,15 @@ const makeSlice = (name: string): CommandSlice => ({
|
|
|
38
38
|
|
|
39
39
|
const makeModel = (): Model => ({
|
|
40
40
|
variant: 'specs',
|
|
41
|
-
|
|
41
|
+
scenes: [
|
|
42
42
|
{
|
|
43
43
|
name: 'Todo',
|
|
44
|
-
|
|
44
|
+
moments: [makeMoment('AddTodo'), makeMoment('RemoveTodo')],
|
|
45
45
|
},
|
|
46
46
|
],
|
|
47
47
|
messages: [],
|
|
48
48
|
modules: [],
|
|
49
|
+
narratives: [],
|
|
49
50
|
});
|
|
50
51
|
|
|
51
52
|
describe('cleanServerDir', () => {
|
|
@@ -100,29 +101,29 @@ describe('cleanServerDir', () => {
|
|
|
100
101
|
});
|
|
101
102
|
});
|
|
102
103
|
|
|
103
|
-
describe('
|
|
104
|
-
it('builds
|
|
105
|
-
const
|
|
104
|
+
describe('createMomentGeneratedEvent', () => {
|
|
105
|
+
it('builds MomentGenerated event from scene, slice, and command', () => {
|
|
106
|
+
const scene: Scene = {
|
|
106
107
|
name: 'PropertyListing',
|
|
107
|
-
|
|
108
|
+
moments: [],
|
|
108
109
|
};
|
|
109
|
-
const slice:
|
|
110
|
+
const slice: CommandMoment = {
|
|
110
111
|
name: 'CreateListing',
|
|
111
112
|
type: 'command',
|
|
112
113
|
client: { specs: [] },
|
|
113
114
|
server: { description: 'Create a listing', specs: [] },
|
|
114
115
|
};
|
|
115
116
|
|
|
116
|
-
const event =
|
|
117
|
+
const event = createMomentGeneratedEvent(scene, slice, makeCommand());
|
|
117
118
|
|
|
118
119
|
expect(event).toEqual({
|
|
119
|
-
type: '
|
|
120
|
+
type: 'MomentGenerated',
|
|
120
121
|
data: {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
sceneName: 'PropertyListing',
|
|
123
|
+
momentName: 'CreateListing',
|
|
124
|
+
momentType: 'command',
|
|
124
125
|
schemaPath: path.join(path.resolve('.'), '.context', 'schema.json'),
|
|
125
|
-
|
|
126
|
+
momentPath: 'server/src/domain/narratives/property-listing/create-listing',
|
|
126
127
|
},
|
|
127
128
|
timestamp: expect.any(Date),
|
|
128
129
|
requestId: 'req-1',
|
|
@@ -131,52 +132,53 @@ describe('createSliceGeneratedEvent', () => {
|
|
|
131
132
|
});
|
|
132
133
|
});
|
|
133
134
|
|
|
134
|
-
describe('
|
|
135
|
-
it('emits
|
|
135
|
+
describe('emitMomentGeneratedForAll', () => {
|
|
136
|
+
it('emits MomentGenerated for every non-experience slice', () => {
|
|
136
137
|
const events: GenerateServerEvents[] = [];
|
|
137
|
-
|
|
138
|
+
emitMomentGeneratedForAll(makeModel(), makeCommand(), events);
|
|
138
139
|
|
|
139
140
|
expect(events).toEqual([
|
|
140
|
-
expect.objectContaining({ type: '
|
|
141
|
-
expect.objectContaining({ type: '
|
|
141
|
+
expect.objectContaining({ type: 'MomentGenerated', data: expect.objectContaining({ momentName: 'AddTodo' }) }),
|
|
142
|
+
expect.objectContaining({ type: 'MomentGenerated', data: expect.objectContaining({ momentName: 'RemoveTodo' }) }),
|
|
142
143
|
]);
|
|
143
144
|
});
|
|
144
145
|
|
|
145
146
|
it('skips experience slices', () => {
|
|
146
147
|
const model: Model = {
|
|
147
148
|
variant: 'specs',
|
|
148
|
-
|
|
149
|
+
scenes: [
|
|
149
150
|
{
|
|
150
151
|
name: 'Todo',
|
|
151
|
-
|
|
152
|
+
moments: [makeMoment('AddTodo'), { name: 'ViewTodos', type: 'experience', client: { specs: [] } }],
|
|
152
153
|
},
|
|
153
154
|
],
|
|
154
155
|
messages: [],
|
|
155
156
|
modules: [],
|
|
157
|
+
narratives: [],
|
|
156
158
|
};
|
|
157
159
|
const events: GenerateServerEvents[] = [];
|
|
158
|
-
|
|
160
|
+
emitMomentGeneratedForAll(model, makeCommand(), events);
|
|
159
161
|
|
|
160
162
|
expect(events).toEqual([
|
|
161
|
-
expect.objectContaining({ type: '
|
|
163
|
+
expect.objectContaining({ type: 'MomentGenerated', data: expect.objectContaining({ momentName: 'AddTodo' }) }),
|
|
162
164
|
]);
|
|
163
165
|
});
|
|
164
166
|
});
|
|
165
167
|
|
|
166
|
-
describe('
|
|
167
|
-
it('emits
|
|
168
|
+
describe('emitMomentGeneratedForAffected', () => {
|
|
169
|
+
it('emits MomentGenerated only for affected slice IDs', () => {
|
|
168
170
|
const events: GenerateServerEvents[] = [];
|
|
169
171
|
const affectedIds = new Set(['todo/add-todo']);
|
|
170
|
-
|
|
172
|
+
emitMomentGeneratedForAffected(makeModel(), affectedIds, makeCommand(), events);
|
|
171
173
|
|
|
172
174
|
expect(events).toEqual([
|
|
173
|
-
expect.objectContaining({ type: '
|
|
175
|
+
expect.objectContaining({ type: 'MomentGenerated', data: expect.objectContaining({ momentName: 'AddTodo' }) }),
|
|
174
176
|
]);
|
|
175
177
|
});
|
|
176
178
|
|
|
177
179
|
it('emits nothing when no slices are affected', () => {
|
|
178
180
|
const events: GenerateServerEvents[] = [];
|
|
179
|
-
|
|
181
|
+
emitMomentGeneratedForAffected(makeModel(), new Set(), makeCommand(), events);
|
|
180
182
|
|
|
181
183
|
expect(events).toEqual([]);
|
|
182
184
|
});
|
|
@@ -247,10 +249,10 @@ describe('writeHealthResolver', () => {
|
|
|
247
249
|
await rm(dir, { recursive: true, force: true });
|
|
248
250
|
});
|
|
249
251
|
|
|
250
|
-
it('creates health resolver at domain/
|
|
252
|
+
it('creates health resolver at domain/narratives/health/query.resolver.ts', async () => {
|
|
251
253
|
await writeHealthResolver(dir);
|
|
252
254
|
|
|
253
|
-
const content = await readFile(join(dir, 'src', 'domain', '
|
|
255
|
+
const content = await readFile(join(dir, 'src', 'domain', 'narratives', 'health', 'query.resolver.ts'), 'utf8');
|
|
254
256
|
expect(content).toContain('HealthResolver');
|
|
255
257
|
expect(content).toContain("return 'ok'");
|
|
256
258
|
expect(content).toContain('@Query(() => String)');
|
|
@@ -288,8 +290,8 @@ describe('writeBiomeConfig', () => {
|
|
|
288
290
|
});
|
|
289
291
|
});
|
|
290
292
|
|
|
291
|
-
describe('
|
|
292
|
-
it('emits
|
|
293
|
+
describe('emitMomentGenerationFailedForFieldIssues', () => {
|
|
294
|
+
it('emits MomentGenerationFailed for command slice referencing message via gherkin step', () => {
|
|
293
295
|
const fieldIssues = [
|
|
294
296
|
{
|
|
295
297
|
messageName: 'AddTodo',
|
|
@@ -298,10 +300,10 @@ describe('emitSliceGenerationFailedForFieldIssues', () => {
|
|
|
298
300
|
];
|
|
299
301
|
const spec: Model = {
|
|
300
302
|
variant: 'specs',
|
|
301
|
-
|
|
303
|
+
scenes: [
|
|
302
304
|
{
|
|
303
305
|
name: 'Todo',
|
|
304
|
-
|
|
306
|
+
moments: [
|
|
305
307
|
{
|
|
306
308
|
name: 'AddTodo',
|
|
307
309
|
type: 'command',
|
|
@@ -326,7 +328,7 @@ describe('emitSliceGenerationFailedForFieldIssues', () => {
|
|
|
326
328
|
},
|
|
327
329
|
],
|
|
328
330
|
},
|
|
329
|
-
} satisfies
|
|
331
|
+
} satisfies CommandMoment,
|
|
330
332
|
],
|
|
331
333
|
},
|
|
332
334
|
],
|
|
@@ -335,15 +337,15 @@ describe('emitSliceGenerationFailedForFieldIssues', () => {
|
|
|
335
337
|
};
|
|
336
338
|
const events: GenerateServerEvents[] = [];
|
|
337
339
|
|
|
338
|
-
|
|
340
|
+
emitMomentGenerationFailedForFieldIssues(fieldIssues, spec, makeCommand(), events);
|
|
339
341
|
|
|
340
342
|
expect(events).toEqual([
|
|
341
343
|
{
|
|
342
|
-
type: '
|
|
344
|
+
type: 'MomentGenerationFailed',
|
|
343
345
|
data: {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
346
|
+
sceneName: 'Todo',
|
|
347
|
+
momentName: 'AddTodo',
|
|
348
|
+
momentType: 'command',
|
|
347
349
|
error: "Field '...' was skipped from 'AddTodo' — not a valid TypeScript identifier",
|
|
348
350
|
model: spec,
|
|
349
351
|
},
|
|
@@ -354,7 +356,7 @@ describe('emitSliceGenerationFailedForFieldIssues', () => {
|
|
|
354
356
|
]);
|
|
355
357
|
});
|
|
356
358
|
|
|
357
|
-
it('emits
|
|
359
|
+
it('emits MomentGenerationFailed for query slice referencing message via data target', () => {
|
|
358
360
|
const fieldIssues = [
|
|
359
361
|
{
|
|
360
362
|
messageName: 'TodoState',
|
|
@@ -363,10 +365,10 @@ describe('emitSliceGenerationFailedForFieldIssues', () => {
|
|
|
363
365
|
];
|
|
364
366
|
const spec: Model = {
|
|
365
367
|
variant: 'specs',
|
|
366
|
-
|
|
368
|
+
scenes: [
|
|
367
369
|
{
|
|
368
370
|
name: 'Todo',
|
|
369
|
-
|
|
371
|
+
moments: [
|
|
370
372
|
{
|
|
371
373
|
name: 'ViewTodos',
|
|
372
374
|
type: 'query',
|
|
@@ -383,7 +385,7 @@ describe('emitSliceGenerationFailedForFieldIssues', () => {
|
|
|
383
385
|
},
|
|
384
386
|
specs: [],
|
|
385
387
|
},
|
|
386
|
-
} satisfies
|
|
388
|
+
} satisfies QueryMoment,
|
|
387
389
|
],
|
|
388
390
|
},
|
|
389
391
|
],
|
|
@@ -392,15 +394,15 @@ describe('emitSliceGenerationFailedForFieldIssues', () => {
|
|
|
392
394
|
};
|
|
393
395
|
const events: GenerateServerEvents[] = [];
|
|
394
396
|
|
|
395
|
-
|
|
397
|
+
emitMomentGenerationFailedForFieldIssues(fieldIssues, spec, makeCommand(), events);
|
|
396
398
|
|
|
397
399
|
expect(events).toEqual([
|
|
398
400
|
{
|
|
399
|
-
type: '
|
|
401
|
+
type: 'MomentGenerationFailed',
|
|
400
402
|
data: {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
403
|
+
sceneName: 'Todo',
|
|
404
|
+
momentName: 'ViewTodos',
|
|
405
|
+
momentType: 'query',
|
|
404
406
|
error: "Field '...' was skipped from 'TodoState' — not a valid TypeScript identifier",
|
|
405
407
|
model: spec,
|
|
406
408
|
},
|
|
@@ -412,14 +414,14 @@ describe('emitSliceGenerationFailedForFieldIssues', () => {
|
|
|
412
414
|
});
|
|
413
415
|
});
|
|
414
416
|
|
|
415
|
-
describe('
|
|
416
|
-
it('emits
|
|
417
|
+
describe('emitMomentGenerationFailedForDuplicates', () => {
|
|
418
|
+
it('emits MomentGenerationFailed for duplicate command in a different scene/slice', () => {
|
|
417
419
|
const model: Model = {
|
|
418
420
|
variant: 'specs',
|
|
419
|
-
|
|
421
|
+
scenes: [
|
|
420
422
|
{
|
|
421
423
|
name: 'Checkout',
|
|
422
|
-
|
|
424
|
+
moments: [
|
|
423
425
|
{
|
|
424
426
|
name: 'PlaceOrder',
|
|
425
427
|
type: 'command',
|
|
@@ -444,12 +446,12 @@ describe('emitSliceGenerationFailedForDuplicates', () => {
|
|
|
444
446
|
},
|
|
445
447
|
],
|
|
446
448
|
},
|
|
447
|
-
} satisfies
|
|
449
|
+
} satisfies CommandMoment,
|
|
448
450
|
],
|
|
449
451
|
},
|
|
450
452
|
{
|
|
451
453
|
name: 'Returns',
|
|
452
|
-
|
|
454
|
+
moments: [
|
|
453
455
|
{
|
|
454
456
|
name: 'ReturnItem',
|
|
455
457
|
type: 'command',
|
|
@@ -474,25 +476,25 @@ describe('emitSliceGenerationFailedForDuplicates', () => {
|
|
|
474
476
|
},
|
|
475
477
|
],
|
|
476
478
|
},
|
|
477
|
-
} satisfies
|
|
479
|
+
} satisfies CommandMoment,
|
|
478
480
|
],
|
|
479
481
|
},
|
|
480
482
|
],
|
|
481
483
|
messages: [],
|
|
482
484
|
modules: [],
|
|
483
485
|
};
|
|
484
|
-
const duplicates = [{ command: 'PlaceOrder',
|
|
486
|
+
const duplicates = [{ command: 'PlaceOrder', existingScene: 'Checkout', existingMoment: 'PlaceOrder' }];
|
|
485
487
|
const events: GenerateServerEvents[] = [];
|
|
486
488
|
|
|
487
|
-
|
|
489
|
+
emitMomentGenerationFailedForDuplicates(duplicates, model, makeCommand(), events);
|
|
488
490
|
|
|
489
491
|
expect(events).toEqual([
|
|
490
492
|
{
|
|
491
|
-
type: '
|
|
493
|
+
type: 'MomentGenerationFailed',
|
|
492
494
|
data: {
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
495
|
+
sceneName: 'Returns',
|
|
496
|
+
momentName: 'ReturnItem',
|
|
497
|
+
momentType: 'command',
|
|
496
498
|
error: "Duplicate command handler: 'PlaceOrder' is already registered in Checkout/PlaceOrder",
|
|
497
499
|
model,
|
|
498
500
|
},
|
|
@@ -505,7 +507,7 @@ describe('emitSliceGenerationFailedForDuplicates', () => {
|
|
|
505
507
|
});
|
|
506
508
|
|
|
507
509
|
describe('createServerFailureEvent', () => {
|
|
508
|
-
it('extracts
|
|
510
|
+
it('extracts scene/slice/type and template from ScaffoldError wrapping TemplateRenderError', () => {
|
|
509
511
|
const rootCause = new TypeError('Cannot read properties of undefined');
|
|
510
512
|
const templateErr = new TemplateRenderError('decide.ts.ejs', rootCause);
|
|
511
513
|
const scaffoldErr = new ScaffoldError('Checkout', 'PlaceOrder', 'command', templateErr);
|
|
@@ -519,9 +521,9 @@ describe('createServerFailureEvent', () => {
|
|
|
519
521
|
destination: '.',
|
|
520
522
|
error: expect.stringContaining('[template=decide.ts.ejs]'),
|
|
521
523
|
model: makeModel(),
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
524
|
+
sceneName: 'Checkout',
|
|
525
|
+
momentName: 'PlaceOrder',
|
|
526
|
+
momentType: 'command',
|
|
525
527
|
},
|
|
526
528
|
timestamp: expect.any(Date),
|
|
527
529
|
requestId: 'req-1',
|
|
@@ -530,7 +532,7 @@ describe('createServerFailureEvent', () => {
|
|
|
530
532
|
expect(event.data.error).toContain('Cannot read properties of undefined');
|
|
531
533
|
});
|
|
532
534
|
|
|
533
|
-
it('returns undefined
|
|
535
|
+
it('returns undefined scene/slice/type for plain Error', () => {
|
|
534
536
|
const plainError = new Error('something went wrong');
|
|
535
537
|
|
|
536
538
|
const event = createServerFailureEvent(makeCommand(), plainError);
|
|
@@ -542,9 +544,9 @@ describe('createServerFailureEvent', () => {
|
|
|
542
544
|
destination: '.',
|
|
543
545
|
error: expect.stringContaining('something went wrong'),
|
|
544
546
|
model: makeModel(),
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
547
|
+
sceneName: undefined,
|
|
548
|
+
momentName: undefined,
|
|
549
|
+
momentType: undefined,
|
|
548
550
|
},
|
|
549
551
|
timestamp: expect.any(Date),
|
|
550
552
|
requestId: 'req-1',
|
|
@@ -562,9 +564,9 @@ describe('createServerFailureEvent', () => {
|
|
|
562
564
|
destination: '.',
|
|
563
565
|
error: 'Unknown error occurred',
|
|
564
566
|
model: makeModel(),
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
567
|
+
sceneName: undefined,
|
|
568
|
+
momentName: undefined,
|
|
569
|
+
momentType: undefined,
|
|
568
570
|
},
|
|
569
571
|
timestamp: expect.any(Date),
|
|
570
572
|
requestId: 'req-1',
|