@bleedingdev/modern-js-plugin-bff-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 +21 -4
- package/dist/cjs/backend-federation/edge.js +1 -1
- package/dist/cjs/backend-federation/identity.js +23 -22
- package/dist/cjs/backend-federation/integrity-plugin.js +112 -0
- package/dist/cjs/backend-federation/node-shared.js +85 -0
- package/dist/cjs/backend-federation/node.js +6 -1
- package/dist/cjs/backend-federation/plugin.js +40 -21
- package/dist/cjs/backend-federation/runtime.js +16 -84
- package/dist/cjs/backend-federation-manifest/load.js +31 -5
- package/dist/cjs/backend-federation-manifest/node.js +3 -1
- package/dist/cjs/backend-federation-manifest/remote.js +1 -7
- package/dist/cjs/backend-federation-manifest/validation.js +11 -7
- package/dist/cjs/cross-project-policy/node.js +8 -28
- package/dist/cjs/{effect-adapter → effect-server}/cross-project-policy.js +9 -9
- package/dist/cjs/effect-server/entry.js +63 -0
- package/dist/cjs/{effect-adapter → effect-server}/error-response.js +4 -4
- package/dist/cjs/effect-server/index.js +199 -0
- package/dist/cjs/effect-source-loader/built-entry.js +4 -5
- package/dist/cjs/effect-source-loader/http-api-runtime.js +4 -4
- package/dist/cjs/effect-source-loader/loader.js +8 -2
- package/dist/cjs/effect-source-loader/operation-contracts.js +8 -31
- package/dist/cjs/effect-source-loader/paths.js +38 -10
- package/dist/esm/backend-federation/edge.mjs +1 -1
- package/dist/esm/backend-federation/identity.mjs +18 -23
- package/dist/esm/backend-federation/integrity-plugin.mjs +68 -0
- package/dist/esm/backend-federation/node-shared.mjs +41 -0
- package/dist/esm/backend-federation/node.mjs +4 -2
- package/dist/esm/backend-federation/plugin.mjs +37 -18
- package/dist/esm/backend-federation/runtime.mjs +16 -84
- package/dist/esm/backend-federation-manifest/load.mjs +31 -5
- package/dist/esm/backend-federation-manifest/node.mjs +3 -1
- package/dist/esm/backend-federation-manifest/remote.mjs +1 -7
- package/dist/esm/backend-federation-manifest/validation.mjs +12 -8
- package/dist/esm/cross-project-policy/node.mjs +9 -19
- package/dist/esm/{effect-adapter → effect-server}/cross-project-policy.mjs +4 -4
- package/dist/esm/effect-server/entry.mjs +15 -0
- package/dist/esm/{effect-adapter → effect-server}/error-response.mjs +2 -2
- package/dist/esm/effect-server/index.mjs +151 -0
- package/dist/esm/effect-source-loader/built-entry.mjs +5 -6
- package/dist/esm/effect-source-loader/http-api-runtime.mjs +1 -1
- package/dist/esm/effect-source-loader/loader.mjs +8 -2
- package/dist/esm/effect-source-loader/operation-contracts.mjs +10 -33
- package/dist/esm/effect-source-loader/paths.mjs +30 -11
- package/dist/esm-node/backend-federation/edge.mjs +1 -1
- package/dist/esm-node/backend-federation/identity.mjs +18 -23
- package/dist/esm-node/backend-federation/integrity-plugin.mjs +69 -0
- package/dist/esm-node/backend-federation/node-shared.mjs +42 -0
- package/dist/esm-node/backend-federation/node.mjs +4 -2
- package/dist/esm-node/backend-federation/plugin.mjs +37 -18
- package/dist/esm-node/backend-federation/runtime.mjs +16 -84
- package/dist/esm-node/backend-federation-manifest/load.mjs +31 -5
- package/dist/esm-node/backend-federation-manifest/node.mjs +3 -1
- package/dist/esm-node/backend-federation-manifest/remote.mjs +1 -7
- package/dist/esm-node/backend-federation-manifest/validation.mjs +12 -8
- package/dist/esm-node/cross-project-policy/node.mjs +9 -19
- package/dist/esm-node/{effect-adapter → effect-server}/cross-project-policy.mjs +4 -4
- package/dist/esm-node/effect-server/entry.mjs +16 -0
- 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/esm-node/effect-source-loader/built-entry.mjs +5 -6
- package/dist/esm-node/effect-source-loader/http-api-runtime.mjs +1 -1
- package/dist/esm-node/effect-source-loader/loader.mjs +8 -2
- package/dist/esm-node/effect-source-loader/operation-contracts.mjs +10 -33
- package/dist/esm-node/effect-source-loader/paths.mjs +30 -11
- package/dist/types/backend-federation/edge.d.ts +4 -2
- package/dist/types/backend-federation/identity.d.ts +3 -6
- package/dist/types/backend-federation/integrity-plugin.d.ts +13 -0
- package/dist/types/backend-federation/node-shared.d.ts +20 -0
- package/dist/types/backend-federation/node.d.ts +3 -0
- package/dist/types/backend-federation/plugin.d.ts +4 -0
- package/dist/types/backend-federation/types.d.ts +2 -7
- package/dist/types/backend-federation-manifest/types.d.ts +2 -1
- package/dist/types/cross-project-policy/node.d.ts +2 -2
- package/dist/types/effect-server/cross-project-policy.d.ts +5 -0
- 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/dist/types/effect-source-loader/paths.d.ts +20 -2
- package/package.json +35 -33
- package/src/backend-federation/edge.ts +7 -4
- package/src/backend-federation/identity.ts +39 -47
- package/src/backend-federation/integrity-plugin.ts +157 -0
- package/src/backend-federation/load.ts +0 -1
- package/src/backend-federation/node-shared.ts +76 -0
- package/src/backend-federation/node.ts +7 -3
- package/src/backend-federation/plugin.ts +73 -25
- package/src/backend-federation/runtime.ts +16 -90
- package/src/backend-federation/types.ts +2 -11
- package/src/backend-federation-manifest/load.ts +76 -27
- package/src/backend-federation-manifest/node.ts +3 -2
- package/src/backend-federation-manifest/remote.ts +0 -6
- package/src/backend-federation-manifest/types.ts +2 -0
- package/src/backend-federation-manifest/validation.ts +22 -29
- package/src/cross-project-policy/node.ts +7 -38
- package/src/{effect-adapter → effect-server}/cross-project-policy.ts +9 -3
- package/src/effect-server/entry.ts +18 -0
- package/src/{effect-adapter → effect-server}/error-response.ts +1 -1
- package/src/effect-server/index.ts +242 -0
- package/src/effect-source-loader/built-entry.ts +11 -9
- package/src/effect-source-loader/http-api-runtime.ts +1 -1
- package/src/effect-source-loader/loader.ts +17 -6
- package/src/effect-source-loader/operation-contracts.ts +7 -41
- package/src/effect-source-loader/paths.ts +55 -21
- package/src/effect-source-loader/rspack-loader.ts +0 -1
- package/dist/cjs/backend-federation/entry.js +0 -94
- package/dist/cjs/effect-adapter/entry.js +0 -99
- package/dist/cjs/effect-adapter/index.js +0 -194
- package/dist/esm/backend-federation/entry.mjs +0 -56
- package/dist/esm/effect-adapter/entry.mjs +0 -51
- package/dist/esm/effect-adapter/index.mjs +0 -143
- package/dist/esm-node/backend-federation/entry.mjs +0 -57
- package/dist/esm-node/effect-adapter/entry.mjs +0 -52
- package/dist/esm-node/effect-adapter/index.mjs +0 -144
- package/dist/types/backend-federation/entry.d.ts +0 -2
- package/dist/types/effect-adapter/cross-project-policy.d.ts +0 -4
- package/dist/types/effect-adapter/error-response.d.ts +0 -2
- package/dist/types/effect-adapter/index.d.ts +0 -21
- package/src/backend-federation/entry.ts +0 -125
- package/src/effect-adapter/entry.ts +0 -96
- package/src/effect-adapter/index.ts +0 -251
|
@@ -10,16 +10,35 @@ const JS_OR_TS_EXTS = [
|
|
|
10
10
|
'.cjs',
|
|
11
11
|
'.cts'
|
|
12
12
|
];
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
const emittedEffectEntry = (entry)=>entry.replace(/\.(?:[cm]?ts|tsx|jsx)$/u, '.js');
|
|
14
|
+
function relativeEffectAppPath(appDir, entry) {
|
|
15
|
+
const relative = upath.relative(appDir, entry);
|
|
16
|
+
return '..' === relative || relative.startsWith('../') || relative.split('/').includes('node_modules') ? void 0 : relative;
|
|
17
|
+
}
|
|
18
|
+
function existingEntry(entry) {
|
|
19
|
+
return upath.extname(entry) ? fs.existsSync(entry) ? entry : void 0 : findExists(JS_OR_TS_EXTS.map((ext)=>`${entry}${ext}`)) || void 0;
|
|
20
|
+
}
|
|
21
|
+
function resolveEffectEntry(options) {
|
|
22
|
+
const { appDir, apiDir, effectEntry, distDir } = options;
|
|
23
|
+
const entry = upath.resolve(appDir, effectEntry || upath.join(apiDir, 'index'));
|
|
24
|
+
if (distDir && void 0 !== relativeEffectAppPath(distDir, entry)) return {
|
|
25
|
+
kind: 'built-output',
|
|
26
|
+
path: existingEntry(emittedEffectEntry(entry))
|
|
27
|
+
};
|
|
28
|
+
const relative = relativeEffectAppPath(appDir, entry);
|
|
29
|
+
if (void 0 === relative) return {
|
|
30
|
+
kind: 'external-sdk',
|
|
31
|
+
path: existingEntry(entry)
|
|
18
32
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
33
|
+
return distDir ? {
|
|
34
|
+
kind: 'built-output',
|
|
35
|
+
path: existingEntry(emittedEffectEntry(upath.resolve(distDir, relative)))
|
|
36
|
+
} : {
|
|
37
|
+
kind: 'app-source',
|
|
38
|
+
path: existingEntry(entry)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function resolveEffectEntryFile(options) {
|
|
42
|
+
return resolveEffectEntry(options).path;
|
|
24
43
|
}
|
|
25
|
-
export { resolveEffectEntryFile };
|
|
44
|
+
export { emittedEffectEntry, relativeEffectAppPath, resolveEffectEntry, resolveEffectEntryFile };
|
|
@@ -8,19 +8,21 @@ export { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE,
|
|
|
8
8
|
export type BackendFederationRemote = BackendFederationEdgeRemote;
|
|
9
9
|
export type BackendFederationRuntimeOptions = BackendFederationEdgeRuntimeOptions;
|
|
10
10
|
export type BackendFederationLoadEntryPluginOptions = BackendFederationEdgeLoadEntryPluginOptions;
|
|
11
|
-
export type EdgeBackendFederationLoadOptions = Omit<BackendFederationLoadOptions, 'entryPolicy' | 'plugins' | 'remote' | 'remotes' | 'runtime'> & {
|
|
11
|
+
export type EdgeBackendFederationLoadOptions = Omit<BackendFederationLoadOptions, 'entryPolicy' | 'plugins' | 'remote' | 'remotes' | 'runtime' | 'shared'> & {
|
|
12
12
|
entryPolicy?: never;
|
|
13
13
|
plugins?: BackendFederationEdgeLoadEntryPlugin[];
|
|
14
14
|
remote?: BackendFederationEdgeRemote;
|
|
15
15
|
remotes?: BackendFederationEdgeRemote[];
|
|
16
16
|
runtime?: never;
|
|
17
|
+
shared?: never;
|
|
17
18
|
};
|
|
18
|
-
export type EdgeBackendFederationIdentityLoadOptions = Omit<UniversalBackendFederationIdentityLoadOptions, 'entryPolicy' | 'plugins' | 'remote' | 'remotes' | 'runtime'> & {
|
|
19
|
+
export type EdgeBackendFederationIdentityLoadOptions = Omit<UniversalBackendFederationIdentityLoadOptions, 'entryPolicy' | 'plugins' | 'remote' | 'remotes' | 'runtime' | 'shared'> & {
|
|
19
20
|
entryPolicy?: never;
|
|
20
21
|
plugins?: BackendFederationEdgeLoadEntryPlugin[];
|
|
21
22
|
remote?: BackendFederationEdgeRemote;
|
|
22
23
|
remotes?: BackendFederationEdgeRemote[];
|
|
23
24
|
runtime?: never;
|
|
25
|
+
shared?: never;
|
|
24
26
|
};
|
|
25
27
|
export type BackendFederationIdentityLoadOptions = EdgeBackendFederationIdentityLoadOptions;
|
|
26
28
|
export declare function loadBackendFederatedEffectApi(options: EdgeBackendFederationIdentityLoadOptions): Promise<BackendFederatedEffectApiModule>;
|
|
@@ -11,11 +11,8 @@ export type BackendFederationIdentityIssue = {
|
|
|
11
11
|
path: string;
|
|
12
12
|
message: string;
|
|
13
13
|
};
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
* (`unitId`, `build`) against the consumer's expected delivery-unit identity.
|
|
18
|
-
* Missing identity metadata is an error.
|
|
19
|
-
*/
|
|
14
|
+
/** Decode independently at each received-manifest / executed-expose boundary. */
|
|
15
|
+
export declare function backendFederationCompatibility(loaded: unknown): Record<string, unknown> | undefined;
|
|
16
|
+
export declare function validateBackendFederationCompatibility(compatibility: Record<string, unknown>, expected: Record<string, string | undefined>): BackendFederationIdentityIssue[];
|
|
20
17
|
export declare function validateExpectedBackendFederationIdentity(loaded: unknown, expected: BackendFederationExpectedIdentity): BackendFederationIdentityIssue[];
|
|
21
18
|
export declare function formatBackendFederationIdentityIssues(issues: BackendFederationIdentityIssue[]): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Module, type ModuleFederation, type ModuleFederationRuntimePlugin } from '@module-federation/runtime';
|
|
2
|
+
import type { BackendFederationEntryExports, BackendFederationRemote, BackendFederationRuntimeOptions } from './types.js';
|
|
3
|
+
type RemoteInfo = ConstructorParameters<typeof Module>[0]['remoteInfo'];
|
|
4
|
+
export declare const PROVIDED_ENTRY_SCHEME: RegExp;
|
|
5
|
+
export declare function registerRemoteContainer(origin: ModuleFederation, remoteInfo: RemoteInfo, container: BackendFederationEntryExports): void;
|
|
6
|
+
/**
|
|
7
|
+
* Loads each configured remote once per runtime and registers the resulting
|
|
8
|
+
* container with that runtime only, so Module Federation initializes it with
|
|
9
|
+
* the runtime's own share scope. Registered last, it replaces any container a
|
|
10
|
+
* caller plugin supplied for a scheme it owns.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createBackendFederationIntegrityPlugin(options: BackendFederationRuntimeOptions, remotes: readonly BackendFederationRemote[]): ModuleFederationRuntimePlugin;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { BackendFederationRuntimeOptions } from './types.js';
|
|
2
|
+
type HostShared = NonNullable<BackendFederationRuntimeOptions['shared']>;
|
|
3
|
+
/**
|
|
4
|
+
* Shares the package-private Effect handler factory registry and the Effect
|
|
5
|
+
* request storage with every backend container, so factories a remote creates
|
|
6
|
+
* with defineEffectBff are recognized by this host's module resolver and its
|
|
7
|
+
* endpoints read the context this host's dispatcher enters.
|
|
8
|
+
*
|
|
9
|
+
* Loaded on first call, not when this module loads: a CommonJS require() of
|
|
10
|
+
* the Effect ES modules throws while a concurrent import() is still loading
|
|
11
|
+
* them.
|
|
12
|
+
*/
|
|
13
|
+
export declare function effectBffHostShared(): HostShared;
|
|
14
|
+
/**
|
|
15
|
+
* Adds the host shares to caller shares. Their names are reserved: a caller
|
|
16
|
+
* replacement would make containers use a registry or a request storage this
|
|
17
|
+
* host never consults.
|
|
18
|
+
*/
|
|
19
|
+
export declare function withEffectBffHostShared(shared: BackendFederationRuntimeOptions['shared']): HostShared;
|
|
20
|
+
export {};
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
+
import { effectBffHostShared } from './node-shared.js';
|
|
2
|
+
/** Call for the `shared` option when building a custom runtime for Node hosts. */
|
|
3
|
+
export { effectBffHostShared };
|
|
1
4
|
import type { BackendFederatedEffectApiModule, BackendFederationIdentityLoadOptions } from './types.js';
|
|
2
5
|
export declare function loadBackendFederatedEffectApi(options: BackendFederationIdentityLoadOptions): Promise<BackendFederatedEffectApiModule>;
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { ModuleFederationRuntimePlugin } from '@module-federation/runtime';
|
|
2
2
|
import type { BackendFederationLoadEntryPluginOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Serves binding:, service: and static: entries. The provider resolves each
|
|
5
|
+
* remote once per runtime and registers the container with that runtime only.
|
|
6
|
+
*/
|
|
3
7
|
export declare function createBackendFederationLoadEntryPlugin(options: BackendFederationLoadEntryPluginOptions): ModuleFederationRuntimePlugin;
|
|
@@ -7,8 +7,6 @@ export type BackendFederationRemote = {
|
|
|
7
7
|
name: string;
|
|
8
8
|
entry: string;
|
|
9
9
|
type?: 'commonjs-module' | 'module' | string;
|
|
10
|
-
entryGlobalName?: string;
|
|
11
|
-
shareScope?: string | string[];
|
|
12
10
|
expose?: typeof BACKEND_FEDERATION_EFFECT_EXPOSE;
|
|
13
11
|
verification?: BackendFederationRemoteEntryVerification;
|
|
14
12
|
};
|
|
@@ -17,6 +15,8 @@ export type BackendFederationRuntimeOptions = {
|
|
|
17
15
|
remote?: BackendFederationRemote;
|
|
18
16
|
remotes?: BackendFederationRemote[];
|
|
19
17
|
plugins?: ModuleFederationRuntimePlugin[];
|
|
18
|
+
/** Host shares handed to every remote container's `init()`. */
|
|
19
|
+
shared?: ConstructorParameters<typeof ModuleFederation>[0]['shared'];
|
|
20
20
|
entryPolicy?: BackendFederationRemoteEntryPolicy;
|
|
21
21
|
};
|
|
22
22
|
export type BackendFederationEntryExports = {
|
|
@@ -63,8 +63,3 @@ export type BackendFederationLoadOptions = BackendFederationRuntimeOptions & {
|
|
|
63
63
|
export type BackendFederationIdentityLoadOptions = BackendFederationLoadOptions & {
|
|
64
64
|
expected: BackendFederationExpectedIdentity;
|
|
65
65
|
};
|
|
66
|
-
export type BackendFederationLoadEntryPlugin = ModuleFederationRuntimePlugin & {
|
|
67
|
-
loadEntry?: (args: {
|
|
68
|
-
remoteInfo: BackendFederationRemote;
|
|
69
|
-
}) => BackendFederationEntryExports | undefined | Promise<BackendFederationEntryExports | undefined>;
|
|
70
|
-
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { BackendFederationRemoteEntryPolicy, BackendFederationResourcePolicy, BackendFederationResourceResponse } from '@modern-js/server-runtime-extensions/backend-federation-security';
|
|
2
2
|
import type { ModuleFederation, ModuleFederationRuntimePlugin } from '@module-federation/runtime';
|
|
3
|
-
import type { BackendFederatedEffectApiModule, BackendFederationRemote } from '../backend-federation/index.js';
|
|
3
|
+
import type { BackendFederatedEffectApiModule, BackendFederationRemote, BackendFederationRuntimeOptions } from '../backend-federation/index.js';
|
|
4
4
|
import type { BackendFederationManifestAdapterError } from './errors.js';
|
|
5
5
|
export type BackendFederationManifest = Record<string, unknown>;
|
|
6
6
|
export type BackendFederationVersionBoundaryExpectation = {
|
|
@@ -44,6 +44,7 @@ export type BackendFederationManifestAdapterOptions = {
|
|
|
44
44
|
plugins?: ModuleFederationRuntimePlugin[];
|
|
45
45
|
remote?: Partial<BackendFederationRemote>;
|
|
46
46
|
runtime?: ModuleFederation;
|
|
47
|
+
shared?: BackendFederationRuntimeOptions['shared'];
|
|
47
48
|
signal?: AbortSignal;
|
|
48
49
|
timeoutMs?: number;
|
|
49
50
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import '@modern-js/server-runtime-extensions/server-config';
|
|
2
2
|
import type { ServerPluginAPI } from '@modern-js/server-core';
|
|
3
|
-
import { type OperationContractSource } from '@modern-js/server-runtime-extensions/bff-policy/node';
|
|
3
|
+
import { type OperationContractSource, resolveOperationProducer } from '@modern-js/server-runtime-extensions/bff-policy/node';
|
|
4
4
|
import type { ResolvedCrossProjectPolicy } from './evaluation.js';
|
|
5
|
-
export declare const resolveAdapterCrossProjectPolicy: (api: ServerPluginAPI, handlers: OperationContractSource[]) => ResolvedCrossProjectPolicy | undefined;
|
|
5
|
+
export declare const resolveAdapterCrossProjectPolicy: (api: ServerPluginAPI, handlers: OperationContractSource[], producer?: ReturnType<typeof resolveOperationProducer>) => ResolvedCrossProjectPolicy | undefined;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type EffectApiModule } from '@modern-js/bff-effect/effect';
|
|
2
|
+
import type { ServerPluginAPI } from '@modern-js/server-core';
|
|
3
|
+
import type { resolveOperationProducer } from '@modern-js/server-runtime-extensions/bff-policy/node';
|
|
4
|
+
import type { ResolvedCrossProjectPolicy } from '../cross-project-policy/evaluation.js';
|
|
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;
|
|
@@ -1,5 +1,23 @@
|
|
|
1
|
-
export declare
|
|
1
|
+
export declare const emittedEffectEntry: (entry: string) => string;
|
|
2
|
+
export declare function relativeEffectAppPath(appDir: string, entry: string): string | undefined;
|
|
3
|
+
type EffectEntryOptions = {
|
|
2
4
|
appDir: string;
|
|
3
5
|
apiDir: string;
|
|
4
6
|
effectEntry?: string;
|
|
5
|
-
}
|
|
7
|
+
};
|
|
8
|
+
export type EffectEntry = {
|
|
9
|
+
kind: 'app-source';
|
|
10
|
+
path: string | undefined;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'built-output';
|
|
13
|
+
path: string | undefined;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'external-sdk';
|
|
16
|
+
path: string | undefined;
|
|
17
|
+
};
|
|
18
|
+
/** Classify ownership before resolving files: production works without source. */
|
|
19
|
+
export declare function resolveEffectEntry(options: EffectEntryOptions & {
|
|
20
|
+
distDir?: string;
|
|
21
|
+
}): EffectEntry;
|
|
22
|
+
export declare function resolveEffectEntryFile(options: EffectEntryOptions): string | undefined;
|
|
23
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bleedingdev/modern-js-plugin-bff-extensions",
|
|
3
3
|
"description": "Fork-owned UltraModern.js BFF adapters, generation, policy, and backend federation extensions.",
|
|
4
|
-
"homepage": "https://github.com/
|
|
4
|
+
"homepage": "https://github.com/ultramodernjs/ultramodern.js#readme",
|
|
5
5
|
"bugs": {
|
|
6
|
-
"url": "https://github.com/
|
|
6
|
+
"url": "https://github.com/ultramodernjs/ultramodern.js/issues"
|
|
7
7
|
},
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/
|
|
10
|
+
"url": "git+https://github.com/ultramodernjs/ultramodern.js.git",
|
|
11
11
|
"directory": "packages/cli/plugin-bff-extensions"
|
|
12
12
|
},
|
|
13
13
|
"license": "MIT",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"modern.js",
|
|
19
19
|
"ultramodern.js"
|
|
20
20
|
],
|
|
21
|
-
"version": "3.9.
|
|
21
|
+
"version": "3.9.3-ultramodern.1",
|
|
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",
|
|
@@ -190,24 +190,24 @@
|
|
|
190
190
|
}
|
|
191
191
|
},
|
|
192
192
|
"engines": {
|
|
193
|
-
"node": ">=26.
|
|
193
|
+
"node": ">=26.10.0"
|
|
194
194
|
},
|
|
195
195
|
"dependencies": {
|
|
196
|
-
"@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.
|
|
197
|
-
"@modern-js/bff-core": "npm:@bleedingdev/modern-js-bff-core@3.9.
|
|
198
|
-
"@modern-js/bff-effect": "npm:@bleedingdev/modern-js-bff-effect@3.9.
|
|
199
|
-
"@modern-js/runtime-extensions": "npm:@bleedingdev/modern-js-runtime-extensions@3.9.
|
|
200
|
-
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.
|
|
201
|
-
"@modern-js/server-runtime-extensions": "npm:@bleedingdev/modern-js-server-runtime-extensions@3.9.
|
|
202
|
-
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.
|
|
203
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.
|
|
204
|
-
"@module-federation/runtime": "2.9.
|
|
205
|
-
"@swc/core": "1.16.
|
|
196
|
+
"@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.3-ultramodern.1",
|
|
197
|
+
"@modern-js/bff-core": "npm:@bleedingdev/modern-js-bff-core@3.9.3-ultramodern.1",
|
|
198
|
+
"@modern-js/bff-effect": "npm:@bleedingdev/modern-js-bff-effect@3.9.3-ultramodern.1",
|
|
199
|
+
"@modern-js/runtime-extensions": "npm:@bleedingdev/modern-js-runtime-extensions@3.9.3-ultramodern.1",
|
|
200
|
+
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.3-ultramodern.1",
|
|
201
|
+
"@modern-js/server-runtime-extensions": "npm:@bleedingdev/modern-js-server-runtime-extensions@3.9.3-ultramodern.1",
|
|
202
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.3-ultramodern.1",
|
|
203
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.3-ultramodern.1",
|
|
204
|
+
"@module-federation/runtime": "2.9.2",
|
|
205
|
+
"@swc/core": "1.16.13",
|
|
206
206
|
"esbuild": "^0.28.2"
|
|
207
207
|
},
|
|
208
208
|
"peerDependencies": {
|
|
209
|
-
"@effect/opentelemetry": "4.0.0
|
|
210
|
-
"effect": "4.0.0
|
|
209
|
+
"@effect/opentelemetry": "4.0.0",
|
|
210
|
+
"effect": "4.0.0"
|
|
211
211
|
},
|
|
212
212
|
"peerDependenciesMeta": {
|
|
213
213
|
"@effect/opentelemetry": {
|
|
@@ -218,15 +218,14 @@
|
|
|
218
218
|
}
|
|
219
219
|
},
|
|
220
220
|
"devDependencies": {
|
|
221
|
-
"@effect/opentelemetry": "4.0.0
|
|
222
|
-
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.
|
|
223
|
-
"@rsbuild/core": "2.2.
|
|
224
|
-
"@rslib/core": "1.0.
|
|
221
|
+
"@effect/opentelemetry": "4.0.0",
|
|
222
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.3-ultramodern.1",
|
|
223
|
+
"@rsbuild/core": "2.2.11",
|
|
224
|
+
"@rslib/core": "1.0.3",
|
|
225
225
|
"@scripts/rstest-config": "2.66.0",
|
|
226
|
-
"@types/node": "^26.
|
|
227
|
-
"@types/react": "^19.
|
|
228
|
-
"
|
|
229
|
-
"effect": "4.0.0-rc.112"
|
|
226
|
+
"@types/node": "^26.6.3",
|
|
227
|
+
"@types/react": "^19.3.0",
|
|
228
|
+
"effect": "4.0.0"
|
|
230
229
|
},
|
|
231
230
|
"sideEffects": false,
|
|
232
231
|
"publishConfig": {
|
|
@@ -237,5 +236,8 @@
|
|
|
237
236
|
"dev": "rslib build --watch",
|
|
238
237
|
"build": "rslib build",
|
|
239
238
|
"test": "rstest"
|
|
239
|
+
},
|
|
240
|
+
"ultramodern": {
|
|
241
|
+
"sourceName": "@modern-js/plugin-bff-extensions"
|
|
240
242
|
}
|
|
241
243
|
}
|
|
@@ -52,24 +52,26 @@ export type BackendFederationLoadEntryPluginOptions =
|
|
|
52
52
|
|
|
53
53
|
export type EdgeBackendFederationLoadOptions = Omit<
|
|
54
54
|
BackendFederationLoadOptions,
|
|
55
|
-
'entryPolicy' | 'plugins' | 'remote' | 'remotes' | 'runtime'
|
|
55
|
+
'entryPolicy' | 'plugins' | 'remote' | 'remotes' | 'runtime' | 'shared'
|
|
56
56
|
> & {
|
|
57
57
|
entryPolicy?: never;
|
|
58
58
|
plugins?: BackendFederationEdgeLoadEntryPlugin[];
|
|
59
59
|
remote?: BackendFederationEdgeRemote;
|
|
60
60
|
remotes?: BackendFederationEdgeRemote[];
|
|
61
61
|
runtime?: never;
|
|
62
|
+
shared?: never;
|
|
62
63
|
};
|
|
63
64
|
|
|
64
65
|
export type EdgeBackendFederationIdentityLoadOptions = Omit<
|
|
65
66
|
UniversalBackendFederationIdentityLoadOptions,
|
|
66
|
-
'entryPolicy' | 'plugins' | 'remote' | 'remotes' | 'runtime'
|
|
67
|
+
'entryPolicy' | 'plugins' | 'remote' | 'remotes' | 'runtime' | 'shared'
|
|
67
68
|
> & {
|
|
68
69
|
entryPolicy?: never;
|
|
69
70
|
plugins?: BackendFederationEdgeLoadEntryPlugin[];
|
|
70
71
|
remote?: BackendFederationEdgeRemote;
|
|
71
72
|
remotes?: BackendFederationEdgeRemote[];
|
|
72
73
|
runtime?: never;
|
|
74
|
+
shared?: never;
|
|
73
75
|
};
|
|
74
76
|
|
|
75
77
|
export type BackendFederationIdentityLoadOptions =
|
|
@@ -80,11 +82,12 @@ export function loadBackendFederatedEffectApi(
|
|
|
80
82
|
): Promise<BackendFederatedEffectApiModule> {
|
|
81
83
|
if (
|
|
82
84
|
(options as BackendFederationLoadOptions).runtime !== undefined ||
|
|
83
|
-
(options as BackendFederationLoadOptions).entryPolicy !== undefined
|
|
85
|
+
(options as BackendFederationLoadOptions).entryPolicy !== undefined ||
|
|
86
|
+
(options as BackendFederationLoadOptions).shared !== undefined
|
|
84
87
|
) {
|
|
85
88
|
return Promise.reject(
|
|
86
89
|
new Error(
|
|
87
|
-
'[BFF][Effect] Edge backend federation does not execute custom runtimes or
|
|
90
|
+
'[BFF][Effect] Edge backend federation does not execute custom runtimes, entry evaluators or host shares. Register a static or service-binding entry provider.',
|
|
88
91
|
),
|
|
89
92
|
);
|
|
90
93
|
}
|
|
@@ -17,59 +17,51 @@ export type BackendFederationIdentityIssue = {
|
|
|
17
17
|
message: string;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
* Compares the expose's `backendFederationContract.compatibility` identity
|
|
23
|
-
* (`unitId`, `build`) against the consumer's expected delivery-unit identity.
|
|
24
|
-
* Missing identity metadata is an error.
|
|
25
|
-
*/
|
|
26
|
-
export function validateExpectedBackendFederationIdentity(
|
|
27
|
-
loaded: unknown,
|
|
28
|
-
expected: BackendFederationExpectedIdentity,
|
|
29
|
-
): BackendFederationIdentityIssue[] {
|
|
30
|
-
const issues: BackendFederationIdentityIssue[] = [];
|
|
20
|
+
/** Decode independently at each received-manifest / executed-expose boundary. */
|
|
21
|
+
export function backendFederationCompatibility(loaded: unknown) {
|
|
31
22
|
const contract = isRecord(loaded)
|
|
32
23
|
? loaded.backendFederationContract
|
|
33
24
|
: undefined;
|
|
34
25
|
const compatibility = isRecord(contract) ? contract.compatibility : undefined;
|
|
26
|
+
return isRecord(compatibility) ? compatibility : undefined;
|
|
27
|
+
}
|
|
35
28
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
path: 'backendFederationContract.compatibility.unitId',
|
|
55
|
-
message: `expected ${expected.unitId}, received ${unitId}`,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const build = compatibility.build;
|
|
60
|
-
if (typeof build !== 'string' || build.length === 0) {
|
|
61
|
-
issues.push({
|
|
62
|
-
path: 'backendFederationContract.compatibility.build',
|
|
63
|
-
message: `missing build marker; expected ${expected.buildMarker}`,
|
|
64
|
-
});
|
|
65
|
-
} else if (build !== expected.buildMarker) {
|
|
66
|
-
issues.push({
|
|
67
|
-
path: 'backendFederationContract.compatibility.build',
|
|
68
|
-
message: `expected ${expected.buildMarker}, received ${build}`,
|
|
69
|
-
});
|
|
70
|
-
}
|
|
29
|
+
export function validateBackendFederationCompatibility(
|
|
30
|
+
compatibility: Record<string, unknown>,
|
|
31
|
+
expected: Record<string, string | undefined>,
|
|
32
|
+
): BackendFederationIdentityIssue[] {
|
|
33
|
+
return Object.entries(expected).flatMap(([field, value]) =>
|
|
34
|
+
value === undefined ||
|
|
35
|
+
(typeof compatibility[field] === 'string' &&
|
|
36
|
+
compatibility[field].length > 0 &&
|
|
37
|
+
compatibility[field] === value)
|
|
38
|
+
? []
|
|
39
|
+
: [
|
|
40
|
+
{
|
|
41
|
+
path: `backendFederationContract.compatibility.${field}`,
|
|
42
|
+
message: `expected ${value}, received ${typeof compatibility[field] === 'string' ? compatibility[field] : typeof compatibility[field]}`,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
);
|
|
46
|
+
}
|
|
71
47
|
|
|
72
|
-
|
|
48
|
+
export function validateExpectedBackendFederationIdentity(
|
|
49
|
+
loaded: unknown,
|
|
50
|
+
expected: BackendFederationExpectedIdentity,
|
|
51
|
+
): BackendFederationIdentityIssue[] {
|
|
52
|
+
const compatibility = backendFederationCompatibility(loaded);
|
|
53
|
+
return compatibility
|
|
54
|
+
? validateBackendFederationCompatibility(compatibility, {
|
|
55
|
+
unitId: expected.unitId,
|
|
56
|
+
build: expected.buildMarker,
|
|
57
|
+
})
|
|
58
|
+
: [
|
|
59
|
+
{
|
|
60
|
+
path: 'backendFederationContract.compatibility',
|
|
61
|
+
message:
|
|
62
|
+
'loaded module declares no compatibility metadata; delivery-unit identity cannot be validated',
|
|
63
|
+
},
|
|
64
|
+
];
|
|
73
65
|
}
|
|
74
66
|
|
|
75
67
|
export function formatBackendFederationIdentityIssues(
|