@reventlessdev/reventless-infra 3.0.0-alpha.107 → 3.0.0-alpha.108

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,13 @@
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.108 (2026-07-28)
7
+
8
+ ### Features
9
+
10
+ * **platform:** provision object stores from the fields that declare them ([b5e2a1e](https://github.com/ReventlessDev/reventless-core/commit/b5e2a1ec88099941c113e4963f9c4b346b96b0d6))
11
+
12
+
6
13
  # 3.0.0-alpha.107 (2026-07-28)
7
14
 
8
15
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-infra",
3
- "version": "3.0.0-alpha.107",
3
+ "version": "3.0.0-alpha.108",
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-alpha.2",
18
18
  "uuid": "^13.0.0",
19
19
  "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.17",
20
- "@reventlessdev/rescript-effect": "0.1.0-alpha.31",
20
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.83",
21
21
  "@reventlessdev/rescript-uuid": "1.1.0-alpha.17",
22
- "@reventlessdev/reventless-spec": "3.0.0-alpha.82"
22
+ "@reventlessdev/rescript-effect": "0.1.0-alpha.31"
23
23
  },
24
24
  "devDependencies": {
25
25
  "rescript": "12.3.0",
@@ -57,7 +57,16 @@ type pluginOutputs = Plugin.outputs
57
57
  // (AWS fronts it via CloudFront; in-memory ignores it). See
58
58
  // [docs/plans/done/ui-served-buckets.md].
59
59
  type servedBucket = {
60
- prefix: string,
60
+ // Stable stem for the CDN origin id and the per-bucket resource names. Distinct
61
+ // from the prefixes because a bucket can serve several of them.
62
+ id: string,
63
+ // Every path prefix served from this bucket. A list rather than a single value
64
+ // because a shared-layout stack puts several declared stores in one bucket, and
65
+ // a bucket may carry only ONE bucket policy — a per-prefix policy would have
66
+ // the second store silently overwrite the first store's CloudFront read grant,
67
+ // which deploys green and 404s half the objects. One entry per bucket makes
68
+ // that unrepresentable.
69
+ prefixes: array<string>,
61
70
  bucketId: Pulumi.Input.t<string>,
62
71
  bucketArn: Pulumi.Input.t<string>,
63
72
  bucketRegionalDomainName: Pulumi.Input.t<string>,
@@ -73,8 +82,35 @@ type objectStore = {
73
82
  bucketId: Pulumi.Input.t<string>,
74
83
  bucketArn: Pulumi.Input.t<string>,
75
84
  bucketRegionalDomainName: Pulumi.Input.t<string>,
85
+ // The prefix this store's object keys are rooted at, and therefore the path
86
+ // it must be served under for a minted `/{key}` ref to resolve. Written once
87
+ // here and read by both the mint side (the presign service) and the serve
88
+ // side (the CDN behaviour), so the two cannot disagree — the property the
89
+ // single served prefix already had, now carried per store.
90
+ //
91
+ // Rooting keys at the store name in *every* layout is what keeps a stored ref
92
+ // independent of whether the store got its own bucket or a prefix inside a
93
+ // shared one. Refs live in an append-only log; one that encoded its bucket
94
+ // layout would be unrewritable and environment-specific.
95
+ keyPrefix: string,
76
96
  }
77
97
 
98
+ /**
99
+ A capability a deployment declares it needs.
100
+
101
+ A real variant rather than a string pair so the platform and the plugin stacks
102
+ reference one nominal type, and so the compiler finds every consumer when the
103
+ set grows.
104
+
105
+ `ObjectStore`'s identity is `(plugin, store)`: two plugins that happen to pick
106
+ the same store name get two stores. That mirrors how a field's declaration is
107
+ read — an unqualified `@storageRef("productImages")` means *this* plugin's
108
+ store, and reaching another plugin's store is the qualified form.
109
+ */
110
+ type capability =
111
+ | ObjectStore({plugin: string, store: string})
112
+ | Geocoding
113
+
78
114
  // A provisioned geocoding place index, as returned by the framework's geocoding
79
115
  // capability helper. A record rather than a bare name so the handle can grow
80
116
  // (ARN, data source) without moving every call site.
@@ -301,10 +337,14 @@ module type T = {
301
337
  /** Deploy only the platform (admin components, scheduler, shared API).
302
338
  No plugins are deployed — each plugin deploys independently via `deployPlugin`.
303
339
  Pass `~hostUiBundle` to also host a static host-shell SPA from this stack.
340
+ Pass `~capabilities` to provision the stores the plugins' fields declare;
341
+ the store a field declares is the store that gets provisioned, named after
342
+ it and attributed to the plugin that owns it.
304
343
  Returns the Pulumi stack outputs dict for use as the ESM `default` export. */
305
344
  let deployPlatform: (
306
345
  ~version: string,
307
346
  ~hostUiBundle: hostUiBundleConfig=?,
347
+ ~capabilities: array<capability>=?,
308
348
  ) => dict<Pulumi.Output.t<JSON.t>>
309
349
 
310
350
  /** Deploy a single plugin as an independent stack.