@auto-engineer/narrative 0.11.11 → 0.11.13

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 (244) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +22 -0
  3. package/dist/src/commands/export-schema-helper.js +1 -2
  4. package/dist/src/commands/export-schema-helper.js.map +1 -1
  5. package/dist/src/getNarratives.cache.specs.d.ts +2 -0
  6. package/dist/src/getNarratives.cache.specs.d.ts.map +1 -0
  7. package/dist/src/{getFlows.cache.specs.js → getNarratives.cache.specs.js} +19 -19
  8. package/dist/src/getNarratives.cache.specs.js.map +1 -0
  9. package/dist/src/getNarratives.specs.d.ts +2 -0
  10. package/dist/src/getNarratives.specs.d.ts.map +1 -0
  11. package/dist/src/{getFlows.specs.js → getNarratives.specs.js} +28 -41
  12. package/dist/src/getNarratives.specs.js.map +1 -0
  13. package/dist/src/id/addAutoIds.specs.js +6 -6
  14. package/dist/src/id/addAutoIds.specs.js.map +1 -1
  15. package/dist/src/id/hasAllIds.specs.js +16 -16
  16. package/dist/src/id/hasAllIds.specs.js.map +1 -1
  17. package/dist/src/model-to-narrative.specs.d.ts +2 -0
  18. package/dist/src/model-to-narrative.specs.d.ts.map +1 -0
  19. package/dist/src/{model-to-flow.specs.js → model-to-narrative.specs.js} +212 -4
  20. package/dist/src/model-to-narrative.specs.js.map +1 -0
  21. package/dist/src/narrative-context.d.ts.map +1 -1
  22. package/dist/src/narrative-context.js +0 -1
  23. package/dist/src/narrative-context.js.map +1 -1
  24. package/dist/src/narrative.d.ts +1 -0
  25. package/dist/src/narrative.d.ts.map +1 -1
  26. package/dist/src/narrative.js +11 -0
  27. package/dist/src/narrative.js.map +1 -1
  28. package/dist/src/samples/items.narrative.d.ts +2 -0
  29. package/dist/src/samples/items.narrative.d.ts.map +1 -0
  30. package/dist/src/samples/{items.flow.js → items.narrative.js} +1 -1
  31. package/dist/src/samples/items.narrative.js.map +1 -0
  32. package/dist/src/samples/mixed-given-types.narrative.d.ts +2 -0
  33. package/dist/src/samples/mixed-given-types.narrative.d.ts.map +1 -0
  34. package/dist/src/samples/{mixed-given-types.flow.js → mixed-given-types.narrative.js} +1 -2
  35. package/dist/src/samples/mixed-given-types.narrative.js.map +1 -0
  36. package/dist/src/samples/{place-order.flow.d.ts → place-order.narrative.d.ts} +2 -2
  37. package/dist/src/samples/place-order.narrative.d.ts.map +1 -0
  38. package/dist/src/samples/{place-order.flow.js → place-order.narrative.js} +1 -1
  39. package/dist/src/samples/place-order.narrative.js.map +1 -0
  40. package/dist/src/samples/questionnaires.narrative.d.ts +2 -0
  41. package/dist/src/samples/questionnaires.narrative.d.ts.map +1 -0
  42. package/dist/src/samples/{questionnaires.flow.js → questionnaires.narrative.js} +1 -3
  43. package/dist/src/samples/questionnaires.narrative.js.map +1 -0
  44. package/dist/src/samples/seasonal-assistant.schema.json +1 -1
  45. package/dist/src/samples/test-with-ids.narrative.d.ts +2 -0
  46. package/dist/src/samples/test-with-ids.narrative.d.ts.map +1 -0
  47. package/dist/src/samples/{test-with-ids.flow.js → test-with-ids.narrative.js} +1 -1
  48. package/dist/src/samples/test-with-ids.narrative.js.map +1 -0
  49. package/dist/src/schema.d.ts +2980 -2980
  50. package/dist/src/schema.d.ts.map +1 -1
  51. package/dist/src/schema.js +1 -0
  52. package/dist/src/schema.js.map +1 -1
  53. package/dist/src/transformers/model-to-narrative/generators/gwt.d.ts.map +1 -1
  54. package/dist/src/transformers/model-to-narrative/generators/gwt.js +32 -8
  55. package/dist/src/transformers/model-to-narrative/generators/gwt.js.map +1 -1
  56. package/dist/src/transformers/narrative-to-model/debug.d.ts.map +1 -1
  57. package/dist/src/transformers/narrative-to-model/debug.js +1 -1
  58. package/dist/src/transformers/narrative-to-model/debug.js.map +1 -1
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +5 -5
  61. package/src/commands/export-schema-helper.ts +1 -2
  62. package/src/{getFlows.cache.specs.ts → getNarratives.cache.specs.ts} +18 -18
  63. package/src/{getFlows.specs.ts → getNarratives.specs.ts} +29 -41
  64. package/src/id/addAutoIds.specs.ts +6 -6
  65. package/src/id/hasAllIds.specs.ts +16 -16
  66. package/src/{model-to-flow.specs.ts → model-to-narrative.specs.ts} +215 -3
  67. package/src/narrative-context.ts +0 -1
  68. package/src/narrative.ts +16 -1
  69. package/src/samples/{mixed-given-types.flow.ts → mixed-given-types.narrative.ts} +0 -1
  70. package/src/samples/{place-order.flow.ts → place-order.narrative.ts} +2 -2
  71. package/src/samples/{questionnaires.flow.ts → questionnaires.narrative.ts} +0 -2
  72. package/src/samples/seasonal-assistant.schema.json +1 -1
  73. package/src/schema.ts +1 -0
  74. package/src/transformers/model-to-narrative/generators/gwt.ts +44 -9
  75. package/src/transformers/narrative-to-model/debug.ts +1 -1
  76. package/.turbo/turbo-format.log +0 -4
  77. package/.turbo/turbo-lint.log +0 -4
  78. package/.turbo/turbo-test.log +0 -14
  79. package/.turbo/turbo-type-check.log +0 -4
  80. package/dist/src/data-flow-builders.d.ts +0 -71
  81. package/dist/src/data-flow-builders.d.ts.map +0 -1
  82. package/dist/src/data-flow-builders.js +0 -326
  83. package/dist/src/data-flow-builders.js.map +0 -1
  84. package/dist/src/flow-context.d.ts +0 -25
  85. package/dist/src/flow-context.d.ts.map +0 -1
  86. package/dist/src/flow-context.js +0 -579
  87. package/dist/src/flow-context.js.map +0 -1
  88. package/dist/src/flow-context.specs.d.ts +0 -2
  89. package/dist/src/flow-context.specs.d.ts.map +0 -1
  90. package/dist/src/flow-context.specs.js +0 -185
  91. package/dist/src/flow-context.specs.js.map +0 -1
  92. package/dist/src/flow-registry.d.ts +0 -12
  93. package/dist/src/flow-registry.d.ts.map +0 -1
  94. package/dist/src/flow-registry.js +0 -46
  95. package/dist/src/flow-registry.js.map +0 -1
  96. package/dist/src/flow.d.ts +0 -49
  97. package/dist/src/flow.d.ts.map +0 -1
  98. package/dist/src/flow.js +0 -146
  99. package/dist/src/flow.js.map +0 -1
  100. package/dist/src/getFlows.cache.specs.d.ts +0 -2
  101. package/dist/src/getFlows.cache.specs.d.ts.map +0 -1
  102. package/dist/src/getFlows.cache.specs.js.map +0 -1
  103. package/dist/src/getFlows.d.ts +0 -21
  104. package/dist/src/getFlows.d.ts.map +0 -1
  105. package/dist/src/getFlows.js +0 -119
  106. package/dist/src/getFlows.js.map +0 -1
  107. package/dist/src/getFlows.specs.d.ts +0 -2
  108. package/dist/src/getFlows.specs.d.ts.map +0 -1
  109. package/dist/src/getFlows.specs.js.map +0 -1
  110. package/dist/src/model-to-flow.specs.d.ts +0 -2
  111. package/dist/src/model-to-flow.specs.d.ts.map +0 -1
  112. package/dist/src/model-to-flow.specs.js.map +0 -1
  113. package/dist/src/samples/items.flow.d.ts +0 -2
  114. package/dist/src/samples/items.flow.d.ts.map +0 -1
  115. package/dist/src/samples/items.flow.js.map +0 -1
  116. package/dist/src/samples/mixed-given-types.flow.d.ts +0 -2
  117. package/dist/src/samples/mixed-given-types.flow.d.ts.map +0 -1
  118. package/dist/src/samples/mixed-given-types.flow.js.map +0 -1
  119. package/dist/src/samples/place-order.flow.d.ts.map +0 -1
  120. package/dist/src/samples/place-order.flow.js.map +0 -1
  121. package/dist/src/samples/questionnaires.flow.d.ts +0 -2
  122. package/dist/src/samples/questionnaires.flow.d.ts.map +0 -1
  123. package/dist/src/samples/questionnaires.flow.js.map +0 -1
  124. package/dist/src/samples/test-with-ids.flow.d.ts +0 -2
  125. package/dist/src/samples/test-with-ids.flow.d.ts.map +0 -1
  126. package/dist/src/samples/test-with-ids.flow.js.map +0 -1
  127. package/dist/src/transformers/flow-to-model/assemble.d.ts +0 -3
  128. package/dist/src/transformers/flow-to-model/assemble.d.ts.map +0 -1
  129. package/dist/src/transformers/flow-to-model/assemble.js +0 -9
  130. package/dist/src/transformers/flow-to-model/assemble.js.map +0 -1
  131. package/dist/src/transformers/flow-to-model/debug.d.ts +0 -3
  132. package/dist/src/transformers/flow-to-model/debug.d.ts.map +0 -1
  133. package/dist/src/transformers/flow-to-model/debug.js +0 -6
  134. package/dist/src/transformers/flow-to-model/debug.js.map +0 -1
  135. package/dist/src/transformers/flow-to-model/example-shapes.d.ts +0 -6
  136. package/dist/src/transformers/flow-to-model/example-shapes.d.ts.map +0 -1
  137. package/dist/src/transformers/flow-to-model/example-shapes.js +0 -60
  138. package/dist/src/transformers/flow-to-model/example-shapes.js.map +0 -1
  139. package/dist/src/transformers/flow-to-model/guards.d.ts +0 -15
  140. package/dist/src/transformers/flow-to-model/guards.d.ts.map +0 -1
  141. package/dist/src/transformers/flow-to-model/guards.js +0 -18
  142. package/dist/src/transformers/flow-to-model/guards.js.map +0 -1
  143. package/dist/src/transformers/flow-to-model/index.d.ts +0 -4
  144. package/dist/src/transformers/flow-to-model/index.d.ts.map +0 -1
  145. package/dist/src/transformers/flow-to-model/index.js +0 -193
  146. package/dist/src/transformers/flow-to-model/index.js.map +0 -1
  147. package/dist/src/transformers/flow-to-model/inlining.d.ts +0 -4
  148. package/dist/src/transformers/flow-to-model/inlining.d.ts.map +0 -1
  149. package/dist/src/transformers/flow-to-model/inlining.js +0 -95
  150. package/dist/src/transformers/flow-to-model/inlining.js.map +0 -1
  151. package/dist/src/transformers/flow-to-model/integrations.d.ts +0 -36
  152. package/dist/src/transformers/flow-to-model/integrations.d.ts.map +0 -1
  153. package/dist/src/transformers/flow-to-model/integrations.js +0 -147
  154. package/dist/src/transformers/flow-to-model/integrations.js.map +0 -1
  155. package/dist/src/transformers/flow-to-model/messages.d.ts +0 -5
  156. package/dist/src/transformers/flow-to-model/messages.d.ts.map +0 -1
  157. package/dist/src/transformers/flow-to-model/messages.js +0 -88
  158. package/dist/src/transformers/flow-to-model/messages.js.map +0 -1
  159. package/dist/src/transformers/flow-to-model/normalize.d.ts +0 -3
  160. package/dist/src/transformers/flow-to-model/normalize.d.ts.map +0 -1
  161. package/dist/src/transformers/flow-to-model/normalize.js +0 -23
  162. package/dist/src/transformers/flow-to-model/normalize.js.map +0 -1
  163. package/dist/src/transformers/flow-to-model/spec-processors.d.ts +0 -34
  164. package/dist/src/transformers/flow-to-model/spec-processors.d.ts.map +0 -1
  165. package/dist/src/transformers/flow-to-model/spec-processors.js +0 -395
  166. package/dist/src/transformers/flow-to-model/spec-processors.js.map +0 -1
  167. package/dist/src/transformers/flow-to-model/strings.d.ts +0 -2
  168. package/dist/src/transformers/flow-to-model/strings.d.ts.map +0 -1
  169. package/dist/src/transformers/flow-to-model/strings.js +0 -11
  170. package/dist/src/transformers/flow-to-model/strings.js.map +0 -1
  171. package/dist/src/transformers/flow-to-model/type-inference.d.ts +0 -3
  172. package/dist/src/transformers/flow-to-model/type-inference.d.ts.map +0 -1
  173. package/dist/src/transformers/flow-to-model/type-inference.js +0 -92
  174. package/dist/src/transformers/flow-to-model/type-inference.js.map +0 -1
  175. package/dist/src/transformers/flow-to-model/type-inference.specs.d.ts +0 -2
  176. package/dist/src/transformers/flow-to-model/type-inference.specs.d.ts.map +0 -1
  177. package/dist/src/transformers/flow-to-model/type-inference.specs.js +0 -167
  178. package/dist/src/transformers/flow-to-model/type-inference.specs.js.map +0 -1
  179. package/dist/src/transformers/flow-to-model/zod-adapter.d.ts +0 -6
  180. package/dist/src/transformers/flow-to-model/zod-adapter.d.ts.map +0 -1
  181. package/dist/src/transformers/flow-to-model/zod-adapter.js +0 -101
  182. package/dist/src/transformers/flow-to-model/zod-adapter.js.map +0 -1
  183. package/dist/src/transformers/model-to-flow/analysis/extract-flow.d.ts +0 -2
  184. package/dist/src/transformers/model-to-flow/analysis/extract-flow.d.ts.map +0 -1
  185. package/dist/src/transformers/model-to-flow/analysis/extract-flow.js +0 -22
  186. package/dist/src/transformers/model-to-flow/analysis/extract-flow.js.map +0 -1
  187. package/dist/src/transformers/model-to-flow/analysis/lint-helpers.d.ts +0 -18
  188. package/dist/src/transformers/model-to-flow/analysis/lint-helpers.d.ts.map +0 -1
  189. package/dist/src/transformers/model-to-flow/analysis/lint-helpers.js +0 -78
  190. package/dist/src/transformers/model-to-flow/analysis/lint-helpers.js.map +0 -1
  191. package/dist/src/transformers/model-to-flow/analysis/type-decls.d.ts +0 -7
  192. package/dist/src/transformers/model-to-flow/analysis/type-decls.d.ts.map +0 -1
  193. package/dist/src/transformers/model-to-flow/analysis/type-decls.js +0 -74
  194. package/dist/src/transformers/model-to-flow/analysis/type-decls.js.map +0 -1
  195. package/dist/src/transformers/model-to-flow/analysis/usage.d.ts +0 -9
  196. package/dist/src/transformers/model-to-flow/analysis/usage.d.ts.map +0 -1
  197. package/dist/src/transformers/model-to-flow/analysis/usage.js +0 -90
  198. package/dist/src/transformers/model-to-flow/analysis/usage.js.map +0 -1
  199. package/dist/src/transformers/model-to-flow/ast/emit-helpers.d.ts +0 -18
  200. package/dist/src/transformers/model-to-flow/ast/emit-helpers.d.ts.map +0 -1
  201. package/dist/src/transformers/model-to-flow/ast/emit-helpers.js +0 -159
  202. package/dist/src/transformers/model-to-flow/ast/emit-helpers.js.map +0 -1
  203. package/dist/src/transformers/model-to-flow/formatting/prettier.d.ts +0 -2
  204. package/dist/src/transformers/model-to-flow/formatting/prettier.d.ts.map +0 -1
  205. package/dist/src/transformers/model-to-flow/formatting/prettier.js +0 -26
  206. package/dist/src/transformers/model-to-flow/formatting/prettier.js.map +0 -1
  207. package/dist/src/transformers/model-to-flow/formatting/sort-types.d.ts +0 -6
  208. package/dist/src/transformers/model-to-flow/formatting/sort-types.d.ts.map +0 -1
  209. package/dist/src/transformers/model-to-flow/formatting/sort-types.js +0 -17
  210. package/dist/src/transformers/model-to-flow/formatting/sort-types.js.map +0 -1
  211. package/dist/src/transformers/model-to-flow/generators/compose.d.ts +0 -6
  212. package/dist/src/transformers/model-to-flow/generators/compose.d.ts.map +0 -1
  213. package/dist/src/transformers/model-to-flow/generators/compose.js +0 -79
  214. package/dist/src/transformers/model-to-flow/generators/compose.js.map +0 -1
  215. package/dist/src/transformers/model-to-flow/generators/flow.d.ts +0 -15
  216. package/dist/src/transformers/model-to-flow/generators/flow.d.ts.map +0 -1
  217. package/dist/src/transformers/model-to-flow/generators/flow.js +0 -316
  218. package/dist/src/transformers/model-to-flow/generators/flow.js.map +0 -1
  219. package/dist/src/transformers/model-to-flow/generators/gwt.d.ts +0 -57
  220. package/dist/src/transformers/model-to-flow/generators/gwt.d.ts.map +0 -1
  221. package/dist/src/transformers/model-to-flow/generators/gwt.js +0 -186
  222. package/dist/src/transformers/model-to-flow/generators/gwt.js.map +0 -1
  223. package/dist/src/transformers/model-to-flow/generators/imports.d.ts +0 -16
  224. package/dist/src/transformers/model-to-flow/generators/imports.d.ts.map +0 -1
  225. package/dist/src/transformers/model-to-flow/generators/imports.js +0 -57
  226. package/dist/src/transformers/model-to-flow/generators/imports.js.map +0 -1
  227. package/dist/src/transformers/model-to-flow/generators/types.d.ts +0 -13
  228. package/dist/src/transformers/model-to-flow/generators/types.d.ts.map +0 -1
  229. package/dist/src/transformers/model-to-flow/generators/types.js +0 -22
  230. package/dist/src/transformers/model-to-flow/generators/types.js.map +0 -1
  231. package/dist/src/transformers/model-to-flow/index.d.ts +0 -13
  232. package/dist/src/transformers/model-to-flow/index.d.ts.map +0 -1
  233. package/dist/src/transformers/model-to-flow/index.js +0 -25
  234. package/dist/src/transformers/model-to-flow/index.js.map +0 -1
  235. package/dist/src/transformers/model-to-flow/utils/integration-extractor.d.ts +0 -12
  236. package/dist/src/transformers/model-to-flow/utils/integration-extractor.d.ts.map +0 -1
  237. package/dist/src/transformers/model-to-flow/utils/integration-extractor.js +0 -64
  238. package/dist/src/transformers/model-to-flow/utils/integration-extractor.js.map +0 -1
  239. package/dist/src/transformers/model-to-flow/utils/strings.d.ts +0 -9
  240. package/dist/src/transformers/model-to-flow/utils/strings.d.ts.map +0 -1
  241. package/dist/src/transformers/model-to-flow/utils/strings.js +0 -11
  242. package/dist/src/transformers/model-to-flow/utils/strings.js.map +0 -1
  243. /package/src/samples/{items.flow.ts → items.narrative.ts} +0 -0
  244. /package/src/samples/{test-with-ids.flow.ts → test-with-ids.narrative.ts} +0 -0
@@ -1739,7 +1739,7 @@ narrative('Date Handling Flow', 'DATE-FLOW', () => {
1739
1739
  narratives: [
1740
1740
  {
1741
1741
  name: 'Home Screen',
1742
- sourceFile: '/path/to/homepage.flow.ts',
1742
+ sourceFile: '/path/to/homepage.narrative.ts',
1743
1743
  slices: [
1744
1744
  {
1745
1745
  name: 'Active Surveys Summary',
@@ -1756,7 +1756,7 @@ narrative('Date Handling Flow', 'DATE-FLOW', () => {
1756
1756
  },
1757
1757
  {
1758
1758
  name: 'Create Survey',
1759
- sourceFile: '/path/to/homepage.flow.ts',
1759
+ sourceFile: '/path/to/homepage.narrative.ts',
1760
1760
  slices: [
1761
1761
  {
1762
1762
  name: 'Create Survey Form',
@@ -1773,7 +1773,7 @@ narrative('Date Handling Flow', 'DATE-FLOW', () => {
1773
1773
  },
1774
1774
  {
1775
1775
  name: 'Response Analytics',
1776
- sourceFile: '/path/to/homepage.flow.ts',
1776
+ sourceFile: '/path/to/homepage.narrative.ts',
1777
1777
  slices: [
1778
1778
  {
1779
1779
  name: 'Response Rate Charts',
@@ -1819,4 +1819,216 @@ narrative('Response Analytics', () => {
1819
1819
  });
1820
1820
  `);
1821
1821
  });
1822
+
1823
+ it('should omit .when({}) when given has multiple items and when is empty', async () => {
1824
+ const modelWithEmptyWhen: Model = {
1825
+ variant: 'specs',
1826
+ narratives: [
1827
+ {
1828
+ name: 'Todo List Summary',
1829
+ id: 'TODO-001',
1830
+ slices: [
1831
+ {
1832
+ name: 'views completion summary',
1833
+ id: 'SUMMARY-001',
1834
+ type: 'query',
1835
+ client: {
1836
+ description: 'Summary view client',
1837
+ },
1838
+ server: {
1839
+ description: 'Summary calculation server',
1840
+ specs: {
1841
+ name: 'Summary Statistics',
1842
+ rules: [
1843
+ {
1844
+ id: 'RULE-SUMMARY',
1845
+ description: 'summary shows overall todo list statistics',
1846
+ examples: [
1847
+ {
1848
+ description: 'calculates summary from multiple todos',
1849
+ given: [
1850
+ {
1851
+ eventRef: 'TodoAdded',
1852
+ exampleData: {
1853
+ todoId: 'todo-001',
1854
+ description: 'Buy groceries',
1855
+ status: 'pending',
1856
+ addedAt: new Date('2030-01-01T09:00:00.000Z'),
1857
+ },
1858
+ },
1859
+ {
1860
+ eventRef: 'TodoAdded',
1861
+ exampleData: {
1862
+ todoId: 'todo-002',
1863
+ description: 'Write report',
1864
+ status: 'pending',
1865
+ addedAt: new Date('2030-01-01T09:10:00.000Z'),
1866
+ },
1867
+ },
1868
+ {
1869
+ eventRef: 'TodoMarkedInProgress',
1870
+ exampleData: {
1871
+ todoId: 'todo-001',
1872
+ markedAt: new Date('2030-01-01T10:00:00.000Z'),
1873
+ },
1874
+ },
1875
+ {
1876
+ eventRef: 'TodoMarkedComplete',
1877
+ exampleData: {
1878
+ todoId: 'todo-002',
1879
+ completedAt: new Date('2030-01-01T11:00:00.000Z'),
1880
+ },
1881
+ },
1882
+ ],
1883
+ when: {
1884
+ eventRef: '',
1885
+ exampleData: {},
1886
+ },
1887
+ then: [
1888
+ {
1889
+ stateRef: 'TodoListSummary',
1890
+ exampleData: {
1891
+ summaryId: 'main-summary',
1892
+ totalTodos: 2,
1893
+ pendingCount: 0,
1894
+ inProgressCount: 1,
1895
+ completedCount: 1,
1896
+ completionPercentage: 50,
1897
+ },
1898
+ },
1899
+ ],
1900
+ },
1901
+ ],
1902
+ },
1903
+ ],
1904
+ },
1905
+ },
1906
+ },
1907
+ ],
1908
+ },
1909
+ ],
1910
+ messages: [
1911
+ {
1912
+ type: 'event',
1913
+ name: 'TodoAdded',
1914
+ fields: [
1915
+ { name: 'todoId', type: 'string', required: true },
1916
+ { name: 'description', type: 'string', required: true },
1917
+ { name: 'status', type: 'string', required: true },
1918
+ { name: 'addedAt', type: 'Date', required: true },
1919
+ ],
1920
+ source: 'internal',
1921
+ metadata: { version: 1 },
1922
+ },
1923
+ {
1924
+ type: 'event',
1925
+ name: 'TodoMarkedInProgress',
1926
+ fields: [
1927
+ { name: 'todoId', type: 'string', required: true },
1928
+ { name: 'markedAt', type: 'Date', required: true },
1929
+ ],
1930
+ source: 'internal',
1931
+ metadata: { version: 1 },
1932
+ },
1933
+ {
1934
+ type: 'event',
1935
+ name: 'TodoMarkedComplete',
1936
+ fields: [
1937
+ { name: 'todoId', type: 'string', required: true },
1938
+ { name: 'completedAt', type: 'Date', required: true },
1939
+ ],
1940
+ source: 'internal',
1941
+ metadata: { version: 1 },
1942
+ },
1943
+ {
1944
+ type: 'state',
1945
+ name: 'TodoListSummary',
1946
+ fields: [
1947
+ { name: 'summaryId', type: 'string', required: true },
1948
+ { name: 'totalTodos', type: 'number', required: true },
1949
+ { name: 'pendingCount', type: 'number', required: true },
1950
+ { name: 'inProgressCount', type: 'number', required: true },
1951
+ { name: 'completedCount', type: 'number', required: true },
1952
+ { name: 'completionPercentage', type: 'number', required: true },
1953
+ ],
1954
+ metadata: { version: 1 },
1955
+ },
1956
+ ],
1957
+ integrations: [],
1958
+ };
1959
+
1960
+ const code = await modelToNarrative(modelWithEmptyWhen);
1961
+
1962
+ expect(code).toEqual(`import { example, narrative, query, rule, specs } from '@auto-engineer/narrative';
1963
+ import type { Event, State } from '@auto-engineer/narrative';
1964
+ type TodoAdded = Event<
1965
+ 'TodoAdded',
1966
+ {
1967
+ todoId: string;
1968
+ description: string;
1969
+ status: string;
1970
+ addedAt: Date;
1971
+ }
1972
+ >;
1973
+ type TodoMarkedInProgress = Event<
1974
+ 'TodoMarkedInProgress',
1975
+ {
1976
+ todoId: string;
1977
+ markedAt: Date;
1978
+ }
1979
+ >;
1980
+ type TodoMarkedComplete = Event<
1981
+ 'TodoMarkedComplete',
1982
+ {
1983
+ todoId: string;
1984
+ completedAt: Date;
1985
+ }
1986
+ >;
1987
+ type TodoListSummary = State<
1988
+ 'TodoListSummary',
1989
+ {
1990
+ summaryId: string;
1991
+ totalTodos: number;
1992
+ pendingCount: number;
1993
+ inProgressCount: number;
1994
+ completedCount: number;
1995
+ completionPercentage: number;
1996
+ }
1997
+ >;
1998
+ narrative('Todo List Summary', 'TODO-001', () => {
1999
+ query('views completion summary', 'SUMMARY-001').server(() => {
2000
+ specs('Summary Statistics', () => {
2001
+ rule('summary shows overall todo list statistics', 'RULE-SUMMARY', () => {
2002
+ example('calculates summary from multiple todos')
2003
+ .given<TodoAdded>({
2004
+ todoId: 'todo-001',
2005
+ description: 'Buy groceries',
2006
+ status: 'pending',
2007
+ addedAt: new Date('2030-01-01T09:00:00.000Z'),
2008
+ })
2009
+ .and<TodoAdded>({
2010
+ todoId: 'todo-002',
2011
+ description: 'Write report',
2012
+ status: 'pending',
2013
+ addedAt: new Date('2030-01-01T09:10:00.000Z'),
2014
+ })
2015
+ .and<TodoMarkedInProgress>({ todoId: 'todo-001', markedAt: new Date('2030-01-01T10:00:00.000Z') })
2016
+ .and<TodoMarkedComplete>({ todoId: 'todo-002', completedAt: new Date('2030-01-01T11:00:00.000Z') })
2017
+ .then<TodoListSummary>({
2018
+ summaryId: 'main-summary',
2019
+ totalTodos: 2,
2020
+ pendingCount: 0,
2021
+ inProgressCount: 1,
2022
+ completedCount: 1,
2023
+ completionPercentage: 50,
2024
+ });
2025
+ });
2026
+ });
2027
+ });
2028
+ });
2029
+ `);
2030
+
2031
+ expect(code).not.toContain('.when({})');
2032
+ expect(code).not.toContain('.when<');
2033
+ });
1822
2034
  });
@@ -321,7 +321,6 @@ export function recordExample(description: string): void {
321
321
  const rule = objectRules[context.currentRuleIndex];
322
322
  rule.examples.push({
323
323
  description,
324
- when: { commandRef: '', exampleData: {} }, // Default, will be updated
325
324
  then: [],
326
325
  });
327
326
  context.currentExampleIndex = rule.examples.length - 1;
package/src/narrative.ts CHANGED
@@ -93,7 +93,7 @@ export function rule(description: string, idOrFn: string | (() => void), fn?: ()
93
93
  callback();
94
94
  }
95
95
 
96
- export const example = (description: string) => {
96
+ export const example = (description: string): TypedExampleBuilder => {
97
97
  recordExample(description);
98
98
  return createExampleBuilder();
99
99
  };
@@ -122,6 +122,7 @@ interface TypedExampleBuilder {
122
122
  interface TypedGivenBuilder<G> {
123
123
  and<U>(data: ExtractData<U> | ExtractData<U>[], context?: ContextFor<U>): TypedGivenBuilder<G | U>;
124
124
  when<W>(data: ExtractData<W> | ExtractData<W>[], context?: ContextFor<W>): TypedGivenWhenBuilder<G, W>;
125
+ then<T>(data: ExtractData<T> | ExtractData<T>[], context?: ContextFor<T>): TypedGivenThenBuilder<G, never, T>;
125
126
  }
126
127
 
127
128
  interface TypedWhenBuilder<W> {
@@ -180,6 +181,20 @@ function createGivenBuilder<G>(): TypedGivenBuilder<G> {
180
181
  },
181
182
  };
182
183
  },
184
+ then<T>(data: ExtractData<T> | ExtractData<T>[], context?: ContextFor<T>): TypedGivenThenBuilder<G, never, T> {
185
+ const thenItems = Array.isArray(data) ? data : [data];
186
+ recordThenData(thenItems, normalizeContext(context as Partial<Record<string, string>>));
187
+ return {
188
+ and<A>(
189
+ data: ExtractData<A> | ExtractData<A>[],
190
+ context?: ContextFor<A>,
191
+ ): TypedGivenThenBuilder<G, never, T | A> {
192
+ const andItems = Array.isArray(data) ? data : [data];
193
+ recordAndThenData(andItems, normalizeContext(context as Partial<Record<string, string>>));
194
+ return createThenBuilder<never, T | A>() as TypedGivenThenBuilder<G, never, T | A>;
195
+ },
196
+ };
197
+ },
183
198
  };
184
199
  }
185
200
 
@@ -58,7 +58,6 @@ flow('Mixed Given Types', 'FLOW-MGT', () => {
58
58
  itemId: 'item-002',
59
59
  addedAt: new Date('2024-01-01T10:02:00Z'),
60
60
  })
61
- .when({}) // empty when clause
62
61
  .then<SystemStatus>({
63
62
  systemId: 'system-001',
64
63
  itemCount: 2,
@@ -11,7 +11,7 @@ export interface OrderPlaced {
11
11
  };
12
12
  }
13
13
 
14
- export interface PlaceOrderFlow {
14
+ export interface PlaceOrderNarrative {
15
15
  type: 'PlaceOrder';
16
16
  data: {
17
17
  productId: string;
@@ -41,7 +41,7 @@ flow('Place order', () => {
41
41
  specs('User submits a new order', () => {
42
42
  rule('Valid orders should be processed successfully', () => {
43
43
  example('User places order for available product')
44
- .when<PlaceOrderFlow>({
44
+ .when<PlaceOrderNarrative>({
45
45
  productId: 'product_789',
46
46
  quantity: 3,
47
47
  })
@@ -135,7 +135,6 @@ flow('Questionnaires', 'AUTO-Q9m2Kp4Lx', () => {
135
135
  link: 'https://app.example.com/q/q-001?participant=participant-abc',
136
136
  sentAt: new Date('2030-01-01T09:00:00Z'),
137
137
  })
138
- .when({})
139
138
  .then<QuestionnaireProgress>({
140
139
  questionnaireId: 'q-001',
141
140
  participantId: 'participant-abc',
@@ -259,7 +258,6 @@ flow('Questionnaires', 'AUTO-Q9m2Kp4Lx', () => {
259
258
  answer: 'No',
260
259
  savedAt: new Date('2030-01-01T09:05:00Z'),
261
260
  })
262
- .when({}) // FIX ME
263
261
  .then<QuestionnaireProgress>({
264
262
  questionnaireId: 'q-001',
265
263
  participantId: 'participant-abc',
@@ -452,7 +452,7 @@
452
452
  }
453
453
  }
454
454
  ],
455
- "sourceFile": "/Users/ramihatoum/WebstormProjects/xolvio/auto-engineer/examples/shopping-app/flows/shopping-assistant.flow.ts"
455
+ "sourceFile": "/Users/ramihatoum/WebstormProjects/xolvio/auto-engineer/examples/shopping-app/flows/shopping-assistant.narrative.ts"
456
456
  }
457
457
  ],
458
458
  "messages": [
package/src/schema.ts CHANGED
@@ -181,6 +181,7 @@ const ExampleSchema = z
181
181
  .describe('Given conditions'),
182
182
  when: z
183
183
  .union([CommandExampleSchema, EventExampleSchema, z.array(CommandExampleSchema), z.array(EventExampleSchema)])
184
+ .optional()
184
185
  .describe('When action or events occur'),
185
186
  then: z
186
187
  .array(z.union([EventExampleSchema, StateExampleSchema, CommandExampleSchema, ErrorExampleSchema]))
@@ -164,26 +164,61 @@ function addEventWhenToChain(
164
164
  );
165
165
  }
166
166
 
167
- function addWhenToChain(
167
+ function isEmptyEventWhen(when: { eventRef: string; exampleData: Record<string, unknown> }): boolean {
168
+ return (!when.eventRef || when.eventRef === '') && Object.keys(when.exampleData).length === 0;
169
+ }
170
+
171
+ function isEmptyCommandWhen(when: { commandRef: string; exampleData: Record<string, unknown> }): boolean {
172
+ return (!when.commandRef || when.commandRef === '') && Object.keys(when.exampleData).length === 0;
173
+ }
174
+
175
+ function isEmptyWhen(whenData: GWTBlock['when']): boolean {
176
+ if (!whenData) return true;
177
+ if (Array.isArray(whenData) && whenData.length === 0) return true;
178
+ if (typeof whenData === 'object' && 'eventRef' in whenData) {
179
+ return isEmptyEventWhen(whenData as { eventRef: string; exampleData: Record<string, unknown> });
180
+ }
181
+ if (typeof whenData === 'object' && 'commandRef' in whenData) {
182
+ return isEmptyCommandWhen(whenData as { commandRef: string; exampleData: Record<string, unknown> });
183
+ }
184
+ return false;
185
+ }
186
+
187
+ function processWhenForSliceKind(
168
188
  ts: typeof import('typescript'),
169
189
  f: tsNS.NodeFactory,
170
190
  exampleChain: tsNS.Expression,
171
- g: GWTBlock,
191
+ when: GWTBlock['when'],
172
192
  sliceKind: 'command' | 'react' | 'query' | 'experience',
173
193
  messages?: Array<{ type: string; name: string; fields: Array<{ name: string; type: string; required: boolean }> }>,
174
194
  ): tsNS.Expression {
175
- if (sliceKind === 'command' && isWhenCommand(g.when)) {
176
- return addCommandWhenToChain(ts, f, exampleChain, g.when, messages);
177
- } else if ((sliceKind === 'react' || sliceKind === 'query') && isWhenEvents(g.when)) {
178
- const firstWhenEvent = g.when[0];
179
- return addEventWhenToChain(ts, f, exampleChain, firstWhenEvent, messages);
180
- } else if (sliceKind === 'query' && g.when && !Array.isArray(g.when) && 'eventRef' in g.when) {
181
- const whenEvent = g.when as { eventRef: string; exampleData: Record<string, unknown> };
195
+ if (sliceKind === 'command' && isWhenCommand(when)) {
196
+ return addCommandWhenToChain(ts, f, exampleChain, when, messages);
197
+ }
198
+ if ((sliceKind === 'react' || sliceKind === 'query') && isWhenEvents(when)) {
199
+ return addEventWhenToChain(ts, f, exampleChain, when[0], messages);
200
+ }
201
+ if (sliceKind === 'query' && when && !Array.isArray(when) && 'eventRef' in when) {
202
+ const whenEvent = when as { eventRef: string; exampleData: Record<string, unknown> };
182
203
  return addEventWhenToChain(ts, f, exampleChain, whenEvent, messages);
183
204
  }
184
205
  return exampleChain;
185
206
  }
186
207
 
208
+ function addWhenToChain(
209
+ ts: typeof import('typescript'),
210
+ f: tsNS.NodeFactory,
211
+ exampleChain: tsNS.Expression,
212
+ g: GWTBlock,
213
+ sliceKind: 'command' | 'react' | 'query' | 'experience',
214
+ messages?: Array<{ type: string; name: string; fields: Array<{ name: string; type: string; required: boolean }> }>,
215
+ ): tsNS.Expression {
216
+ if (isEmptyWhen(g.when)) {
217
+ return exampleChain;
218
+ }
219
+ return processWhenForSliceKind(ts, f, exampleChain, g.when, sliceKind, messages);
220
+ }
221
+
187
222
  function getThenTypeRef(firstThenItem: GWTBlock['then'][0]): string {
188
223
  if ('eventRef' in firstThenItem) {
189
224
  return (firstThenItem as { eventRef: string }).eventRef;
@@ -1,6 +1,6 @@
1
1
  import createDebug from 'debug';
2
2
 
3
- export const debugIntegrations = createDebug('auto:flow:getFlows:integrations');
3
+ export const debugIntegrations = createDebug('auto:flow:getNarratives:integrations');
4
4
  if (typeof debugIntegrations === 'object' && debugIntegrations !== null && 'color' in debugIntegrations) {
5
5
  (debugIntegrations as { color: string }).color = '6';
6
6
  }
@@ -1,4 +0,0 @@
1
-
2
- > @auto-engineer/narrative@0.11.10 format /Users/sam/WebstormProjects/top/auto-engineer-2/packages/narrative
3
- > prettier --write "**/*.{js,ts,json,md,yml,yaml}" --ignore-path ../../.prettierignore --log-level warn
4
-
@@ -1,4 +0,0 @@
1
-
2
- > @auto-engineer/narrative@0.11.10 lint /Users/sam/WebstormProjects/top/auto-engineer-2/packages/narrative
3
- > eslint '{src,scripts}/**/*.ts' --max-warnings 0 --config ./eslint.config.ts
4
-
@@ -1,14 +0,0 @@
1
-
2
- > @auto-engineer/narrative@0.11.10 test /Users/sam/WebstormProjects/top/auto-engineer-2/packages/narrative
3
- > vitest run --reporter=dot
4
-
5
-
6
- RUN v3.2.4 /Users/sam/WebstormProjects/top/auto-engineer-2/packages/narrative
7
-
8
- ·································································
9
-
10
- Test Files 8 passed (8)
11
- Tests 65 passed (65)
12
- Start at 15:23:05
13
- Duration 2.32s (transform 1.53s, setup 0ms, collect 5.01s, tests 2.45s, environment 1ms, prepare 1.30s)
14
-
@@ -1,4 +0,0 @@
1
-
2
- > @auto-engineer/narrative@0.11.10 type-check /Users/sam/WebstormProjects/top/auto-engineer-2/packages/narrative
3
- > tsc --noEmit
4
-
@@ -1,71 +0,0 @@
1
- import type { DataSinkItem, DataSourceItem, MessageTarget, Integration } from './types';
2
- export interface ChainableSinkMethods {
3
- additionalInstructions(instructions: string): ChainableSink;
4
- withState(source: DataSourceItem | ChainableSource): ChainableSink;
5
- }
6
- export interface ChainableSourceMethods {
7
- additionalInstructions(instructions: string): ChainableSource;
8
- }
9
- export type ChainableSink = DataSinkItem & ChainableSinkMethods;
10
- export type ChainableSource = DataSourceItem & ChainableSourceMethods;
11
- export interface FieldSelector {
12
- [key: string]: boolean | FieldSelector;
13
- }
14
- declare abstract class MessageTargetBuilder<TResult> {
15
- protected target: Partial<MessageTarget>;
16
- protected instructions?: string;
17
- fields(selector: FieldSelector): this;
18
- additionalInstructions(instructions: string): this;
19
- abstract build(): TResult;
20
- }
21
- export declare class EventSinkBuilder extends MessageTargetBuilder<DataSinkItem> {
22
- constructor(name: string);
23
- toStream(pattern: string): ChainableSink;
24
- toIntegration(...systems: Integration[]): ChainableSink;
25
- toDatabase(collection: string): ChainableSink;
26
- toTopic(name: string): ChainableSink;
27
- build(): DataSinkItem;
28
- }
29
- export declare class CommandSinkBuilder extends MessageTargetBuilder<DataSinkItem> {
30
- private stateSource?;
31
- constructor(name: string);
32
- withState(source: DataSourceItem | ChainableSource): this;
33
- toIntegration(system: Integration | string, messageName: string, messageType: 'command' | 'query' | 'reaction'): ChainableSink;
34
- hints(hint: string): ChainableSink;
35
- toDatabase(collection: string): ChainableSink;
36
- toTopic(name: string): ChainableSink;
37
- build(): DataSinkItem;
38
- }
39
- export declare class StateSinkBuilder extends MessageTargetBuilder<DataSinkItem> {
40
- constructor(name: string);
41
- toDatabase(collection: string): ChainableSink;
42
- toStream(pattern: string): ChainableSink;
43
- build(): DataSinkItem;
44
- }
45
- export declare class StateSourceBuilder extends MessageTargetBuilder<DataSourceItem> {
46
- constructor(name: string);
47
- fromProjection(name: string, idField: string): ChainableSource;
48
- fromReadModel(name: string): ChainableSource;
49
- fromDatabase(collection: string, query?: Record<string, unknown>): ChainableSource;
50
- fromApi(endpoint: string, method?: string): ChainableSource;
51
- fromIntegration(...systems: (Integration | string)[]): ChainableSource;
52
- build(): DataSourceItem;
53
- }
54
- interface BuilderResult {
55
- type: string;
56
- __messageCategory: 'event' | 'command' | 'state';
57
- }
58
- export declare class DataSinkBuilder {
59
- event(nameOrBuilder: string | BuilderResult): EventSinkBuilder;
60
- command(nameOrBuilder: string | BuilderResult): CommandSinkBuilder;
61
- state(nameOrBuilder: string | BuilderResult): StateSinkBuilder;
62
- }
63
- export declare class DataSourceBuilder {
64
- state(nameOrBuilder: string | BuilderResult): StateSourceBuilder;
65
- }
66
- export declare const sink: () => DataSinkBuilder;
67
- export declare const source: () => DataSourceBuilder;
68
- export declare function typedSink(builderResult: BuilderResult): EventSinkBuilder | CommandSinkBuilder | StateSinkBuilder;
69
- export declare function typedSource(builderResult: BuilderResult): StateSourceBuilder;
70
- export {};
71
- //# sourceMappingURL=data-flow-builders.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-flow-builders.d.ts","sourceRoot":"","sources":["../../src/data-flow-builders.ts"],"names":[],"mappings":"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"}