@reventlessdev/reventless-infra 3.0.0-alpha.153 → 3.0.0-alpha.155

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 3.0.0-alpha.155 (2026-09-02)
7
+
8
+ * feat(aws)!: the messaging sender is configuration, and a stack can choose to only log ([23b8b4b](https://github.com/ReventlessDev/reventless-core/commit/23b8b4bfe9c70555de4d74266ca686cb427485ca))
9
+
10
+ ### BREAKING CHANGES
11
+
12
+ * `Capability_Messaging_Ses.make` is replaced by
13
+ `Capability_Messaging.make(~name)`, which reads the transport and the address
14
+ from config; the SES module keeps only `emailSender`. A deployment that named its
15
+ sender in code must move it to `platform:messagingEmailSender` or the deploy is
16
+ refused.
17
+
18
+
19
+
20
+ # 3.0.0-alpha.154 (2026-09-01)
21
+
22
+ **Note:** Version bump only for package @reventlessdev/reventless-infra
23
+
24
+
25
+
26
+
27
+
6
28
  # 3.0.0-alpha.153 (2026-09-01)
7
29
 
8
30
  ### Bug Fixes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-infra",
3
- "version": "3.0.0-alpha.153",
3
+ "version": "3.0.0-alpha.155",
4
4
  "description": "Infrastructure types for Reventless framework",
5
5
  "license": "Apache-2.0",
6
6
  "jest": {
@@ -17,9 +17,9 @@
17
17
  "sury-ppx": "11.0.0-rc.2",
18
18
  "uuid": "^13.0.0",
19
19
  "@reventlessdev/rescript-effect": "0.1.0-alpha.32",
20
- "@reventlessdev/reventless-spec": "3.0.0-alpha.125",
20
+ "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.19",
21
21
  "@reventlessdev/rescript-uuid": "2.0.0-alpha.0",
22
- "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.19"
22
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.127"
23
23
  },
24
24
  "devDependencies": {
25
25
  "rescript": "12.3.0",
@@ -19,16 +19,6 @@ let noApiVariantsId: S.Metadata.Id.t<Set.t<string>> =
19
19
  let noApiVariantId: S.Metadata.Id.t<bool> =
20
20
  S.Metadata.Id.make(~namespace="api", ~name="noApiVariant")
21
21
 
22
- /** Internal sury metadata ID storing per-variant allowed-state lists for AutoUI command filtering.
23
- Maps variant name → set of status values under which the command is meaningful. */
24
- let allowedStatesId: S.Metadata.Id.t<dict<array<string>>> =
25
- S.Metadata.Id.make(~namespace="api", ~name="allowedStates")
26
-
27
- /** Internal sury metadata ID storing per-variant target-state values for AutoUI board
28
- transitions. Maps variant name → the single status the command's handler writes. */
29
- let targetStateId: S.Metadata.Id.t<dict<string>> =
30
- S.Metadata.Id.make(~namespace="api", ~name="targetState")
31
-
32
22
  /** PPX helper: attaches the noApi flag to a command schema. Called by generated code. */
33
23
  let markNoApi = (schema: S.t<'a>): S.t<'a> =>
34
24
  schema->S.Metadata.set(~id=noApiId, true)
@@ -88,20 +78,6 @@ let markNoApiVariants = (schema: S.t<'a>, variants: array<string>): S.t<'a> => {
88
78
  marked->S.Metadata.set(~id=noApiVariantsId, excluded)
89
79
  }
90
80
 
91
- /** PPX helper: attaches per-variant allowedStates to a command schema. Called by generated code
92
- emitted from the from-set of an @transition attribute. Each entry is (variantName, allowedStateNames). */
93
- let markAllowedStates = (
94
- schema: S.t<'a>,
95
- entries: array<(string, array<string>)>,
96
- ): S.t<'a> => schema->S.Metadata.set(~id=allowedStatesId, Dict.fromArray(entries))
97
-
98
- /** PPX helper: attaches per-variant targetState to a command schema. Called by generated code
99
- emitted from the target of an @transition attribute. Each entry is (variantName, targetStateName). */
100
- let markTargetState = (
101
- schema: S.t<'a>,
102
- entries: array<(string, string)>,
103
- ): S.t<'a> => schema->S.Metadata.set(~id=targetStateId, Dict.fromArray(entries))
104
-
105
81
  /** Type alias for schema fragments (re-exports Plugin.apiSchemaFragment). */
106
82
  type schemaFragment = Reventless.Plugin.apiSchemaFragment
107
83
 
@@ -9,10 +9,6 @@ let noApiVariantsId = Sury.$Metadata_Id_make("api", "noApiVariants");
9
9
 
10
10
  let noApiVariantId = Sury.$Metadata_Id_make("api", "noApiVariant");
11
11
 
12
- let allowedStatesId = Sury.$Metadata_Id_make("api", "allowedStates");
13
-
14
- let targetStateId = Sury.$Metadata_Id_make("api", "targetState");
15
-
16
12
  function markNoApi(schema) {
17
13
  return Sury.$Metadata_set(schema, noApiId, true);
18
14
  }
@@ -54,24 +50,12 @@ function markNoApiVariants(schema, variants) {
54
50
  return Sury.$Metadata_set(marked, noApiVariantsId, excluded);
55
51
  }
56
52
 
57
- function markAllowedStates(schema, entries) {
58
- return Sury.$Metadata_set(schema, allowedStatesId, Object.fromEntries(entries));
59
- }
60
-
61
- function markTargetState(schema, entries) {
62
- return Sury.$Metadata_set(schema, targetStateId, Object.fromEntries(entries));
63
- }
64
-
65
53
  export {
66
54
  noApiId,
67
55
  noApiVariantsId,
68
56
  noApiVariantId,
69
- allowedStatesId,
70
- targetStateId,
71
57
  markNoApi,
72
58
  variantNameOf,
73
59
  markNoApiVariants,
74
- markAllowedStates,
75
- markTargetState,
76
60
  }
77
61
  /* noApiId Not a pure module */
@@ -189,12 +189,33 @@ capability helper.
189
189
  `emailSender` is the verified address messages are sent *from* — a provider-side
190
190
  identity, not something an application picks per message, which is why it is a
191
191
  deploy-time handle rather than a field on `Messaging.message`. Absent when the
192
- deployment provisions no email channel.
192
+ deployment provisions no email channel. It carries the whole `From:` header, so
193
+ a deployment that configured a display name has it here rather than at the send.
193
194
 
194
195
  The channel set is derived from which senders are present rather than declared
195
196
  beside them, so a handle carrying no sender at all cannot claim a channel.
197
+
198
+ `smsSender` is the origination number or sender id, on the same terms — with the
199
+ difference that **no transport reads it yet**. It is carried so a stack can state
200
+ the number where the other senders live, and so the field exists before the
201
+ backend that needs it; the SMS channel appears when that backend does, not when
202
+ this is set. A channel claimed ahead of its transport would collect preferences
203
+ that silently deliver nothing, which is the failure the derived channel set above
204
+ exists to prevent.
205
+
206
+ `emailProvider` names the transport behind the email sender — the value a runtime
207
+ reads to decide which backend to build. Per channel, like the senders themselves:
208
+ an SMS transport is a separate choice, and one key for both would make choosing a
209
+ mail sink also choose how texts go out. On the handle rather than resolved separately at
210
+ each end, so the address and the thing that will send it are provisioned as one
211
+ answer: a platform that read the choice from config itself could disagree with
212
+ the helper that read the address.
196
213
  */
197
- type messagingSender = {emailSender?: Pulumi.Input.t<string>}
214
+ type messagingSender = {
215
+ emailSender?: Pulumi.Input.t<string>,
216
+ smsSender?: Pulumi.Input.t<string>,
217
+ emailProvider?: Pulumi.Input.t<string>,
218
+ }
198
219
 
199
220
  // Options for the shell's map view mode. Written to config.json flat, beside
200
221
  // `viewModes`, because that is where the shell reads them; carried on the arm