@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.16 → 3.9.0-ultramodern.18
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/dist/cjs/backend-federation-build/codegen.js +22 -16
- package/dist/cjs/build-config/build-environment.js +2 -141
- package/dist/cjs/build-config/public.js +2 -5
- package/dist/cjs/cloudflare-builder.js +0 -30
- package/dist/cjs/config.js +2 -5
- package/dist/cjs/deploy-output/trace-files.js +90 -0
- package/dist/cjs/release-identity.js +2 -0
- package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +1 -1
- package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +1 -1
- package/dist/esm/backend-federation-build/codegen.mjs +22 -16
- package/dist/esm/build-config/build-environment.mjs +1 -137
- package/dist/esm/build-config/public.mjs +1 -1
- package/dist/esm/cloudflare-builder.mjs +0 -30
- package/dist/esm/config.mjs +1 -1
- package/dist/esm/deploy-output/trace-files.mjs +38 -0
- package/dist/esm/release-identity.mjs +2 -0
- package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +1 -1
- package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +1 -1
- package/dist/esm-node/backend-federation-build/codegen.mjs +22 -16
- package/dist/esm-node/build-config/build-environment.mjs +1 -137
- package/dist/esm-node/build-config/public.mjs +1 -1
- package/dist/esm-node/cloudflare-builder.mjs +0 -30
- package/dist/esm-node/config.mjs +1 -1
- package/dist/esm-node/deploy-output/trace-files.mjs +39 -0
- package/dist/esm-node/release-identity.mjs +2 -0
- package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +1 -1
- package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +1 -1
- package/dist/types/build-config/build-environment.d.ts +0 -8
- package/dist/types/build-config/public.d.ts +1 -1
- package/dist/types/config.d.ts +1 -1
- package/dist/types/deploy-output/trace-files.d.ts +17 -0
- package/package.json +34 -16
- package/src/backend-federation-build/codegen.ts +22 -17
- package/src/build-config/build-environment.ts +0 -244
- package/src/build-config/public.ts +0 -1
- package/src/cloudflare/index.ts +0 -3
- package/src/cloudflare-builder.ts +0 -85
- package/src/config.ts +0 -1
- package/src/deploy-output/trace-files.ts +67 -0
- package/src/release-identity.ts +10 -0
- package/src/templates/cloudflare-entry.002-assets-routes.mjs +1 -1
- package/src/templates/cloudflare-entry.004-rendering-css.mjs +1 -1
- 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-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-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-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-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-path.mjs +0 -98
|
@@ -426,9 +426,6 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
|
|
|
426
426
|
appContext.appDirectory,
|
|
427
427
|
process.cwd()
|
|
428
428
|
];
|
|
429
|
-
const tanstackRouterSsrServerFile = resolvePackageFile('@tanstack/router-core', 'dist/esm/ssr/ssr-server.js', resolvePaths);
|
|
430
|
-
const runtimeRscWorkerFile = resolvePackageFile('@modern-js/runtime', 'dist/esm/rsc/server.worker.mjs', resolvePaths);
|
|
431
|
-
const renderRscWorkerFile = resolvePackageFile('@modern-js/render', 'dist/esm/rscWorker.mjs', resolvePaths);
|
|
432
429
|
const reactFile = resolvePackageFile('react', 'index.js', resolvePaths);
|
|
433
430
|
const reactJsxRuntimeFile = resolvePackageFile('react', 'jsx-runtime.js', resolvePaths);
|
|
434
431
|
const reactJsxDevRuntimeFile = resolvePackageFile('react', 'jsx-dev-runtime.js', resolvePaths);
|
|
@@ -438,9 +435,6 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
|
|
|
438
435
|
...resolvePaths,
|
|
439
436
|
getTemplatePath('')
|
|
440
437
|
]);
|
|
441
|
-
const loadableServerWorkerFile = getTemplatePath('cloudflare-worker-loadable-server.mjs');
|
|
442
|
-
const fsPromisesWorkerFile = getTemplatePath('cloudflare-worker-fs-promises.mjs');
|
|
443
|
-
const pathWorkerFile = getTemplatePath('cloudflare-worker-path.mjs');
|
|
444
438
|
const entryNames = [
|
|
445
439
|
...workerEntryNames
|
|
446
440
|
];
|
|
@@ -465,36 +459,12 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
|
|
|
465
459
|
});
|
|
466
460
|
chain.plugin('cloudflare-worker-absent-optional-dependencies').use(AbsentOptionalDependencyPlugin);
|
|
467
461
|
applyCloudflareWorkerMfRuntimeBoundary(chain);
|
|
468
|
-
if (tanstackRouterSsrServerFile) {
|
|
469
|
-
chain.resolve.alias.set('@tanstack/router-core/ssr/server$', tanstackRouterSsrServerFile);
|
|
470
|
-
chain.resolve.alias.set('@tanstack/router-core/ssr/server', tanstackRouterSsrServerFile);
|
|
471
|
-
}
|
|
472
|
-
if (runtimeRscWorkerFile) {
|
|
473
|
-
chain.resolve.alias.set('@modern-js/runtime/rsc/server$', runtimeRscWorkerFile);
|
|
474
|
-
chain.resolve.alias.set('@modern-js/runtime/rsc/server', runtimeRscWorkerFile);
|
|
475
|
-
}
|
|
476
|
-
if (renderRscWorkerFile) {
|
|
477
|
-
chain.resolve.alias.set('@modern-js/render/rsc$', renderRscWorkerFile);
|
|
478
|
-
chain.resolve.alias.set('@modern-js/render/rsc', renderRscWorkerFile);
|
|
479
|
-
chain.resolve.alias.set('@modern-js/render/rsc-worker$', renderRscWorkerFile);
|
|
480
|
-
}
|
|
481
462
|
setAliasIfPresent(chain.resolve.alias, 'react$', reactFile);
|
|
482
463
|
setAliasIfPresent(chain.resolve.alias, 'react/jsx-runtime$', reactJsxRuntimeFile);
|
|
483
464
|
setAliasIfPresent(chain.resolve.alias, 'react/jsx-dev-runtime$', reactJsxDevRuntimeFile);
|
|
484
465
|
setAliasIfPresent(chain.resolve.alias, 'react-dom$', reactDomFile);
|
|
485
466
|
setAliasIfPresent(chain.resolve.alias, 'react-dom/server.edge$', reactDomServerEdgeFile);
|
|
486
467
|
setAliasIfPresent(chain.resolve.alias, '@loadable/component$', loadableComponentFile);
|
|
487
|
-
setAliasIfPresent(chain.resolve.alias, '@loadable/server$', loadableServerWorkerFile);
|
|
488
|
-
setAliasIfPresent(chain.resolve.alias, 'fs/promises$', fsPromisesWorkerFile);
|
|
489
|
-
setAliasIfPresent(chain.resolve.alias, 'node:fs/promises$', fsPromisesWorkerFile);
|
|
490
|
-
setAliasIfPresent(chain.resolve.alias, 'path$', pathWorkerFile);
|
|
491
|
-
setAliasIfPresent(chain.resolve.alias, 'node:path$', pathWorkerFile);
|
|
492
|
-
chain.resolve.alias.set('react-server-dom-rspack/server.node$', 'react-server-dom-rspack/server.edge');
|
|
493
|
-
chain.resolve.alias.set('react-server-dom-rspack/server.node', 'react-server-dom-rspack/server.edge');
|
|
494
|
-
chain.resolve.alias.set('react-server-dom-rspack/client.node$', 'react-server-dom-rspack/client.edge');
|
|
495
|
-
chain.resolve.alias.set('react-server-dom-rspack/client.node', 'react-server-dom-rspack/client.edge');
|
|
496
|
-
chain.resolve.fallback.set('fs', false);
|
|
497
|
-
chain.resolve.fallback.set('node:fs', false);
|
|
498
468
|
};
|
|
499
469
|
};
|
|
500
470
|
function getCloudflareBuilderEnvironments({ appContext, environments, normalizedConfig, resolveDeployProvider = resolveStdEnvDeployProvider }) {
|
package/dist/esm/config.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler
|
|
1
|
+
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler } from "./build-config/public.mjs";
|
|
2
2
|
export { createRemoteManifestUrl } from "./build-config/remote-address.mjs";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import node_os from "node:os";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
import { nodeFileTrace } from "@vercel/nft";
|
|
4
|
+
const SYSTEM_ROOTS = 'win32' === process.platform ? [] : [
|
|
5
|
+
'/dev',
|
|
6
|
+
'/etc',
|
|
7
|
+
'/proc',
|
|
8
|
+
'/run',
|
|
9
|
+
'/sys',
|
|
10
|
+
'/var/run'
|
|
11
|
+
];
|
|
12
|
+
const GLOB_SEGMENT = /[*?[{]/;
|
|
13
|
+
const isInside = (parent, child)=>child === parent || child.startsWith(`${parent}${node_path.sep}`);
|
|
14
|
+
const globRoot = (absolutePattern)=>{
|
|
15
|
+
const { root } = node_path.parse(absolutePattern);
|
|
16
|
+
const segments = absolutePattern.slice(root.length).split(node_path.sep);
|
|
17
|
+
const index = segments.findIndex((segment)=>GLOB_SEGMENT.test(segment));
|
|
18
|
+
return -1 === index ? void 0 : node_path.join(root, ...segments.slice(0, index));
|
|
19
|
+
};
|
|
20
|
+
const createBuildHostIgnore = (base)=>{
|
|
21
|
+
const wholeDirectories = new Set([
|
|
22
|
+
node_path.parse(node_path.resolve(base)).root,
|
|
23
|
+
node_path.resolve(node_os.homedir()),
|
|
24
|
+
node_path.resolve(node_os.tmpdir())
|
|
25
|
+
]);
|
|
26
|
+
return (relativePath)=>{
|
|
27
|
+
const absolutePath = node_path.resolve(base, relativePath);
|
|
28
|
+
if (SYSTEM_ROOTS.some((root)=>isInside(root, absolutePath))) return true;
|
|
29
|
+
const root = globRoot(absolutePath);
|
|
30
|
+
return void 0 !== root && wholeDirectories.has(root);
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const traceDeployFiles = ({ entryFiles, sourceDir, base = '/' })=>nodeFileTrace(entryFiles, {
|
|
34
|
+
base,
|
|
35
|
+
processCwd: sourceDir,
|
|
36
|
+
ignore: createBuildHostIgnore(base)
|
|
37
|
+
});
|
|
38
|
+
export { createBuildHostIgnore, traceDeployFiles };
|
|
@@ -2,11 +2,13 @@ import { execFileSync } from "node:child_process";
|
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
const BUILD_MARKER_NAMESPACE = 'ultramodern-delivery-unit-release-build-marker:v1';
|
|
4
4
|
const PROMOTABLE_SOURCE_REVISION_PATTERN = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u;
|
|
5
|
+
const workspaceGitEnv = ()=>Object.fromEntries(Object.entries(process.env).filter(([name])=>!name.toUpperCase().startsWith('GIT_')));
|
|
5
6
|
const gitOutput = (workspaceRoot, args)=>{
|
|
6
7
|
try {
|
|
7
8
|
return execFileSync('git', args, {
|
|
8
9
|
cwd: workspaceRoot,
|
|
9
10
|
encoding: 'utf8',
|
|
11
|
+
env: workspaceGitEnv(),
|
|
10
12
|
stdio: [
|
|
11
13
|
'ignore',
|
|
12
14
|
'pipe',
|
|
@@ -1138,7 +1138,7 @@ async function withRouteCssLinks(
|
|
|
1138
1138
|
seenCssHrefs.add(entry.preloadHref);
|
|
1139
1139
|
return true;
|
|
1140
1140
|
});
|
|
1141
|
-
for (const {
|
|
1141
|
+
for (const { preloadHref } of uniqueCssEntries) {
|
|
1142
1142
|
const preloadUrl = new URL(preloadHref);
|
|
1143
1143
|
const preloadReference =
|
|
1144
1144
|
preloadUrl.origin === requestOrigin
|
|
@@ -46,28 +46,34 @@ const createBackendRemoteEntrySource = async (workspaceRoot, app, effectApiPath,
|
|
|
46
46
|
} : {}
|
|
47
47
|
};
|
|
48
48
|
const source = `// Generated by Modern.js backend federation build.
|
|
49
|
-
import
|
|
49
|
+
import { adoptEffectBffShareScope } from '@modern-js/bff-effect/effect-edge';
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
// The expose evaluates lazily so defineEffectBff registers its handler
|
|
52
|
+
// factories with the registry the host shares through init().
|
|
53
|
+
let exposedModule;
|
|
54
|
+
const loadExposedModule = () =>
|
|
55
|
+
(exposedModule ??= import(${JSON.stringify(effectApiSpecifier)}).then(exposedNamespace => ({
|
|
56
|
+
...exposedNamespace,
|
|
57
|
+
backendFederationContract: {
|
|
58
|
+
...(exposedNamespace.backendFederationContract ?? {}),
|
|
59
|
+
compatibility: {
|
|
60
|
+
...(exposedNamespace.backendFederationContract?.compatibility ?? {}),
|
|
61
|
+
...${JSON.stringify(compatibility)},
|
|
62
|
+
},
|
|
63
|
+
name: ${JSON.stringify(app.backendName)},
|
|
64
|
+
role: 'microvertical-server',
|
|
65
|
+
runtimeFramework: 'effect',
|
|
66
|
+
strictEffectApproach: true,
|
|
58
67
|
},
|
|
59
|
-
|
|
60
|
-
role: 'microvertical-server',
|
|
61
|
-
runtimeFramework: 'effect',
|
|
62
|
-
strictEffectApproach: true,
|
|
63
|
-
},
|
|
64
|
-
};
|
|
68
|
+
})));
|
|
65
69
|
const exposedModules = {
|
|
66
|
-
${JSON.stringify(BACKEND_FEDERATION_EFFECT_EXPOSE)}:
|
|
70
|
+
${JSON.stringify(BACKEND_FEDERATION_EFFECT_EXPOSE)}: loadExposedModule,
|
|
67
71
|
};
|
|
68
72
|
const __modernjsBackendFederation = ${JSON.stringify(containerMetadata)};
|
|
69
73
|
|
|
70
|
-
function init() {
|
|
74
|
+
function init(shareScope) {
|
|
75
|
+
return adoptEffectBffShareScope(shareScope);
|
|
76
|
+
}
|
|
71
77
|
|
|
72
78
|
function get(id) {
|
|
73
79
|
const load = exposedModules[id];
|
|
@@ -9,127 +9,6 @@ const EFFECT_TSGO_PACKAGE = '@effect/tsgo';
|
|
|
9
9
|
const EFFECT_TSGO_BIN = 'effect-tsgo';
|
|
10
10
|
const EFFECT_TSGO_RESOLUTION_ERROR = '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.';
|
|
11
11
|
const executableEffectTsgoCompilers = new Map();
|
|
12
|
-
const BUILD_CONFIG_ENVIRONMENT_PLUGIN = 'ModernJsBuildConfigEnvironmentLeasePlugin';
|
|
13
|
-
const ENVIRONMENT_LEASE_REGISTRY_KEY = Symbol.for('@modern-js/app-tools/build-config-environment-lease-registry/v1');
|
|
14
|
-
const ENVIRONMENT_LEASE_REGISTRY_BRAND = Symbol.for('@modern-js/app-tools/build-config-environment-lease-registry-brand/v1');
|
|
15
|
-
const LIFECYCLE_HOOK_NAMES = [
|
|
16
|
-
'run',
|
|
17
|
-
'watchRun',
|
|
18
|
-
'afterDone',
|
|
19
|
-
'failed',
|
|
20
|
-
'shutdown',
|
|
21
|
-
'watchClose'
|
|
22
|
-
];
|
|
23
|
-
function restoreEnvironment(name, value) {
|
|
24
|
-
if (void 0 === value) delete process.env[name];
|
|
25
|
-
else process.env[name] = value;
|
|
26
|
-
}
|
|
27
|
-
function createEnvironmentLeaseRegistry() {
|
|
28
|
-
const environmentLeases = new Map();
|
|
29
|
-
return Object.freeze({
|
|
30
|
-
acquire (name, value) {
|
|
31
|
-
let lease = environmentLeases.get(name);
|
|
32
|
-
if (lease) {
|
|
33
|
-
if (lease.value !== value) throw new Error(`Build config environment "${name}" already has an active lease for a different value.`);
|
|
34
|
-
if (process.env[name] !== lease.value) throw new Error(`Build config environment lease for "${name}" lost ownership before another lease was acquired.`);
|
|
35
|
-
} else {
|
|
36
|
-
lease = {
|
|
37
|
-
originalValue: process.env[name],
|
|
38
|
-
owners: new Set(),
|
|
39
|
-
value
|
|
40
|
-
};
|
|
41
|
-
process.env[name] = value;
|
|
42
|
-
environmentLeases.set(name, lease);
|
|
43
|
-
}
|
|
44
|
-
const owner = Symbol(name);
|
|
45
|
-
lease.owners.add(owner);
|
|
46
|
-
let released = false;
|
|
47
|
-
return ()=>{
|
|
48
|
-
if (released) return;
|
|
49
|
-
if (environmentLeases.get(name) !== lease || !lease.owners.has(owner)) throw new Error(`Build config environment lease for "${name}" cannot be restored because its ownership record was lost.`);
|
|
50
|
-
released = true;
|
|
51
|
-
const lostOwnership = process.env[name] !== lease.value;
|
|
52
|
-
lease.owners.delete(owner);
|
|
53
|
-
if (0 === lease.owners.size) {
|
|
54
|
-
environmentLeases.delete(name);
|
|
55
|
-
restoreEnvironment(name, lease.originalValue);
|
|
56
|
-
} else if (lostOwnership) process.env[name] = lease.value;
|
|
57
|
-
if (lostOwnership) throw new Error(`Build config environment lease for "${name}" lost ownership before restoration.`);
|
|
58
|
-
};
|
|
59
|
-
},
|
|
60
|
-
brand: ENVIRONMENT_LEASE_REGISTRY_BRAND
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
function getEnvironmentLeaseRegistry() {
|
|
64
|
-
const descriptor = Object.getOwnPropertyDescriptor(process, ENVIRONMENT_LEASE_REGISTRY_KEY);
|
|
65
|
-
if (descriptor) {
|
|
66
|
-
const registry = descriptor.value;
|
|
67
|
-
if (descriptor.configurable || descriptor.enumerable || descriptor.writable || registry?.brand !== ENVIRONMENT_LEASE_REGISTRY_BRAND || 'function' != typeof registry.acquire) throw new Error('The process-global build config environment lease registry is occupied by an incompatible value.');
|
|
68
|
-
return registry;
|
|
69
|
-
}
|
|
70
|
-
const registry = createEnvironmentLeaseRegistry();
|
|
71
|
-
Object.defineProperty(process, ENVIRONMENT_LEASE_REGISTRY_KEY, {
|
|
72
|
-
configurable: false,
|
|
73
|
-
enumerable: false,
|
|
74
|
-
value: registry,
|
|
75
|
-
writable: false
|
|
76
|
-
});
|
|
77
|
-
return registry;
|
|
78
|
-
}
|
|
79
|
-
function acquireEnvironmentLease(name, value) {
|
|
80
|
-
return getEnvironmentLeaseRegistry().acquire(name, value);
|
|
81
|
-
}
|
|
82
|
-
function releaseAfterFailure(release, originalError) {
|
|
83
|
-
try {
|
|
84
|
-
release();
|
|
85
|
-
} catch (restorationError) {
|
|
86
|
-
throw new AggregateError([
|
|
87
|
-
originalError,
|
|
88
|
-
restorationError
|
|
89
|
-
], 'Build config environment setup and restoration both failed.');
|
|
90
|
-
}
|
|
91
|
-
throw originalError;
|
|
92
|
-
}
|
|
93
|
-
class BuildConfigEnvironmentLeasePlugin {
|
|
94
|
-
apply(compiler) {
|
|
95
|
-
const hooks = compiler.hooks;
|
|
96
|
-
try {
|
|
97
|
-
const lifecycleHooks = {};
|
|
98
|
-
for (const hookName of LIFECYCLE_HOOK_NAMES){
|
|
99
|
-
const hook = hooks[hookName];
|
|
100
|
-
if (!hook || 'function' != typeof hook.tap) throw new Error(`Rspack does not expose the "${hookName}" lifecycle hook required to restore build config environment leases.`);
|
|
101
|
-
lifecycleHooks[hookName] = hook;
|
|
102
|
-
}
|
|
103
|
-
let mode = 'pending';
|
|
104
|
-
const modeTap = {
|
|
105
|
-
name: BUILD_CONFIG_ENVIRONMENT_PLUGIN,
|
|
106
|
-
stage: Number.MIN_SAFE_INTEGER
|
|
107
|
-
};
|
|
108
|
-
const releaseTap = {
|
|
109
|
-
name: BUILD_CONFIG_ENVIRONMENT_PLUGIN,
|
|
110
|
-
stage: Number.MAX_SAFE_INTEGER
|
|
111
|
-
};
|
|
112
|
-
const releaseAfterOneShot = ()=>{
|
|
113
|
-
if ('watch' !== mode && true !== compiler.watchMode) this.release();
|
|
114
|
-
};
|
|
115
|
-
lifecycleHooks.run.tap(modeTap, ()=>{
|
|
116
|
-
mode = 'run';
|
|
117
|
-
});
|
|
118
|
-
lifecycleHooks.watchRun.tap(modeTap, ()=>{
|
|
119
|
-
mode = 'watch';
|
|
120
|
-
});
|
|
121
|
-
lifecycleHooks.afterDone.tap(releaseTap, releaseAfterOneShot);
|
|
122
|
-
lifecycleHooks.failed.tap(releaseTap, releaseAfterOneShot);
|
|
123
|
-
lifecycleHooks.shutdown.tap(releaseTap, this.release);
|
|
124
|
-
lifecycleHooks.watchClose.tap(releaseTap, this.release);
|
|
125
|
-
} catch (error) {
|
|
126
|
-
releaseAfterFailure(this.release, error);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
constructor(release){
|
|
130
|
-
this.release = release;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
12
|
function resolveEffectTsgoCli(from) {
|
|
134
13
|
const projectRequire = createRequire(from);
|
|
135
14
|
const packageJsonPath = projectRequire.resolve(`${EFFECT_TSGO_PACKAGE}/package.json`);
|
|
@@ -189,21 +68,6 @@ function resolveExecutableEffectTsgoCompiler(compilerPath) {
|
|
|
189
68
|
function getBuildConfigEnvironment(name) {
|
|
190
69
|
return process.env[name];
|
|
191
70
|
}
|
|
192
|
-
function withBuildConfigEnvironment(name, value, setup) {
|
|
193
|
-
return async (config, ...args)=>{
|
|
194
|
-
const release = acquireEnvironmentLease(name, value);
|
|
195
|
-
try {
|
|
196
|
-
const configured = await setup(config, ...args) ?? config;
|
|
197
|
-
configured.plugins = [
|
|
198
|
-
...configured.plugins ?? [],
|
|
199
|
-
new BuildConfigEnvironmentLeasePlugin(release)
|
|
200
|
-
];
|
|
201
|
-
return configured;
|
|
202
|
-
} catch (error) {
|
|
203
|
-
releaseAfterFailure(release, error);
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
71
|
function resolveEffectTsgoCompiler(options) {
|
|
208
72
|
const configuredCompiler = getBuildConfigEnvironment('EFFECT_TSGO_BIN')?.trim();
|
|
209
73
|
if (configuredCompiler) try {
|
|
@@ -222,4 +86,4 @@ function resolveEffectTsgoCompiler(options) {
|
|
|
222
86
|
} catch {}
|
|
223
87
|
throw new Error(EFFECT_TSGO_RESOLUTION_ERROR);
|
|
224
88
|
}
|
|
225
|
-
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler
|
|
89
|
+
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler
|
|
2
|
+
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler } from "./build-environment.mjs";
|
|
@@ -427,9 +427,6 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
|
|
|
427
427
|
appContext.appDirectory,
|
|
428
428
|
process.cwd()
|
|
429
429
|
];
|
|
430
|
-
const tanstackRouterSsrServerFile = resolvePackageFile('@tanstack/router-core', 'dist/esm/ssr/ssr-server.js', resolvePaths);
|
|
431
|
-
const runtimeRscWorkerFile = resolvePackageFile('@modern-js/runtime', 'dist/esm/rsc/server.worker.mjs', resolvePaths);
|
|
432
|
-
const renderRscWorkerFile = resolvePackageFile('@modern-js/render', 'dist/esm/rscWorker.mjs', resolvePaths);
|
|
433
430
|
const reactFile = resolvePackageFile('react', 'index.js', resolvePaths);
|
|
434
431
|
const reactJsxRuntimeFile = resolvePackageFile('react', 'jsx-runtime.js', resolvePaths);
|
|
435
432
|
const reactJsxDevRuntimeFile = resolvePackageFile('react', 'jsx-dev-runtime.js', resolvePaths);
|
|
@@ -439,9 +436,6 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
|
|
|
439
436
|
...resolvePaths,
|
|
440
437
|
getTemplatePath('')
|
|
441
438
|
]);
|
|
442
|
-
const loadableServerWorkerFile = getTemplatePath('cloudflare-worker-loadable-server.mjs');
|
|
443
|
-
const fsPromisesWorkerFile = getTemplatePath('cloudflare-worker-fs-promises.mjs');
|
|
444
|
-
const pathWorkerFile = getTemplatePath('cloudflare-worker-path.mjs');
|
|
445
439
|
const entryNames = [
|
|
446
440
|
...workerEntryNames
|
|
447
441
|
];
|
|
@@ -466,36 +460,12 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
|
|
|
466
460
|
});
|
|
467
461
|
chain.plugin('cloudflare-worker-absent-optional-dependencies').use(AbsentOptionalDependencyPlugin);
|
|
468
462
|
applyCloudflareWorkerMfRuntimeBoundary(chain);
|
|
469
|
-
if (tanstackRouterSsrServerFile) {
|
|
470
|
-
chain.resolve.alias.set('@tanstack/router-core/ssr/server$', tanstackRouterSsrServerFile);
|
|
471
|
-
chain.resolve.alias.set('@tanstack/router-core/ssr/server', tanstackRouterSsrServerFile);
|
|
472
|
-
}
|
|
473
|
-
if (runtimeRscWorkerFile) {
|
|
474
|
-
chain.resolve.alias.set('@modern-js/runtime/rsc/server$', runtimeRscWorkerFile);
|
|
475
|
-
chain.resolve.alias.set('@modern-js/runtime/rsc/server', runtimeRscWorkerFile);
|
|
476
|
-
}
|
|
477
|
-
if (renderRscWorkerFile) {
|
|
478
|
-
chain.resolve.alias.set('@modern-js/render/rsc$', renderRscWorkerFile);
|
|
479
|
-
chain.resolve.alias.set('@modern-js/render/rsc', renderRscWorkerFile);
|
|
480
|
-
chain.resolve.alias.set('@modern-js/render/rsc-worker$', renderRscWorkerFile);
|
|
481
|
-
}
|
|
482
463
|
setAliasIfPresent(chain.resolve.alias, 'react$', reactFile);
|
|
483
464
|
setAliasIfPresent(chain.resolve.alias, 'react/jsx-runtime$', reactJsxRuntimeFile);
|
|
484
465
|
setAliasIfPresent(chain.resolve.alias, 'react/jsx-dev-runtime$', reactJsxDevRuntimeFile);
|
|
485
466
|
setAliasIfPresent(chain.resolve.alias, 'react-dom$', reactDomFile);
|
|
486
467
|
setAliasIfPresent(chain.resolve.alias, 'react-dom/server.edge$', reactDomServerEdgeFile);
|
|
487
468
|
setAliasIfPresent(chain.resolve.alias, '@loadable/component$', loadableComponentFile);
|
|
488
|
-
setAliasIfPresent(chain.resolve.alias, '@loadable/server$', loadableServerWorkerFile);
|
|
489
|
-
setAliasIfPresent(chain.resolve.alias, 'fs/promises$', fsPromisesWorkerFile);
|
|
490
|
-
setAliasIfPresent(chain.resolve.alias, 'node:fs/promises$', fsPromisesWorkerFile);
|
|
491
|
-
setAliasIfPresent(chain.resolve.alias, 'path$', pathWorkerFile);
|
|
492
|
-
setAliasIfPresent(chain.resolve.alias, 'node:path$', pathWorkerFile);
|
|
493
|
-
chain.resolve.alias.set('react-server-dom-rspack/server.node$', 'react-server-dom-rspack/server.edge');
|
|
494
|
-
chain.resolve.alias.set('react-server-dom-rspack/server.node', 'react-server-dom-rspack/server.edge');
|
|
495
|
-
chain.resolve.alias.set('react-server-dom-rspack/client.node$', 'react-server-dom-rspack/client.edge');
|
|
496
|
-
chain.resolve.alias.set('react-server-dom-rspack/client.node', 'react-server-dom-rspack/client.edge');
|
|
497
|
-
chain.resolve.fallback.set('fs', false);
|
|
498
|
-
chain.resolve.fallback.set('node:fs', false);
|
|
499
469
|
};
|
|
500
470
|
};
|
|
501
471
|
function getCloudflareBuilderEnvironments({ appContext, environments, normalizedConfig, resolveDeployProvider = resolveStdEnvDeployProvider }) {
|
package/dist/esm-node/config.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler
|
|
2
|
+
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler } from "./build-config/public.mjs";
|
|
3
3
|
export { createRemoteManifestUrl } from "./build-config/remote-address.mjs";
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import node_os from "node:os";
|
|
3
|
+
import node_path from "node:path";
|
|
4
|
+
import { nodeFileTrace } from "@vercel/nft";
|
|
5
|
+
const SYSTEM_ROOTS = 'win32' === process.platform ? [] : [
|
|
6
|
+
'/dev',
|
|
7
|
+
'/etc',
|
|
8
|
+
'/proc',
|
|
9
|
+
'/run',
|
|
10
|
+
'/sys',
|
|
11
|
+
'/var/run'
|
|
12
|
+
];
|
|
13
|
+
const GLOB_SEGMENT = /[*?[{]/;
|
|
14
|
+
const isInside = (parent, child)=>child === parent || child.startsWith(`${parent}${node_path.sep}`);
|
|
15
|
+
const globRoot = (absolutePattern)=>{
|
|
16
|
+
const { root } = node_path.parse(absolutePattern);
|
|
17
|
+
const segments = absolutePattern.slice(root.length).split(node_path.sep);
|
|
18
|
+
const index = segments.findIndex((segment)=>GLOB_SEGMENT.test(segment));
|
|
19
|
+
return -1 === index ? void 0 : node_path.join(root, ...segments.slice(0, index));
|
|
20
|
+
};
|
|
21
|
+
const createBuildHostIgnore = (base)=>{
|
|
22
|
+
const wholeDirectories = new Set([
|
|
23
|
+
node_path.parse(node_path.resolve(base)).root,
|
|
24
|
+
node_path.resolve(node_os.homedir()),
|
|
25
|
+
node_path.resolve(node_os.tmpdir())
|
|
26
|
+
]);
|
|
27
|
+
return (relativePath)=>{
|
|
28
|
+
const absolutePath = node_path.resolve(base, relativePath);
|
|
29
|
+
if (SYSTEM_ROOTS.some((root)=>isInside(root, absolutePath))) return true;
|
|
30
|
+
const root = globRoot(absolutePath);
|
|
31
|
+
return void 0 !== root && wholeDirectories.has(root);
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
const traceDeployFiles = ({ entryFiles, sourceDir, base = '/' })=>nodeFileTrace(entryFiles, {
|
|
35
|
+
base,
|
|
36
|
+
processCwd: sourceDir,
|
|
37
|
+
ignore: createBuildHostIgnore(base)
|
|
38
|
+
});
|
|
39
|
+
export { createBuildHostIgnore, traceDeployFiles };
|
|
@@ -3,11 +3,13 @@ import { execFileSync } from "node:child_process";
|
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
4
|
const BUILD_MARKER_NAMESPACE = 'ultramodern-delivery-unit-release-build-marker:v1';
|
|
5
5
|
const PROMOTABLE_SOURCE_REVISION_PATTERN = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u;
|
|
6
|
+
const workspaceGitEnv = ()=>Object.fromEntries(Object.entries(process.env).filter(([name])=>!name.toUpperCase().startsWith('GIT_')));
|
|
6
7
|
const gitOutput = (workspaceRoot, args)=>{
|
|
7
8
|
try {
|
|
8
9
|
return execFileSync('git', args, {
|
|
9
10
|
cwd: workspaceRoot,
|
|
10
11
|
encoding: 'utf8',
|
|
12
|
+
env: workspaceGitEnv(),
|
|
11
13
|
stdio: [
|
|
12
14
|
'ignore',
|
|
13
15
|
'pipe',
|
|
@@ -1138,7 +1138,7 @@ async function withRouteCssLinks(
|
|
|
1138
1138
|
seenCssHrefs.add(entry.preloadHref);
|
|
1139
1139
|
return true;
|
|
1140
1140
|
});
|
|
1141
|
-
for (const {
|
|
1141
|
+
for (const { preloadHref } of uniqueCssEntries) {
|
|
1142
1142
|
const preloadUrl = new URL(preloadHref);
|
|
1143
1143
|
const preloadReference =
|
|
1144
1144
|
preloadUrl.origin === requestOrigin
|
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import type { URL } from 'node:url';
|
|
2
|
-
import type { Rspack } from '@rsbuild/core';
|
|
3
2
|
/**
|
|
4
3
|
* Reads an environment variable while keeping generated build configs free of
|
|
5
4
|
* direct process access.
|
|
6
5
|
*/
|
|
7
6
|
export declare function getBuildConfigEnvironment(name: string): string | undefined;
|
|
8
|
-
/**
|
|
9
|
-
* Runs a Rspack config setup under a leased environment value. The lease is
|
|
10
|
-
* restored when that compiler reaches any supported terminal hook.
|
|
11
|
-
*/
|
|
12
|
-
export declare function withBuildConfigEnvironment<Config extends {
|
|
13
|
-
plugins?: Rspack.Plugin[];
|
|
14
|
-
}, SetupArguments extends unknown[]>(name: string, value: string, setup: (config: Config, ...args: SetupArguments) => Config | void | Promise<Config | void>): (config: Config, ...args: SetupArguments) => Promise<Config>;
|
|
15
7
|
export type ResolveEffectTsgoCompilerOptions = {
|
|
16
8
|
/** Module URL or absolute filename used to resolve the consumer's compiler. */
|
|
17
9
|
from: string | URL;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export type { ResolveEffectTsgoCompilerOptions } from './build-environment.js';
|
|
2
|
-
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler,
|
|
2
|
+
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler, } from './build-environment.js';
|
package/dist/types/config.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { ResolveEffectTsgoCompilerOptions } from './build-config/public.js';
|
|
2
|
-
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler,
|
|
2
|
+
export { getBuildConfigEnvironment, resolveEffectTsgoCompiler, } from './build-config/public.js';
|
|
3
3
|
export { createRemoteManifestUrl } from './build-config/remote-address.js';
|
|
4
4
|
export type DeployTarget = 'node' | 'vercel' | 'netlify' | 'ghPages' | 'cloudflare';
|
|
5
5
|
export type CloudflareWorkerSecurityCspMode = 'enforce' | 'report-only' | 'off';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type NodeFileTraceResult } from '@vercel/nft';
|
|
2
|
+
/**
|
|
3
|
+
* Builds the nft `ignore` predicate for a trace rooted at `base`: skip every
|
|
4
|
+
* path under a system root, and skip globs that would enumerate the file
|
|
5
|
+
* system root, the home directory or the temp directory as a whole. Files
|
|
6
|
+
* inside home or temp are still traced, since package stores can live there.
|
|
7
|
+
*/
|
|
8
|
+
export declare const createBuildHostIgnore: (base: string) => (relativePath: string) => boolean;
|
|
9
|
+
/**
|
|
10
|
+
* `traceFiles` implementation for ndepe's `nodeDepEmit`, tracing with the
|
|
11
|
+
* `@vercel/nft` release app-tools-extensions depends on instead of the one ndepe pins.
|
|
12
|
+
*/
|
|
13
|
+
export declare const traceDeployFiles: ({ entryFiles, sourceDir, base, }: {
|
|
14
|
+
entryFiles: string[];
|
|
15
|
+
sourceDir: string;
|
|
16
|
+
base?: string;
|
|
17
|
+
}) => Promise<NodeFileTraceResult>;
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"directory": "packages/solutions/app-tools-extensions"
|
|
12
12
|
},
|
|
13
13
|
"license": "MIT",
|
|
14
|
-
"version": "3.9.0-ultramodern.
|
|
14
|
+
"version": "3.9.0-ultramodern.18",
|
|
15
15
|
"files": [
|
|
16
16
|
"dist",
|
|
17
17
|
"src"
|
|
@@ -116,6 +116,11 @@
|
|
|
116
116
|
"types": "./dist/types/deploy-output/target.d.ts",
|
|
117
117
|
"import": "./dist/esm-node/deploy-output/target.mjs",
|
|
118
118
|
"require": "./dist/cjs/deploy-output/target.js"
|
|
119
|
+
},
|
|
120
|
+
"./deploy-output/trace-files": {
|
|
121
|
+
"types": "./dist/types/deploy-output/trace-files.d.ts",
|
|
122
|
+
"import": "./dist/esm-node/deploy-output/trace-files.mjs",
|
|
123
|
+
"require": "./dist/cjs/deploy-output/trace-files.js"
|
|
119
124
|
}
|
|
120
125
|
},
|
|
121
126
|
"typesVersions": {
|
|
@@ -135,6 +140,9 @@
|
|
|
135
140
|
],
|
|
136
141
|
"deploy-output/target": [
|
|
137
142
|
"./dist/types/deploy-output/target.d.ts"
|
|
143
|
+
],
|
|
144
|
+
"deploy-output/trace-files": [
|
|
145
|
+
"./dist/types/deploy-output/trace-files.d.ts"
|
|
138
146
|
]
|
|
139
147
|
}
|
|
140
148
|
},
|
|
@@ -145,28 +153,36 @@
|
|
|
145
153
|
"@babel/parser": "^8.0.6",
|
|
146
154
|
"@babel/traverse": "^8.0.6",
|
|
147
155
|
"@loadable/component": "5.16.7",
|
|
148
|
-
"@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.0-ultramodern.
|
|
149
|
-
"@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.9.0-ultramodern.
|
|
150
|
-
"@modern-js/prod-server": "npm:@bleedingdev/modern-js-prod-server@3.9.0-ultramodern.
|
|
151
|
-
"@modern-js/runtime-renderer-extensions": "npm:@bleedingdev/modern-js-runtime-renderer-extensions@3.9.0-ultramodern.
|
|
152
|
-
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.
|
|
153
|
-
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.
|
|
154
|
-
"@modern-js/server-runtime-extensions": "npm:@bleedingdev/modern-js-server-runtime-extensions@3.9.0-ultramodern.
|
|
155
|
-
"@modern-js/surface-resolution": "npm:@bleedingdev/modern-js-surface-resolution@3.9.0-ultramodern.
|
|
156
|
-
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.
|
|
157
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.
|
|
156
|
+
"@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.0-ultramodern.18",
|
|
157
|
+
"@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.9.0-ultramodern.18",
|
|
158
|
+
"@modern-js/prod-server": "npm:@bleedingdev/modern-js-prod-server@3.9.0-ultramodern.18",
|
|
159
|
+
"@modern-js/runtime-renderer-extensions": "npm:@bleedingdev/modern-js-runtime-renderer-extensions@3.9.0-ultramodern.18",
|
|
160
|
+
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.18",
|
|
161
|
+
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.18",
|
|
162
|
+
"@modern-js/server-runtime-extensions": "npm:@bleedingdev/modern-js-server-runtime-extensions@3.9.0-ultramodern.18",
|
|
163
|
+
"@modern-js/surface-resolution": "npm:@bleedingdev/modern-js-surface-resolution@3.9.0-ultramodern.18",
|
|
164
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.18",
|
|
165
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.18",
|
|
158
166
|
"@swc/helpers": "^0.5.23",
|
|
167
|
+
"@vercel/nft": "^1.11.0",
|
|
159
168
|
"compression-webpack-plugin": "^12.0.0",
|
|
160
169
|
"esbuild": "^0.28.2",
|
|
161
170
|
"std-env": "4.2.0"
|
|
162
171
|
},
|
|
163
172
|
"peerDependencies": {
|
|
164
|
-
"@rsbuild/core": "2.2.9"
|
|
173
|
+
"@rsbuild/core": "2.2.9",
|
|
174
|
+
"react": "^19.2.8"
|
|
175
|
+
},
|
|
176
|
+
"peerDependenciesMeta": {
|
|
177
|
+
"react": {
|
|
178
|
+
"optional": true
|
|
179
|
+
}
|
|
165
180
|
},
|
|
166
181
|
"devDependencies": {
|
|
167
|
-
"@modern-js/
|
|
168
|
-
"@modern-js/plugin
|
|
169
|
-
"@modern-js/plugin-
|
|
182
|
+
"@modern-js/bff-effect": "npm:@bleedingdev/modern-js-bff-effect@3.9.0-ultramodern.18",
|
|
183
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.0-ultramodern.18",
|
|
184
|
+
"@modern-js/plugin-bff-extensions": "npm:@bleedingdev/modern-js-plugin-bff-extensions@3.9.0-ultramodern.18",
|
|
185
|
+
"@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.9.0-ultramodern.18",
|
|
170
186
|
"@module-federation/runtime-tools": "npm:@bleedingdev/mf-runtime-tools@2.9.1",
|
|
171
187
|
"@rsbuild/core": "2.2.9",
|
|
172
188
|
"@rslib/core": "1.0.2",
|
|
@@ -178,7 +194,9 @@
|
|
|
178
194
|
"effect": "npm:@bleedingdev/effect@4.0.0-rc.117",
|
|
179
195
|
"miniflare": "5.20260921.0-alpha",
|
|
180
196
|
"ndepe": "^0.1.13",
|
|
181
|
-
"pg": "8.23.0"
|
|
197
|
+
"pg": "8.23.0",
|
|
198
|
+
"react": "^19.3.0",
|
|
199
|
+
"react-dom": "^19.3.0"
|
|
182
200
|
},
|
|
183
201
|
"sideEffects": false,
|
|
184
202
|
"publishConfig": {
|