@bleedingdev/modern-js-plugin-bff-extensions 3.9.0-ultramodern.12 → 3.9.0-ultramodern.13
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 +3 -3
- package/dist/cjs/backend-federation/node-evaluator.js +48 -0
- package/dist/cjs/backend-federation/node.js +2 -2
- package/dist/cjs/backend-federation-manifest/node.js +2 -2
- package/dist/cjs/{effect-adapter → effect-server}/cross-project-policy.js +4 -4
- package/dist/cjs/{effect-adapter → effect-server}/entry.js +4 -4
- package/dist/cjs/{effect-adapter → effect-server}/error-response.js +4 -4
- package/dist/cjs/effect-server/index.js +199 -0
- package/dist/esm/backend-federation/node-evaluator.mjs +7 -0
- package/dist/esm/backend-federation/node.mjs +2 -2
- package/dist/esm/backend-federation-manifest/node.mjs +2 -2
- package/dist/esm/{effect-adapter → effect-server}/cross-project-policy.mjs +2 -2
- package/dist/esm/{effect-adapter → effect-server}/entry.mjs +2 -2
- package/dist/esm/{effect-adapter → effect-server}/error-response.mjs +2 -2
- package/dist/esm/effect-server/index.mjs +151 -0
- package/dist/esm-node/backend-federation/node-evaluator.mjs +8 -0
- package/dist/esm-node/backend-federation/node.mjs +2 -2
- package/dist/esm-node/backend-federation-manifest/node.mjs +2 -2
- package/dist/esm-node/{effect-adapter → effect-server}/cross-project-policy.mjs +2 -2
- package/dist/esm-node/{effect-adapter → effect-server}/entry.mjs +2 -2
- package/dist/esm-node/{effect-adapter → effect-server}/error-response.mjs +2 -2
- package/dist/esm-node/effect-server/index.mjs +152 -0
- package/dist/types/backend-federation/node-evaluator.d.ts +2 -0
- package/dist/types/{effect-adapter → effect-server}/cross-project-policy.d.ts +1 -1
- package/dist/types/{effect-adapter → effect-server}/entry.d.ts +1 -1
- package/dist/types/effect-server/error-response.d.ts +2 -0
- package/dist/types/effect-server/index.d.ts +4 -0
- package/package.json +27 -27
- package/src/backend-federation/node-evaluator.ts +13 -0
- package/src/backend-federation/node.ts +2 -3
- package/src/backend-federation-manifest/node.ts +2 -3
- package/src/{effect-adapter → effect-server}/cross-project-policy.ts +1 -1
- package/src/{effect-adapter → effect-server}/entry.ts +1 -1
- package/src/{effect-adapter → effect-server}/error-response.ts +1 -1
- package/src/effect-server/index.ts +242 -0
- package/dist/cjs/effect-adapter/index.js +0 -202
- package/dist/esm/effect-adapter/index.mjs +0 -151
- package/dist/esm-node/effect-adapter/index.mjs +0 -152
- package/dist/types/effect-adapter/error-response.d.ts +0 -2
- package/dist/types/effect-adapter/index.d.ts +0 -21
- package/src/effect-adapter/index.ts +0 -257
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import { evaluateNodeBackendFederationCommonJs } from "@modern-js/server-runtime-extensions/backend-federation-security/node";
|
|
3
2
|
import { loadBackendFederatedEffectApi } from "./load.mjs";
|
|
3
|
+
import { evaluateEffectBackendFederationCommonJs } from "./node-evaluator.mjs";
|
|
4
4
|
function node_loadBackendFederatedEffectApi(options) {
|
|
5
5
|
return loadBackendFederatedEffectApi({
|
|
6
6
|
...options,
|
|
7
7
|
entryPolicy: {
|
|
8
8
|
...options.entryPolicy,
|
|
9
|
-
evaluateCommonJs: options.entryPolicy?.evaluateCommonJs ??
|
|
9
|
+
evaluateCommonJs: options.entryPolicy?.evaluateCommonJs ?? evaluateEffectBackendFederationCommonJs
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
import {
|
|
2
|
+
import { evaluateEffectBackendFederationCommonJs } from "../backend-federation/node-evaluator.mjs";
|
|
3
3
|
import { loadBackendFederatedEffectApiFromManifest } from "./load.mjs";
|
|
4
4
|
function node_loadBackendFederatedEffectApiFromManifest(options) {
|
|
5
5
|
return loadBackendFederatedEffectApiFromManifest({
|
|
6
6
|
...options,
|
|
7
7
|
entryPolicy: {
|
|
8
8
|
...options.entryPolicy,
|
|
9
|
-
evaluateCommonJs: options.entryPolicy?.evaluateCommonJs ??
|
|
9
|
+
evaluateCommonJs: options.entryPolicy?.evaluateCommonJs ?? evaluateEffectBackendFederationCommonJs
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
}
|
|
@@ -3,7 +3,7 @@ import { collectEffectEndpoints, extractHttpApiFromModule, toOperationContractSo
|
|
|
3
3
|
import { logger } from "@modern-js/utils";
|
|
4
4
|
import { HttpApi } from "effect/unstable/httpapi";
|
|
5
5
|
import { resolveAdapterCrossProjectPolicy } from "../cross-project-policy/index.mjs";
|
|
6
|
-
function
|
|
6
|
+
function resolveEffectServerCrossProjectPolicy(api, prefix, mod, producer) {
|
|
7
7
|
const contractSourcesPromise = null === mod ? Promise.resolve([]) : Promise.resolve().then(()=>extractHttpApiFromModule(mod, HttpApi.isHttpApi)).then((effectApi)=>{
|
|
8
8
|
if (null === effectApi) return [];
|
|
9
9
|
const reflect = (apiValue, handlers)=>{
|
|
@@ -24,4 +24,4 @@ function resolveEffectAdapterCrossProjectPolicy(api, prefix, mod, producer) {
|
|
|
24
24
|
return policy;
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
|
-
export {
|
|
27
|
+
export { resolveEffectServerCrossProjectPolicy };
|
|
@@ -3,7 +3,7 @@ import node_path from "node:path";
|
|
|
3
3
|
import "@modern-js/server-runtime-extensions/server-config";
|
|
4
4
|
import { API_DIR, isProd } from "@modern-js/utils";
|
|
5
5
|
import { resolveEffectEntry } from "../effect-source-loader/paths.mjs";
|
|
6
|
-
function
|
|
6
|
+
function resolveEffectServerEntryFile(api) {
|
|
7
7
|
const { appDirectory, apiDirectory, distDirectory } = api.getServerContext();
|
|
8
8
|
const appDir = node_path.resolve(appDirectory || process.cwd());
|
|
9
9
|
return resolveEffectEntry({
|
|
@@ -13,4 +13,4 @@ function resolveEffectAdapterEntryFile(api) {
|
|
|
13
13
|
distDir: isProd() && distDirectory ? node_path.resolve(distDirectory) : void 0
|
|
14
14
|
}).path;
|
|
15
15
|
}
|
|
16
|
-
export {
|
|
16
|
+
export { resolveEffectServerEntryFile };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { createSafeFailureResponse } from "@modern-js/runtime-extensions/safe-failure";
|
|
3
3
|
import { logger } from "@modern-js/utils";
|
|
4
|
-
function
|
|
4
|
+
function createEffectServerRuntimeErrorResponse(api, error, context) {
|
|
5
5
|
try {
|
|
6
6
|
const onError = api.getServerConfig()?.onError;
|
|
7
7
|
if (void 0 !== onError) return Promise.resolve(onError(error instanceof Error ? error : new Error(String(error)), ensureJsonContext(context))).then((result)=>result instanceof Response ? result : createSafeFailureResponse(error)).catch((configError)=>{
|
|
@@ -35,4 +35,4 @@ function ensureJsonContext(context) {
|
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
export {
|
|
38
|
+
export { createEffectServerRuntimeErrorResponse };
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
import "@modern-js/server-runtime-extensions/server-config";
|
|
4
|
+
import { dispatchEffectBffRequest, resolveEffectBffModuleHandler, useEffectContext } from "@modern-js/bff-effect/effect";
|
|
5
|
+
import { resolveOperationProducer } from "@modern-js/server-runtime-extensions/bff-policy/node";
|
|
6
|
+
import { createDisposableServerRuntimeHandle, registerServerRuntimeDisposer } from "@modern-js/server-runtime-extensions/runtime-lifecycle";
|
|
7
|
+
import { fs, isProd, logger } from "@modern-js/utils";
|
|
8
|
+
import { checkCrossProjectPolicyForRequest } from "../cross-project-policy/evaluation.mjs";
|
|
9
|
+
import { loadEffectBuiltModule, loadEffectSourceModule } from "../effect-source-loader/loader.mjs";
|
|
10
|
+
import { resolveEffectServerCrossProjectPolicy } from "./cross-project-policy.mjs";
|
|
11
|
+
import { resolveEffectServerEntryFile } from "./entry.mjs";
|
|
12
|
+
import { createEffectServerRuntimeErrorResponse } from "./error-response.mjs";
|
|
13
|
+
const EFFECT_MIDDLEWARE_BEFORE = [
|
|
14
|
+
'custom-server-hook',
|
|
15
|
+
'custom-server-middleware',
|
|
16
|
+
'render'
|
|
17
|
+
];
|
|
18
|
+
const effect_server = ()=>({
|
|
19
|
+
name: '@modern-js/plugin-bff-extensions/effect-server',
|
|
20
|
+
setup (api) {
|
|
21
|
+
const runtimeFramework = api.getServerContext().bffRuntimeFramework;
|
|
22
|
+
if ('effect' !== runtimeFramework) throw new Error(`Effect BFF server plugin requires Effect; received "${runtimeFramework}".`);
|
|
23
|
+
let handler = null;
|
|
24
|
+
let unregisterRuntimeDisposer;
|
|
25
|
+
let prefix = '/api';
|
|
26
|
+
let prefixes = [
|
|
27
|
+
'/api'
|
|
28
|
+
];
|
|
29
|
+
let matchingPrefixes = [
|
|
30
|
+
'/api'
|
|
31
|
+
];
|
|
32
|
+
let retired = false;
|
|
33
|
+
const dispose = async ()=>{
|
|
34
|
+
retired = true;
|
|
35
|
+
unregisterRuntimeDisposer?.();
|
|
36
|
+
unregisterRuntimeDisposer = void 0;
|
|
37
|
+
const previous = handler;
|
|
38
|
+
handler = null;
|
|
39
|
+
await previous?.dispose();
|
|
40
|
+
};
|
|
41
|
+
const loadHandler = async ()=>{
|
|
42
|
+
const entryFile = resolveEffectServerEntryFile(api);
|
|
43
|
+
if (!entryFile || !await fs.pathExists(entryFile)) {
|
|
44
|
+
handler = null;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const { appDirectory } = api.getServerContext();
|
|
48
|
+
let mod;
|
|
49
|
+
try {
|
|
50
|
+
mod = await (isProd() ? loadEffectBuiltModule(entryFile) : loadEffectSourceModule({
|
|
51
|
+
resourcePath: entryFile,
|
|
52
|
+
appDir: appDirectory || node_path.dirname(entryFile)
|
|
53
|
+
}));
|
|
54
|
+
} catch (error) {
|
|
55
|
+
logger.error(`[BFF][Effect] Failed to load Effect entry: ${entryFile}\n${String(error)}`);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
const producer = resolveOperationProducer({
|
|
59
|
+
directories: [
|
|
60
|
+
node_path.dirname(entryFile),
|
|
61
|
+
appDirectory
|
|
62
|
+
],
|
|
63
|
+
requestId: api.getServerConfig()?.bff?.requestId
|
|
64
|
+
});
|
|
65
|
+
const crossProjectPolicies = new Map(await Promise.all(prefixes.map(async (prefix)=>[
|
|
66
|
+
prefix,
|
|
67
|
+
await resolveEffectServerCrossProjectPolicy(api, prefix, mod, producer)
|
|
68
|
+
])));
|
|
69
|
+
const effectConfig = api.getServerConfig()?.bff?.effect;
|
|
70
|
+
const loaded = await resolveEffectBffModuleHandler(mod, {
|
|
71
|
+
openapi: effectConfig?.openapi,
|
|
72
|
+
dataPlatform: effectConfig?.dataPlatform,
|
|
73
|
+
validateRequest: (request)=>{
|
|
74
|
+
const { path: mountedPathname } = useEffectContext();
|
|
75
|
+
const prefix = matchingPrefixes.find((item)=>'/' === item || mountedPathname === item || mountedPathname.startsWith(`${item}/`));
|
|
76
|
+
if (!prefix) return null;
|
|
77
|
+
const requestUrl = new URL(request.url);
|
|
78
|
+
if ('/' !== prefix) requestUrl.pathname = '/' === requestUrl.pathname ? prefix : `${prefix}${requestUrl.pathname}`;
|
|
79
|
+
return checkCrossProjectPolicyForRequest(new Request(requestUrl, request), crossProjectPolicies.get(prefix));
|
|
80
|
+
},
|
|
81
|
+
onWarning: (message)=>logger.warn(message)
|
|
82
|
+
});
|
|
83
|
+
if (!loaded) {
|
|
84
|
+
const error = new Error(`[BFF][Effect] Invalid Effect entry module: ${entryFile}. Export defineEffectBff(...) or a { api, layer } HttpApi module.`);
|
|
85
|
+
logger.warn(error.message);
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
const candidateOwner = {};
|
|
89
|
+
if (loaded.dispose) registerServerRuntimeDisposer(candidateOwner, loaded.dispose);
|
|
90
|
+
const candidate = createDisposableServerRuntimeHandle(candidateOwner, loaded.handler);
|
|
91
|
+
if (retired) {
|
|
92
|
+
await candidate.dispose();
|
|
93
|
+
throw new Error('Cannot initialize a retired Effect server.');
|
|
94
|
+
}
|
|
95
|
+
handler = candidate;
|
|
96
|
+
};
|
|
97
|
+
api.onPrepare(async ()=>{
|
|
98
|
+
const { middlewares: globalMiddlewares } = api.getServerContext();
|
|
99
|
+
const configuredPrefix = api.getServerConfig()?.bff?.prefix;
|
|
100
|
+
const enableHandleWeb = api.getServerConfig()?.bff?.enableHandleWeb;
|
|
101
|
+
const configuredPrefixes = Array.isArray(configuredPrefix) ? configuredPrefix.filter(Boolean) : [
|
|
102
|
+
configuredPrefix || '/api'
|
|
103
|
+
];
|
|
104
|
+
prefixes = [
|
|
105
|
+
...new Set(configuredPrefixes.length > 0 ? configuredPrefixes : [
|
|
106
|
+
'/api'
|
|
107
|
+
])
|
|
108
|
+
];
|
|
109
|
+
matchingPrefixes = [
|
|
110
|
+
...prefixes
|
|
111
|
+
].sort((left, right)=>right.length - left.length);
|
|
112
|
+
prefix = prefixes[0] || '/api';
|
|
113
|
+
const { serverBase } = api.getServerContext();
|
|
114
|
+
if (serverBase) unregisterRuntimeDisposer = registerServerRuntimeDisposer(serverBase, dispose);
|
|
115
|
+
try {
|
|
116
|
+
await loadHandler();
|
|
117
|
+
} catch (error) {
|
|
118
|
+
await dispose();
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
const middlewarePrefixes = enableHandleWeb ? [
|
|
122
|
+
prefix
|
|
123
|
+
] : matchingPrefixes;
|
|
124
|
+
const middlewares = middlewarePrefixes.map((middlewarePrefix)=>({
|
|
125
|
+
name: 'effect-api-handler',
|
|
126
|
+
path: enableHandleWeb ? '*' : `${middlewarePrefix}/*`,
|
|
127
|
+
method: 'all',
|
|
128
|
+
order: 'post',
|
|
129
|
+
before: EFFECT_MIDDLEWARE_BEFORE,
|
|
130
|
+
handler: async (context, next)=>{
|
|
131
|
+
const activeHandler = handler;
|
|
132
|
+
if (!activeHandler) {
|
|
133
|
+
if (enableHandleWeb) return void await next();
|
|
134
|
+
return createEffectServerRuntimeErrorResponse(api, new Error('[BFF][Effect] Missing Effect entry. Define api/index or configure bff.effect.entry.'), context);
|
|
135
|
+
}
|
|
136
|
+
const mountedPrefix = enableHandleWeb ? matchingPrefixes.find((item)=>'/' === item || context.req.path === item || context.req.path.startsWith(`${item}/`)) || prefix : middlewarePrefix;
|
|
137
|
+
const response = await dispatchEffectBffRequest(activeHandler, context.req.raw, {
|
|
138
|
+
prefix: mountedPrefix,
|
|
139
|
+
env: context.env,
|
|
140
|
+
path: context.req.path,
|
|
141
|
+
method: context.req.method,
|
|
142
|
+
onError: (error)=>createEffectServerRuntimeErrorResponse(api, error, context)
|
|
143
|
+
});
|
|
144
|
+
if (404 === response.status && enableHandleWeb) return void await next();
|
|
145
|
+
return new Response(response.body, response);
|
|
146
|
+
}
|
|
147
|
+
}));
|
|
148
|
+
globalMiddlewares.push(...middlewares);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
export default effect_server;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { evaluateNodeBackendFederationCommonJs } from '@modern-js/server-runtime-extensions/backend-federation-security/node';
|
|
2
|
+
export declare const evaluateEffectBackendFederationCommonJs: (source: Parameters<typeof evaluateNodeBackendFederationCommonJs>[0], context: Parameters<typeof evaluateNodeBackendFederationCommonJs>[1]) => Record<string, unknown>;
|
|
@@ -2,4 +2,4 @@ import { type EffectApiModule } from '@modern-js/bff-effect/effect';
|
|
|
2
2
|
import type { ServerPluginAPI } from '@modern-js/server-core';
|
|
3
3
|
import type { resolveOperationProducer } from '@modern-js/server-runtime-extensions/bff-policy/node';
|
|
4
4
|
import type { ResolvedCrossProjectPolicy } from '../cross-project-policy/evaluation.js';
|
|
5
|
-
export declare function
|
|
5
|
+
export declare function resolveEffectServerCrossProjectPolicy(api: ServerPluginAPI, prefix: string, mod: EffectApiModule | null, producer?: ReturnType<typeof resolveOperationProducer>): Promise<ResolvedCrossProjectPolicy | undefined>;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import '@modern-js/server-runtime-extensions/server-config';
|
|
2
2
|
import type { ServerPluginAPI } from '@modern-js/server-core';
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function resolveEffectServerEntryFile(api: ServerPluginAPI): string | undefined;
|
package/package.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"modern.js",
|
|
19
19
|
"ultramodern.js"
|
|
20
20
|
],
|
|
21
|
-
"version": "3.9.0-ultramodern.
|
|
21
|
+
"version": "3.9.0-ultramodern.13",
|
|
22
22
|
"files": [
|
|
23
23
|
"dist",
|
|
24
24
|
"src"
|
|
@@ -50,13 +50,13 @@
|
|
|
50
50
|
},
|
|
51
51
|
"default": "./dist/cjs/cross-project-generation/index.js"
|
|
52
52
|
},
|
|
53
|
-
"./effect-
|
|
54
|
-
"types": "./dist/types/effect-
|
|
53
|
+
"./effect-server": {
|
|
54
|
+
"types": "./dist/types/effect-server/index.d.ts",
|
|
55
55
|
"node": {
|
|
56
|
-
"import": "./dist/esm-node/effect-
|
|
57
|
-
"require": "./dist/cjs/effect-
|
|
56
|
+
"import": "./dist/esm-node/effect-server/index.mjs",
|
|
57
|
+
"require": "./dist/cjs/effect-server/index.js"
|
|
58
58
|
},
|
|
59
|
-
"default": "./dist/cjs/effect-
|
|
59
|
+
"default": "./dist/cjs/effect-server/index.js"
|
|
60
60
|
},
|
|
61
61
|
"./effect-source-loader": {
|
|
62
62
|
"types": "./dist/types/effect-source-loader/index.d.ts",
|
|
@@ -147,9 +147,9 @@
|
|
|
147
147
|
"./dist/types/cross-project-generation/index.d.ts",
|
|
148
148
|
"./src/cross-project-generation/index.ts"
|
|
149
149
|
],
|
|
150
|
-
"effect-
|
|
151
|
-
"./dist/types/effect-
|
|
152
|
-
"./src/effect-
|
|
150
|
+
"effect-server": [
|
|
151
|
+
"./dist/types/effect-server/index.d.ts",
|
|
152
|
+
"./src/effect-server/index.ts"
|
|
153
153
|
],
|
|
154
154
|
"effect-source-loader": [
|
|
155
155
|
"./dist/types/effect-source-loader/index.d.ts",
|
|
@@ -193,21 +193,21 @@
|
|
|
193
193
|
"node": ">=26.7.0"
|
|
194
194
|
},
|
|
195
195
|
"dependencies": {
|
|
196
|
-
"@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.0-ultramodern.
|
|
197
|
-
"@modern-js/bff-core": "npm:@bleedingdev/modern-js-bff-core@3.9.0-ultramodern.
|
|
198
|
-
"@modern-js/bff-effect": "npm:@bleedingdev/modern-js-bff-effect@3.9.0-ultramodern.
|
|
199
|
-
"@modern-js/runtime-extensions": "npm:@bleedingdev/modern-js-runtime-extensions@3.9.0-ultramodern.
|
|
200
|
-
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.
|
|
201
|
-
"@modern-js/server-runtime-extensions": "npm:@bleedingdev/modern-js-server-runtime-extensions@3.9.0-ultramodern.
|
|
202
|
-
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.
|
|
203
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.
|
|
204
|
-
"@module-federation/runtime": "2.9.
|
|
196
|
+
"@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.0-ultramodern.13",
|
|
197
|
+
"@modern-js/bff-core": "npm:@bleedingdev/modern-js-bff-core@3.9.0-ultramodern.13",
|
|
198
|
+
"@modern-js/bff-effect": "npm:@bleedingdev/modern-js-bff-effect@3.9.0-ultramodern.13",
|
|
199
|
+
"@modern-js/runtime-extensions": "npm:@bleedingdev/modern-js-runtime-extensions@3.9.0-ultramodern.13",
|
|
200
|
+
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.13",
|
|
201
|
+
"@modern-js/server-runtime-extensions": "npm:@bleedingdev/modern-js-server-runtime-extensions@3.9.0-ultramodern.13",
|
|
202
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.13",
|
|
203
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.13",
|
|
204
|
+
"@module-federation/runtime": "npm:@bleedingdev/mf-runtime@2.9.1",
|
|
205
205
|
"@swc/core": "1.16.2",
|
|
206
206
|
"esbuild": "^0.28.2"
|
|
207
207
|
},
|
|
208
208
|
"peerDependencies": {
|
|
209
|
-
"@effect/opentelemetry": "4.0.0-rc.
|
|
210
|
-
"effect": "4.0.0-rc.
|
|
209
|
+
"@effect/opentelemetry": "4.0.0-rc.117",
|
|
210
|
+
"effect": "4.0.0-rc.117"
|
|
211
211
|
},
|
|
212
212
|
"peerDependenciesMeta": {
|
|
213
213
|
"@effect/opentelemetry": {
|
|
@@ -218,15 +218,15 @@
|
|
|
218
218
|
}
|
|
219
219
|
},
|
|
220
220
|
"devDependencies": {
|
|
221
|
-
"@effect/opentelemetry": "4.0.0-rc.
|
|
222
|
-
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.0-ultramodern.
|
|
223
|
-
"@rsbuild/core": "2.2.
|
|
224
|
-
"@rslib/core": "1.0.
|
|
221
|
+
"@effect/opentelemetry": "4.0.0-rc.117",
|
|
222
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.0-ultramodern.13",
|
|
223
|
+
"@rsbuild/core": "2.2.9",
|
|
224
|
+
"@rslib/core": "1.0.2",
|
|
225
225
|
"@scripts/rstest-config": "2.66.0",
|
|
226
|
-
"@types/node": "^26.
|
|
227
|
-
"@types/react": "^19.
|
|
226
|
+
"@types/node": "^26.6.2",
|
|
227
|
+
"@types/react": "^19.3.0",
|
|
228
228
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
229
|
-
"effect": "4.0.0-rc.
|
|
229
|
+
"effect": "npm:@bleedingdev/effect@4.0.0-rc.117"
|
|
230
230
|
},
|
|
231
231
|
"sideEffects": false,
|
|
232
232
|
"publishConfig": {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { evaluateNodeBackendFederationCommonJs } from '@modern-js/server-runtime-extensions/backend-federation-security/node';
|
|
3
|
+
|
|
4
|
+
const fromAdapter = createRequire(import.meta.url);
|
|
5
|
+
const fromEffectPackage = createRequire(
|
|
6
|
+
fromAdapter.resolve('@modern-js/bff-effect/package.json'),
|
|
7
|
+
);
|
|
8
|
+
const privateRegistry = fromEffectPackage(`#effect-entry-shape-${'registry'}`);
|
|
9
|
+
|
|
10
|
+
export const evaluateEffectBackendFederationCommonJs = (
|
|
11
|
+
source: Parameters<typeof evaluateNodeBackendFederationCommonJs>[0],
|
|
12
|
+
context: Parameters<typeof evaluateNodeBackendFederationCommonJs>[1],
|
|
13
|
+
) => evaluateNodeBackendFederationCommonJs(source, context, privateRegistry);
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { evaluateNodeBackendFederationCommonJs } from '@modern-js/server-runtime-extensions/backend-federation-security/node';
|
|
2
|
-
|
|
3
1
|
import { loadBackendFederatedEffectApi as loadUniversalBackendFederatedEffectApi } from './load';
|
|
2
|
+
import { evaluateEffectBackendFederationCommonJs } from './node-evaluator';
|
|
4
3
|
import type {
|
|
5
4
|
BackendFederatedEffectApiModule,
|
|
6
5
|
BackendFederationIdentityLoadOptions,
|
|
@@ -16,7 +15,7 @@ export function loadBackendFederatedEffectApi(
|
|
|
16
15
|
...options.entryPolicy,
|
|
17
16
|
evaluateCommonJs:
|
|
18
17
|
options.entryPolicy?.evaluateCommonJs ??
|
|
19
|
-
|
|
18
|
+
evaluateEffectBackendFederationCommonJs,
|
|
20
19
|
},
|
|
21
20
|
});
|
|
22
21
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { evaluateNodeBackendFederationCommonJs } from '@modern-js/server-runtime-extensions/backend-federation-security/node';
|
|
2
|
-
|
|
3
1
|
import type { BackendFederatedEffectApiModule } from '../backend-federation';
|
|
2
|
+
import { evaluateEffectBackendFederationCommonJs } from '../backend-federation/node-evaluator';
|
|
4
3
|
import { loadBackendFederatedEffectApiFromManifest as loadUniversalBackendFederatedEffectApiFromManifest } from './load';
|
|
5
4
|
import type { BackendFederationManifestAdapterOptions } from './types';
|
|
6
5
|
|
|
@@ -13,7 +12,7 @@ export function loadBackendFederatedEffectApiFromManifest(
|
|
|
13
12
|
...options.entryPolicy,
|
|
14
13
|
evaluateCommonJs:
|
|
15
14
|
options.entryPolicy?.evaluateCommonJs ??
|
|
16
|
-
|
|
15
|
+
evaluateEffectBackendFederationCommonJs,
|
|
17
16
|
},
|
|
18
17
|
});
|
|
19
18
|
}
|
|
@@ -13,7 +13,7 @@ import { HttpApi } from 'effect/unstable/httpapi';
|
|
|
13
13
|
import { resolveAdapterCrossProjectPolicy } from '../cross-project-policy';
|
|
14
14
|
import type { ResolvedCrossProjectPolicy } from '../cross-project-policy/evaluation';
|
|
15
15
|
|
|
16
|
-
export function
|
|
16
|
+
export function resolveEffectServerCrossProjectPolicy(
|
|
17
17
|
api: ServerPluginAPI,
|
|
18
18
|
prefix: string,
|
|
19
19
|
mod: EffectApiModule | null,
|
|
@@ -5,7 +5,7 @@ import type { ServerPluginAPI } from '@modern-js/server-core';
|
|
|
5
5
|
import { API_DIR, isProd } from '@modern-js/utils';
|
|
6
6
|
import { resolveEffectEntry } from '../effect-source-loader/paths';
|
|
7
7
|
|
|
8
|
-
export function
|
|
8
|
+
export function resolveEffectServerEntryFile(api: ServerPluginAPI) {
|
|
9
9
|
const { appDirectory, apiDirectory, distDirectory } = api.getServerContext();
|
|
10
10
|
const appDir = path.resolve(appDirectory || process.cwd());
|
|
11
11
|
return resolveEffectEntry({
|
|
@@ -2,7 +2,7 @@ import { createSafeFailureResponse } from '@modern-js/runtime-extensions/safe-fa
|
|
|
2
2
|
import type { Context, ServerPluginAPI } from '@modern-js/server-core';
|
|
3
3
|
import { logger } from '@modern-js/utils';
|
|
4
4
|
|
|
5
|
-
export function
|
|
5
|
+
export function createEffectServerRuntimeErrorResponse(
|
|
6
6
|
api: ServerPluginAPI,
|
|
7
7
|
error: unknown,
|
|
8
8
|
context: Context,
|