@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,326 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as S from "sury/src/S.res.mjs";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
6
+ import * as AdminApi$ReventlessCore from "@reventlessdev/reventless-core/src/admin/AdminApi.res.mjs";
7
+ import * as AppSync_Adapter$ReventlessAws from "../src/components/Api/AppSync_Adapter.res.mjs";
8
+ import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
9
+ import * as PluginBaseFragment$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/api/PluginBaseFragment.res.mjs";
10
+
11
+ globalThis.describe("AppSync_Adapter.sha256Hex", () => {
12
+ globalThis.test("returns a 64-character hex string", () => {
13
+ let hash = AppSync_Adapter$ReventlessAws.sha256Hex("hello");
14
+ globalThis.expect(hash.length).toBe(64);
15
+ });
16
+ globalThis.test("is stable — same input produces same digest", () => {
17
+ let sdl = "type Query { ping: String }";
18
+ globalThis.expect(AppSync_Adapter$ReventlessAws.sha256Hex(sdl)).toBe(AppSync_Adapter$ReventlessAws.sha256Hex(sdl));
19
+ });
20
+ globalThis.test("differs for inputs that differ by one character", () => {
21
+ globalThis.expect(AppSync_Adapter$ReventlessAws.sha256Hex("type Query { ping: String }")).not.toBe(AppSync_Adapter$ReventlessAws.sha256Hex("type Query { pong: String }"));
22
+ });
23
+ });
24
+
25
+ let decodeFragment = GraphQL_Stitcher$ReventlessCore.decode;
26
+
27
+ globalThis.describe("AppSync_Adapter.injectAwsAuthAll", () => {
28
+ let baseFragment = AdminApi$ReventlessCore.baseFragment(true);
29
+ globalThis.test("adds @aws_auth directive to all mutation fields", () => {
30
+ let augmented = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(baseFragment, "Admin");
31
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(augmented);
32
+ parts.mutations.forEach(field => {
33
+ globalThis.expect(field).toContain(`@aws_auth(cognito_groups: ["Admin"])`);
34
+ });
35
+ });
36
+ globalThis.test("adds @aws_auth directive to all query fields", () => {
37
+ let augmented = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(baseFragment, "Admin");
38
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(augmented);
39
+ parts.queries.forEach(field => {
40
+ globalThis.expect(field).toContain(`@aws_auth(cognito_groups: ["Admin"])`);
41
+ });
42
+ });
43
+ globalThis.test("preserves type definitions unchanged", () => {
44
+ let original = GraphQL_Stitcher$ReventlessCore.decode(baseFragment);
45
+ let augmented = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(baseFragment, "Admin");
46
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(augmented);
47
+ globalThis.expect(parts.types).toEqual(original.types);
48
+ });
49
+ globalThis.test("uses specified group name", () => {
50
+ let augmented = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(baseFragment, "SuperAdmin");
51
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(augmented);
52
+ parts.mutations.forEach(field => {
53
+ globalThis.expect(field).toContain(`cognito_groups: ["SuperAdmin"]`);
54
+ });
55
+ });
56
+ globalThis.test("preserves subscription fields with @aws_auth directive", () => {
57
+ let original = GraphQL_Stitcher$ReventlessCore.decode(baseFragment);
58
+ let augmented = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(baseFragment, "Admin");
59
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(augmented);
60
+ globalThis.expect(parts.subscriptions.length).toBe(original.subscriptions.length);
61
+ globalThis.expect(parts.subscriptions.length).toBeGreaterThan(0);
62
+ parts.subscriptions.forEach(field => {
63
+ globalThis.expect(field).toContain(`@aws_auth(cognito_groups: ["Admin"])`);
64
+ });
65
+ });
66
+ globalThis.test("admin Plugin aggregate subscription fields survive the round-trip", () => {
67
+ let augmented = AppSync_Adapter$ReventlessAws.injectAwsAuthAll(baseFragment, "Admin");
68
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(augmented);
69
+ let joined = parts.subscriptions.join("\n");
70
+ globalThis.expect(joined).toContain("onPlatform_Plugin_Activate");
71
+ globalThis.expect(joined).toContain("onPlatform_Plugin_Deactivate");
72
+ });
73
+ });
74
+
75
+ globalThis.describe("AppSync_Adapter.injectAwsAuth", () => {
76
+ globalThis.test("injects auth only on entries with authorization", () => {
77
+ let mutationEntries = AdminApi$ReventlessCore.mutationEntries(false);
78
+ let baseFragment = AdminApi$ReventlessCore.baseFragment(false);
79
+ let augmented = AppSync_Adapter$ReventlessAws.injectAwsAuth(baseFragment, mutationEntries, PluginBaseFragment$ReventlessCore.queryEntries);
80
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(augmented);
81
+ let queryWithAuth = PluginBaseFragment$ReventlessCore.queryEntries.some(entry => Stdlib_Option.isSome(entry.authorization));
82
+ if (!queryWithAuth) {
83
+ return;
84
+ }
85
+ let hasAuthQuery = parts.queries.some(field => field.includes("@aws_auth"));
86
+ globalThis.expect(hasAuthQuery).toBe(true);
87
+ });
88
+ });
89
+
90
+ globalThis.describe("AppSync_Adapter.generateFragment", () => {
91
+ globalThis.test("produces fragment with auth directives from entries", () => {
92
+ let mutationEntries = AdminApi$ReventlessCore.mutationEntries(false);
93
+ let fragment = AppSync_Adapter$ReventlessAws.generateFragment(mutationEntries, PluginBaseFragment$ReventlessCore.queryEntries);
94
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(fragment);
95
+ globalThis.expect(parts.types.length).toBeGreaterThan(0);
96
+ globalThis.expect(parts.mutations.length).toBeGreaterThan(0);
97
+ globalThis.expect(parts.queries.length).toBeGreaterThan(0);
98
+ });
99
+ });
100
+
101
+ globalThis.describe("AppSync_Adapter.injectAwsAuth — Stage E2 permission lifting", () => {
102
+ let makeFragment = (mutationFields, queryFields) => GraphQL_Stitcher$ReventlessCore.encode({
103
+ types: [],
104
+ mutations: mutationFields,
105
+ queries: queryFields,
106
+ subscriptions: []
107
+ });
108
+ let mutationEntry = (fieldNames, fieldPermissions) => ({
109
+ fieldNames: fieldNames,
110
+ commandSchema: S.unknown,
111
+ fieldPermissions: fieldPermissions
112
+ });
113
+ let queryEntry = (single, list, permission) => ({
114
+ singleFieldName: single,
115
+ listFieldName: list,
116
+ returnTypeName: single,
117
+ stateSchema: S.unknown,
118
+ authorization: undefined,
119
+ permission: permission
120
+ });
121
+ globalThis.test("AllowGroups([\"Admin\"]) emits cognito_groups: [\"Admin\"] on mutation", () => {
122
+ let fp = Object.fromEntries([[
123
+ "catalog_Category_Archive",
124
+ {
125
+ TAG: "AllowGroups",
126
+ _0: ["Admin"]
127
+ }
128
+ ]]);
129
+ let entry = mutationEntry(["catalog_Category_Archive"], fp);
130
+ let frag = makeFragment(["catalog_Category_Archive(id: ID!): String"], []);
131
+ let aug = AppSync_Adapter$ReventlessAws.injectAwsAuth(frag, [entry], []);
132
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(aug);
133
+ let m = parts.mutations[0];
134
+ globalThis.expect(m).toContain(`@aws_auth(cognito_groups: ["Admin"])`);
135
+ });
136
+ globalThis.test("AllowGroups multi-group emits comma-separated groups", () => {
137
+ let fp = Object.fromEntries([[
138
+ "p_X",
139
+ {
140
+ TAG: "AllowGroups",
141
+ _0: [
142
+ "Admin",
143
+ "Editor"
144
+ ]
145
+ }
146
+ ]]);
147
+ let entry = mutationEntry(["p_X"], fp);
148
+ let frag = makeFragment(["p_X(id: ID!): String"], []);
149
+ let aug = AppSync_Adapter$ReventlessAws.injectAwsAuth(frag, [entry], []);
150
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(aug);
151
+ globalThis.expect(parts.mutations[0]).toContain(`@aws_auth(cognito_groups: ["Admin", "Editor"])`);
152
+ });
153
+ globalThis.test("AllowAuthenticated emits no directive", () => {
154
+ let fp = Object.fromEntries([[
155
+ "p_Add",
156
+ "AllowAuthenticated"
157
+ ]]);
158
+ let entry = mutationEntry(["p_Add"], fp);
159
+ let frag = makeFragment(["p_Add(id: ID!): String"], []);
160
+ let aug = AppSync_Adapter$ReventlessAws.injectAwsAuth(frag, [entry], []);
161
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(aug);
162
+ globalThis.expect(parts.mutations[0]).not.toContain("@aws_auth");
163
+ });
164
+ globalThis.test("DenyAll emits sentinel __deny_all__ group", () => {
165
+ let fp = Object.fromEntries([[
166
+ "p_Hide",
167
+ "DenyAll"
168
+ ]]);
169
+ let entry = mutationEntry(["p_Hide"], fp);
170
+ let frag = makeFragment(["p_Hide(id: ID!): String"], []);
171
+ let aug = AppSync_Adapter$ReventlessAws.injectAwsAuth(frag, [entry], []);
172
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(aug);
173
+ globalThis.expect(parts.mutations[0]).toContain(`"__deny_all__"`);
174
+ });
175
+ globalThis.test("Per-field permissions: only annotated fields get directives", () => {
176
+ let fp = Object.fromEntries([
177
+ [
178
+ "p_Archive",
179
+ {
180
+ TAG: "AllowGroups",
181
+ _0: ["Admin"]
182
+ }
183
+ ],
184
+ [
185
+ "p_Add",
186
+ "AllowAuthenticated"
187
+ ]
188
+ ]);
189
+ let entry = mutationEntry([
190
+ "p_Archive",
191
+ "p_Add"
192
+ ], fp);
193
+ let frag = makeFragment([
194
+ "p_Archive(id: ID!): String",
195
+ "p_Add(name: String!): String"
196
+ ], []);
197
+ let aug = AppSync_Adapter$ReventlessAws.injectAwsAuth(frag, [entry], []);
198
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(aug);
199
+ let archive = parts.mutations.find(f => f.includes("p_Archive"));
200
+ let add = parts.mutations.find(f => f.includes("p_Add"));
201
+ if (archive !== undefined) {
202
+ globalThis.expect(archive).toContain(`cognito_groups: ["Admin"]`);
203
+ } else {
204
+ Stdlib_JsError.throwWithMessage("missing archive field");
205
+ }
206
+ if (add !== undefined) {
207
+ globalThis.expect(add).not.toContain("@aws_auth");
208
+ return;
209
+ } else {
210
+ return Stdlib_JsError.throwWithMessage("missing add field");
211
+ }
212
+ });
213
+ globalThis.test("Query permission applies to BOTH single and list field names", () => {
214
+ let entry = queryEntry("p_Item", "p_Items", {
215
+ TAG: "AllowGroups",
216
+ _0: ["Manager"]
217
+ });
218
+ let frag = makeFragment([], [
219
+ "p_Item(id: ID!): Item",
220
+ "p_Items(first: Int, after: String): ItemConnection!"
221
+ ]);
222
+ let aug = AppSync_Adapter$ReventlessAws.injectAwsAuth(frag, [], [entry]);
223
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(aug);
224
+ let item = parts.queries.find(f => f.includes("p_Item("));
225
+ let items = parts.queries.find(f => f.includes("p_Items("));
226
+ if (item !== undefined && items !== undefined) {
227
+ globalThis.expect(item).toContain(`cognito_groups: ["Manager"]`);
228
+ globalThis.expect(items).toContain(`cognito_groups: ["Manager"]`);
229
+ return;
230
+ } else {
231
+ return Stdlib_JsError.throwWithMessage("missing query fields");
232
+ }
233
+ });
234
+ globalThis.test("Spec-level permission wins over legacy authorization field", () => {
235
+ let fp = Object.fromEntries([[
236
+ "p_X",
237
+ {
238
+ TAG: "AllowGroups",
239
+ _0: ["Manager"]
240
+ }
241
+ ]]);
242
+ let entry_fieldNames = ["p_X"];
243
+ let entry_authorization = {
244
+ tableName: "Tbl",
245
+ group: "Admin"
246
+ };
247
+ let entry_fieldPermissions = fp;
248
+ let entry = {
249
+ fieldNames: entry_fieldNames,
250
+ commandSchema: S.unknown,
251
+ authorization: entry_authorization,
252
+ fieldPermissions: entry_fieldPermissions
253
+ };
254
+ let frag = makeFragment(["p_X(id: ID!): String"], []);
255
+ let aug = AppSync_Adapter$ReventlessAws.injectAwsAuth(frag, [entry], []);
256
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(aug);
257
+ let m = parts.mutations[0];
258
+ globalThis.expect(m).toContain(`cognito_groups: ["Manager"]`);
259
+ globalThis.expect(m).not.toContain(`"Admin"`);
260
+ });
261
+ globalThis.test("AllowAuthenticated on a field overrides the legacy authorization (removes directive)", () => {
262
+ let fp = Object.fromEntries([[
263
+ "p_X",
264
+ "AllowAuthenticated"
265
+ ]]);
266
+ let entry_fieldNames = ["p_X"];
267
+ let entry_authorization = {
268
+ tableName: "Tbl",
269
+ group: "Admin"
270
+ };
271
+ let entry_fieldPermissions = fp;
272
+ let entry = {
273
+ fieldNames: entry_fieldNames,
274
+ commandSchema: S.unknown,
275
+ authorization: entry_authorization,
276
+ fieldPermissions: entry_fieldPermissions
277
+ };
278
+ let frag = makeFragment(["p_X(id: ID!): String"], []);
279
+ let aug = AppSync_Adapter$ReventlessAws.injectAwsAuth(frag, [entry], []);
280
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(aug);
281
+ globalThis.expect(parts.mutations[0]).not.toContain("@aws_auth");
282
+ });
283
+ });
284
+
285
+ globalThis.describe("Split mode — empty base fragment", () => {
286
+ globalThis.test("empty stitcher encode produces fragment with no fields", () => {
287
+ let emptyFragment = GraphQL_Stitcher$ReventlessCore.encode({
288
+ types: [],
289
+ mutations: [],
290
+ queries: [],
291
+ subscriptions: []
292
+ });
293
+ let parts = GraphQL_Stitcher$ReventlessCore.decode(emptyFragment);
294
+ globalThis.expect(parts.types).toHaveLength(0);
295
+ globalThis.expect(parts.mutations).toHaveLength(0);
296
+ globalThis.expect(parts.queries).toHaveLength(0);
297
+ });
298
+ globalThis.test("stitching with empty base produces only plugin fields", () => {
299
+ let emptyBase = GraphQL_Stitcher$ReventlessCore.encode({
300
+ types: [],
301
+ mutations: [],
302
+ queries: [],
303
+ subscriptions: []
304
+ });
305
+ let pluginFragment = GraphQL_Stitcher$ReventlessCore.encode({
306
+ types: [`type MyPlugin_Item { id: ID! }`],
307
+ mutations: [`MyPlugin_Item_Create(id: ID!): String`],
308
+ queries: [`MyPlugin_Item(id: ID!): MyPlugin_Item`],
309
+ subscriptions: []
310
+ });
311
+ let sdl = GraphQL_Stitcher$ReventlessCore.stitch(emptyBase, [pluginFragment]);
312
+ globalThis.expect(sdl).toContain("MyPlugin_Item_Create");
313
+ globalThis.expect(sdl).toContain("MyPlugin_Item");
314
+ globalThis.expect(sdl).not.toContain("Platform_Plugin");
315
+ });
316
+ globalThis.test("stitching admin base without plugins produces only admin fields", () => {
317
+ let adminBase = AdminApi$ReventlessCore.baseFragment(false);
318
+ let sdl = GraphQL_Stitcher$ReventlessCore.stitch(adminBase, []);
319
+ globalThis.expect(sdl).toContain("Platform_Plugin");
320
+ });
321
+ });
322
+
323
+ export {
324
+ decodeFragment,
325
+ }
326
+ /* Not a pure module */
@@ -0,0 +1,59 @@
1
+ open JestGlobals
2
+
3
+ // Helper: build a plain JS object shaped like a JS Error / SDK exception.
4
+ // Obj.magic casts the ReScript record (which compiles to a plain JS object)
5
+ // to JsExn.t so we can call isFieldNotFoundError without a real throw/catch.
6
+ type testError = {name: string, message: string}
7
+
8
+ let mkErr = (~name, ~message): JsExn.t =>
9
+ Obj.magic(({name, message}: testError))
10
+
11
+ describe("AppSync_Resolver_Retrying.isFieldNotFoundError", () => {
12
+ describe("returns true", () => {
13
+ testSync("NotFoundException with 'No field named' message", () => {
14
+ let err = mkErr(
15
+ ~name="NotFoundException",
16
+ ~message="No field named createFoo found on type Mutation",
17
+ )
18
+ expect(AppSync_Resolver_Retrying.isFieldNotFoundError(err))->toBe(true)
19
+ })
20
+
21
+ testSync("NotFoundException with 'No field named' on Query type", () => {
22
+ let err = mkErr(
23
+ ~name="NotFoundException",
24
+ ~message="No field named bar found on type Query",
25
+ )
26
+ expect(AppSync_Resolver_Retrying.isFieldNotFoundError(err))->toBe(true)
27
+ })
28
+ })
29
+
30
+ describe("returns false", () => {
31
+ testSync("NotFoundException with 'No resolver found' (delete-path — must not retry)", () => {
32
+ let err = mkErr(
33
+ ~name="NotFoundException",
34
+ ~message="No resolver found for type Query field foo",
35
+ )
36
+ expect(AppSync_Resolver_Retrying.isFieldNotFoundError(err))->toBe(false)
37
+ })
38
+
39
+ testSync("ThrottlingException", () => {
40
+ let err = mkErr(~name="ThrottlingException", ~message="Rate exceeded")
41
+ expect(AppSync_Resolver_Retrying.isFieldNotFoundError(err))->toBe(false)
42
+ })
43
+
44
+ testSync("NotFoundException with unrelated message", () => {
45
+ let err = mkErr(~name="NotFoundException", ~message="API not found")
46
+ expect(AppSync_Resolver_Retrying.isFieldNotFoundError(err))->toBe(false)
47
+ })
48
+
49
+ testSync("non-exception value (integer)", () => {
50
+ let notErr: JsExn.t = Obj.magic(42)
51
+ expect(AppSync_Resolver_Retrying.isFieldNotFoundError(notErr))->toBe(false)
52
+ })
53
+
54
+ testSync("non-exception value (plain object without name)", () => {
55
+ let notErr: JsExn.t = Obj.magic({"message": "something went wrong"})
56
+ expect(AppSync_Resolver_Retrying.isFieldNotFoundError(notErr))->toBe(false)
57
+ })
58
+ })
59
+ })
@@ -0,0 +1,66 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as AppSync_Resolver_Retrying$ReventlessAws from "../src/adapter/Api/AppSync_Resolver_Retrying.res.mjs";
4
+
5
+ function mkErr(name, message) {
6
+ return {
7
+ name: name,
8
+ message: message
9
+ };
10
+ }
11
+
12
+ globalThis.describe("AppSync_Resolver_Retrying.isFieldNotFoundError", () => {
13
+ globalThis.describe("returns true", () => {
14
+ globalThis.test("NotFoundException with 'No field named' message", () => {
15
+ let err = {
16
+ name: "NotFoundException",
17
+ message: "No field named createFoo found on type Mutation"
18
+ };
19
+ globalThis.expect(AppSync_Resolver_Retrying$ReventlessAws.isFieldNotFoundError(err)).toBe(true);
20
+ });
21
+ globalThis.test("NotFoundException with 'No field named' on Query type", () => {
22
+ let err = {
23
+ name: "NotFoundException",
24
+ message: "No field named bar found on type Query"
25
+ };
26
+ globalThis.expect(AppSync_Resolver_Retrying$ReventlessAws.isFieldNotFoundError(err)).toBe(true);
27
+ });
28
+ });
29
+ globalThis.describe("returns false", () => {
30
+ globalThis.test("NotFoundException with 'No resolver found' (delete-path — must not retry)", () => {
31
+ let err = {
32
+ name: "NotFoundException",
33
+ message: "No resolver found for type Query field foo"
34
+ };
35
+ globalThis.expect(AppSync_Resolver_Retrying$ReventlessAws.isFieldNotFoundError(err)).toBe(false);
36
+ });
37
+ globalThis.test("ThrottlingException", () => {
38
+ let err = {
39
+ name: "ThrottlingException",
40
+ message: "Rate exceeded"
41
+ };
42
+ globalThis.expect(AppSync_Resolver_Retrying$ReventlessAws.isFieldNotFoundError(err)).toBe(false);
43
+ });
44
+ globalThis.test("NotFoundException with unrelated message", () => {
45
+ let err = {
46
+ name: "NotFoundException",
47
+ message: "API not found"
48
+ };
49
+ globalThis.expect(AppSync_Resolver_Retrying$ReventlessAws.isFieldNotFoundError(err)).toBe(false);
50
+ });
51
+ globalThis.test("non-exception value (integer)", () => {
52
+ globalThis.expect(AppSync_Resolver_Retrying$ReventlessAws.isFieldNotFoundError(42)).toBe(false);
53
+ });
54
+ globalThis.test("non-exception value (plain object without name)", () => {
55
+ let notErr = {
56
+ message: "something went wrong"
57
+ };
58
+ globalThis.expect(AppSync_Resolver_Retrying$ReventlessAws.isFieldNotFoundError(notErr)).toBe(false);
59
+ });
60
+ });
61
+ });
62
+
63
+ export {
64
+ mkErr,
65
+ }
66
+ /* Not a pure module */
@@ -0,0 +1,203 @@
1
+ // Auth_Cognito unit tests — runtime identity extraction matrix.
2
+ // Deploy-time `make` (Pulumi UserPool + UserPoolClient construction) is
3
+ // exercised by `pulumi up` in Stage C; not covered here.
4
+
5
+ open JestGlobals
6
+
7
+ // ── Helpers ───────────────────────────────────────────────────────────────
8
+
9
+ let buildContext = (
10
+ headers: array<(string, string)>,
11
+ ): ReventlessCore.Auth_Adapter.requestContext => {
12
+ headers: Dict.fromArray(headers),
13
+ }
14
+
15
+ @val external btoa: string => string = "btoa"
16
+ let b64urlEncode = (s: string): string =>
17
+ btoa(s)
18
+ ->String.replaceAll("+", "-")
19
+ ->String.replaceAll("/", "_")
20
+ ->String.replaceAll("=", "")
21
+
22
+ // Build a JWT-shaped string with a real (non-verified) payload. Signature is
23
+ // a placeholder — Auth_Cognito.authenticate does not verify, AppSync does
24
+ // upstream of the resolver.
25
+ let buildJwt = (claims: dict<JSON.t>): string => {
26
+ let header = b64urlEncode(`{"alg":"HS256","typ":"JWT"}`)
27
+ let payload = b64urlEncode(claims->JSON.Encode.object->JSON.stringify)
28
+ let sig = "sig"
29
+ `${header}.${payload}.${sig}`
30
+ }
31
+
32
+ // ── authenticate (header-driven path) ─────────────────────────────────────
33
+
34
+ describe("Auth_Cognito.authenticate", () => {
35
+ testAsync("no Authorization header → Anonymous", async () => {
36
+ let r = await Auth_Cognito.authenticate(buildContext([]))
37
+ switch r {
38
+ | Anonymous => ()
39
+ | _ => JsError.throwWithMessage("expected Anonymous")
40
+ }
41
+ })
42
+
43
+ testAsync("non-Bearer Authorization header → Anonymous", async () => {
44
+ let r = await Auth_Cognito.authenticate(
45
+ buildContext([("authorization", "Basic dXNlcjpwYXNz")]),
46
+ )
47
+ switch r {
48
+ | Anonymous => ()
49
+ | _ => JsError.throwWithMessage("expected Anonymous")
50
+ }
51
+ })
52
+
53
+ testAsync("malformed Bearer token → AuthError", async () => {
54
+ let r = await Auth_Cognito.authenticate(
55
+ buildContext([("authorization", "Bearer not-a-jwt")]),
56
+ )
57
+ switch r {
58
+ | AuthError(_) => ()
59
+ | _ => JsError.throwWithMessage("expected AuthError")
60
+ }
61
+ })
62
+
63
+ testAsync("valid Cognito JWT → Authenticated with sub/groups/username", async () => {
64
+ let claims = Dict.fromArray([
65
+ ("sub", JSON.Encode.string("c3741234-aaaa-bbbb-cccc-ddddeeee1234")),
66
+ ("cognito:username", JSON.Encode.string("alice@example.com")),
67
+ (
68
+ "cognito:groups",
69
+ ["Admin", "User"]->Array.map(JSON.Encode.string)->JSON.Encode.array,
70
+ ),
71
+ ])
72
+ let token = buildJwt(claims)
73
+ let r = await Auth_Cognito.authenticate(
74
+ buildContext([("authorization", "Bearer " ++ token)]),
75
+ )
76
+ switch r {
77
+ | Authenticated(identity) =>
78
+ expect(identity.userId)->toBe("c3741234-aaaa-bbbb-cccc-ddddeeee1234")
79
+ expect(identity.username)->toBe("alice@example.com")
80
+ expect(identity.groups)->toEqual(["Admin", "User"])
81
+ | _ => JsError.throwWithMessage("expected Authenticated")
82
+ }
83
+ })
84
+
85
+ testAsync("JWT without cognito:groups → empty groups", async () => {
86
+ let claims = Dict.fromArray([
87
+ ("sub", JSON.Encode.string("user-1")),
88
+ ("cognito:username", JSON.Encode.string("bob")),
89
+ ])
90
+ let token = buildJwt(claims)
91
+ let r = await Auth_Cognito.authenticate(
92
+ buildContext([("authorization", "Bearer " ++ token)]),
93
+ )
94
+ switch r {
95
+ | Authenticated(identity) =>
96
+ expect(identity.groups)->toEqual([])
97
+ expect(identity.username)->toBe("bob")
98
+ | _ => JsError.throwWithMessage("expected Authenticated")
99
+ }
100
+ })
101
+
102
+ testAsync("header lookup is case-insensitive (Authorization)", async () => {
103
+ let claims = Dict.fromArray([
104
+ ("sub", JSON.Encode.string("user-mixed-case")),
105
+ ])
106
+ let token = buildJwt(claims)
107
+ let r = await Auth_Cognito.authenticate(
108
+ buildContext([("Authorization", "Bearer " ++ token)]),
109
+ )
110
+ switch r {
111
+ | Authenticated(identity) => expect(identity.userId)->toBe("user-mixed-case")
112
+ | _ => JsError.throwWithMessage("expected Authenticated")
113
+ }
114
+ })
115
+ })
116
+
117
+ // ── fromAppSyncIdentity (resolver-event path) ─────────────────────────────
118
+
119
+ describe("Auth_Cognito.fromAppSyncIdentity", () => {
120
+ testSync("None → Anonymous", () => {
121
+ switch Auth_Cognito.fromAppSyncIdentity(None) {
122
+ | Anonymous => ()
123
+ | _ => JsError.throwWithMessage("expected Anonymous")
124
+ }
125
+ })
126
+
127
+ testSync("Cognito identity: sub + claims.cognito:groups → Authenticated with Cognito provider", () => {
128
+ let claims = Dict.fromArray([
129
+ ("cognito:username", JSON.Encode.string("alice@example.com")),
130
+ (
131
+ "cognito:groups",
132
+ ["Admin"]->Array.map(JSON.Encode.string)->JSON.Encode.array,
133
+ ),
134
+ ])
135
+ let id: Auth_Cognito.appSyncIdentity = {
136
+ sub: "c3741234-aaaa",
137
+ username: "alice@example.com",
138
+ claims,
139
+ }
140
+ switch Auth_Cognito.fromAppSyncIdentity(Some(id)) {
141
+ | Authenticated(identity) =>
142
+ expect(identity.userId)->toBe("c3741234-aaaa")
143
+ expect(identity.username)->toBe("alice@example.com")
144
+ expect(identity.groups)->toEqual(["Admin"])
145
+ switch identity.provider {
146
+ | Cognito => ()
147
+ | _ => JsError.throwWithMessage("expected Cognito provider")
148
+ }
149
+ | _ => JsError.throwWithMessage("expected Authenticated")
150
+ }
151
+ })
152
+
153
+ testSync("Cognito identity: missing claims.cognito:groups → empty groups", () => {
154
+ let id: Auth_Cognito.appSyncIdentity = {
155
+ sub: "user-no-groups",
156
+ claims: Dict.make(),
157
+ }
158
+ switch Auth_Cognito.fromAppSyncIdentity(Some(id)) {
159
+ | Authenticated(identity) =>
160
+ expect(identity.groups)->toEqual([])
161
+ // username falls back to sub when no claim is present
162
+ expect(identity.username)->toBe("user-no-groups")
163
+ | _ => JsError.throwWithMessage("expected Authenticated")
164
+ }
165
+ })
166
+
167
+ testSync("IAM identity: no sub but userArn present → Custom(\"aws-iam\") provider", () => {
168
+ let id: Auth_Cognito.appSyncIdentity = {
169
+ userArn: "arn:aws:iam::123456789012:role/heartbeat-lambda",
170
+ accountId: "123456789012",
171
+ username: "heartbeat-lambda",
172
+ }
173
+ switch Auth_Cognito.fromAppSyncIdentity(Some(id)) {
174
+ | Authenticated(identity) =>
175
+ expect(identity.userId)->toBe("arn:aws:iam::123456789012:role/heartbeat-lambda")
176
+ expect(identity.username)->toBe("heartbeat-lambda")
177
+ expect(identity.groups)->toEqual([])
178
+ switch identity.provider {
179
+ | Custom("aws-iam") => ()
180
+ | _ => JsError.throwWithMessage("expected Custom(\"aws-iam\") provider")
181
+ }
182
+ | _ => JsError.throwWithMessage("expected Authenticated")
183
+ }
184
+ })
185
+
186
+ testSync("IAM identity: userArn alone (no username) → username falls back to ARN", () => {
187
+ let id: Auth_Cognito.appSyncIdentity = {
188
+ userArn: "arn:aws:iam::123:role/x",
189
+ }
190
+ switch Auth_Cognito.fromAppSyncIdentity(Some(id)) {
191
+ | Authenticated(identity) => expect(identity.username)->toBe("arn:aws:iam::123:role/x")
192
+ | _ => JsError.throwWithMessage("expected Authenticated")
193
+ }
194
+ })
195
+
196
+ testSync("Neither sub nor userArn → Anonymous", () => {
197
+ let id: Auth_Cognito.appSyncIdentity = {accountId: "123"}
198
+ switch Auth_Cognito.fromAppSyncIdentity(Some(id)) {
199
+ | Anonymous => ()
200
+ | _ => JsError.throwWithMessage("expected Anonymous")
201
+ }
202
+ })
203
+ })