@reventlessdev/reventless-aws 3.0.0-alpha.246 → 3.0.0-alpha.248

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 (32) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/package.json +7 -7
  3. package/src/Platform.res +4 -1
  4. package/src/Platform.res.mjs +2 -2
  5. package/src/adapter/Api/Platform_ComponentDefinitions_Lambda.res.mjs +1 -1
  6. package/src/adapter/Api/Platform_UIFragments_Lambda.res.mjs +1 -1
  7. package/src/adapter/Counter/CounterHandler_DynamoDbStream.res.mjs +2 -2
  8. package/src/adapter/EventLogSubscription/EventLogSubscription_AppSync.res.mjs +1 -1
  9. package/src/adapter/Geocoder/Geocoder_AwsLocation.res.mjs +1 -1
  10. package/src/adapter/QueryDb/PgQueryResolver_Builder.res.mjs +1 -1
  11. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res.mjs +4 -4
  12. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res.mjs +4 -4
  13. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res.mjs +2 -2
  14. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res.mjs +2 -2
  15. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +2 -2
  16. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs +2 -2
  17. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res.mjs +4 -4
  18. package/src/adapter/Runtime/EventCollectorRuntime_Builder_PerEventCollector.res.mjs +2 -2
  19. package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs +2 -2
  20. package/src/adapter/Runtime/ExtensionPointRuntime_Builder_PerExtensionPoint.res.mjs +2 -2
  21. package/src/adapter/Runtime/SideEffectHandlerRuntime_Builder_Single.res.mjs +1 -1
  22. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res.mjs +6 -6
  23. package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs +6 -6
  24. package/src/adapter/Runtime/TaskRuntime_Builder_PerBucket.res.mjs +1 -1
  25. package/src/adapter/StateTopic/StateTopic_AppSync.res.mjs +1 -1
  26. package/src/adapter/Upload/Upload_Presign_S3.res +9 -1
  27. package/src/adapter/Upload/Upload_Presign_S3.res.mjs +5 -2
  28. package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +3 -3
  29. package/src/util/Util_Bundle.res +33 -10
  30. package/src/util/Util_Bundle.res.mjs +20 -6
  31. package/tests/Util_BundleResolveTest.res +58 -0
  32. package/tests/Util_BundleResolveTest.res.mjs +54 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
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.248 (2026-07-30)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **aws:** name the presign CORS headers so authorized uploads pass preflight ([1034a4a](https://github.com/ReventlessDev/reventless-core/commit/1034a4ab82a5c3017daf5aaec0b789eb3dc2c0e1))
11
+
12
+
13
+ # 3.0.0-alpha.247 (2026-07-30)
14
+
15
+ ### Bug Fixes
16
+
17
+ * **aws:** resolve the host-shell bundle from the project that pins it ([8e12fb7](https://github.com/ReventlessDev/reventless-core/commit/8e12fb762795184086080b131397a111a0e75f03))
18
+
19
+
6
20
  # 3.0.0-alpha.246 (2026-07-30)
7
21
 
8
22
  **Note:** Version bump only for package @reventlessdev/reventless-aws
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-aws",
3
- "version": "3.0.0-alpha.246",
3
+ "version": "3.0.0-alpha.248",
4
4
  "description": "AWS adapters for Reventless",
5
5
  "license": "Apache-2.0",
6
6
  "dependencies": {
@@ -12,16 +12,16 @@
12
12
  "sury": "11.0.0-alpha.4",
13
13
  "uuid": "^13.0.0",
14
14
  "@reventlessdev/rescript-aws-sdk": "2.2.0-alpha.25",
15
+ "@reventlessdev/rescript-jest": "1.0.0-alpha.9",
15
16
  "@reventlessdev/rescript-effect": "0.1.0-alpha.31",
16
- "@reventlessdev/rescript-pulumi-aws": "2.4.0-alpha.61",
17
17
  "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.17",
18
- "@reventlessdev/rescript-jest": "1.0.0-alpha.9",
18
+ "@reventlessdev/rescript-pulumi-aws": "2.4.0-alpha.61",
19
19
  "@reventlessdev/rescript-uuid": "1.1.0-alpha.17",
20
- "@reventlessdev/reventless-infra": "3.0.0-alpha.112",
21
- "@reventlessdev/reventless-postgres": "3.0.0-alpha.58",
20
+ "@reventlessdev/reventless-core": "3.0.0-alpha.195",
21
+ "@reventlessdev/reventless-infra": "3.0.0-alpha.113",
22
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.88",
22
23
  "@reventlessdev/reventless-interop": "3.0.0-alpha.29",
23
- "@reventlessdev/reventless-core": "3.0.0-alpha.194",
24
- "@reventlessdev/reventless-spec": "3.0.0-alpha.87"
24
+ "@reventlessdev/reventless-postgres": "3.0.0-alpha.59"
25
25
  },
26
26
  "devDependencies": {
27
27
  "rescript": "12.3.0",
package/src/Platform.res CHANGED
@@ -1773,7 +1773,10 @@ module MakeWithConfig = (
1773
1773
  ~pluginId="host-ui",
1774
1774
  ~bundleVersion=cfg.bundleVersion->Option.getOr(version),
1775
1775
  ~assetsDir=cfg.assetsDir->Option.getOr(
1776
- Util_Bundle.resolvePackageRoot("@reventlessdev/reventless-host-shell") ++ "/dist",
1776
+ Util_Bundle.resolvePackageRoot(
1777
+ ~fromPulumiProject=true,
1778
+ "@reventlessdev/reventless-host-shell",
1779
+ ) ++ "/dist",
1777
1780
  ),
1778
1781
  ~spaFallback=true,
1779
1782
  ~stableName=true,
@@ -1029,7 +1029,7 @@ function MakeWithConfig(Config) {
1029
1029
  bucketRegionalDomainName: store.bucketRegionalDomainName
1030
1030
  }] : []
1031
1031
  ).concat(declaredServedBuckets);
1032
- let match$4 = Plugin_Stack$ReventlessAws.makeUiBundleDistribution("host-ui", Stdlib_Option.getOr(hostUiBundle.bundleVersion, version), Stdlib_Option.getOr(hostUiBundle.assetsDir, Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-host-shell") + "/dist"), true, undefined, true, [
1032
+ let match$4 = Plugin_Stack$ReventlessAws.makeUiBundleDistribution("host-ui", Stdlib_Option.getOr(hostUiBundle.bundleVersion, version), Stdlib_Option.getOr(hostUiBundle.assetsDir, Util_Bundle$ReventlessAws.resolvePackageRoot(true, "@reventlessdev/reventless-host-shell") + "/dist"), true, undefined, true, [
1033
1033
  "config.json",
1034
1034
  "ui-hints.json"
1035
1035
  ], customDomain, servedBuckets);
@@ -2184,7 +2184,7 @@ function Make($star) {
2184
2184
  bucketRegionalDomainName: store.bucketRegionalDomainName
2185
2185
  }] : []
2186
2186
  ).concat(declaredServedBuckets);
2187
- let match$4 = Plugin_Stack$ReventlessAws.makeUiBundleDistribution("host-ui", Stdlib_Option.getOr(hostUiBundle.bundleVersion, version), Stdlib_Option.getOr(hostUiBundle.assetsDir, Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-host-shell") + "/dist"), true, undefined, true, [
2187
+ let match$4 = Plugin_Stack$ReventlessAws.makeUiBundleDistribution("host-ui", Stdlib_Option.getOr(hostUiBundle.bundleVersion, version), Stdlib_Option.getOr(hostUiBundle.assetsDir, Util_Bundle$ReventlessAws.resolvePackageRoot(true, "@reventlessdev/reventless-host-shell") + "/dist"), true, undefined, true, [
2188
2188
  "config.json",
2189
2189
  "ui-hints.json"
2190
2190
  ], customDomain, servedBuckets);
@@ -52,7 +52,7 @@ function make(api, pluginReadModelTableName, opts) {
52
52
  let adminEntryJson = JSON.stringify(Platform_ComponentDefinitionsApi$ReventlessCore.encodePluginStructureEntry(Platform_Admin_Structure$ReventlessCore.pluginId, Platform_Admin_Structure$ReventlessCore.structure));
53
53
  let packageDirs = Object.fromEntries([[
54
54
  "@reventlessdev/reventless-aws",
55
- Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws")
55
+ Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws")
56
56
  ]]);
57
57
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Api/Platform_ComponentDefinitions_Lambda_Ops.res.mjs", packageDirs, undefined);
58
58
  let layers = Stdlib_Option.getOr(Stdlib_Option.map(Lambda$PulumiAws.reventlessLayerArn, arn => [arn]), []);
@@ -49,7 +49,7 @@ function make(api, uiFragmentRegistryTableName, schemaReady, opts) {
49
49
  });
50
50
  let packageDirs = Object.fromEntries([[
51
51
  "@reventlessdev/reventless-aws",
52
- Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws")
52
+ Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws")
53
53
  ]]);
54
54
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Api/Platform_UIFragments_Lambda_Ops.res.mjs", packageDirs, undefined);
55
55
  let layers = Stdlib_Option.getOr(Stdlib_Option.map(Lambda$PulumiAws.reventlessLayerArn, arn => [arn]), []);
@@ -32,8 +32,8 @@ function make(name, referencesName, referencesDb, countsName, countsDb, param, s
32
32
  let packageDirs = {};
33
33
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(specModulePath);
34
34
  let mappingsPkg = Util_Bundle$ReventlessAws.extractPackageName(mappingsModulePath);
35
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
36
- packageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(mappingsPkg);
35
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
36
+ packageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, mappingsPkg);
37
37
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/CounterEntryPoint.mjs", packageDirs, undefined);
38
38
  let componentOpts_parent = opts.parent;
39
39
  let componentOpts = {
@@ -87,7 +87,7 @@ function make(name, topicName, eventTopicOutputs, eventsApi, opts) {
87
87
  let channelName = channelNameOf(topicName);
88
88
  let packageDirs = Object.fromEntries([[
89
89
  "@reventlessdev/reventless-aws",
90
- Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws")
90
+ Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws")
91
91
  ]]);
92
92
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/EventLogSubscription/EventLogSubscription_AppSync_Ops.res.mjs", packageDirs, undefined);
93
93
  let layers = Stdlib_Option.getOr(Stdlib_Option.map(Lambda$PulumiAws.reventlessLayerArn, arn => [arn]), []);
@@ -43,7 +43,7 @@ function make(placeIndexName, corsOriginsOpt, opts) {
43
43
  });
44
44
  let packageDirs = Object.fromEntries([[
45
45
  "@reventlessdev/reventless-aws",
46
- Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws")
46
+ Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws")
47
47
  ]]);
48
48
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Geocoder/Geocoder_AwsLocation_Ops.res.mjs", packageDirs, undefined);
49
49
  let layers = Stdlib_Option.getOr(Stdlib_Option.map(Lambda$PulumiAws.reventlessLayerArn, arn => [arn]), []);
@@ -70,7 +70,7 @@ function provision(api, selection, opts) {
70
70
  let packageDirs = {};
71
71
  handlers.forEach(param => {
72
72
  let pkg = Util_Bundle$ReventlessAws.extractPackageName(param[1]);
73
- packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(pkg);
73
+ packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, pkg);
74
74
  });
75
75
  let handlerJsons = handlers.toSorted((param, param$1) => Primitive_string.compare(param[0].readModelName, param$1[0].readModelName)).map(param => {
76
76
  let entry = param[0];
@@ -161,8 +161,8 @@ function finish() {
161
161
  let packageDirs = {};
162
162
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
163
163
  let behaviorPkg = Util_Bundle$ReventlessAws.extractPackageName(info.behaviorModulePath);
164
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
165
- packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(behaviorPkg);
164
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
165
+ packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, behaviorPkg);
166
166
  let specModule = Stdlib_Option.getOr(JSON.stringify(info.specModulePath), `""`);
167
167
  let behaviorModule = Stdlib_Option.getOr(JSON.stringify(info.behaviorModulePath), `""`);
168
168
  let pluginFragment = Util_LogAttribution$ReventlessAws.pluginFragment(`AggregateRuntime(` + spec.aggregateName + `)`);
@@ -207,8 +207,8 @@ function finish() {
207
207
  let evtMapperPackageDirs = {};
208
208
  let specPkg$1 = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
209
209
  let mappingsPkg = Util_Bundle$ReventlessAws.extractPackageName(match$3);
210
- evtMapperPackageDirs[specPkg$1] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg$1);
211
- evtMapperPackageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(mappingsPkg);
210
+ evtMapperPackageDirs[specPkg$1] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg$1);
211
+ evtMapperPackageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, mappingsPkg);
212
212
  let match$4 = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/EventMapperEntryPoint.mjs", evtMapperPackageDirs, undefined);
213
213
  let evtMapperName = baseName + "EventMapper";
214
214
  let evtMapperRuntime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset(evtMapperName, "CommandHandler", "Aggregate", match$4.code, match$4.sourceCodeHash, evtMapperEnvVars, Math.max(spec.eventCollectorMemorySize, 2048), Math.max(spec.eventCollectorTimeout, 180), undefined, undefined, undefined, undefined, undefined, aggregateOpts);
@@ -161,8 +161,8 @@ function finish() {
161
161
  let packageDirs = {};
162
162
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
163
163
  let behaviorPkg = Util_Bundle$ReventlessAws.extractPackageName(info.behaviorModulePath);
164
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
165
- packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(behaviorPkg);
164
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
165
+ packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, behaviorPkg);
166
166
  let specModule = Stdlib_Option.getOr(JSON.stringify(info.specModulePath), `""`);
167
167
  let behaviorModule = Stdlib_Option.getOr(JSON.stringify(info.behaviorModulePath), `""`);
168
168
  let pluginFragment = Util_LogAttribution$ReventlessAws.pluginFragment(`AggregateRuntime(` + spec.aggregateName + `)`);
@@ -208,8 +208,8 @@ function finish() {
208
208
  let evtMapperPackageDirs = {};
209
209
  let specPkg$1 = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
210
210
  let mappingsPkg = Util_Bundle$ReventlessAws.extractPackageName(match$3);
211
- evtMapperPackageDirs[specPkg$1] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg$1);
212
- evtMapperPackageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(mappingsPkg);
211
+ evtMapperPackageDirs[specPkg$1] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg$1);
212
+ evtMapperPackageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, mappingsPkg);
213
213
  let match$4 = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/EventMapperEntryPoint.mjs", evtMapperPackageDirs, undefined);
214
214
  let evtMapperName = baseName + "EventMapper";
215
215
  let evtMapperRuntime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset(evtMapperName, "CommandHandler", "Aggregate", match$4.code, match$4.sourceCodeHash, evtMapperEnvVars, Math.max(spec.eventCollectorMemorySize, 2048), Math.max(spec.eventCollectorTimeout, 180), undefined, undefined, undefined, undefined, undefined, aggregateOpts);
@@ -151,8 +151,8 @@ function finish() {
151
151
  let packageDirs = {};
152
152
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
153
153
  let behaviorPkg = Util_Bundle$ReventlessAws.extractPackageName(info.behaviorModulePath);
154
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
155
- packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(behaviorPkg);
154
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
155
+ packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, behaviorPkg);
156
156
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/AggregateEntryPoint.mjs", packageDirs, undefined);
157
157
  let runtime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset(lambdaName, "CommandHandler", "Aggregate", match.code, match.sourceCodeHash, envVars, spec.memorySize, spec.timeout, undefined, undefined, undefined, undefined, undefined, aggregateOpts);
158
158
  spec.connects.forEach(connect => connect(runtime));
@@ -151,8 +151,8 @@ function finish() {
151
151
  let packageDirs = {};
152
152
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
153
153
  let behaviorPkg = Util_Bundle$ReventlessAws.extractPackageName(info.behaviorModulePath);
154
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
155
- packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(behaviorPkg);
154
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
155
+ packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, behaviorPkg);
156
156
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/AggregateEntryPoint.mjs", packageDirs, undefined);
157
157
  let runtime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset(name, "CommandHandler", "Aggregate", match.code, match.sourceCodeHash, envVars, spec.memorySize, spec.timeout, undefined, undefined, undefined, undefined, undefined, aggregateOpts);
158
158
  spec.connects.forEach(connect => connect(runtime));
@@ -171,8 +171,8 @@ function finish() {
171
171
  }
172
172
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
173
173
  let behaviorPkg = Util_Bundle$ReventlessAws.extractPackageName(info.behaviorModulePath);
174
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
175
- packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(behaviorPkg);
174
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
175
+ packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, behaviorPkg);
176
176
  let specModule = Stdlib_Option.getOr(JSON.stringify(info.specModulePath), `""`);
177
177
  let behaviorModule = Stdlib_Option.getOr(JSON.stringify(info.behaviorModulePath), `""`);
178
178
  let pluginFragment = Util_LogAttribution$ReventlessAws.pluginFragment(`AggregateRuntime(` + spec.aggregateName + `)`);
@@ -163,8 +163,8 @@ function finish() {
163
163
  }
164
164
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
165
165
  let behaviorPkg = Util_Bundle$ReventlessAws.extractPackageName(info.behaviorModulePath);
166
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
167
- packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(behaviorPkg);
166
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
167
+ packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, behaviorPkg);
168
168
  let specModule = Stdlib_Option.getOr(JSON.stringify(info.specModulePath), `""`);
169
169
  let behaviorModule = Stdlib_Option.getOr(JSON.stringify(info.behaviorModulePath), `""`);
170
170
  let pluginFragment = Util_LogAttribution$ReventlessAws.pluginFragment(`AggregateRuntime(` + spec.aggregateName + `)`);
@@ -108,9 +108,9 @@ function finish() {
108
108
  return log.warn("AutomationSliceRuntime_Builder_Single", undefined, `no bundled info registered for ` + spec.componentName);
109
109
  }
110
110
  let pkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
111
- packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(pkg);
111
+ packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, pkg);
112
112
  let bodyPkg = Util_Bundle$ReventlessAws.extractPackageName(info.bodyModulePath);
113
- packageDirs[bodyPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(bodyPkg);
113
+ packageDirs[bodyPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, bodyPkg);
114
114
  let specModule = Stdlib_Option.getOr(JSON.stringify(info.specModulePath), `""`);
115
115
  let bodyModule = Stdlib_Option.getOr(JSON.stringify(info.bodyModulePath), `""`);
116
116
  let callbackType = Stdlib_Option.getOr(JSON.stringify(info.callbackType), `""`);
@@ -170,9 +170,9 @@ function finishWithDcbEventLog(dcbEventLog) {
170
170
  allQueryDbResources.push(r);
171
171
  });
172
172
  let pkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
173
- packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(pkg);
173
+ packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, pkg);
174
174
  let bodyPkg = Util_Bundle$ReventlessAws.extractPackageName(info.bodyModulePath);
175
- packageDirs[bodyPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(bodyPkg);
175
+ packageDirs[bodyPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, bodyPkg);
176
176
  let specModule = Stdlib_Option.getOr(JSON.stringify(info.specModulePath), `""`);
177
177
  let bodyModule = Stdlib_Option.getOr(JSON.stringify(info.bodyModulePath), `""`);
178
178
  let callbackType = Stdlib_Option.getOr(JSON.stringify(info.callbackType), `""`);
@@ -60,8 +60,8 @@ function forEventCollector(param, eventTopics, resources, memorySizeOpt, timeout
60
60
  let packageDirs = {};
61
61
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
62
62
  let mappingsPkg = Util_Bundle$ReventlessAws.extractPackageName(info.mappingsModulePath);
63
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
64
- packageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(mappingsPkg);
63
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
64
+ packageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, mappingsPkg);
65
65
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/ReadModelEntryPoint.mjs", packageDirs, undefined);
66
66
  let runtime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset(name, "EventCollector", "EventCollector", match.code, match.sourceCodeHash, envVars, memorySize, timeout, undefined, undefined, undefined, undefined, undefined, opts);
67
67
  EventCollectorChannel_DynamoDbStream$ReventlessAws.connect(name, [{
@@ -118,8 +118,8 @@ function finish() {
118
118
  }
119
119
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
120
120
  let mappingsPkg = Util_Bundle$ReventlessAws.extractPackageName(info.mappingsModulePath);
121
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
122
- packageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(mappingsPkg);
121
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
122
+ packageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, mappingsPkg);
123
123
  let specModule = Stdlib_Option.getOr(JSON.stringify(info.specModulePath), `""`);
124
124
  let mappingsModule = Stdlib_Option.getOr(JSON.stringify(info.mappingsModulePath), `""`);
125
125
  let handlerPgFragment = info.pgBacked ? pgConnectionFragment : Pulumi.output("");
@@ -36,8 +36,8 @@ function forCommandTopic(param, connect, memorySizeOpt, timeoutOpt, specModuleUr
36
36
  let packageDirs = {};
37
37
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(specModulePath);
38
38
  let mappingsPkg = Util_Bundle$ReventlessAws.extractPackageName(mappingsModulePath);
39
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
40
- packageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(mappingsPkg);
39
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
40
+ packageDirs[mappingsPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, mappingsPkg);
41
41
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/ExtensionPointEntryPoint.mjs", packageDirs, undefined);
42
42
  return connect(RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset(name, "CommandHandler", "ExtensionPoint", match.code, match.sourceCodeHash, envVars, memorySize, timeout, undefined, undefined, undefined, undefined, undefined, opts));
43
43
  }
@@ -99,7 +99,7 @@ function finish() {
99
99
  }
100
100
  info.sideEffectModulePaths.forEach(modPath => {
101
101
  let pkg = Util_Bundle$ReventlessAws.extractPackageName(modPath);
102
- packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(pkg);
102
+ packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, pkg);
103
103
  });
104
104
  let modulesJson = info.sideEffectModulePaths.map(p => Stdlib_Option.getOr(JSON.stringify(p), `""`)).join(",");
105
105
  let attribution = Util_LogAttribution$ReventlessAws.fragments(`SideEffectHandler(` + spec.componentName + `)`);
@@ -82,18 +82,18 @@ function forDcbCommandTopic(slicePaths, inboundSlicesOpt, dcbTableName, pluginNa
82
82
  let packageDirs = {};
83
83
  slicePaths.forEach(param => {
84
84
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(param[0]);
85
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
85
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
86
86
  let behaviorPkg = Util_Bundle$ReventlessAws.extractPackageName(param[1]);
87
- packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(behaviorPkg);
87
+ packageDirs[behaviorPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, behaviorPkg);
88
88
  });
89
89
  inboundSlices.forEach(s => {
90
90
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(s.specPath);
91
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
91
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
92
92
  let translationPkg = Util_Bundle$ReventlessAws.extractPackageName(s.translationPath);
93
- packageDirs[translationPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(translationPkg);
93
+ packageDirs[translationPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, translationPkg);
94
94
  });
95
- packageDirs["@reventlessdev/reventless-aws"] = Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws");
96
- packageDirs["@reventlessdev/reventless-core"] = Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-core");
95
+ packageDirs["@reventlessdev/reventless-aws"] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws");
96
+ packageDirs["@reventlessdev/reventless-core"] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-core");
97
97
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/DcbCommandTopicEntryPoint.mjs", packageDirs, undefined);
98
98
  Stdlib_Option.forEach(cfg.sqsBatchSize, CommandTopicChannel_SQS$ReventlessAws.setBatchSize);
99
99
  let vpcConfig = pgSelection !== undefined ? pgSelection.securityGroupId.apply(sgId => ({
@@ -151,8 +151,8 @@ function buildLambda(parent, handlerOutputs, packageDirs, channelSpecs, feedQueu
151
151
  if (pgStreamConfig !== undefined) {
152
152
  envVars["APPSYNC_ENDPOINT"] = pgStreamConfig.endpoint;
153
153
  }
154
- packageDirs["@reventlessdev/reventless-aws"] = Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws");
155
- packageDirs["@reventlessdev/reventless-core"] = Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-core");
154
+ packageDirs["@reventlessdev/reventless-aws"] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws");
155
+ packageDirs["@reventlessdev/reventless-core"] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-core");
156
156
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/StateViewSliceEntryPoint.mjs", packageDirs, undefined);
157
157
  let vpcConfig = qdbSelection !== undefined ? qdbSelection.securityGroupId.apply(sgId => ({
158
158
  subnetIds: qdbSelection.subnetIds,
@@ -216,9 +216,9 @@ function finishWithDcbEventLog(dcbEventLog) {
216
216
  allQueryDbResources.push(r);
217
217
  });
218
218
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
219
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
219
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
220
220
  let projectionPkg = Util_Bundle$ReventlessAws.extractPackageName(info.projectionModulePath);
221
- packageDirs[projectionPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(projectionPkg);
221
+ packageDirs[projectionPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, projectionPkg);
222
222
  let etResources = dcbOutputs.eventTopic.resources;
223
223
  let resource = etResources[0];
224
224
  let sourceUrn = resource !== undefined ? resource.urn : feedArnOutput;
@@ -274,9 +274,9 @@ function finish() {
274
274
  return log.warn("StateViewSliceRuntime_Builder_Single", undefined, `no handler registered for ` + spec.componentName);
275
275
  }
276
276
  let specPkg = Util_Bundle$ReventlessAws.extractPackageName(info.specModulePath);
277
- packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(specPkg);
277
+ packageDirs[specPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, specPkg);
278
278
  let projectionPkg = Util_Bundle$ReventlessAws.extractPackageName(info.projectionModulePath);
279
- packageDirs[projectionPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(projectionPkg);
279
+ packageDirs[projectionPkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, projectionPkg);
280
280
  let handlerJson = Pulumi.all([
281
281
  info.queryDbTableName,
282
282
  spec.sourceUrns,
@@ -27,7 +27,7 @@ function forBucketCallback(param, connect, memorySizeOpt, timeoutOpt, name, call
27
27
  envVars["HANDLER_CONFIG"] = handlerConfigJson;
28
28
  let packageDirs = {};
29
29
  let pkg = Util_Bundle$ReventlessAws.extractPackageName(callbackModulePath);
30
- packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(pkg);
30
+ packageDirs[pkg] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, pkg);
31
31
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Runtime/TaskBucketEntryPoint.mjs", packageDirs, undefined);
32
32
  let runtime = RuntimeEnvironment_Lambda$ReventlessAws.makeFromCodeAsset(fullName, "Task", "Task", match.code, match.sourceCodeHash, envVars, memorySize, timeout, undefined, undefined, undefined, undefined, undefined, {
33
33
  parent: resource
@@ -84,7 +84,7 @@ function finish(eventsApi, opts) {
84
84
  });
85
85
  let packageDirs = Object.fromEntries([[
86
86
  "@reventlessdev/reventless-aws",
87
- Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws")
87
+ Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws")
88
88
  ]]);
89
89
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/StateTopic/StateTopic_AppSync_Ops.res.mjs", packageDirs, undefined);
90
90
  let layers = Stdlib_Option.getOr(Stdlib_Option.map(Lambda$PulumiAws.reventlessLayerArn, arn => [arn]), []);
@@ -171,7 +171,15 @@ let make = (
171
171
  {
172
172
  allowMethods: ["POST"]->Array.map(Pulumi.Input.make)->Pulumi.Input.make,
173
173
  allowOrigins: corsOrigins->Array.map(Pulumi.Input.make)->Pulumi.Input.make,
174
- allowHeaders: ["*"]->Array.map(Pulumi.Input.make)->Pulumi.Input.make,
174
+ // `content-type` and `authorization` named explicitly rather than `*`:
175
+ // `Access-Control-Allow-Headers: *` is a wildcard that, per the Fetch
176
+ // spec, does NOT cover `Authorization`. The presign POST carries a
177
+ // bearer token, so a wildcard fails its preflight and the browser
178
+ // rejects the request before it is sent — a silent break for every
179
+ // authenticated upload.
180
+ allowHeaders: ["content-type", "authorization"]
181
+ ->Array.map(Pulumi.Input.make)
182
+ ->Pulumi.Input.make,
175
183
  }: FunctionUrl.cors
176
184
  )->Pulumi.Input.make,
177
185
  },
@@ -46,7 +46,7 @@ function make(bucketName, corsOriginsOpt, servedPrefixOpt, nameOpt, opts) {
46
46
  });
47
47
  let packageDirs = Object.fromEntries([[
48
48
  "@reventlessdev/reventless-aws",
49
- Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws")
49
+ Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws")
50
50
  ]]);
51
51
  let match = Util_Bundle$ReventlessAws.buildCodeArchive("@reventlessdev/reventless-aws/src/adapter/Upload/Upload_Presign_S3_Ops.res.mjs", packageDirs, undefined);
52
52
  let layers = Stdlib_Option.getOr(Stdlib_Option.map(Lambda$PulumiAws.reventlessLayerArn, arn => [arn]), []);
@@ -89,7 +89,10 @@ function make(bucketName, corsOriginsOpt, servedPrefixOpt, nameOpt, opts) {
89
89
  authorizationType: "NONE",
90
90
  functionName: lambda.name,
91
91
  cors: {
92
- allowHeaders: ["*"].map(prim => prim),
92
+ allowHeaders: [
93
+ "content-type",
94
+ "authorization"
95
+ ].map(prim => prim),
93
96
  allowMethods: ["POST"].map(prim => prim),
94
97
  allowOrigins: corsOrigins.map(prim => prim)
95
98
  }
@@ -309,7 +309,7 @@ function Make(EventCollectorChannel) {
309
309
  let packageDirs = {};
310
310
  let addPackageFor = spec => {
311
311
  let pkgName = Util_Bundle$ReventlessAws.extractPackageName(spec);
312
- packageDirs[pkgName] = Util_Bundle$ReventlessAws.resolvePackageRoot(pkgName);
312
+ packageDirs[pkgName] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, pkgName);
313
313
  };
314
314
  context.extensions.forEach(ext => {
315
315
  [
@@ -331,8 +331,8 @@ function Make(EventCollectorChannel) {
331
331
  ce.mappingsModule
332
332
  ].forEach(addPackageFor);
333
333
  }
334
- packageDirs["@reventlessdev/reventless-aws"] = Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-aws");
335
- packageDirs["@reventlessdev/reventless-core"] = Util_Bundle$ReventlessAws.resolvePackageRoot("@reventlessdev/reventless-core");
334
+ packageDirs["@reventlessdev/reventless-aws"] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-aws");
335
+ packageDirs["@reventlessdev/reventless-core"] = Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, "@reventlessdev/reventless-core");
336
336
  let bundleOutput = Pulumi.all([
337
337
  context.pluginDefinitionJson,
338
338
  context.uiFragmentsJson
@@ -89,20 +89,43 @@ let extractPackageName = (specifier: string): string => {
89
89
  /**
90
90
  * Resolve the root directory of an npm package.
91
91
  * Fast path: populated by getModuleSpecifier when it walks the package tree.
92
+ *
93
+ * Two rootings, because two different questions are being asked.
94
+ *
95
+ * The default resolves from this framework module. That is right for anything
96
+ * the framework itself depends on and then packages — a Lambda's runtime deps
97
+ * are reventless-aws's own, and the version reventless-aws was built against is
98
+ * the version that must ship.
99
+ *
100
+ * `~fromPulumiProject=true` resolves from the Pulumi project's directory
101
+ * instead (`pulumi up --cwd <project>` runs the program there), which is what a
102
+ * *deploy input* needs: an asset the project names in its own package.json and
103
+ * the framework merely uploads. The framework has no dependency on it, so a
104
+ * framework-rooted lookup skips the project's pin entirely and walks up to
105
+ * whatever the workspace hoisted — which is how a platform pinning
106
+ * host-shell 3.0.0-alpha.49 deployed 3.0.0-alpha.48 while four sibling examples
107
+ * pinned the older one. Node still walks up from the project, so a project that
108
+ * declares nothing keeps resolving exactly as before.
109
+ *
110
+ * The two are cached under separate keys: they are allowed to disagree, and
111
+ * that disagreement is the whole point.
92
112
  */
93
- let resolvePackageRoot = (packageName: string): string => {
94
- switch packageRootCache->Dict.get(packageName) {
113
+ let resolvePackageRoot = (~fromPulumiProject: bool=false, packageName: string): string => {
114
+ let cacheKey = fromPulumiProject ? "pulumi-project:" ++ packageName : packageName
115
+ switch packageRootCache->Dict.get(cacheKey) {
95
116
  | Some(cachedRoot) => cachedRoot
96
117
  | None =>
97
- try {
98
- let pkgJsonPath = localRequire->requireResolve(packageName ++ "/package.json")
99
- dirname(pkgJsonPath)
100
- } catch {
101
- | _ =>
102
- let cwdRequire = createRequire(cwd() ++ "/index.js")
103
- let pkgJsonPath = cwdRequire->requireResolve(packageName ++ "/package.json")
104
- dirname(pkgJsonPath)
118
+ let request = packageName ++ "/package.json"
119
+ let viaFramework = () => dirname(localRequire->requireResolve(request))
120
+ let viaPulumiProject = () => dirname(createRequire(cwd() ++ "/index.js")->requireResolve(request))
121
+ let (preferred, fallback) = fromPulumiProject
122
+ ? (viaPulumiProject, viaFramework)
123
+ : (viaFramework, viaPulumiProject)
124
+ let root = try preferred() catch {
125
+ | _ => fallback()
105
126
  }
127
+ packageRootCache->Dict.set(cacheKey, root)
128
+ root
106
129
  }
107
130
  }
108
131
 
@@ -61,17 +61,31 @@ function extractPackageName(specifier) {
61
61
  }
62
62
  }
63
63
 
64
- function resolvePackageRoot(packageName) {
65
- let cachedRoot = packageRootCache[packageName];
64
+ function resolvePackageRoot(fromPulumiProjectOpt, packageName) {
65
+ let fromPulumiProject = fromPulumiProjectOpt !== undefined ? fromPulumiProjectOpt : false;
66
+ let cacheKey = fromPulumiProject ? "pulumi-project:" + packageName : packageName;
67
+ let cachedRoot = packageRootCache[cacheKey];
66
68
  if (cachedRoot !== undefined) {
67
69
  return cachedRoot;
68
70
  }
71
+ let request = packageName + "/package.json";
72
+ let viaFramework = () => Path.dirname(localRequire.resolve(request));
73
+ let viaPulumiProject = () => Path.dirname(Module.createRequire(process.cwd() + "/index.js").resolve(request));
74
+ let match = fromPulumiProject ? [
75
+ viaPulumiProject,
76
+ viaFramework
77
+ ] : [
78
+ viaFramework,
79
+ viaPulumiProject
80
+ ];
81
+ let root;
69
82
  try {
70
- return Path.dirname(localRequire.resolve(packageName + "/package.json"));
83
+ root = match[0]();
71
84
  } catch (exn) {
72
- let cwdRequire = Module.createRequire(process.cwd() + "/index.js");
73
- return Path.dirname(cwdRequire.resolve(packageName + "/package.json"));
85
+ root = match[1]();
74
86
  }
87
+ packageRootCache[cacheKey] = root;
88
+ return root;
75
89
  }
76
90
 
77
91
  function hashString(str) {
@@ -174,7 +188,7 @@ function buildCodeArchive(entryPointModule, packageDirs, extraStringAssetsOpt) {
174
188
  let allPackageDirs;
175
189
  if ("@reventlessdev/reventless-aws" in packageDirs && !("effect" in packageDirs)) {
176
190
  let dirs = Object.assign({}, packageDirs);
177
- dirs["effect"] = resolvePackageRoot("effect");
191
+ dirs["effect"] = resolvePackageRoot(undefined, "effect");
178
192
  allPackageDirs = dirs;
179
193
  } else {
180
194
  allPackageDirs = packageDirs;
@@ -0,0 +1,58 @@
1
+ open JestGlobals
2
+
3
+ @module("fs") external mkdtempSync: string => string = "mkdtempSync"
4
+ @module("fs") external mkdirSync: (string, {"recursive": bool}) => unit = "mkdirSync"
5
+ @module("fs") external writeFileSync: (string, string) => unit = "writeFileSync"
6
+ @module("fs") external rmSync: (string, {"recursive": bool, "force": bool}) => unit = "rmSync"
7
+ @module("fs") external realpathSync: string => string = "realpathSync"
8
+ @module("path") external join2: (string, string) => string = "join"
9
+ @module("os") external tmpdir: unit => string = "tmpdir"
10
+ @val @scope("process") external chdir: string => unit = "chdir"
11
+ @val @scope("process") external cwd: unit => string = "cwd"
12
+
13
+ // A Pulumi project that pins a package the framework does not depend on: the
14
+ // shape of a host-shell bundle, which is the platform's deploy input rather
15
+ // than one of reventless-aws's own dependencies. realpath because macOS hands
16
+ // out /var/... symlinks for tmpdir while require.resolve reports /private/var.
17
+ let makeProject = (pkgName: string): (string, string) => {
18
+ let project = realpathSync(mkdtempSync(join2(tmpdir(), "pulumi-project-")))
19
+ let pkgDir = join2(join2(project, "node_modules"), pkgName)
20
+ mkdirSync(pkgDir, {"recursive": true})
21
+ writeFileSync(join2(pkgDir, "package.json"), `{"name":"${pkgName}","version":"9.9.9"}`)
22
+ (project, pkgDir)
23
+ }
24
+
25
+ describe("Util_Bundle.resolvePackageRoot", () => {
26
+ let pkgName = "pinned-by-the-project"
27
+ let (project, pkgDir) = makeProject(pkgName)
28
+ let originalCwd = cwd()
29
+ // The framework fast path: what getModuleSpecifier would have cached from
30
+ // walking reventless-aws's own tree.
31
+ let frameworkRoot = "/resolved/from/the/framework"
32
+
33
+ beforeAll(() => {
34
+ chdir(project)
35
+ Util_Bundle.packageRootCache->Dict.set(pkgName, frameworkRoot)
36
+ })
37
+
38
+ afterAll(() => {
39
+ chdir(originalCwd)
40
+ rmSync(project, {"recursive": true, "force": true})
41
+ })
42
+
43
+ testSync("framework-rooted by default", () =>
44
+ expect(Util_Bundle.resolvePackageRoot(pkgName))->toBe(frameworkRoot)
45
+ )
46
+
47
+ // The regression: one cache key meant the framework's answer was handed back
48
+ // for both questions, so a platform pinning a newer host-shell deployed
49
+ // whatever the workspace had hoisted instead.
50
+ testSync("~fromPulumiProject reads the project's own node_modules", () =>
51
+ expect(Util_Bundle.resolvePackageRoot(~fromPulumiProject=true, pkgName))->toBe(pkgDir)
52
+ )
53
+
54
+ testSync("the two answers are cached apart, not overwritten", () => {
55
+ let _ = Util_Bundle.resolvePackageRoot(~fromPulumiProject=true, pkgName)
56
+ expect(Util_Bundle.resolvePackageRoot(pkgName))->toBe(frameworkRoot)
57
+ })
58
+ })
@@ -0,0 +1,54 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Fs from "fs";
4
+ import * as Os from "os";
5
+ import * as Path from "path";
6
+ import * as Util_Bundle$ReventlessAws from "../src/util/Util_Bundle.res.mjs";
7
+
8
+ function makeProject(pkgName) {
9
+ let project = Fs.realpathSync(Fs.mkdtempSync(Path.join(Os.tmpdir(), "pulumi-project-")));
10
+ let pkgDir = Path.join(Path.join(project, "node_modules"), pkgName);
11
+ Fs.mkdirSync(pkgDir, {
12
+ recursive: true
13
+ });
14
+ Fs.writeFileSync(Path.join(pkgDir, "package.json"), `{"name":"` + pkgName + `","version":"9.9.9"}`);
15
+ return [
16
+ project,
17
+ pkgDir
18
+ ];
19
+ }
20
+
21
+ globalThis.describe("Util_Bundle.resolvePackageRoot", () => {
22
+ let pkgName = "pinned-by-the-project";
23
+ let match = makeProject(pkgName);
24
+ let pkgDir = match[1];
25
+ let project = match[0];
26
+ let originalCwd = process.cwd();
27
+ let frameworkRoot = "/resolved/from/the/framework";
28
+ globalThis.beforeAll(() => {
29
+ process.chdir(project);
30
+ Util_Bundle$ReventlessAws.packageRootCache[pkgName] = frameworkRoot;
31
+ });
32
+ globalThis.afterAll(() => {
33
+ process.chdir(originalCwd);
34
+ Fs.rmSync(project, {
35
+ recursive: true,
36
+ force: true
37
+ });
38
+ });
39
+ globalThis.test("framework-rooted by default", () => {
40
+ globalThis.expect(Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, pkgName)).toBe(frameworkRoot);
41
+ });
42
+ globalThis.test("~fromPulumiProject reads the project's own node_modules", () => {
43
+ globalThis.expect(Util_Bundle$ReventlessAws.resolvePackageRoot(true, pkgName)).toBe(pkgDir);
44
+ });
45
+ globalThis.test("the two answers are cached apart, not overwritten", () => {
46
+ Util_Bundle$ReventlessAws.resolvePackageRoot(true, pkgName);
47
+ globalThis.expect(Util_Bundle$ReventlessAws.resolvePackageRoot(undefined, pkgName)).toBe(frameworkRoot);
48
+ });
49
+ });
50
+
51
+ export {
52
+ makeProject,
53
+ }
54
+ /* Not a pure module */