@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.
- package/.turbo/turbo-build.log +5 -6
- package/.turbo/turbo-format.log +1 -1
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +4 -4
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +18 -0
- package/dist/src/codegen/extract/commands.d.ts +1 -1
- package/dist/src/codegen/extract/commands.d.ts.map +1 -1
- package/dist/src/codegen/extract/data-sink.d.ts +1 -1
- package/dist/src/codegen/extract/data-sink.d.ts.map +1 -1
- package/dist/src/codegen/extract/events.d.ts +1 -1
- package/dist/src/codegen/extract/events.d.ts.map +1 -1
- package/dist/src/codegen/extract/gwt.d.ts +1 -1
- package/dist/src/codegen/extract/gwt.d.ts.map +1 -1
- package/dist/src/codegen/extract/index.d.ts +1 -0
- package/dist/src/codegen/extract/index.d.ts.map +1 -1
- package/dist/src/codegen/extract/index.js +1 -0
- package/dist/src/codegen/extract/index.js.map +1 -1
- package/dist/src/codegen/extract/messages.d.ts +1 -1
- package/dist/src/codegen/extract/messages.d.ts.map +1 -1
- package/dist/src/codegen/extract/projection.d.ts +1 -1
- package/dist/src/codegen/extract/projection.d.ts.map +1 -1
- package/dist/src/codegen/extract/query.d.ts +1 -1
- package/dist/src/codegen/extract/query.d.ts.map +1 -1
- package/dist/src/codegen/extract/states.d.ts +1 -1
- package/dist/src/codegen/extract/states.d.ts.map +1 -1
- package/dist/src/codegen/extract/type-helpers.d.ts +13 -0
- package/dist/src/codegen/extract/type-helpers.d.ts.map +1 -0
- package/dist/src/codegen/extract/type-helpers.js +98 -0
- package/dist/src/codegen/extract/type-helpers.js.map +1 -0
- package/dist/src/codegen/scaffoldFromSchema.d.ts +3 -3
- package/dist/src/codegen/scaffoldFromSchema.d.ts.map +1 -1
- package/dist/src/codegen/scaffoldFromSchema.js +202 -19
- 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/commands.ts.ejs +14 -9
- package/dist/src/codegen/templates/command/decide.specs.specs.ts +54 -54
- package/dist/src/codegen/templates/command/decide.specs.ts +13 -9
- package/dist/src/codegen/templates/command/decide.ts.ejs +1 -0
- package/dist/src/codegen/templates/command/events.specs.ts +3 -3
- package/dist/src/codegen/templates/command/events.ts.ejs +16 -13
- package/dist/src/codegen/templates/command/evolve.specs.ts +3 -3
- package/dist/src/codegen/templates/command/handle.specs.ts +10 -5
- package/dist/src/codegen/templates/command/mutation.resolver.specs.ts +8 -7
- package/dist/src/codegen/templates/command/mutation.resolver.ts.ejs +2 -23
- package/dist/src/codegen/templates/command/register.specs.ts +4 -4
- package/dist/src/codegen/templates/command/register.ts.ejs +1 -4
- package/dist/src/codegen/templates/command/state.specs.ts +54 -50
- package/dist/src/codegen/templates/command/state.ts.ejs +8 -4
- package/dist/src/codegen/templates/query/projection.specs.specs.ts +7 -7
- package/dist/src/codegen/templates/query/projection.specs.ts +24 -7
- package/dist/src/codegen/templates/query/projection.ts.ejs +64 -12
- package/dist/src/codegen/templates/query/query.resolver.specs.ts +19 -16
- package/dist/src/codegen/templates/query/query.resolver.ts.ejs +11 -49
- package/dist/src/codegen/templates/query/state.specs.ts +3 -3
- package/dist/src/codegen/templates/react/react.specs.specs.ts +3 -3
- package/dist/src/codegen/templates/react/react.specs.ts +3 -3
- package/dist/src/codegen/templates/react/react.ts.ejs +0 -1
- package/dist/src/codegen/templates/react/register.specs.ts +3 -3
- package/dist/src/codegen/templates/react/register.ts.ejs +0 -1
- package/dist/src/codegen/test-data/specVariant1.d.ts +1 -1
- package/dist/src/codegen/test-data/specVariant1.d.ts.map +1 -1
- package/dist/src/codegen/test-data/specVariant1.js +1 -1
- package/dist/src/codegen/test-data/specVariant1.js.map +1 -1
- package/dist/src/codegen/types.d.ts +1 -1
- package/dist/src/codegen/types.d.ts.map +1 -1
- package/dist/src/commands/generate-server.d.ts +0 -1
- package/dist/src/commands/generate-server.d.ts.map +1 -1
- package/dist/src/commands/generate-server.js +53 -31
- package/dist/src/commands/generate-server.js.map +1 -1
- package/dist/src/domain/shared/graphql-types.d.ts +10 -0
- package/dist/src/domain/shared/graphql-types.d.ts.map +1 -0
- package/dist/src/domain/shared/graphql-types.js +40 -0
- package/dist/src/domain/shared/graphql-types.js.map +1 -0
- package/dist/src/domain/shared/graphql-types.ts +20 -0
- package/dist/src/domain/shared/index.d.ts +1 -0
- package/dist/src/domain/shared/index.d.ts.map +1 -1
- package/dist/src/domain/shared/index.js +1 -0
- package/dist/src/domain/shared/index.js.map +1 -1
- package/dist/src/domain/shared/index.ts +1 -0
- package/dist/src/domain/shared/sendCommand.d.ts +1 -1
- package/dist/src/domain/shared/sendCommand.d.ts.map +1 -1
- package/dist/src/domain/shared/sendCommand.ts +1 -1
- package/dist/src/domain/shared/types.d.ts +5 -7
- package/dist/src/domain/shared/types.d.ts.map +1 -1
- package/dist/src/domain/shared/types.js +11 -38
- package/dist/src/domain/shared/types.js.map +1 -1
- package/dist/src/domain/shared/types.ts +10 -16
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/codegen/extract/commands.ts +1 -1
- package/src/codegen/extract/data-sink.ts +1 -1
- package/src/codegen/extract/events.ts +1 -1
- package/src/codegen/extract/gwt.ts +1 -1
- package/src/codegen/extract/index.ts +1 -0
- package/src/codegen/extract/messages.ts +1 -1
- package/src/codegen/extract/projection.ts +1 -1
- package/src/codegen/extract/query.ts +1 -1
- package/src/codegen/extract/states.ts +1 -1
- package/src/codegen/extract/type-helpers.ts +102 -0
- package/src/codegen/scaffoldFromSchema.ts +283 -25
- package/src/codegen/templates/command/commands.specs.ts +3 -3
- package/src/codegen/templates/command/commands.ts.ejs +14 -9
- package/src/codegen/templates/command/decide.specs.specs.ts +54 -54
- package/src/codegen/templates/command/decide.specs.ts +13 -9
- package/src/codegen/templates/command/decide.ts.ejs +1 -0
- package/src/codegen/templates/command/events.specs.ts +3 -3
- package/src/codegen/templates/command/events.ts.ejs +16 -13
- package/src/codegen/templates/command/evolve.specs.ts +3 -3
- package/src/codegen/templates/command/handle.specs.ts +10 -5
- package/src/codegen/templates/command/mutation.resolver.specs.ts +8 -7
- package/src/codegen/templates/command/mutation.resolver.ts.ejs +2 -23
- package/src/codegen/templates/command/register.specs.ts +4 -4
- package/src/codegen/templates/command/register.ts.ejs +1 -4
- package/src/codegen/templates/command/state.specs.ts +54 -50
- package/src/codegen/templates/command/state.ts.ejs +8 -4
- package/src/codegen/templates/query/projection.specs.specs.ts +7 -7
- package/src/codegen/templates/query/projection.specs.ts +24 -7
- package/src/codegen/templates/query/projection.ts.ejs +64 -12
- package/src/codegen/templates/query/query.resolver.specs.ts +19 -16
- package/src/codegen/templates/query/query.resolver.ts.ejs +11 -49
- package/src/codegen/templates/query/state.specs.ts +3 -3
- package/src/codegen/templates/react/react.specs.specs.ts +3 -3
- package/src/codegen/templates/react/react.specs.ts +3 -3
- package/src/codegen/templates/react/react.ts.ejs +0 -1
- package/src/codegen/templates/react/register.specs.ts +3 -3
- package/src/codegen/templates/react/register.ts.ejs +0 -1
- package/src/codegen/test-data/specVariant1.ts +2 -2
- package/src/codegen/types.ts +1 -1
- package/src/commands/generate-server.ts +63 -34
- package/src/domain/shared/graphql-types.ts +20 -0
- package/src/domain/shared/index.ts +1 -0
- package/src/domain/shared/sendCommand.ts +1 -1
- 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/
|
|
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
|
-
|
|
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.
|
|
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/
|
|
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
|
-
|
|
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.
|
|
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/
|
|
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
|
-
|
|
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.
|
|
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,12 +1,12 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { Model as SpecsSchema } from '@auto-engineer/
|
|
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
|
-
|
|
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.
|
|
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,8 +1,8 @@
|
|
|
1
|
-
import { Model as SpecsSchema } from '@auto-engineer/
|
|
1
|
+
import { Model as SpecsSchema } from '@auto-engineer/narrative';
|
|
2
2
|
|
|
3
3
|
const specVariant1: SpecsSchema = {
|
|
4
4
|
variant: 'specs',
|
|
5
|
-
|
|
5
|
+
narratives: [
|
|
6
6
|
{
|
|
7
7
|
name: 'Add item',
|
|
8
8
|
description: 'Flow to add items to a system',
|
package/src/codegen/types.ts
CHANGED
|
@@ -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/
|
|
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.
|
|
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.
|
|
135
|
+
if (spec.narratives !== undefined && spec.narratives.length > 0) {
|
|
137
136
|
debugModel(
|
|
138
137
|
'Flow names: %o',
|
|
139
|
-
spec.
|
|
138
|
+
spec.narratives.map((f) => f.name),
|
|
140
139
|
);
|
|
141
|
-
spec.
|
|
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.
|
|
180
|
+
debugScaffold(' Number of flows: %d', spec.narratives?.length || 0);
|
|
155
181
|
|
|
156
|
-
const filePlans = await generateScaffoldFilePlans(spec.
|
|
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.
|
|
266
|
-
for (const flow of spec.
|
|
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.
|
|
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
|
-
|
|
533
|
-
|
|
534
|
-
|
|
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
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
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,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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
success!: boolean;
|
|
30
|
-
|
|
31
|
-
@Field(() => MutationError, { nullable: true })
|
|
32
|
-
error?: MutationError;
|
|
33
|
-
}
|
|
25
|
+
registerEnumType(QuestionnaireProgressStatus, {
|
|
26
|
+
name: 'QuestionnaireProgressStatus',
|
|
27
|
+
});
|