@auto-engineer/server-generator-apollo-emmett 1.110.6 → 1.111.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 +5 -5
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +63 -0
- package/README.md +0 -1
- package/dist/src/codegen/extract/messages.d.ts.map +1 -1
- package/dist/src/codegen/extract/messages.js +20 -14
- package/dist/src/codegen/extract/messages.js.map +1 -1
- package/dist/src/codegen/scaffoldFromSchema.js +2 -2
- package/dist/src/codegen/scaffoldFromSchema.js.map +1 -1
- package/dist/src/codegen/templates/command/decide.specs.specs.ts +67 -0
- package/dist/src/codegen/templates/command/decide.specs.ts.ejs +1 -1
- package/dist/src/codegen/templates/query/query.resolver.specs.ts +65 -0
- package/dist/src/codegen/templates/query/query.resolver.ts.ejs +15 -6
- package/dist/src/commands/generate-server.d.ts +0 -2
- package/dist/src/commands/generate-server.d.ts.map +1 -1
- package/dist/src/commands/generate-server.js +6 -71
- 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 +0 -41
- package/dist/src/commands/initialize-server.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/ketchup-plan.md +5 -0
- package/package.json +4 -4
- package/src/codegen/extract/messages.specs.ts +172 -0
- package/src/codegen/extract/messages.ts +22 -14
- package/src/codegen/findEventSource.specs.ts +54 -0
- package/src/codegen/scaffoldFromSchema.ts +2 -2
- package/src/codegen/templates/command/decide.specs.specs.ts +67 -0
- package/src/codegen/templates/command/decide.specs.ts.ejs +1 -1
- package/src/codegen/templates/query/query.resolver.specs.ts +65 -0
- package/src/codegen/templates/query/query.resolver.ts.ejs +15 -6
- package/src/commands/generate-server.specs.ts +1 -4
- package/src/commands/generate-server.ts +8 -84
- package/src/commands/initialize-server.specs.ts +1 -1
- 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
|
-
|
|
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
|
-
|
|
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', '
|
|
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
|
|
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
|
|
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
|
|
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
|
|
574
|
+
events.push(createServerSuccessEvent(command, serverDir));
|
|
588
575
|
return events;
|
|
589
576
|
} catch (error) {
|
|
590
577
|
return [createServerFailureEvent(command, error)];
|
|
@@ -770,67 +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
|
-
debugDeps('Installing dependencies...');
|
|
819
|
-
debugDeps('Starting dependency installation in %s', serverDir);
|
|
820
|
-
debugDeps('Hint: You can debug by manually running: cd server && pnpm install && npx tsx scripts/generate-schema.ts');
|
|
821
|
-
|
|
822
|
-
debugDeps('Running pnpm install');
|
|
823
|
-
await execa('pnpm', ['install', '--no-frozen-lockfile'], { cwd: serverDir });
|
|
824
|
-
debugDeps('Dependencies installed successfully');
|
|
825
|
-
|
|
826
|
-
debugDeps('Generating GraphQL schema...');
|
|
827
|
-
debugDeps('Running: npx tsx scripts/generate-schema.ts');
|
|
828
|
-
const result = await execa('npx', ['tsx', 'scripts/generate-schema.ts'], {
|
|
829
|
-
cwd: serverDir,
|
|
830
|
-
});
|
|
831
|
-
debugDeps('Schema generation output: %s', result.stdout);
|
|
832
|
-
const schemaPath = join(workingDir, '.context', 'schema.graphql');
|
|
833
|
-
debugDeps('GraphQL schema generated at: %s', schemaPath);
|
|
834
|
-
}
|
|
835
|
-
|
|
836
760
|
export default commandHandler;
|
|
@@ -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);
|