@auto-engineer/server-generator-apollo-emmett 1.110.7 → 1.112.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 (36) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +5 -5
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +66 -0
  5. package/README.md +0 -1
  6. package/dist/src/codegen/extract/messages.d.ts.map +1 -1
  7. package/dist/src/codegen/extract/messages.js +20 -14
  8. package/dist/src/codegen/extract/messages.js.map +1 -1
  9. package/dist/src/codegen/scaffoldFromSchema.js +2 -2
  10. package/dist/src/codegen/scaffoldFromSchema.js.map +1 -1
  11. package/dist/src/codegen/templates/command/decide.specs.specs.ts +67 -0
  12. package/dist/src/codegen/templates/command/decide.specs.ts.ejs +1 -1
  13. package/dist/src/codegen/templates/query/query.resolver.specs.ts +65 -0
  14. package/dist/src/codegen/templates/query/query.resolver.ts.ejs +15 -6
  15. package/dist/src/commands/generate-server.d.ts +0 -2
  16. package/dist/src/commands/generate-server.d.ts.map +1 -1
  17. package/dist/src/commands/generate-server.js +6 -76
  18. package/dist/src/commands/generate-server.js.map +1 -1
  19. package/dist/src/commands/initialize-server.d.ts.map +1 -1
  20. package/dist/src/commands/initialize-server.js +0 -41
  21. package/dist/src/commands/initialize-server.js.map +1 -1
  22. package/dist/tsconfig.tsbuildinfo +1 -1
  23. package/ketchup-plan.md +5 -0
  24. package/package.json +4 -4
  25. package/src/codegen/extract/messages.specs.ts +172 -0
  26. package/src/codegen/extract/messages.ts +22 -14
  27. package/src/codegen/findEventSource.specs.ts +54 -0
  28. package/src/codegen/scaffoldFromSchema.ts +2 -2
  29. package/src/codegen/templates/command/decide.specs.specs.ts +67 -0
  30. package/src/codegen/templates/command/decide.specs.ts.ejs +1 -1
  31. package/src/codegen/templates/query/query.resolver.specs.ts +65 -0
  32. package/src/codegen/templates/query/query.resolver.ts.ejs +15 -6
  33. package/src/commands/generate-server.specs.ts +1 -4
  34. package/src/commands/generate-server.ts +8 -90
  35. package/src/commands/initialize-server.specs.ts +1 -1
  36. package/src/commands/initialize-server.ts +0 -48
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'node:url';
5
5
  import { type Command, defineCommandHandler, type Event } from '@auto-engineer/message-bus';
6
6
  import type { Model, Narrative, Slice } from '@auto-engineer/narrative';
7
7
  import createDebug from 'debug';
8
- import { execa } from 'execa';
8
+
9
9
  import fs from 'fs-extra';
10
10
  import {
11
11
  type DuplicateCommandInfo,
@@ -19,7 +19,7 @@ import { ensureDirExists, ensureDirPath, toKebabCase } from '../codegen/utils/pa
19
19
 
20
20
  const debug = createDebug('auto:server-generator-apollo-emmett');
21
21
  const debugFiles = createDebug('auto:server-generator-apollo-emmett:files');
22
- const debugDeps = createDebug('auto:server-generator-apollo-emmett:deps');
22
+
23
23
  const debugScaffold = createDebug('auto:server-generator-apollo-emmett:scaffold');
24
24
 
25
25
  const __filename = fileURLToPath(import.meta.url);
@@ -71,7 +71,6 @@ export type ServerGeneratedEvent = Event<
71
71
  modelPath: string;
72
72
  destination: string;
73
73
  serverDir: string;
74
- contextSchemaGraphQL?: string;
75
74
  }
76
75
  >;
77
76
 
@@ -166,7 +165,7 @@ export async function writeModelToDisk(model: Model, destination: string): Promi
166
165
  }
167
166
 
168
167
  export async function cleanServerDir(serverDir: string): Promise<void> {
169
- const dirsToRemove = ['src', 'scripts', 'dist'];
168
+ const dirsToRemove = ['src', 'dist'];
170
169
  for (const dir of dirsToRemove) {
171
170
  await fs.remove(join(serverDir, dir));
172
171
  }
@@ -276,7 +275,7 @@ export class HealthResolver {
276
275
  debugFiles('Wrote health resolver: %s', resolverPath);
277
276
  }
278
277
 
279
- async function writeConfigurationFiles(serverDir: string, absDest: string): Promise<void> {
278
+ async function writeConfigurationFiles(serverDir: string): Promise<void> {
280
279
  debugFiles(`Writing package.json... to ${serverDir}`);
281
280
  await writePackage(serverDir);
282
281
 
@@ -285,23 +284,15 @@ async function writeConfigurationFiles(serverDir: string, absDest: string): Prom
285
284
 
286
285
  debugFiles(`Writing vitest config... to ${serverDir}`);
287
286
  await writeVitestConfig(serverDir);
288
-
289
- debugFiles(`Generating GraphQL schema script... ${serverDir} to ${absDest}`);
290
- await generateSchemaScript(serverDir, absDest);
291
287
  }
292
288
 
293
- function createServerSuccessEvent(
294
- command: GenerateServerCommand,
295
- serverDir: string,
296
- absDest: string,
297
- ): ServerGeneratedEvent {
289
+ function createServerSuccessEvent(command: GenerateServerCommand, serverDir: string): ServerGeneratedEvent {
298
290
  return {
299
291
  type: 'ServerGenerated',
300
292
  data: {
301
293
  modelPath: deriveModelPath(command.data.destination),
302
294
  destination: command.data.destination,
303
295
  serverDir,
304
- contextSchemaGraphQL: join(absDest, '.context', 'schema.graphql'),
305
296
  },
306
297
  timestamp: new Date(),
307
298
  requestId: command.requestId,
@@ -554,9 +545,7 @@ export async function handleGenerateServerCommandInternal(
554
545
  await copyAllFiles(serverDir);
555
546
  const { duplicateCommands, fieldIssues } = await generateAndWriteScaffold(spec, serverDir);
556
547
  emitSliceGeneratedForAll(spec, command, events, duplicateCommands, fieldIssues);
557
- await writeConfigurationFiles(serverDir, absDest);
558
- debugDeps('Installing dependencies and generating GraphQL schema...');
559
- await installDependenciesAndGenerateSchema(serverDir, absDest);
548
+ await writeConfigurationFiles(serverDir);
560
549
  } else if (changeSet.allAffected.length === 0 && changeSet.removed.length === 0) {
561
550
  debug('No changes detected, skipping scaffold generation');
562
551
  emitSliceGeneratedForAll(spec, command, events);
@@ -574,9 +563,7 @@ export async function handleGenerateServerCommandInternal(
574
563
  const affectedIds = new Set(changeSet.allAffected);
575
564
  const { duplicateCommands, fieldIssues } = await generateAndWriteScaffold(spec, serverDir, affectedIds);
576
565
  emitSliceGeneratedForAffected(spec, affectedIds, command, events, duplicateCommands, fieldIssues);
577
- await writeConfigurationFiles(serverDir, absDest);
578
- debugDeps('Installing dependencies and generating GraphQL schema...');
579
- await installDependenciesAndGenerateSchema(serverDir, absDest);
566
+ await writeConfigurationFiles(serverDir);
580
567
  }
581
568
 
582
569
  if (newState) {
@@ -584,7 +571,7 @@ export async function handleGenerateServerCommandInternal(
584
571
  }
585
572
 
586
573
  debug('Server generation completed successfully');
587
- events.push(createServerSuccessEvent(command, serverDir, absDest));
574
+ events.push(createServerSuccessEvent(command, serverDir));
588
575
  return events;
589
576
  } catch (error) {
590
577
  return [createServerFailureEvent(command, error)];
@@ -770,73 +757,4 @@ export default defineConfig({
770
757
  await writeFile(path.join(dest, 'vitest.config.ts'), vitestConfig, 'utf-8');
771
758
  }
772
759
 
773
- export async function generateSchemaScript(serverDir: string, workingDir: string): Promise<void> {
774
- const contextDir = path.resolve(`${workingDir}`, '.context');
775
- await ensureDirExists(contextDir);
776
-
777
- const scriptsDir = join(serverDir, 'scripts');
778
- await ensureDirExists(scriptsDir);
779
-
780
- const schemaScriptContent = `import 'reflect-metadata';
781
- import { buildSchema } from 'type-graphql';
782
- import { printSchema } from 'graphql';
783
- import { writeFile } from 'fs/promises';
784
- import * as path from 'path';
785
- import { loadResolvers } from '../src/utils/loadResolvers.js';
786
-
787
- async function main() {
788
- try {
789
- const resolvers = await loadResolvers('src/domain/flows/**/*.resolver.{ts,js}');
790
- const schema = await buildSchema({
791
- resolvers: resolvers as any,
792
- emitSchemaFile: false,
793
- });
794
- const printedSchema = printSchema(schema);
795
-
796
- const contextDir = path.resolve('${workingDir}', '.context');
797
- const schemaPath = path.join(contextDir, 'schema.graphql');
798
- await writeFile(schemaPath, printedSchema, 'utf-8');
799
-
800
- console.log(\`✅ GraphQL schema generated at: \${schemaPath}\`);
801
- } catch (error) {
802
- console.error(\`❌ GraphQL schema generation failed: \${error instanceof Error ? error.message : 'Unknown error'}\`);
803
- process.exit(1);
804
- }
805
- }
806
-
807
- main().catch((err) => {
808
- console.error(err);
809
- process.exit(1);
810
- });
811
- `;
812
-
813
- const schemaScriptPath = join(scriptsDir, 'generate-schema.ts');
814
- await writeFile(schemaScriptPath, schemaScriptContent, 'utf-8');
815
- }
816
-
817
- async function installDependenciesAndGenerateSchema(serverDir: string, workingDir: string): Promise<void> {
818
- if (process.env.DEPS_PRE_WARMED === 'true') {
819
- debugDeps('Skipping pnpm install (DEPS_PRE_WARMED)');
820
- } else {
821
- debugDeps('Installing dependencies...');
822
- debugDeps('Starting dependency installation in %s', serverDir);
823
- debugDeps(
824
- 'Hint: You can debug by manually running: cd server && pnpm install && npx tsx scripts/generate-schema.ts',
825
- );
826
-
827
- debugDeps('Running pnpm install');
828
- await execa('pnpm', ['install', '--no-frozen-lockfile'], { cwd: serverDir });
829
- debugDeps('Dependencies installed successfully');
830
- }
831
-
832
- debugDeps('Generating GraphQL schema...');
833
- debugDeps('Running: npx tsx scripts/generate-schema.ts');
834
- const result = await execa('npx', ['tsx', 'scripts/generate-schema.ts'], {
835
- cwd: serverDir,
836
- });
837
- debugDeps('Schema generation output: %s', result.stdout);
838
- const schemaPath = join(workingDir, '.context', 'schema.graphql');
839
- debugDeps('GraphQL schema generated at: %s', schemaPath);
840
- }
841
-
842
760
  export default commandHandler;
@@ -36,7 +36,7 @@ describe('handleInitializeServerInternal', () => {
36
36
  'package.json',
37
37
  'tsconfig.json',
38
38
  'vitest.config.ts',
39
- 'scripts/generate-schema.ts',
39
+
40
40
  'src/server.ts',
41
41
  'src/utils/loadResolvers.ts',
42
42
  'src/domain/shared/types.ts',
@@ -205,52 +205,6 @@ export default defineConfig({
205
205
  );
206
206
  }
207
207
 
208
- async function writeSchemaScriptIfMissing(serverDir: string, workingDir: string): Promise<void> {
209
- const scriptPath = join(serverDir, 'scripts', 'generate-schema.ts');
210
- if (await fs.pathExists(scriptPath)) return;
211
-
212
- await fs.ensureDir(join(serverDir, 'scripts'));
213
- const contextDir = resolve(workingDir, '.context');
214
- await fs.ensureDir(contextDir);
215
-
216
- await writeFile(
217
- scriptPath,
218
- `import 'reflect-metadata';
219
- import { buildSchema } from 'type-graphql';
220
- import { printSchema } from 'graphql';
221
- import { writeFile } from 'fs/promises';
222
- import * as path from 'path';
223
- import { loadResolvers } from '../src/utils/loadResolvers.js';
224
-
225
- async function main() {
226
- try {
227
- const resolvers = await loadResolvers('src/domain/flows/**/*.resolver.{ts,js}');
228
- const schema = await buildSchema({
229
- resolvers: resolvers as any,
230
- emitSchemaFile: false,
231
- });
232
- const printedSchema = printSchema(schema);
233
-
234
- const contextDir = path.resolve('${workingDir}', '.context');
235
- const schemaPath = path.join(contextDir, 'schema.graphql');
236
- await writeFile(schemaPath, printedSchema, 'utf-8');
237
-
238
- console.log(\`✅ GraphQL schema generated at: \${schemaPath}\`);
239
- } catch (error) {
240
- console.error(\`❌ GraphQL schema generation failed: \${error instanceof Error ? error.message : 'Unknown error'}\`);
241
- process.exit(1);
242
- }
243
- }
244
-
245
- main().catch((err) => {
246
- console.error(err);
247
- process.exit(1);
248
- });
249
- `,
250
- 'utf-8',
251
- );
252
- }
253
-
254
208
  async function copyLoadResolversIfMissing(serverDir: string): Promise<void> {
255
209
  const dest = join(serverDir, 'src', 'utils', 'loadResolvers.ts');
256
210
  if (await fs.pathExists(dest)) return;
@@ -408,8 +362,6 @@ export async function handleInitializeServerInternal(
408
362
  await writeTsconfig(serverDir);
409
363
  await writeVitestConfigIfMissing(serverDir);
410
364
  await writeIfMissing(join(serverDir, 'biome.json'), BIOME_JSON);
411
- await writeSchemaScriptIfMissing(serverDir, absDest);
412
-
413
365
  await writeIfMissing(join(serverDir, 'src', 'server.ts'), SERVER_TS);
414
366
  await copyLoadResolversIfMissing(serverDir);
415
367
  await writeIfMissing(join(serverDir, 'src', 'utils', 'index.ts'), UTILS_INDEX_TS);