@reventlessdev/reventless-aws 3.0.0-alpha.344 → 3.0.0-alpha.345

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 (232) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +11 -11
  3. package/scripts/ProvisionIdentity.res +8 -3
  4. package/src/Platform.res +327 -328
  5. package/src/Platform.res.mjs +4 -2
  6. package/src/Platform_Casts.res +13 -4
  7. package/src/adapter/Api/AppSyncEventsSigner_Ops.res +8 -4
  8. package/src/adapter/Api/AppSync_EventsApi.res +12 -14
  9. package/src/adapter/Api/AppSync_Resolver_Native.res +3 -4
  10. package/src/adapter/Api/AppSync_Resolver_Retrying.res +78 -70
  11. package/src/adapter/Api/AppSync_SourceApiAssociation_Retrying.res +11 -8
  12. package/src/adapter/Api/Platform_AdminScan_Ops.res +15 -14
  13. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res +10 -2
  14. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda_Ops.res +40 -50
  15. package/src/adapter/Api/Platform_UIFragments_Lambda.res +39 -32
  16. package/src/adapter/Api/Platform_UIFragments_Lambda_Ops.res +5 -2
  17. package/src/adapter/Auth/Auth_ActiveRolePoolAttachment.res +0 -1
  18. package/src/adapter/Auth/Auth_ActiveRoleStore.res +1 -2
  19. package/src/adapter/Auth/Auth_ActiveRoleStore_Schema.res +1 -4
  20. package/src/adapter/Auth/Auth_ActiveRoleTrigger_Ops.res +5 -2
  21. package/src/adapter/Auth/Auth_Cognito.res +3 -9
  22. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync.res +1 -4
  23. package/src/adapter/CommandGenerator/CommandGeneratorResolvers_AppSync_NoOp.res +3 -1
  24. package/src/adapter/CommandGenerator/InboundTranslationResolvers_AppSync.res +1 -4
  25. package/src/adapter/CommandTopic/CommandTopicChannel_SQS.res +7 -4
  26. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Async.res +6 -1
  27. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_FIFO.res +7 -4
  28. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Runtime.res +24 -18
  29. package/src/adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res +9 -4
  30. package/src/adapter/CommandTopic/CommandTopicRegistry.res +1 -4
  31. package/src/adapter/Counter/CounterHandler_DynamoDbStream.res +15 -15
  32. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb.res +9 -5
  33. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +179 -213
  34. package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res +5 -5
  35. package/src/adapter/EventCollector/EventCollectorChannel_Helpers.res +6 -2
  36. package/src/adapter/EventCollector/EventCollectorChannel_SQS.res +14 -7
  37. package/src/adapter/EventCollector/EventCollectorChannel_SQS_FIFO.res +14 -7
  38. package/src/adapter/EventCollector/EventCollectorChannel_SQS_Runtime.res +6 -3
  39. package/src/adapter/EventLog/EventLogStorage_DynamoDbStream.res +6 -1
  40. package/src/adapter/EventLog/EventLogStorage_DynamoDb_Runtime.res +13 -17
  41. package/src/adapter/EventLog/EventLogStorage_Postgres.res +7 -4
  42. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res +12 -7
  43. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync_Ops.res +4 -2
  44. package/src/adapter/EventTopic/EventTopicPublisher_DynamoDbStream.res +3 -2
  45. package/src/adapter/EventTopic/EventTopicPublisher_SNS.res +20 -12
  46. package/src/adapter/EventTopic/EventTopicPublisher_SNS_FIFO.res +21 -9
  47. package/src/adapter/EventTopic/EventTopicPublisher_SNS_Runtime.res +5 -3
  48. package/src/adapter/Geocoder/Geocoder_AwsLocation_Resolver.res +6 -3
  49. package/src/adapter/Mcp/MCP_Lambda.res +31 -46
  50. package/src/adapter/Messaging/Messaging_Ses_Backend.res +11 -7
  51. package/src/adapter/Messaging/Messaging_Ses_Backend.res.mjs +2 -4
  52. package/src/adapter/Monitoring/Monitoring_CloudWatch.res +16 -16
  53. package/src/adapter/Postgres/PgChangeFeedRelay_Builder.res +5 -10
  54. package/src/adapter/Postgres/PgChangeFeedRelay_Runtime.res +4 -2
  55. package/src/adapter/Postgres/PgConnection.res +6 -5
  56. package/src/adapter/Postgres/PgMigration_Builder.res +4 -8
  57. package/src/adapter/Postgres/PgRuntime.res +4 -7
  58. package/src/adapter/QueryDb/PgQueryResolver_Builder.res +9 -11
  59. package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +22 -21
  60. package/src/adapter/QueryDb/QueryDbResolvers_AppSync.res +114 -111
  61. package/src/adapter/QueryDb/QueryDbResolvers_Lambda.res +1 -7
  62. package/src/adapter/QueryDb/QueryDbStorage.res +4 -2
  63. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb.res +23 -24
  64. package/src/adapter/QueryDb/QueryDbStorage_DynamoDbStream.res +8 -2
  65. package/src/adapter/QueryDb/QueryDbStorage_DynamoDb_Runtime.res +71 -73
  66. package/src/adapter/QueryDb/QueryDbStorage_Postgres.res +5 -2
  67. package/src/adapter/QueryDb/QueryInterceptor_Provisioning.res +1 -4
  68. package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res +8 -2
  69. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +73 -81
  70. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +72 -78
  71. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +44 -67
  72. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +44 -67
  73. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +53 -82
  74. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +47 -77
  75. package/src/adapter/Runtime/AutomationSliceEntryPoint_Ops.res +18 -11
  76. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +80 -97
  77. package/src/adapter/Runtime/CounterEntryPoint_Ops.res +2 -7
  78. package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res +16 -10
  79. package/src/adapter/Runtime/EventCollectorEntryPoint_Ops.res +24 -15
  80. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res +17 -37
  81. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +31 -57
  82. package/src/adapter/Runtime/EventMapperEntryPoint_Ops.res +18 -24
  83. package/src/adapter/Runtime/ExtensionPointEntryPoint_Ops.res +1 -5
  84. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res +4 -3
  85. package/src/adapter/Runtime/HeartbeatEntryPoint.res +0 -1
  86. package/src/adapter/Runtime/PgChangeFeedRelayEntryPoint.res +4 -2
  87. package/src/adapter/Runtime/PgMigrationEntryPoint.res +0 -1
  88. package/src/adapter/Runtime/PgQueryResolverEntryPoint_Ops.res +3 -2
  89. package/src/adapter/Runtime/PluginExtensionPointEntryPoint.res +1 -2
  90. package/src/adapter/Runtime/ProjectionEntryPoint_Ops.res +4 -5
  91. package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +22 -10
  92. package/src/adapter/Runtime/RuntimeExtensionEntryPoint_Ops.res +8 -2
  93. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res +14 -31
  94. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res +16 -17
  95. package/src/adapter/Runtime/StateViewSliceEntryPoint_Ops.res +10 -9
  96. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +46 -52
  97. package/src/adapter/Runtime/StreamRoutedEntryPoint_Ops.res +36 -41
  98. package/src/adapter/Runtime/TaskBucketEntryPoint_Ops.res +31 -37
  99. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res +6 -7
  100. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents.res +4 -6
  101. package/src/adapter/ScheduledPublisher/ScheduledPublisher_CloudWatchEvents_Runtime.res +2 -6
  102. package/src/adapter/StateTopic/StateTopic_AppSync.res +21 -16
  103. package/src/adapter/StateTopic/StateTopic_AppSync_Ops.res +36 -32
  104. package/src/adapter/Task/TaskBucket_S3.res +6 -1
  105. package/src/adapter/Upload/Upload_Claim_S3.res +17 -20
  106. package/src/adapter/Upload/Upload_Claim_S3_Ops.res +5 -2
  107. package/src/adapter/Upload/Upload_Presign_S3.res +51 -49
  108. package/src/capability/Capability_Geocoding_AwsLocation.res +4 -1
  109. package/src/capability/Capability_Messaging.res +4 -5
  110. package/src/capability/Capability_Messaging_Ses.res +3 -1
  111. package/src/capability/Capability_ObjectStore_S3.res +1 -7
  112. package/src/components/Api/AppSync_Adapter.res +28 -41
  113. package/src/components/Api/AppSync_SdlDecorate.res +38 -30
  114. package/src/components/AutomationSlice_Builder.res +6 -4
  115. package/src/components/ExtensionPoint_Builder.res +9 -10
  116. package/src/components/InboundTranslationSlice_Builder.res +7 -8
  117. package/src/components/OutboundTranslationSlice_Builder.res +14 -8
  118. package/src/components/OutboundTranslationSlice_Builder.res.mjs +1 -1
  119. package/src/components/SideEffectHandler_Single.res +4 -4
  120. package/src/components/StateViewSlice_Builder.res +6 -4
  121. package/src/components/StateViewSlice_Builder_Stream.res +6 -4
  122. package/src/components/Task_Builder_PerBucket.res +10 -11
  123. package/src/plugin/cloner/ClonerRunner_Fargate.res +3 -10
  124. package/src/plugin/cloner/ClonerRunner_Fargate_Runtime.res +1 -4
  125. package/src/plugin/heartbeat/HeartbeatRunner_CloudWatchEvents.res +5 -5
  126. package/src/plugin/runtime/PluginExtensionPointRuntime_Builder.res +19 -21
  127. package/src/plugin/runtime/PluginRuntime_Builder.res +167 -188
  128. package/src/plugin/runtime/Util_PluginMessage_Runtime.res +6 -5
  129. package/src/plugin/stack/Plugin_Stack.res +104 -103
  130. package/src/util/Util_AlarmSpec.res +2 -1
  131. package/src/util/Util_AppSync.res +8 -2
  132. package/src/util/Util_AppSync_Caller.res +15 -14
  133. package/src/util/Util_Bundle.res +46 -42
  134. package/src/util/Util_CognitoGroupUser_Runtime.res +32 -34
  135. package/src/util/Util_Cognito_Runtime.res +11 -7
  136. package/src/util/Util_DeadLetterQueue.res +12 -2
  137. package/src/util/Util_DynamoDb.res +5 -3
  138. package/src/util/Util_DynamoDbStream.res +7 -3
  139. package/src/util/Util_DynamoDbStream_Runtime.res +1 -2
  140. package/src/util/Util_DynamoDb_Runtime.res +23 -41
  141. package/src/util/Util_HostUiDomain.res +6 -1
  142. package/src/util/Util_Kinesis_Runtime.res +10 -11
  143. package/src/util/Util_Lambda.res +12 -5
  144. package/src/util/Util_LambdaEnvBudget.res +5 -5
  145. package/src/util/Util_LambdaLogging.res +1 -2
  146. package/src/util/Util_LogGroup_Adopting.res +1 -4
  147. package/src/util/Util_ResourceNaming.res +1 -2
  148. package/src/util/Util_SNS.res +8 -3
  149. package/src/util/Util_SNS_FIFO.res +1 -1
  150. package/src/util/Util_SNS_Runtime.res +11 -10
  151. package/src/util/Util_SQS.res +4 -2
  152. package/src/util/Util_SQS_FIFO.res +5 -2
  153. package/src/util/Util_SQS_Runtime.res +37 -36
  154. package/src/util/Util_ShellConfig.res +3 -2
  155. package/src/util/Util_StaticBundle.res +1 -3
  156. package/src/util/Util_StoreLayout.res +4 -1
  157. package/tests/AWS_TagsTest.res +16 -5
  158. package/tests/AppSyncEventsSigner_OpsTest.res +11 -2
  159. package/tests/AppSync_AdapterTest.res +203 -224
  160. package/tests/AppSync_Resolver_RetryingTest.res +64 -44
  161. package/tests/AppSync_RetirementNarrowingTest.res +59 -46
  162. package/tests/AppSync_SdlDecorateTest.res +22 -20
  163. package/tests/AppSync_SourceApiAssociation_RetryingTest.res +40 -22
  164. package/tests/Auth_ActiveRolePoolAttachmentTest.res +114 -107
  165. package/tests/Auth_ActiveRoleStoreTest.res +12 -9
  166. package/tests/Auth_ActiveRoleStore_SchemaTest.res +2 -1
  167. package/tests/Auth_ActiveRoleTrigger_OpsTest.res +20 -16
  168. package/tests/Auth_CognitoTest.res +31 -46
  169. package/tests/AutomationSliceEntryPoint_OpsTest.res +69 -67
  170. package/tests/BakeConvergenceTest.res +22 -25
  171. package/tests/Capability_MessagingTest.res +28 -12
  172. package/tests/CommandTopicQueuePolicyTest.res +1 -2
  173. package/tests/CounterEntryPoint_OpsTest.res +3 -7
  174. package/tests/DcbEventLogStorage_DynamoDb_RuntimeTest.res +306 -210
  175. package/tests/EventCollectorConnectLambdaPreviewTest.res +14 -7
  176. package/tests/EventCollectorEntryPoint_OpsTest.res +12 -4
  177. package/tests/EventCollectorPluginDefinitionAssetTest.res +18 -11
  178. package/tests/EventCollectorReadyGateTest.res +5 -4
  179. package/tests/EventLogStorage_DynamoDb_RuntimeTest.res +1 -2
  180. package/tests/EventMapperEntryPoint_OpsTest.res +1 -3
  181. package/tests/ExtensionPointEntryPoint_OpsTest.res +1 -4
  182. package/tests/HandlerFactoryDispatchTest.res +97 -70
  183. package/tests/MCP_LambdaTest.res +16 -27
  184. package/tests/PgChangeFeedRelay_IntegrationTest.res +123 -93
  185. package/tests/PgChangeFeedRelay_RuntimeTest.res +13 -10
  186. package/tests/PgMigrationEntryPoint_IntegrationTest.res +0 -1
  187. package/tests/PgPipeline_IntegrationTest.res +80 -66
  188. package/tests/PgQueryDbUnion_IntegrationTest.res +1 -2
  189. package/tests/PgQueryResolverEntryPoint_OpsTest.res +2 -6
  190. package/tests/PgQueryResolver_LambdaTest.res +41 -24
  191. package/tests/Platform_AdminScan_OpsTest.res +4 -1
  192. package/tests/Platform_ComponentDefinitions_Lambda_OpsTest.res +137 -129
  193. package/tests/ProjectionEntryPoint_DisplayNameTest.res +7 -3
  194. package/tests/ProjectionEntryPoint_UnionStampTest.res +3 -2
  195. package/tests/ProvisionIdentityTest.res +2 -6
  196. package/tests/QueryDbOwnerIndexTableTest.res +6 -4
  197. package/tests/QueryDbResolvers_AppSyncTest.res +23 -16
  198. package/tests/QueryInterceptor_LambdaTest.res +11 -13
  199. package/tests/ReadModelEntryPoint_OpsTest.res +43 -41
  200. package/tests/RuntimeExtensionEntryPoint_OpsTest.res +4 -3
  201. package/tests/SideEffectEntryPoint_OpsTest.res +23 -18
  202. package/tests/StateChangeDescriptorParityTest.res +28 -26
  203. package/tests/StateTopicKeySchemaTest.res +18 -15
  204. package/tests/StateViewSliceEntryPoint_OpsTest.res +55 -44
  205. package/tests/TaskBucketEntryPoint_OpsTest.res +13 -13
  206. package/tests/Upload_ClaimTest.res +3 -3
  207. package/tests/Util_AwsErrorTest.res +4 -7
  208. package/tests/Util_BundleDependencyClosureTest.res +15 -3
  209. package/tests/Util_BundleEsmLoaderTest.res +3 -3
  210. package/tests/Util_BundleResolveTest.res +4 -6
  211. package/tests/Util_BundleRuntimeExtensionTest.res +17 -18
  212. package/tests/Util_DcbMetricsTest.res +6 -6
  213. package/tests/Util_DynamoDbStreamTest.res +4 -5
  214. package/tests/Util_DynamoDbTest.res +3 -2
  215. package/tests/Util_LambdaEnvBudgetTest.res +22 -18
  216. package/tests/Util_LambdaLoggingTest.res +9 -8
  217. package/tests/Util_LogGroup_AdoptingTest.res +10 -5
  218. package/tests/Util_LogRetentionTest.res +6 -2
  219. package/tests/Util_OwnerScopeEnvTest.res +10 -8
  220. package/tests/Util_SQS_RuntimeTest.res +5 -7
  221. package/tests/Util_ShellConfigTest.res +7 -17
  222. package/tests/Util_StaticBundleTest.res +3 -8
  223. package/tests/Util_StoreLayoutTest.res +17 -12
  224. package/tests/integration/AggregateEntryPoint_IntegrationTest.res +1 -4
  225. package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res +15 -15
  226. package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res +296 -232
  227. package/tests/integration/DcbIntegrationHarness.res +8 -8
  228. package/tests/integration/EpCompositeSlice.res +16 -8
  229. package/tests/integration/QueryDbUnion_DynamoDb_IntegrationTest.res +8 -10
  230. package/tests/integration/StateViewSliceEntryPoint_IntegrationTest.res +10 -10
  231. package/tests/integration/SvsTestSlice_Projection.res +1 -3
  232. package/tests/util/Util_AlarmSpecTest.res +62 -49
@@ -36,8 +36,9 @@ let keyEl = (name, keyType) =>
36
36
  // full (ALL) projection; per-tag `tag_<key>` GSIs are KEYS_ONLY. Uses the same
37
37
  // predicate as the deploy-time `make` so the two never drift.
38
38
  let gsi = indexName => {
39
- let projection =
40
- DcbEventLogStorage_DynamoDb_Runtime.indexKeepsFullProjection(indexName) ? "ALL" : "KEYS_ONLY"
39
+ let projection = DcbEventLogStorage_DynamoDb_Runtime.indexKeepsFullProjection(indexName)
40
+ ? "ALL"
41
+ : "KEYS_ONLY"
41
42
  Dict.fromArray([
42
43
  ("IndexName", s(indexName)),
43
44
  ("KeySchema", [keyEl(indexName, "HASH"), keyEl("position", "RANGE")]->JSON.Encode.array),
@@ -81,8 +82,7 @@ let createDcbTableWithTagKeys = async (
81
82
  tableName,
82
83
  tagKeys: array<string>,
83
84
  ): Util_DynamoDb_Runtime.resolvedTable => {
84
- let indexNames =
85
- tagKeys->Array.map(k => `tag_${k}`)->Array.concat(["tag_composite"])
85
+ let indexNames = tagKeys->Array.map(k => `tag_${k}`)->Array.concat(["tag_composite"])
86
86
  let attributeDefinitions = Array.concat(
87
87
  [attrDef("id"), attrDef("position")],
88
88
  indexNames->Array.map(attrDef),
@@ -110,8 +110,8 @@ let createDcbTableWithTagKeys = async (
110
110
  // entity) rather than per-member `fence#<member>:…` rows.
111
111
  let scanFenceIds = async (table: Util_DynamoDb_Runtime.resolvedTable): array<string> => {
112
112
  let items = await Util_DynamoDb_Runtime.scanStream({tableName: table.name})
113
- ->Stream.runCollect
114
- ->Effect.runPromise
113
+ ->Stream.runCollect
114
+ ->Effect.runPromise
115
115
  items->Array.filterMap(item =>
116
116
  item
117
117
  ->JSON.Decode.object
@@ -126,8 +126,8 @@ let scanFenceIds = async (table: Util_DynamoDb_Runtime.resolvedTable): array<str
126
126
  // persisted — the signal that a composite slice could read back its own state.
127
127
  let scanEventTypes = async (table: Util_DynamoDb_Runtime.resolvedTable): array<string> => {
128
128
  let items = await Util_DynamoDb_Runtime.scanStream({tableName: table.name})
129
- ->Stream.runCollect
130
- ->Effect.runPromise
129
+ ->Stream.runCollect
130
+ ->Effect.runPromise
131
131
  items->Array.filterMap(item =>
132
132
  item
133
133
  ->JSON.Decode.object
@@ -29,12 +29,16 @@ type consumedEvent =
29
29
  @schema
30
30
  type command =
31
31
  | AddResource({
32
- environment: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=0, ~sep="/")) string,
33
- resourceName: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=1, ~sep="/")) string,
32
+ environment: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=0, ~sep="/"))
33
+ string,
34
+ resourceName: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=1, ~sep="/"))
35
+ string,
34
36
  })
35
37
  | TouchResource({
36
- environment: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=0, ~sep="/")) string,
37
- resourceName: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=1, ~sep="/")) string,
38
+ environment: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=0, ~sep="/"))
39
+ string,
40
+ resourceName: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=1, ~sep="/"))
41
+ string,
38
42
  })
39
43
 
40
44
  @schema
@@ -45,12 +49,16 @@ type error =
45
49
  @schema
46
50
  type event =
47
51
  | ResourceAdded({
48
- environment: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=0, ~sep="/")) string,
49
- resourceName: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=1, ~sep="/")) string,
52
+ environment: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=0, ~sep="/"))
53
+ string,
54
+ resourceName: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=1, ~sep="/"))
55
+ string,
50
56
  })
51
57
  | ResourceTouched({
52
- environment: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=0, ~sep="/")) string,
53
- resourceName: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=1, ~sep="/")) string,
58
+ environment: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=0, ~sep="/"))
59
+ string,
60
+ resourceName: @s.matches(Reventless.DcbTag.compositePartitionMember(~position=1, ~sep="/"))
61
+ string,
54
62
  })
55
63
 
56
64
  let name = "EpCompositeSlice"
@@ -57,11 +57,10 @@ describe("QueryDb (DynamoDB) round-trips a union field", () => {
57
57
  )
58
58
 
59
59
  // The item as a read door hands it back.
60
- let stored =
61
- await jsonOps.loadStream("c-1")
62
- ->Stream.runCollect
63
- ->Effect.catchAll(_ => Effect.succeed([]))
64
- ->Effect.runPromise
60
+ let stored = await jsonOps.loadStream("c-1")
61
+ ->Stream.runCollect
62
+ ->Effect.catchAll(_ => Effect.succeed([]))
63
+ ->Effect.runPromise
65
64
  let typename =
66
65
  stored
67
66
  ->Array.get(0)
@@ -72,11 +71,10 @@ describe("QueryDb (DynamoDB) round-trips a union field", () => {
72
71
  ->Option.flatMap(JSON.Decode.string)
73
72
  expect(typename)->toEqual(Some("GeolocationLocated"))
74
73
 
75
- let items =
76
- await Ops.loadStream("c-1"->CustomersSpec.Id.makeFromString)
77
- ->Stream.runCollect
78
- ->Effect.catchAll(_ => Effect.succeed([]))
79
- ->Effect.runPromise
74
+ let items = await Ops.loadStream("c-1"->CustomersSpec.Id.makeFromString)
75
+ ->Stream.runCollect
76
+ ->Effect.catchAll(_ => Effect.succeed([]))
77
+ ->Effect.runPromise
80
78
  switch items {
81
79
  | [{geolocation: Located({lat, lng})}] => expect((lat, lng))->toEqual((48.2082, 16.3738))
82
80
  | _ => expect("round trip")->toBe("Located with its point intact")
@@ -138,11 +138,12 @@ describe("StateViewSliceEntryPoint integration", () => {
138
138
 
139
139
  let productIds =
140
140
  rows
141
- ->Array.filterMap(row =>
142
- row
143
- ->JSON.Decode.object
144
- ->Option.flatMap(o => o->Dict.get("productId"))
145
- ->Option.flatMap(JSON.Decode.string)
141
+ ->Array.filterMap(
142
+ row =>
143
+ row
144
+ ->JSON.Decode.object
145
+ ->Option.flatMap(o => o->Dict.get("productId"))
146
+ ->Option.flatMap(JSON.Decode.string),
146
147
  )
147
148
  ->Array.toSorted(String.compare)
148
149
  expect(productIds)->toEqual(["prod-a", "prod-b"])
@@ -150,16 +151,15 @@ describe("StateViewSliceEntryPoint integration", () => {
150
151
  // The runtime path's union stamp, against real DynamoDB. The deployed
151
152
  // Lambdas assemble JSON-level ops and skipped it entirely, so a member
152
153
  // resolved to null and took its non-nullable parent with it.
153
- let members =
154
- rows
155
- ->Array.filterMap(row =>
154
+ let members = rows->Array.filterMap(
155
+ row =>
156
156
  row
157
157
  ->JSON.Decode.object
158
158
  ->Option.flatMap(o => o->Dict.get("fulfilment"))
159
159
  ->Option.flatMap(JSON.Decode.object)
160
160
  ->Option.flatMap(o => o->Dict.get("__typename"))
161
- ->Option.flatMap(JSON.Decode.string)
162
- )
161
+ ->Option.flatMap(JSON.Decode.string),
162
+ )
163
163
  expect(members)->toEqual(["FulfilmentShipped", "FulfilmentShipped"])
164
164
 
165
165
  await H.deleteTable(table)
@@ -17,9 +17,7 @@ let project = ({event}: Reventless.StateViewSlice.consumed<consumedEvent>) =>
17
17
  cartId,
18
18
  states => {
19
19
  let others = states->Array.filter(s => s.productId != productId)
20
- others->Array.concat([
21
- {cartId, productId, qty, fulfilment: Shipped({carrier: "dhl"})},
22
- ])
20
+ others->Array.concat([{cartId, productId, qty, fulfilment: Shipped({carrier: "dhl"})}])
23
21
  },
24
22
  ),
25
23
  ]
@@ -29,45 +29,51 @@ describe("Util_AlarmSpec", () => {
29
29
 
30
30
  // The case that went unnoticed on a deployed estate: a heartbeat that stops
31
31
  // emits no errors AND no invocations, so nothing an Errors alarm can see.
32
- testSync("a scheduler also alarms on its own silence, and that alarm treats missing data as breaching", () => {
33
- let specs = A.forKind(~kind=Scheduler, ~silenceWindowSeconds=1800)
34
- expect(specs->Array.length)->toBe(2)
32
+ testSync(
33
+ "a scheduler also alarms on its own silence, and that alarm treats missing data as breaching",
34
+ () => {
35
+ let specs = A.forKind(~kind=Scheduler, ~silenceWindowSeconds=1800)
36
+ expect(specs->Array.length)->toBe(2)
35
37
 
36
- let silence = specs->Array.getUnsafe(1)
37
- expect(silence.metricName)->toBe("Invocations")
38
- expect(silence.comparisonOperator)->toBe("LessThanThreshold")
39
- expect(silence.period)->toBe(1800)
40
- expect(silence.treatMissingData)->toBe("breaching")
41
- // Distinct suffix, or the two alarms would collide on one resource name.
42
- expect(silence.suffix)->toBe("Silent")
43
- expect(silence.meaning)->toBe("has not run for 30 minutes")
44
- })
38
+ let silence = specs->Array.getUnsafe(1)
39
+ expect(silence.metricName)->toBe("Invocations")
40
+ expect(silence.comparisonOperator)->toBe("LessThanThreshold")
41
+ expect(silence.period)->toBe(1800)
42
+ expect(silence.treatMissingData)->toBe("breaching")
43
+ // Distinct suffix, or the two alarms would collide on one resource name.
44
+ expect(silence.suffix)->toBe("Silent")
45
+ expect(silence.meaning)->toBe("has not run for 30 minutes")
46
+ },
47
+ )
45
48
 
46
49
  testSync("the silence window defaults to an hour — twelve missed heartbeats", () => {
47
50
  let silence = A.forKind(~kind=Scheduler)->Array.getUnsafe(1)
48
51
  expect(silence.period)->toBe(3600)
49
52
  })
50
53
 
51
- testSync("resource names separate a unit's alarms, and like-named components of different plugins", () => {
52
- let specs = A.forKind(~kind=Scheduler)
53
- let nameFor = (spec: A.t, ~plugin) =>
54
- A.resourceName(~kind=Scheduler, ~name="Heartbeat", ~plugin, ~suffix=spec.suffix)
54
+ testSync(
55
+ "resource names separate a unit's alarms, and like-named components of different plugins",
56
+ () => {
57
+ let specs = A.forKind(~kind=Scheduler)
58
+ let nameFor = (spec: A.t, ~plugin) =>
59
+ A.resourceName(~kind=Scheduler, ~name="Heartbeat", ~plugin, ~suffix=spec.suffix)
55
60
 
56
- expect(nameFor(specs->Array.getUnsafe(0), ~plugin=Some("Catalog")))->toBe(
57
- "alarm-scheduler-Catalog-Heartbeat",
58
- )
59
- expect(nameFor(specs->Array.getUnsafe(1), ~plugin=Some("Catalog")))->toBe(
60
- "alarm-scheduler-Catalog-HeartbeatSilent",
61
- )
62
- // Two plugins can own like-named components; without the plugin these collide.
63
- expect(nameFor(specs->Array.getUnsafe(0), ~plugin=Some("Ordering")))->toBe(
64
- "alarm-scheduler-Ordering-Heartbeat",
65
- )
66
- // Platform substrate belongs to no plugin.
67
- expect(
68
- A.resourceName(~kind=DeadLetterSink, ~name="DeadLetterQueue", ~plugin=None, ~suffix=""),
69
- )->toBe("alarm-deadlettersink-DeadLetterQueue")
70
- })
61
+ expect(nameFor(specs->Array.getUnsafe(0), ~plugin=Some("Catalog")))->toBe(
62
+ "alarm-scheduler-Catalog-Heartbeat",
63
+ )
64
+ expect(nameFor(specs->Array.getUnsafe(1), ~plugin=Some("Catalog")))->toBe(
65
+ "alarm-scheduler-Catalog-HeartbeatSilent",
66
+ )
67
+ // Two plugins can own like-named components; without the plugin these collide.
68
+ expect(nameFor(specs->Array.getUnsafe(0), ~plugin=Some("Ordering")))->toBe(
69
+ "alarm-scheduler-Ordering-Heartbeat",
70
+ )
71
+ // Platform substrate belongs to no plugin.
72
+ expect(
73
+ A.resourceName(~kind=DeadLetterSink, ~name="DeadLetterQueue", ~plugin=None, ~suffix=""),
74
+ )->toBe("alarm-deadlettersink-DeadLetterQueue")
75
+ },
76
+ )
71
77
 
72
78
  // A state-change message carries the description and neither the tags nor the
73
79
  // name, so everything a reader or a parser needs has to be in this one string.
@@ -81,8 +87,12 @@ describe("Util_AlarmSpec", () => {
81
87
  ~spec,
82
88
  ~logs=Some("/aws/lambda/online-shop-AllAggregatesCmdHandler"),
83
89
  )
84
- expect(desc->String.includes("'AllAggregatesCmdHandler' (plugin Ordering, platform online-shop)"))->toBe(true)
85
- expect(desc->String.includes("Logs: /aws/lambda/online-shop-AllAggregatesCmdHandler."))->toBe(true)
90
+ expect(
91
+ desc->String.includes("'AllAggregatesCmdHandler' (plugin Ordering, platform online-shop)"),
92
+ )->toBe(true)
93
+ expect(desc->String.includes("Logs: /aws/lambda/online-shop-AllAggregatesCmdHandler."))->toBe(
94
+ true,
95
+ )
86
96
  expect(
87
97
  desc->String.includes(
88
98
  "[reventless plugin=Ordering platform=online-shop component=AllAggregatesCmdHandler kind=commandhandler]",
@@ -90,20 +100,23 @@ describe("Util_AlarmSpec", () => {
90
100
  )->toBe(true)
91
101
  })
92
102
 
93
- testSync("a unit owned by no plugin claims none, and one with no logs promises no address", () => {
94
- let spec = A.forKind(~kind=DeadLetterSink)->Array.getUnsafe(0)
95
- let desc = A.description(
96
- ~kind=DeadLetterSink,
97
- ~name="DeadLetterQueue",
98
- ~plugin=None,
99
- ~platform=None,
100
- ~spec,
101
- ~logs=None,
102
- )
103
- // A dead-letter queue is shared by every plugin in the estate — naming one
104
- // would be a lie, and an empty parenthesis is noise.
105
- expect(desc->String.includes("(plugin"))->toBe(false)
106
- expect(desc->String.includes("Logs:"))->toBe(false)
107
- expect(desc->String.includes("kind=deadlettersink"))->toBe(true)
108
- })
103
+ testSync(
104
+ "a unit owned by no plugin claims none, and one with no logs promises no address",
105
+ () => {
106
+ let spec = A.forKind(~kind=DeadLetterSink)->Array.getUnsafe(0)
107
+ let desc = A.description(
108
+ ~kind=DeadLetterSink,
109
+ ~name="DeadLetterQueue",
110
+ ~plugin=None,
111
+ ~platform=None,
112
+ ~spec,
113
+ ~logs=None,
114
+ )
115
+ // A dead-letter queue is shared by every plugin in the estate — naming one
116
+ // would be a lie, and an empty parenthesis is noise.
117
+ expect(desc->String.includes("(plugin"))->toBe(false)
118
+ expect(desc->String.includes("Logs:"))->toBe(false)
119
+ expect(desc->String.includes("kind=deadlettersink"))->toBe(true)
120
+ },
121
+ )
109
122
  })