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

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 (245) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/CHANGELOG.md +16 -0
  3. package/dist/src/codegen/extract/commands.d.ts.map +1 -0
  4. package/dist/src/codegen/extract/commands.js.map +1 -0
  5. package/dist/src/codegen/extract/data-sink.d.ts.map +1 -0
  6. package/dist/{codegen → src/codegen}/extract/data-sink.js +33 -10
  7. package/dist/src/codegen/extract/data-sink.js.map +1 -0
  8. package/dist/src/codegen/extract/events.d.ts.map +1 -0
  9. package/dist/src/codegen/extract/events.js.map +1 -0
  10. package/dist/src/codegen/extract/fields.d.ts.map +1 -0
  11. package/dist/src/codegen/extract/fields.js.map +1 -0
  12. package/dist/src/codegen/extract/graphql.d.ts.map +1 -0
  13. package/dist/src/codegen/extract/graphql.js.map +1 -0
  14. package/dist/src/codegen/extract/gwt.d.ts.map +1 -0
  15. package/dist/src/codegen/extract/gwt.js.map +1 -0
  16. package/dist/src/codegen/extract/index.d.ts.map +1 -0
  17. package/dist/src/codegen/extract/index.js.map +1 -0
  18. package/dist/src/codegen/extract/messages.d.ts.map +1 -0
  19. package/dist/src/codegen/extract/messages.js.map +1 -0
  20. package/dist/src/codegen/extract/projection.d.ts.map +1 -0
  21. package/dist/src/codegen/extract/projection.js.map +1 -0
  22. package/dist/src/codegen/extract/query.d.ts.map +1 -0
  23. package/dist/src/codegen/extract/query.js.map +1 -0
  24. package/dist/src/codegen/extract/states.d.ts.map +1 -0
  25. package/dist/src/codegen/extract/states.js.map +1 -0
  26. package/dist/src/codegen/scaffoldFromSchema.d.ts +9 -0
  27. package/dist/src/codegen/scaffoldFromSchema.d.ts.map +1 -0
  28. package/dist/src/codegen/scaffoldFromSchema.integration.specs.d.ts.map +1 -0
  29. package/dist/src/codegen/scaffoldFromSchema.integration.specs.js.map +1 -0
  30. package/dist/{codegen → src/codegen}/scaffoldFromSchema.js +54 -18
  31. package/dist/src/codegen/scaffoldFromSchema.js.map +1 -0
  32. package/dist/{codegen → src/codegen}/templates/command/commands.specs.ts +1 -2
  33. package/dist/{codegen → src/codegen}/templates/command/decide.specs.specs.ts +3 -3
  34. package/dist/{codegen → src/codegen}/templates/command/decide.specs.ts +1 -5
  35. package/dist/{codegen → src/codegen}/templates/command/events.specs.ts +1 -2
  36. package/dist/{codegen → src/codegen}/templates/command/evolve.specs.ts +1 -2
  37. package/dist/{codegen → src/codegen}/templates/command/handle.specs.ts +1 -3
  38. package/dist/src/codegen/templates/command/mutation.resolver.specs.ts +363 -0
  39. package/dist/src/codegen/templates/command/mutation.resolver.ts.ejs +99 -0
  40. package/dist/{codegen → src/codegen}/templates/command/register.specs.ts +1 -2
  41. package/dist/{codegen → src/codegen}/templates/command/state.specs.ts +1 -2
  42. package/dist/{codegen → src/codegen}/templates/query/projection.specs.specs..ts +3 -3
  43. package/dist/{codegen → src/codegen}/templates/query/projection.specs.ts +5 -9
  44. package/dist/{codegen → src/codegen}/templates/query/query.resolver.specs.ts +194 -23
  45. package/dist/src/codegen/templates/query/query.resolver.ts.ejs +137 -0
  46. package/dist/{codegen → src/codegen}/templates/query/state.specs.ts +1 -2
  47. package/dist/{codegen → src/codegen}/templates/react/react.specs.specs.ts +2 -2
  48. package/dist/{codegen → src/codegen}/templates/react/react.specs.ts +3 -3
  49. package/dist/{codegen → src/codegen}/templates/react/register.specs.ts +3 -3
  50. package/dist/src/codegen/test-data/specVariant1.d.ts +4 -0
  51. package/dist/src/codegen/test-data/specVariant1.d.ts.map +1 -0
  52. package/dist/{codegen → src/codegen}/test-data/specVariant1.js +4 -2
  53. package/dist/src/codegen/test-data/specVariant1.js.map +1 -0
  54. package/dist/src/codegen/types.d.ts.map +1 -0
  55. package/dist/{codegen → src/codegen}/types.js.map +1 -1
  56. package/dist/src/codegen/utils/path.d.ts.map +1 -0
  57. package/dist/src/codegen/utils/path.js.map +1 -0
  58. package/dist/src/commands/generate-server.d.ts.map +1 -0
  59. package/dist/{commands → src/commands}/generate-server.js +34 -24
  60. package/dist/src/commands/generate-server.js.map +1 -0
  61. package/dist/src/domain/shared/ReadModel.d.ts.map +1 -0
  62. package/dist/src/domain/shared/ReadModel.js.map +1 -0
  63. package/dist/src/domain/shared/index.d.ts.map +1 -0
  64. package/dist/src/domain/shared/index.js.map +1 -0
  65. package/dist/src/domain/shared/reactorSpecification.d.ts.map +1 -0
  66. package/dist/src/domain/shared/reactorSpecification.js.map +1 -0
  67. package/dist/src/domain/shared/sendCommand.d.ts.map +1 -0
  68. package/dist/src/domain/shared/sendCommand.js.map +1 -0
  69. package/dist/src/domain/shared/types.d.ts.map +1 -0
  70. package/dist/src/domain/shared/types.js.map +1 -0
  71. package/dist/src/index.d.ts.map +1 -0
  72. package/dist/src/index.js.map +1 -0
  73. package/dist/src/server.d.ts.map +1 -0
  74. package/dist/src/server.js.map +1 -0
  75. package/dist/src/utils/index.d.ts.map +1 -0
  76. package/dist/src/utils/index.js.map +1 -0
  77. package/dist/src/utils/loadProjections.d.ts.map +1 -0
  78. package/dist/src/utils/loadProjections.js.map +1 -0
  79. package/dist/src/utils/loadRegisterFiles.d.ts.map +1 -0
  80. package/dist/src/utils/loadRegisterFiles.js.map +1 -0
  81. package/dist/src/utils/loadResolvers.d.ts.map +1 -0
  82. package/dist/src/utils/loadResolvers.js.map +1 -0
  83. package/dist/tsconfig.tsbuildinfo +1 -0
  84. package/package.json +10 -10
  85. package/src/codegen/extract/data-sink.ts +49 -23
  86. package/src/codegen/scaffoldFromSchema.ts +52 -20
  87. package/src/codegen/templates/command/commands.specs.ts +1 -2
  88. package/src/codegen/templates/command/decide.specs.specs.ts +3 -3
  89. package/src/codegen/templates/command/decide.specs.ts +1 -5
  90. package/src/codegen/templates/command/events.specs.ts +1 -2
  91. package/src/codegen/templates/command/evolve.specs.ts +1 -2
  92. package/src/codegen/templates/command/handle.specs.ts +1 -3
  93. package/src/codegen/templates/command/mutation.resolver.specs.ts +247 -8
  94. package/src/codegen/templates/command/mutation.resolver.ts.ejs +86 -12
  95. package/src/codegen/templates/command/register.specs.ts +1 -2
  96. package/src/codegen/templates/command/state.specs.ts +1 -2
  97. package/src/codegen/templates/query/projection.specs.specs..ts +3 -3
  98. package/src/codegen/templates/query/projection.specs.ts +5 -9
  99. package/src/codegen/templates/query/query.resolver.specs.ts +194 -23
  100. package/src/codegen/templates/query/query.resolver.ts.ejs +84 -45
  101. package/src/codegen/templates/query/state.specs.ts +1 -2
  102. package/src/codegen/templates/react/react.specs.specs.ts +2 -2
  103. package/src/codegen/templates/react/react.specs.ts +3 -3
  104. package/src/codegen/templates/react/register.specs.ts +3 -3
  105. package/src/codegen/test-data/specVariant1.ts +5 -3
  106. package/src/commands/generate-server.ts +38 -30
  107. package/tsconfig.json +3 -2
  108. package/tsconfig.test.json +9 -0
  109. package/.turbo/turbo-test.log +0 -14
  110. package/.turbo/turbo-type-check.log +0 -4
  111. package/dist/codegen/extract/commands.d.ts.map +0 -1
  112. package/dist/codegen/extract/commands.js.map +0 -1
  113. package/dist/codegen/extract/data-sink.d.ts.map +0 -1
  114. package/dist/codegen/extract/data-sink.js.map +0 -1
  115. package/dist/codegen/extract/events.d.ts.map +0 -1
  116. package/dist/codegen/extract/events.js.map +0 -1
  117. package/dist/codegen/extract/fields.d.ts.map +0 -1
  118. package/dist/codegen/extract/fields.js.map +0 -1
  119. package/dist/codegen/extract/graphql.d.ts.map +0 -1
  120. package/dist/codegen/extract/graphql.js.map +0 -1
  121. package/dist/codegen/extract/gwt.d.ts.map +0 -1
  122. package/dist/codegen/extract/gwt.js.map +0 -1
  123. package/dist/codegen/extract/index.d.ts.map +0 -1
  124. package/dist/codegen/extract/index.js.map +0 -1
  125. package/dist/codegen/extract/messages.d.ts.map +0 -1
  126. package/dist/codegen/extract/messages.js.map +0 -1
  127. package/dist/codegen/extract/projection.d.ts.map +0 -1
  128. package/dist/codegen/extract/projection.js.map +0 -1
  129. package/dist/codegen/extract/query.d.ts.map +0 -1
  130. package/dist/codegen/extract/query.js.map +0 -1
  131. package/dist/codegen/extract/states.d.ts.map +0 -1
  132. package/dist/codegen/extract/states.js.map +0 -1
  133. package/dist/codegen/scaffoldFromSchema.d.ts +0 -9
  134. package/dist/codegen/scaffoldFromSchema.d.ts.map +0 -1
  135. package/dist/codegen/scaffoldFromSchema.integration.specs.d.ts.map +0 -1
  136. package/dist/codegen/scaffoldFromSchema.integration.specs.js.map +0 -1
  137. package/dist/codegen/scaffoldFromSchema.js.map +0 -1
  138. package/dist/codegen/templates/command/mutation.resolver.specs.ts +0 -124
  139. package/dist/codegen/templates/command/mutation.resolver.ts.ejs +0 -25
  140. package/dist/codegen/templates/query/query.resolver.ts.ejs +0 -98
  141. package/dist/codegen/test-data/specVariant1.d.ts +0 -4
  142. package/dist/codegen/test-data/specVariant1.d.ts.map +0 -1
  143. package/dist/codegen/test-data/specVariant1.js.map +0 -1
  144. package/dist/codegen/types.d.ts.map +0 -1
  145. package/dist/codegen/utils/path.d.ts.map +0 -1
  146. package/dist/codegen/utils/path.js.map +0 -1
  147. package/dist/commands/generate-server.d.ts.map +0 -1
  148. package/dist/commands/generate-server.js.map +0 -1
  149. package/dist/domain/shared/ReadModel.d.ts.map +0 -1
  150. package/dist/domain/shared/ReadModel.js.map +0 -1
  151. package/dist/domain/shared/index.d.ts.map +0 -1
  152. package/dist/domain/shared/index.js.map +0 -1
  153. package/dist/domain/shared/reactorSpecification.d.ts.map +0 -1
  154. package/dist/domain/shared/reactorSpecification.js.map +0 -1
  155. package/dist/domain/shared/sendCommand.d.ts.map +0 -1
  156. package/dist/domain/shared/sendCommand.js.map +0 -1
  157. package/dist/domain/shared/types.d.ts.map +0 -1
  158. package/dist/domain/shared/types.js.map +0 -1
  159. package/dist/index.d.ts.map +0 -1
  160. package/dist/index.js.map +0 -1
  161. package/dist/server.d.ts.map +0 -1
  162. package/dist/server.js.map +0 -1
  163. package/dist/utils/index.d.ts.map +0 -1
  164. package/dist/utils/index.js.map +0 -1
  165. package/dist/utils/loadProjections.d.ts.map +0 -1
  166. package/dist/utils/loadProjections.js.map +0 -1
  167. package/dist/utils/loadRegisterFiles.d.ts.map +0 -1
  168. package/dist/utils/loadRegisterFiles.js.map +0 -1
  169. package/dist/utils/loadResolvers.d.ts.map +0 -1
  170. package/dist/utils/loadResolvers.js.map +0 -1
  171. package/tsconfig.tsbuildinfo +0 -1
  172. /package/dist/{codegen → src/codegen}/extract/commands.d.ts +0 -0
  173. /package/dist/{codegen → src/codegen}/extract/commands.js +0 -0
  174. /package/dist/{codegen → src/codegen}/extract/data-sink.d.ts +0 -0
  175. /package/dist/{codegen → src/codegen}/extract/events.d.ts +0 -0
  176. /package/dist/{codegen → src/codegen}/extract/events.js +0 -0
  177. /package/dist/{codegen → src/codegen}/extract/fields.d.ts +0 -0
  178. /package/dist/{codegen → src/codegen}/extract/fields.js +0 -0
  179. /package/dist/{codegen → src/codegen}/extract/graphql.d.ts +0 -0
  180. /package/dist/{codegen → src/codegen}/extract/graphql.js +0 -0
  181. /package/dist/{codegen → src/codegen}/extract/gwt.d.ts +0 -0
  182. /package/dist/{codegen → src/codegen}/extract/gwt.js +0 -0
  183. /package/dist/{codegen → src/codegen}/extract/index.d.ts +0 -0
  184. /package/dist/{codegen → src/codegen}/extract/index.js +0 -0
  185. /package/dist/{codegen → src/codegen}/extract/messages.d.ts +0 -0
  186. /package/dist/{codegen → src/codegen}/extract/messages.js +0 -0
  187. /package/dist/{codegen → src/codegen}/extract/projection.d.ts +0 -0
  188. /package/dist/{codegen → src/codegen}/extract/projection.js +0 -0
  189. /package/dist/{codegen → src/codegen}/extract/query.d.ts +0 -0
  190. /package/dist/{codegen → src/codegen}/extract/query.js +0 -0
  191. /package/dist/{codegen → src/codegen}/extract/states.d.ts +0 -0
  192. /package/dist/{codegen → src/codegen}/extract/states.js +0 -0
  193. /package/dist/{codegen → src/codegen}/scaffoldFromSchema.integration.specs.d.ts +0 -0
  194. /package/dist/{codegen → src/codegen}/scaffoldFromSchema.integration.specs.js +0 -0
  195. /package/dist/{codegen → src/codegen}/templates/command/commands.ts.ejs +0 -0
  196. /package/dist/{codegen → src/codegen}/templates/command/decide.specs.ts.ejs +0 -0
  197. /package/dist/{codegen → src/codegen}/templates/command/decide.ts.ejs +0 -0
  198. /package/dist/{codegen → src/codegen}/templates/command/events.ts.ejs +0 -0
  199. /package/dist/{codegen → src/codegen}/templates/command/evolve.ts.ejs +0 -0
  200. /package/dist/{codegen → src/codegen}/templates/command/handle.ts.ejs +0 -0
  201. /package/dist/{codegen → src/codegen}/templates/command/register.ts.ejs +0 -0
  202. /package/dist/{codegen → src/codegen}/templates/command/state.ts.ejs +0 -0
  203. /package/dist/{codegen → src/codegen}/templates/query/projection.specs.ts.ejs +0 -0
  204. /package/dist/{codegen → src/codegen}/templates/query/projection.ts.ejs +0 -0
  205. /package/dist/{codegen → src/codegen}/templates/query/state.ts.ejs +0 -0
  206. /package/dist/{codegen → src/codegen}/templates/react/react.specs.ts.ejs +0 -0
  207. /package/dist/{codegen → src/codegen}/templates/react/react.ts.ejs +0 -0
  208. /package/dist/{codegen → src/codegen}/templates/react/register.ts.ejs +0 -0
  209. /package/dist/{codegen → src/codegen}/types.d.ts +0 -0
  210. /package/dist/{codegen → src/codegen}/types.js +0 -0
  211. /package/dist/{codegen → src/codegen}/utils/path.d.ts +0 -0
  212. /package/dist/{codegen → src/codegen}/utils/path.js +0 -0
  213. /package/dist/{commands → src/commands}/generate-server.d.ts +0 -0
  214. /package/dist/{domain → src/domain}/shared/ReadModel.d.ts +0 -0
  215. /package/dist/{domain → src/domain}/shared/ReadModel.js +0 -0
  216. /package/dist/{domain → src/domain}/shared/ReadModel.ts +0 -0
  217. /package/dist/{domain → src/domain}/shared/index.d.ts +0 -0
  218. /package/dist/{domain → src/domain}/shared/index.js +0 -0
  219. /package/dist/{domain → src/domain}/shared/index.ts +0 -0
  220. /package/dist/{domain → src/domain}/shared/reactorSpecification.d.ts +0 -0
  221. /package/dist/{domain → src/domain}/shared/reactorSpecification.js +0 -0
  222. /package/dist/{domain → src/domain}/shared/reactorSpecification.ts +0 -0
  223. /package/dist/{domain → src/domain}/shared/sendCommand.d.ts +0 -0
  224. /package/dist/{domain → src/domain}/shared/sendCommand.js +0 -0
  225. /package/dist/{domain → src/domain}/shared/sendCommand.ts +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/{domain → src/domain}/shared/types.ts +0 -0
  229. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  230. /package/dist/{index.js → src/index.js} +0 -0
  231. /package/dist/{server.d.ts → src/server.d.ts} +0 -0
  232. /package/dist/{server.js → src/server.js} +0 -0
  233. /package/dist/{server.ts → src/server.ts} +0 -0
  234. /package/dist/{utils → src/utils}/index.d.ts +0 -0
  235. /package/dist/{utils → src/utils}/index.js +0 -0
  236. /package/dist/{utils → src/utils}/index.ts +0 -0
  237. /package/dist/{utils → src/utils}/loadProjections.d.ts +0 -0
  238. /package/dist/{utils → src/utils}/loadProjections.js +0 -0
  239. /package/dist/{utils → src/utils}/loadProjections.ts +0 -0
  240. /package/dist/{utils → src/utils}/loadRegisterFiles.d.ts +0 -0
  241. /package/dist/{utils → src/utils}/loadRegisterFiles.js +0 -0
  242. /package/dist/{utils → src/utils}/loadRegisterFiles.ts +0 -0
  243. /package/dist/{utils → src/utils}/loadResolvers.d.ts +0 -0
  244. /package/dist/{utils → src/utils}/loadResolvers.js +0 -0
  245. /package/dist/{utils → src/utils}/loadResolvers.ts +0 -0
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@auto-engineer/server-generator-apollo-emmett",
3
3
  "type": "module",
4
- "main": "./dist/index.js",
5
- "types": "./dist/index.d.ts",
4
+ "main": "./dist/src/index.js",
5
+ "types": "./dist/src/index.d.ts",
6
6
  "exports": {
7
7
  ".": {
8
- "types": "./dist/index.d.ts",
9
- "import": "./dist/index.js"
8
+ "types": "./dist/src/index.d.ts",
9
+ "import": "./dist/src/index.js"
10
10
  }
11
11
  },
12
12
  "dependencies": {
@@ -25,10 +25,11 @@
25
25
  "reflect-metadata": "^0.2.2",
26
26
  "type-fest": "^4.41.0",
27
27
  "type-graphql": "^2.0.0-rc.2",
28
+ "graphql-type-json": "^0.3.2",
28
29
  "uuid": "^10.0.0",
29
30
  "web-streams-polyfill": "^4.1.0",
30
- "@auto-engineer/flow": "0.8.4",
31
- "@auto-engineer/message-bus": "0.8.4"
31
+ "@auto-engineer/flow": "0.8.6",
32
+ "@auto-engineer/message-bus": "0.8.6"
32
33
  },
33
34
  "publishConfig": {
34
35
  "access": "public"
@@ -36,13 +37,12 @@
36
37
  "devDependencies": {
37
38
  "@types/ejs": "^3.1.5",
38
39
  "@types/fs-extra": "^11.0.4",
39
- "@auto-engineer/cli": "0.8.4"
40
+ "@auto-engineer/cli": "0.8.6"
40
41
  },
41
- "version": "0.8.4",
42
+ "version": "0.8.6",
42
43
  "scripts": {
43
44
  "generate:server": "tsx src/cli/index.ts",
44
- "build": "tsc && tsx ../../scripts/fix-esm-imports.ts && rm -rf dist/codegen/templates && mkdir -p dist/codegen && cp -r src/codegen/templates dist/codegen/templates && cp src/server.ts dist/ && cp -r src/utils dist/ && cp -r src/domain dist/",
45
- "dev": "tsc --watch",
45
+ "build": "tsc && tsx ../../scripts/fix-esm-imports.ts && rm -rf dist/src/codegen/templates && mkdir -p dist/src/codegen && cp -r src/codegen/templates dist/src/codegen/templates && cp src/server.ts dist/src && cp -r src/utils dist/src && cp -r src/domain dist/src",
46
46
  "test": "vitest run --reporter=dot",
47
47
  "type-check": "tsc --noEmit --project tsconfig.json",
48
48
  "lint": "eslint 'src/**/*.ts' --ignore-pattern '**/*.specs.ts' --ignore-pattern '**/.tmp/**' --max-warnings 0 --config ../../eslint.config.ts",
@@ -1,4 +1,4 @@
1
- import { CommandExample, DataSink, Slice, type Example } from '@auto-engineer/flow';
1
+ import { CommandExample, Slice, type Example } from '@auto-engineer/flow';
2
2
 
3
3
  function resolveStreamId(stream: string, exampleData: Record<string, unknown>): string {
4
4
  return stream.replace(/\$\{([^}]+)\}/g, (_, key: string) => String(exampleData?.[key] ?? 'unknown'));
@@ -49,33 +49,59 @@ function extractExampleDataFromSpecs(
49
49
  }
50
50
  }
51
51
 
52
- function findStreamSink(slice: Slice): DataSink | undefined {
53
- return (slice.server?.data ?? []).find((item) => (item as DataSink)?.destination?.type === 'stream') as
54
- | DataSink
55
- | undefined;
56
- }
57
-
58
- export function getStreamFromSink(slice: Slice): { streamPattern?: string; streamId?: string } {
52
+ function extractGwtSpecs(slice: Slice) {
59
53
  const specs = slice.server?.specs;
60
54
  const rules = specs?.rules;
61
- const gwtSpecs =
62
- Array.isArray(rules) && rules.length > 0
63
- ? rules.flatMap((rule) =>
64
- rule.examples.map((example: Example) => ({
65
- given: example.given,
66
- when: example.when,
67
- then: example.then,
68
- })),
69
- )
70
- : [];
55
+ return Array.isArray(rules) && rules.length > 0
56
+ ? rules.flatMap((rule) =>
57
+ rule.examples.map((example: Example) => ({
58
+ given: example.given,
59
+ when: example.when,
60
+ then: example.then,
61
+ })),
62
+ )
63
+ : [];
64
+ }
65
+
66
+ function isValidStreamSink(item: unknown): item is { destination: { pattern: string } } {
67
+ return (
68
+ typeof item === 'object' &&
69
+ item !== null &&
70
+ 'destination' in item &&
71
+ typeof item.destination === 'object' &&
72
+ item.destination !== null &&
73
+ 'type' in item.destination &&
74
+ item.destination.type === 'stream' &&
75
+ 'pattern' in item.destination &&
76
+ typeof item.destination.pattern === 'string'
77
+ );
78
+ }
79
+
80
+ function processStreamSink(item: unknown, exampleData: Record<string, unknown>) {
81
+ if (!isValidStreamSink(item)) {
82
+ return null;
83
+ }
71
84
 
85
+ const streamPattern = item.destination.pattern;
86
+ const streamId = streamPattern.length > 0 ? resolveStreamId(streamPattern, exampleData) : undefined;
87
+
88
+ return { streamPattern, streamId };
89
+ }
90
+
91
+ export function getStreamFromSink(slice: Slice): { streamPattern?: string; streamId?: string } {
92
+ const gwtSpecs = extractGwtSpecs(slice);
72
93
  const exampleData = extractExampleDataFromSpecs(slice, gwtSpecs);
73
- const sink = findStreamSink(slice);
94
+ const serverData = slice.server?.data;
95
+
96
+ if (!Array.isArray(serverData)) {
97
+ return {};
98
+ }
74
99
 
75
- if (sink && sink.destination.type === 'stream' && 'pattern' in sink.destination) {
76
- const streamPattern = sink.destination.pattern;
77
- const streamId = streamPattern ? resolveStreamId(streamPattern, exampleData) : undefined;
78
- return { streamPattern, streamId };
100
+ for (const item of serverData) {
101
+ const result = processStreamSink(item, exampleData);
102
+ if (result) {
103
+ return result;
104
+ }
79
105
  }
80
106
 
81
107
  return {};
@@ -6,7 +6,7 @@ import ejs from 'ejs';
6
6
  import { ensureDirExists, ensureDirPath, toKebabCase } from './utils/path';
7
7
  import { camelCase, pascalCase } from 'change-case';
8
8
  import prettier from 'prettier';
9
- import { Flow, Slice, SpecsSchemaType } from '@auto-engineer/flow';
9
+ import { Flow, Slice, Model } from '@auto-engineer/flow';
10
10
  import createDebug from 'debug';
11
11
 
12
12
  const debug = createDebug('emmett:scaffold');
@@ -59,28 +59,56 @@ async function renderTemplate(templatePath: string, data: Record<string, unknown
59
59
  });
60
60
  debugTemplate('Template compiled successfully');
61
61
 
62
- const graphqlType = (tsType: string): string => {
63
- debugTemplate('Converting TS type to GraphQL: %s', tsType);
64
- if (!tsType) return 'String';
65
- if (tsType === 'ID') return 'ID';
66
- if (tsType === 'string') return 'String';
67
- if (tsType === 'number') return 'Number';
68
- if (tsType === 'boolean') return 'Boolean';
69
- if (tsType === 'Date') return 'Date';
70
- if (tsType === 'object') return 'Object';
71
- if (tsType.endsWith('[]')) {
72
- const inner = tsType.slice(0, -2);
73
- return `[${graphqlType(inner)}]`;
74
- }
62
+ const isInlineObject = (s: string) => /^\{[\s\S]*\}$/.test(s.trim());
63
+ const isStringLiteralUnion = (s: string) => /^"(?:[^"]+)"\s*(\|\s*"(?:[^"]+)")+$/.test(s.trim());
64
+ const convertPrimitiveType = (base: string): string => {
65
+ // GraphQL-native scalars
66
+ if (base === 'ID') return 'ID';
67
+ if (base === 'Int') return 'Int';
68
+ if (base === 'Float') return 'Float';
69
+ // TS primitives
70
+ if (base === 'string') return 'String';
71
+ if (base === 'number') return 'Float';
72
+ if (base === 'boolean') return 'Boolean';
73
+ if (base === 'Date') return 'GraphQLISODateTime';
75
74
  return 'String';
76
75
  };
77
76
 
77
+ const graphqlType = (rawTs: string): string => {
78
+ const t = (rawTs ?? '').trim();
79
+ if (!t) return 'String';
80
+ const base = t.replace(/\s*\|\s*null\b/g, '').trim();
81
+ // arrays
82
+ const arr1 = base.match(/^Array<(.*)>$/);
83
+ const arr2 = base.match(/^(.*)\[\]$/);
84
+ if (arr1) return `[${graphqlType(arr1[1].trim())}]`;
85
+ if (arr2) return `[${graphqlType(arr2[1].trim())}]`;
86
+ // JSON
87
+ if (base === 'unknown' || base === 'any') return 'GraphQLJSON';
88
+ if (base === 'object') return 'JSON';
89
+ if (isInlineObject(base)) return 'JSON';
90
+ if (isStringLiteralUnion(base)) return 'String';
91
+ return convertPrimitiveType(base);
92
+ };
93
+
94
+ const toTsFieldType = (ts: string): string => {
95
+ if (!ts) return 'string';
96
+ const t = ts.trim();
97
+ const arr = t.match(/^Array<(.*)>$/);
98
+ if (arr) return `${arr[1].trim()}[]`;
99
+ return t;
100
+ };
101
+
102
+ const isNullable = (rawTs: string): boolean => /\|\s*null\b/.test(rawTs);
103
+
78
104
  const result = await template({
79
105
  ...data,
80
106
  pascalCase,
81
107
  toKebabCase,
82
108
  camelCase,
83
109
  graphqlType,
110
+ isNullable,
111
+ toTsFieldType,
84
112
  formatTsValue,
85
113
  formatDataObject,
86
114
  messages: data.messages,
@@ -201,7 +229,7 @@ async function prepareTemplateData(
201
229
  commandSchemasByName: Record<string, Message>,
202
230
  projectionIdField: string | undefined,
203
231
  allMessages?: MessageDefinition[],
204
- integrations?: SpecsSchemaType['integrations'],
232
+ integrations?: Model['integrations'],
205
233
  ): Promise<Record<string, unknown>> {
206
234
  debug('Preparing template data for slice: %s (flow: %s)', slice.name, flow.name);
207
235
  debug(' Commands: %d', commands.length);
@@ -226,12 +254,16 @@ async function prepareTemplateData(
226
254
  const uniqueCommands = Array.from(new Map(commands.map((c) => [c.type, c])).values());
227
255
  debug(' Unique commands: %d', uniqueCommands.length);
228
256
 
257
+ const allowedForSlice = new Set(Object.keys(gwtMapping));
258
+ const filteredCommands =
259
+ allowedForSlice.size > 0 ? uniqueCommands.filter((c) => allowedForSlice.has(c.type)) : uniqueCommands;
260
+
229
261
  return {
230
262
  flowName: flow.name,
231
263
  sliceName: slice.name,
232
264
  slice,
233
265
  stream: { pattern: streamPattern, id: streamId },
234
- commands: uniqueCommands,
266
+ commands: filteredCommands,
235
267
  events,
236
268
  states,
237
269
  gwtMapping,
@@ -343,7 +375,7 @@ async function generateFilesForSlice(
343
375
  sliceDir: string,
344
376
  messages: MessageDefinition[],
345
377
  flows: Flow[],
346
- integrations?: SpecsSchemaType['integrations'],
378
+ integrations?: Model['integrations'],
347
379
  ): Promise<FilePlan[]> {
348
380
  debugSlice('Generating files for slice: %s (type: %s)', slice.name, slice.type);
349
381
  debugSlice(' Flow: %s', flow.name);
@@ -391,8 +423,8 @@ async function generateFilesForSlice(
391
423
 
392
424
  export async function generateScaffoldFilePlans(
393
425
  flows: Flow[],
394
- messages: SpecsSchemaType['messages'],
395
- integrations?: SpecsSchemaType['integrations'],
426
+ messages: Model['messages'],
427
+ integrations?: Model['integrations'],
396
428
  baseDir = 'src/domain/flows',
397
429
  ): Promise<FilePlan[]> {
398
430
  debug('Generating scaffold file plans');
@@ -445,7 +477,7 @@ export async function writeScaffoldFilePlans(plans: FilePlan[]) {
445
477
 
446
478
  export async function scaffoldFromSchema(
447
479
  flows: Flow[],
448
- messages: SpecsSchemaType['messages'],
480
+ messages: Model['messages'],
449
481
  baseDir = 'src/domain/flows',
450
482
  ): Promise<void> {
451
483
  debug('Starting scaffold from schema');
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { SpecsSchemaType as SpecsSchema } from '@auto-engineer/flow';
2
+ import { Model as SpecsSchema } from '@auto-engineer/flow';
3
3
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
4
4
 
5
5
  describe('commands.ts.ejs', () => {
@@ -15,7 +15,6 @@ describe('commands.ts.ejs', () => {
15
15
  name: 'Create listing',
16
16
  client: {
17
17
  description: 'test',
18
- specs: [],
19
18
  },
20
19
  server: {
21
20
  description: 'test',
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { SpecsSchemaType as SpecsSchema } from '@auto-engineer/flow';
2
+ import { Model as SpecsSchema } from '@auto-engineer/flow';
3
3
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
4
4
 
5
5
  describe('spec.ts.ejs', () => {
@@ -13,7 +13,7 @@ describe('spec.ts.ejs', () => {
13
13
  {
14
14
  type: 'command',
15
15
  name: 'Create listing',
16
- client: { description: '', specs: [] },
16
+ client: { description: '' },
17
17
  server: {
18
18
  description: '',
19
19
  specs: {
@@ -153,7 +153,7 @@ describe('spec.ts.ejs', () => {
153
153
  {
154
154
  type: 'command',
155
155
  name: 'Remove listing',
156
- client: { description: '', specs: [] },
156
+ client: { description: '' },
157
157
  server: {
158
158
  description: '',
159
159
  specs: {
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { SpecsSchemaType as SpecsSchema } from '@auto-engineer/flow';
2
+ import { Model as SpecsSchema } from '@auto-engineer/flow';
3
3
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
4
4
 
5
5
  describe('decide.ts.ejs', () => {
@@ -15,7 +15,6 @@ describe('decide.ts.ejs', () => {
15
15
  name: 'Create listing',
16
16
  client: {
17
17
  description: 'test',
18
- specs: [],
19
18
  },
20
19
  server: {
21
20
  description: 'test',
@@ -126,7 +125,6 @@ describe('decide.ts.ejs', () => {
126
125
  name: 'Remove listing',
127
126
  client: {
128
127
  description: 'test',
129
- specs: [],
130
128
  },
131
129
  server: {
132
130
  description: 'test',
@@ -252,7 +250,6 @@ describe('decide.ts.ejs', () => {
252
250
  name: 'Create listing',
253
251
  client: {
254
252
  description: 'test',
255
- specs: [],
256
253
  },
257
254
  server: {
258
255
  description: 'test',
@@ -398,7 +395,6 @@ describe('decide.ts.ejs', () => {
398
395
  stream: 'session-${sessionId}',
399
396
  client: {
400
397
  description: 'test',
401
- specs: [],
402
398
  },
403
399
  server: {
404
400
  description: '',
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { SpecsSchemaType as SpecsSchema } from '@auto-engineer/flow';
2
+ import { Model as SpecsSchema } from '@auto-engineer/flow';
3
3
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
4
4
 
5
5
  describe('events.ts.ejs', () => {
@@ -15,7 +15,6 @@ describe('events.ts.ejs', () => {
15
15
  name: 'Create listing',
16
16
  client: {
17
17
  description: 'test',
18
- specs: [],
19
18
  },
20
19
  server: {
21
20
  description: 'test',
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { SpecsSchemaType as SpecsSchema } from '@auto-engineer/flow';
2
+ import { Model as SpecsSchema } from '@auto-engineer/flow';
3
3
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
4
4
 
5
5
  describe('evolve.ts.ejs', () => {
@@ -15,7 +15,6 @@ describe('evolve.ts.ejs', () => {
15
15
  name: 'Create listing',
16
16
  client: {
17
17
  description: 'test',
18
- specs: [],
19
18
  },
20
19
  server: {
21
20
  description: 'test',
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest';
2
2
  import { generateScaffoldFilePlans } from '../../scaffoldFromSchema';
3
- import { SpecsSchemaType as SpecsSchema } from '@auto-engineer/flow';
3
+ import { Model as SpecsSchema } from '@auto-engineer/flow';
4
4
 
5
5
  describe('generateScaffoldFilePlans', () => {
6
6
  it('should generate a valid handle file', async () => {
@@ -16,7 +16,6 @@ describe('generateScaffoldFilePlans', () => {
16
16
  stream: 'listing-${propertyId}',
17
17
  client: {
18
18
  description: 'test',
19
- specs: [],
20
19
  },
21
20
  server: {
22
21
  description: 'test',
@@ -142,7 +141,6 @@ describe('generateScaffoldFilePlans', () => {
142
141
  stream: 'session-${sessionId}',
143
142
  client: {
144
143
  description: 'test',
145
- specs: [],
146
144
  },
147
145
  server: {
148
146
  description: '',