@reventlessdev/reventless-core 3.0.0-alpha.229 → 3.0.0-alpha.230

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,14 @@
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.230 (2026-08-13)
7
+
8
+ ### Features
9
+
10
+ * **aws:** bake the component manifest after every plugin stack is up ([2fff09a](https://github.com/ReventlessDev/reventless-core/commit/2fff09aa32b77cc8e33a65414c58c12026ca009e))
11
+ * **local:** bake one curated surface per audience ([3be6f63](https://github.com/ReventlessDev/reventless-core/commit/3be6f63e579cef8cd213a84b6ccded773b1abc9e))
12
+
13
+
6
14
  # 3.0.0-alpha.229 (2026-08-12)
7
15
 
8
16
  ### Bug Fixes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-core",
3
- "version": "3.0.0-alpha.229",
3
+ "version": "3.0.0-alpha.230",
4
4
  "description": "Core package for Reventless framework",
5
5
  "license": "Apache-2.0",
6
6
  "jest": {
@@ -29,16 +29,16 @@
29
29
  "sury": "11.0.0-alpha.4",
30
30
  "uuid": "^13.0.0",
31
31
  "@reventlessdev/rescript-effect": "0.1.0-alpha.32",
32
- "@reventlessdev/rescript-fast-csv": "2.0.0-alpha.4",
33
- "@reventlessdev/rescript-jest": "1.0.0-alpha.10",
34
- "@reventlessdev/rescript-node": "2.0.0-alpha.4",
35
32
  "@reventlessdev/rescript-hash-object": "1.2.0-alpha.14",
36
- "@reventlessdev/rescript-ssh2": "2.0.0-alpha.4",
33
+ "@reventlessdev/rescript-fast-csv": "2.0.0-alpha.5",
34
+ "@reventlessdev/rescript-node": "2.0.0-alpha.5",
35
+ "@reventlessdev/rescript-jest": "1.0.0-alpha.10",
37
36
  "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.18",
37
+ "@reventlessdev/rescript-ssh2": "2.0.0-alpha.5",
38
38
  "@reventlessdev/rescript-uuid": "2.0.0-alpha.0",
39
- "@reventlessdev/reventless-infra": "3.0.0-alpha.137",
39
+ "@reventlessdev/reventless-infra": "3.0.0-alpha.138",
40
40
  "@reventlessdev/reventless-interop": "3.0.0-alpha.30",
41
- "@reventlessdev/reventless-spec": "3.0.0-alpha.111"
41
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.112"
42
42
  },
43
43
  "devDependencies": {
44
44
  "rescript": "12.3.0",
@@ -132,6 +132,43 @@ let curateStructure = (
132
132
  }
133
133
  })
134
134
 
135
+ // Where the file goes when the declaration does not say, and the URL a shell
136
+ // fetches it from.
137
+ //
138
+ // Both platforms write the manifest beside `config.json` at what is also the
139
+ // shell's URL root, so the key and the path the browser asks for are one string.
140
+ // Stated here, with the curation, because a platform that defaulted the key
141
+ // differently from the one that wrote `manifestUrl` would put the file where
142
+ // nothing reads it — and the symptom is an empty shop, not a missing file.
143
+ let defaultKey = "component-manifest.json"
144
+
145
+ let urlForKey = (key: option<string>): string => "/" ++ key->Option.getOr(defaultKey)
146
+
147
+ /**
148
+ File name for a journey that did not choose one.
149
+
150
+ Derived from the group so two journeys cannot collide by accident, and
151
+ lower-cased with non-alphanumerics folded to `-` because a group name is a
152
+ Cognito identifier and a key is part of a URL. A deployment wanting something
153
+ else names it.
154
+ */
155
+ let journeyKey = (~group: string): string => {
156
+ let slug =
157
+ group
158
+ ->String.toLowerCase
159
+ ->String.split("")
160
+ ->Array.map(c =>
161
+ switch c {
162
+ | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" => c
163
+ | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" => c
164
+ | "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" => c
165
+ | _ => "-"
166
+ }
167
+ )
168
+ ->Array.join("")
169
+ `component-manifest-${slug}.json`
170
+ }
171
+
135
172
  // The whole file: one entry per selection, in the order the deployment declared
136
173
  // them, so the include-list also states the order a consumer reads plugins in.
137
174
  let curate = (
@@ -119,6 +119,59 @@ function curateStructure(pluginId, def, sel) {
119
119
  });
120
120
  }
121
121
 
122
+ let defaultKey = "component-manifest.json";
123
+
124
+ function urlForKey(key) {
125
+ return "/" + Stdlib_Option.getOr(key, defaultKey);
126
+ }
127
+
128
+ function journeyKey(group) {
129
+ let slug = group.toLowerCase().split("").map(c => {
130
+ switch (c) {
131
+ case "0" :
132
+ case "1" :
133
+ case "2" :
134
+ case "3" :
135
+ case "4" :
136
+ case "5" :
137
+ case "6" :
138
+ case "7" :
139
+ case "8" :
140
+ case "9" :
141
+ case "a" :
142
+ case "b" :
143
+ case "c" :
144
+ case "d" :
145
+ case "e" :
146
+ case "f" :
147
+ case "g" :
148
+ case "h" :
149
+ case "i" :
150
+ case "j" :
151
+ case "k" :
152
+ case "l" :
153
+ case "m" :
154
+ case "n" :
155
+ case "o" :
156
+ case "p" :
157
+ case "q" :
158
+ case "r" :
159
+ case "s" :
160
+ case "t" :
161
+ case "u" :
162
+ case "v" :
163
+ case "w" :
164
+ case "x" :
165
+ case "y" :
166
+ case "z" :
167
+ return c;
168
+ default:
169
+ return "-";
170
+ }
171
+ }).join("");
172
+ return `component-manifest-` + slug + `.json`;
173
+ }
174
+
122
175
  function curate(structures, selections) {
123
176
  return Stdlib_Result.map(Stdlib_Array.reduce(selections, {
124
177
  TAG: "Ok",
@@ -151,6 +204,9 @@ export {
151
204
  isSelected,
152
205
  referencedEntities,
153
206
  curateStructure,
207
+ defaultKey,
208
+ urlForKey,
209
+ journeyKey,
154
210
  curate,
155
211
  }
156
212
  /* No side effect */