@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.9 → 3.9.3-ultramodern.1
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 +25 -162
- package/dist/cjs/build-config/internal-effect-discovery.js +143 -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 +130 -13
- 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 +8 -5
- package/dist/cjs/renderer-build-identity.js +134 -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 +530 -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 +26 -160
- package/dist/esm/build-config/internal-effect-discovery.mjs +102 -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 +124 -13
- 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 +8 -5
- package/dist/esm/renderer-build-identity.mjs +82 -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 +530 -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 +26 -160
- package/dist/esm-node/build-config/internal-effect-discovery.mjs +103 -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 +124 -13
- 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 +8 -5
- package/dist/esm-node/renderer-build-identity.mjs +83 -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 +530 -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 +1 -9
- package/dist/types/build-config/internal-effect-discovery.d.ts +4 -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 +17 -2
- 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 +98 -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 +26 -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 +3 -2
- package/dist/types/renderer-build-identity.d.ts +30 -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 +59 -285
- package/src/build-config/internal-effect-discovery.ts +239 -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 +108 -10
- 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 +101 -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 +233 -20
- 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 +19 -2
- package/src/renderer-build-identity.ts +168 -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 +530 -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,252 +11,50 @@ 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
|
-
|
|
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}`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
const {
|
|
37
|
+
effectCompilerDiscoveryFailureStage,
|
|
38
|
+
resolveInstalledEffectCompiler,
|
|
39
|
+
}: typeof import('./internal-effect-discovery') = createRequire(
|
|
40
|
+
owningModuleUrl,
|
|
41
|
+
)(`${owningName}/internal-effect-discovery`);
|
|
20
42
|
|
|
21
|
-
const EFFECT_TSGO_PACKAGE = '@effect/tsgo';
|
|
22
|
-
const EFFECT_TSGO_BIN = 'effect-tsgo';
|
|
23
43
|
const EFFECT_TSGO_RESOLUTION_ERROR =
|
|
24
44
|
'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
45
|
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,
|
|
141
|
-
);
|
|
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
|
-
}
|
|
174
46
|
|
|
175
|
-
function
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
}
|
|
242
|
-
|
|
243
|
-
function resolveEffectTsgoCli(from: string | URL): string {
|
|
244
|
-
const projectRequire = createRequire(from);
|
|
245
|
-
const packageJsonPath = projectRequire.resolve(
|
|
246
|
-
`${EFFECT_TSGO_PACKAGE}/package.json`,
|
|
47
|
+
function effectTsgoResolutionError(
|
|
48
|
+
cause: unknown,
|
|
49
|
+
stage: string,
|
|
50
|
+
from: string | URL,
|
|
51
|
+
): Error {
|
|
52
|
+
const detail =
|
|
53
|
+
cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause);
|
|
54
|
+
return new Error(
|
|
55
|
+
`${EFFECT_TSGO_RESOLUTION_ERROR}\n${stage} failed for ${String(from)}: ${detail}`,
|
|
56
|
+
{ cause },
|
|
247
57
|
);
|
|
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
58
|
}
|
|
262
59
|
|
|
263
60
|
function resolveExecutableEffectTsgoCompiler(compilerPath: string): string {
|
|
@@ -268,7 +65,9 @@ function resolveExecutableEffectTsgoCompiler(compilerPath: string): string {
|
|
|
268
65
|
const sourcePath = realpathSync(compilerPath);
|
|
269
66
|
const source = lstatSync(sourcePath);
|
|
270
67
|
if (!source.isFile()) {
|
|
271
|
-
throw new Error(
|
|
68
|
+
throw new Error(
|
|
69
|
+
`Effect TS-Go compiler path is not a regular file: ${sourcePath}`,
|
|
70
|
+
);
|
|
272
71
|
}
|
|
273
72
|
|
|
274
73
|
try {
|
|
@@ -333,37 +132,6 @@ export function getBuildConfigEnvironment(name: string): string | undefined {
|
|
|
333
132
|
return process.env[name];
|
|
334
133
|
}
|
|
335
134
|
|
|
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
135
|
export type ResolveEffectTsgoCompilerOptions = {
|
|
368
136
|
/** Module URL or absolute filename used to resolve the consumer's compiler. */
|
|
369
137
|
from: string | URL;
|
|
@@ -381,24 +149,30 @@ export function resolveEffectTsgoCompiler(
|
|
|
381
149
|
if (configuredCompiler) {
|
|
382
150
|
try {
|
|
383
151
|
return resolveExecutableEffectTsgoCompiler(configuredCompiler);
|
|
384
|
-
} catch {
|
|
385
|
-
throw
|
|
152
|
+
} catch (cause) {
|
|
153
|
+
throw effectTsgoResolutionError(
|
|
154
|
+
cause,
|
|
155
|
+
'Configured compiler validation',
|
|
156
|
+
options.from,
|
|
157
|
+
);
|
|
386
158
|
}
|
|
387
159
|
}
|
|
388
160
|
|
|
161
|
+
let stage = 'Package CLI resolution';
|
|
389
162
|
try {
|
|
390
|
-
const compiler =
|
|
391
|
-
|
|
392
|
-
[resolveEffectTsgoCli(options.from), 'get-exe-path'],
|
|
393
|
-
{ encoding: 'utf-8' },
|
|
394
|
-
).trim();
|
|
163
|
+
const compiler = resolveInstalledEffectCompiler(options.from).trim();
|
|
164
|
+
stage = 'Compiler backend lookup';
|
|
395
165
|
|
|
396
|
-
if (compiler) {
|
|
397
|
-
|
|
166
|
+
if (!compiler) {
|
|
167
|
+
throw new Error('Effect TS-Go discovery returned an empty compiler path');
|
|
398
168
|
}
|
|
399
|
-
|
|
400
|
-
|
|
169
|
+
stage = 'Compiler executable validation';
|
|
170
|
+
return resolveExecutableEffectTsgoCompiler(compiler);
|
|
171
|
+
} catch (cause) {
|
|
172
|
+
throw effectTsgoResolutionError(
|
|
173
|
+
cause,
|
|
174
|
+
effectCompilerDiscoveryFailureStage(cause) ?? stage,
|
|
175
|
+
options.from,
|
|
176
|
+
);
|
|
401
177
|
}
|
|
402
|
-
|
|
403
|
-
throw new Error(EFFECT_TSGO_RESOLUTION_ERROR);
|
|
404
178
|
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { lstatSync, readFileSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath, type URL } from 'node:url';
|
|
5
|
+
|
|
6
|
+
const EFFECT_TSGO_PACKAGE = '@effect/tsgo';
|
|
7
|
+
const EFFECT_TSGO_BIN = 'effect-tsgo';
|
|
8
|
+
const NATIVE_TYPESCRIPT_PACKAGES = ['typescript', '@typescript/native'];
|
|
9
|
+
type PackageJson = {
|
|
10
|
+
name?: string;
|
|
11
|
+
bin?: Record<string, string> | string;
|
|
12
|
+
version?: string;
|
|
13
|
+
gitHead?: string;
|
|
14
|
+
};
|
|
15
|
+
const failureStages = new WeakMap<object, string>();
|
|
16
|
+
export function effectCompilerDiscoveryFailureStage(
|
|
17
|
+
error: unknown,
|
|
18
|
+
): string | undefined {
|
|
19
|
+
return error && typeof error === 'object'
|
|
20
|
+
? failureStages.get(error)
|
|
21
|
+
: undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function resolveEffectTsgoPackage(from: string | URL): {
|
|
25
|
+
packageJsonPath: string;
|
|
26
|
+
packageJson: PackageJson;
|
|
27
|
+
cliPath: string;
|
|
28
|
+
} {
|
|
29
|
+
const projectRequire = createRequire(from);
|
|
30
|
+
const packageJsonPath = projectRequire.resolve(
|
|
31
|
+
`${EFFECT_TSGO_PACKAGE}/package.json`,
|
|
32
|
+
);
|
|
33
|
+
const packageJson = JSON.parse(
|
|
34
|
+
readFileSync(packageJsonPath, 'utf-8'),
|
|
35
|
+
) as PackageJson;
|
|
36
|
+
const bin =
|
|
37
|
+
typeof packageJson.bin === 'string'
|
|
38
|
+
? packageJson.bin
|
|
39
|
+
: packageJson.bin?.[EFFECT_TSGO_BIN];
|
|
40
|
+
|
|
41
|
+
if (!bin) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
`Resolved ${EFFECT_TSGO_PACKAGE} package has no ${EFFECT_TSGO_BIN} bin: ${packageJsonPath}`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const cliPath = realpathSync(resolve(dirname(packageJsonPath), bin));
|
|
48
|
+
if (!lstatSync(cliPath).isFile())
|
|
49
|
+
throw new Error(`Effect TS-Go CLI is not a regular file: ${cliPath}`);
|
|
50
|
+
return { packageJsonPath, packageJson, cliPath };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function isAbsentNativeTypeScriptPackage(
|
|
54
|
+
projectRequire: NodeJS.Require,
|
|
55
|
+
from: string | URL,
|
|
56
|
+
packageName: string,
|
|
57
|
+
error: unknown,
|
|
58
|
+
): boolean {
|
|
59
|
+
const filename =
|
|
60
|
+
typeof from === 'string' && !from.startsWith('file:')
|
|
61
|
+
? from
|
|
62
|
+
: fileURLToPath(from);
|
|
63
|
+
if (
|
|
64
|
+
!(error instanceof Error) ||
|
|
65
|
+
!('code' in error) ||
|
|
66
|
+
error.code !== 'MODULE_NOT_FOUND' ||
|
|
67
|
+
('path' in error && error.path !== undefined) ||
|
|
68
|
+
error.message.split('\n')[0] !==
|
|
69
|
+
`Cannot find module '${packageName}/package.json'` ||
|
|
70
|
+
!('requireStack' in error) ||
|
|
71
|
+
!Array.isArray(error.requireStack) ||
|
|
72
|
+
error.requireStack[0] !== filename
|
|
73
|
+
) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
for (const searchDirectory of projectRequire.resolve.paths(packageName) ??
|
|
77
|
+
[]) {
|
|
78
|
+
try {
|
|
79
|
+
lstatSync(join(searchDirectory, packageName));
|
|
80
|
+
return false;
|
|
81
|
+
} catch (presenceError) {
|
|
82
|
+
if (
|
|
83
|
+
!(presenceError instanceof Error) ||
|
|
84
|
+
!('code' in presenceError) ||
|
|
85
|
+
!['ENOENT', 'ENOTDIR'].includes(String(presenceError.code))
|
|
86
|
+
) {
|
|
87
|
+
throw presenceError;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function resolveNativeTypeScriptPackage(from: string | URL): string {
|
|
95
|
+
const projectRequire = createRequire(from);
|
|
96
|
+
for (const packageName of NATIVE_TYPESCRIPT_PACKAGES) {
|
|
97
|
+
let packageJsonPath: string;
|
|
98
|
+
try {
|
|
99
|
+
packageJsonPath = projectRequire.resolve(`${packageName}/package.json`);
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (
|
|
102
|
+
isAbsentNativeTypeScriptPackage(
|
|
103
|
+
projectRequire,
|
|
104
|
+
from,
|
|
105
|
+
packageName,
|
|
106
|
+
error,
|
|
107
|
+
)
|
|
108
|
+
) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
const packageJson = JSON.parse(
|
|
114
|
+
readFileSync(packageJsonPath, 'utf-8'),
|
|
115
|
+
) as PackageJson;
|
|
116
|
+
const major = packageJson.version?.match(
|
|
117
|
+
/^(\d+)\.\d+\.\d+(?:[-+].*)?$/u,
|
|
118
|
+
)?.[1];
|
|
119
|
+
if (!major) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
`Resolved TypeScript package has no valid version: ${packageJsonPath}`,
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
if (Number(major) >= 7) {
|
|
125
|
+
return packageJsonPath;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
throw new Error(
|
|
129
|
+
`No native TypeScript backend is installed for ${String(from)}. Install typescript >=7 or @typescript/native.`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function resolveNativeTypeScriptManifest(from: string | URL): string {
|
|
134
|
+
const packageJsonPath = resolveNativeTypeScriptPackage(from);
|
|
135
|
+
const directory = dirname(packageJsonPath);
|
|
136
|
+
// Keep the selected backend bound to its own installation, including the
|
|
137
|
+
// canonical-package precedence used by the provider.
|
|
138
|
+
const discoveryPackage = resolveNativeTypeScriptPackage(
|
|
139
|
+
join(directory, '__ultramodern_effect_backend__.cjs'),
|
|
140
|
+
);
|
|
141
|
+
if (realpathSync(discoveryPackage) !== realpathSync(packageJsonPath)) {
|
|
142
|
+
throw new Error(
|
|
143
|
+
`Effect discovery would select a different native TypeScript installation from ${directory}: ${discoveryPackage}`,
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
return packageJsonPath;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function readCompilerArtifact(filename: string): string {
|
|
150
|
+
const canonicalPath = realpathSync(filename);
|
|
151
|
+
const stats = lstatSync(canonicalPath);
|
|
152
|
+
if (!stats.isFile())
|
|
153
|
+
throw new Error(`Compiler artifact is not a regular file: ${filename}`);
|
|
154
|
+
if (stats.size === 0)
|
|
155
|
+
throw new Error(`Compiler artifact is empty: ${filename}`);
|
|
156
|
+
return canonicalPath;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Selects the exact native replacement without invoking the provider. */
|
|
160
|
+
export function resolveInstalledEffectCompiler(from: string | URL): string {
|
|
161
|
+
let stage = 'Package CLI resolution';
|
|
162
|
+
try {
|
|
163
|
+
const effect = resolveEffectTsgoPackage(from);
|
|
164
|
+
stage = 'Native TypeScript package resolution';
|
|
165
|
+
const typeScriptManifest = resolveNativeTypeScriptManifest(from);
|
|
166
|
+
const typeScript = JSON.parse(
|
|
167
|
+
readFileSync(typeScriptManifest, 'utf8'),
|
|
168
|
+
) as PackageJson;
|
|
169
|
+
const nativeName = `@typescript/typescript-${process.platform}-${process.arch}`;
|
|
170
|
+
const nativeManifest = createRequire(typeScriptManifest).resolve(
|
|
171
|
+
`${nativeName}/package.json`,
|
|
172
|
+
);
|
|
173
|
+
const native = JSON.parse(
|
|
174
|
+
readFileSync(nativeManifest, 'utf8'),
|
|
175
|
+
) as PackageJson;
|
|
176
|
+
if (
|
|
177
|
+
native.name !== nativeName ||
|
|
178
|
+
native.version !== typeScript.version ||
|
|
179
|
+
typeof native.version !== 'string' ||
|
|
180
|
+
!/^\d+\.\d+\.\d+(?:[-+][\w.-]+)?$/u.test(native.version) ||
|
|
181
|
+
typeof native.gitHead !== 'string' ||
|
|
182
|
+
!/^[a-f\d]{40}$/u.test(native.gitHead) ||
|
|
183
|
+
native.gitHead !== typeScript.gitHead
|
|
184
|
+
) {
|
|
185
|
+
throw new Error(
|
|
186
|
+
`Native TypeScript platform does not match its selected package: ${nativeManifest}`,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
const binaryName = process.platform === 'win32' ? 'tsc.exe' : 'tsc';
|
|
190
|
+
readCompilerArtifact(join(dirname(nativeManifest), 'lib', binaryName));
|
|
191
|
+
stage = 'Compiler backend lookup';
|
|
192
|
+
const effectName = `@effect/tsgo-${process.platform}-${process.arch}`;
|
|
193
|
+
const effectManifest = createRequire(effect.cliPath).resolve(
|
|
194
|
+
`${effectName}/package.json`,
|
|
195
|
+
);
|
|
196
|
+
const platform = JSON.parse(
|
|
197
|
+
readFileSync(effectManifest, 'utf8'),
|
|
198
|
+
) as PackageJson;
|
|
199
|
+
if (
|
|
200
|
+
platform.name !== effectName ||
|
|
201
|
+
typeof effect.packageJson.version !== 'string' ||
|
|
202
|
+
platform.version !== effect.packageJson.version
|
|
203
|
+
) {
|
|
204
|
+
throw new Error(
|
|
205
|
+
`Effect platform does not match its selected provider: ${effectManifest}`,
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
const metadataPath = join(dirname(effectManifest), 'lib', 'upstream.json');
|
|
209
|
+
const metadata = JSON.parse(readFileSync(metadataPath, 'utf8')) as {
|
|
210
|
+
schemaVersion?: number;
|
|
211
|
+
components?: {
|
|
212
|
+
typescript?: Record<string, { gitHead?: string; provider?: string }>;
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
const component = metadata.components?.typescript?.[native.version];
|
|
216
|
+
if (
|
|
217
|
+
metadata.schemaVersion !== 5 ||
|
|
218
|
+
component?.provider !== 'typescript-go' ||
|
|
219
|
+
component.gitHead !== native.gitHead
|
|
220
|
+
) {
|
|
221
|
+
throw new Error(
|
|
222
|
+
`Effect replacement metadata does not match the selected native TypeScript backend: ${metadataPath}`,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
return readCompilerArtifact(
|
|
226
|
+
join(
|
|
227
|
+
dirname(effectManifest),
|
|
228
|
+
'artifacts',
|
|
229
|
+
'typescript',
|
|
230
|
+
native.version,
|
|
231
|
+
binaryName,
|
|
232
|
+
),
|
|
233
|
+
);
|
|
234
|
+
} catch (error) {
|
|
235
|
+
if (error && typeof error === 'object' && !failureStages.has(error))
|
|
236
|
+
failureStages.set(error, stage);
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type BrowserManifestAddressOptions,
|
|
3
|
+
resolveBrowserManifestAddress,
|
|
4
|
+
} from '@modern-js/surface-resolution';
|
|
5
|
+
import { resolveDeployTarget } from '../deploy-output/target';
|
|
6
|
+
import { getBuildConfigEnvironment } from './build-environment';
|
|
7
|
+
|
|
8
|
+
/** Adapt build environment leases and MF's name@URL syntax to discovery policy. */
|
|
9
|
+
export function createRemoteManifestUrl(
|
|
10
|
+
options: BrowserManifestAddressOptions,
|
|
11
|
+
): string {
|
|
12
|
+
const env: Record<string, string | undefined> = {
|
|
13
|
+
...Object.fromEntries(
|
|
14
|
+
[
|
|
15
|
+
options.manifestEnv,
|
|
16
|
+
options.publicUrlEnv,
|
|
17
|
+
'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN',
|
|
18
|
+
].map(name => [name, getBuildConfigEnvironment(name)]),
|
|
19
|
+
),
|
|
20
|
+
MODERNJS_DEPLOY: resolveDeployTarget().target,
|
|
21
|
+
};
|
|
22
|
+
const address = resolveBrowserManifestAddress(
|
|
23
|
+
env,
|
|
24
|
+
options,
|
|
25
|
+
getBuildConfigEnvironment('NODE_ENV') ?? 'production',
|
|
26
|
+
);
|
|
27
|
+
if (!address.ok)
|
|
28
|
+
throw new Error(`Remote ${options.mfName}: ${address.reason}`);
|
|
29
|
+
return (
|
|
30
|
+
env[options.manifestEnv]?.trim() ||
|
|
31
|
+
`${options.mfName}@${address.manifestUrl}`
|
|
32
|
+
);
|
|
33
|
+
}
|