@auto-engineer/server-generator-apollo-emmett 0.11.9 → 0.11.11

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 (134) hide show
  1. package/.turbo/turbo-build.log +5 -6
  2. package/.turbo/turbo-format.log +1 -1
  3. package/.turbo/turbo-lint.log +1 -1
  4. package/.turbo/turbo-test.log +4 -4
  5. package/.turbo/turbo-type-check.log +1 -1
  6. package/CHANGELOG.md +18 -0
  7. package/dist/src/codegen/extract/commands.d.ts +1 -1
  8. package/dist/src/codegen/extract/commands.d.ts.map +1 -1
  9. package/dist/src/codegen/extract/data-sink.d.ts +1 -1
  10. package/dist/src/codegen/extract/data-sink.d.ts.map +1 -1
  11. package/dist/src/codegen/extract/events.d.ts +1 -1
  12. package/dist/src/codegen/extract/events.d.ts.map +1 -1
  13. package/dist/src/codegen/extract/gwt.d.ts +1 -1
  14. package/dist/src/codegen/extract/gwt.d.ts.map +1 -1
  15. package/dist/src/codegen/extract/index.d.ts +1 -0
  16. package/dist/src/codegen/extract/index.d.ts.map +1 -1
  17. package/dist/src/codegen/extract/index.js +1 -0
  18. package/dist/src/codegen/extract/index.js.map +1 -1
  19. package/dist/src/codegen/extract/messages.d.ts +1 -1
  20. package/dist/src/codegen/extract/messages.d.ts.map +1 -1
  21. package/dist/src/codegen/extract/projection.d.ts +1 -1
  22. package/dist/src/codegen/extract/projection.d.ts.map +1 -1
  23. package/dist/src/codegen/extract/query.d.ts +1 -1
  24. package/dist/src/codegen/extract/query.d.ts.map +1 -1
  25. package/dist/src/codegen/extract/states.d.ts +1 -1
  26. package/dist/src/codegen/extract/states.d.ts.map +1 -1
  27. package/dist/src/codegen/extract/type-helpers.d.ts +13 -0
  28. package/dist/src/codegen/extract/type-helpers.d.ts.map +1 -0
  29. package/dist/src/codegen/extract/type-helpers.js +98 -0
  30. package/dist/src/codegen/extract/type-helpers.js.map +1 -0
  31. package/dist/src/codegen/scaffoldFromSchema.d.ts +3 -3
  32. package/dist/src/codegen/scaffoldFromSchema.d.ts.map +1 -1
  33. package/dist/src/codegen/scaffoldFromSchema.js +202 -19
  34. package/dist/src/codegen/scaffoldFromSchema.js.map +1 -1
  35. package/dist/src/codegen/templates/command/commands.specs.ts +3 -3
  36. package/dist/src/codegen/templates/command/commands.ts.ejs +14 -9
  37. package/dist/src/codegen/templates/command/decide.specs.specs.ts +54 -54
  38. package/dist/src/codegen/templates/command/decide.specs.ts +13 -9
  39. package/dist/src/codegen/templates/command/decide.ts.ejs +1 -0
  40. package/dist/src/codegen/templates/command/events.specs.ts +3 -3
  41. package/dist/src/codegen/templates/command/events.ts.ejs +16 -13
  42. package/dist/src/codegen/templates/command/evolve.specs.ts +3 -3
  43. package/dist/src/codegen/templates/command/handle.specs.ts +10 -5
  44. package/dist/src/codegen/templates/command/mutation.resolver.specs.ts +8 -7
  45. package/dist/src/codegen/templates/command/mutation.resolver.ts.ejs +2 -23
  46. package/dist/src/codegen/templates/command/register.specs.ts +4 -4
  47. package/dist/src/codegen/templates/command/register.ts.ejs +1 -4
  48. package/dist/src/codegen/templates/command/state.specs.ts +54 -50
  49. package/dist/src/codegen/templates/command/state.ts.ejs +8 -4
  50. package/dist/src/codegen/templates/query/projection.specs.specs.ts +7 -7
  51. package/dist/src/codegen/templates/query/projection.specs.ts +24 -7
  52. package/dist/src/codegen/templates/query/projection.ts.ejs +64 -12
  53. package/dist/src/codegen/templates/query/query.resolver.specs.ts +19 -16
  54. package/dist/src/codegen/templates/query/query.resolver.ts.ejs +11 -49
  55. package/dist/src/codegen/templates/query/state.specs.ts +3 -3
  56. package/dist/src/codegen/templates/react/react.specs.specs.ts +3 -3
  57. package/dist/src/codegen/templates/react/react.specs.ts +3 -3
  58. package/dist/src/codegen/templates/react/react.ts.ejs +0 -1
  59. package/dist/src/codegen/templates/react/register.specs.ts +3 -3
  60. package/dist/src/codegen/templates/react/register.ts.ejs +0 -1
  61. package/dist/src/codegen/test-data/specVariant1.d.ts +1 -1
  62. package/dist/src/codegen/test-data/specVariant1.d.ts.map +1 -1
  63. package/dist/src/codegen/test-data/specVariant1.js +1 -1
  64. package/dist/src/codegen/test-data/specVariant1.js.map +1 -1
  65. package/dist/src/codegen/types.d.ts +1 -1
  66. package/dist/src/codegen/types.d.ts.map +1 -1
  67. package/dist/src/commands/generate-server.d.ts +0 -1
  68. package/dist/src/commands/generate-server.d.ts.map +1 -1
  69. package/dist/src/commands/generate-server.js +53 -31
  70. package/dist/src/commands/generate-server.js.map +1 -1
  71. package/dist/src/domain/shared/graphql-types.d.ts +10 -0
  72. package/dist/src/domain/shared/graphql-types.d.ts.map +1 -0
  73. package/dist/src/domain/shared/graphql-types.js +40 -0
  74. package/dist/src/domain/shared/graphql-types.js.map +1 -0
  75. package/dist/src/domain/shared/graphql-types.ts +20 -0
  76. package/dist/src/domain/shared/index.d.ts +1 -0
  77. package/dist/src/domain/shared/index.d.ts.map +1 -1
  78. package/dist/src/domain/shared/index.js +1 -0
  79. package/dist/src/domain/shared/index.js.map +1 -1
  80. package/dist/src/domain/shared/index.ts +1 -0
  81. package/dist/src/domain/shared/sendCommand.d.ts +1 -1
  82. package/dist/src/domain/shared/sendCommand.d.ts.map +1 -1
  83. package/dist/src/domain/shared/sendCommand.ts +1 -1
  84. package/dist/src/domain/shared/types.d.ts +5 -7
  85. package/dist/src/domain/shared/types.d.ts.map +1 -1
  86. package/dist/src/domain/shared/types.js +11 -38
  87. package/dist/src/domain/shared/types.js.map +1 -1
  88. package/dist/src/domain/shared/types.ts +10 -16
  89. package/dist/tsconfig.tsbuildinfo +1 -1
  90. package/package.json +4 -4
  91. package/src/codegen/extract/commands.ts +1 -1
  92. package/src/codegen/extract/data-sink.ts +1 -1
  93. package/src/codegen/extract/events.ts +1 -1
  94. package/src/codegen/extract/gwt.ts +1 -1
  95. package/src/codegen/extract/index.ts +1 -0
  96. package/src/codegen/extract/messages.ts +1 -1
  97. package/src/codegen/extract/projection.ts +1 -1
  98. package/src/codegen/extract/query.ts +1 -1
  99. package/src/codegen/extract/states.ts +1 -1
  100. package/src/codegen/extract/type-helpers.ts +102 -0
  101. package/src/codegen/scaffoldFromSchema.ts +283 -25
  102. package/src/codegen/templates/command/commands.specs.ts +3 -3
  103. package/src/codegen/templates/command/commands.ts.ejs +14 -9
  104. package/src/codegen/templates/command/decide.specs.specs.ts +54 -54
  105. package/src/codegen/templates/command/decide.specs.ts +13 -9
  106. package/src/codegen/templates/command/decide.ts.ejs +1 -0
  107. package/src/codegen/templates/command/events.specs.ts +3 -3
  108. package/src/codegen/templates/command/events.ts.ejs +16 -13
  109. package/src/codegen/templates/command/evolve.specs.ts +3 -3
  110. package/src/codegen/templates/command/handle.specs.ts +10 -5
  111. package/src/codegen/templates/command/mutation.resolver.specs.ts +8 -7
  112. package/src/codegen/templates/command/mutation.resolver.ts.ejs +2 -23
  113. package/src/codegen/templates/command/register.specs.ts +4 -4
  114. package/src/codegen/templates/command/register.ts.ejs +1 -4
  115. package/src/codegen/templates/command/state.specs.ts +54 -50
  116. package/src/codegen/templates/command/state.ts.ejs +8 -4
  117. package/src/codegen/templates/query/projection.specs.specs.ts +7 -7
  118. package/src/codegen/templates/query/projection.specs.ts +24 -7
  119. package/src/codegen/templates/query/projection.ts.ejs +64 -12
  120. package/src/codegen/templates/query/query.resolver.specs.ts +19 -16
  121. package/src/codegen/templates/query/query.resolver.ts.ejs +11 -49
  122. package/src/codegen/templates/query/state.specs.ts +3 -3
  123. package/src/codegen/templates/react/react.specs.specs.ts +3 -3
  124. package/src/codegen/templates/react/react.specs.ts +3 -3
  125. package/src/codegen/templates/react/react.ts.ejs +0 -1
  126. package/src/codegen/templates/react/register.specs.ts +3 -3
  127. package/src/codegen/templates/react/register.ts.ejs +0 -1
  128. package/src/codegen/test-data/specVariant1.ts +2 -2
  129. package/src/codegen/types.ts +1 -1
  130. package/src/commands/generate-server.ts +63 -34
  131. package/src/domain/shared/graphql-types.ts +20 -0
  132. package/src/domain/shared/index.ts +1 -0
  133. package/src/domain/shared/sendCommand.ts +1 -1
  134. package/src/domain/shared/types.ts +10 -16
@@ -1,12 +1,12 @@
1
1
  import { describe, it, expect } from 'vitest';
2
2
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
3
- import { Model as SpecsSchema } from '@auto-engineer/flow';
3
+ import { Model as SpecsSchema } from '@auto-engineer/narrative';
4
4
 
5
5
  describe('state.ts.ejs', () => {
6
6
  it('should generate a valid state definition file for a query slice with a state message', async () => {
7
7
  const spec: SpecsSchema = {
8
8
  variant: 'specs',
9
- flows: [
9
+ narratives: [
10
10
  {
11
11
  name: 'Inventory management',
12
12
  slices: [
@@ -52,7 +52,7 @@ describe('state.ts.ejs', () => {
52
52
  ],
53
53
  };
54
54
 
55
- const plans = await generateScaffoldFilePlans(spec.flows, spec.messages, undefined, 'src/domain/flows');
55
+ const plans = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
56
56
  const stateFile = plans.find((p) => p.outputPath.endsWith('state.ts'));
57
57
 
58
58
  expect(stateFile?.contents).toMatchInlineSnapshot(`
@@ -1,12 +1,12 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { Model as SpecsSchema } from '@auto-engineer/flow';
2
+ import { Model as SpecsSchema } from '@auto-engineer/narrative';
3
3
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
4
4
 
5
5
  describe('react.specs.ts.ejs (react slice)', () => {
6
6
  it('should generate correct react.specs.ts', async () => {
7
7
  const spec: SpecsSchema = {
8
8
  variant: 'specs',
9
- flows: [
9
+ narratives: [
10
10
  {
11
11
  name: 'manage bookings',
12
12
  slices: [
@@ -161,7 +161,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
161
161
  ],
162
162
  };
163
163
 
164
- const plans = await generateScaffoldFilePlans(spec.flows, spec.messages, undefined, 'src/domain/flows');
164
+ const plans = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
165
165
 
166
166
  const specFile = plans.find((p) => p.outputPath.endsWith('react.specs.ts'));
167
167
  expect(specFile?.contents).toMatchInlineSnapshot(`
@@ -1,12 +1,12 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { Model as SpecsSchema } from '@auto-engineer/flow';
2
+ import { Model as SpecsSchema } from '@auto-engineer/narrative';
3
3
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
4
4
 
5
5
  describe('handle.ts.ejs (react slice)', () => {
6
6
  it('should generate correct react.ts', async () => {
7
7
  const spec: SpecsSchema = {
8
8
  variant: 'specs',
9
- flows: [
9
+ narratives: [
10
10
  {
11
11
  name: 'manage bookings',
12
12
  slices: [
@@ -215,7 +215,7 @@ describe('handle.ts.ejs (react slice)', () => {
215
215
  ],
216
216
  };
217
217
 
218
- const plans = await generateScaffoldFilePlans(spec.flows, spec.messages, undefined, 'src/domain/flows');
218
+ const plans = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
219
219
  const handleFile = plans.find((p) => p.outputPath.endsWith('react.ts'));
220
220
 
221
221
  expect(handleFile?.contents).toMatchInlineSnapshot(`
@@ -1,5 +1,4 @@
1
1
  <%
2
- // Extract the first example from specs/rules structure
3
2
  const specs = slice.server?.specs;
4
3
  const firstExample = specs?.rules?.flatMap(rule => rule.examples)[0] ?? null;
5
4
  const gwt = firstExample ? {
@@ -1,12 +1,12 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { Model as SpecsSchema } from '@auto-engineer/flow';
2
+ import { Model as SpecsSchema } from '@auto-engineer/narrative';
3
3
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
4
4
 
5
5
  describe('register.ts.ejs (react slice)', () => {
6
6
  it('should generate correct register.ts', async () => {
7
7
  const spec: SpecsSchema = {
8
8
  variant: 'specs',
9
- flows: [
9
+ narratives: [
10
10
  {
11
11
  name: 'manage bookings',
12
12
  slices: [
@@ -215,7 +215,7 @@ describe('register.ts.ejs (react slice)', () => {
215
215
  ],
216
216
  };
217
217
 
218
- const plans = await generateScaffoldFilePlans(spec.flows, spec.messages, undefined, 'src/domain/flows');
218
+ const plans = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
219
219
  const registerFile = plans.find((p) => p.outputPath.endsWith('send-notification-to-host/register.ts'));
220
220
 
221
221
  expect(registerFile?.contents).toMatchInlineSnapshot(`
@@ -1,5 +1,4 @@
1
1
  <%
2
- // Extract the first example from specs/rules structure
3
2
  const specs = slice.server?.specs;
4
3
  const firstExample = specs?.rules?.flatMap(rule => rule.examples)[0] ?? null;
5
4
  const gwt = firstExample ? {
@@ -1,8 +1,8 @@
1
- import { Model as SpecsSchema } from '@auto-engineer/flow';
1
+ import { Model as SpecsSchema } from '@auto-engineer/narrative';
2
2
 
3
3
  const specVariant1: SpecsSchema = {
4
4
  variant: 'specs',
5
- flows: [
5
+ narratives: [
6
6
  {
7
7
  name: 'Add item',
8
8
  description: 'Flow to add items to a system',
@@ -1,4 +1,4 @@
1
- import { CommandExample, EventExample, StateExample } from '@auto-engineer/flow';
1
+ import { CommandExample, EventExample, StateExample } from '@auto-engineer/narrative';
2
2
 
3
3
  export interface Message {
4
4
  type: string;
@@ -1,4 +1,3 @@
1
- import 'reflect-metadata';
2
1
  import fs from 'fs-extra';
3
2
  import * as path from 'path';
4
3
  import { readFile, writeFile } from 'fs/promises';
@@ -6,7 +5,7 @@ import { resolve, join } from 'path';
6
5
  import { existsSync } from 'fs';
7
6
  import { generateScaffoldFilePlans, writeScaffoldFilePlans } from '../codegen/scaffoldFromSchema';
8
7
  import { ensureDirExists, ensureDirPath, toKebabCase } from '../codegen/utils/path';
9
- import { Model } from '@auto-engineer/flow';
8
+ import { Model } from '@auto-engineer/narrative';
10
9
  import { fileURLToPath } from 'url';
11
10
  import { dirname } from 'path';
12
11
  import { execa } from 'execa';
@@ -124,7 +123,7 @@ async function readAndParseModel(absModel: string): Promise<Model> {
124
123
  const spec = JSON.parse(content) as Model;
125
124
 
126
125
  debugModel('Parsed model:');
127
- debugModel(' Flows: %d', spec.flows?.length || 0);
126
+ debugModel(' Flows: %d', spec.narratives?.length || 0);
128
127
  debugModel(' Messages: %d', spec.messages?.length || 0);
129
128
  debugModel(' Integrations: %d', spec.integrations?.length ?? 0);
130
129
 
@@ -133,12 +132,12 @@ async function readAndParseModel(absModel: string): Promise<Model> {
133
132
  }
134
133
 
135
134
  function logFlowDetails(spec: Model): void {
136
- if (spec.flows !== undefined && spec.flows.length > 0) {
135
+ if (spec.narratives !== undefined && spec.narratives.length > 0) {
137
136
  debugModel(
138
137
  'Flow names: %o',
139
- spec.flows.map((f) => f.name),
138
+ spec.narratives.map((f) => f.name),
140
139
  );
141
- spec.flows.forEach((flow) => {
140
+ spec.narratives.forEach((flow) => {
142
141
  debugModel(' Flow "%s" has %d slices', flow.name, flow.slices?.length || 0);
143
142
  flow.slices?.forEach((slice) => {
144
143
  debugModel(' Slice: %s (type: %s)', slice.name, slice.type);
@@ -147,13 +146,40 @@ function logFlowDetails(spec: Model): void {
147
146
  }
148
147
  }
149
148
 
149
+ async function cleanStaleCompiledFiles(serverDir: string): Promise<void> {
150
+ const sharedTypesDir = join(serverDir, 'src', 'domain', 'shared');
151
+ debugScaffold('Cleaning stale compiled files from %s', sharedTypesDir);
152
+
153
+ if (!(await fs.pathExists(sharedTypesDir))) {
154
+ debugScaffold(' Shared types directory does not exist, skipping cleanup');
155
+ return;
156
+ }
157
+
158
+ const files = await fs.readdir(sharedTypesDir);
159
+ const staleFiles = files.filter((file) => file.endsWith('.js') || file.endsWith('.d.ts') || file.endsWith('.js.map'));
160
+
161
+ if (staleFiles.length === 0) {
162
+ debugScaffold(' No stale compiled files found');
163
+ return;
164
+ }
165
+
166
+ debugScaffold(' Found %d stale compiled files to remove', staleFiles.length);
167
+ for (const file of staleFiles) {
168
+ const filePath = join(sharedTypesDir, file);
169
+ await fs.remove(filePath);
170
+ debugScaffold(' Removed: %s', file);
171
+ }
172
+
173
+ debugScaffold(' Cleanup completed');
174
+ }
175
+
150
176
  async function generateAndWriteScaffold(spec: Model, serverDir: string): Promise<void> {
151
177
  const domainFlowsPath = join(serverDir, 'src', 'domain', 'flows');
152
178
  debugScaffold('Generating scaffold file plans');
153
179
  debugScaffold(' Domain flows path: %s', domainFlowsPath);
154
- debugScaffold(' Number of flows: %d', spec.flows?.length || 0);
180
+ debugScaffold(' Number of flows: %d', spec.narratives?.length || 0);
155
181
 
156
- const filePlans = await generateScaffoldFilePlans(spec.flows, spec.messages, spec.integrations, domainFlowsPath);
182
+ const filePlans = await generateScaffoldFilePlans(spec.narratives, spec.messages, spec.integrations, domainFlowsPath);
157
183
 
158
184
  debugScaffold('Generated %d file plans', filePlans.length);
159
185
  if (filePlans.length > 0) {
@@ -165,6 +191,8 @@ async function generateAndWriteScaffold(spec: Model, serverDir: string): Promise
165
191
 
166
192
  await writeScaffoldFilePlans(filePlans);
167
193
  debugScaffold('Written all scaffold files');
194
+
195
+ await cleanStaleCompiledFiles(serverDir);
168
196
  }
169
197
 
170
198
  async function copyAllFiles(serverDir: string): Promise<void> {
@@ -257,13 +285,19 @@ export async function handleGenerateServerCommandInternal(
257
285
  debug('Server directory: %s', serverDir);
258
286
  debug('🔄 Generating server... %s', serverDir);
259
287
 
288
+ debug('Clearing existing server directory if it exists');
289
+ await fs.remove(serverDir);
290
+ debug('Server directory cleared');
291
+
260
292
  await ensureDirExists(serverDir);
261
293
  debugFiles('Created server directory: %s', serverDir);
262
294
 
295
+ await copyAllFiles(serverDir);
296
+
263
297
  await generateAndWriteScaffold(spec, serverDir);
264
298
 
265
- if (Array.isArray(spec.flows) && spec.flows.length > 0) {
266
- for (const flow of spec.flows) {
299
+ if (Array.isArray(spec.narratives) && spec.narratives.length > 0) {
300
+ for (const flow of spec.narratives) {
267
301
  if (Array.isArray(flow.slices) && flow.slices.length > 0) {
268
302
  for (const slice of flow.slices) {
269
303
  if (slice.type === 'experience') continue; // skip experience slices
@@ -287,9 +321,6 @@ export async function handleGenerateServerCommandInternal(
287
321
  }
288
322
  }
289
323
 
290
- // Copy files
291
- await copyAllFiles(serverDir);
292
-
293
324
  // Write configuration files
294
325
  await writeConfigurationFiles(serverDir, absDest);
295
326
 
@@ -348,7 +379,16 @@ async function copySharedAndRootFiles(from: string, to: string): Promise<void> {
348
379
  const sharedFrom = path.join(from, 'shared');
349
380
  const sharedTo = path.join(to, 'shared');
350
381
  if (await fs.pathExists(sharedFrom)) {
351
- await fs.copy(sharedFrom, sharedTo);
382
+ await fs.ensureDir(sharedTo);
383
+ const sharedFiles = await fs.readdir(sharedFrom);
384
+ for (const file of sharedFiles) {
385
+ if (file.endsWith('.ts')) {
386
+ const srcFile = path.join(sharedFrom, file);
387
+ const destFile = path.join(sharedTo, file);
388
+ await fs.copy(srcFile, destFile);
389
+ debugFiles(' Copied shared file: %s', file);
390
+ }
391
+ }
352
392
  }
353
393
  await fs.ensureDir(to);
354
394
  const rootFiles = await fs.readdir(from);
@@ -529,27 +569,16 @@ async function installDependenciesAndGenerateSchema(serverDir: string, workingDi
529
569
  debugDeps('Starting dependency installation in %s', serverDir);
530
570
  debugDeps('Hint: You can debug by manually running: cd server && pnpm install && npx tsx scripts/generate-schema.ts');
531
571
 
532
- try {
533
- debugDeps('Running pnpm install');
534
- await execa('pnpm', ['install', '--ignore-workspace'], { cwd: serverDir });
535
- debugDeps('Dependencies installed successfully');
536
- } catch (error) {
537
- debugDeps('Failed to pnpm install: %s', error instanceof Error ? error.message : 'Unknown error');
538
- }
572
+ debugDeps('Running pnpm install');
573
+ await execa('pnpm', ['install', '--ignore-workspace'], { cwd: serverDir });
574
+ debugDeps('Dependencies installed successfully');
539
575
 
540
- try {
541
- debugDeps('Generating GraphQL schema...');
542
- debugDeps('Running: tsx scripts/generate-schema.ts', serverDir + '/scripts/generate-schema.ts');
543
- await execa('tsx', ['scripts/generate-schema.ts'], { cwd: serverDir });
544
- const schemaPath = join(workingDir, '.context', 'schema.graphql');
545
- debugDeps('GraphQL schema generated at: %s', schemaPath);
546
- } catch (error) {
547
- debugDeps(
548
- 'Failed to run tsx scripts/generate-schema.ts: %s',
549
- error instanceof Error ? error.message : 'Unknown error',
550
- );
551
- }
576
+ debugDeps('Generating GraphQL schema...');
577
+ debugDeps('Running: npx tsx scripts/generate-schema.ts');
578
+ const result = await execa('npx', ['tsx', 'scripts/generate-schema.ts'], { cwd: serverDir });
579
+ debugDeps('Schema generation output: %s', result.stdout);
580
+ const schemaPath = join(workingDir, '.context', 'schema.graphql');
581
+ debugDeps('GraphQL schema generated at: %s', schemaPath);
552
582
  }
553
583
 
554
- // Default export is the command handler
555
584
  export default commandHandler;
@@ -0,0 +1,20 @@
1
+ import 'reflect-metadata';
2
+ import { Field, ObjectType } from 'type-graphql';
3
+
4
+ @ObjectType()
5
+ export class MutationError {
6
+ @Field(() => String)
7
+ type!: string;
8
+
9
+ @Field(() => String, { nullable: true })
10
+ message?: string;
11
+ }
12
+
13
+ @ObjectType()
14
+ export class MutationResponse {
15
+ @Field(() => Boolean)
16
+ success!: boolean;
17
+
18
+ @Field(() => MutationError, { nullable: true })
19
+ error?: MutationError;
20
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './types';
2
+ export * from './graphql-types';
2
3
  export * from './ReadModel';
3
4
  export * from './reactorSpecification';
4
5
  export * from './sendCommand';
@@ -1,5 +1,5 @@
1
1
  import type { Command, CommandSender } from '@event-driven-io/emmett';
2
- import type { MutationResponse } from './types';
2
+ import type { MutationResponse } from './graphql-types';
3
3
 
4
4
  export async function sendCommand<T extends Command>(
5
5
  commandSender: CommandSender,
@@ -1,5 +1,7 @@
1
+ import { registerEnumType } from 'type-graphql';
2
+
3
+ import 'reflect-metadata';
1
4
  import { CommandSender, EventStore, type InMemoryDatabase } from '@event-driven-io/emmett';
2
- import { Field, ObjectType } from 'type-graphql';
3
5
 
4
6
  export interface ReactorContext {
5
7
  eventStore: EventStore;
@@ -14,20 +16,12 @@ export interface GraphQLContext {
14
16
  database: InMemoryDatabase;
15
17
  }
16
18
 
17
- @ObjectType()
18
- export class MutationError {
19
- @Field(() => String)
20
- type!: string;
21
-
22
- @Field(() => String, { nullable: true })
23
- message?: string;
19
+ export enum QuestionnaireProgressStatus {
20
+ IN_PROGRESS = 'in_progress',
21
+ READY_TO_SUBMIT = 'ready_to_submit',
22
+ SUBMITTED = 'submitted',
24
23
  }
25
24
 
26
- @ObjectType()
27
- export class MutationResponse {
28
- @Field(() => Boolean)
29
- success!: boolean;
30
-
31
- @Field(() => MutationError, { nullable: true })
32
- error?: MutationError;
33
- }
25
+ registerEnumType(QuestionnaireProgressStatus, {
26
+ name: 'QuestionnaireProgressStatus',
27
+ });