@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.9 → 3.9.3-ultramodern.10

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 (275) hide show
  1. package/README.md +23 -0
  2. package/dist/cjs/backend-federation-build/codegen.js +29 -18
  3. package/dist/cjs/backend-federation-build/config.js +84 -45
  4. package/dist/cjs/backend-federation-build/emit.js +63 -22
  5. package/dist/cjs/build-config/build-environment.js +30 -165
  6. package/dist/cjs/build-config/internal-effect-discovery.js +231 -0
  7. package/dist/cjs/build-config/public.js +2 -5
  8. package/dist/cjs/build-config/remote-address.js +58 -0
  9. package/dist/cjs/cloudflare/artifacts.js +8 -19
  10. package/dist/cjs/cloudflare/delivery-unit.js +125 -43
  11. package/dist/cjs/cloudflare/index.js +14 -4
  12. package/dist/cjs/cloudflare/native-renderer.js +100 -0
  13. package/dist/cjs/cloudflare/renderer-identity.js +106 -0
  14. package/dist/cjs/cloudflare/worker-manifest.js +54 -13
  15. package/dist/cjs/cloudflare/worker-options.js +48 -0
  16. package/dist/cjs/cloudflare/wrangler-config.js +210 -13
  17. package/dist/cjs/cloudflare-builder.js +307 -89
  18. package/dist/cjs/cloudflare-output-contract.js +36 -4
  19. package/dist/cjs/cloudflare-output-verifier/identity.js +112 -23
  20. package/dist/cjs/cloudflare-output-verifier/index.js +10 -0
  21. package/dist/cjs/cloudflare-output-verifier/manifest.js +46 -0
  22. package/dist/cjs/cloudflare-output-verifier/mutation-policy.js +7 -1
  23. package/dist/cjs/cloudflare-output-verifier/worker-bundles.js +10 -5
  24. package/dist/cjs/config.js +10 -5
  25. package/dist/cjs/deploy-output/npmAliases.js +92 -6
  26. package/dist/cjs/deploy-output/plugin.js +27 -6
  27. package/dist/cjs/deploy-output/public-assets.js +146 -0
  28. package/dist/cjs/deploy-output/target.js +57 -1
  29. package/dist/cjs/deploy-output/trace-files.js +99 -0
  30. package/dist/cjs/module-federation-config/exposes.js +70 -0
  31. package/dist/cjs/module-federation-config/index.js +73 -0
  32. package/dist/cjs/module-federation-config/inspect.js +103 -0
  33. package/dist/cjs/module-federation-config/object-literal.js +87 -0
  34. package/dist/cjs/module-federation-config/syntax.js +151 -0
  35. package/dist/cjs/module-federation-config/types.js +18 -0
  36. package/dist/cjs/native-type-checker.js +180 -17
  37. package/dist/cjs/policy-defaults.js +38 -29
  38. package/dist/cjs/release-envelope/canonical.js +2 -9
  39. package/dist/cjs/release-envelope/contract.js +68 -0
  40. package/dist/cjs/release-envelope/framework-output.js +296 -105
  41. package/dist/cjs/release-envelope/index.js +150 -36
  42. package/dist/cjs/release-envelope/plugin.js +24 -15
  43. package/dist/cjs/release-envelope/renderer-output-stamp.js +170 -0
  44. package/dist/cjs/release-envelope/types.js +10 -8
  45. package/dist/cjs/release-identity.js +9 -6
  46. package/dist/cjs/renderer-build-identity.js +144 -0
  47. package/dist/cjs/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  48. package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  49. package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  50. package/dist/cjs/templates/cloudflare-entry.005-worker-dispatch.mjs +547 -103
  51. package/dist/cjs/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  52. package/dist/cjs/templates/cloudflare-worker-route-data.mjs +1069 -0
  53. package/dist/cjs/workspace-topology.js +84 -0
  54. package/dist/esm/backend-federation-build/codegen.mjs +29 -18
  55. package/dist/esm/backend-federation-build/config.mjs +74 -38
  56. package/dist/esm/backend-federation-build/emit.mjs +64 -23
  57. package/dist/esm/build-config/build-environment.mjs +31 -163
  58. package/dist/esm/build-config/internal-effect-discovery.mjs +187 -0
  59. package/dist/esm/build-config/public.mjs +1 -1
  60. package/dist/esm/build-config/remote-address.mjs +20 -0
  61. package/dist/esm/cloudflare/artifacts.mjs +8 -19
  62. package/dist/esm/cloudflare/delivery-unit.mjs +124 -45
  63. package/dist/esm/cloudflare/index.mjs +15 -5
  64. package/dist/esm/cloudflare/native-renderer.mjs +48 -0
  65. package/dist/esm/cloudflare/renderer-identity.mjs +57 -0
  66. package/dist/esm/cloudflare/worker-manifest.mjs +55 -14
  67. package/dist/esm/cloudflare/worker-options.mjs +10 -0
  68. package/dist/esm/cloudflare/wrangler-config.mjs +203 -12
  69. package/dist/esm/cloudflare-builder.mjs +301 -89
  70. package/dist/esm/cloudflare-output-contract.mjs +29 -3
  71. package/dist/esm/cloudflare-output-verifier/identity.mjs +113 -24
  72. package/dist/esm/cloudflare-output-verifier/index.mjs +10 -0
  73. package/dist/esm/cloudflare-output-verifier/manifest.mjs +46 -0
  74. package/dist/esm/cloudflare-output-verifier/mutation-policy.mjs +7 -1
  75. package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +11 -6
  76. package/dist/esm/config.mjs +3 -1
  77. package/dist/esm/deploy-output/npmAliases.mjs +92 -6
  78. package/dist/esm/deploy-output/plugin.mjs +24 -6
  79. package/dist/esm/deploy-output/public-assets.mjs +82 -0
  80. package/dist/esm/deploy-output/target.mjs +50 -3
  81. package/dist/esm/deploy-output/trace-files.mjs +47 -0
  82. package/dist/esm/module-federation-config/exposes.mjs +18 -0
  83. package/dist/esm/module-federation-config/index.mjs +4 -0
  84. package/dist/esm/module-federation-config/inspect.mjs +65 -0
  85. package/dist/esm/module-federation-config/object-literal.mjs +43 -0
  86. package/dist/esm/module-federation-config/syntax.mjs +101 -0
  87. package/dist/esm/module-federation-config/types.mjs +0 -0
  88. package/dist/esm/native-type-checker.mjs +175 -18
  89. package/dist/esm/policy-defaults.mjs +36 -30
  90. package/dist/esm/release-envelope/canonical.mjs +2 -9
  91. package/dist/esm/release-envelope/contract.mjs +21 -0
  92. package/dist/esm/release-envelope/framework-output.mjs +297 -106
  93. package/dist/esm/release-envelope/index.mjs +149 -38
  94. package/dist/esm/release-envelope/plugin.mjs +24 -15
  95. package/dist/esm/release-envelope/renderer-output-stamp.mjs +112 -0
  96. package/dist/esm/release-envelope/types.mjs +2 -3
  97. package/dist/esm/release-identity.mjs +9 -6
  98. package/dist/esm/renderer-build-identity.mjs +92 -0
  99. package/dist/esm/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  100. package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  101. package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  102. package/dist/esm/templates/cloudflare-entry.005-worker-dispatch.mjs +547 -103
  103. package/dist/esm/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  104. package/dist/esm/templates/cloudflare-worker-route-data.mjs +1069 -0
  105. package/dist/esm/workspace-topology.mjs +21 -0
  106. package/dist/esm-node/backend-federation-build/codegen.mjs +29 -18
  107. package/dist/esm-node/backend-federation-build/config.mjs +74 -38
  108. package/dist/esm-node/backend-federation-build/emit.mjs +64 -23
  109. package/dist/esm-node/build-config/build-environment.mjs +31 -163
  110. package/dist/esm-node/build-config/internal-effect-discovery.mjs +188 -0
  111. package/dist/esm-node/build-config/public.mjs +1 -1
  112. package/dist/esm-node/build-config/remote-address.mjs +21 -0
  113. package/dist/esm-node/cloudflare/artifacts.mjs +8 -19
  114. package/dist/esm-node/cloudflare/delivery-unit.mjs +124 -45
  115. package/dist/esm-node/cloudflare/index.mjs +15 -5
  116. package/dist/esm-node/cloudflare/native-renderer.mjs +49 -0
  117. package/dist/esm-node/cloudflare/renderer-identity.mjs +58 -0
  118. package/dist/esm-node/cloudflare/worker-manifest.mjs +55 -14
  119. package/dist/esm-node/cloudflare/worker-options.mjs +11 -0
  120. package/dist/esm-node/cloudflare/wrangler-config.mjs +203 -12
  121. package/dist/esm-node/cloudflare-builder.mjs +301 -89
  122. package/dist/esm-node/cloudflare-output-contract.mjs +29 -3
  123. package/dist/esm-node/cloudflare-output-verifier/identity.mjs +113 -24
  124. package/dist/esm-node/cloudflare-output-verifier/index.mjs +10 -0
  125. package/dist/esm-node/cloudflare-output-verifier/manifest.mjs +46 -0
  126. package/dist/esm-node/cloudflare-output-verifier/mutation-policy.mjs +7 -1
  127. package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +11 -6
  128. package/dist/esm-node/config.mjs +3 -1
  129. package/dist/esm-node/deploy-output/npmAliases.mjs +92 -6
  130. package/dist/esm-node/deploy-output/plugin.mjs +24 -6
  131. package/dist/esm-node/deploy-output/public-assets.mjs +83 -0
  132. package/dist/esm-node/deploy-output/target.mjs +50 -3
  133. package/dist/esm-node/deploy-output/trace-files.mjs +48 -0
  134. package/dist/esm-node/module-federation-config/exposes.mjs +19 -0
  135. package/dist/esm-node/module-federation-config/index.mjs +5 -0
  136. package/dist/esm-node/module-federation-config/inspect.mjs +66 -0
  137. package/dist/esm-node/module-federation-config/object-literal.mjs +44 -0
  138. package/dist/esm-node/module-federation-config/syntax.mjs +102 -0
  139. package/dist/esm-node/module-federation-config/types.mjs +1 -0
  140. package/dist/esm-node/native-type-checker.mjs +175 -18
  141. package/dist/esm-node/policy-defaults.mjs +36 -30
  142. package/dist/esm-node/release-envelope/canonical.mjs +2 -9
  143. package/dist/esm-node/release-envelope/contract.mjs +22 -0
  144. package/dist/esm-node/release-envelope/framework-output.mjs +297 -106
  145. package/dist/esm-node/release-envelope/index.mjs +149 -38
  146. package/dist/esm-node/release-envelope/plugin.mjs +24 -15
  147. package/dist/esm-node/release-envelope/renderer-output-stamp.mjs +113 -0
  148. package/dist/esm-node/release-envelope/types.mjs +2 -3
  149. package/dist/esm-node/release-identity.mjs +9 -6
  150. package/dist/esm-node/renderer-build-identity.mjs +93 -0
  151. package/dist/esm-node/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  152. package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  153. package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  154. package/dist/esm-node/templates/cloudflare-entry.005-worker-dispatch.mjs +547 -103
  155. package/dist/esm-node/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  156. package/dist/esm-node/templates/cloudflare-worker-route-data.mjs +1069 -0
  157. package/dist/esm-node/workspace-topology.mjs +22 -0
  158. package/dist/types/backend-federation-build/codegen.d.ts +30 -0
  159. package/dist/types/backend-federation-build/config.d.ts +10 -57
  160. package/dist/types/backend-federation-build/emit.d.ts +12 -2
  161. package/dist/types/backend-federation-build/index.d.ts +1 -1
  162. package/dist/types/build-config/build-environment.d.ts +4 -10
  163. package/dist/types/build-config/internal-effect-discovery.d.ts +6 -0
  164. package/dist/types/build-config/public.d.ts +1 -1
  165. package/dist/types/build-config/remote-address.d.ts +3 -0
  166. package/dist/types/cloudflare/artifacts.d.ts +7 -6
  167. package/dist/types/cloudflare/constants.d.ts +1 -1
  168. package/dist/types/cloudflare/delivery-unit.d.ts +38 -7
  169. package/dist/types/cloudflare/native-renderer.d.ts +30 -0
  170. package/dist/types/cloudflare/renderer-identity.d.ts +25 -0
  171. package/dist/types/cloudflare/worker-manifest.d.ts +20 -4
  172. package/dist/types/cloudflare/worker-options.d.ts +20 -0
  173. package/dist/types/cloudflare/wrangler-config.d.ts +55 -2
  174. package/dist/types/cloudflare-builder.d.ts +51 -8
  175. package/dist/types/cloudflare-output-contract.d.ts +5 -3
  176. package/dist/types/cloudflare-output-verifier/identity.d.ts +7 -3
  177. package/dist/types/cloudflare-output-verifier/worker-bundles.d.ts +2 -2
  178. package/dist/types/config.d.ts +102 -13
  179. package/dist/types/deploy-output/plugin.d.ts +29 -9
  180. package/dist/types/deploy-output/public-assets.d.ts +51 -0
  181. package/dist/types/deploy-output/target.d.ts +28 -5
  182. package/dist/types/deploy-output/trace-files.d.ts +17 -0
  183. package/dist/types/module-federation-config/exposes.d.ts +11 -0
  184. package/dist/types/module-federation-config/index.d.ts +5 -0
  185. package/dist/types/module-federation-config/inspect.d.ts +2 -0
  186. package/dist/types/module-federation-config/object-literal.d.ts +4 -0
  187. package/dist/types/module-federation-config/syntax.d.ts +7 -0
  188. package/dist/types/module-federation-config/types.d.ts +20 -0
  189. package/dist/types/native-type-checker.d.ts +28 -3
  190. package/dist/types/policy-defaults.d.ts +12 -2
  191. package/dist/types/release-envelope/canonical.d.ts +5 -5
  192. package/dist/types/release-envelope/contract.d.mts +8 -0
  193. package/dist/types/release-envelope/framework-output.d.ts +23 -13
  194. package/dist/types/release-envelope/index.d.ts +17 -5
  195. package/dist/types/release-envelope/plugin.d.ts +10 -6
  196. package/dist/types/release-envelope/renderer-output-stamp.d.ts +34 -0
  197. package/dist/types/release-envelope/types.d.ts +42 -4
  198. package/dist/types/release-identity.d.ts +13 -2
  199. package/dist/types/renderer-build-identity.d.ts +41 -0
  200. package/dist/types/templates/cloudflare-worker-route-data.d.mts +14 -0
  201. package/dist/types/workspace-topology.d.ts +91 -0
  202. package/package.json +87 -27
  203. package/src/backend-federation-build/codegen.ts +28 -19
  204. package/src/backend-federation-build/config.ts +189 -123
  205. package/src/backend-federation-build/emit.ts +119 -38
  206. package/src/backend-federation-build/index.ts +4 -1
  207. package/src/build-config/build-environment.ts +69 -293
  208. package/src/build-config/internal-effect-discovery.ts +458 -0
  209. package/src/build-config/public.ts +0 -1
  210. package/src/build-config/remote-address.ts +33 -0
  211. package/src/cloudflare/artifacts.ts +22 -43
  212. package/src/cloudflare/delivery-unit.ts +283 -60
  213. package/src/cloudflare/index.ts +35 -19
  214. package/src/cloudflare/native-renderer.ts +117 -0
  215. package/src/cloudflare/renderer-identity.ts +171 -0
  216. package/src/cloudflare/worker-manifest.ts +115 -13
  217. package/src/cloudflare/worker-options.ts +60 -0
  218. package/src/cloudflare/wrangler-config.ts +390 -14
  219. package/src/cloudflare-builder.ts +543 -170
  220. package/src/cloudflare-output-contract.ts +45 -2
  221. package/src/cloudflare-output-verifier/identity.ts +138 -7
  222. package/src/cloudflare-output-verifier/index.ts +20 -0
  223. package/src/cloudflare-output-verifier/manifest.ts +77 -0
  224. package/src/cloudflare-output-verifier/mutation-policy.ts +11 -1
  225. package/src/cloudflare-output-verifier/worker-bundles.ts +27 -11
  226. package/src/config.ts +105 -19
  227. package/src/deploy-output/npmAliases.ts +141 -4
  228. package/src/deploy-output/plugin.ts +55 -18
  229. package/src/deploy-output/public-assets.ts +224 -0
  230. package/src/deploy-output/target.ts +97 -14
  231. package/src/deploy-output/trace-files.ts +80 -0
  232. package/src/module-federation-config/exposes.ts +46 -0
  233. package/src/module-federation-config/index.ts +22 -0
  234. package/src/module-federation-config/inspect.ts +157 -0
  235. package/src/module-federation-config/object-literal.ts +76 -0
  236. package/src/module-federation-config/syntax.ts +212 -0
  237. package/src/module-federation-config/types.ts +22 -0
  238. package/src/native-type-checker.ts +284 -27
  239. package/src/policy-defaults.ts +47 -17
  240. package/src/release-envelope/canonical.ts +6 -18
  241. package/src/release-envelope/contract.mjs +28 -0
  242. package/src/release-envelope/framework-output.ts +681 -156
  243. package/src/release-envelope/index.ts +315 -60
  244. package/src/release-envelope/plugin.ts +54 -38
  245. package/src/release-envelope/renderer-output-stamp.ts +210 -0
  246. package/src/release-envelope/types.ts +75 -6
  247. package/src/release-identity.ts +30 -4
  248. package/src/renderer-build-identity.ts +208 -0
  249. package/src/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  250. package/src/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  251. package/src/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  252. package/src/templates/cloudflare-entry.005-worker-dispatch.mjs +547 -103
  253. package/src/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  254. package/src/templates/cloudflare-worker-route-data.mjs +1069 -0
  255. package/src/workspace-topology.ts +125 -0
  256. package/dist/cjs/templates/cloudflare-worker-fs-promises.mjs +0 -11
  257. package/dist/cjs/templates/cloudflare-worker-loadable-server.mjs +0 -281
  258. package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  259. package/dist/cjs/templates/cloudflare-worker-path.mjs +0 -98
  260. package/dist/esm/templates/cloudflare-worker-fs-promises.mjs +0 -11
  261. package/dist/esm/templates/cloudflare-worker-loadable-server.mjs +0 -281
  262. package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  263. package/dist/esm/templates/cloudflare-worker-path.mjs +0 -98
  264. package/dist/esm-node/templates/cloudflare-worker-fs-promises.mjs +0 -11
  265. package/dist/esm-node/templates/cloudflare-worker-loadable-server.mjs +0 -281
  266. package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  267. package/dist/esm-node/templates/cloudflare-worker-path.mjs +0 -98
  268. package/dist/types/templates/cloudflare-worker-fs-promises.d.mts +0 -5
  269. package/dist/types/templates/cloudflare-worker-loadable-server.d.mts +0 -48
  270. package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +0 -13
  271. package/dist/types/templates/cloudflare-worker-path.d.mts +0 -21
  272. package/src/templates/cloudflare-worker-fs-promises.mjs +0 -11
  273. package/src/templates/cloudflare-worker-loadable-server.mjs +0 -281
  274. package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  275. package/src/templates/cloudflare-worker-path.mjs +0 -98
@@ -1,4 +1,3 @@
1
- import { execFileSync } from 'node:child_process';
2
1
  import { createHash } from 'node:crypto';
3
2
  import {
4
3
  accessSync,
@@ -12,264 +11,62 @@ import {
12
11
  rmSync,
13
12
  writeFileSync,
14
13
  } from 'node:fs';
15
- import { createRequire } from 'node:module';
14
+ import { createRequire, findPackageJSON } from 'node:module';
16
15
  import { tmpdir } from 'node:os';
17
- import { basename, dirname, join, resolve } from 'node:path';
18
- import type { URL } from 'node:url';
19
- import type { Rspack } from '@rsbuild/core';
20
-
21
- const EFFECT_TSGO_PACKAGE = '@effect/tsgo';
22
- const EFFECT_TSGO_BIN = 'effect-tsgo';
23
- const EFFECT_TSGO_RESOLUTION_ERROR =
24
- 'Unable to resolve the Effect TS-Go compiler. Install "@effect/tsgo" and a native TypeScript backend for this build config, or set EFFECT_TSGO_BIN.';
25
- const executableEffectTsgoCompilers = new Map<string, string>();
26
- const BUILD_CONFIG_ENVIRONMENT_PLUGIN =
27
- 'ModernJsBuildConfigEnvironmentLeasePlugin';
28
- const ENVIRONMENT_LEASE_REGISTRY_KEY = Symbol.for(
29
- '@modern-js/app-tools/build-config-environment-lease-registry/v1',
30
- );
31
- const ENVIRONMENT_LEASE_REGISTRY_BRAND = Symbol.for(
32
- '@modern-js/app-tools/build-config-environment-lease-registry-brand/v1',
33
- );
34
- const LIFECYCLE_HOOK_NAMES = [
35
- 'run',
36
- 'watchRun',
37
- 'afterDone',
38
- 'failed',
39
- 'shutdown',
40
- 'watchClose',
41
- ] as const;
42
-
43
- type PackageJson = {
44
- bin?: Record<string, string> | string;
45
- };
46
-
47
- type EnvironmentLease = {
48
- originalValue: string | undefined;
49
- owners: Set<symbol>;
50
- value: string;
51
- };
52
-
53
- type EnvironmentLeaseRegistry = Readonly<{
54
- acquire: (name: string, value: string) => () => void;
55
- brand: symbol;
56
- }>;
57
-
58
- type LifecycleHookName = (typeof LIFECYCLE_HOOK_NAMES)[number];
59
-
60
- type LifecycleHook = {
61
- tap: (options: { name: string; stage: number }, handler: () => void) => void;
62
- };
63
-
64
- function restoreEnvironment(name: string, value: string | undefined): void {
65
- if (value === undefined) {
66
- delete process.env[name];
67
- } else {
68
- process.env[name] = value;
69
- }
70
- }
71
-
72
- function createEnvironmentLeaseRegistry(): EnvironmentLeaseRegistry {
73
- const environmentLeases = new Map<string, EnvironmentLease>();
74
-
75
- return Object.freeze({
76
- acquire(name: string, value: string): () => void {
77
- let lease = environmentLeases.get(name);
78
-
79
- if (lease) {
80
- if (lease.value !== value) {
81
- throw new Error(
82
- `Build config environment "${name}" already has an active lease for a different value.`,
83
- );
84
- }
85
- if (process.env[name] !== lease.value) {
86
- throw new Error(
87
- `Build config environment lease for "${name}" lost ownership before another lease was acquired.`,
88
- );
89
- }
90
- } else {
91
- lease = {
92
- originalValue: process.env[name],
93
- owners: new Set(),
94
- value,
95
- };
96
- process.env[name] = value;
97
- environmentLeases.set(name, lease);
98
- }
99
-
100
- const owner = Symbol(name);
101
- lease.owners.add(owner);
102
- let released = false;
103
-
104
- return () => {
105
- if (released) {
106
- return;
107
- }
108
-
109
- if (environmentLeases.get(name) !== lease || !lease.owners.has(owner)) {
110
- throw new Error(
111
- `Build config environment lease for "${name}" cannot be restored because its ownership record was lost.`,
112
- );
113
- }
114
-
115
- released = true;
116
- const lostOwnership = process.env[name] !== lease.value;
117
- lease.owners.delete(owner);
118
-
119
- if (lease.owners.size === 0) {
120
- environmentLeases.delete(name);
121
- restoreEnvironment(name, lease.originalValue);
122
- } else if (lostOwnership) {
123
- process.env[name] = lease.value;
124
- }
125
-
126
- if (lostOwnership) {
127
- throw new Error(
128
- `Build config environment lease for "${name}" lost ownership before restoration.`,
129
- );
130
- }
131
- };
132
- },
133
- brand: ENVIRONMENT_LEASE_REGISTRY_BRAND,
134
- });
135
- }
136
-
137
- function getEnvironmentLeaseRegistry(): EnvironmentLeaseRegistry {
138
- const descriptor = Object.getOwnPropertyDescriptor(
139
- process,
140
- ENVIRONMENT_LEASE_REGISTRY_KEY,
16
+ import { basename, join } from 'node:path';
17
+ import { pathToFileURL, type URL } from 'node:url';
18
+
19
+ // CJS and ESM consumers share the selected-cohort validator in one owning
20
+ // module, including packages whose public name changes during publication.
21
+ const owningModuleUrl =
22
+ process.env.MODERN_LIB_FORMAT === 'esm'
23
+ ? import.meta.url
24
+ : pathToFileURL(__filename).href;
25
+ const owningManifest = findPackageJSON(owningModuleUrl, owningModuleUrl);
26
+ if (!owningManifest)
27
+ throw new Error('Cannot find owning build-config package manifest');
28
+ const owningName: unknown = JSON.parse(
29
+ readFileSync(owningManifest, 'utf8'),
30
+ ).name;
31
+ if (typeof owningName !== 'string' || owningName.length === 0) {
32
+ throw new Error(
33
+ `Invalid owning build-config package name: ${owningManifest}`,
141
34
  );
142
-
143
- if (descriptor) {
144
- const registry = descriptor.value as
145
- | Partial<EnvironmentLeaseRegistry>
146
- | undefined;
147
- if (
148
- descriptor.configurable ||
149
- descriptor.enumerable ||
150
- descriptor.writable ||
151
- registry?.brand !== ENVIRONMENT_LEASE_REGISTRY_BRAND ||
152
- typeof registry.acquire !== 'function'
153
- ) {
154
- throw new Error(
155
- 'The process-global build config environment lease registry is occupied by an incompatible value.',
156
- );
157
- }
158
- return registry as EnvironmentLeaseRegistry;
159
- }
160
-
161
- const registry = createEnvironmentLeaseRegistry();
162
- Object.defineProperty(process, ENVIRONMENT_LEASE_REGISTRY_KEY, {
163
- configurable: false,
164
- enumerable: false,
165
- value: registry,
166
- writable: false,
167
- });
168
- return registry;
169
- }
170
-
171
- function acquireEnvironmentLease(name: string, value: string): () => void {
172
- return getEnvironmentLeaseRegistry().acquire(name, value);
173
35
  }
36
+ const {
37
+ effectCompilerDiscoveryFailureStage,
38
+ resolveInstalledEffectCompiler,
39
+ validateConfiguredEffectCompiler,
40
+ }: typeof import('./internal-effect-discovery') = createRequire(
41
+ owningModuleUrl,
42
+ )(`${owningName}/internal-effect-discovery`);
174
43
 
175
- function releaseAfterFailure(
176
- release: () => void,
177
- originalError: unknown,
178
- ): never {
179
- try {
180
- release();
181
- } catch (restorationError) {
182
- throw new AggregateError(
183
- [originalError, restorationError],
184
- 'Build config environment setup and restoration both failed.',
185
- );
186
- }
187
-
188
- throw originalError;
189
- }
190
-
191
- class BuildConfigEnvironmentLeasePlugin {
192
- constructor(private readonly release: () => void) {}
193
-
194
- apply(compiler: Rspack.Compiler): void {
195
- const hooks = compiler.hooks as unknown as Record<
196
- string,
197
- LifecycleHook | undefined
198
- >;
199
-
200
- try {
201
- const lifecycleHooks = {} as Record<LifecycleHookName, LifecycleHook>;
202
- for (const hookName of LIFECYCLE_HOOK_NAMES) {
203
- const hook = hooks[hookName];
204
- if (!hook || typeof hook.tap !== 'function') {
205
- throw new Error(
206
- `Rspack does not expose the "${hookName}" lifecycle hook required to restore build config environment leases.`,
207
- );
208
- }
209
- lifecycleHooks[hookName] = hook;
210
- }
211
-
212
- let mode: 'pending' | 'run' | 'watch' = 'pending';
213
- const modeTap = {
214
- name: BUILD_CONFIG_ENVIRONMENT_PLUGIN,
215
- stage: Number.MIN_SAFE_INTEGER,
216
- };
217
- const releaseTap = {
218
- name: BUILD_CONFIG_ENVIRONMENT_PLUGIN,
219
- stage: Number.MAX_SAFE_INTEGER,
220
- };
221
- const releaseAfterOneShot = () => {
222
- if (mode !== 'watch' && compiler.watchMode !== true) {
223
- this.release();
224
- }
225
- };
226
-
227
- lifecycleHooks.run.tap(modeTap, () => {
228
- mode = 'run';
229
- });
230
- lifecycleHooks.watchRun.tap(modeTap, () => {
231
- mode = 'watch';
232
- });
233
- lifecycleHooks.afterDone.tap(releaseTap, releaseAfterOneShot);
234
- lifecycleHooks.failed.tap(releaseTap, releaseAfterOneShot);
235
- lifecycleHooks.shutdown.tap(releaseTap, this.release);
236
- lifecycleHooks.watchClose.tap(releaseTap, this.release);
237
- } catch (error) {
238
- releaseAfterFailure(this.release, error);
239
- }
240
- }
241
- }
44
+ const EFFECT_TSGO_RESOLUTION_ERROR =
45
+ 'Unable to resolve the Effect TS-Go compiler. Install "@effect/tsgo" and a native TypeScript backend for this build config, or set EFFECT_TSGO_BIN. Bundled tsrs requires matching installed tsrs metadata.';
46
+ const executableEffectTsgoCompilers = new Map<string, string>();
242
47
 
243
- function resolveEffectTsgoCli(from: string | URL): string {
244
- const projectRequire = createRequire(from);
245
- const packageJsonPath = projectRequire.resolve(
246
- `${EFFECT_TSGO_PACKAGE}/package.json`,
48
+ function effectTsgoResolutionError(
49
+ cause: unknown,
50
+ stage: string,
51
+ from: string | URL,
52
+ ): Error {
53
+ const detail =
54
+ cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause);
55
+ return new Error(
56
+ `${EFFECT_TSGO_RESOLUTION_ERROR}\n${stage} failed for ${String(from)}: ${detail}`,
57
+ { cause },
247
58
  );
248
- const packageJson = JSON.parse(
249
- readFileSync(packageJsonPath, 'utf-8'),
250
- ) as PackageJson;
251
- const bin =
252
- typeof packageJson.bin === 'string'
253
- ? packageJson.bin
254
- : packageJson.bin?.[EFFECT_TSGO_BIN];
255
-
256
- if (!bin) {
257
- throw new Error(EFFECT_TSGO_RESOLUTION_ERROR);
258
- }
259
-
260
- return resolve(dirname(packageJsonPath), bin);
261
59
  }
262
60
 
263
61
  function resolveExecutableEffectTsgoCompiler(compilerPath: string): string {
264
- if (process.platform === 'win32') {
265
- return compilerPath;
266
- }
267
-
268
62
  const sourcePath = realpathSync(compilerPath);
269
63
  const source = lstatSync(sourcePath);
270
- if (!source.isFile()) {
271
- throw new Error(EFFECT_TSGO_RESOLUTION_ERROR);
64
+ if (!source.isFile() || source.size === 0) {
65
+ throw new Error(
66
+ `Effect TS-Go compiler path is not a nonempty regular file: ${sourcePath}`,
67
+ );
272
68
  }
69
+ if (process.platform === 'win32') return compilerPath;
273
70
 
274
71
  try {
275
72
  accessSync(sourcePath, constants.X_OK);
@@ -333,44 +130,15 @@ export function getBuildConfigEnvironment(name: string): string | undefined {
333
130
  return process.env[name];
334
131
  }
335
132
 
336
- /**
337
- * Runs a Rspack config setup under a leased environment value. The lease is
338
- * restored when that compiler reaches any supported terminal hook.
339
- */
340
- export function withBuildConfigEnvironment<
341
- Config extends { plugins?: Rspack.Plugin[] },
342
- SetupArguments extends unknown[],
343
- >(
344
- name: string,
345
- value: string,
346
- setup: (
347
- config: Config,
348
- ...args: SetupArguments
349
- ) => Config | void | Promise<Config | void>,
350
- ): (config: Config, ...args: SetupArguments) => Promise<Config> {
351
- return async (config, ...args) => {
352
- const release = acquireEnvironmentLease(name, value);
353
-
354
- try {
355
- const configured = (await setup(config, ...args)) ?? config;
356
- configured.plugins = [
357
- ...(configured.plugins ?? []),
358
- new BuildConfigEnvironmentLeasePlugin(release),
359
- ];
360
- return configured;
361
- } catch (error) {
362
- releaseAfterFailure(release, error);
363
- }
364
- };
365
- }
366
-
367
133
  export type ResolveEffectTsgoCompilerOptions = {
368
134
  /** Module URL or absolute filename used to resolve the consumer's compiler. */
369
135
  from: string | URL;
370
136
  };
371
137
 
372
138
  /**
373
- * Resolves the Effect TS-Go executable used by Module Federation DTS builds.
139
+ * Resolves the Effect-enabled native executable for checking and DTS builds.
140
+ * Use metadata-bound tsrs where both tsrs and the Effect provider support it.
141
+ * Unsupported targets use Effect-Go. Missing supported artifacts remain fatal.
374
142
  */
375
143
  export function resolveEffectTsgoCompiler(
376
144
  options: ResolveEffectTsgoCompilerOptions,
@@ -380,25 +148,33 @@ export function resolveEffectTsgoCompiler(
380
148
 
381
149
  if (configuredCompiler) {
382
150
  try {
383
- return resolveExecutableEffectTsgoCompiler(configuredCompiler);
384
- } catch {
385
- throw new Error(EFFECT_TSGO_RESOLUTION_ERROR);
151
+ const compiler = resolveExecutableEffectTsgoCompiler(configuredCompiler);
152
+ validateConfiguredEffectCompiler(compiler, options.from);
153
+ return compiler;
154
+ } catch (cause) {
155
+ throw effectTsgoResolutionError(
156
+ cause,
157
+ 'Configured compiler validation',
158
+ options.from,
159
+ );
386
160
  }
387
161
  }
388
162
 
163
+ let stage = 'Package CLI resolution';
389
164
  try {
390
- const compiler = execFileSync(
391
- process.execPath,
392
- [resolveEffectTsgoCli(options.from), 'get-exe-path'],
393
- { encoding: 'utf-8' },
394
- ).trim();
165
+ const compiler = resolveInstalledEffectCompiler(options.from).trim();
166
+ stage = 'Compiler backend lookup';
395
167
 
396
- if (compiler) {
397
- return resolveExecutableEffectTsgoCompiler(compiler);
168
+ if (!compiler) {
169
+ throw new Error('Effect TS-Go discovery returned an empty compiler path');
398
170
  }
399
- } catch {
400
- // Use one stable error for package, platform-binary, and CLI failures.
171
+ stage = 'Compiler executable validation';
172
+ return resolveExecutableEffectTsgoCompiler(compiler);
173
+ } catch (cause) {
174
+ throw effectTsgoResolutionError(
175
+ cause,
176
+ effectCompilerDiscoveryFailureStage(cause) ?? stage,
177
+ options.from,
178
+ );
401
179
  }
402
-
403
- throw new Error(EFFECT_TSGO_RESOLUTION_ERROR);
404
180
  }