@auto-engineer/server-generator-apollo-emmett 1.138.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 +39 -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
|
@@ -6,10 +6,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
6
6
|
it('should generate a valid query resolver from request field', async () => {
|
|
7
7
|
const spec: SpecsSchema = {
|
|
8
8
|
variant: 'specs',
|
|
9
|
-
|
|
9
|
+
scenes: [
|
|
10
10
|
{
|
|
11
|
-
name: 'listing-
|
|
12
|
-
|
|
11
|
+
name: 'listing-scene',
|
|
12
|
+
moments: [
|
|
13
13
|
{
|
|
14
14
|
type: 'query',
|
|
15
15
|
name: 'search-listings',
|
|
@@ -65,7 +65,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
65
65
|
],
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
68
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
69
69
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
70
70
|
|
|
71
71
|
expect(resolverFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -128,10 +128,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
128
128
|
it('should generate a valid query resolver with array of inline object field', async () => {
|
|
129
129
|
const spec: SpecsSchema = {
|
|
130
130
|
variant: 'specs',
|
|
131
|
-
|
|
131
|
+
scenes: [
|
|
132
132
|
{
|
|
133
|
-
name: 'assistant-
|
|
134
|
-
|
|
133
|
+
name: 'assistant-scene',
|
|
134
|
+
moments: [
|
|
135
135
|
{
|
|
136
136
|
type: 'query',
|
|
137
137
|
name: 'views-suggested-items',
|
|
@@ -188,7 +188,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
188
188
|
],
|
|
189
189
|
};
|
|
190
190
|
|
|
191
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
191
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
192
192
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
193
193
|
|
|
194
194
|
expect(resolverFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -251,10 +251,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
251
251
|
it('should generate the query resolver for "views the questionnaire"', async () => {
|
|
252
252
|
const spec: SpecsSchema = {
|
|
253
253
|
variant: 'specs',
|
|
254
|
-
|
|
254
|
+
scenes: [
|
|
255
255
|
{
|
|
256
256
|
name: 'Questionnaires',
|
|
257
|
-
|
|
257
|
+
moments: [
|
|
258
258
|
{
|
|
259
259
|
name: 'views the questionnaire',
|
|
260
260
|
type: 'query',
|
|
@@ -352,7 +352,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
352
352
|
integrations: [],
|
|
353
353
|
};
|
|
354
354
|
|
|
355
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
355
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
356
356
|
const queryFile = plans.find(
|
|
357
357
|
(p) => p.outputPath.endsWith('query.resolver.ts') && p.contents.includes('ViewsTheQuestionnaireQueryResolver'),
|
|
358
358
|
);
|
|
@@ -424,10 +424,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
424
424
|
it('should import Float when Float fields are used', async () => {
|
|
425
425
|
const spec: SpecsSchema = {
|
|
426
426
|
variant: 'specs',
|
|
427
|
-
|
|
427
|
+
scenes: [
|
|
428
428
|
{
|
|
429
|
-
name: 'product-
|
|
430
|
-
|
|
429
|
+
name: 'product-scene',
|
|
430
|
+
moments: [
|
|
431
431
|
{
|
|
432
432
|
type: 'query',
|
|
433
433
|
name: 'get-product-price',
|
|
@@ -479,7 +479,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
479
479
|
],
|
|
480
480
|
};
|
|
481
481
|
|
|
482
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
482
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
483
483
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
484
484
|
|
|
485
485
|
expect(resolverFile?.contents).toContain(
|
|
@@ -490,10 +490,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
490
490
|
it('should import Float when array of numbers is used', async () => {
|
|
491
491
|
const spec: SpecsSchema = {
|
|
492
492
|
variant: 'specs',
|
|
493
|
-
|
|
493
|
+
scenes: [
|
|
494
494
|
{
|
|
495
|
-
name: 'stats-
|
|
496
|
-
|
|
495
|
+
name: 'stats-scene',
|
|
496
|
+
moments: [
|
|
497
497
|
{
|
|
498
498
|
type: 'query',
|
|
499
499
|
name: 'get-stats',
|
|
@@ -543,7 +543,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
543
543
|
],
|
|
544
544
|
};
|
|
545
545
|
|
|
546
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
546
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
547
547
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
548
548
|
|
|
549
549
|
expect(resolverFile?.contents).toContain('Float');
|
|
@@ -552,10 +552,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
552
552
|
it('should import Float when Float query arg is used', async () => {
|
|
553
553
|
const spec: SpecsSchema = {
|
|
554
554
|
variant: 'specs',
|
|
555
|
-
|
|
555
|
+
scenes: [
|
|
556
556
|
{
|
|
557
|
-
name: 'search-
|
|
558
|
-
|
|
557
|
+
name: 'search-scene',
|
|
558
|
+
moments: [
|
|
559
559
|
{
|
|
560
560
|
type: 'query',
|
|
561
561
|
name: 'search-products',
|
|
@@ -605,7 +605,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
605
605
|
],
|
|
606
606
|
};
|
|
607
607
|
|
|
608
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
608
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
609
609
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
610
610
|
|
|
611
611
|
expect(resolverFile?.contents).toContain('Float');
|
|
@@ -615,10 +615,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
615
615
|
it('should generate a singleton query resolver that returns a single object', async () => {
|
|
616
616
|
const spec: SpecsSchema = {
|
|
617
617
|
variant: 'specs',
|
|
618
|
-
|
|
618
|
+
scenes: [
|
|
619
619
|
{
|
|
620
|
-
name: 'todo-list-
|
|
621
|
-
|
|
620
|
+
name: 'todo-list-scene',
|
|
621
|
+
moments: [
|
|
622
622
|
{
|
|
623
623
|
type: 'query',
|
|
624
624
|
name: 'views-completion-summary',
|
|
@@ -674,7 +674,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
674
674
|
],
|
|
675
675
|
};
|
|
676
676
|
|
|
677
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
677
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
678
678
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
679
679
|
|
|
680
680
|
// Should return single object, not array
|
|
@@ -696,10 +696,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
696
696
|
it('should not treat mixed union type with quotes as enum in singleton default values', async () => {
|
|
697
697
|
const spec: SpecsSchema = {
|
|
698
698
|
variant: 'specs',
|
|
699
|
-
|
|
699
|
+
scenes: [
|
|
700
700
|
{
|
|
701
|
-
name: 'order-
|
|
702
|
-
|
|
701
|
+
name: 'order-scene',
|
|
702
|
+
moments: [
|
|
703
703
|
{
|
|
704
704
|
type: 'query',
|
|
705
705
|
name: 'views-order-summary',
|
|
@@ -747,7 +747,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
747
747
|
],
|
|
748
748
|
};
|
|
749
749
|
|
|
750
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
750
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
751
751
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
752
752
|
|
|
753
753
|
expect(resolverFile?.contents).not.toContain("mixedStatus: 'pending'");
|
|
@@ -757,10 +757,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
757
757
|
it('should handle nested Array<{...}> in embedded ObjectType without breaking', async () => {
|
|
758
758
|
const spec: SpecsSchema = {
|
|
759
759
|
variant: 'specs',
|
|
760
|
-
|
|
760
|
+
scenes: [
|
|
761
761
|
{
|
|
762
|
-
name: 'training-
|
|
763
|
-
|
|
762
|
+
name: 'training-scene',
|
|
763
|
+
moments: [
|
|
764
764
|
{
|
|
765
765
|
type: 'query',
|
|
766
766
|
name: 'views-workout-session',
|
|
@@ -815,7 +815,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
815
815
|
],
|
|
816
816
|
};
|
|
817
817
|
|
|
818
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
818
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
819
819
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
820
820
|
|
|
821
821
|
expect(resolverFile?.contents).toContain('export class WorkoutSessionPerformance');
|
|
@@ -827,10 +827,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
827
827
|
it('should use message type name in graphqlType and not treat it as enum', async () => {
|
|
828
828
|
const spec: SpecsSchema = {
|
|
829
829
|
variant: 'specs',
|
|
830
|
-
|
|
830
|
+
scenes: [
|
|
831
831
|
{
|
|
832
|
-
name: 'recipe-
|
|
833
|
-
|
|
832
|
+
name: 'recipe-scene',
|
|
833
|
+
moments: [
|
|
834
834
|
{
|
|
835
835
|
type: 'query',
|
|
836
836
|
name: 'find-recipe-matches',
|
|
@@ -889,7 +889,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
889
889
|
],
|
|
890
890
|
};
|
|
891
891
|
|
|
892
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
892
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
893
893
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
894
894
|
|
|
895
895
|
expect(resolverFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -947,10 +947,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
947
947
|
it('should use original-case projection name as collection name, not PascalCase', async () => {
|
|
948
948
|
const spec: SpecsSchema = {
|
|
949
949
|
variant: 'specs',
|
|
950
|
-
|
|
950
|
+
scenes: [
|
|
951
951
|
{
|
|
952
|
-
name: 'video-
|
|
953
|
-
|
|
952
|
+
name: 'video-scene',
|
|
953
|
+
moments: [
|
|
954
954
|
{
|
|
955
955
|
type: 'query',
|
|
956
956
|
name: 'browse-videos',
|
|
@@ -998,7 +998,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
998
998
|
],
|
|
999
999
|
};
|
|
1000
1000
|
|
|
1001
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
1001
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
1002
1002
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
1003
1003
|
|
|
1004
1004
|
expect(resolverFile?.contents).toContain("new ReadModel<VideoListing>(ctx.database, 'videos')");
|
|
@@ -1008,10 +1008,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1008
1008
|
it('should use original-case projection name in singleton collection lookup', async () => {
|
|
1009
1009
|
const spec: SpecsSchema = {
|
|
1010
1010
|
variant: 'specs',
|
|
1011
|
-
|
|
1011
|
+
scenes: [
|
|
1012
1012
|
{
|
|
1013
|
-
name: 'video-
|
|
1014
|
-
|
|
1013
|
+
name: 'video-scene',
|
|
1014
|
+
moments: [
|
|
1015
1015
|
{
|
|
1016
1016
|
type: 'query',
|
|
1017
1017
|
name: 'views-video-stats',
|
|
@@ -1059,7 +1059,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1059
1059
|
],
|
|
1060
1060
|
};
|
|
1061
1061
|
|
|
1062
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
1062
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
1063
1063
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
1064
1064
|
|
|
1065
1065
|
expect(resolverFile?.contents).toContain("ctx.database.collection<VideoStats>('videoStats').findOne()");
|
|
@@ -1069,10 +1069,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1069
1069
|
it('should generate @ObjectType classes for referenced message types', async () => {
|
|
1070
1070
|
const spec: SpecsSchema = {
|
|
1071
1071
|
variant: 'specs',
|
|
1072
|
-
|
|
1072
|
+
scenes: [
|
|
1073
1073
|
{
|
|
1074
|
-
name: 'recipe-
|
|
1075
|
-
|
|
1074
|
+
name: 'recipe-scene',
|
|
1075
|
+
moments: [
|
|
1076
1076
|
{
|
|
1077
1077
|
type: 'query',
|
|
1078
1078
|
name: 'find-recipe-matches',
|
|
@@ -1131,7 +1131,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1131
1131
|
],
|
|
1132
1132
|
};
|
|
1133
1133
|
|
|
1134
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
1134
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
1135
1135
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
1136
1136
|
|
|
1137
1137
|
expect(resolverFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -1189,10 +1189,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1189
1189
|
it('should map custom input type args to GraphQLJSON and Record<string, unknown>', async () => {
|
|
1190
1190
|
const spec: SpecsSchema = {
|
|
1191
1191
|
variant: 'specs',
|
|
1192
|
-
|
|
1192
|
+
scenes: [
|
|
1193
1193
|
{
|
|
1194
|
-
name: 'workout-
|
|
1195
|
-
|
|
1194
|
+
name: 'workout-scene',
|
|
1195
|
+
moments: [
|
|
1196
1196
|
{
|
|
1197
1197
|
type: 'query',
|
|
1198
1198
|
name: 'list-workouts',
|
|
@@ -1240,7 +1240,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1240
1240
|
],
|
|
1241
1241
|
};
|
|
1242
1242
|
|
|
1243
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
1243
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
1244
1244
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
1245
1245
|
|
|
1246
1246
|
expect(resolverFile?.contents).toContain("import { GraphQLJSON } from 'graphql-type-json';");
|
|
@@ -1254,10 +1254,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1254
1254
|
it('should map query arg to state field via value matching when names differ', async () => {
|
|
1255
1255
|
const spec: SpecsSchema = {
|
|
1256
1256
|
variant: 'specs',
|
|
1257
|
-
|
|
1257
|
+
scenes: [
|
|
1258
1258
|
{
|
|
1259
|
-
name: 'workout-
|
|
1260
|
-
|
|
1259
|
+
name: 'workout-scene',
|
|
1260
|
+
moments: [
|
|
1261
1261
|
{
|
|
1262
1262
|
type: 'command',
|
|
1263
1263
|
name: 'create-workout',
|
|
@@ -1372,7 +1372,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1372
1372
|
],
|
|
1373
1373
|
};
|
|
1374
1374
|
|
|
1375
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
1375
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
1376
1376
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('view-workout/query.resolver.ts'));
|
|
1377
1377
|
|
|
1378
1378
|
expect(resolverFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -1421,10 +1421,10 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1421
1421
|
it('should generate operator-based filters from explicit mappings', async () => {
|
|
1422
1422
|
const spec: SpecsSchema = {
|
|
1423
1423
|
variant: 'specs',
|
|
1424
|
-
|
|
1424
|
+
scenes: [
|
|
1425
1425
|
{
|
|
1426
|
-
name: 'rental-
|
|
1427
|
-
|
|
1426
|
+
name: 'rental-scene',
|
|
1427
|
+
moments: [
|
|
1428
1428
|
{
|
|
1429
1429
|
type: 'query',
|
|
1430
1430
|
name: 'search-listings',
|
|
@@ -1486,7 +1486,7 @@ describe('query.resolver.ts.ejs', () => {
|
|
|
1486
1486
|
],
|
|
1487
1487
|
};
|
|
1488
1488
|
|
|
1489
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
1489
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
1490
1490
|
const resolverFile = plans.find((p) => p.outputPath.endsWith('query.resolver.ts'));
|
|
1491
1491
|
|
|
1492
1492
|
expect(resolverFile?.contents).toContain('item.numBedrooms < minBedrooms');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
const target = slice?.server?.data?.items?.[0]?.target;
|
|
3
3
|
const projection = slice?.server?.data?.items?.[0]?.origin;
|
|
4
4
|
const isSingleton = projection?.singleton === true;
|
|
5
|
-
const queryName = parsedRequest?.operationName ?? camelCase(
|
|
5
|
+
const queryName = parsedRequest?.operationName ?? camelCase(momentName);
|
|
6
6
|
const viewType = target?.name ? pascalCase(target.name) : 'UnknownView';
|
|
7
7
|
const collectionName = projectionName || 'unknown-collection';
|
|
8
8
|
const message = messages?.find(m => m.name === viewType);
|
|
@@ -6,10 +6,10 @@ 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
|
+
scenes: [
|
|
10
10
|
{
|
|
11
11
|
name: 'Inventory management',
|
|
12
|
-
|
|
12
|
+
moments: [
|
|
13
13
|
{
|
|
14
14
|
type: 'query',
|
|
15
15
|
name: 'Get available items',
|
|
@@ -55,7 +55,7 @@ describe('state.ts.ejs', () => {
|
|
|
55
55
|
],
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
58
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
59
59
|
const stateFile = plans.find((p) => p.outputPath.endsWith('state.ts'));
|
|
60
60
|
|
|
61
61
|
expect(stateFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -73,10 +73,10 @@ describe('state.ts.ejs', () => {
|
|
|
73
73
|
it('should render projection state fields as required even when spec says required: false', async () => {
|
|
74
74
|
const spec: SpecsSchema = {
|
|
75
75
|
variant: 'specs',
|
|
76
|
-
|
|
76
|
+
scenes: [
|
|
77
77
|
{
|
|
78
78
|
name: 'Workout tracking',
|
|
79
|
-
|
|
79
|
+
moments: [
|
|
80
80
|
{
|
|
81
81
|
type: 'query',
|
|
82
82
|
name: 'Get workout history',
|
|
@@ -119,7 +119,7 @@ describe('state.ts.ejs', () => {
|
|
|
119
119
|
],
|
|
120
120
|
};
|
|
121
121
|
|
|
122
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
122
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
123
123
|
const stateFile = plans.find((p) => p.outputPath.endsWith('state.ts'));
|
|
124
124
|
|
|
125
125
|
expect(stateFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -136,10 +136,10 @@ describe('state.ts.ejs', () => {
|
|
|
136
136
|
it('should export fallback UnknownState when query slice has no data config', async () => {
|
|
137
137
|
const spec: SpecsSchema = {
|
|
138
138
|
variant: 'specs',
|
|
139
|
-
|
|
139
|
+
scenes: [
|
|
140
140
|
{
|
|
141
141
|
name: 'Dashboard',
|
|
142
|
-
|
|
142
|
+
moments: [
|
|
143
143
|
{
|
|
144
144
|
type: 'query',
|
|
145
145
|
name: 'View summary',
|
|
@@ -156,7 +156,7 @@ describe('state.ts.ejs', () => {
|
|
|
156
156
|
messages: [],
|
|
157
157
|
};
|
|
158
158
|
|
|
159
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
159
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
160
160
|
const stateFile = plans.find((p) => p.outputPath.endsWith('state.ts'));
|
|
161
161
|
|
|
162
162
|
expect(stateFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -6,10 +6,10 @@ 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
|
+
scenes: [
|
|
10
10
|
{
|
|
11
11
|
name: 'manage bookings',
|
|
12
|
-
|
|
12
|
+
moments: [
|
|
13
13
|
{
|
|
14
14
|
type: 'command',
|
|
15
15
|
name: 'guest submits booking request',
|
|
@@ -163,7 +163,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
|
|
|
163
163
|
],
|
|
164
164
|
};
|
|
165
165
|
|
|
166
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
166
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
167
167
|
|
|
168
168
|
const specFile = plans.find((p) => p.outputPath.endsWith('react.specs.ts'));
|
|
169
169
|
expect(specFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -238,10 +238,10 @@ describe('react.specs.ts.ejs (react slice)', () => {
|
|
|
238
238
|
it('should use correct field types from commands array (number fields not strings)', async () => {
|
|
239
239
|
const spec: SpecsSchema = {
|
|
240
240
|
variant: 'specs',
|
|
241
|
-
|
|
241
|
+
scenes: [
|
|
242
242
|
{
|
|
243
|
-
name: 'tipping
|
|
244
|
-
|
|
243
|
+
name: 'tipping scene',
|
|
244
|
+
moments: [
|
|
245
245
|
{
|
|
246
246
|
type: 'command',
|
|
247
247
|
name: 'complete appointment',
|
|
@@ -342,7 +342,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
|
|
|
342
342
|
],
|
|
343
343
|
};
|
|
344
344
|
|
|
345
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
345
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
346
346
|
|
|
347
347
|
const specFile = plans.find((p) => p.outputPath.endsWith('react.specs.ts'));
|
|
348
348
|
expect(specFile?.contents).toBeDefined();
|
|
@@ -356,10 +356,10 @@ describe('react.specs.ts.ejs (react slice)', () => {
|
|
|
356
356
|
it('should exclude event And-steps from ReactorCommand type and then assertions', async () => {
|
|
357
357
|
const spec: SpecsSchema = {
|
|
358
358
|
variant: 'specs',
|
|
359
|
-
|
|
359
|
+
scenes: [
|
|
360
360
|
{
|
|
361
|
-
name: 'notification
|
|
362
|
-
|
|
361
|
+
name: 'notification scene',
|
|
362
|
+
moments: [
|
|
363
363
|
{
|
|
364
364
|
type: 'command',
|
|
365
365
|
name: 'earn points',
|
|
@@ -451,7 +451,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
|
|
|
451
451
|
],
|
|
452
452
|
};
|
|
453
453
|
|
|
454
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
454
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
455
455
|
const specFile = plans.find((p) => p.outputPath.endsWith('notify-milestone/react.specs.ts'));
|
|
456
456
|
|
|
457
457
|
expect(specFile?.contents).toContain('type ReactorCommand = SendNotification;');
|
|
@@ -463,10 +463,10 @@ describe('react.specs.ts.ejs (react slice)', () => {
|
|
|
463
463
|
it('should seed event store with Given state data via appendToStream', async () => {
|
|
464
464
|
const spec: SpecsSchema = {
|
|
465
465
|
variant: 'specs',
|
|
466
|
-
|
|
466
|
+
scenes: [
|
|
467
467
|
{
|
|
468
|
-
name: 'barbershop
|
|
469
|
-
|
|
468
|
+
name: 'barbershop scene',
|
|
469
|
+
moments: [
|
|
470
470
|
{
|
|
471
471
|
type: 'command',
|
|
472
472
|
name: 'cancel appointment',
|
|
@@ -583,7 +583,7 @@ describe('react.specs.ts.ejs (react slice)', () => {
|
|
|
583
583
|
],
|
|
584
584
|
};
|
|
585
585
|
|
|
586
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
586
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
587
587
|
|
|
588
588
|
const specFile = plans.find((p) => p.outputPath.endsWith('notify-barber-of-cancellation/react.specs.ts'));
|
|
589
589
|
expect(specFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -6,10 +6,10 @@ 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
|
+
scenes: [
|
|
10
10
|
{
|
|
11
11
|
name: 'manage bookings',
|
|
12
|
-
|
|
12
|
+
moments: [
|
|
13
13
|
{
|
|
14
14
|
type: 'command',
|
|
15
15
|
name: 'guest submits booking request',
|
|
@@ -229,7 +229,7 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
229
229
|
],
|
|
230
230
|
};
|
|
231
231
|
|
|
232
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
232
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
233
233
|
const handleFile = plans.find((p) => p.outputPath.endsWith('react.ts'));
|
|
234
234
|
|
|
235
235
|
expect(handleFile?.contents).toMatchInlineSnapshot(`
|
|
@@ -290,13 +290,13 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
290
290
|
`);
|
|
291
291
|
});
|
|
292
292
|
|
|
293
|
-
it('should generate cross-
|
|
293
|
+
it('should generate cross-scene import path in react.ts', async () => {
|
|
294
294
|
const spec: SpecsSchema = {
|
|
295
295
|
variant: 'specs',
|
|
296
|
-
|
|
296
|
+
scenes: [
|
|
297
297
|
{
|
|
298
298
|
name: 'order management',
|
|
299
|
-
|
|
299
|
+
moments: [
|
|
300
300
|
{
|
|
301
301
|
type: 'command',
|
|
302
302
|
name: 'create order',
|
|
@@ -329,12 +329,12 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
329
329
|
},
|
|
330
330
|
{
|
|
331
331
|
name: 'fulfillment',
|
|
332
|
-
|
|
332
|
+
moments: [
|
|
333
333
|
{
|
|
334
334
|
type: 'react',
|
|
335
335
|
name: 'notify warehouse',
|
|
336
336
|
server: {
|
|
337
|
-
description: 'Reacts to OrderCreated from order management
|
|
337
|
+
description: 'Reacts to OrderCreated from order management scene',
|
|
338
338
|
specs: [
|
|
339
339
|
{
|
|
340
340
|
type: 'gherkin',
|
|
@@ -381,7 +381,7 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
381
381
|
],
|
|
382
382
|
};
|
|
383
383
|
|
|
384
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
384
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
385
385
|
const reactFile = plans.find((p) => p.outputPath.endsWith('notify-warehouse/react.ts'));
|
|
386
386
|
|
|
387
387
|
expect(reactFile?.contents).toContain("from '../../order-management/create-order/events'");
|
|
@@ -390,10 +390,10 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
390
390
|
it('should not self-reference react slice when trigger event has no known producer', async () => {
|
|
391
391
|
const spec: SpecsSchema = {
|
|
392
392
|
variant: 'specs',
|
|
393
|
-
|
|
393
|
+
scenes: [
|
|
394
394
|
{
|
|
395
395
|
name: 'notifications',
|
|
396
|
-
|
|
396
|
+
moments: [
|
|
397
397
|
{
|
|
398
398
|
type: 'react',
|
|
399
399
|
name: 'notify on external event',
|
|
@@ -451,7 +451,7 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
451
451
|
],
|
|
452
452
|
};
|
|
453
453
|
|
|
454
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
454
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
455
455
|
const reactFile = plans.find((p) => p.outputPath.endsWith('notify-on-external-event/react.ts'));
|
|
456
456
|
const registerFile = plans.find((p) => p.outputPath.endsWith('notify-on-external-event/register.ts'));
|
|
457
457
|
const specsFile = plans.find((p) => p.outputPath.endsWith('notify-on-external-event/react.specs.ts'));
|
|
@@ -464,10 +464,10 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
464
464
|
it('should normalize Pattern B-full: swap trigger from given to when', async () => {
|
|
465
465
|
const spec: SpecsSchema = {
|
|
466
466
|
variant: 'specs',
|
|
467
|
-
|
|
467
|
+
scenes: [
|
|
468
468
|
{
|
|
469
469
|
name: 'order management',
|
|
470
|
-
|
|
470
|
+
moments: [
|
|
471
471
|
{
|
|
472
472
|
type: 'command',
|
|
473
473
|
name: 'process payment',
|
|
@@ -500,7 +500,7 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
500
500
|
},
|
|
501
501
|
{
|
|
502
502
|
name: 'fulfillment',
|
|
503
|
-
|
|
503
|
+
moments: [
|
|
504
504
|
{
|
|
505
505
|
type: 'react',
|
|
506
506
|
name: 'adjust inventory',
|
|
@@ -559,7 +559,7 @@ describe('handle.ts.ejs (react slice)', () => {
|
|
|
559
559
|
],
|
|
560
560
|
};
|
|
561
561
|
|
|
562
|
-
const { plans } = await generateScaffoldFilePlans(spec.
|
|
562
|
+
const { plans } = await generateScaffoldFilePlans(spec.scenes, spec.messages, undefined, 'src/domain/narratives');
|
|
563
563
|
const reactFile = plans.find((p) => p.outputPath.endsWith('adjust-inventory/react.ts'));
|
|
564
564
|
|
|
565
565
|
expect(reactFile?.contents).toContain('inMemoryReactor<PaymentProcessed>');
|