@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.
- package/README.md +23 -0
- package/dist/cjs/backend-federation-build/codegen.js +29 -18
- package/dist/cjs/backend-federation-build/config.js +84 -45
- package/dist/cjs/backend-federation-build/emit.js +63 -22
- package/dist/cjs/build-config/build-environment.js +30 -165
- package/dist/cjs/build-config/internal-effect-discovery.js +231 -0
- package/dist/cjs/build-config/public.js +2 -5
- package/dist/cjs/build-config/remote-address.js +58 -0
- package/dist/cjs/cloudflare/artifacts.js +8 -19
- package/dist/cjs/cloudflare/delivery-unit.js +125 -43
- package/dist/cjs/cloudflare/index.js +14 -4
- package/dist/cjs/cloudflare/native-renderer.js +100 -0
- package/dist/cjs/cloudflare/renderer-identity.js +106 -0
- package/dist/cjs/cloudflare/worker-manifest.js +54 -13
- package/dist/cjs/cloudflare/worker-options.js +48 -0
- package/dist/cjs/cloudflare/wrangler-config.js +210 -13
- package/dist/cjs/cloudflare-builder.js +307 -89
- package/dist/cjs/cloudflare-output-contract.js +36 -4
- package/dist/cjs/cloudflare-output-verifier/identity.js +112 -23
- package/dist/cjs/cloudflare-output-verifier/index.js +10 -0
- package/dist/cjs/cloudflare-output-verifier/manifest.js +46 -0
- package/dist/cjs/cloudflare-output-verifier/mutation-policy.js +7 -1
- package/dist/cjs/cloudflare-output-verifier/worker-bundles.js +10 -5
- package/dist/cjs/config.js +10 -5
- package/dist/cjs/deploy-output/npmAliases.js +92 -6
- package/dist/cjs/deploy-output/plugin.js +27 -6
- package/dist/cjs/deploy-output/public-assets.js +146 -0
- package/dist/cjs/deploy-output/target.js +57 -1
- package/dist/cjs/deploy-output/trace-files.js +99 -0
- package/dist/cjs/module-federation-config/exposes.js +70 -0
- package/dist/cjs/module-federation-config/index.js +73 -0
- package/dist/cjs/module-federation-config/inspect.js +103 -0
- package/dist/cjs/module-federation-config/object-literal.js +87 -0
- package/dist/cjs/module-federation-config/syntax.js +151 -0
- package/dist/cjs/module-federation-config/types.js +18 -0
- package/dist/cjs/native-type-checker.js +180 -17
- package/dist/cjs/policy-defaults.js +38 -29
- package/dist/cjs/release-envelope/canonical.js +2 -9
- package/dist/cjs/release-envelope/contract.js +68 -0
- package/dist/cjs/release-envelope/framework-output.js +296 -105
- package/dist/cjs/release-envelope/index.js +150 -36
- package/dist/cjs/release-envelope/plugin.js +24 -15
- package/dist/cjs/release-envelope/renderer-output-stamp.js +170 -0
- package/dist/cjs/release-envelope/types.js +10 -8
- package/dist/cjs/release-identity.js +9 -6
- package/dist/cjs/renderer-build-identity.js +144 -0
- package/dist/cjs/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
- package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
- package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
- package/dist/cjs/templates/cloudflare-entry.005-worker-dispatch.mjs +547 -103
- package/dist/cjs/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
- package/dist/cjs/templates/cloudflare-worker-route-data.mjs +1069 -0
- package/dist/cjs/workspace-topology.js +84 -0
- package/dist/esm/backend-federation-build/codegen.mjs +29 -18
- package/dist/esm/backend-federation-build/config.mjs +74 -38
- package/dist/esm/backend-federation-build/emit.mjs +64 -23
- package/dist/esm/build-config/build-environment.mjs +31 -163
- package/dist/esm/build-config/internal-effect-discovery.mjs +187 -0
- package/dist/esm/build-config/public.mjs +1 -1
- package/dist/esm/build-config/remote-address.mjs +20 -0
- package/dist/esm/cloudflare/artifacts.mjs +8 -19
- package/dist/esm/cloudflare/delivery-unit.mjs +124 -45
- package/dist/esm/cloudflare/index.mjs +15 -5
- package/dist/esm/cloudflare/native-renderer.mjs +48 -0
- package/dist/esm/cloudflare/renderer-identity.mjs +57 -0
- package/dist/esm/cloudflare/worker-manifest.mjs +55 -14
- package/dist/esm/cloudflare/worker-options.mjs +10 -0
- package/dist/esm/cloudflare/wrangler-config.mjs +203 -12
- package/dist/esm/cloudflare-builder.mjs +301 -89
- package/dist/esm/cloudflare-output-contract.mjs +29 -3
- package/dist/esm/cloudflare-output-verifier/identity.mjs +113 -24
- package/dist/esm/cloudflare-output-verifier/index.mjs +10 -0
- package/dist/esm/cloudflare-output-verifier/manifest.mjs +46 -0
- package/dist/esm/cloudflare-output-verifier/mutation-policy.mjs +7 -1
- package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +11 -6
- package/dist/esm/config.mjs +3 -1
- package/dist/esm/deploy-output/npmAliases.mjs +92 -6
- package/dist/esm/deploy-output/plugin.mjs +24 -6
- package/dist/esm/deploy-output/public-assets.mjs +82 -0
- package/dist/esm/deploy-output/target.mjs +50 -3
- package/dist/esm/deploy-output/trace-files.mjs +47 -0
- package/dist/esm/module-federation-config/exposes.mjs +18 -0
- package/dist/esm/module-federation-config/index.mjs +4 -0
- package/dist/esm/module-federation-config/inspect.mjs +65 -0
- package/dist/esm/module-federation-config/object-literal.mjs +43 -0
- package/dist/esm/module-federation-config/syntax.mjs +101 -0
- package/dist/esm/module-federation-config/types.mjs +0 -0
- package/dist/esm/native-type-checker.mjs +175 -18
- package/dist/esm/policy-defaults.mjs +36 -30
- package/dist/esm/release-envelope/canonical.mjs +2 -9
- package/dist/esm/release-envelope/contract.mjs +21 -0
- package/dist/esm/release-envelope/framework-output.mjs +297 -106
- package/dist/esm/release-envelope/index.mjs +149 -38
- package/dist/esm/release-envelope/plugin.mjs +24 -15
- package/dist/esm/release-envelope/renderer-output-stamp.mjs +112 -0
- package/dist/esm/release-envelope/types.mjs +2 -3
- package/dist/esm/release-identity.mjs +9 -6
- package/dist/esm/renderer-build-identity.mjs +92 -0
- package/dist/esm/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
- package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
- package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
- package/dist/esm/templates/cloudflare-entry.005-worker-dispatch.mjs +547 -103
- package/dist/esm/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
- package/dist/esm/templates/cloudflare-worker-route-data.mjs +1069 -0
- package/dist/esm/workspace-topology.mjs +21 -0
- package/dist/esm-node/backend-federation-build/codegen.mjs +29 -18
- package/dist/esm-node/backend-federation-build/config.mjs +74 -38
- package/dist/esm-node/backend-federation-build/emit.mjs +64 -23
- package/dist/esm-node/build-config/build-environment.mjs +31 -163
- package/dist/esm-node/build-config/internal-effect-discovery.mjs +188 -0
- package/dist/esm-node/build-config/public.mjs +1 -1
- package/dist/esm-node/build-config/remote-address.mjs +21 -0
- package/dist/esm-node/cloudflare/artifacts.mjs +8 -19
- package/dist/esm-node/cloudflare/delivery-unit.mjs +124 -45
- package/dist/esm-node/cloudflare/index.mjs +15 -5
- package/dist/esm-node/cloudflare/native-renderer.mjs +49 -0
- package/dist/esm-node/cloudflare/renderer-identity.mjs +58 -0
- package/dist/esm-node/cloudflare/worker-manifest.mjs +55 -14
- package/dist/esm-node/cloudflare/worker-options.mjs +11 -0
- package/dist/esm-node/cloudflare/wrangler-config.mjs +203 -12
- package/dist/esm-node/cloudflare-builder.mjs +301 -89
- package/dist/esm-node/cloudflare-output-contract.mjs +29 -3
- package/dist/esm-node/cloudflare-output-verifier/identity.mjs +113 -24
- package/dist/esm-node/cloudflare-output-verifier/index.mjs +10 -0
- package/dist/esm-node/cloudflare-output-verifier/manifest.mjs +46 -0
- package/dist/esm-node/cloudflare-output-verifier/mutation-policy.mjs +7 -1
- package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +11 -6
- package/dist/esm-node/config.mjs +3 -1
- package/dist/esm-node/deploy-output/npmAliases.mjs +92 -6
- package/dist/esm-node/deploy-output/plugin.mjs +24 -6
- package/dist/esm-node/deploy-output/public-assets.mjs +83 -0
- package/dist/esm-node/deploy-output/target.mjs +50 -3
- package/dist/esm-node/deploy-output/trace-files.mjs +48 -0
- package/dist/esm-node/module-federation-config/exposes.mjs +19 -0
- package/dist/esm-node/module-federation-config/index.mjs +5 -0
- package/dist/esm-node/module-federation-config/inspect.mjs +66 -0
- package/dist/esm-node/module-federation-config/object-literal.mjs +44 -0
- package/dist/esm-node/module-federation-config/syntax.mjs +102 -0
- package/dist/esm-node/module-federation-config/types.mjs +1 -0
- package/dist/esm-node/native-type-checker.mjs +175 -18
- package/dist/esm-node/policy-defaults.mjs +36 -30
- package/dist/esm-node/release-envelope/canonical.mjs +2 -9
- package/dist/esm-node/release-envelope/contract.mjs +22 -0
- package/dist/esm-node/release-envelope/framework-output.mjs +297 -106
- package/dist/esm-node/release-envelope/index.mjs +149 -38
- package/dist/esm-node/release-envelope/plugin.mjs +24 -15
- package/dist/esm-node/release-envelope/renderer-output-stamp.mjs +113 -0
- package/dist/esm-node/release-envelope/types.mjs +2 -3
- package/dist/esm-node/release-identity.mjs +9 -6
- package/dist/esm-node/renderer-build-identity.mjs +93 -0
- package/dist/esm-node/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
- package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
- package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
- package/dist/esm-node/templates/cloudflare-entry.005-worker-dispatch.mjs +547 -103
- package/dist/esm-node/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
- package/dist/esm-node/templates/cloudflare-worker-route-data.mjs +1069 -0
- package/dist/esm-node/workspace-topology.mjs +22 -0
- package/dist/types/backend-federation-build/codegen.d.ts +30 -0
- package/dist/types/backend-federation-build/config.d.ts +10 -57
- package/dist/types/backend-federation-build/emit.d.ts +12 -2
- package/dist/types/backend-federation-build/index.d.ts +1 -1
- package/dist/types/build-config/build-environment.d.ts +4 -10
- package/dist/types/build-config/internal-effect-discovery.d.ts +6 -0
- package/dist/types/build-config/public.d.ts +1 -1
- package/dist/types/build-config/remote-address.d.ts +3 -0
- package/dist/types/cloudflare/artifacts.d.ts +7 -6
- package/dist/types/cloudflare/constants.d.ts +1 -1
- package/dist/types/cloudflare/delivery-unit.d.ts +38 -7
- package/dist/types/cloudflare/native-renderer.d.ts +30 -0
- package/dist/types/cloudflare/renderer-identity.d.ts +25 -0
- package/dist/types/cloudflare/worker-manifest.d.ts +20 -4
- package/dist/types/cloudflare/worker-options.d.ts +20 -0
- package/dist/types/cloudflare/wrangler-config.d.ts +55 -2
- package/dist/types/cloudflare-builder.d.ts +51 -8
- package/dist/types/cloudflare-output-contract.d.ts +5 -3
- package/dist/types/cloudflare-output-verifier/identity.d.ts +7 -3
- package/dist/types/cloudflare-output-verifier/worker-bundles.d.ts +2 -2
- package/dist/types/config.d.ts +102 -13
- package/dist/types/deploy-output/plugin.d.ts +29 -9
- package/dist/types/deploy-output/public-assets.d.ts +51 -0
- package/dist/types/deploy-output/target.d.ts +28 -5
- package/dist/types/deploy-output/trace-files.d.ts +17 -0
- package/dist/types/module-federation-config/exposes.d.ts +11 -0
- package/dist/types/module-federation-config/index.d.ts +5 -0
- package/dist/types/module-federation-config/inspect.d.ts +2 -0
- package/dist/types/module-federation-config/object-literal.d.ts +4 -0
- package/dist/types/module-federation-config/syntax.d.ts +7 -0
- package/dist/types/module-federation-config/types.d.ts +20 -0
- package/dist/types/native-type-checker.d.ts +28 -3
- package/dist/types/policy-defaults.d.ts +12 -2
- package/dist/types/release-envelope/canonical.d.ts +5 -5
- package/dist/types/release-envelope/contract.d.mts +8 -0
- package/dist/types/release-envelope/framework-output.d.ts +23 -13
- package/dist/types/release-envelope/index.d.ts +17 -5
- package/dist/types/release-envelope/plugin.d.ts +10 -6
- package/dist/types/release-envelope/renderer-output-stamp.d.ts +34 -0
- package/dist/types/release-envelope/types.d.ts +42 -4
- package/dist/types/release-identity.d.ts +13 -2
- package/dist/types/renderer-build-identity.d.ts +41 -0
- package/dist/types/templates/cloudflare-worker-route-data.d.mts +14 -0
- package/dist/types/workspace-topology.d.ts +91 -0
- package/package.json +87 -27
- package/src/backend-federation-build/codegen.ts +28 -19
- package/src/backend-federation-build/config.ts +189 -123
- package/src/backend-federation-build/emit.ts +119 -38
- package/src/backend-federation-build/index.ts +4 -1
- package/src/build-config/build-environment.ts +69 -293
- package/src/build-config/internal-effect-discovery.ts +458 -0
- package/src/build-config/public.ts +0 -1
- package/src/build-config/remote-address.ts +33 -0
- package/src/cloudflare/artifacts.ts +22 -43
- package/src/cloudflare/delivery-unit.ts +283 -60
- package/src/cloudflare/index.ts +35 -19
- package/src/cloudflare/native-renderer.ts +117 -0
- package/src/cloudflare/renderer-identity.ts +171 -0
- package/src/cloudflare/worker-manifest.ts +115 -13
- package/src/cloudflare/worker-options.ts +60 -0
- package/src/cloudflare/wrangler-config.ts +390 -14
- package/src/cloudflare-builder.ts +543 -170
- package/src/cloudflare-output-contract.ts +45 -2
- package/src/cloudflare-output-verifier/identity.ts +138 -7
- package/src/cloudflare-output-verifier/index.ts +20 -0
- package/src/cloudflare-output-verifier/manifest.ts +77 -0
- package/src/cloudflare-output-verifier/mutation-policy.ts +11 -1
- package/src/cloudflare-output-verifier/worker-bundles.ts +27 -11
- package/src/config.ts +105 -19
- package/src/deploy-output/npmAliases.ts +141 -4
- package/src/deploy-output/plugin.ts +55 -18
- package/src/deploy-output/public-assets.ts +224 -0
- package/src/deploy-output/target.ts +97 -14
- package/src/deploy-output/trace-files.ts +80 -0
- package/src/module-federation-config/exposes.ts +46 -0
- package/src/module-federation-config/index.ts +22 -0
- package/src/module-federation-config/inspect.ts +157 -0
- package/src/module-federation-config/object-literal.ts +76 -0
- package/src/module-federation-config/syntax.ts +212 -0
- package/src/module-federation-config/types.ts +22 -0
- package/src/native-type-checker.ts +284 -27
- package/src/policy-defaults.ts +47 -17
- package/src/release-envelope/canonical.ts +6 -18
- package/src/release-envelope/contract.mjs +28 -0
- package/src/release-envelope/framework-output.ts +681 -156
- package/src/release-envelope/index.ts +315 -60
- package/src/release-envelope/plugin.ts +54 -38
- package/src/release-envelope/renderer-output-stamp.ts +210 -0
- package/src/release-envelope/types.ts +75 -6
- package/src/release-identity.ts +30 -4
- package/src/renderer-build-identity.ts +208 -0
- package/src/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
- package/src/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
- package/src/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
- package/src/templates/cloudflare-entry.005-worker-dispatch.mjs +547 -103
- package/src/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
- package/src/templates/cloudflare-worker-route-data.mjs +1069 -0
- package/src/workspace-topology.ts +125 -0
- package/dist/cjs/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/cjs/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/cjs/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/esm/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/esm/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/esm/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/esm-node/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/esm-node/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/esm-node/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/types/templates/cloudflare-worker-fs-promises.d.mts +0 -5
- package/dist/types/templates/cloudflare-worker-loadable-server.d.mts +0 -48
- package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +0 -13
- package/dist/types/templates/cloudflare-worker-path.d.mts +0 -21
- package/src/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/src/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- 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,
|
|
18
|
-
import type
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
384
|
-
|
|
385
|
-
|
|
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 =
|
|
391
|
-
|
|
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
|
-
|
|
168
|
+
if (!compiler) {
|
|
169
|
+
throw new Error('Effect TS-Go discovery returned an empty compiler path');
|
|
398
170
|
}
|
|
399
|
-
|
|
400
|
-
|
|
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
|
}
|