@auto-engineer/server-generator-apollo-emmett 0.1.1

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 (272) hide show
  1. package/.tmp/server-test-output/server/package.json +26 -0
  2. package/.tmp/server-test-output/server/scripts/generate-schema.ts +31 -0
  3. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/commands.ts +8 -0
  4. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/decide.specs.ts +36 -0
  5. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/decide.ts +33 -0
  6. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/events.ts +10 -0
  7. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/evolve.ts +28 -0
  8. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/handle.ts +24 -0
  9. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/mutation.resolver.ts +25 -0
  10. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/register.ts +7 -0
  11. package/.tmp/server-test-output/server/src/domain/flows/add-item/create-item/state.ts +47 -0
  12. package/.tmp/server-test-output/server/src/domain/flows/add-item/get-available-items/projection.specs.ts +46 -0
  13. package/.tmp/server-test-output/server/src/domain/flows/add-item/get-available-items/projection.ts +38 -0
  14. package/.tmp/server-test-output/server/src/domain/flows/add-item/get-available-items/query.resolver.ts +39 -0
  15. package/.tmp/server-test-output/server/src/domain/flows/add-item/get-available-items/state.ts +5 -0
  16. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/commands.ts +8 -0
  17. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/decide.specs.ts +36 -0
  18. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/decide.ts +33 -0
  19. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/events.ts +3 -0
  20. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/evolve.ts +28 -0
  21. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/handle.ts +24 -0
  22. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/mutation.resolver.ts +25 -0
  23. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/register.ts +7 -0
  24. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-new-item/state.ts +47 -0
  25. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-on-new-item/react.specs.ts +49 -0
  26. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-on-new-item/react.ts +43 -0
  27. package/.tmp/server-test-output/server/src/domain/flows/add-item/notify-on-new-item/register.ts +24 -0
  28. package/.tmp/server-test-output/server/src/domain/shared/ReadModel.ts +26 -0
  29. package/.tmp/server-test-output/server/src/domain/shared/index.ts +4 -0
  30. package/.tmp/server-test-output/server/src/domain/shared/reactorSpecification.ts +257 -0
  31. package/.tmp/server-test-output/server/src/domain/shared/sendCommand.ts +21 -0
  32. package/.tmp/server-test-output/server/src/domain/shared/types.ts +31 -0
  33. package/.tmp/server-test-output/server/src/server.ts +43 -0
  34. package/.tmp/server-test-output/server/src/utils/index.ts +3 -0
  35. package/.tmp/server-test-output/server/src/utils/loadProjections.ts +30 -0
  36. package/.tmp/server-test-output/server/src/utils/loadRegisterFiles.ts +41 -0
  37. package/.tmp/server-test-output/server/src/utils/loadResolvers.ts +36 -0
  38. package/.tmp/server-test-output/server/tsconfig.json +19 -0
  39. package/.tmp/server-test-output/server/vitest.config.ts +7 -0
  40. package/.turbo/turbo-build.log +5 -0
  41. package/.turbo/turbo-format.log +57 -0
  42. package/.turbo/turbo-lint.log +5 -0
  43. package/.turbo/turbo-test.log +113 -0
  44. package/.turbo/turbo-type-check.log +4 -0
  45. package/CHANGELOG.md +141 -0
  46. package/DEBUG.md +177 -0
  47. package/LICENSE +10 -0
  48. package/README.md +185 -0
  49. package/dist/cli-manifest.d.ts +3 -0
  50. package/dist/cli-manifest.d.ts.map +1 -0
  51. package/dist/cli-manifest.js +8 -0
  52. package/dist/cli-manifest.js.map +1 -0
  53. package/dist/codegen/extract/commands.d.ts +19 -0
  54. package/dist/codegen/extract/commands.d.ts.map +1 -0
  55. package/dist/codegen/extract/commands.js +52 -0
  56. package/dist/codegen/extract/commands.js.map +1 -0
  57. package/dist/codegen/extract/data-sink.d.ts +6 -0
  58. package/dist/codegen/extract/data-sink.d.ts.map +1 -0
  59. package/dist/codegen/extract/data-sink.js +39 -0
  60. package/dist/codegen/extract/data-sink.js.map +1 -0
  61. package/dist/codegen/extract/events.d.ts +10 -0
  62. package/dist/codegen/extract/events.d.ts.map +1 -0
  63. package/dist/codegen/extract/events.js +32 -0
  64. package/dist/codegen/extract/events.js.map +1 -0
  65. package/dist/codegen/extract/fields.d.ts +3 -0
  66. package/dist/codegen/extract/fields.d.ts.map +1 -0
  67. package/dist/codegen/extract/fields.js +9 -0
  68. package/dist/codegen/extract/fields.js.map +1 -0
  69. package/dist/codegen/extract/graphql.d.ts +14 -0
  70. package/dist/codegen/extract/graphql.d.ts.map +1 -0
  71. package/dist/codegen/extract/graphql.js +81 -0
  72. package/dist/codegen/extract/graphql.js.map +1 -0
  73. package/dist/codegen/extract/gwt.d.ts +6 -0
  74. package/dist/codegen/extract/gwt.d.ts.map +1 -0
  75. package/dist/codegen/extract/gwt.js +61 -0
  76. package/dist/codegen/extract/gwt.js.map +1 -0
  77. package/dist/codegen/extract/index.d.ts +8 -0
  78. package/dist/codegen/extract/index.d.ts.map +1 -0
  79. package/dist/codegen/extract/index.js +8 -0
  80. package/dist/codegen/extract/index.js.map +1 -0
  81. package/dist/codegen/extract/messages.d.ts +24 -0
  82. package/dist/codegen/extract/messages.d.ts.map +1 -0
  83. package/dist/codegen/extract/messages.js +131 -0
  84. package/dist/codegen/extract/messages.js.map +1 -0
  85. package/dist/codegen/extract/projection.d.ts +4 -0
  86. package/dist/codegen/extract/projection.d.ts.map +1 -0
  87. package/dist/codegen/extract/projection.js +30 -0
  88. package/dist/codegen/extract/projection.js.map +1 -0
  89. package/dist/codegen/extract/query.d.ts +11 -0
  90. package/dist/codegen/extract/query.d.ts.map +1 -0
  91. package/dist/codegen/extract/query.js +11 -0
  92. package/dist/codegen/extract/query.js.map +1 -0
  93. package/dist/codegen/extract/states.d.ts +5 -0
  94. package/dist/codegen/extract/states.d.ts.map +1 -0
  95. package/dist/codegen/extract/states.js +35 -0
  96. package/dist/codegen/extract/states.js.map +1 -0
  97. package/dist/codegen/scaffoldFromSchema.d.ts +9 -0
  98. package/dist/codegen/scaffoldFromSchema.d.ts.map +1 -0
  99. package/dist/codegen/scaffoldFromSchema.integration.specs.d.ts +2 -0
  100. package/dist/codegen/scaffoldFromSchema.integration.specs.d.ts.map +1 -0
  101. package/dist/codegen/scaffoldFromSchema.integration.specs.js +59 -0
  102. package/dist/codegen/scaffoldFromSchema.integration.specs.js.map +1 -0
  103. package/dist/codegen/scaffoldFromSchema.js +326 -0
  104. package/dist/codegen/scaffoldFromSchema.js.map +1 -0
  105. package/dist/codegen/templates/command/commands.specs.ts +90 -0
  106. package/dist/codegen/templates/command/commands.ts.ejs +11 -0
  107. package/dist/codegen/templates/command/decide.specs.specs.ts +265 -0
  108. package/dist/codegen/templates/command/decide.specs.ts +542 -0
  109. package/dist/codegen/templates/command/decide.specs.ts.ejs +51 -0
  110. package/dist/codegen/templates/command/decide.ts.ejs +107 -0
  111. package/dist/codegen/templates/command/events.specs.ts +106 -0
  112. package/dist/codegen/templates/command/events.ts.ejs +14 -0
  113. package/dist/codegen/templates/command/evolve.specs.ts +102 -0
  114. package/dist/codegen/templates/command/evolve.ts.ejs +39 -0
  115. package/dist/codegen/templates/command/handle.specs.ts +313 -0
  116. package/dist/codegen/templates/command/handle.ts.ejs +111 -0
  117. package/dist/codegen/templates/command/mutation.resolver.specs.ts +115 -0
  118. package/dist/codegen/templates/command/mutation.resolver.ts.ejs +25 -0
  119. package/dist/codegen/templates/command/register.specs.ts +107 -0
  120. package/dist/codegen/templates/command/register.ts.ejs +12 -0
  121. package/dist/codegen/templates/command/state.specs.ts +127 -0
  122. package/dist/codegen/templates/command/state.ts.ejs +47 -0
  123. package/dist/codegen/templates/query/projection.specs.specs..ts +276 -0
  124. package/dist/codegen/templates/query/projection.specs.ts +348 -0
  125. package/dist/codegen/templates/query/projection.specs.ts.ejs +71 -0
  126. package/dist/codegen/templates/query/projection.ts.ejs +121 -0
  127. package/dist/codegen/templates/query/query.resolver.specs.ts +254 -0
  128. package/dist/codegen/templates/query/query.resolver.ts.ejs +98 -0
  129. package/dist/codegen/templates/query/state.specs.ts +70 -0
  130. package/dist/codegen/templates/query/state.ts.ejs +7 -0
  131. package/dist/codegen/templates/react/react.specs.specs.ts +214 -0
  132. package/dist/codegen/templates/react/react.specs.ts +241 -0
  133. package/dist/codegen/templates/react/react.specs.ts.ejs +80 -0
  134. package/dist/codegen/templates/react/react.ts.ejs +56 -0
  135. package/dist/codegen/templates/react/register.specs.ts +222 -0
  136. package/dist/codegen/templates/react/register.ts.ejs +39 -0
  137. package/dist/codegen/test-data/specVariant1.d.ts +4 -0
  138. package/dist/codegen/test-data/specVariant1.d.ts.map +1 -0
  139. package/dist/codegen/test-data/specVariant1.js +185 -0
  140. package/dist/codegen/test-data/specVariant1.js.map +1 -0
  141. package/dist/codegen/types.d.ts +35 -0
  142. package/dist/codegen/types.d.ts.map +1 -0
  143. package/dist/codegen/types.js +2 -0
  144. package/dist/codegen/types.js.map +1 -0
  145. package/dist/codegen/utils/path.d.ts +4 -0
  146. package/dist/codegen/utils/path.d.ts.map +1 -0
  147. package/dist/codegen/utils/path.js +18 -0
  148. package/dist/codegen/utils/path.js.map +1 -0
  149. package/dist/commands/generate-server.d.ts +81 -0
  150. package/dist/commands/generate-server.d.ts.map +1 -0
  151. package/dist/commands/generate-server.js +383 -0
  152. package/dist/commands/generate-server.js.map +1 -0
  153. package/dist/domain/shared/ReadModel.d.ts +10 -0
  154. package/dist/domain/shared/ReadModel.d.ts.map +1 -0
  155. package/dist/domain/shared/ReadModel.js +19 -0
  156. package/dist/domain/shared/ReadModel.js.map +1 -0
  157. package/dist/domain/shared/ReadModel.ts +26 -0
  158. package/dist/domain/shared/index.d.ts +5 -0
  159. package/dist/domain/shared/index.d.ts.map +1 -0
  160. package/dist/domain/shared/index.js +5 -0
  161. package/dist/domain/shared/index.js.map +1 -0
  162. package/dist/domain/shared/index.ts +4 -0
  163. package/dist/domain/shared/reactorSpecification.d.ts +35 -0
  164. package/dist/domain/shared/reactorSpecification.d.ts.map +1 -0
  165. package/dist/domain/shared/reactorSpecification.js +155 -0
  166. package/dist/domain/shared/reactorSpecification.js.map +1 -0
  167. package/dist/domain/shared/reactorSpecification.ts +257 -0
  168. package/dist/domain/shared/sendCommand.d.ts +4 -0
  169. package/dist/domain/shared/sendCommand.d.ts.map +1 -0
  170. package/dist/domain/shared/sendCommand.js +17 -0
  171. package/dist/domain/shared/sendCommand.js.map +1 -0
  172. package/dist/domain/shared/sendCommand.ts +21 -0
  173. package/dist/domain/shared/types.d.ts +19 -0
  174. package/dist/domain/shared/types.d.ts.map +1 -0
  175. package/dist/domain/shared/types.js +39 -0
  176. package/dist/domain/shared/types.js.map +1 -0
  177. package/dist/domain/shared/types.ts +31 -0
  178. package/dist/index.d.ts +3 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +3 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/server.d.ts +2 -0
  183. package/dist/server.d.ts.map +1 -0
  184. package/dist/server.js +33 -0
  185. package/dist/server.js.map +1 -0
  186. package/dist/server.ts +43 -0
  187. package/dist/utils/index.d.ts +4 -0
  188. package/dist/utils/index.d.ts.map +1 -0
  189. package/dist/utils/index.js +4 -0
  190. package/dist/utils/index.js.map +1 -0
  191. package/dist/utils/index.ts +3 -0
  192. package/dist/utils/loadProjections.d.ts +3 -0
  193. package/dist/utils/loadProjections.d.ts.map +1 -0
  194. package/dist/utils/loadProjections.js +23 -0
  195. package/dist/utils/loadProjections.js.map +1 -0
  196. package/dist/utils/loadProjections.ts +30 -0
  197. package/dist/utils/loadRegisterFiles.d.ts +6 -0
  198. package/dist/utils/loadRegisterFiles.d.ts.map +1 -0
  199. package/dist/utils/loadRegisterFiles.js +28 -0
  200. package/dist/utils/loadRegisterFiles.js.map +1 -0
  201. package/dist/utils/loadRegisterFiles.ts +41 -0
  202. package/dist/utils/loadResolvers.d.ts +5 -0
  203. package/dist/utils/loadResolvers.d.ts.map +1 -0
  204. package/dist/utils/loadResolvers.js +27 -0
  205. package/dist/utils/loadResolvers.js.map +1 -0
  206. package/dist/utils/loadResolvers.ts +36 -0
  207. package/package.json +55 -0
  208. package/src/cli-manifest.ts +9 -0
  209. package/src/codegen/extract/commands.ts +79 -0
  210. package/src/codegen/extract/data-sink.ts +45 -0
  211. package/src/codegen/extract/events.ts +46 -0
  212. package/src/codegen/extract/fields.ts +17 -0
  213. package/src/codegen/extract/graphql.ts +103 -0
  214. package/src/codegen/extract/gwt.ts +75 -0
  215. package/src/codegen/extract/index.ts +7 -0
  216. package/src/codegen/extract/messages.ts +196 -0
  217. package/src/codegen/extract/projection.ts +47 -0
  218. package/src/codegen/extract/query.ts +18 -0
  219. package/src/codegen/extract/states.ts +45 -0
  220. package/src/codegen/scaffoldFromSchema.integration.specs.ts +71 -0
  221. package/src/codegen/scaffoldFromSchema.ts +440 -0
  222. package/src/codegen/templates/command/commands.specs.ts +90 -0
  223. package/src/codegen/templates/command/commands.ts.ejs +11 -0
  224. package/src/codegen/templates/command/decide.specs.specs.ts +265 -0
  225. package/src/codegen/templates/command/decide.specs.ts +542 -0
  226. package/src/codegen/templates/command/decide.specs.ts.ejs +51 -0
  227. package/src/codegen/templates/command/decide.ts.ejs +107 -0
  228. package/src/codegen/templates/command/events.specs.ts +106 -0
  229. package/src/codegen/templates/command/events.ts.ejs +14 -0
  230. package/src/codegen/templates/command/evolve.specs.ts +102 -0
  231. package/src/codegen/templates/command/evolve.ts.ejs +39 -0
  232. package/src/codegen/templates/command/handle.specs.ts +313 -0
  233. package/src/codegen/templates/command/handle.ts.ejs +111 -0
  234. package/src/codegen/templates/command/mutation.resolver.specs.ts +115 -0
  235. package/src/codegen/templates/command/mutation.resolver.ts.ejs +25 -0
  236. package/src/codegen/templates/command/register.specs.ts +107 -0
  237. package/src/codegen/templates/command/register.ts.ejs +12 -0
  238. package/src/codegen/templates/command/state.specs.ts +127 -0
  239. package/src/codegen/templates/command/state.ts.ejs +47 -0
  240. package/src/codegen/templates/query/projection.specs.specs..ts +276 -0
  241. package/src/codegen/templates/query/projection.specs.ts +348 -0
  242. package/src/codegen/templates/query/projection.specs.ts.ejs +71 -0
  243. package/src/codegen/templates/query/projection.ts.ejs +121 -0
  244. package/src/codegen/templates/query/query.resolver.specs.ts +254 -0
  245. package/src/codegen/templates/query/query.resolver.ts.ejs +98 -0
  246. package/src/codegen/templates/query/state.specs.ts +70 -0
  247. package/src/codegen/templates/query/state.ts.ejs +7 -0
  248. package/src/codegen/templates/react/react.specs.specs.ts +214 -0
  249. package/src/codegen/templates/react/react.specs.ts +241 -0
  250. package/src/codegen/templates/react/react.specs.ts.ejs +80 -0
  251. package/src/codegen/templates/react/react.ts.ejs +56 -0
  252. package/src/codegen/templates/react/register.specs.ts +222 -0
  253. package/src/codegen/templates/react/register.ts.ejs +39 -0
  254. package/src/codegen/test-data/specVariant1.json +212 -0
  255. package/src/codegen/test-data/specVariant1.ts +188 -0
  256. package/src/codegen/test-data/specVariant2.json +396 -0
  257. package/src/codegen/types.ts +35 -0
  258. package/src/codegen/utils/path.ts +20 -0
  259. package/src/commands/generate-server.ts +517 -0
  260. package/src/domain/shared/ReadModel.ts +26 -0
  261. package/src/domain/shared/index.ts +4 -0
  262. package/src/domain/shared/reactorSpecification.ts +257 -0
  263. package/src/domain/shared/sendCommand.ts +21 -0
  264. package/src/domain/shared/types.ts +31 -0
  265. package/src/index.ts +2 -0
  266. package/src/server.ts +43 -0
  267. package/src/utils/index.ts +3 -0
  268. package/src/utils/loadProjections.ts +30 -0
  269. package/src/utils/loadRegisterFiles.ts +41 -0
  270. package/src/utils/loadResolvers.ts +36 -0
  271. package/tsconfig.json +12 -0
  272. package/tsconfig.tsbuildinfo +1 -0
package/README.md ADDED
@@ -0,0 +1,185 @@
1
+ # @auto-engineer/server-generator-apollo-emmett
2
+
3
+ Code generation plugin for the Auto Engineer CLI that scaffolds event-driven servers using the Emmett event sourcing framework. This plugin takes Flow specifications and generates GraphQL servers with commands, events, projections, and queries.
4
+
5
+ ## Installation
6
+
7
+ This is a plugin for the Auto Engineer CLI. Install both the CLI and this plugin:
8
+
9
+ ```bash
10
+ npm install -g @auto-engineer/cli
11
+ npm install @auto-engineer/server-generator-apollo-emmett
12
+ ```
13
+
14
+ ## Configuration
15
+
16
+ Add this plugin to your `auto.config.ts`:
17
+
18
+ ```typescript
19
+ export default {
20
+ plugins: [
21
+ '@auto-engineer/server-generator-apollo-emmett',
22
+ // ... other plugins
23
+ ],
24
+ };
25
+ ```
26
+
27
+ ## Commands
28
+
29
+ This plugin provides the following commands:
30
+
31
+ - `generate:server` - Generate a GraphQL server from flow specifications
32
+
33
+ ## What does this plugin do?
34
+
35
+ The Emmett Generator transforms high-level flow specifications into event-driven servers. It generates:
36
+
37
+ ### Command Handlers
38
+
39
+ - Command validation and business logic stubs
40
+ - Event emission patterns
41
+ - Error handling and domain validation
42
+ - Integration with the Emmett command bus
43
+
44
+ ### Event Sourcing Infrastructure
45
+
46
+ - Event store configuration
47
+ - Event versioning and migration support
48
+ - Projection builders for read models
49
+ - Event stream processing
50
+
51
+ ### GraphQL API Layer
52
+
53
+ - Type-safe GraphQL schema generation
54
+ - Mutation resolvers for commands
55
+ - Query resolvers for projections
56
+ - Subscription support for real-time updates
57
+
58
+ ### Testing Infrastructure
59
+
60
+ - Comprehensive test suites for all generated components
61
+ - Behavioral tests for command handlers
62
+ - Integration tests for the GraphQL API
63
+ - Test data factories and fixtures
64
+
65
+ ## Generated Project Structure
66
+
67
+ When you run `auto generate:server`, the plugin creates a complete server project:
68
+
69
+ ```
70
+ server/
71
+ ├── src/
72
+ │ ├── domain/
73
+ │ │ ├── commands/ # Command handlers
74
+ │ │ ├── events/ # Event definitions
75
+ │ │ ├── projections/ # Read model projections
76
+ │ │ └── queries/ # Query handlers
77
+ │ ├── graphql/
78
+ │ │ ├── resolvers/ # GraphQL resolvers
79
+ │ │ └── schema.ts # Generated schema
80
+ │ ├── infrastructure/
81
+ │ │ ├── eventStore.ts # Event store setup
82
+ │ │ └── commandBus.ts # Command bus configuration
83
+ │ └── server.ts # Application entry point
84
+ ├── tests/ # Generated test suites
85
+ └── package.json
86
+ ```
87
+
88
+ ## Features
89
+
90
+ ### Type-Safe Code Generation
91
+
92
+ All generated code is fully typed using TypeScript, ensuring compile-time safety and developer experience.
93
+
94
+ ### Event-Driven Architecture
95
+
96
+ Built on Emmett's event sourcing patterns:
97
+
98
+ - Commands represent intent to change state
99
+ - Events capture what actually happened
100
+ - Projections create read models from events
101
+ - Queries serve data to GraphQL clients
102
+
103
+ ### Infrastructure
104
+
105
+ Generated servers include:
106
+
107
+ - Error handling and logging
108
+ - Health checks and monitoring endpoints
109
+ - Environment-based configuration
110
+ - Database migration scripts
111
+
112
+ ### Templates
113
+
114
+ Uses EJS templating system for code generation:
115
+
116
+ - Command handler templates
117
+ - Event definition templates
118
+ - GraphQL resolver templates
119
+ - Test suite templates
120
+
121
+ ## Integration with Flow
122
+
123
+ This plugin is designed to work with `@auto-engineer/flow` specifications:
124
+
125
+ 1. Define your business flows using the Flow DSL
126
+ 2. Export the flow schema using `auto export:schema`
127
+ 3. Generate the server using `auto generate:server`
128
+ 4. The generator reads the schema and creates appropriate handlers
129
+
130
+ ## Example Workflow
131
+
132
+ ```bash
133
+ # 1. Create a flow specification project
134
+ auto create:example
135
+
136
+ # 2. Define your business flows in flows/
137
+ # Edit flows/order-management.flow.ts
138
+
139
+ # 3. Generate the server server
140
+ auto generate:server
141
+
142
+ # 4. The generated server is ready to run:
143
+ cd server
144
+ npm install
145
+ npm run start
146
+ ```
147
+
148
+ ## Advanced Features
149
+
150
+ ### Custom Templates
151
+
152
+ Override default templates by providing your own EJS files:
153
+
154
+ - Place custom templates in `.auto-engineer/templates/`
155
+ - Templates follow the same structure as built-in ones
156
+ - Supports partial overrides for specific components
157
+
158
+ ### Plugin Integration
159
+
160
+ Works with other Auto Engineer plugins:
161
+
162
+ - **@auto-engineer/server-implementer**: AI-powered implementation of generated stubs
163
+ - **@auto-engineer/server-checks**: Validation of generated code
164
+ - **@auto-engineer/frontend-generator-react-graphql**: Frontend generation from server schema
165
+
166
+ ### Configuration Options
167
+
168
+ Customize generation behavior through `auto.config.ts`:
169
+
170
+ ```typescript
171
+ export default {
172
+ plugins: [
173
+ [
174
+ '@auto-engineer/server-generator-apollo-emmett',
175
+ {
176
+ outputDir: './server',
177
+ templateOverrides: './templates',
178
+ generateMigrations: true,
179
+ },
180
+ ],
181
+ ],
182
+ };
183
+ ```
184
+
185
+ The Emmett Generator bridges the gap between high-level business requirements and server infrastructure, enabling development of scalable, maintainable applications.
@@ -0,0 +1,3 @@
1
+ import type { CliManifest } from '@auto-engineer/cli/manifest-types';
2
+ export declare const CLI_MANIFEST: CliManifest;
3
+ //# sourceMappingURL=cli-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-manifest.d.ts","sourceRoot":"","sources":["../src/cli-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAGrE,eAAO,MAAM,YAAY,EAAE,WAK1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { generateServerManifest } from './commands/generate-server.js';
2
+ export const CLI_MANIFEST = {
3
+ category: '@auto-engineer/server-generator-apollo-emmett',
4
+ commands: {
5
+ 'generate:server': generateServerManifest,
6
+ },
7
+ };
8
+ //# sourceMappingURL=cli-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-manifest.js","sourceRoot":"","sources":["../src/cli-manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,QAAQ,EAAE,+CAA+C;IACzD,QAAQ,EAAE;QACR,iBAAiB,EAAE,sBAAsB;KAC1C;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { CommandExample, EventExample } from '@auto-engineer/flow';
2
+ import { Message, MessageDefinition } from '../types';
3
+ import { ReactGwtSpec } from './messages';
4
+ export declare function extractCommandsFromGwt(gwtSpecs: Array<{
5
+ given?: EventExample[];
6
+ when: CommandExample;
7
+ then: Array<EventExample | {
8
+ errorType: string;
9
+ message?: string;
10
+ }>;
11
+ }>, allMessages: MessageDefinition[]): {
12
+ commands: Message[];
13
+ commandSchemasByName: Record<string, Message>;
14
+ };
15
+ export declare function extractCommandsFromThen(gwtSpecs: ReactGwtSpec[], allMessages: MessageDefinition[]): {
16
+ commands: Message[];
17
+ commandSchemasByName: Record<string, Message>;
18
+ };
19
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/codegen/extract/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoB1C,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC,YAAY,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE,CAAC,EACF,WAAW,EAAE,iBAAiB,EAAE,GAC/B;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAiBxE;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,YAAY,EAAE,EACxB,WAAW,EAAE,iBAAiB,EAAE,GAC/B;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CA0BxE"}
@@ -0,0 +1,52 @@
1
+ import { extractFieldsFromMessage } from './fields.js';
2
+ function createCommandMessage(commandRef, allMessages, source) {
3
+ const fields = extractFieldsFromMessage(commandRef, 'command', allMessages);
4
+ if (fields.length === 0 && source === 'then') {
5
+ return undefined;
6
+ }
7
+ return {
8
+ type: commandRef,
9
+ fields,
10
+ source,
11
+ };
12
+ }
13
+ export function extractCommandsFromGwt(gwtSpecs, allMessages) {
14
+ const commandSchemasByName = {};
15
+ const commands = gwtSpecs
16
+ .map((gwt) => {
17
+ const cmd = gwt.when;
18
+ if (!cmd.commandRef)
19
+ return undefined;
20
+ const command = createCommandMessage(cmd.commandRef, allMessages, 'when');
21
+ if (command) {
22
+ commandSchemasByName[cmd.commandRef] = command;
23
+ }
24
+ return command;
25
+ })
26
+ .filter((cmd) => cmd !== undefined);
27
+ return { commands, commandSchemasByName };
28
+ }
29
+ export function extractCommandsFromThen(gwtSpecs, allMessages) {
30
+ const commands = [];
31
+ const commandSchemasByName = {};
32
+ for (const gwt of gwtSpecs) {
33
+ if (!Array.isArray(gwt.then)) {
34
+ continue;
35
+ }
36
+ for (const commandExample of gwt.then) {
37
+ if (!commandExample.commandRef) {
38
+ continue;
39
+ }
40
+ const commandRef = commandExample.commandRef;
41
+ if (!(commandRef in commandSchemasByName)) {
42
+ const command = createCommandMessage(commandRef, allMessages, 'then');
43
+ if (command) {
44
+ commands.push(command);
45
+ commandSchemasByName[commandRef] = command;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ return { commands, commandSchemasByName };
51
+ }
52
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/codegen/extract/commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAGpD,SAAS,oBAAoB,CAC3B,UAAkB,EAClB,WAAgC,EAChC,MAAuB;IAEvB,MAAM,MAAM,GAAG,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAIE,EACF,WAAgC;IAEhC,MAAM,oBAAoB,GAA4B,EAAE,CAAC;IAEzD,MAAM,QAAQ,GAAc,QAAQ;SACjC,GAAG,CAAC,CAAC,GAAG,EAAuB,EAAE;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAEtC,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1E,IAAI,OAAO,EAAE,CAAC;YACZ,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;QACjD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAG,EAAkB,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IAEtD,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,QAAwB,EACxB,WAAgC;IAEhC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,oBAAoB,GAA4B,EAAE,CAAC;IAEzD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,KAAK,MAAM,cAAc,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;gBAC/B,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC;YAC7C,IAAI,CAAC,CAAC,UAAU,IAAI,oBAAoB,CAAC,EAAE,CAAC;gBAC1C,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;gBACtE,IAAI,OAAO,EAAE,CAAC;oBACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACvB,oBAAoB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Slice } from '@auto-engineer/flow';
2
+ export declare function getStreamFromSink(slice: Slice): {
3
+ streamPattern?: string;
4
+ streamId?: string;
5
+ };
6
+ //# sourceMappingURL=data-sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-sink.d.ts","sourceRoot":"","sources":["../../../src/codegen/extract/data-sink.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQtE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAoC7F"}
@@ -0,0 +1,39 @@
1
+ function resolveStreamId(stream, exampleData) {
2
+ return stream.replace(/\$\{([^}]+)\}/g, (_, key) => String(exampleData?.[key] ?? 'unknown'));
3
+ }
4
+ // eslint-disable-next-line complexity
5
+ export function getStreamFromSink(slice) {
6
+ let streamPattern;
7
+ let streamId;
8
+ const gwtSpecs = slice.type === 'command'
9
+ ? slice.server?.gwt
10
+ : slice.type === 'query'
11
+ ? slice.server?.gwt
12
+ : slice.type === 'react'
13
+ ? slice.server?.gwt
14
+ : [];
15
+ let exampleData = {};
16
+ switch (slice.type) {
17
+ case 'react':
18
+ exampleData = gwtSpecs[0].when?.[0]?.exampleData ?? {};
19
+ break;
20
+ case 'command': {
21
+ const then = gwtSpecs[0]?.then;
22
+ const firstExample = then.find((t) => 'exampleData' in t);
23
+ exampleData = firstExample?.exampleData ?? {};
24
+ break;
25
+ }
26
+ case 'query':
27
+ exampleData = gwtSpecs[0]?.given?.[0]?.exampleData ?? {};
28
+ break;
29
+ }
30
+ const sink = (slice.server?.data ?? []).find((item) => item?.destination?.type === 'stream');
31
+ if (sink && sink.destination.type === 'stream' && 'pattern' in sink.destination) {
32
+ streamPattern = sink.destination.pattern;
33
+ if (streamPattern != null) {
34
+ streamId = resolveStreamId(streamPattern, exampleData);
35
+ }
36
+ }
37
+ return { streamPattern, streamId };
38
+ }
39
+ //# sourceMappingURL=data-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-sink.js","sourceRoot":"","sources":["../../../src/codegen/extract/data-sink.ts"],"names":[],"mappings":"AAGA,SAAS,eAAe,CAAC,MAAc,EAAE,WAAoC;IAC3E,OAAO,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC5C,IAAI,aAAiC,CAAC;IACtC,IAAI,QAA4B,CAAC;IACjC,MAAM,QAAQ,GACZ,KAAK,CAAC,IAAI,KAAK,SAAS;QACtB,CAAC,CAAE,KAAK,CAAC,MAAM,EAAE,GAAwB;QACzC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;YACtB,CAAC,CAAE,KAAK,CAAC,MAAM,EAAE,GAAsB;YACvC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtB,CAAC,CAAE,KAAK,CAAC,MAAM,EAAE,GAAsB;gBACvC,CAAC,CAAC,EAAE,CAAC;IACb,IAAI,WAAW,GAA4B,EAAE,CAAC;IAC9C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,WAAW,GAAI,QAA2B,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC;YAC3E,MAAM;QACR,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,IAAI,GAAI,QAA6B,CAAC,CAAC,CAAC,EAAE,IAAkD,CAAC;YACnG,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAuB,EAAE,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;YAC/E,WAAW,GAAG,YAAY,EAAE,WAAW,IAAI,EAAE,CAAC;YAC9C,MAAM;QACR,CAAC;QACD,KAAK,OAAO;YACV,WAAW,GAAI,QAA2B,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC;YAC7E,MAAM;IACV,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,IAAiB,EAAE,WAAW,EAAE,IAAI,KAAK,QAAQ,CAE5F,CAAC;IACd,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAChF,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QACzC,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,QAAQ,GAAG,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { EventExample } from '@auto-engineer/flow';
2
+ import { Message, MessageDefinition } from '../types';
3
+ import { ReactGwtSpec } from './messages';
4
+ export declare function extractEventsFromThen(thenItems: Array<EventExample | {
5
+ errorType: string;
6
+ message?: string;
7
+ }>, allMessages: MessageDefinition[]): Message[];
8
+ export declare function extractEventsFromGiven(givenEvents: EventExample[] | undefined, allMessages: MessageDefinition[]): Message[];
9
+ export declare function extractEventsFromWhen(gwtSpecs: ReactGwtSpec[], allMessages: MessageDefinition[]): Message[];
10
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/codegen/extract/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAY1C,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,KAAK,CAAC,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACxE,WAAW,EAAE,iBAAiB,EAAE,GAC/B,OAAO,EAAE,CAOX;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,YAAY,EAAE,GAAG,SAAS,EACvC,WAAW,EAAE,iBAAiB,EAAE,GAC/B,OAAO,EAAE,CAMX;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,OAAO,EAAE,CAO3G"}
@@ -0,0 +1,32 @@
1
+ import { extractFieldsFromMessage } from './fields.js';
2
+ function createEventMessage(eventRef, source, allMessages) {
3
+ if (eventRef == null)
4
+ return undefined;
5
+ const fields = extractFieldsFromMessage(eventRef, 'event', allMessages);
6
+ return { type: eventRef, fields, source };
7
+ }
8
+ export function extractEventsFromThen(thenItems, allMessages) {
9
+ return thenItems
10
+ .map((then) => {
11
+ if (!('eventRef' in then))
12
+ return undefined;
13
+ return createEventMessage(then.eventRef, 'then', allMessages);
14
+ })
15
+ .filter((event) => event !== undefined);
16
+ }
17
+ export function extractEventsFromGiven(givenEvents, allMessages) {
18
+ if (!givenEvents)
19
+ return [];
20
+ return givenEvents
21
+ .map((given) => createEventMessage(given.eventRef, 'given', allMessages))
22
+ .filter((event) => event !== undefined);
23
+ }
24
+ export function extractEventsFromWhen(gwtSpecs, allMessages) {
25
+ return gwtSpecs.flatMap((gwt) => {
26
+ if (!Array.isArray(gwt.when)) {
27
+ return [];
28
+ }
29
+ return gwt.when.flatMap((eventExample) => extractEventsFromGiven([eventExample], allMessages));
30
+ });
31
+ }
32
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/codegen/extract/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAGpD,SAAS,kBAAkB,CACzB,QAA4B,EAC5B,MAAiC,EACjC,WAAgC;IAEhC,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACxE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAAwE,EACxE,WAAgC;IAEhC,OAAO,SAAS;SACb,GAAG,CAAC,CAAC,IAAI,EAAuB,EAAE;QACjC,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAChE,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAoB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,WAAuC,EACvC,WAAgC;IAEhC,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAE5B,OAAO,WAAW;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;SACxE,MAAM,CAAC,CAAC,KAAK,EAAoB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAwB,EAAE,WAAgC;IAC9F,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Field, MessageDefinition } from '../types';
2
+ export declare function extractFieldsFromMessage(messageName: string, messageType: 'command' | 'event' | 'state', allMessages: MessageDefinition[]): Field[];
3
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../../src/codegen/extract/fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEpD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,EAC1C,WAAW,EAAE,iBAAiB,EAAE,GAC/B,KAAK,EAAE,CAUT"}
@@ -0,0 +1,9 @@
1
+ export function extractFieldsFromMessage(messageName, messageType, allMessages) {
2
+ const messageDef = allMessages.find((m) => m.type === messageType && m.name === messageName);
3
+ return (messageDef?.fields?.map((f) => ({
4
+ name: f.name,
5
+ tsType: f.type,
6
+ required: f.required ?? true,
7
+ })) ?? []);
8
+ }
9
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/codegen/extract/fields.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,WAA0C,EAC1C,WAAgC;IAEhC,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IAE7F,OAAO,CACL,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,IAAI;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;KAC7B,CAAC,CAAC,IAAI,EAAE,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface ParsedArg {
2
+ name: string;
3
+ tsType: string;
4
+ graphqlType: string;
5
+ nullable: boolean;
6
+ }
7
+ export interface ParsedGraphQlQuery {
8
+ queryName: string;
9
+ args: ParsedArg[];
10
+ returnType: string;
11
+ tsReturnType: string;
12
+ }
13
+ export declare function parseGraphQlRequest(request: string): ParsedGraphQlQuery;
14
+ //# sourceMappingURL=graphql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../../src/codegen/extract/graphql.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AA8CD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAsCvE"}
@@ -0,0 +1,81 @@
1
+ import { parse, print } from 'graphql';
2
+ function getTypeName(typeNode) {
3
+ if (typeNode.kind === 'NamedType') {
4
+ return { graphqlType: typeNode.name.value, nullable: true };
5
+ }
6
+ else if (typeNode.kind === 'NonNullType') {
7
+ const inner = getTypeName(typeNode.type);
8
+ return { ...inner, nullable: false };
9
+ }
10
+ else {
11
+ return getTypeName(typeNode.type);
12
+ }
13
+ }
14
+ function graphqlToTs(type) {
15
+ switch (type) {
16
+ case 'String':
17
+ return 'string';
18
+ case 'Int':
19
+ case 'Float':
20
+ case 'Number':
21
+ return 'number';
22
+ case 'Boolean':
23
+ return 'boolean';
24
+ case 'Date':
25
+ return 'Date';
26
+ default:
27
+ return type;
28
+ }
29
+ }
30
+ function convertJsonAstToSdl(request) {
31
+ // Handle JSON-serialized AST
32
+ if (request.startsWith('{') && request.includes('"kind"')) {
33
+ try {
34
+ const ast = JSON.parse(request);
35
+ if (typeof ast === 'object' && ast !== null && 'kind' in ast && ast.kind === 'Document') {
36
+ // Convert AST to SDL string - cast is safe here as we've validated it's a Document
37
+ return print(ast);
38
+ }
39
+ }
40
+ catch {
41
+ // If parsing fails, assume it's already a GraphQL string
42
+ }
43
+ }
44
+ return request;
45
+ }
46
+ export function parseGraphQlRequest(request) {
47
+ const sdlRequest = convertJsonAstToSdl(request);
48
+ const ast = parse(sdlRequest);
49
+ const op = ast.definitions.find((d) => d.kind === 'OperationDefinition' && d.operation === 'query');
50
+ if (!op)
51
+ throw new Error('No query operation found');
52
+ const queryName = op.name?.value;
53
+ if (queryName == null)
54
+ throw new Error('Query must have a name');
55
+ const args = (op.variableDefinitions ?? []).map((def) => {
56
+ const varName = def.variable.name.value;
57
+ const { graphqlType, nullable } = getTypeName(def.type);
58
+ return {
59
+ name: varName,
60
+ graphqlType,
61
+ tsType: graphqlToTs(graphqlType),
62
+ nullable,
63
+ };
64
+ });
65
+ const field = op.selectionSet.selections[0];
66
+ if (field?.kind !== 'Field' || !field.name.value) {
67
+ throw new Error('Query selection must be a field');
68
+ }
69
+ const baseName = field.name.value;
70
+ const returnType = pascalCase(baseName) + 'View';
71
+ return {
72
+ queryName: baseName,
73
+ args,
74
+ returnType,
75
+ tsReturnType: `${returnType}[]`,
76
+ };
77
+ }
78
+ function pascalCase(input) {
79
+ return input.replace(/(^\w|_\w)/g, (match) => match.replace('_', '').toUpperCase());
80
+ }
81
+ //# sourceMappingURL=graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../../src/codegen/extract/graphql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Slice } from '@auto-engineer/flow';
2
+ import { GwtCondition } from '../types';
3
+ export declare function buildCommandGwtMapping(slice: Slice): Record<string, (GwtCondition & {
4
+ failingFields?: string[];
5
+ })[]>;
6
+ //# sourceMappingURL=gwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gwt.d.ts","sourceRoot":"","sources":["../../../src/codegen/extract/gwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,YAAY,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EAAE,CAAC,CAiCpH"}
@@ -0,0 +1,61 @@
1
+ export function buildCommandGwtMapping(slice) {
2
+ if (slice.type !== 'command') {
3
+ return {};
4
+ }
5
+ const gwtSpecs = slice.server?.gwt ?? [];
6
+ const mapping = {};
7
+ for (const gwt of gwtSpecs) {
8
+ const command = gwt.when?.commandRef;
9
+ if (command) {
10
+ mapping[command] = mapping[command] ?? [];
11
+ mapping[command].push({
12
+ given: gwt.given,
13
+ when: gwt.when,
14
+ then: gwt.then,
15
+ });
16
+ }
17
+ }
18
+ const enhancedMapping = {};
19
+ for (const command in mapping) {
20
+ const merged = mergeGwtConditions(mapping[command]);
21
+ const successfulData = findSuccessfulExampleData(merged);
22
+ enhancedMapping[command] = merged.map((gwt) => ({
23
+ ...gwt,
24
+ failingFields: findFailingFields(gwt, successfulData),
25
+ }));
26
+ }
27
+ return enhancedMapping;
28
+ }
29
+ function mergeGwtConditions(gwts) {
30
+ const map = new Map();
31
+ for (const gwt of gwts) {
32
+ const key = JSON.stringify(gwt.when.exampleData);
33
+ const existing = map.get(key) ?? [];
34
+ map.set(key, [...existing, gwt]);
35
+ }
36
+ return Array.from(map.values()).map((conditions) => {
37
+ const first = conditions[0];
38
+ const combinedThen = conditions.flatMap((g) => g.then);
39
+ return {
40
+ given: conditions.flatMap((g) => g.given ?? []),
41
+ when: first.when,
42
+ then: combinedThen,
43
+ };
44
+ });
45
+ }
46
+ function findSuccessfulExampleData(gwts) {
47
+ const successful = gwts.find((gwt) => gwt.then.some((t) => typeof t === 'object' && t !== null && 'eventRef' in t));
48
+ return successful?.when.exampleData ?? {};
49
+ }
50
+ function findFailingFields(gwt, successfulData) {
51
+ const hasError = gwt.then.some((t) => typeof t === 'object' && t !== null && 'errorType' in t);
52
+ if (!hasError)
53
+ return [];
54
+ return Object.entries(gwt.when.exampleData)
55
+ .filter(([key, val]) => {
56
+ const successVal = successfulData[key];
57
+ return val === '' && successVal !== '' && successVal !== undefined;
58
+ })
59
+ .map(([key]) => key);
60
+ }
61
+ //# sourceMappingURL=gwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gwt.js","sourceRoot":"","sources":["../../../src/codegen/extract/gwt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './commands';
2
+ export * from './events';
3
+ export * from './gwt';
4
+ export * from './states';
5
+ export * from './messages';
6
+ export * from './query';
7
+ export * from './projection';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/codegen/extract/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './commands.js';
2
+ export * from './events.js';
3
+ export * from './gwt.js';
4
+ export * from './states.js';
5
+ export * from './messages.js';
6
+ export * from './query.js';
7
+ export * from './projection.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/codegen/extract/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}