@contember/engine-actions 1.3.0-alpha.4

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 (289) hide show
  1. package/dist/src/ActionsExecutionContainerHookFactory.d.ts +8 -0
  2. package/dist/src/ActionsExecutionContainerHookFactory.d.ts.map +1 -0
  3. package/dist/src/ActionsExecutionContainerHookFactory.js +28 -0
  4. package/dist/src/ActionsExecutionContainerHookFactory.js.map +1 -0
  5. package/dist/src/ImplementationException.d.ts +3 -0
  6. package/dist/src/ImplementationException.d.ts.map +1 -0
  7. package/dist/src/ImplementationException.js +7 -0
  8. package/dist/src/ImplementationException.js.map +1 -0
  9. package/dist/src/ListenerStoreProvider.d.ts +7 -0
  10. package/dist/src/ListenerStoreProvider.d.ts.map +1 -0
  11. package/dist/src/ListenerStoreProvider.js +21 -0
  12. package/dist/src/ListenerStoreProvider.js.map +1 -0
  13. package/dist/src/dispatch/DispatchWorkerSupervisor.d.ts +17 -0
  14. package/dist/src/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -0
  15. package/dist/src/dispatch/DispatchWorkerSupervisor.js +123 -0
  16. package/dist/src/dispatch/DispatchWorkerSupervisor.js.map +1 -0
  17. package/dist/src/dispatch/EventDispatcher.d.ts +25 -0
  18. package/dist/src/dispatch/EventDispatcher.d.ts.map +1 -0
  19. package/dist/src/dispatch/EventDispatcher.js +46 -0
  20. package/dist/src/dispatch/EventDispatcher.js.map +1 -0
  21. package/dist/src/dispatch/EventsRepository.d.ts +22 -0
  22. package/dist/src/dispatch/EventsRepository.d.ts.map +1 -0
  23. package/dist/src/dispatch/EventsRepository.js +138 -0
  24. package/dist/src/dispatch/EventsRepository.js.map +1 -0
  25. package/dist/src/dispatch/ProjectDispatcher.d.ts +22 -0
  26. package/dist/src/dispatch/ProjectDispatcher.d.ts.map +1 -0
  27. package/dist/src/dispatch/ProjectDispatcher.js +103 -0
  28. package/dist/src/dispatch/ProjectDispatcher.js.map +1 -0
  29. package/dist/src/dispatch/TargetHandlerResolver.d.ts +9 -0
  30. package/dist/src/dispatch/TargetHandlerResolver.d.ts.map +1 -0
  31. package/dist/src/dispatch/TargetHandlerResolver.js +17 -0
  32. package/dist/src/dispatch/TargetHandlerResolver.js.map +1 -0
  33. package/dist/src/dispatch/WebhookTargetHandler.d.ts +7 -0
  34. package/dist/src/dispatch/WebhookTargetHandler.d.ts.map +1 -0
  35. package/dist/src/dispatch/WebhookTargetHandler.js +85 -0
  36. package/dist/src/dispatch/WebhookTargetHandler.js.map +1 -0
  37. package/dist/src/dispatch/types.d.ts +27 -0
  38. package/dist/src/dispatch/types.d.ts.map +1 -0
  39. package/dist/src/dispatch/types.js +3 -0
  40. package/dist/src/dispatch/types.js.map +1 -0
  41. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.d.ts +10 -0
  42. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -0
  43. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.js +31 -0
  44. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -0
  45. package/dist/src/graphql/http/ActionsContextResolver.d.ts +11 -0
  46. package/dist/src/graphql/http/ActionsContextResolver.d.ts.map +1 -0
  47. package/dist/src/graphql/http/ActionsContextResolver.js +33 -0
  48. package/dist/src/graphql/http/ActionsContextResolver.js.map +1 -0
  49. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.d.ts +8 -0
  50. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -0
  51. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.js +21 -0
  52. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -0
  53. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.d.ts +11 -0
  54. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -0
  55. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.js +150 -0
  56. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -0
  57. package/dist/src/graphql/resolvers/ActionsContext.d.ts +9 -0
  58. package/dist/src/graphql/resolvers/ActionsContext.d.ts.map +1 -0
  59. package/dist/src/graphql/resolvers/ActionsContext.js +3 -0
  60. package/dist/src/graphql/resolvers/ActionsContext.js.map +1 -0
  61. package/dist/src/graphql/resolvers/ResolversFactory.d.ts +13 -0
  62. package/dist/src/graphql/resolvers/ResolversFactory.d.ts.map +1 -0
  63. package/dist/src/graphql/resolvers/ResolversFactory.js +32 -0
  64. package/dist/src/graphql/resolvers/ResolversFactory.js.map +1 -0
  65. package/dist/src/graphql/resolvers/index.d.ts +3 -0
  66. package/dist/src/graphql/resolvers/index.d.ts.map +1 -0
  67. package/dist/src/graphql/resolvers/index.js +19 -0
  68. package/dist/src/graphql/resolvers/index.js.map +1 -0
  69. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts +11 -0
  70. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts.map +1 -0
  71. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js +16 -0
  72. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -0
  73. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts +11 -0
  74. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -0
  75. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js +16 -0
  76. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -0
  77. package/dist/src/graphql/resolvers/mutation/index.d.ts +3 -0
  78. package/dist/src/graphql/resolvers/mutation/index.d.ts.map +1 -0
  79. package/dist/src/graphql/resolvers/mutation/index.js +19 -0
  80. package/dist/src/graphql/resolvers/mutation/index.js.map +1 -0
  81. package/dist/src/graphql/resolvers/query/EventsQueryResolver.d.ts +11 -0
  82. package/dist/src/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -0
  83. package/dist/src/graphql/resolvers/query/EventsQueryResolver.js +43 -0
  84. package/dist/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -0
  85. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.d.ts +12 -0
  86. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -0
  87. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.js +16 -0
  88. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -0
  89. package/dist/src/graphql/resolvers/query/index.d.ts +2 -0
  90. package/dist/src/graphql/resolvers/query/index.d.ts.map +1 -0
  91. package/dist/src/graphql/resolvers/query/index.js +18 -0
  92. package/dist/src/graphql/resolvers/query/index.js.map +1 -0
  93. package/dist/src/graphql/schema/actions.graphql.d.ts +3 -0
  94. package/dist/src/graphql/schema/actions.graphql.d.ts.map +1 -0
  95. package/dist/src/graphql/schema/actions.graphql.js +93 -0
  96. package/dist/src/graphql/schema/actions.graphql.js.map +1 -0
  97. package/dist/src/graphql/schema/index.d.ts +224 -0
  98. package/dist/src/graphql/schema/index.d.ts.map +1 -0
  99. package/dist/src/graphql/schema/index.js +3 -0
  100. package/dist/src/graphql/schema/index.js.map +1 -0
  101. package/dist/src/index.d.ts +13 -0
  102. package/dist/src/index.d.ts.map +1 -0
  103. package/dist/src/index.js +81 -0
  104. package/dist/src/index.js.map +1 -0
  105. package/dist/src/migrations/2023-03-10-145000-actions-variables.d.ts +3 -0
  106. package/dist/src/migrations/2023-03-10-145000-actions-variables.d.ts.map +1 -0
  107. package/dist/src/migrations/2023-03-10-145000-actions-variables.js +17 -0
  108. package/dist/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -0
  109. package/dist/src/migrations/index.d.ts +3 -0
  110. package/dist/src/migrations/index.d.ts.map +1 -0
  111. package/dist/src/migrations/index.js +13 -0
  112. package/dist/src/migrations/index.js.map +1 -0
  113. package/dist/src/migrations/snapshot.d.ts +3 -0
  114. package/dist/src/migrations/snapshot.d.ts.map +1 -0
  115. package/dist/src/migrations/snapshot.js +49 -0
  116. package/dist/src/migrations/snapshot.js.map +1 -0
  117. package/dist/src/model/EventsInProcessingQuery.d.ts +9 -0
  118. package/dist/src/model/EventsInProcessingQuery.d.ts.map +1 -0
  119. package/dist/src/model/EventsInProcessingQuery.js +22 -0
  120. package/dist/src/model/EventsInProcessingQuery.js.map +1 -0
  121. package/dist/src/model/EventsToProcessQuery.d.ts +9 -0
  122. package/dist/src/model/EventsToProcessQuery.d.ts.map +1 -0
  123. package/dist/src/model/EventsToProcessQuery.js +22 -0
  124. package/dist/src/model/EventsToProcessQuery.js.map +1 -0
  125. package/dist/src/model/EventsToProcessSpecification.d.ts +4 -0
  126. package/dist/src/model/EventsToProcessSpecification.d.ts.map +1 -0
  127. package/dist/src/model/EventsToProcessSpecification.js +14 -0
  128. package/dist/src/model/EventsToProcessSpecification.js.map +1 -0
  129. package/dist/src/model/FailedEventsQuery.d.ts +9 -0
  130. package/dist/src/model/FailedEventsQuery.d.ts.map +1 -0
  131. package/dist/src/model/FailedEventsQuery.js +22 -0
  132. package/dist/src/model/FailedEventsQuery.js.map +1 -0
  133. package/dist/src/model/SetVariableCommand.d.ts +8 -0
  134. package/dist/src/model/SetVariableCommand.d.ts.map +1 -0
  135. package/dist/src/model/SetVariableCommand.js +26 -0
  136. package/dist/src/model/SetVariableCommand.js.map +1 -0
  137. package/dist/src/model/VariablesManager.d.ts +8 -0
  138. package/dist/src/model/VariablesManager.d.ts.map +1 -0
  139. package/dist/src/model/VariablesManager.js +46 -0
  140. package/dist/src/model/VariablesManager.js.map +1 -0
  141. package/dist/src/model/VariablesQuery.d.ts +12 -0
  142. package/dist/src/model/VariablesQuery.d.ts.map +1 -0
  143. package/dist/src/model/VariablesQuery.js +13 -0
  144. package/dist/src/model/VariablesQuery.js.map +1 -0
  145. package/dist/src/model/types.d.ts +16 -0
  146. package/dist/src/model/types.d.ts.map +1 -0
  147. package/dist/src/model/types.js +3 -0
  148. package/dist/src/model/types.js.map +1 -0
  149. package/dist/src/triggers/Payload.d.ts +62 -0
  150. package/dist/src/triggers/Payload.d.ts.map +1 -0
  151. package/dist/src/triggers/Payload.js +3 -0
  152. package/dist/src/triggers/Payload.js.map +1 -0
  153. package/dist/src/triggers/TriggerHandler.d.ts +26 -0
  154. package/dist/src/triggers/TriggerHandler.d.ts.map +1 -0
  155. package/dist/src/triggers/TriggerHandler.js +130 -0
  156. package/dist/src/triggers/TriggerHandler.js.map +1 -0
  157. package/dist/src/triggers/TriggerIndirectChangesFetcher.d.ts +11 -0
  158. package/dist/src/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -0
  159. package/dist/src/triggers/TriggerIndirectChangesFetcher.js +24 -0
  160. package/dist/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -0
  161. package/dist/src/triggers/TriggerListeners.d.ts +9 -0
  162. package/dist/src/triggers/TriggerListeners.d.ts.map +1 -0
  163. package/dist/src/triggers/TriggerListeners.js +3 -0
  164. package/dist/src/triggers/TriggerListeners.js.map +1 -0
  165. package/dist/src/triggers/TriggerListenersBuilder.d.ts +15 -0
  166. package/dist/src/triggers/TriggerListenersBuilder.d.ts.map +1 -0
  167. package/dist/src/triggers/TriggerListenersBuilder.js +169 -0
  168. package/dist/src/triggers/TriggerListenersBuilder.js.map +1 -0
  169. package/dist/src/triggers/TriggerListenersFactory.d.ts +8 -0
  170. package/dist/src/triggers/TriggerListenersFactory.d.ts.map +1 -0
  171. package/dist/src/triggers/TriggerListenersFactory.js +18 -0
  172. package/dist/src/triggers/TriggerListenersFactory.js.map +1 -0
  173. package/dist/src/triggers/TriggerListenersStore.d.ts +48 -0
  174. package/dist/src/triggers/TriggerListenersStore.d.ts.map +1 -0
  175. package/dist/src/triggers/TriggerListenersStore.js +30 -0
  176. package/dist/src/triggers/TriggerListenersStore.js.map +1 -0
  177. package/dist/src/triggers/TriggerPayloadBuilder.d.ts +14 -0
  178. package/dist/src/triggers/TriggerPayloadBuilder.d.ts.map +1 -0
  179. package/dist/src/triggers/TriggerPayloadBuilder.js +140 -0
  180. package/dist/src/triggers/TriggerPayloadBuilder.js.map +1 -0
  181. package/dist/src/triggers/TriggerPayloadManager.d.ts +27 -0
  182. package/dist/src/triggers/TriggerPayloadManager.d.ts.map +1 -0
  183. package/dist/src/triggers/TriggerPayloadManager.js +26 -0
  184. package/dist/src/triggers/TriggerPayloadManager.js.map +1 -0
  185. package/dist/src/triggers/TriggerPayloadPersister.d.ts +18 -0
  186. package/dist/src/triggers/TriggerPayloadPersister.d.ts.map +1 -0
  187. package/dist/src/triggers/TriggerPayloadPersister.js +44 -0
  188. package/dist/src/triggers/TriggerPayloadPersister.js.map +1 -0
  189. package/dist/src/triggers/index.d.ts +8 -0
  190. package/dist/src/triggers/index.d.ts.map +1 -0
  191. package/dist/src/triggers/index.js +24 -0
  192. package/dist/src/triggers/index.js.map +1 -0
  193. package/dist/src/tsconfig.tsbuildinfo +1 -0
  194. package/dist/src/utils/assertNever.d.ts +2 -0
  195. package/dist/src/utils/assertNever.d.ts.map +1 -0
  196. package/dist/src/utils/assertNever.js +8 -0
  197. package/dist/src/utils/assertNever.js.map +1 -0
  198. package/dist/src/utils/map.d.ts +2 -0
  199. package/dist/src/utils/map.d.ts.map +1 -0
  200. package/dist/src/utils/map.js +14 -0
  201. package/dist/src/utils/map.js.map +1 -0
  202. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.d.ts +2 -0
  203. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.d.ts.map +1 -0
  204. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.js +442 -0
  205. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.js.map +1 -0
  206. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.d.ts +2 -0
  207. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.d.ts.map +1 -0
  208. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.js +449 -0
  209. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.js.map +1 -0
  210. package/dist/tests/cases/integration/triggers.rootWatch.test.d.ts +2 -0
  211. package/dist/tests/cases/integration/triggers.rootWatch.test.d.ts.map +1 -0
  212. package/dist/tests/cases/integration/triggers.rootWatch.test.js +159 -0
  213. package/dist/tests/cases/integration/triggers.rootWatch.test.js.map +1 -0
  214. package/dist/tests/cases/integration/utils.d.ts +4 -0
  215. package/dist/tests/cases/integration/utils.d.ts.map +1 -0
  216. package/dist/tests/cases/integration/utils.js +12 -0
  217. package/dist/tests/cases/integration/utils.js.map +1 -0
  218. package/dist/tests/cases/unit/generator.test.d.ts +2 -0
  219. package/dist/tests/cases/unit/generator.test.d.ts.map +1 -0
  220. package/dist/tests/cases/unit/generator.test.js +627 -0
  221. package/dist/tests/cases/unit/generator.test.js.map +1 -0
  222. package/dist/tests/src/gql.d.ts +2 -0
  223. package/dist/tests/src/gql.d.ts.map +1 -0
  224. package/dist/tests/src/gql.js +14 -0
  225. package/dist/tests/src/gql.js.map +1 -0
  226. package/dist/tests/tsconfig.tsbuildinfo +1 -0
  227. package/graphql-actions.codegen.yml +21 -0
  228. package/package.json +41 -0
  229. package/src/ActionsExecutionContainerHookFactory.ts +28 -0
  230. package/src/ImplementationException.ts +2 -0
  231. package/src/ListenerStoreProvider.ts +17 -0
  232. package/src/dispatch/DispatchWorkerSupervisor.ts +137 -0
  233. package/src/dispatch/EventDispatcher.ts +64 -0
  234. package/src/dispatch/EventsRepository.ts +165 -0
  235. package/src/dispatch/ProjectDispatcher.ts +119 -0
  236. package/src/dispatch/TargetHandlerResolver.ts +18 -0
  237. package/src/dispatch/WebhookTargetHandler.ts +88 -0
  238. package/src/dispatch/types.ts +31 -0
  239. package/src/graphql/http/ActionsApiMiddlewareFactory.ts +36 -0
  240. package/src/graphql/http/ActionsContextResolver.ts +38 -0
  241. package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +23 -0
  242. package/src/graphql/http/ActionsWebsocketControllerFactory.ts +143 -0
  243. package/src/graphql/resolvers/ActionsContext.ts +9 -0
  244. package/src/graphql/resolvers/ResolversFactory.ts +35 -0
  245. package/src/graphql/resolvers/index.ts +2 -0
  246. package/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts +16 -0
  247. package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +19 -0
  248. package/src/graphql/resolvers/mutation/index.ts +2 -0
  249. package/src/graphql/resolvers/query/EventsQueryResolver.ts +55 -0
  250. package/src/graphql/resolvers/query/VariablesQueryResolver.ts +18 -0
  251. package/src/graphql/resolvers/query/index.ts +1 -0
  252. package/src/graphql/schema/actions.graphql.ts +91 -0
  253. package/src/graphql/schema/index.ts +295 -0
  254. package/src/index.ts +88 -0
  255. package/src/migrations/2023-03-10-145000-actions-variables.ts +16 -0
  256. package/src/migrations/index.ts +7 -0
  257. package/src/migrations/snapshot.ts +47 -0
  258. package/src/model/EventsInProcessingQuery.ts +21 -0
  259. package/src/model/EventsToProcessQuery.ts +21 -0
  260. package/src/model/EventsToProcessSpecification.ts +11 -0
  261. package/src/model/FailedEventsQuery.ts +21 -0
  262. package/src/model/SetVariableCommand.ts +26 -0
  263. package/src/model/VariablesManager.ts +49 -0
  264. package/src/model/VariablesQuery.ts +17 -0
  265. package/src/model/types.ts +15 -0
  266. package/src/triggers/Payload.ts +82 -0
  267. package/src/triggers/TriggerHandler.ts +161 -0
  268. package/src/triggers/TriggerIndirectChangesFetcher.ts +30 -0
  269. package/src/triggers/TriggerListeners.ts +16 -0
  270. package/src/triggers/TriggerListenersBuilder.ts +190 -0
  271. package/src/triggers/TriggerListenersFactory.ts +19 -0
  272. package/src/triggers/TriggerListenersStore.ts +76 -0
  273. package/src/triggers/TriggerPayloadBuilder.ts +148 -0
  274. package/src/triggers/TriggerPayloadManager.ts +47 -0
  275. package/src/triggers/TriggerPayloadPersister.ts +43 -0
  276. package/src/triggers/index.ts +7 -0
  277. package/src/tsconfig.json +21 -0
  278. package/src/utils/assertNever.ts +3 -0
  279. package/src/utils/map.ts +13 -0
  280. package/tests/cases/integration/triggers.manyHasManyWatch.test.ts +437 -0
  281. package/tests/cases/integration/triggers.manyHasOneWatch.test.ts +446 -0
  282. package/tests/cases/integration/triggers.rootWatch.test.ts +152 -0
  283. package/tests/cases/integration/utils.ts +9 -0
  284. package/tests/cases/unit/generator.test.ts +689 -0
  285. package/tests/src/gql.ts +7 -0
  286. package/tests/tsconfig.json +16 -0
  287. package/tsconfig.json +5 -0
  288. package/tsconfig.settings.json +8 -0
  289. package/vite.config.js +3 -0
@@ -0,0 +1,689 @@
1
+ import { TriggerListenerBuilder, TriggerListeners } from '../../../src/triggers'
2
+ import { SchemaDefinition as def } from '@contember/schema-definition'
3
+ import { Actions, Model } from '@contember/schema'
4
+ import { assert, test } from 'vitest'
5
+
6
+
7
+ const createTrigger = (watchNode: Actions.SelectionNode): Actions.AnyTrigger => ({
8
+ type: 'watch',
9
+ entity: 'Author',
10
+ name: 'author_trigger',
11
+ watch: watchNode,
12
+ target: null as any,
13
+ })
14
+
15
+ const testBuilder = (watchNode: Actions.SelectionNode): TriggerListeners => {
16
+ const generator = new TriggerListenerBuilder(schema)
17
+ generator.add(createTrigger(watchNode))
18
+ return (generator.createStore() as any).listeners
19
+ }
20
+
21
+ test('watch column', () => {
22
+ const node = ['name']
23
+ const trigger = createTrigger(node)
24
+ const listeners = createEmptyListeners(['name'], trigger)
25
+
26
+ assert.deepStrictEqual(testBuilder(node), listeners)
27
+ })
28
+
29
+ test('first level many-has-many owning', () => {
30
+ const node = [['topics', {}, ['name']]] as const
31
+ const trigger = createTrigger(node)
32
+ const listeners = createEmptyListeners([], trigger)
33
+ listeners.junctionListeners.set('Author', new Map([
34
+ ['topics', [
35
+ {
36
+ type: 'junction',
37
+ path: [],
38
+ rootEntity: schema.entities.Author,
39
+ context: {
40
+ type: 'owning',
41
+ entity: schema.entities.Author,
42
+ relation: schema.entities.Author.fields.topics as Model.ManyHasManyOwningRelation,
43
+ },
44
+ trigger,
45
+ },
46
+ ]],
47
+ ]))
48
+
49
+ listeners.indirectListeners.set('AuthorTopic', [{
50
+ type: 'indirect',
51
+ rootEntity: schema.entities.Author,
52
+ trigger,
53
+ fields: new Set(['name']),
54
+ relations: new Set(),
55
+ path: ['topics'],
56
+ }])
57
+
58
+
59
+ assert.deepStrictEqual(testBuilder(node), listeners)
60
+ })
61
+
62
+ test('first level many-has-many inverse', () => {
63
+
64
+ const node = [['followers', {}, ['name']]] as const
65
+ const trigger = createTrigger(node)
66
+
67
+ const listeners = createEmptyListeners([], trigger)
68
+ listeners.junctionListeners.set('User', new Map([
69
+ ['following', [
70
+ {
71
+ type: 'junction',
72
+ path: [],
73
+ rootEntity: schema.entities.Author,
74
+ context: {
75
+ type: 'inverse',
76
+ entity: schema.entities.Author,
77
+ relation: schema.entities.Author.fields.followers as Model.ManyHasManyInverseRelation,
78
+ },
79
+ trigger,
80
+ },
81
+ ]],
82
+ ]))
83
+ listeners.indirectListeners.set('User', [{
84
+ type: 'indirect',
85
+ rootEntity: schema.entities.Author,
86
+ trigger,
87
+ fields: new Set(['name']),
88
+ relations: new Set(),
89
+ path: ['followers'],
90
+ }])
91
+ assert.deepStrictEqual(testBuilder(node), listeners)
92
+ })
93
+
94
+
95
+ test('first level one-has-one owning', () => {
96
+ const node = [['avatar', {}, ['url']]] as const
97
+ const trigger = createTrigger(node)
98
+ const listeners = createEmptyListeners(['avatar'], trigger)
99
+ listeners.indirectListeners.set('Image', [{
100
+ type: 'indirect',
101
+ rootEntity: schema.entities.Author,
102
+ trigger,
103
+ fields: new Set(['url']),
104
+ relations: new Set(),
105
+ path: ['avatar'],
106
+ }])
107
+
108
+ assert.deepStrictEqual(testBuilder(node), listeners)
109
+ })
110
+
111
+ test('first level one-has-one inverse', () => {
112
+ const node = [['bio', {}, ['content']]] as const
113
+ const trigger = createTrigger(node)
114
+ const listeners = createEmptyListeners([], trigger)
115
+ listeners.indirectListeners.set('AuthorBio', [{
116
+ type: 'indirect',
117
+ rootEntity: schema.entities.Author,
118
+ trigger,
119
+ fields: new Set(['content', 'author']),
120
+ relations: new Set(['author']),
121
+ path: ['bio'],
122
+ }])
123
+
124
+ assert.deepStrictEqual(testBuilder(node), listeners)
125
+ })
126
+
127
+ test('first level many-has-one', () => {
128
+ const node = [['supervisor', {}, ['name']]] as const
129
+ const trigger = createTrigger(node)
130
+ const listeners = createEmptyListeners(['supervisor'], trigger)
131
+ listeners.indirectListeners.set('Author', [{
132
+ type: 'indirect',
133
+ rootEntity: schema.entities.Author,
134
+ trigger,
135
+ fields: new Set(['name']),
136
+ relations: new Set(),
137
+ path: ['supervisor'],
138
+ }])
139
+
140
+ assert.deepStrictEqual(testBuilder(node), listeners)
141
+ })
142
+
143
+ test('first level one-has-many', () => {
144
+ const node = [['articles', {}, ['title']]] as const
145
+ const trigger = createTrigger(node)
146
+ const listeners = createEmptyListeners([], trigger)
147
+ listeners.indirectListeners.set('Article', [{
148
+ type: 'indirect',
149
+ rootEntity: schema.entities.Author,
150
+ trigger,
151
+ fields: new Set(['title', 'author']),
152
+ relations: new Set(['author']),
153
+ path: ['articles'],
154
+ }])
155
+
156
+ assert.deepStrictEqual(testBuilder(node), listeners)
157
+ })
158
+
159
+
160
+ test('second level one-has-one owning', () => {
161
+
162
+ const node = [['articles', {}, [['image', {}, ['url']]]]] as const
163
+
164
+ const trigger = createTrigger(node)
165
+ const listeners = createEmptyListeners([], trigger)
166
+ listeners.indirectListeners.set('Image', [{
167
+ type: 'indirect',
168
+ rootEntity: schema.entities.Author,
169
+ trigger,
170
+ fields: new Set(['url']),
171
+ relations: new Set(),
172
+ path: ['articles', 'image'],
173
+ }])
174
+
175
+ listeners.indirectListeners.set('Article', [{
176
+ type: 'indirect',
177
+ rootEntity: schema.entities.Author,
178
+ trigger,
179
+ fields: new Set(['author', 'image']),
180
+ relations: new Set(['author', 'image']),
181
+ path: ['articles'],
182
+ }])
183
+
184
+ assert.deepStrictEqual(testBuilder(node), listeners)
185
+ })
186
+
187
+
188
+ test('second level one-has-one inverse', () => {
189
+ const node = [['articles', {}, [['settings', {}, ['visible']]]]] as const
190
+
191
+ const trigger = createTrigger(node)
192
+ const listeners = createEmptyListeners([], trigger)
193
+ listeners.indirectListeners.set('ArticleSettings', [{
194
+ type: 'indirect',
195
+ rootEntity: schema.entities.Author,
196
+ trigger,
197
+ fields: new Set(['visible', 'article']),
198
+ relations: new Set(['article']),
199
+ path: ['articles', 'settings'],
200
+ }])
201
+
202
+ listeners.indirectListeners.set('Article', [{
203
+ type: 'indirect',
204
+ rootEntity: schema.entities.Author,
205
+ trigger,
206
+ fields: new Set(['author']),
207
+ relations: new Set(['author']),
208
+ path: ['articles'],
209
+ }])
210
+
211
+
212
+ assert.deepStrictEqual(testBuilder(node), listeners)
213
+ })
214
+
215
+
216
+ test('second level one-has-many', () => {
217
+ const node = [['articles', {}, [['comments', {}, ['content']]]]] as const
218
+
219
+ const trigger = createTrigger(node)
220
+
221
+ const listeners = createEmptyListeners([], trigger)
222
+ listeners.indirectListeners.set('Comment', [{
223
+ type: 'indirect',
224
+ rootEntity: schema.entities.Author,
225
+ trigger,
226
+ fields: new Set(['article', 'content']),
227
+ relations: new Set(['article']),
228
+ path: ['articles', 'comments'],
229
+ }])
230
+
231
+ listeners.indirectListeners.set('Article', [{
232
+ type: 'indirect',
233
+ rootEntity: schema.entities.Author,
234
+ trigger,
235
+ fields: new Set(['author']),
236
+ relations: new Set(['author']),
237
+ path: ['articles'],
238
+ }])
239
+
240
+ assert.deepStrictEqual(testBuilder(node), listeners)
241
+ })
242
+
243
+
244
+ test('third level many-has-one', () => {
245
+
246
+ const node = [['articles', {}, [['comments', {}, [['author', {}, ['name']]]]]]] as const
247
+ const trigger = createTrigger(node)
248
+
249
+ const listeners = createEmptyListeners([], trigger)
250
+ listeners.indirectListeners.set('User', [{
251
+ type: 'indirect',
252
+ rootEntity: schema.entities.Author,
253
+ trigger,
254
+ fields: new Set(['name']),
255
+ relations: new Set(),
256
+ path: ['articles', 'comments', 'author'],
257
+ }])
258
+
259
+ listeners.indirectListeners.set('Comment', [{
260
+ type: 'indirect',
261
+ rootEntity: schema.entities.Author,
262
+ trigger,
263
+ fields: new Set(['article', 'author']),
264
+ relations: new Set(['article', 'author']),
265
+ path: ['articles', 'comments'],
266
+ }])
267
+
268
+ listeners.indirectListeners.set('Article', [{
269
+ type: 'indirect',
270
+ rootEntity: schema.entities.Author,
271
+ trigger,
272
+ fields: new Set(['author']),
273
+ relations: new Set(['author']),
274
+ path: ['articles'],
275
+ }])
276
+
277
+ assert.deepStrictEqual(testBuilder(node), listeners)
278
+ })
279
+
280
+
281
+ test('second level many-has-one', () => {
282
+
283
+
284
+ const node = [['articles', {}, [['category', {}, ['name']]]]] as const
285
+ const trigger = createTrigger(node)
286
+ const listeners = createEmptyListeners([], trigger)
287
+ listeners.indirectListeners.set('Category', [{
288
+ type: 'indirect',
289
+ rootEntity: schema.entities.Author,
290
+ trigger,
291
+ fields: new Set(['name']),
292
+ relations: new Set(),
293
+ path: ['articles', 'category'],
294
+ }])
295
+
296
+ listeners.indirectListeners.set('Article', [{
297
+ type: 'indirect',
298
+ rootEntity: schema.entities.Author,
299
+ trigger,
300
+ fields: new Set(['author', 'category']),
301
+ relations: new Set(['author', 'category']),
302
+ path: ['articles'],
303
+ }])
304
+
305
+ assert.deepStrictEqual(testBuilder(node), listeners)
306
+ })
307
+
308
+
309
+ test('second level many-has-many owning', () => {
310
+
311
+ const node = [['articles', {}, [['tags', {}, ['name']]]]] as const
312
+ const trigger = createTrigger(node)
313
+ const listeners = createEmptyListeners([], trigger)
314
+ listeners.junctionListeners.set('Article', new Map([
315
+ ['tags', [
316
+ {
317
+ type: 'junction',
318
+ path: ['articles'],
319
+ rootEntity: schema.entities.Author,
320
+ context: {
321
+ entity: schema.entities.Article,
322
+ relation: schema.entities.Article.fields.tags as Model.ManyHasManyOwningRelation,
323
+ type: 'owning',
324
+ },
325
+ trigger,
326
+ },
327
+ ]],
328
+ ]))
329
+
330
+ listeners.indirectListeners.set('Tag', [{
331
+ type: 'indirect',
332
+ rootEntity: schema.entities.Author,
333
+ trigger,
334
+ fields: new Set(['name']),
335
+ relations: new Set(),
336
+ path: ['articles', 'tags'],
337
+ }])
338
+
339
+
340
+ listeners.indirectListeners.set('Article', [{
341
+ type: 'indirect',
342
+ rootEntity: schema.entities.Author,
343
+ trigger,
344
+ fields: new Set(['author']),
345
+ relations: new Set(['author']),
346
+ path: ['articles'],
347
+ }])
348
+
349
+ assert.deepStrictEqual(testBuilder(node), listeners)
350
+ })
351
+
352
+ test('second level many-has-many inverse', () => {
353
+
354
+ const node = [['articles', {}, [['likedBy', {}, ['name']]]]] as const
355
+ const trigger = createTrigger(node)
356
+ const listeners = createEmptyListeners([], trigger)
357
+ listeners.junctionListeners.set('User', new Map([
358
+ ['likes', [
359
+ {
360
+ type: 'junction',
361
+ path: ['articles'],
362
+ rootEntity: schema.entities.Author,
363
+ context: {
364
+ type: 'inverse',
365
+ entity: schema.entities.Article,
366
+ relation: schema.entities.Article.fields.likedBy as Model.ManyHasManyInverseRelation,
367
+ },
368
+ trigger,
369
+ },
370
+ ]],
371
+ ]))
372
+
373
+ listeners.indirectListeners.set('User', [{
374
+ type: 'indirect',
375
+ rootEntity: schema.entities.Author,
376
+ trigger,
377
+ fields: new Set(['name']),
378
+ relations: new Set(),
379
+ path: ['articles', 'likedBy'],
380
+ }])
381
+
382
+
383
+ listeners.indirectListeners.set('Article', [{
384
+ type: 'indirect',
385
+ rootEntity: schema.entities.Author,
386
+ trigger,
387
+ fields: new Set(['author']),
388
+ relations: new Set(['author']),
389
+ path: ['articles'],
390
+ }])
391
+
392
+ assert.deepStrictEqual(testBuilder(node), listeners)
393
+ })
394
+
395
+
396
+ test('all above', () => {
397
+ const node = [
398
+ 'name',
399
+ ['topics', {}, ['name']],
400
+ ['followers', {}, ['name']],
401
+ ['avatar', {}, ['url']],
402
+ ['bio', {}, ['content']],
403
+ ['supervisor', {}, ['name']],
404
+ ['articles', {}, [
405
+ 'title',
406
+ ['image', {}, ['url']],
407
+ ['settings', {}, ['visible']],
408
+ ['comments', {}, ['content', ['author', {}, ['name']]]],
409
+ ['category', {}, ['name']],
410
+ ['tags', {}, ['name']],
411
+ ['likedBy', {}, ['name']],
412
+
413
+ ]],
414
+ ] as const
415
+ const trigger = createTrigger(node)
416
+ const listeners = createEmptyListeners(['name', 'avatar', 'supervisor'], trigger)
417
+ listeners.junctionListeners.set('Author', new Map([
418
+ ['topics', [
419
+ {
420
+ type: 'junction',
421
+ path: [],
422
+ rootEntity: schema.entities.Author,
423
+ context: {
424
+ type: 'owning',
425
+ entity: schema.entities.Author,
426
+ relation: schema.entities.Author.fields.topics as Model.ManyHasManyOwningRelation,
427
+ },
428
+ trigger,
429
+ },
430
+ ]],
431
+ ]))
432
+ listeners.junctionListeners.set('User', new Map([
433
+ ['following', [
434
+ {
435
+ type: 'junction',
436
+ path: [],
437
+ rootEntity: schema.entities.Author,
438
+ context: {
439
+ type: 'inverse',
440
+ entity: schema.entities.Author,
441
+ relation: schema.entities.Author.fields.followers as Model.ManyHasManyInverseRelation,
442
+ },
443
+ trigger,
444
+ },
445
+ ]],
446
+ ['likes', [
447
+ {
448
+ type: 'junction',
449
+ path: ['articles'],
450
+ rootEntity: schema.entities.Author,
451
+ context: {
452
+ type: 'inverse',
453
+ entity: schema.entities.Article,
454
+ relation: schema.entities.Article.fields.likedBy as Model.ManyHasManyInverseRelation,
455
+ },
456
+ trigger,
457
+ },
458
+ ]],
459
+ ]))
460
+
461
+ listeners.junctionListeners.set('Article', new Map([
462
+ ['tags', [
463
+ {
464
+ type: 'junction',
465
+ path: ['articles'],
466
+ rootEntity: schema.entities.Author,
467
+ context: {
468
+ type: 'owning',
469
+ entity: schema.entities.Article,
470
+ relation: schema.entities.Article.fields.tags as Model.ManyHasManyOwningRelation,
471
+ },
472
+ trigger,
473
+ },
474
+ ]],
475
+ ]))
476
+
477
+ listeners.indirectListeners.set('AuthorTopic', [{
478
+ type: 'indirect',
479
+ rootEntity: schema.entities.Author,
480
+ trigger,
481
+ fields: new Set(['name']),
482
+ relations: new Set(),
483
+ path: ['topics'],
484
+ }])
485
+
486
+ listeners.indirectListeners.set('User', [
487
+ {
488
+ type: 'indirect',
489
+ rootEntity: schema.entities.Author,
490
+ trigger,
491
+ fields: new Set(['name']),
492
+ relations: new Set(),
493
+ path: ['followers'],
494
+ },
495
+ {
496
+ type: 'indirect',
497
+ rootEntity: schema.entities.Author,
498
+ trigger,
499
+ fields: new Set(['name']),
500
+ relations: new Set(),
501
+ path: ['articles', 'comments', 'author'],
502
+ },
503
+ {
504
+ type: 'indirect',
505
+ rootEntity: schema.entities.Author,
506
+ trigger,
507
+ fields: new Set(['name']),
508
+ relations: new Set(),
509
+ path: ['articles', 'likedBy'],
510
+ },
511
+ ])
512
+
513
+ listeners.indirectListeners.set('Image', [
514
+ {
515
+ type: 'indirect',
516
+ rootEntity: schema.entities.Author,
517
+ trigger,
518
+ fields: new Set(['url']),
519
+ relations: new Set(),
520
+ path: ['avatar'],
521
+ },
522
+ {
523
+ type: 'indirect',
524
+ rootEntity: schema.entities.Author,
525
+ trigger,
526
+ fields: new Set(['url']),
527
+ relations: new Set(),
528
+ path: ['articles', 'image'],
529
+ },
530
+ ])
531
+
532
+ listeners.indirectListeners.set('AuthorBio', [{
533
+ type: 'indirect',
534
+ rootEntity: schema.entities.Author,
535
+ trigger,
536
+ fields: new Set(['content', 'author']),
537
+ relations: new Set(['author']),
538
+ path: ['bio'],
539
+ }])
540
+
541
+ listeners.indirectListeners.set('Author', [{
542
+ type: 'indirect',
543
+ rootEntity: schema.entities.Author,
544
+ trigger,
545
+ fields: new Set(['name']),
546
+ relations: new Set(),
547
+ path: ['supervisor'],
548
+ }])
549
+
550
+ listeners.indirectListeners.set('ArticleSettings', [{
551
+ type: 'indirect',
552
+ rootEntity: schema.entities.Author,
553
+ trigger,
554
+ fields: new Set(['visible', 'article']),
555
+ relations: new Set(['article']),
556
+ path: ['articles', 'settings'],
557
+ }])
558
+
559
+ listeners.indirectListeners.set('Comment', [{
560
+ type: 'indirect',
561
+ rootEntity: schema.entities.Author,
562
+ trigger,
563
+ fields: new Set(['article', 'content', 'author']),
564
+ relations: new Set(['author', 'article']),
565
+ path: ['articles', 'comments'],
566
+ }])
567
+
568
+
569
+ listeners.indirectListeners.set('Category', [{
570
+ type: 'indirect',
571
+ rootEntity: schema.entities.Author,
572
+ trigger,
573
+ fields: new Set(['name']),
574
+ relations: new Set(),
575
+ path: ['articles', 'category'],
576
+ }])
577
+ listeners.indirectListeners.set('Tag', [{
578
+ type: 'indirect',
579
+ rootEntity: schema.entities.Author,
580
+ trigger,
581
+ fields: new Set(['name']),
582
+ relations: new Set(),
583
+ path: ['articles', 'tags'],
584
+ }])
585
+
586
+ listeners.indirectListeners.set('Article', [{
587
+ type: 'indirect',
588
+ rootEntity: schema.entities.Author,
589
+ trigger,
590
+ fields: new Set(['title', 'image', 'category', 'author']),
591
+ relations: new Set(['image', 'category', 'author']),
592
+ path: ['articles'],
593
+ }])
594
+
595
+
596
+ listeners.indirectListeners.set('AuthorTopic', [{
597
+ type: 'indirect',
598
+ rootEntity: schema.entities.Author,
599
+ trigger,
600
+ fields: new Set(['name']),
601
+ relations: new Set(),
602
+ path: ['topics'],
603
+ }])
604
+
605
+ assert.deepStrictEqual(testBuilder(node), listeners)
606
+ })
607
+
608
+
609
+ namespace WatchModel {
610
+ export class Author {
611
+ name = def.stringColumn()
612
+ topics = def.manyHasMany(AuthorTopic)
613
+ followers = def.manyHasManyInverse(User, 'following')
614
+ avatar = def.oneHasOne(Image)
615
+ bio = def.oneHasOneInverse(AuthorBio, 'author')
616
+ supervisor = def.manyHasOne(Author)
617
+ articles = def.oneHasMany(Article, 'author')
618
+ }
619
+
620
+ export class AuthorBio {
621
+ content = def.stringColumn()
622
+ author = def.oneHasOne(Author, 'bio')
623
+ }
624
+
625
+ export class AuthorTopic {
626
+ name = def.stringColumn()
627
+ }
628
+
629
+ export class Image {
630
+ url = def.stringColumn()
631
+ }
632
+
633
+ export class User {
634
+ name = def.stringColumn()
635
+ following = def.manyHasMany(Author, 'followers')
636
+ likes = def.manyHasOne(Article, 'likedBy')
637
+ }
638
+
639
+ export class Article {
640
+ author = def.manyHasOne(Author, 'articles')
641
+ title = def.stringColumn()
642
+ image = def.oneHasOne(Image)
643
+ settings = def.oneHasOneInverse(ArticleSettings, 'article')
644
+ comments = def.oneHasMany(Comment, 'article')
645
+ category = def.manyHasOne(Category)
646
+ tags = def.manyHasMany(Tag)
647
+ likedBy = def.manyHasManyInverse(User, 'likes')
648
+ }
649
+
650
+ export class ArticleSettings {
651
+ article = def.oneHasOne(Article, 'settings')
652
+ visible = def.boolColumn()
653
+ }
654
+
655
+ export class Comment {
656
+ article = def.manyHasOne(Article, 'comments')
657
+ content = def.stringColumn()
658
+ author = def.manyHasOne(User)
659
+ }
660
+
661
+ export class Category {
662
+ name = def.stringColumn()
663
+ }
664
+
665
+ export class Tag {
666
+ name = def.stringColumn()
667
+ }
668
+ }
669
+
670
+ const schema = def.createModel(WatchModel)
671
+
672
+ const createEmptyListeners = (rootFields: string[], trigger: Actions.AnyTrigger) => {
673
+ const listeners: TriggerListeners = {
674
+ createListeners: new Map(),
675
+ updateListeners: new Map(),
676
+ deleteListeners: new Map(),
677
+ indirectListeners: new Map(),
678
+ junctionListeners: new Map(),
679
+ }
680
+ listeners.createListeners.set('Author', [{ type: 'create', entity: schema.entities.Author, trigger }])
681
+ listeners.deleteListeners.set('Author', [{ type: 'delete', entity: schema.entities.Author, trigger }])
682
+ listeners.updateListeners.set('Author', [{
683
+ type: 'update',
684
+ entity: schema.entities.Author,
685
+ trigger,
686
+ fields: new Set(rootFields),
687
+ }])
688
+ return listeners
689
+ }
@@ -0,0 +1,7 @@
1
+ import nodeAssert from 'assert'
2
+
3
+ // Used to allow prettier formatting of GraphQL queries
4
+ export const gql = (strings: TemplateStringsArray) => {
5
+ nodeAssert.strictEqual(strings.length, 1)
6
+ return strings[0]
7
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "extends": "../tsconfig.settings.json",
3
+ "compilerOptions": {
4
+ "outDir": "../dist/tests",
5
+ "esModuleInterop": true,
6
+ "experimentalDecorators": true
7
+ },
8
+ "references": [
9
+ {
10
+ "path": "../src"
11
+ },
12
+ {
13
+ "path": "../../../packages/engine-api-tester/src"
14
+ }
15
+ ]
16
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "files": [],
3
+ "include": [],
4
+ "references": [{"path": "./src"}, {"path": "./tests"}]
5
+ }