@auto-engineer/server-generator-apollo-emmett 0.8.4 → 0.8.5

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 (239) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +3 -3
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +8 -0
  5. package/dist/src/codegen/extract/commands.d.ts.map +1 -0
  6. package/dist/src/codegen/extract/commands.js.map +1 -0
  7. package/dist/src/codegen/extract/data-sink.d.ts.map +1 -0
  8. package/dist/{codegen → src/codegen}/extract/data-sink.js +33 -10
  9. package/dist/src/codegen/extract/data-sink.js.map +1 -0
  10. package/dist/src/codegen/extract/events.d.ts.map +1 -0
  11. package/dist/src/codegen/extract/events.js.map +1 -0
  12. package/dist/src/codegen/extract/fields.d.ts.map +1 -0
  13. package/dist/src/codegen/extract/fields.js.map +1 -0
  14. package/dist/src/codegen/extract/graphql.d.ts.map +1 -0
  15. package/dist/src/codegen/extract/graphql.js.map +1 -0
  16. package/dist/src/codegen/extract/gwt.d.ts.map +1 -0
  17. package/dist/src/codegen/extract/gwt.js.map +1 -0
  18. package/dist/src/codegen/extract/index.d.ts.map +1 -0
  19. package/dist/src/codegen/extract/index.js.map +1 -0
  20. package/dist/src/codegen/extract/messages.d.ts.map +1 -0
  21. package/dist/src/codegen/extract/messages.js.map +1 -0
  22. package/dist/src/codegen/extract/projection.d.ts.map +1 -0
  23. package/dist/src/codegen/extract/projection.js.map +1 -0
  24. package/dist/src/codegen/extract/query.d.ts.map +1 -0
  25. package/dist/src/codegen/extract/query.js.map +1 -0
  26. package/dist/src/codegen/extract/states.d.ts.map +1 -0
  27. package/dist/src/codegen/extract/states.js.map +1 -0
  28. package/dist/src/codegen/scaffoldFromSchema.d.ts.map +1 -0
  29. package/dist/src/codegen/scaffoldFromSchema.integration.specs.d.ts.map +1 -0
  30. package/dist/src/codegen/scaffoldFromSchema.integration.specs.js.map +1 -0
  31. package/dist/src/codegen/scaffoldFromSchema.js.map +1 -0
  32. package/dist/src/codegen/templates/command/commands.specs.d.ts +2 -0
  33. package/dist/src/codegen/templates/command/commands.specs.d.ts.map +1 -0
  34. package/dist/src/codegen/templates/command/commands.specs.js +96 -0
  35. package/dist/src/codegen/templates/command/commands.specs.js.map +1 -0
  36. package/dist/src/codegen/templates/command/decide.specs.d.ts +2 -0
  37. package/dist/src/codegen/templates/command/decide.specs.d.ts.map +1 -0
  38. package/dist/src/codegen/templates/command/decide.specs.js +567 -0
  39. package/dist/src/codegen/templates/command/decide.specs.js.map +1 -0
  40. package/dist/src/codegen/templates/command/decide.specs.specs.d.ts +2 -0
  41. package/dist/src/codegen/templates/command/decide.specs.specs.d.ts.map +1 -0
  42. package/dist/src/codegen/templates/command/decide.specs.specs.js +278 -0
  43. package/dist/src/codegen/templates/command/decide.specs.specs.js.map +1 -0
  44. package/dist/src/codegen/templates/command/events.specs.d.ts +2 -0
  45. package/dist/src/codegen/templates/command/events.specs.d.ts.map +1 -0
  46. package/dist/src/codegen/templates/command/events.specs.js +112 -0
  47. package/dist/src/codegen/templates/command/events.specs.js.map +1 -0
  48. package/dist/src/codegen/templates/command/evolve.specs.d.ts +2 -0
  49. package/dist/src/codegen/templates/command/evolve.specs.d.ts.map +1 -0
  50. package/dist/src/codegen/templates/command/evolve.specs.js +108 -0
  51. package/dist/src/codegen/templates/command/evolve.specs.js.map +1 -0
  52. package/dist/src/codegen/templates/command/handle.specs.d.ts +2 -0
  53. package/dist/src/codegen/templates/command/handle.specs.d.ts.map +1 -0
  54. package/dist/src/codegen/templates/command/handle.specs.js +326 -0
  55. package/dist/src/codegen/templates/command/handle.specs.js.map +1 -0
  56. package/dist/src/codegen/templates/command/mutation.resolver.specs.d.ts +2 -0
  57. package/dist/src/codegen/templates/command/mutation.resolver.specs.d.ts.map +1 -0
  58. package/dist/src/codegen/templates/command/mutation.resolver.specs.js +121 -0
  59. package/dist/src/codegen/templates/command/mutation.resolver.specs.js.map +1 -0
  60. package/dist/src/codegen/templates/command/register.specs.d.ts +2 -0
  61. package/dist/src/codegen/templates/command/register.specs.d.ts.map +1 -0
  62. package/dist/src/codegen/templates/command/register.specs.js +113 -0
  63. package/dist/src/codegen/templates/command/register.specs.js.map +1 -0
  64. package/dist/src/codegen/templates/command/state.specs.d.ts +2 -0
  65. package/dist/src/codegen/templates/command/state.specs.d.ts.map +1 -0
  66. package/dist/src/codegen/templates/command/state.specs.js +133 -0
  67. package/dist/src/codegen/templates/command/state.specs.js.map +1 -0
  68. package/dist/src/codegen/templates/query/projection.specs.d.ts +2 -0
  69. package/dist/src/codegen/templates/query/projection.specs.d.ts.map +1 -0
  70. package/dist/src/codegen/templates/query/projection.specs.js +363 -0
  71. package/dist/src/codegen/templates/query/projection.specs.js.map +1 -0
  72. package/dist/src/codegen/templates/query/projection.specs.specs..d.ts +2 -0
  73. package/dist/src/codegen/templates/query/projection.specs.specs..d.ts.map +1 -0
  74. package/dist/src/codegen/templates/query/projection.specs.specs..js +293 -0
  75. package/dist/src/codegen/templates/query/projection.specs.specs..js.map +1 -0
  76. package/dist/src/codegen/templates/query/query.resolver.specs.d.ts +2 -0
  77. package/dist/src/codegen/templates/query/query.resolver.specs.d.ts.map +1 -0
  78. package/dist/src/codegen/templates/query/query.resolver.specs.js +249 -0
  79. package/dist/src/codegen/templates/query/query.resolver.specs.js.map +1 -0
  80. package/dist/src/codegen/templates/query/state.specs.d.ts +2 -0
  81. package/dist/src/codegen/templates/query/state.specs.d.ts.map +1 -0
  82. package/dist/src/codegen/templates/query/state.specs.js +67 -0
  83. package/dist/src/codegen/templates/query/state.specs.js.map +1 -0
  84. package/dist/src/codegen/templates/react/react.specs.d.ts +2 -0
  85. package/dist/src/codegen/templates/react/react.specs.d.ts.map +1 -0
  86. package/dist/src/codegen/templates/react/react.specs.js +265 -0
  87. package/dist/src/codegen/templates/react/react.specs.js.map +1 -0
  88. package/dist/src/codegen/templates/react/react.specs.specs.d.ts +2 -0
  89. package/dist/src/codegen/templates/react/react.specs.specs.d.ts.map +1 -0
  90. package/dist/src/codegen/templates/react/react.specs.specs.js +229 -0
  91. package/dist/src/codegen/templates/react/react.specs.specs.js.map +1 -0
  92. package/dist/src/codegen/templates/react/register.specs.d.ts +2 -0
  93. package/dist/src/codegen/templates/react/register.specs.d.ts.map +1 -0
  94. package/dist/src/codegen/templates/react/register.specs.js +246 -0
  95. package/dist/src/codegen/templates/react/register.specs.js.map +1 -0
  96. package/dist/src/codegen/test-data/specVariant1.d.ts.map +1 -0
  97. package/dist/src/codegen/test-data/specVariant1.js.map +1 -0
  98. package/dist/src/codegen/types.d.ts.map +1 -0
  99. package/dist/{codegen → src/codegen}/types.js.map +1 -1
  100. package/dist/src/codegen/utils/path.d.ts.map +1 -0
  101. package/dist/src/codegen/utils/path.js.map +1 -0
  102. package/dist/src/commands/generate-server.d.ts.map +1 -0
  103. package/dist/src/commands/generate-server.js.map +1 -0
  104. package/dist/src/domain/shared/ReadModel.d.ts.map +1 -0
  105. package/dist/src/domain/shared/ReadModel.js.map +1 -0
  106. package/dist/src/domain/shared/index.d.ts.map +1 -0
  107. package/dist/src/domain/shared/index.js.map +1 -0
  108. package/dist/src/domain/shared/reactorSpecification.d.ts.map +1 -0
  109. package/dist/src/domain/shared/reactorSpecification.js.map +1 -0
  110. package/dist/src/domain/shared/sendCommand.d.ts.map +1 -0
  111. package/dist/src/domain/shared/sendCommand.js.map +1 -0
  112. package/dist/src/domain/shared/types.d.ts.map +1 -0
  113. package/dist/src/domain/shared/types.js.map +1 -0
  114. package/dist/src/index.d.ts.map +1 -0
  115. package/dist/src/index.js.map +1 -0
  116. package/dist/src/server.d.ts.map +1 -0
  117. package/dist/src/server.js.map +1 -0
  118. package/dist/src/utils/index.d.ts.map +1 -0
  119. package/dist/src/utils/index.js.map +1 -0
  120. package/dist/src/utils/loadProjections.d.ts.map +1 -0
  121. package/dist/src/utils/loadProjections.js.map +1 -0
  122. package/dist/src/utils/loadRegisterFiles.d.ts.map +1 -0
  123. package/dist/src/utils/loadRegisterFiles.js.map +1 -0
  124. package/dist/src/utils/loadResolvers.d.ts.map +1 -0
  125. package/dist/src/utils/loadResolvers.js.map +1 -0
  126. package/{tsconfig.tsbuildinfo → dist/tsconfig.tsbuildinfo} +1 -1
  127. package/package.json +6 -7
  128. package/src/codegen/extract/data-sink.ts +49 -23
  129. package/tsconfig.json +3 -2
  130. package/dist/codegen/extract/commands.d.ts.map +0 -1
  131. package/dist/codegen/extract/commands.js.map +0 -1
  132. package/dist/codegen/extract/data-sink.d.ts.map +0 -1
  133. package/dist/codegen/extract/data-sink.js.map +0 -1
  134. package/dist/codegen/extract/events.d.ts.map +0 -1
  135. package/dist/codegen/extract/events.js.map +0 -1
  136. package/dist/codegen/extract/fields.d.ts.map +0 -1
  137. package/dist/codegen/extract/fields.js.map +0 -1
  138. package/dist/codegen/extract/graphql.d.ts.map +0 -1
  139. package/dist/codegen/extract/graphql.js.map +0 -1
  140. package/dist/codegen/extract/gwt.d.ts.map +0 -1
  141. package/dist/codegen/extract/gwt.js.map +0 -1
  142. package/dist/codegen/extract/index.d.ts.map +0 -1
  143. package/dist/codegen/extract/index.js.map +0 -1
  144. package/dist/codegen/extract/messages.d.ts.map +0 -1
  145. package/dist/codegen/extract/messages.js.map +0 -1
  146. package/dist/codegen/extract/projection.d.ts.map +0 -1
  147. package/dist/codegen/extract/projection.js.map +0 -1
  148. package/dist/codegen/extract/query.d.ts.map +0 -1
  149. package/dist/codegen/extract/query.js.map +0 -1
  150. package/dist/codegen/extract/states.d.ts.map +0 -1
  151. package/dist/codegen/extract/states.js.map +0 -1
  152. package/dist/codegen/scaffoldFromSchema.d.ts.map +0 -1
  153. package/dist/codegen/scaffoldFromSchema.integration.specs.d.ts.map +0 -1
  154. package/dist/codegen/scaffoldFromSchema.integration.specs.js.map +0 -1
  155. package/dist/codegen/scaffoldFromSchema.js.map +0 -1
  156. package/dist/codegen/test-data/specVariant1.d.ts.map +0 -1
  157. package/dist/codegen/test-data/specVariant1.js.map +0 -1
  158. package/dist/codegen/types.d.ts.map +0 -1
  159. package/dist/codegen/utils/path.d.ts.map +0 -1
  160. package/dist/codegen/utils/path.js.map +0 -1
  161. package/dist/commands/generate-server.d.ts.map +0 -1
  162. package/dist/commands/generate-server.js.map +0 -1
  163. package/dist/domain/shared/ReadModel.d.ts.map +0 -1
  164. package/dist/domain/shared/ReadModel.js.map +0 -1
  165. package/dist/domain/shared/index.d.ts.map +0 -1
  166. package/dist/domain/shared/index.js.map +0 -1
  167. package/dist/domain/shared/reactorSpecification.d.ts.map +0 -1
  168. package/dist/domain/shared/reactorSpecification.js.map +0 -1
  169. package/dist/domain/shared/sendCommand.d.ts.map +0 -1
  170. package/dist/domain/shared/sendCommand.js.map +0 -1
  171. package/dist/domain/shared/types.d.ts.map +0 -1
  172. package/dist/domain/shared/types.js.map +0 -1
  173. package/dist/index.d.ts.map +0 -1
  174. package/dist/index.js.map +0 -1
  175. package/dist/server.d.ts.map +0 -1
  176. package/dist/server.js.map +0 -1
  177. package/dist/utils/index.d.ts.map +0 -1
  178. package/dist/utils/index.js.map +0 -1
  179. package/dist/utils/loadProjections.d.ts.map +0 -1
  180. package/dist/utils/loadProjections.js.map +0 -1
  181. package/dist/utils/loadRegisterFiles.d.ts.map +0 -1
  182. package/dist/utils/loadRegisterFiles.js.map +0 -1
  183. package/dist/utils/loadResolvers.d.ts.map +0 -1
  184. package/dist/utils/loadResolvers.js.map +0 -1
  185. /package/dist/{codegen → src/codegen}/extract/commands.d.ts +0 -0
  186. /package/dist/{codegen → src/codegen}/extract/commands.js +0 -0
  187. /package/dist/{codegen → src/codegen}/extract/data-sink.d.ts +0 -0
  188. /package/dist/{codegen → src/codegen}/extract/events.d.ts +0 -0
  189. /package/dist/{codegen → src/codegen}/extract/events.js +0 -0
  190. /package/dist/{codegen → src/codegen}/extract/fields.d.ts +0 -0
  191. /package/dist/{codegen → src/codegen}/extract/fields.js +0 -0
  192. /package/dist/{codegen → src/codegen}/extract/graphql.d.ts +0 -0
  193. /package/dist/{codegen → src/codegen}/extract/graphql.js +0 -0
  194. /package/dist/{codegen → src/codegen}/extract/gwt.d.ts +0 -0
  195. /package/dist/{codegen → src/codegen}/extract/gwt.js +0 -0
  196. /package/dist/{codegen → src/codegen}/extract/index.d.ts +0 -0
  197. /package/dist/{codegen → src/codegen}/extract/index.js +0 -0
  198. /package/dist/{codegen → src/codegen}/extract/messages.d.ts +0 -0
  199. /package/dist/{codegen → src/codegen}/extract/messages.js +0 -0
  200. /package/dist/{codegen → src/codegen}/extract/projection.d.ts +0 -0
  201. /package/dist/{codegen → src/codegen}/extract/projection.js +0 -0
  202. /package/dist/{codegen → src/codegen}/extract/query.d.ts +0 -0
  203. /package/dist/{codegen → src/codegen}/extract/query.js +0 -0
  204. /package/dist/{codegen → src/codegen}/extract/states.d.ts +0 -0
  205. /package/dist/{codegen → src/codegen}/extract/states.js +0 -0
  206. /package/dist/{codegen → src/codegen}/scaffoldFromSchema.d.ts +0 -0
  207. /package/dist/{codegen → src/codegen}/scaffoldFromSchema.integration.specs.d.ts +0 -0
  208. /package/dist/{codegen → src/codegen}/scaffoldFromSchema.integration.specs.js +0 -0
  209. /package/dist/{codegen → src/codegen}/scaffoldFromSchema.js +0 -0
  210. /package/dist/{codegen → src/codegen}/test-data/specVariant1.d.ts +0 -0
  211. /package/dist/{codegen → src/codegen}/test-data/specVariant1.js +0 -0
  212. /package/dist/{codegen → src/codegen}/types.d.ts +0 -0
  213. /package/dist/{codegen → src/codegen}/types.js +0 -0
  214. /package/dist/{codegen → src/codegen}/utils/path.d.ts +0 -0
  215. /package/dist/{codegen → src/codegen}/utils/path.js +0 -0
  216. /package/dist/{commands → src/commands}/generate-server.d.ts +0 -0
  217. /package/dist/{commands → src/commands}/generate-server.js +0 -0
  218. /package/dist/{domain → src/domain}/shared/ReadModel.d.ts +0 -0
  219. /package/dist/{domain → src/domain}/shared/ReadModel.js +0 -0
  220. /package/dist/{domain → src/domain}/shared/index.d.ts +0 -0
  221. /package/dist/{domain → src/domain}/shared/index.js +0 -0
  222. /package/dist/{domain → src/domain}/shared/reactorSpecification.d.ts +0 -0
  223. /package/dist/{domain → src/domain}/shared/reactorSpecification.js +0 -0
  224. /package/dist/{domain → src/domain}/shared/sendCommand.d.ts +0 -0
  225. /package/dist/{domain → src/domain}/shared/sendCommand.js +0 -0
  226. /package/dist/{domain → src/domain}/shared/types.d.ts +0 -0
  227. /package/dist/{domain → src/domain}/shared/types.js +0 -0
  228. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  229. /package/dist/{index.js → src/index.js} +0 -0
  230. /package/dist/{server.d.ts → src/server.d.ts} +0 -0
  231. /package/dist/{server.js → src/server.js} +0 -0
  232. /package/dist/{utils → src/utils}/index.d.ts +0 -0
  233. /package/dist/{utils → src/utils}/index.js +0 -0
  234. /package/dist/{utils → src/utils}/loadProjections.d.ts +0 -0
  235. /package/dist/{utils → src/utils}/loadProjections.js +0 -0
  236. /package/dist/{utils → src/utils}/loadRegisterFiles.d.ts +0 -0
  237. /package/dist/{utils → src/utils}/loadRegisterFiles.js +0 -0
  238. /package/dist/{utils → src/utils}/loadResolvers.d.ts +0 -0
  239. /package/dist/{utils → src/utils}/loadResolvers.js +0 -0
@@ -0,0 +1,326 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generateScaffoldFilePlans } from '../../scaffoldFromSchema.js';
3
+ describe('generateScaffoldFilePlans', () => {
4
+ it('should generate a valid handle file', async () => {
5
+ const spec = {
6
+ variant: 'specs',
7
+ flows: [
8
+ {
9
+ name: 'Host creates a listing',
10
+ slices: [
11
+ {
12
+ type: 'command',
13
+ name: 'Create listing',
14
+ stream: 'listing-${propertyId}',
15
+ client: {
16
+ description: 'test',
17
+ specs: [],
18
+ },
19
+ server: {
20
+ description: 'test',
21
+ specs: {
22
+ name: 'Create listing command',
23
+ rules: [
24
+ {
25
+ description: 'Should create listing successfully',
26
+ examples: [
27
+ {
28
+ description: 'User creates listing with valid data',
29
+ when: {
30
+ commandRef: 'CreateListing',
31
+ exampleData: {
32
+ propertyId: 'listing_123',
33
+ title: 'Modern Downtown Apartment',
34
+ listedAt: '2024-01-15T10:00:00Z',
35
+ rating: 4.8,
36
+ metadata: { foo: 'bar' },
37
+ },
38
+ },
39
+ then: [
40
+ {
41
+ eventRef: 'ListingCreated',
42
+ exampleData: {
43
+ propertyId: 'listing_123',
44
+ listedAt: '2024-01-15T10:00:00Z',
45
+ rating: 4.8,
46
+ metadata: { foo: 'bar' },
47
+ },
48
+ },
49
+ ],
50
+ },
51
+ ],
52
+ },
53
+ ],
54
+ },
55
+ data: [
56
+ {
57
+ target: {
58
+ type: 'Event',
59
+ name: 'ListingCreated',
60
+ },
61
+ destination: {
62
+ type: 'stream',
63
+ pattern: 'listings-${propertyId}',
64
+ },
65
+ },
66
+ ],
67
+ },
68
+ },
69
+ ],
70
+ },
71
+ ],
72
+ messages: [
73
+ {
74
+ type: 'command',
75
+ name: 'CreateListing',
76
+ fields: [
77
+ { name: 'propertyId', type: 'string', required: true },
78
+ { name: 'title', type: 'string', required: true },
79
+ { name: 'listedAt', type: 'Date', required: true },
80
+ { name: 'rating', type: 'number', required: true },
81
+ { name: 'metadata', type: 'object', required: true },
82
+ ],
83
+ },
84
+ {
85
+ type: 'event',
86
+ name: 'ListingCreated',
87
+ source: 'internal',
88
+ fields: [
89
+ { name: 'propertyId', type: 'string', required: true },
90
+ { name: 'title', type: 'string', required: true },
91
+ { name: 'listedAt', type: 'Date', required: true },
92
+ { name: 'rating', type: 'number', required: true },
93
+ { name: 'metadata', type: 'object', required: true },
94
+ ],
95
+ },
96
+ ],
97
+ };
98
+ const plans = await generateScaffoldFilePlans(spec.flows, spec.messages, undefined, 'src/domain/flows');
99
+ const handleFile = plans.find((p) => p.outputPath.endsWith('handle.ts'));
100
+ expect(handleFile?.contents).toMatchInlineSnapshot(`
101
+ "import { CommandHandler, type EventStore, type MessageHandlerResult } from '@event-driven-io/emmett';
102
+ import { evolve } from './evolve.js';
103
+ import { initialState } from './state.js';
104
+ import { decide } from './decide.js';
105
+ import type { CreateListing } from './commands.js';
106
+
107
+ const handler = CommandHandler({
108
+ evolve,
109
+ initialState,
110
+ });
111
+
112
+ export const handle = async (eventStore: EventStore, command: CreateListing): Promise<MessageHandlerResult> => {
113
+ const streamId = \`listings-\${command.data.propertyId}\`;
114
+
115
+ try {
116
+ await handler(eventStore, streamId, (state) => decide(command, state));
117
+ return; // success (returns void)
118
+ } catch (error: any) {
119
+ return {
120
+ type: 'SKIP',
121
+ reason: \`Command failed: \${error?.message ?? 'Unknown'}\`,
122
+ };
123
+ }
124
+ };
125
+ "
126
+ `);
127
+ });
128
+ it('should generate a valid handle file with integration', async () => {
129
+ const spec = {
130
+ variant: 'specs',
131
+ flows: [
132
+ {
133
+ name: 'Assistant suggests items',
134
+ slices: [
135
+ {
136
+ type: 'command',
137
+ name: 'Suggest Items',
138
+ stream: 'session-${sessionId}',
139
+ client: {
140
+ description: 'test',
141
+ specs: [],
142
+ },
143
+ server: {
144
+ description: '',
145
+ data: [
146
+ {
147
+ target: {
148
+ type: 'Command',
149
+ name: 'SuggestItems',
150
+ },
151
+ destination: {
152
+ type: 'integration',
153
+ systems: ['AI'],
154
+ message: {
155
+ name: 'DoChat',
156
+ type: 'command',
157
+ },
158
+ },
159
+ _additionalInstructions: 'Ensure systemPrompt includes product catalogue guidance',
160
+ _withState: {
161
+ target: {
162
+ type: 'State',
163
+ name: 'Products',
164
+ },
165
+ origin: {
166
+ type: 'integration',
167
+ systems: ['product-catalog'],
168
+ },
169
+ },
170
+ },
171
+ {
172
+ target: {
173
+ type: 'Event',
174
+ name: 'ItemsSuggested',
175
+ },
176
+ destination: {
177
+ type: 'stream',
178
+ pattern: 'session-${sessionId}',
179
+ },
180
+ },
181
+ ],
182
+ specs: {
183
+ name: 'Suggest items command',
184
+ rules: [
185
+ {
186
+ description: 'Should suggest items successfully',
187
+ examples: [
188
+ {
189
+ description: 'User requests item suggestions',
190
+ when: {
191
+ commandRef: 'SuggestItems',
192
+ exampleData: {
193
+ sessionId: 'session-123',
194
+ prompt: 'What should I buy?',
195
+ },
196
+ },
197
+ then: [
198
+ {
199
+ eventRef: 'ItemsSuggested',
200
+ exampleData: {
201
+ sessionId: 'session-123',
202
+ items: [],
203
+ },
204
+ },
205
+ ],
206
+ },
207
+ ],
208
+ },
209
+ ],
210
+ },
211
+ },
212
+ },
213
+ ],
214
+ },
215
+ ],
216
+ messages: [
217
+ {
218
+ type: 'command',
219
+ name: 'SuggestItems',
220
+ fields: [
221
+ { name: 'sessionId', type: 'string', required: true },
222
+ { name: 'prompt', type: 'string', required: true },
223
+ ],
224
+ },
225
+ {
226
+ type: 'command',
227
+ name: 'DoChat',
228
+ fields: [
229
+ { name: 'sessionId', type: 'string', required: true },
230
+ { name: 'prompt', type: 'string', required: true },
231
+ { name: 'systemPrompt', type: 'string', required: false },
232
+ ],
233
+ },
234
+ {
235
+ type: 'event',
236
+ name: 'ItemsSuggested',
237
+ source: 'internal',
238
+ fields: [
239
+ { name: 'sessionId', type: 'string', required: true },
240
+ { name: 'items', type: 'Array<object>', required: true },
241
+ ],
242
+ },
243
+ {
244
+ type: 'state',
245
+ name: 'Products',
246
+ fields: [
247
+ {
248
+ name: 'products',
249
+ type: 'Array<{ id: string, name: string }>',
250
+ required: true,
251
+ },
252
+ ],
253
+ },
254
+ ],
255
+ integrations: [
256
+ {
257
+ name: 'AI',
258
+ source: '@auto-engineer/ai-integration',
259
+ description: '',
260
+ },
261
+ {
262
+ name: 'product-catalog',
263
+ source: '@auto-engineer/product-catalogue-integration',
264
+ description: '',
265
+ },
266
+ ],
267
+ };
268
+ const plans = await generateScaffoldFilePlans(spec.flows, spec.messages, spec.integrations, 'src/domain/flows');
269
+ const handleFile = plans.find((p) => p.outputPath.endsWith('handle.ts'));
270
+ expect(handleFile?.contents).toMatchInlineSnapshot(`
271
+ "import '@auto-engineer/product-catalogue-integration';
272
+
273
+ import { AI } from '@auto-engineer/ai-integration';
274
+
275
+ import { Products } from '@auto-engineer/product-catalogue-integration';
276
+
277
+ import { CommandHandler, type EventStore, type MessageHandlerResult } from '@event-driven-io/emmett';
278
+ import { evolve } from './evolve.js';
279
+ import { initialState } from './state.js';
280
+ import { decide } from './decide.js';
281
+ import type { SuggestItems } from './commands.js';
282
+
283
+ /**
284
+ * ## IMPLEMENTATION INSTRUCTIONS ##
285
+ * Ensure systemPrompt includes product catalogue guidance
286
+ */
287
+
288
+ const handler = CommandHandler({
289
+ evolve,
290
+ initialState,
291
+ });
292
+
293
+ export const handle = async (eventStore: EventStore, command: SuggestItems): Promise<MessageHandlerResult> => {
294
+ const streamId = \`session-\${command.data.sessionId}\`;
295
+
296
+ try {
297
+ // TODO: Map fields from the incoming command to this integration input.
298
+ // - Use relevant fields from \`command.data\` to populate the required inputs below.
299
+ // - Some fields may require transformation or enrichment.
300
+ // - If additional context is needed, construct it here.
301
+ // const products: Products | undefined = await AI.Commands?.DoChat<Products>({
302
+ // type: 'DoChat',
303
+ // data: {
304
+ // // sessionId: ???
305
+ // prompt: ???
306
+ // systemPrompt: ???
307
+ // },
308
+ // });
309
+
310
+ await handler(eventStore, streamId, (state) =>
311
+ // TODO: add products as a parameter to decide once implemented above
312
+ decide(command, state /* products */),
313
+ );
314
+ return; // success (returns void)
315
+ } catch (error: any) {
316
+ return {
317
+ type: 'SKIP',
318
+ reason: \`Command failed: \${error?.message ?? 'Unknown'}\`,
319
+ };
320
+ }
321
+ };
322
+ "
323
+ `);
324
+ });
325
+ });
326
+ //# sourceMappingURL=handle.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle.specs.js","sourceRoot":"","sources":["../../../../../src/codegen/templates/command/handle.specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mutation.resolver.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.resolver.specs.d.ts","sourceRoot":"","sources":["../../../../../src/codegen/templates/command/mutation.resolver.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generateScaffoldFilePlans } from '../../scaffoldFromSchema.js';
3
+ describe('mutation.resolver.ts.ejs', () => {
4
+ it('should generate a valid mutation resolver file', async () => {
5
+ const spec = {
6
+ variant: 'specs',
7
+ flows: [
8
+ {
9
+ name: 'Host creates a listing',
10
+ slices: [
11
+ {
12
+ type: 'command',
13
+ name: 'Create listing',
14
+ client: {
15
+ description: 'A form that allows users to add a new listing',
16
+ specs: [],
17
+ },
18
+ server: {
19
+ description: 'Handles listing creation',
20
+ specs: {
21
+ name: 'Create listing command',
22
+ rules: [
23
+ {
24
+ description: 'Should create listing successfully',
25
+ examples: [
26
+ {
27
+ description: 'User creates listing with valid data',
28
+ when: {
29
+ commandRef: 'CreateListing',
30
+ exampleData: {
31
+ propertyId: 'listing_123',
32
+ title: 'Modern Downtown Apartment',
33
+ pricePerNight: 250,
34
+ maxGuests: 4,
35
+ amenities: ['wifi', 'kitchen'],
36
+ available: true,
37
+ tags: ['sea view', 'balcony'],
38
+ rating: 4.8,
39
+ metadata: { petsAllowed: true },
40
+ listedAt: '2024-01-15T10:00:00Z',
41
+ },
42
+ },
43
+ then: [],
44
+ },
45
+ ],
46
+ },
47
+ ],
48
+ },
49
+ },
50
+ },
51
+ ],
52
+ },
53
+ ],
54
+ messages: [
55
+ {
56
+ type: 'command',
57
+ name: 'CreateListing',
58
+ fields: [
59
+ { name: 'propertyId', type: 'string', required: true },
60
+ { name: 'title', type: 'string', required: true },
61
+ { name: 'pricePerNight', type: 'number', required: true },
62
+ { name: 'maxGuests', type: 'number', required: true },
63
+ { name: 'amenities', type: 'string[]', required: true },
64
+ { name: 'available', type: 'boolean', required: true },
65
+ { name: 'tags', type: 'string[]', required: true },
66
+ { name: 'rating', type: 'number', required: true },
67
+ { name: 'metadata', type: 'object', required: true },
68
+ { name: 'listedAt', type: 'Date', required: true },
69
+ ],
70
+ },
71
+ ],
72
+ };
73
+ const plans = await generateScaffoldFilePlans(spec.flows, spec.messages, undefined, 'src/domain/flows');
74
+ const mutationFile = plans.find((p) => p.outputPath.endsWith('mutation.resolver.ts'));
75
+ expect(mutationFile?.contents).toMatchInlineSnapshot(`
76
+ "import { Mutation, Resolver, Arg, Ctx, Field, InputType } from 'type-graphql';
77
+ import { type GraphQLContext, sendCommand, MutationResponse } from '../../../shared.js';
78
+
79
+ @InputType()
80
+ export class CreateListingInput {
81
+ @Field(() => String)
82
+ propertyId!: string;
83
+ @Field(() => String)
84
+ title!: string;
85
+ @Field(() => Number)
86
+ pricePerNight!: number;
87
+ @Field(() => Number)
88
+ maxGuests!: number;
89
+ @Field(() => [String])
90
+ amenities!: string[];
91
+ @Field(() => Boolean)
92
+ available!: boolean;
93
+ @Field(() => [String])
94
+ tags!: string[];
95
+ @Field(() => Number)
96
+ rating!: number;
97
+ @Field(() => Object)
98
+ metadata!: object;
99
+ @Field(() => Date)
100
+ listedAt!: Date;
101
+ }
102
+
103
+ @Resolver()
104
+ export class CreateListingResolver {
105
+ @Mutation(() => MutationResponse)
106
+ async createListing(
107
+ @Arg('input', () => CreateListingInput) input: CreateListingInput,
108
+ @Ctx() ctx: GraphQLContext,
109
+ ): Promise<MutationResponse> {
110
+ return await sendCommand(ctx.messageBus, {
111
+ type: 'CreateListing',
112
+ kind: 'Command',
113
+ data: { ...input },
114
+ });
115
+ }
116
+ }
117
+ "
118
+ `);
119
+ });
120
+ });
121
+ //# sourceMappingURL=mutation.resolver.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.resolver.specs.js","sourceRoot":"","sources":["../../../../../src/codegen/templates/command/mutation.resolver.specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,IAAI,GAAgB;YACxB,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,wBAAwB;oBAC9B,MAAM,EAAE;wBACN;4BACE,IAAI,EAAE,SAAS;4BACf,IAAI,EAAE,gBAAgB;4BACtB,MAAM,EAAE;gCACN,WAAW,EAAE,+CAA+C;gCAC5D,KAAK,EAAE,EAAE;6BACV;4BACD,MAAM,EAAE;gCACN,WAAW,EAAE,0BAA0B;gCACvC,KAAK,EAAE;oCACL,IAAI,EAAE,wBAAwB;oCAC9B,KAAK,EAAE;wCACL;4CACE,WAAW,EAAE,oCAAoC;4CACjD,QAAQ,EAAE;gDACR;oDACE,WAAW,EAAE,sCAAsC;oDACnD,IAAI,EAAE;wDACJ,UAAU,EAAE,eAAe;wDAC3B,WAAW,EAAE;4DACX,UAAU,EAAE,aAAa;4DACzB,KAAK,EAAE,2BAA2B;4DAClC,aAAa,EAAE,GAAG;4DAClB,SAAS,EAAE,CAAC;4DACZ,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;4DAC9B,SAAS,EAAE,IAAI;4DACf,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;4DAC7B,MAAM,EAAE,GAAG;4DACX,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;4DAC/B,QAAQ,EAAE,sBAAsB;yDACjC;qDACF;oDACD,IAAI,EAAE,EAAE;iDACT;6CACF;yCACF;qCACF;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;YACD,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE;wBACN,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACtD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACzD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACrD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACvD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACtD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAClD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBAClD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;wBACpD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;qBACnD;iBACF;aACF;SACF,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QACxG,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEtF,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2CpD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.specs.d.ts","sourceRoot":"","sources":["../../../../../src/codegen/templates/command/register.specs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generateScaffoldFilePlans } from '../../scaffoldFromSchema.js';
3
+ describe('generateScaffoldFilePlans', () => {
4
+ it('should generate a valid register file', async () => {
5
+ const spec = {
6
+ variant: 'specs',
7
+ flows: [
8
+ {
9
+ name: 'Host creates a listing',
10
+ slices: [
11
+ {
12
+ type: 'command',
13
+ name: 'Create listing',
14
+ stream: 'listings-${propertyId}',
15
+ client: {
16
+ description: 'test',
17
+ specs: [],
18
+ },
19
+ server: {
20
+ description: 'test',
21
+ specs: {
22
+ name: 'Create listing command',
23
+ rules: [
24
+ {
25
+ description: 'Should create listing successfully',
26
+ examples: [
27
+ {
28
+ description: 'User creates listing with valid data',
29
+ when: {
30
+ commandRef: 'CreateListing',
31
+ exampleData: {
32
+ propertyId: 'listing_123',
33
+ title: 'Modern Downtown Apartment',
34
+ listedAt: '2024-01-15T10:00:00Z',
35
+ rating: 4.8,
36
+ metadata: { foo: 'bar' },
37
+ },
38
+ },
39
+ then: [
40
+ {
41
+ eventRef: 'ListingCreated',
42
+ exampleData: {
43
+ propertyId: 'listing_123',
44
+ title: 'Modern Downtown Apartment',
45
+ listedAt: '2024-01-15T10:00:00Z',
46
+ rating: 4.8,
47
+ metadata: { foo: 'bar' },
48
+ },
49
+ },
50
+ ],
51
+ },
52
+ ],
53
+ },
54
+ ],
55
+ },
56
+ data: [
57
+ {
58
+ target: {
59
+ type: 'Event',
60
+ name: 'ListingCreated',
61
+ },
62
+ destination: {
63
+ type: 'stream',
64
+ pattern: 'listings-${propertyId}',
65
+ },
66
+ },
67
+ ],
68
+ },
69
+ },
70
+ ],
71
+ },
72
+ ],
73
+ messages: [
74
+ {
75
+ type: 'command',
76
+ name: 'CreateListing',
77
+ fields: [
78
+ { name: 'propertyId', type: 'string', required: true },
79
+ { name: 'title', type: 'string', required: true },
80
+ { name: 'listedAt', type: 'Date', required: true },
81
+ { name: 'rating', type: 'number', required: true },
82
+ { name: 'metadata', type: 'object', required: true },
83
+ ],
84
+ },
85
+ {
86
+ type: 'event',
87
+ name: 'ListingCreated',
88
+ source: 'internal',
89
+ fields: [
90
+ { name: 'propertyId', type: 'string', required: true },
91
+ { name: 'title', type: 'string', required: true },
92
+ { name: 'listedAt', type: 'Date', required: true },
93
+ { name: 'rating', type: 'number', required: true },
94
+ { name: 'metadata', type: 'object', required: true },
95
+ ],
96
+ },
97
+ ],
98
+ };
99
+ const plans = await generateScaffoldFilePlans(spec.flows, spec.messages, undefined, 'src/domain/flows');
100
+ const registerFile = plans.find((p) => p.outputPath.endsWith('register.ts'));
101
+ expect(registerFile?.contents).toMatchInlineSnapshot(`
102
+ "import type { CommandProcessor, EventStore } from '@event-driven-io/emmett';
103
+ import { handle } from './handle.js';
104
+ import type { CreateListing } from './commands.js';
105
+
106
+ export function register(messageBus: CommandProcessor, eventStore: EventStore) {
107
+ messageBus.handle((command: CreateListing) => handle(eventStore, command), 'CreateListing');
108
+ }
109
+ "
110
+ `);
111
+ });
112
+ });
113
+ //# sourceMappingURL=register.specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.specs.js","sourceRoot":"","sources":["../../../../../src/codegen/templates/command/register.specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=state.specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.specs.d.ts","sourceRoot":"","sources":["../../../../../src/codegen/templates/command/state.specs.ts"],"names":[],"mappings":""}