@reventlessdev/reventless-aws 3.0.0-alpha.167

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 (394) hide show
  1. package/CHANGELOG.md +1564 -0
  2. package/README.md +62 -0
  3. package/__mocks__/emptyModule.js +1 -0
  4. package/all-licenses.csv +565 -0
  5. package/docker-compose.dynamodb-local.yml +12 -0
  6. package/jest.setup.cjs +5 -0
  7. package/licenses-analysis.ods +0 -0
  8. package/package.json +73 -0
  9. package/rescript.json +39 -0
  10. package/reventless-licenses-analysis.xls +0 -0
  11. package/scripts/run-integration-tests.sh +43 -0
  12. package/src/Platform.res +1940 -0
  13. package/src/Platform.res.mjs +2281 -0
  14. package/src/Platform_Casts.res +106 -0
  15. package/src/Platform_Casts.res.mjs +13 -0
  16. package/src/Platform_Stack.res +153 -0
  17. package/src/Platform_Stack.res.mjs +121 -0
  18. package/src/Types.res +39 -0
  19. package/src/Types.res.mjs +21 -0
  20. package/src/adapter/AWS.res +96 -0
  21. package/src/adapter/AWS.res.mjs +186 -0
  22. package/src/adapter/AWS_Tags.res +16 -0
  23. package/src/adapter/AWS_Tags.res.mjs +48 -0
  24. package/src/adapter/Adapter_Helpers.res +19 -0
  25. package/src/adapter/Adapter_Helpers.res.mjs +37 -0
  26. package/src/adapter/Api/AppSync_EventsApi.res +172 -0
  27. package/src/adapter/Api/AppSync_EventsApi.res.mjs +96 -0
  28. package/src/adapter/Api/AppSync_Resolver_Native.res +93 -0
  29. package/src/adapter/Api/AppSync_Resolver_Native.res.mjs +67 -0
  30. package/src/adapter/Api/AppSync_Resolver_Retrying.res +653 -0
  31. package/src/adapter/Api/AppSync_Resolver_Retrying.res.mjs +462 -0
  32. package/src/adapter/Api/CommandSubscriptionResolvers_AppSync.res +29 -0
  33. package/src/adapter/Api/CommandSubscriptionResolvers_AppSync.res.mjs +15 -0
  34. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res +238 -0
  35. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res.mjs +179 -0
  36. package/src/adapter/Api/Platform_UIFragments_Lambda.res +229 -0
  37. package/src/adapter/Api/Platform_UIFragments_Lambda.res.mjs +245 -0
  38. package/src/adapter/Auth/Auth_Cognito.res +209 -0
  39. package/src/adapter/Auth/Auth_Cognito.res.mjs +135 -0
  40. package/src/adapter/CommandGenerator/CommandGeneratorResolvers.res +2 -0
  41. package/src/adapter/CommandGenerator/CommandGeneratorResolvers.res.mjs +12 -0
  42. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res +251 -0
  43. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res.mjs +126 -0
  44. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res +20 -0
  45. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res.mjs +23 -0
  46. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_Runtime.res +1 -0
  47. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_Runtime.res.mjs +11 -0
  48. package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res +95 -0
  49. package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res.mjs +50 -0
  50. package/src/adapter/CommandTopic/CommandTopicChannel.res +6 -0
  51. package/src/adapter/CommandTopic/CommandTopicChannel.res.mjs +21 -0
  52. package/src/adapter/CommandTopic/CommandTopicChannel_Helpers.res +196 -0
  53. package/src/adapter/CommandTopic/CommandTopicChannel_Helpers.res.mjs +145 -0
  54. package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res +91 -0
  55. package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res.mjs +74 -0
  56. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res +69 -0
  57. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res.mjs +62 -0
  58. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res +60 -0
  59. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res.mjs +56 -0
  60. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res +73 -0
  61. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res.mjs +65 -0
  62. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res +88 -0
  63. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res.mjs +76 -0
  64. package/src/adapter/CommandTopic/CommandTopicRemoteChannel.res +1 -0
  65. package/src/adapter/CommandTopic/CommandTopicRemoteChannel.res.mjs +9 -0
  66. package/src/adapter/CommandTopic/CommandTopicRemoteChannel_SQS.res +7 -0
  67. package/src/adapter/CommandTopic/CommandTopicRemoteChannel_SQS.res.mjs +17 -0
  68. package/src/adapter/Counter/CounterHandler_DynamoDbStream.res +103 -0
  69. package/src/adapter/Counter/CounterHandler_DynamoDbStream.res.mjs +68 -0
  70. package/src/adapter/Counter/CounterHandler_DynamoDbStream_Runtime.res +107 -0
  71. package/src/adapter/Counter/CounterHandler_DynamoDbStream_Runtime.res.mjs +145 -0
  72. package/src/adapter/DcbEventLog/DcbEventLogStorage.res +1 -0
  73. package/src/adapter/DcbEventLog/DcbEventLogStorage.res.mjs +9 -0
  74. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res +84 -0
  75. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res.mjs +52 -0
  76. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +1436 -0
  77. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res.mjs +1143 -0
  78. package/src/adapter/EventCollector/EventCollectorChannel.res +6 -0
  79. package/src/adapter/EventCollector/EventCollectorChannel.res.mjs +21 -0
  80. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res +63 -0
  81. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs +56 -0
  82. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res +20 -0
  83. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res.mjs +32 -0
  84. package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res +266 -0
  85. package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res.mjs +166 -0
  86. package/src/adapter/EventCollector/EventCollectorChannel_SQS.res +81 -0
  87. package/src/adapter/EventCollector/EventCollectorChannel_SQS.res.mjs +54 -0
  88. package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res +59 -0
  89. package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res.mjs +45 -0
  90. package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res +91 -0
  91. package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res.mjs +89 -0
  92. package/src/adapter/EventLog/EventLogStorage.res +3 -0
  93. package/src/adapter/EventLog/EventLogStorage.res.mjs +15 -0
  94. package/src/adapter/EventLog/EventLogStorage_DynamoDb.res +25 -0
  95. package/src/adapter/EventLog/EventLogStorage_DynamoDb.res.mjs +34 -0
  96. package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res +26 -0
  97. package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res.mjs +35 -0
  98. package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res +121 -0
  99. package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res.mjs +137 -0
  100. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res +265 -0
  101. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res.mjs +185 -0
  102. package/src/adapter/EventTopic/EventTopicPublisher.res +6 -0
  103. package/src/adapter/EventTopic/EventTopicPublisher.res.mjs +21 -0
  104. package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res +25 -0
  105. package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res.mjs +28 -0
  106. package/src/adapter/EventTopic/EventTopicPublisher_SNS.res +40 -0
  107. package/src/adapter/EventTopic/EventTopicPublisher_SNS.res.mjs +39 -0
  108. package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res +39 -0
  109. package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res.mjs +38 -0
  110. package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res +5 -0
  111. package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res.mjs +18 -0
  112. package/src/adapter/Mcp/MCP_Lambda.res +502 -0
  113. package/src/adapter/Mcp/MCP_Lambda.res.mjs +289 -0
  114. package/src/adapter/QueryDb/NodeResolver_AppSync.res +71 -0
  115. package/src/adapter/QueryDb/NodeResolver_AppSync.res.mjs +44 -0
  116. package/src/adapter/QueryDb/QueryDbResolvers.res +2 -0
  117. package/src/adapter/QueryDb/QueryDbResolvers.res.mjs +12 -0
  118. package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res +434 -0
  119. package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res.mjs +243 -0
  120. package/src/adapter/QueryDb/QueryDbResolvers_AppSync_NoOp.res +21 -0
  121. package/src/adapter/QueryDb/QueryDbResolvers_AppSync_NoOp.res.mjs +14 -0
  122. package/src/adapter/QueryDb/QueryDbResolvers_NoOp.res +21 -0
  123. package/src/adapter/QueryDb/QueryDbResolvers_NoOp.res.mjs +14 -0
  124. package/src/adapter/QueryDb/QueryDbStorage.res +5 -0
  125. package/src/adapter/QueryDb/QueryDbStorage.res.mjs +18 -0
  126. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res +115 -0
  127. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res.mjs +100 -0
  128. package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res +52 -0
  129. package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res.mjs +38 -0
  130. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res +271 -0
  131. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res.mjs +306 -0
  132. package/src/adapter/QueryDb/QueryInterceptor_Lambda.res +20 -0
  133. package/src/adapter/QueryDb/QueryInterceptor_Lambda.res.mjs +22 -0
  134. package/src/adapter/QueryEngine/QueryEngine.res +3 -0
  135. package/src/adapter/QueryEngine/QueryEngine.res.mjs +12 -0
  136. package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res +184 -0
  137. package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res.mjs +221 -0
  138. package/src/adapter/Runtime/AdminEventCollectorEntryPoint.mjs +879 -0
  139. package/src/adapter/Runtime/AggregateEntryPoint.mjs +313 -0
  140. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +327 -0
  141. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res.mjs +239 -0
  142. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +331 -0
  143. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res.mjs +240 -0
  144. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +247 -0
  145. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res.mjs +185 -0
  146. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +244 -0
  147. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res.mjs +185 -0
  148. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +347 -0
  149. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +244 -0
  150. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +285 -0
  151. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs +212 -0
  152. package/src/adapter/Runtime/AutomationSliceEntryPoint.mjs +124 -0
  153. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +187 -0
  154. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res.mjs +147 -0
  155. package/src/adapter/Runtime/CounterEntryPoint.mjs +91 -0
  156. package/src/adapter/Runtime/DcbCommandTopicEntryPoint.mjs +265 -0
  157. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +122 -0
  158. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res.mjs +89 -0
  159. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +193 -0
  160. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs +137 -0
  161. package/src/adapter/Runtime/EventMapperEntryPoint.mjs +97 -0
  162. package/src/adapter/Runtime/ExtensionPointEntryPoint.mjs +101 -0
  163. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res +83 -0
  164. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res.mjs +59 -0
  165. package/src/adapter/Runtime/HandlerFactoryHelpers.mjs +142 -0
  166. package/src/adapter/Runtime/HeartbeatEntryPoint.mjs +38 -0
  167. package/src/adapter/Runtime/PluginExtensionPointEntryPoint.mjs +137 -0
  168. package/src/adapter/Runtime/ReadModelEntryPoint.mjs +143 -0
  169. package/src/adapter/Runtime/RuntimeEnvironment.res +1 -0
  170. package/src/adapter/Runtime/RuntimeEnvironment.res.mjs +9 -0
  171. package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +254 -0
  172. package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res.mjs +169 -0
  173. package/src/adapter/Runtime/SideEffectEntryPoint.mjs +81 -0
  174. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res +178 -0
  175. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res.mjs +129 -0
  176. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res +166 -0
  177. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res.mjs +87 -0
  178. package/src/adapter/Runtime/StateViewSliceEntryPoint.mjs +136 -0
  179. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +344 -0
  180. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs +242 -0
  181. package/src/adapter/Runtime/TaskBucketEntryPoint.mjs +150 -0
  182. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res +123 -0
  183. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res.mjs +74 -0
  184. package/src/adapter/ScheduledPublisher/ScheduledPublisher.res +2 -0
  185. package/src/adapter/ScheduledPublisher/ScheduledPublisher.res.mjs +12 -0
  186. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res +54 -0
  187. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res.mjs +41 -0
  188. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res +97 -0
  189. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res.mjs +85 -0
  190. package/src/adapter/StateTopic/StateTopic_AppSync.res +418 -0
  191. package/src/adapter/StateTopic/StateTopic_AppSync.res.mjs +295 -0
  192. package/src/adapter/Task/TaskBucket.res +1 -0
  193. package/src/adapter/Task/TaskBucket.res.mjs +9 -0
  194. package/src/adapter/Task/TaskBucket_S3.res +157 -0
  195. package/src/adapter/Task/TaskBucket_S3.res.mjs +108 -0
  196. package/src/adapter/Task/TaskBucket_S3_Runtime.res +11 -0
  197. package/src/adapter/Task/TaskBucket_S3_Runtime.res.mjs +15 -0
  198. package/src/components/Aggregate_Builder.res +1 -0
  199. package/src/components/Aggregate_Builder.res.mjs +25 -0
  200. package/src/components/Aggregate_Builder_Micro.res +63 -0
  201. package/src/components/Aggregate_Builder_Micro.res.mjs +80 -0
  202. package/src/components/Aggregate_Builder_NoResolver.res +61 -0
  203. package/src/components/Aggregate_Builder_NoResolver.res.mjs +80 -0
  204. package/src/components/Aggregate_Builder_PerAggregate.res +57 -0
  205. package/src/components/Aggregate_Builder_PerAggregate.res.mjs +80 -0
  206. package/src/components/Aggregate_Builder_Single.res +59 -0
  207. package/src/components/Aggregate_Builder_Single.res.mjs +80 -0
  208. package/src/components/Aggregate_Builder_Single_Async.res +59 -0
  209. package/src/components/Aggregate_Builder_Single_Async.res.mjs +80 -0
  210. package/src/components/Api/AppSync_Adapter.res +500 -0
  211. package/src/components/Api/AppSync_Adapter.res.mjs +396 -0
  212. package/src/components/AutomationSlice_Builder.res +52 -0
  213. package/src/components/AutomationSlice_Builder.res.mjs +72 -0
  214. package/src/components/AutomationSlice_Builder_Bundled.res.mjs +70 -0
  215. package/src/components/Counter_Builder.res +10 -0
  216. package/src/components/Counter_Builder.res.mjs +16 -0
  217. package/src/components/DataCleaner.res +170 -0
  218. package/src/components/DataCleaner.res.mjs +2 -0
  219. package/src/components/DcbEventLog_Builder.res +8 -0
  220. package/src/components/DcbEventLog_Builder.res.mjs +14 -0
  221. package/src/components/ExtensionPoint_Builder.res +16 -0
  222. package/src/components/ExtensionPoint_Builder.res.mjs +37 -0
  223. package/src/components/ForeignReadModel_Builder.res +19 -0
  224. package/src/components/ForeignReadModel_Builder.res.mjs +48 -0
  225. package/src/components/InboundTranslationSlice_Builder.res +25 -0
  226. package/src/components/InboundTranslationSlice_Builder.res.mjs +31 -0
  227. package/src/components/OutboundTranslationSlice_Builder.res +60 -0
  228. package/src/components/OutboundTranslationSlice_Builder.res.mjs +76 -0
  229. package/src/components/OutboundTranslationSlice_Builder_Bundled.res.mjs +75 -0
  230. package/src/components/Plugin.res +29 -0
  231. package/src/components/Plugin.res.mjs +63 -0
  232. package/src/components/ReadModel_Builder.res +1 -0
  233. package/src/components/ReadModel_Builder.res.mjs +19 -0
  234. package/src/components/ReadModel_Builder_NoResolver.res +55 -0
  235. package/src/components/ReadModel_Builder_NoResolver.res.mjs +64 -0
  236. package/src/components/ReadModel_Builder_NoResolver_Stream.res +60 -0
  237. package/src/components/ReadModel_Builder_NoResolver_Stream.res.mjs +64 -0
  238. package/src/components/ReadModel_Builder_PerReadModel.res +53 -0
  239. package/src/components/ReadModel_Builder_PerReadModel.res.mjs +66 -0
  240. package/src/components/ReadModel_Builder_Single.res +52 -0
  241. package/src/components/ReadModel_Builder_Single.res.mjs +66 -0
  242. package/src/components/ReadModel_Builder_Single_Stream.res +60 -0
  243. package/src/components/ReadModel_Builder_Single_Stream.res.mjs +66 -0
  244. package/src/components/Scheduler.res +1 -0
  245. package/src/components/Scheduler.res.mjs +13 -0
  246. package/src/components/SideEffectHandler.res +1 -0
  247. package/src/components/SideEffectHandler.res.mjs +19 -0
  248. package/src/components/SideEffectHandler_PerSideEffectHandler.res +13 -0
  249. package/src/components/SideEffectHandler_PerSideEffectHandler.res.mjs +52 -0
  250. package/src/components/SideEffectHandler_Single.res +54 -0
  251. package/src/components/SideEffectHandler_Single.res.mjs +60 -0
  252. package/src/components/StateChangeSlice_Builder.res +17 -0
  253. package/src/components/StateChangeSlice_Builder.res.mjs +23 -0
  254. package/src/components/StateViewSlice_Builder.res +46 -0
  255. package/src/components/StateViewSlice_Builder.res.mjs +68 -0
  256. package/src/components/StateViewSlice_Builder_Bundled.res.mjs +69 -0
  257. package/src/components/StateViewSlice_Builder_Stream.res +50 -0
  258. package/src/components/StateViewSlice_Builder_Stream.res.mjs +68 -0
  259. package/src/components/Task_Builder.res +1 -0
  260. package/src/components/Task_Builder.res.mjs +28 -0
  261. package/src/components/Task_Builder_PerBucket.res +22 -0
  262. package/src/components/Task_Builder_PerBucket.res.mjs +63 -0
  263. package/src/components/Vpc.res +214 -0
  264. package/src/components/Vpc.res.mjs +117 -0
  265. package/src/components/Vpc.resi +22 -0
  266. package/src/errors/AppSync_Error.res +36 -0
  267. package/src/errors/AppSync_Error.res.mjs +38 -0
  268. package/src/errors/Cognito_Error.res +36 -0
  269. package/src/errors/Cognito_Error.res.mjs +38 -0
  270. package/src/errors/DynamoDb_Error.res +75 -0
  271. package/src/errors/DynamoDb_Error.res.mjs +86 -0
  272. package/src/errors/Kinesis_Error.res +36 -0
  273. package/src/errors/Kinesis_Error.res.mjs +38 -0
  274. package/src/errors/SNS_Error.res +34 -0
  275. package/src/errors/SNS_Error.res.mjs +38 -0
  276. package/src/errors/SQS_Error.res +40 -0
  277. package/src/errors/SQS_Error.res.mjs +41 -0
  278. package/src/plugin/cloner/ClonerRunner.res +1 -0
  279. package/src/plugin/cloner/ClonerRunner.res.mjs +9 -0
  280. package/src/plugin/cloner/ClonerRunner_Fargate.res +362 -0
  281. package/src/plugin/cloner/ClonerRunner_Fargate.res.mjs +246 -0
  282. package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res +42 -0
  283. package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res.mjs +45 -0
  284. package/src/plugin/heartbeat/HeartbeatRunner.res +1 -0
  285. package/src/plugin/heartbeat/HeartbeatRunner.res.mjs +9 -0
  286. package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res +96 -0
  287. package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res.mjs +69 -0
  288. package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res +115 -0
  289. package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res.mjs +88 -0
  290. package/src/plugin/runtime/PluginRuntimeOperations.res +5 -0
  291. package/src/plugin/runtime/PluginRuntimeOperations.res.mjs +14 -0
  292. package/src/plugin/runtime/PluginRuntime_Builder.res +769 -0
  293. package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +464 -0
  294. package/src/plugin/runtime/Util_PluginMessage_Runtime.res +13 -0
  295. package/src/plugin/runtime/Util_PluginMessage_Runtime.res.mjs +19 -0
  296. package/src/plugin/stack/Plugin_ExtensionPoint_Builder.res +28 -0
  297. package/src/plugin/stack/Plugin_ExtensionPoint_Builder.res.mjs +67 -0
  298. package/src/plugin/stack/Plugin_Stack.res +439 -0
  299. package/src/plugin/stack/Plugin_Stack.res.mjs +263 -0
  300. package/src/util/Util.res +29 -0
  301. package/src/util/Util.res.mjs +93 -0
  302. package/src/util/Util_AppSync.res +36 -0
  303. package/src/util/Util_AppSync.res.mjs +35 -0
  304. package/src/util/Util_AppSync_Caller.res +213 -0
  305. package/src/util/Util_AppSync_Caller.res.mjs +170 -0
  306. package/src/util/Util_Bundle.res +255 -0
  307. package/src/util/Util_Bundle.res.mjs +179 -0
  308. package/src/util/Util_Cloudwatch.res +14 -0
  309. package/src/util/Util_Cloudwatch.res.mjs +19 -0
  310. package/src/util/Util_CognitoGroupUser.res +39 -0
  311. package/src/util/Util_CognitoGroupUser.res.mjs +32 -0
  312. package/src/util/Util_CognitoGroupUser_Runtime.res +65 -0
  313. package/src/util/Util_CognitoGroupUser_Runtime.res.mjs +50 -0
  314. package/src/util/Util_Cognito_Runtime.res +52 -0
  315. package/src/util/Util_Cognito_Runtime.res.mjs +35 -0
  316. package/src/util/Util_DeadLetterQueue.res +154 -0
  317. package/src/util/Util_DeadLetterQueue.res.mjs +158 -0
  318. package/src/util/Util_DynamoDb.res +210 -0
  319. package/src/util/Util_DynamoDb.res.mjs +218 -0
  320. package/src/util/Util_DynamoDbStream.res +138 -0
  321. package/src/util/Util_DynamoDbStream.res.mjs +134 -0
  322. package/src/util/Util_DynamoDbStream_Runtime.res +94 -0
  323. package/src/util/Util_DynamoDbStream_Runtime.res.mjs +131 -0
  324. package/src/util/Util_DynamoDb_Runtime.res +216 -0
  325. package/src/util/Util_DynamoDb_Runtime.res.mjs +257 -0
  326. package/src/util/Util_DynamoDb_TableManager.res +23 -0
  327. package/src/util/Util_DynamoDb_TableManager.res.mjs +35 -0
  328. package/src/util/Util_DynamoDb_TableManager.resi +3 -0
  329. package/src/util/Util_Env.res +5 -0
  330. package/src/util/Util_Env.res.mjs +2 -0
  331. package/src/util/Util_EventSourceMapping.res +49 -0
  332. package/src/util/Util_EventSourceMapping.res.mjs +32 -0
  333. package/src/util/Util_HostUiDomain.res +28 -0
  334. package/src/util/Util_HostUiDomain.res.mjs +26 -0
  335. package/src/util/Util_IAM_Role.res +14 -0
  336. package/src/util/Util_IAM_Role.res.mjs +28 -0
  337. package/src/util/Util_Kinesis_Runtime.res +20 -0
  338. package/src/util/Util_Kinesis_Runtime.res.mjs +24 -0
  339. package/src/util/Util_Lambda.res +39 -0
  340. package/src/util/Util_Lambda.res.mjs +45 -0
  341. package/src/util/Util_LocalConfig.res +119 -0
  342. package/src/util/Util_LocalConfig.res.mjs +112 -0
  343. package/src/util/Util_ResourceNaming.res +15 -0
  344. package/src/util/Util_ResourceNaming.res.mjs +26 -0
  345. package/src/util/Util_S3.res +17 -0
  346. package/src/util/Util_S3.res.mjs +30 -0
  347. package/src/util/Util_S3_Runtime.res +11 -0
  348. package/src/util/Util_S3_Runtime.res.mjs +15 -0
  349. package/src/util/Util_SNS.res +33 -0
  350. package/src/util/Util_SNS.res.mjs +50 -0
  351. package/src/util/Util_SNS_FIFO.res +21 -0
  352. package/src/util/Util_SNS_FIFO.res.mjs +27 -0
  353. package/src/util/Util_SNS_Runtime.res +33 -0
  354. package/src/util/Util_SNS_Runtime.res.mjs +27 -0
  355. package/src/util/Util_SQS.res +70 -0
  356. package/src/util/Util_SQS.res.mjs +83 -0
  357. package/src/util/Util_SQS_FIFO.res +16 -0
  358. package/src/util/Util_SQS_FIFO.res.mjs +28 -0
  359. package/src/util/Util_SQS_Runtime.res +169 -0
  360. package/src/util/Util_SQS_Runtime.res.mjs +150 -0
  361. package/src/util/Util_SesPolicy_Runtime.res +54 -0
  362. package/src/util/Util_SesPolicy_Runtime.res.mjs +55 -0
  363. package/src/util/Util_StaticBundle.res +124 -0
  364. package/src/util/Util_StaticBundle.res.mjs +132 -0
  365. package/src/util/Util_Vpc.res +22 -0
  366. package/src/util/Util_Vpc.res.mjs +27 -0
  367. package/tests/AppSync_AdapterTest.res +396 -0
  368. package/tests/AppSync_AdapterTest.res.mjs +326 -0
  369. package/tests/AppSync_Resolver_RetryingTest.res +59 -0
  370. package/tests/AppSync_Resolver_RetryingTest.res.mjs +66 -0
  371. package/tests/Auth_CognitoTest.res +203 -0
  372. package/tests/Auth_CognitoTest.res.mjs +248 -0
  373. package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res +602 -0
  374. package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res.mjs +742 -0
  375. package/tests/EventLogStorage_DynamoDb_RuntimeTest.res +57 -0
  376. package/tests/EventLogStorage_DynamoDb_RuntimeTest.res.mjs +68 -0
  377. package/tests/MCP_LambdaTest.res +101 -0
  378. package/tests/MCP_LambdaTest.res.mjs +56 -0
  379. package/tests/Util_HostUiDomainTest.res +90 -0
  380. package/tests/Util_HostUiDomainTest.res.mjs +50 -0
  381. package/tests/Util_SQS_RuntimeTest.res +46 -0
  382. package/tests/Util_SQS_RuntimeTest.res.mjs +45 -0
  383. package/tests/Util_StaticBundleTest.res +136 -0
  384. package/tests/Util_StaticBundleTest.res.mjs +149 -0
  385. package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res +101 -0
  386. package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res.mjs +91 -0
  387. package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res +315 -0
  388. package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res.mjs +435 -0
  389. package/tests/integration/DcbIntegrationHarness.res +102 -0
  390. package/tests/integration/DcbIntegrationHarness.res.mjs +163 -0
  391. package/tests/integration/EpTestSlice.res +28 -0
  392. package/tests/integration/EpTestSlice.res.mjs +43 -0
  393. package/tests/integration/EpTestSliceBehavior.res +18 -0
  394. package/tests/integration/EpTestSliceBehavior.res.mjs +35 -0
@@ -0,0 +1,434 @@
1
+ open PulumiAws.AppSync
2
+ // Shadow PulumiAws.AppSync.Resolver with the retrying dynamic-provider adapter
3
+ // so resolver creation calls the AppSync SDK directly and retries
4
+ // `NotFoundException: No field named X` (the schema-propagation race) with
5
+ // exponential backoff. Replaces AppSync_Resolver_Native (aws-native provider)
6
+ // which exhibited the same race in production.
7
+ // See docs/plans/appsync-resolver-aws-native-retry.md.
8
+ module Resolver = AppSync_Resolver_Retrying
9
+ open Reventless.ReadModel
10
+
11
+ let log = ReventlessCore.Logger.fromEnv()
12
+
13
+ type api = Types.AppSync.api
14
+ type role = Types.AppSync.role
15
+
16
+ type interceptorConfig = {
17
+ dataSourceName: Pulumi.Input.t<string>,
18
+ }
19
+
20
+ /** Deploy-time config for the query interceptor. When set, all top-level Query
21
+ resolvers become pipeline resolvers with an interceptor Lambda function
22
+ preceding the DynamoDB query. Set this before calling `make`. */
23
+ let queryInterceptorConfig: ref<option<interceptorConfig>> = ref(None)
24
+
25
+ let interceptorCode = readModelName =>
26
+ `import { util } from '@aws-appsync/utils';
27
+ export function request(ctx) {
28
+ const id = ctx.identity;
29
+ const isCognito = id != null && id.sub != null;
30
+ return {
31
+ operation: 'Invoke',
32
+ payload: {
33
+ readModelName: '${readModelName}',
34
+ arguments: ctx.args,
35
+ identity: isCognito
36
+ ? {
37
+ userId: id.sub,
38
+ username: id.username,
39
+ groups: id.claims?.['cognito:groups'] ?? [],
40
+ claims: id.claims,
41
+ provider: 'Cognito'
42
+ }
43
+ : id != null
44
+ ? {
45
+ userArn: id.userArn ?? null,
46
+ accountId: id.accountId ?? null,
47
+ username: id.username ?? null,
48
+ provider: 'IAM'
49
+ }
50
+ : null
51
+ }
52
+ };
53
+ }
54
+ export function response(ctx) {
55
+ if (ctx.error) util.error(ctx.error.message, ctx.error.type);
56
+ return ctx.result;
57
+ }
58
+ `->Pulumi.Input.make
59
+
60
+ let make: ReventlessCore.QueryDb_Adapter.resolversMaker<api, role> = (
61
+ ~name: string,
62
+ ~api: api,
63
+ ~apiRole: role,
64
+ ~dataSourceName,
65
+ ~indexes: array<indexConfig>,
66
+ ~subIdField,
67
+ ~idResolverConfigs: array<idResolverConfig>,
68
+ ~idsResolverConfigs: array<idsResolverConfig>,
69
+ // AWS path enforces authorization via `@aws_auth(cognito_groups: …)` on the
70
+ // SDL fields (see Stage E in docs/plans/host-ui-login-core.md). Accepted but
71
+ // ignored here so the in-memory and AWS resolver maker signatures stay aligned.
72
+ ~authorization as _: Reventless.Authorization.permission,
73
+ ~opts,
74
+ ) => {
75
+ let dataSourceName = dataSourceName->Pulumi.Output.asInput
76
+ let name = name->String.capitalize
77
+ let registryEntry = ReventlessCore.Plugin_Helpers.queryFieldNamesRegistry->Dict.get(name)
78
+
79
+ // In plugin mode, use plugin-prefixed field names from the registry.
80
+ let fieldNameForSingle = switch registryEntry {
81
+ | Some({singleFieldName}) => singleFieldName
82
+ | None => name->Resolver.Functions.uncapitalize
83
+ }
84
+
85
+ // Resolve includeIdParam flag from registry (defaults to true for ReadModels)
86
+ let includeIdParam = switch registryEntry {
87
+ | Some({includeIdParam}) => includeIdParam
88
+ | None => true
89
+ }
90
+
91
+ // Resolve connectionSpec flag from registry (defaults to true)
92
+ let connectionSpec = switch registryEntry {
93
+ | Some({connectionSpec}) => connectionSpec
94
+ | None => true
95
+ }
96
+
97
+ // Resolve returnTypeName for Relay Node type registry
98
+ let returnTypeName = switch registryEntry {
99
+ | Some({returnTypeName: rt}) => rt
100
+ | None => name
101
+ }
102
+
103
+ // Register entity type in the Relay Node type registry for node(id: ID!) resolution
104
+ if includeIdParam {
105
+ NodeResolver_AppSync.registerNodeType(~typeName=returnTypeName, ~dataSourceName)
106
+ }
107
+
108
+ // Creates either a unit resolver (no interceptor) or a pipeline resolver
109
+ // (interceptor Lambda → DynamoDB query) depending on queryInterceptorConfig.
110
+ let makeQueryResolver = (~resolverName, ~field, ~code) =>
111
+ switch queryInterceptorConfig.contents {
112
+ | None =>
113
+ Resolver.makeUnitJsResolver(
114
+ ~name=resolverName,
115
+ ~api,
116
+ ~dataSourceName,
117
+ ~type_="Query"->Pulumi.Input.make,
118
+ ~field,
119
+ ~code,
120
+ ~opts,
121
+ )
122
+ | Some({dataSourceName: interceptorDsName}) =>
123
+ let interceptorFn = Function.makeJs(
124
+ ~name=resolverName ++ "Interceptor",
125
+ ~api,
126
+ ~dataSource=interceptorDsName,
127
+ ~code=interceptorCode(name),
128
+ ~opts,
129
+ )
130
+ let queryFn = Function.makeJs(
131
+ ~name=resolverName ++ "Query",
132
+ ~api,
133
+ ~dataSource=dataSourceName,
134
+ ~code,
135
+ ~opts,
136
+ )
137
+ Resolver.makePipelineJsResolver(
138
+ ~name=resolverName,
139
+ ~api,
140
+ ~type_="Query"->Pulumi.Input.make,
141
+ ~field,
142
+ ~code=Resolver.Functions.pipelinePassThrough,
143
+ ~functions=[interceptorFn, queryFn],
144
+ ~opts,
145
+ )
146
+ }
147
+
148
+ let fieldNameForAll = switch registryEntry {
149
+ | Some({listFieldName}) => listFieldName
150
+ | None => name ++ "s"
151
+ }
152
+
153
+ // All resolver resources are deferred into resourcesMaker so they are only
154
+ // created inside builderOutputs.apply(...) — which depends on schemaPushed.
155
+ // This prevents a race condition where AppSync resolvers are deployed before
156
+ // the schema push completes and the new fields are ACTIVE in AppSync.
157
+ let resourcesMaker: ReventlessCore.QueryDb.resolversResourcesMaker = allQueryDbs => {
158
+ let resolverByIdSingle = if includeIdParam {
159
+ makeQueryResolver(
160
+ ~resolverName=fieldNameForSingle->String.capitalize,
161
+ ~field=fieldNameForSingle->Pulumi.Input.make,
162
+ ~code=switch subIdField {
163
+ | Some(sortField) => Resolver.Functions.queryByIdSort(sortField)
164
+ | None => Resolver.Functions.getItemById
165
+ },
166
+ )
167
+ } else {
168
+ makeQueryResolver(
169
+ ~resolverName=fieldNameForSingle->String.capitalize,
170
+ ~field=fieldNameForSingle->Pulumi.Input.make,
171
+ ~code=Resolver.Functions.listAllItems,
172
+ )
173
+ }
174
+ let resolverByIdMultiple = if includeIdParam {
175
+ subIdField->Option.map(sortField =>
176
+ makeQueryResolver(
177
+ ~resolverName=fieldNameForSingle->String.capitalize ++ "Items",
178
+ ~field=(fieldNameForSingle ++ "Items")->Pulumi.Input.make,
179
+ ~code=Resolver.Functions.queryItemsWithSortConditions(sortField),
180
+ )
181
+ )
182
+ } else {
183
+ None
184
+ }
185
+ let labelField = switch registryEntry {
186
+ | Some({labelField: ?lf}) => lf->Option.getOr("id")
187
+ | None => "id"
188
+ }
189
+ // Derive server-side filter / sort capability from the registered state schema
190
+ // (Phase 1's deriveServerCapability). Empty arrays when the schema isn't
191
+ // registered or has no indexable fields — the resolver template emits the same
192
+ // SDL the in-memory adapter does, so the AWS Filter / OrderBy stays in lockstep
193
+ // with the SDL emitted by GraphQL_FragmentGenerator at runtime.
194
+ let stateSchemaOpt = ReventlessCore.Plugin_Helpers.stateSchemaRegistry->Dict.get(name)
195
+ let capability = switch stateSchemaOpt {
196
+ | Some(s) => ReventlessCore.GraphQL_FragmentGenerator.deriveServerCapability(s)
197
+ | None => ReventlessCore.GraphQL_FragmentGenerator.emptyCapability
198
+ }
199
+ let filterFieldNames = capability.filterFields->Array.map(f => f.name)
200
+ let rangeFieldNames =
201
+ capability.filterFields->Array.filterMap(f => f.range ? Some(f.name) : None)
202
+ let sortFieldNames = capability.sortFields
203
+ // Deploy-time warning when a `@scanSort` field is not also the sort key of any
204
+ // table or GSI — the resolver can still serve the request, but it will be a
205
+ // JS-runtime per-page sort over a full Scan (expensive in production).
206
+ switch stateSchemaOpt {
207
+ | Some(s) =>
208
+ let knownSortFields =
209
+ switch subIdField {
210
+ | Some(f) => [f]
211
+ | None => []
212
+ }->Array.concat(indexes->Array.filterMap(({subIdField: ?sf}) => sf))
213
+ ReventlessCore.GraphQL_FragmentGenerator.validateScanSortAlignment(
214
+ ~schema=s,
215
+ ~readModelName=name,
216
+ ~knownSortFields,
217
+ )->Array.forEach(msg => log.warn(~comp="QueryDbResolvers_AppSync", msg))
218
+ | None => ()
219
+ }
220
+ let resolverAll = makeQueryResolver(
221
+ ~resolverName=fieldNameForAll->String.capitalize,
222
+ ~field=fieldNameForAll->Pulumi.Input.make,
223
+ ~code=if connectionSpec {
224
+ Resolver.Functions.listAllItemsConnection(
225
+ ~labelField,
226
+ ~filterFields=filterFieldNames,
227
+ ~rangeFields=rangeFieldNames,
228
+ ~sortFields=sortFieldNames,
229
+ )
230
+ } else {
231
+ Resolver.Functions.listAllItems
232
+ },
233
+ )
234
+ let resolversByIndex = indexes->Array.map(({index} as indexConfig) => {
235
+ // Strip a leading "by" from the index name before capitalizing to avoid
236
+ // double "By" in the generated field name (e.g. index "byPlugin" → "ByPlugin",
237
+ // not "ByByPlugin"). Uses the plugin-prefixed fieldNameForSingle so the
238
+ // resolver name is properly namespaced (e.g. "schemaHistoryByPlugin", not
239
+ // "SchemaHistoryByByPlugin" from the raw entity name).
240
+ let stripLeadingBy = s =>
241
+ if s->String.startsWith("by") && s->String.length > 2 {
242
+ s->String.slice(~start=2, ~end=s->String.length)
243
+ } else {
244
+ s
245
+ }
246
+ let resolverName =
247
+ fieldNameForSingle->String.capitalize ++
248
+ "By" ++
249
+ (index->stripLeadingBy->String.capitalize)
250
+ let fieldName =
251
+ fieldNameForSingle ++
252
+ "By" ++
253
+ (index->stripLeadingBy->String.capitalize)
254
+ let idField = indexConfig.idField->Option.getOr(index)
255
+ switch indexConfig.authorization {
256
+ | None =>
257
+ Resolver.makeUnitJsResolver(
258
+ ~name=resolverName,
259
+ ~api,
260
+ ~dataSourceName,
261
+ ~type_="Query"->Pulumi.Input.make,
262
+ ~field=fieldName->Pulumi.Input.make,
263
+ ~code=switch indexConfig.subIdField {
264
+ | Some(sortField) =>
265
+ Resolver.Functions.queryByIndexSortFiltered(~index, ~idField, ~sortField)
266
+ | None => Resolver.Functions.queryByIndexFiltered(~index, ~idField)
267
+ },
268
+ ~opts,
269
+ )
270
+ | Some({tableName, group}) =>
271
+ let authDataSource = DataSource.makeDynamoDBDataSourceWithTableName(
272
+ ~name=resolverName ++ "Auth",
273
+ ~api,
274
+ ~tableName=(
275
+ allQueryDbs
276
+ ->ReventlessCore.Util.QueryDb.getLocalStorageResources(tableName)
277
+ ->Util.DynamoDb.findResource
278
+ ).name,
279
+ ~serviceRole=apiRole,
280
+ ~opts,
281
+ )
282
+ let authFunction = Function.makeJs(
283
+ ~name=resolverName ++ "Auth",
284
+ ~api,
285
+ ~dataSource=authDataSource.name->Pulumi.Output.asInput,
286
+ ~code=Resolver.Functions.authorizeIndexedAccess(~index, ~group),
287
+ ~opts,
288
+ )
289
+ let queryFunction = Function.makeJs(
290
+ ~name=resolverName,
291
+ ~api,
292
+ ~dataSource=dataSourceName,
293
+ ~code=Resolver.Functions.queryByIndexFiltered(~index, ~idField),
294
+ ~opts,
295
+ )
296
+ Resolver.makePipelineJsResolver(
297
+ ~name=resolverName,
298
+ ~api,
299
+ ~type_="Query"->Pulumi.Input.make,
300
+ ~field=fieldName->Pulumi.Input.make,
301
+ ~code=Resolver.Functions.pipelinePassThrough,
302
+ ~functions=[authFunction, queryFunction],
303
+ ~opts,
304
+ )
305
+ }
306
+ })
307
+
308
+ let storageResource = (~pluginName: option<string>, ~tableName: string) =>
309
+ allQueryDbs
310
+ ->ReventlessCore.Plugin_Helpers.getStorageResources(pluginName, tableName)
311
+ ->Util.DynamoDb.findResourceInOutput
312
+ ->ReventlessCore.Adapter.outputToResource
313
+
314
+ let generateCode = (~storageResource: ReventlessInfra.Adapter.resource, ~template) =>
315
+ storageResource.name
316
+ ->Pulumi.Output.apply(realTableName => template(realTableName))
317
+ ->Pulumi.Output.asInput
318
+
319
+ // Batched-by-ids field: BatchGetItem against the projection's own DDB
320
+ // table. Single-key tables only — matches the SDL emitted by
321
+ // GraphQL_FragmentGenerator (composite tables skip this field). Uses
322
+ // the storageResource/generateCode helpers above to interpolate the
323
+ // real DDB table name into the resolver code (BatchGetItem's `tables`
324
+ // map keys on the literal table name).
325
+ let resolverByIds = if includeIdParam && subIdField === None {
326
+ let storage = storageResource(~pluginName=None, ~tableName=name)
327
+ let byIdsField = fieldNameForAll ++ "ByIds"
328
+ Some(
329
+ makeQueryResolver(
330
+ ~resolverName=byIdsField->String.capitalize,
331
+ ~field=byIdsField->Pulumi.Input.make,
332
+ ~code=generateCode(
333
+ ~storageResource=storage,
334
+ ~template=Resolver.Functions.batchGetItemsByIds,
335
+ ),
336
+ ),
337
+ )
338
+ } else {
339
+ None
340
+ }
341
+
342
+ let idResolvers = idResolverConfigs->Array.map(config => {
343
+ let {
344
+ source: {idField: sourceIdField, subId: sourceSubId, resolvedField},
345
+ target: {tableName, idField: targetId} as target,
346
+ }: idResolverConfig = config
347
+ let (index, targetIdField) = switch targetId {
348
+ | Index(index) => (index, index)
349
+ | IndexWithId(index, targetIdField) => (index, targetIdField)
350
+ | _ => ("", "")
351
+ }
352
+ let storageResource = storageResource(~pluginName=target.pluginName, ~tableName)
353
+ switch resolvedField {
354
+ | Single(field)
355
+ | Multi(field) =>
356
+ let dataSourceName =
357
+ DataSource.makeDynamoDBDataSourceWithTableName(
358
+ ~name=name ++ (field->String.capitalize ++ "Resolver"),
359
+ ~api,
360
+ ~tableName=storageResource.name,
361
+ ~serviceRole=apiRole,
362
+ ~opts,
363
+ ).name->Pulumi.Output.asInput
364
+
365
+ Resolver.makeUnitJsResolver(
366
+ ~name=name ++ field->String.capitalize,
367
+ ~api,
368
+ ~dataSourceName,
369
+ ~type_=name->Pulumi.Input.make,
370
+ ~field=field->Pulumi.Input.make,
371
+ ~code=switch (targetId, sourceSubId, target.subIdField) {
372
+ | (Id, Field(sourceSortField), Some(targetSortField)) =>
373
+ Resolver.Functions.resolveIdSort(~sourceIdField, ~sourceSortField, ~targetSortField)
374
+ | (Id, Argument(sourceSortArgument), Some(targetSortField)) =>
375
+ Resolver.Functions.resolveIdSortArgument(
376
+ ~sourceIdField,
377
+ ~sourceSortArgument,
378
+ ~targetSortField,
379
+ )
380
+ | (Id, _, _) => Resolver.Functions.resolveId(~sourceIdField)
381
+
382
+ | (_, Field(sourceSortField), Some(targetSortField)) =>
383
+ Resolver.Functions.resolveIdByIndexSort(
384
+ ~index,
385
+ ~sourceIdField,
386
+ ~targetIdField,
387
+ ~sourceSortField,
388
+ ~targetSortField,
389
+ )
390
+ | (_, Argument(sourceSortArgument), Some(targetSortField)) =>
391
+ Resolver.Functions.resolveIdByIndexSortArgument(
392
+ ~index,
393
+ ~sourceIdField,
394
+ ~targetIdField,
395
+ ~sourceSortArgument,
396
+ ~targetSortField,
397
+ )
398
+ | _ => Resolver.Functions.resolveIdByIndex(~index, ~sourceIdField, ~targetIdField)
399
+ },
400
+ ~opts,
401
+ )
402
+ }
403
+ })
404
+
405
+ let idsResolvers = idsResolverConfigs->Array.map(config => {
406
+ let {source: {idsField, resolvedField}, target: {tableName} as target} = config
407
+ let storageResource = storageResource(~pluginName=target.pluginName, ~tableName)
408
+
409
+ Resolver.makeUnitJsResolver(
410
+ ~name=name ++ idsField->String.capitalize,
411
+ ~api,
412
+ ~dataSourceName,
413
+ ~type_=name->Pulumi.Input.make,
414
+ ~field=resolvedField->Pulumi.Input.make,
415
+ ~code=generateCode(
416
+ ~storageResource,
417
+ ~template=Resolver.Functions.resolveIds(~idsField, ~sortField=target.subIdField, ...),
418
+ ),
419
+ ~opts,
420
+ )
421
+ })
422
+
423
+ let mainResolvers = switch (resolverByIdMultiple, resolverByIds) {
424
+ | (Some(r), Some(byIds)) => [resolverByIdSingle, r, resolverAll, byIds]
425
+ | (Some(r), None) => [resolverByIdSingle, r, resolverAll]
426
+ | (None, Some(byIds)) => [resolverByIdSingle, resolverAll, byIds]
427
+ | (None, None) => [resolverByIdSingle, resolverAll]
428
+ }
429
+ Array.flat([mainResolvers, resolversByIndex, idResolvers, idsResolvers])
430
+ ->Array.map(Util.AppSync.toResourceNative)
431
+ }
432
+
433
+ {resources: [], resourcesMaker}
434
+ }
@@ -0,0 +1,243 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+ import * as Stdlib_String from "@rescript/runtime/lib/es6/Stdlib_String.js";
6
+ import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
7
+ import * as Adapter$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Adapter.res.mjs";
8
+ import * as AppSync_Function$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/AppSync/AppSync_Function.res.mjs";
9
+ import * as Util_AppSync$ReventlessAws from "../../util/Util_AppSync.res.mjs";
10
+ import * as Util_DynamoDb$ReventlessAws from "../../util/Util_DynamoDb.res.mjs";
11
+ import * as Util_QueryDb$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_QueryDb.res.mjs";
12
+ import * as AppSync_DataSource$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/AppSync/AppSync_DataSource.res.mjs";
13
+ import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
14
+ import * as NodeResolver_AppSync$ReventlessAws from "./NodeResolver_AppSync.res.mjs";
15
+ import * as AppSync_Resolver_Functions$PulumiAws from "@reventlessdev/rescript-pulumi-aws/src/AppSync/AppSync_Resolver_Functions.res.mjs";
16
+ import * as AppSync_Resolver_Retrying$ReventlessAws from "../Api/AppSync_Resolver_Retrying.res.mjs";
17
+ import * as GraphQL_FragmentGenerator$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_FragmentGenerator.res.mjs";
18
+
19
+ let log = Logger$ReventlessCore.fromEnv();
20
+
21
+ let queryInterceptorConfig = {
22
+ contents: undefined
23
+ };
24
+
25
+ function interceptorCode(readModelName) {
26
+ return `import { util } from '@aws-appsync/utils';
27
+ export function request(ctx) {
28
+ const id = ctx.identity;
29
+ const isCognito = id != null && id.sub != null;
30
+ return {
31
+ operation: 'Invoke',
32
+ payload: {
33
+ readModelName: '` + readModelName + `',
34
+ arguments: ctx.args,
35
+ identity: isCognito
36
+ ? {
37
+ userId: id.sub,
38
+ username: id.username,
39
+ groups: id.claims?.['cognito:groups'] ?? [],
40
+ claims: id.claims,
41
+ provider: 'Cognito'
42
+ }
43
+ : id != null
44
+ ? {
45
+ userArn: id.userArn ?? null,
46
+ accountId: id.accountId ?? null,
47
+ username: id.username ?? null,
48
+ provider: 'IAM'
49
+ }
50
+ : null
51
+ }
52
+ };
53
+ }
54
+ export function response(ctx) {
55
+ if (ctx.error) util.error(ctx.error.message, ctx.error.type);
56
+ return ctx.result;
57
+ }
58
+ `;
59
+ }
60
+
61
+ function make(name, api, apiRole, dataSourceName, indexes, subIdField, idResolverConfigs, idsResolverConfigs, param, opts) {
62
+ let name$1 = Stdlib_String.capitalize(name);
63
+ let registryEntry = Plugin_Helpers$ReventlessCore.queryFieldNamesRegistry[name$1];
64
+ let fieldNameForSingle = registryEntry !== undefined ? registryEntry.singleFieldName : AppSync_Resolver_Functions$PulumiAws.uncapitalize(name$1);
65
+ let includeIdParam = registryEntry !== undefined ? registryEntry.includeIdParam : true;
66
+ let connectionSpec = registryEntry !== undefined ? registryEntry.connectionSpec : true;
67
+ let returnTypeName = registryEntry !== undefined ? registryEntry.returnTypeName : name$1;
68
+ if (includeIdParam) {
69
+ NodeResolver_AppSync$ReventlessAws.registerNodeType(returnTypeName, dataSourceName);
70
+ }
71
+ let makeQueryResolver = (resolverName, field, code) => {
72
+ let match = queryInterceptorConfig.contents;
73
+ if (match === undefined) {
74
+ return AppSync_Resolver_Retrying$ReventlessAws.makeUnitJsResolver(resolverName, api, dataSourceName, "Query", field, code, opts);
75
+ }
76
+ let interceptorFn = AppSync_Function$PulumiAws.makeJs(resolverName + "Interceptor", api, match.dataSourceName, interceptorCode(name$1), opts);
77
+ let queryFn = AppSync_Function$PulumiAws.makeJs(resolverName + "Query", api, dataSourceName, code, opts);
78
+ return AppSync_Resolver_Retrying$ReventlessAws.makePipelineJsResolver(resolverName, api, "Query", field, AppSync_Resolver_Functions$PulumiAws.pipelinePassThrough, [
79
+ interceptorFn,
80
+ queryFn
81
+ ], opts);
82
+ };
83
+ let fieldNameForAll = registryEntry !== undefined ? registryEntry.listFieldName : name$1 + "s";
84
+ let resourcesMaker = allQueryDbs => {
85
+ let resolverByIdSingle = includeIdParam ? makeQueryResolver(Stdlib_String.capitalize(fieldNameForSingle), fieldNameForSingle, subIdField !== undefined ? AppSync_Resolver_Functions$PulumiAws.queryByIdSort(subIdField) : AppSync_Resolver_Functions$PulumiAws.getItemById) : makeQueryResolver(Stdlib_String.capitalize(fieldNameForSingle), fieldNameForSingle, AppSync_Resolver_Functions$PulumiAws.listAllItems);
86
+ let resolverByIdMultiple = includeIdParam ? Stdlib_Option.map(subIdField, sortField => makeQueryResolver(Stdlib_String.capitalize(fieldNameForSingle) + "Items", fieldNameForSingle + "Items", AppSync_Resolver_Functions$PulumiAws.queryItemsWithSortConditions(sortField))) : undefined;
87
+ let labelField = registryEntry !== undefined ? Stdlib_Option.getOr(registryEntry.labelField, "id") : "id";
88
+ let stateSchemaOpt = Plugin_Helpers$ReventlessCore.stateSchemaRegistry[name$1];
89
+ let capability = stateSchemaOpt !== undefined ? GraphQL_FragmentGenerator$ReventlessCore.deriveServerCapability(stateSchemaOpt) : GraphQL_FragmentGenerator$ReventlessCore.emptyCapability;
90
+ let filterFieldNames = capability.filterFields.map(f => f.name);
91
+ let rangeFieldNames = Stdlib_Array.filterMap(capability.filterFields, f => {
92
+ if (f.range) {
93
+ return f.name;
94
+ }
95
+ });
96
+ let sortFieldNames = capability.sortFields;
97
+ if (stateSchemaOpt !== undefined) {
98
+ let knownSortFields = (
99
+ subIdField !== undefined ? [subIdField] : []
100
+ ).concat(Stdlib_Array.filterMap(indexes, param => param.subIdField));
101
+ GraphQL_FragmentGenerator$ReventlessCore.validateScanSortAlignment(stateSchemaOpt, name$1, knownSortFields).forEach(msg => log.warn("QueryDbResolvers_AppSync", undefined, msg));
102
+ }
103
+ let resolverAll = makeQueryResolver(Stdlib_String.capitalize(fieldNameForAll), fieldNameForAll, connectionSpec ? AppSync_Resolver_Functions$PulumiAws.listAllItemsConnection(labelField, filterFieldNames, rangeFieldNames, sortFieldNames) : AppSync_Resolver_Functions$PulumiAws.listAllItems);
104
+ let resolversByIndex = indexes.map(indexConfig => {
105
+ let index = indexConfig.index;
106
+ let stripLeadingBy = s => {
107
+ if (s.startsWith("by") && s.length > 2) {
108
+ return s.slice(2, s.length);
109
+ } else {
110
+ return s;
111
+ }
112
+ };
113
+ let resolverName = Stdlib_String.capitalize(fieldNameForSingle) + "By" + Stdlib_String.capitalize(stripLeadingBy(index));
114
+ let fieldName = fieldNameForSingle + "By" + Stdlib_String.capitalize(stripLeadingBy(index));
115
+ let idField = Stdlib_Option.getOr(indexConfig.idField, index);
116
+ let match = indexConfig.authorization;
117
+ if (match !== undefined) {
118
+ let authDataSource = AppSync_DataSource$PulumiAws.makeDynamoDBDataSourceWithTableName(resolverName + "Auth", api, Util_DynamoDb$ReventlessAws.findResource(Util_QueryDb$ReventlessCore.getLocalStorageResources(allQueryDbs, match.tableName)).name, apiRole, opts);
119
+ let authFunction = AppSync_Function$PulumiAws.makeJs(resolverName + "Auth", api, authDataSource.name, AppSync_Resolver_Functions$PulumiAws.authorizeIndexedAccess(index, match.group), opts);
120
+ let queryFunction = AppSync_Function$PulumiAws.makeJs(resolverName, api, dataSourceName, AppSync_Resolver_Functions$PulumiAws.queryByIndexFiltered(index, idField), opts);
121
+ return AppSync_Resolver_Retrying$ReventlessAws.makePipelineJsResolver(resolverName, api, "Query", fieldName, AppSync_Resolver_Functions$PulumiAws.pipelinePassThrough, [
122
+ authFunction,
123
+ queryFunction
124
+ ], opts);
125
+ }
126
+ let sortField = indexConfig.subIdField;
127
+ return AppSync_Resolver_Retrying$ReventlessAws.makeUnitJsResolver(resolverName, api, dataSourceName, "Query", fieldName, sortField !== undefined ? AppSync_Resolver_Functions$PulumiAws.queryByIndexSortFiltered(index, idField, sortField) : AppSync_Resolver_Functions$PulumiAws.queryByIndexFiltered(index, idField), opts);
128
+ });
129
+ let storageResource = (pluginName, tableName) => Adapter$ReventlessCore.outputToResource(Util_DynamoDb$ReventlessAws.findResourceInOutput(Plugin_Helpers$ReventlessCore.getStorageResources(allQueryDbs, pluginName, tableName)));
130
+ let generateCode = (storageResource, template) => storageResource.name.apply(realTableName => template(realTableName));
131
+ let resolverByIds;
132
+ if (includeIdParam && subIdField === undefined) {
133
+ let storage = storageResource(undefined, name$1);
134
+ let byIdsField = fieldNameForAll + "ByIds";
135
+ resolverByIds = makeQueryResolver(Stdlib_String.capitalize(byIdsField), byIdsField, generateCode(storage, AppSync_Resolver_Functions$PulumiAws.batchGetItemsByIds));
136
+ } else {
137
+ resolverByIds = undefined;
138
+ }
139
+ let idResolvers = idResolverConfigs.map(config => {
140
+ let target = config.target;
141
+ let targetId = target.idField;
142
+ let match = config.source;
143
+ let sourceSubId = match.subId;
144
+ let sourceIdField = match.idField;
145
+ let match$1;
146
+ if (typeof targetId !== "object") {
147
+ match$1 = [
148
+ "",
149
+ ""
150
+ ];
151
+ } else if (targetId.TAG === "Index") {
152
+ let index = targetId._0;
153
+ match$1 = [
154
+ index,
155
+ index
156
+ ];
157
+ } else {
158
+ match$1 = [
159
+ targetId._0,
160
+ targetId._1
161
+ ];
162
+ }
163
+ let targetIdField = match$1[1];
164
+ let index$1 = match$1[0];
165
+ let storageResource$1 = storageResource(target.pluginName, target.tableName);
166
+ let field = match.resolvedField._0;
167
+ let dataSourceName = AppSync_DataSource$PulumiAws.makeDynamoDBDataSourceWithTableName(name$1 + (Stdlib_String.capitalize(field) + "Resolver"), api, storageResource$1.name, apiRole, opts).name;
168
+ let match$2 = target.subIdField;
169
+ let tmp;
170
+ let exit = 0;
171
+ if (typeof targetId !== "object") {
172
+ tmp = typeof sourceSubId !== "object" ? AppSync_Resolver_Functions$PulumiAws.resolveId(sourceIdField) : (
173
+ sourceSubId.TAG === "Field" ? (
174
+ match$2 !== undefined ? AppSync_Resolver_Functions$PulumiAws.resolveIdSort(sourceIdField, sourceSubId._0, match$2) : AppSync_Resolver_Functions$PulumiAws.resolveId(sourceIdField)
175
+ ) : (
176
+ match$2 !== undefined ? AppSync_Resolver_Functions$PulumiAws.resolveIdSortArgument(sourceIdField, sourceSubId._0, match$2) : AppSync_Resolver_Functions$PulumiAws.resolveId(sourceIdField)
177
+ )
178
+ );
179
+ } else {
180
+ exit = 1;
181
+ }
182
+ if (exit === 1) {
183
+ tmp = typeof sourceSubId !== "object" ? AppSync_Resolver_Functions$PulumiAws.resolveIdByIndex(index$1, sourceIdField, targetIdField) : (
184
+ sourceSubId.TAG === "Field" ? (
185
+ match$2 !== undefined ? AppSync_Resolver_Functions$PulumiAws.resolveIdByIndexSort(index$1, sourceIdField, sourceSubId._0, targetIdField, match$2) : AppSync_Resolver_Functions$PulumiAws.resolveIdByIndex(index$1, sourceIdField, targetIdField)
186
+ ) : (
187
+ match$2 !== undefined ? AppSync_Resolver_Functions$PulumiAws.resolveIdByIndexSortArgument(index$1, sourceIdField, sourceSubId._0, targetIdField, match$2) : AppSync_Resolver_Functions$PulumiAws.resolveIdByIndex(index$1, sourceIdField, targetIdField)
188
+ )
189
+ );
190
+ }
191
+ return AppSync_Resolver_Retrying$ReventlessAws.makeUnitJsResolver(name$1 + Stdlib_String.capitalize(field), api, dataSourceName, name$1, field, tmp, opts);
192
+ });
193
+ let idsResolvers = idsResolverConfigs.map(config => {
194
+ let target = config.target;
195
+ let match = config.source;
196
+ let idsField = match.idsField;
197
+ let storageResource$1 = storageResource(target.pluginName, target.tableName);
198
+ return AppSync_Resolver_Retrying$ReventlessAws.makeUnitJsResolver(name$1 + Stdlib_String.capitalize(idsField), api, dataSourceName, name$1, match.resolvedField, generateCode(storageResource$1, none => AppSync_Resolver_Functions$PulumiAws.resolveIds(none, idsField, target.subIdField)), opts);
199
+ });
200
+ let mainResolvers = resolverByIdMultiple !== undefined ? (
201
+ resolverByIds !== undefined ? [
202
+ resolverByIdSingle,
203
+ resolverByIdMultiple,
204
+ resolverAll,
205
+ resolverByIds
206
+ ] : [
207
+ resolverByIdSingle,
208
+ resolverByIdMultiple,
209
+ resolverAll
210
+ ]
211
+ ) : (
212
+ resolverByIds !== undefined ? [
213
+ resolverByIdSingle,
214
+ resolverAll,
215
+ resolverByIds
216
+ ] : [
217
+ resolverByIdSingle,
218
+ resolverAll
219
+ ]
220
+ );
221
+ return [
222
+ mainResolvers,
223
+ resolversByIndex,
224
+ idResolvers,
225
+ idsResolvers
226
+ ].flat().map(Util_AppSync$ReventlessAws.toResourceNative);
227
+ };
228
+ return {
229
+ resources: [],
230
+ resourcesMaker: resourcesMaker
231
+ };
232
+ }
233
+
234
+ let Resolver;
235
+
236
+ export {
237
+ Resolver,
238
+ log,
239
+ queryInterceptorConfig,
240
+ interceptorCode,
241
+ make,
242
+ }
243
+ /* log Not a pure module */