@bleedingdev/modern-js-plugin-bff-extensions 3.9.0-ultramodern.5 → 3.9.0-ultramodern.7
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 +6 -3
- package/dist/cjs/backend-federation/edge-runtime.js +3 -15
- package/dist/cjs/backend-federation/edge.js +2 -3
- package/dist/cjs/backend-federation/identity.js +17 -23
- package/dist/cjs/backend-federation/load.js +1 -11
- package/dist/cjs/backend-federation/validate-loaded.js +2 -4
- package/dist/cjs/backend-federation-manifest/load.js +9 -7
- package/dist/cjs/backend-federation-manifest/validation.js +4 -4
- package/dist/cjs/{client-generator → effect-source-loader}/built-entry.js +1 -1
- package/dist/cjs/{client-generator/runtime.js → effect-source-loader/http-api-runtime.js} +12 -20
- package/dist/cjs/effect-source-loader/index.js +14 -6
- package/dist/cjs/effect-source-loader/operation-contracts.js +83 -0
- package/dist/cjs/effect-source-loader/rspack-loader.js +1 -17
- package/dist/cjs/effect-source-loader/worker-runtime-wrapper.js +6 -21
- package/dist/esm/backend-federation/edge-runtime.mjs +2 -11
- package/dist/esm/backend-federation/edge.mjs +3 -4
- package/dist/esm/backend-federation/identity.mjs +17 -23
- package/dist/esm/backend-federation/load.mjs +1 -11
- package/dist/esm/backend-federation/validate-loaded.mjs +2 -4
- package/dist/esm/backend-federation-manifest/load.mjs +9 -7
- package/dist/esm/backend-federation-manifest/validation.mjs +4 -4
- package/dist/esm/{client-generator → effect-source-loader}/built-entry.mjs +1 -1
- package/dist/esm/effect-source-loader/http-api-runtime.mjs +19 -0
- package/dist/esm/effect-source-loader/index.mjs +4 -2
- package/dist/esm/effect-source-loader/operation-contracts.mjs +45 -0
- package/dist/esm/effect-source-loader/rspack-loader.mjs +2 -18
- package/dist/esm/effect-source-loader/worker-runtime-wrapper.mjs +4 -16
- package/dist/esm-node/backend-federation/edge-runtime.mjs +2 -11
- package/dist/esm-node/backend-federation/edge.mjs +3 -4
- package/dist/esm-node/backend-federation/identity.mjs +17 -23
- package/dist/esm-node/backend-federation/load.mjs +1 -11
- package/dist/esm-node/backend-federation/validate-loaded.mjs +2 -4
- package/dist/esm-node/backend-federation-manifest/load.mjs +9 -7
- package/dist/esm-node/backend-federation-manifest/validation.mjs +4 -4
- package/dist/esm-node/{client-generator → effect-source-loader}/built-entry.mjs +1 -1
- package/dist/esm-node/effect-source-loader/http-api-runtime.mjs +20 -0
- package/dist/esm-node/effect-source-loader/index.mjs +4 -2
- package/dist/esm-node/effect-source-loader/operation-contracts.mjs +46 -0
- package/dist/esm-node/effect-source-loader/rspack-loader.mjs +2 -18
- package/dist/esm-node/effect-source-loader/worker-runtime-wrapper.mjs +4 -16
- package/dist/types/backend-federation/edge-runtime.d.ts +0 -5
- package/dist/types/backend-federation/edge.d.ts +0 -2
- package/dist/types/backend-federation/identity.d.ts +2 -11
- package/dist/types/backend-federation/load.d.ts +1 -7
- package/dist/types/backend-federation/node.d.ts +1 -3
- package/dist/types/backend-federation/types.d.ts +0 -6
- package/dist/types/backend-federation/validate-loaded.d.ts +1 -2
- package/dist/types/backend-federation-manifest/metadata.d.ts +0 -6
- package/dist/types/effect-source-loader/index.d.ts +4 -2
- package/dist/types/effect-source-loader/operation-contracts.d.ts +8 -0
- package/dist/types/effect-source-loader/rspack-loader.d.ts +0 -14
- package/dist/types/effect-source-loader/worker-runtime-wrapper.d.ts +4 -22
- package/package.json +10 -22
- package/src/backend-federation/edge-runtime.ts +2 -13
- package/src/backend-federation/edge.ts +8 -16
- package/src/backend-federation/identity.ts +9 -27
- package/src/backend-federation/load.ts +6 -33
- package/src/backend-federation/node.ts +0 -11
- package/src/backend-federation/types.ts +0 -6
- package/src/backend-federation/validate-loaded.ts +2 -7
- package/src/backend-federation-manifest/load.ts +20 -14
- package/src/backend-federation-manifest/metadata.ts +0 -6
- package/src/backend-federation-manifest/validation.ts +9 -12
- package/src/{client-generator → effect-source-loader}/built-entry.ts +1 -3
- package/src/effect-source-loader/http-api-runtime.ts +39 -0
- package/src/effect-source-loader/index.ts +7 -5
- package/src/effect-source-loader/operation-contracts.ts +72 -0
- package/src/effect-source-loader/rspack-loader.ts +3 -33
- package/src/effect-source-loader/worker-runtime-wrapper.ts +4 -46
- package/dist/cjs/backend-federation/legacy-warning.js +0 -40
- package/dist/cjs/client-generator/generator.js +0 -73
- package/dist/cjs/client-generator/index.js +0 -54
- package/dist/cjs/client-generator/rendering.js +0 -253
- package/dist/cjs/client-generator/types.js +0 -18
- package/dist/esm/backend-federation/legacy-warning.mjs +0 -2
- package/dist/esm/client-generator/generator.mjs +0 -32
- package/dist/esm/client-generator/index.mjs +0 -3
- package/dist/esm/client-generator/rendering.mjs +0 -209
- package/dist/esm/client-generator/runtime.mjs +0 -27
- package/dist/esm/client-generator/types.mjs +0 -0
- package/dist/esm-node/backend-federation/legacy-warning.mjs +0 -3
- package/dist/esm-node/client-generator/generator.mjs +0 -33
- package/dist/esm-node/client-generator/index.mjs +0 -4
- package/dist/esm-node/client-generator/rendering.mjs +0 -210
- package/dist/esm-node/client-generator/runtime.mjs +0 -29
- package/dist/esm-node/client-generator/types.mjs +0 -1
- package/dist/types/backend-federation/legacy-warning.d.ts +0 -1
- package/dist/types/client-generator/generator.d.ts +0 -3
- package/dist/types/client-generator/index.d.ts +0 -4
- package/dist/types/client-generator/rendering.d.ts +0 -24
- package/dist/types/client-generator/types.d.ts +0 -33
- package/src/backend-federation/legacy-warning.ts +0 -2
- package/src/client-generator/generator.ts +0 -52
- package/src/client-generator/index.ts +0 -10
- package/src/client-generator/rendering.ts +0 -307
- package/src/client-generator/runtime.ts +0 -69
- package/src/client-generator/types.ts +0 -35
- /package/dist/cjs/{client-generator → effect-source-loader}/paths.js +0 -0
- /package/dist/esm/{client-generator → effect-source-loader}/paths.mjs +0 -0
- /package/dist/esm-node/{client-generator → effect-source-loader}/paths.mjs +0 -0
- /package/dist/types/{client-generator → effect-source-loader}/built-entry.d.ts +0 -0
- /package/dist/types/{client-generator/runtime.d.ts → effect-source-loader/http-api-runtime.d.ts} +0 -0
- /package/dist/types/{client-generator → effect-source-loader}/paths.d.ts +0 -0
- /package/src/{client-generator → effect-source-loader}/paths.ts +0 -0
|
@@ -9,8 +9,7 @@ import { isRecord } from './utils';
|
|
|
9
9
|
export function validateLoadedBackendFederatedEffectApi(
|
|
10
10
|
loaded: unknown,
|
|
11
11
|
options: {
|
|
12
|
-
|
|
13
|
-
expected?: BackendFederationExpectedIdentity;
|
|
12
|
+
expected: BackendFederationExpectedIdentity;
|
|
14
13
|
remoteName: string;
|
|
15
14
|
remoteRequest: string;
|
|
16
15
|
},
|
|
@@ -52,14 +51,10 @@ export function validateLoadedBackendFederatedEffectApi(
|
|
|
52
51
|
);
|
|
53
52
|
}
|
|
54
53
|
|
|
55
|
-
|
|
54
|
+
{
|
|
56
55
|
const issues = validateExpectedBackendFederationIdentity(
|
|
57
56
|
loaded,
|
|
58
57
|
options.expected,
|
|
59
|
-
{
|
|
60
|
-
allowMissingIdentityMetadata:
|
|
61
|
-
options.allowMissingIdentityMetadata === true,
|
|
62
|
-
},
|
|
63
58
|
);
|
|
64
59
|
if (issues.length > 0) {
|
|
65
60
|
throw new Error(
|
|
@@ -7,6 +7,12 @@ import {
|
|
|
7
7
|
} from '../backend-federation';
|
|
8
8
|
import { loadBackendFederatedEffectApi } from '../backend-federation/load';
|
|
9
9
|
import { BackendFederationManifestAdapterError } from './errors';
|
|
10
|
+
import {
|
|
11
|
+
backendFederationMetadata,
|
|
12
|
+
manifestDeliveryUnit,
|
|
13
|
+
stringValue,
|
|
14
|
+
versionBoundaryMetadata,
|
|
15
|
+
} from './metadata';
|
|
10
16
|
import { loadBackendFederationManifest } from './reference';
|
|
11
17
|
import { resolveBackendFederationRemoteFromManifest } from './remote';
|
|
12
18
|
import type {
|
|
@@ -204,6 +210,19 @@ export async function loadBackendFederatedEffectApiFromManifest(
|
|
|
204
210
|
);
|
|
205
211
|
}
|
|
206
212
|
|
|
213
|
+
const deliveryUnit = manifestDeliveryUnit(
|
|
214
|
+
backendFederationMetadata(manifest),
|
|
215
|
+
versionBoundaryMetadata(manifest),
|
|
216
|
+
);
|
|
217
|
+
const unitId =
|
|
218
|
+
stringValue(deliveryUnit.boundary?.unitId) ??
|
|
219
|
+
stringValue(deliveryUnit.top?.unitId);
|
|
220
|
+
const buildMarker = stringValue(deliveryUnit.boundary?.buildMarker);
|
|
221
|
+
if (!unitId || !buildMarker)
|
|
222
|
+
throw new BackendFederationManifestAdapterError(
|
|
223
|
+
'manifest_invalid',
|
|
224
|
+
'Backend federation manifest requires delivery-unit identity.',
|
|
225
|
+
);
|
|
207
226
|
const loaded = await loadBackendFederatedEffectApi({
|
|
208
227
|
hostName: options.hostName,
|
|
209
228
|
remote,
|
|
@@ -214,20 +233,7 @@ export async function loadBackendFederatedEffectApiFromManifest(
|
|
|
214
233
|
timeoutMs: 0,
|
|
215
234
|
},
|
|
216
235
|
...(options.runtime ? { runtime: options.runtime } : {}),
|
|
217
|
-
|
|
218
|
-
// delivery-unit identity validation when an identity is expected.
|
|
219
|
-
...(options.expected?.unitId && options.expected.buildMarker
|
|
220
|
-
? {
|
|
221
|
-
expected: {
|
|
222
|
-
unitId: options.expected.unitId,
|
|
223
|
-
buildMarker: options.expected.buildMarker,
|
|
224
|
-
},
|
|
225
|
-
// The manifest's identity is already validated against
|
|
226
|
-
// `expected`; legacy exposes without identity metadata stay
|
|
227
|
-
// loadable (mismatching declared values still fail).
|
|
228
|
-
allowMissingIdentityMetadata: true,
|
|
229
|
-
}
|
|
230
|
-
: {}),
|
|
236
|
+
expected: { unitId, buildMarker },
|
|
231
237
|
}).catch((error: unknown) => {
|
|
232
238
|
throw new BackendFederationManifestAdapterError(
|
|
233
239
|
scope?.timedOut() === true ? 'timeout' : classifyLoadError(error),
|
|
@@ -56,12 +56,6 @@ export function deliveryUnitMetadata(
|
|
|
56
56
|
return recordField(record, 'deliveryUnit');
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
/**
|
|
60
|
-
* Resolves the delivery-unit identity root for a manifest (ADR-0019 §3):
|
|
61
|
-
* prefers `versionBoundary.deliveryUnit`, falls back to the top-level
|
|
62
|
-
* `backendFederation.deliveryUnit` record. Both are additive/optional so
|
|
63
|
-
* legacy manifests without delivery-unit metadata continue to validate.
|
|
64
|
-
*/
|
|
65
59
|
export function manifestDeliveryUnit(
|
|
66
60
|
backendFederation: Record<string, unknown> | undefined,
|
|
67
61
|
boundary: Record<string, unknown> | undefined,
|
|
@@ -48,11 +48,6 @@ function resolveExpectedBuildMarker(
|
|
|
48
48
|
);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
// Intentionally no fallback to `buildVersion` here: this is only used to
|
|
52
|
-
// compare against manifest `deliveryUnit.buildMarker`, which is a
|
|
53
|
-
// separate, additive field. Callers that only pass `buildVersion` (the
|
|
54
|
-
// pre-ADR-0019 expectation shape) must not be forced to also match a
|
|
55
|
-
// delivery-unit build marker on the manifest.
|
|
56
51
|
return expected.buildMarker;
|
|
57
52
|
}
|
|
58
53
|
|
|
@@ -70,7 +65,6 @@ export function validateBackendFederationManifest(
|
|
|
70
65
|
const manifestShape = validateBackendFederationManifestContract(manifest, {
|
|
71
66
|
expectedContractVersion: false,
|
|
72
67
|
expectedNodeAdapterVersion: false,
|
|
73
|
-
validateDeliveryUnit: false,
|
|
74
68
|
});
|
|
75
69
|
assertManifestAdapter(
|
|
76
70
|
manifestShape.ok,
|
|
@@ -151,6 +145,11 @@ export function validateBackendFederationManifest(
|
|
|
151
145
|
const manifestUnitId =
|
|
152
146
|
stringValue(deliveryUnit.boundary?.unitId) ??
|
|
153
147
|
stringValue(deliveryUnit.top?.unitId);
|
|
148
|
+
assertManifestAdapter(
|
|
149
|
+
manifestUnitId && stringValue(deliveryUnit.boundary?.buildMarker),
|
|
150
|
+
'manifest_invalid',
|
|
151
|
+
'Backend federation manifest requires delivery-unit unitId and buildMarker.',
|
|
152
|
+
);
|
|
154
153
|
assertVersionValue(manifestUnitId, expected.unitId, 'deliveryUnit.unitId');
|
|
155
154
|
assertVersionValue(
|
|
156
155
|
stringValue(deliveryUnit.boundary?.buildMarker),
|
|
@@ -214,16 +213,14 @@ export function validateLoadedBackendFederationContract(
|
|
|
214
213
|
stringValue(deliveryUnit.top?.unitId);
|
|
215
214
|
const manifestBuildMarker = stringValue(deliveryUnit.boundary?.buildMarker);
|
|
216
215
|
|
|
217
|
-
|
|
218
|
-
// is a legacy manifest/expose and must stay backward compatible.
|
|
219
|
-
assertConsistentValue(
|
|
220
|
-
manifestUnitId,
|
|
216
|
+
assertVersionValue(
|
|
221
217
|
stringValue(compatibility.unitId),
|
|
218
|
+
manifestUnitId,
|
|
222
219
|
'deliveryUnit.unitId vs expose compatibility.unitId',
|
|
223
220
|
);
|
|
224
|
-
|
|
225
|
-
manifestBuildMarker,
|
|
221
|
+
assertVersionValue(
|
|
226
222
|
stringValue(compatibility.build),
|
|
223
|
+
manifestBuildMarker,
|
|
227
224
|
'deliveryUnit.buildMarker vs expose compatibility.build',
|
|
228
225
|
);
|
|
229
226
|
}
|
|
@@ -41,9 +41,7 @@ export async function bundleBuiltEffectEntryForNode(options: {
|
|
|
41
41
|
}`,
|
|
42
42
|
);
|
|
43
43
|
}
|
|
44
|
-
const { bundleEffectEntryForNode } = await import(
|
|
45
|
-
'../effect-source-loader/loader'
|
|
46
|
-
);
|
|
44
|
+
const { bundleEffectEntryForNode } = await import('./loader');
|
|
47
45
|
return bundleEffectEntryForNode({
|
|
48
46
|
appDir,
|
|
49
47
|
entryPath: builtEntry,
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extractHttpApiFromModule,
|
|
3
|
+
type HttpApiLike,
|
|
4
|
+
type HttpApiReflect,
|
|
5
|
+
} from '@modern-js/bff-effect/effect';
|
|
6
|
+
import { HttpApi } from 'effect/unstable/httpapi';
|
|
7
|
+
import { loadEffectSourceModule } from './loader';
|
|
8
|
+
|
|
9
|
+
type HttpApiRuntime = {
|
|
10
|
+
isHttpApi: (value: unknown) => boolean;
|
|
11
|
+
reflect: HttpApiReflect;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function getHttpApiRuntime(): Promise<HttpApiRuntime> {
|
|
15
|
+
return Promise.resolve({
|
|
16
|
+
isHttpApi: HttpApi.isHttpApi,
|
|
17
|
+
reflect: (api, handlers) => {
|
|
18
|
+
if (!HttpApi.isHttpApi(api)) {
|
|
19
|
+
throw new TypeError('[BFF][Effect] Expected an HttpApi contract.');
|
|
20
|
+
}
|
|
21
|
+
HttpApi.reflect(api, {
|
|
22
|
+
onGroup: handlers.onGroup ?? (() => {}),
|
|
23
|
+
onEndpoint: handlers.onEndpoint,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function loadEffectApi(options: {
|
|
30
|
+
appDir: string;
|
|
31
|
+
resourcePath: string;
|
|
32
|
+
onDependency?: (dependency: string) => void;
|
|
33
|
+
}): Promise<HttpApiLike | null> {
|
|
34
|
+
return getHttpApiRuntime().then(httpApiRuntime =>
|
|
35
|
+
loadEffectSourceModule(options).then(mod =>
|
|
36
|
+
extractHttpApiFromModule(mod, httpApiRuntime.isHttpApi),
|
|
37
|
+
),
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {
|
|
2
|
+
bundleBuiltEffectEntryForNode,
|
|
3
|
+
resolveEffectEntryPaths,
|
|
4
|
+
} from './built-entry';
|
|
2
5
|
export { bundleEffectEntryForNode } from './loader';
|
|
6
|
+
export { resolveEffectOperationContracts } from './operation-contracts';
|
|
7
|
+
export { resolveEffectEntryFile } from './paths';
|
|
3
8
|
export { bundleEffectWorkerRuntimeSource } from './worker-runtime-source';
|
|
4
|
-
export {
|
|
5
|
-
generateEffectClientCode,
|
|
6
|
-
generateEffectWorkerRuntimeWrapper,
|
|
7
|
-
} from './worker-runtime-wrapper';
|
|
9
|
+
export { generateEffectWorkerRuntimeWrapper } from './worker-runtime-wrapper';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {
|
|
2
|
+
collectEffectEndpoints,
|
|
3
|
+
toOperationContractSources,
|
|
4
|
+
} from '@modern-js/bff-effect/effect';
|
|
5
|
+
import {
|
|
6
|
+
buildOperationContractMap,
|
|
7
|
+
deriveOperationVersion,
|
|
8
|
+
} from '@modern-js/server-runtime-extensions/bff-policy/node';
|
|
9
|
+
import { fs, upath as path } from '@modern-js/utils';
|
|
10
|
+
import { getHttpApiRuntime, loadEffectApi } from './http-api-runtime';
|
|
11
|
+
|
|
12
|
+
function getPackageInfo(
|
|
13
|
+
resourcePath: string,
|
|
14
|
+
appDir: string,
|
|
15
|
+
onDependency?: (dependency: string) => void,
|
|
16
|
+
): { name?: string; version?: string } {
|
|
17
|
+
for (const startDir of [path.dirname(resourcePath), appDir]) {
|
|
18
|
+
let current = path.resolve(startDir);
|
|
19
|
+
for (let depth = 0; depth < 32; depth += 1) {
|
|
20
|
+
const packageJsonPath = path.join(current, 'package.json');
|
|
21
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
22
|
+
onDependency?.(packageJsonPath);
|
|
23
|
+
try {
|
|
24
|
+
const packageJson = fs.readJSONSync(packageJsonPath) as {
|
|
25
|
+
name?: string;
|
|
26
|
+
version?: string;
|
|
27
|
+
};
|
|
28
|
+
return { name: packageJson.name, version: packageJson.version };
|
|
29
|
+
} catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const parent = path.dirname(current);
|
|
34
|
+
if (parent === current) {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
current = parent;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Derives server policy metadata without emitting or typing a client. */
|
|
44
|
+
export async function resolveEffectOperationContracts(options: {
|
|
45
|
+
appDir: string;
|
|
46
|
+
resourcePath: string;
|
|
47
|
+
prefix: string;
|
|
48
|
+
requestId?: string;
|
|
49
|
+
onDependency?: (dependency: string) => void;
|
|
50
|
+
}) {
|
|
51
|
+
const api = await loadEffectApi(options);
|
|
52
|
+
if (api === null) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const runtime = await getHttpApiRuntime();
|
|
56
|
+
const endpoints = collectEffectEndpoints(
|
|
57
|
+
runtime.reflect,
|
|
58
|
+
api,
|
|
59
|
+
options.prefix,
|
|
60
|
+
);
|
|
61
|
+
const packageInfo = getPackageInfo(
|
|
62
|
+
options.resourcePath,
|
|
63
|
+
options.appDir,
|
|
64
|
+
options.onDependency,
|
|
65
|
+
);
|
|
66
|
+
const requestId = options.requestId?.trim() || packageInfo.name || 'default';
|
|
67
|
+
return buildOperationContractMap({
|
|
68
|
+
handlers: toOperationContractSources(endpoints),
|
|
69
|
+
requestId,
|
|
70
|
+
operationVersion: deriveOperationVersion(packageInfo.version),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { realpathSync } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import type { HttpMethodDecider } from '@modern-js/types';
|
|
4
3
|
import type { Rspack } from '@rsbuild/core';
|
|
5
4
|
import {
|
|
6
5
|
bundleEffectWorkerRuntimeSource,
|
|
7
|
-
generateEffectClientCode,
|
|
8
6
|
generateEffectWorkerRuntimeWrapper,
|
|
9
7
|
resolveEffectEntryFile,
|
|
10
8
|
} from './index';
|
|
@@ -14,20 +12,7 @@ export interface EffectBffLoaderOptions {
|
|
|
14
12
|
appDir: string;
|
|
15
13
|
apiDir: string;
|
|
16
14
|
effectEntry: string;
|
|
17
|
-
port: number;
|
|
18
|
-
target: string;
|
|
19
|
-
requestCreator?: string;
|
|
20
15
|
requestId?: string;
|
|
21
|
-
httpMethodDecider?: HttpMethodDecider;
|
|
22
|
-
effectDataPlatformBatch?: {
|
|
23
|
-
enabled?: boolean;
|
|
24
|
-
endpoint?: string;
|
|
25
|
-
flushIntervalMs?: number;
|
|
26
|
-
maxBatchSize?: number;
|
|
27
|
-
maxBatchBytes?: number;
|
|
28
|
-
requestTimeoutMs?: number;
|
|
29
|
-
allowedMethods?: string[];
|
|
30
|
-
};
|
|
31
16
|
}
|
|
32
17
|
|
|
33
18
|
export default async function loader(
|
|
@@ -77,24 +62,9 @@ export default async function loader(
|
|
|
77
62
|
),
|
|
78
63
|
);
|
|
79
64
|
} else {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
resourcePath: this.resourcePath,
|
|
84
|
-
prefix: options.prefix,
|
|
85
|
-
port: Number(options.port),
|
|
86
|
-
target: options.target,
|
|
87
|
-
requestId: options.requestId,
|
|
88
|
-
requestCreator: options.requestCreator,
|
|
89
|
-
httpMethodDecider: options.httpMethodDecider,
|
|
90
|
-
dataPlatformBatch: options.effectDataPlatformBatch,
|
|
91
|
-
onDependency: dependency => this.addDependency(dependency),
|
|
92
|
-
});
|
|
93
|
-
if (code === null)
|
|
94
|
-
throw new Error(
|
|
95
|
-
`Failed to generate Effect client for ${this.resourcePath}`,
|
|
96
|
-
);
|
|
97
|
-
callback(undefined, code);
|
|
65
|
+
throw new Error(
|
|
66
|
+
'Effect BFF entries are server-only. Import the shared HttpApi contract and use HttpApiClient.make (or makeEffectHttpApiClient) for a fully inferred client.',
|
|
67
|
+
);
|
|
98
68
|
}
|
|
99
69
|
} catch (error) {
|
|
100
70
|
callback(error instanceof Error ? error : new Error(String(error)));
|
|
@@ -1,62 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
import type { HttpMethodDecider } from '@modern-js/types';
|
|
3
|
-
import type { EffectClientCodegenOptions } from '../client-generator/types';
|
|
4
|
-
|
|
5
|
-
type EffectWorkerRuntimeGenerationOptions = {
|
|
6
|
-
apiDir: string;
|
|
7
|
-
appDir: string;
|
|
8
|
-
effectDataPlatformBatch?: {
|
|
9
|
-
allowedMethods?: string[];
|
|
10
|
-
enabled?: boolean;
|
|
11
|
-
endpoint?: string;
|
|
12
|
-
flushIntervalMs?: number;
|
|
13
|
-
maxBatchBytes?: number;
|
|
14
|
-
maxBatchSize?: number;
|
|
15
|
-
requestTimeoutMs?: number;
|
|
16
|
-
};
|
|
17
|
-
httpMethodDecider?: HttpMethodDecider;
|
|
18
|
-
port: number;
|
|
19
|
-
prefix: string;
|
|
20
|
-
requestCreator?: string;
|
|
21
|
-
requestId?: string;
|
|
22
|
-
};
|
|
1
|
+
import { resolveEffectOperationContracts } from './operation-contracts';
|
|
23
2
|
|
|
24
3
|
export async function generateEffectWorkerRuntimeWrapper(
|
|
25
4
|
loader: { addDependency: (dependency: string) => void },
|
|
26
|
-
options:
|
|
5
|
+
options: { appDir: string; prefix: string; requestId?: string },
|
|
27
6
|
resourcePath: string,
|
|
28
7
|
) {
|
|
29
|
-
const
|
|
30
|
-
'../client-generator/generator'
|
|
31
|
-
);
|
|
32
|
-
const artifacts = await generateEffectClient({
|
|
8
|
+
const operationContracts = await resolveEffectOperationContracts({
|
|
33
9
|
appDir: options.appDir,
|
|
34
|
-
apiDir: options.apiDir,
|
|
35
10
|
resourcePath,
|
|
36
11
|
prefix: options.prefix,
|
|
37
|
-
port: Number(options.port),
|
|
38
|
-
target: 'bundle',
|
|
39
12
|
requestId: options.requestId,
|
|
40
|
-
requestCreator: options.requestCreator,
|
|
41
|
-
httpMethodDecider: options.httpMethodDecider,
|
|
42
|
-
dataPlatformBatch: options.effectDataPlatformBatch,
|
|
43
13
|
onDependency: dependency => loader.addDependency(dependency),
|
|
44
14
|
});
|
|
45
15
|
const sourceRequest = `${resourcePath}?modern-bff-runtime-source`;
|
|
46
|
-
const operationContracts = artifacts?.operationContracts ?? {};
|
|
47
|
-
|
|
48
16
|
return `import * as effectBffModule from ${JSON.stringify(sourceRequest)};
|
|
49
17
|
import { createEffectBffEdgeDispatcherFactory } from '@modern-js/bff-effect/effect-edge';
|
|
50
|
-
export const __modern_create_effect_bff_dispatcher = createEffectBffEdgeDispatcherFactory(effectBffModule, ${JSON.stringify(operationContracts)});
|
|
18
|
+
export const __modern_create_effect_bff_dispatcher = createEffectBffEdgeDispatcherFactory(effectBffModule, ${JSON.stringify(operationContracts ?? {})});
|
|
51
19
|
`;
|
|
52
20
|
}
|
|
53
|
-
|
|
54
|
-
export async function generateEffectClientCode(
|
|
55
|
-
options: EffectClientCodegenOptions,
|
|
56
|
-
) {
|
|
57
|
-
const { generateEffectClient } = await import(
|
|
58
|
-
'../client-generator/generator'
|
|
59
|
-
);
|
|
60
|
-
const artifacts = await generateEffectClient(options);
|
|
61
|
-
return artifacts === null ? null : artifacts.code;
|
|
62
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __webpack_require__ = {};
|
|
3
|
-
(()=>{
|
|
4
|
-
__webpack_require__.d = (exports1, getters, values)=>{
|
|
5
|
-
var define = (defs, kind)=>{
|
|
6
|
-
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
[kind]: defs[key]
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
define(getters, "get");
|
|
12
|
-
define(values, "value");
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
|
-
(()=>{
|
|
16
|
-
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
-
})();
|
|
18
|
-
(()=>{
|
|
19
|
-
__webpack_require__.r = (exports1)=>{
|
|
20
|
-
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
|
-
value: 'Module'
|
|
22
|
-
});
|
|
23
|
-
Object.defineProperty(exports1, '__esModule', {
|
|
24
|
-
value: true
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
})();
|
|
28
|
-
var __webpack_exports__ = {};
|
|
29
|
-
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
const LEGACY_LOAD_WARNING = '[BFF][Effect] loadBackendFederatedEffectApi was called without an expected delivery-unit identity (expected.unitId + expected.buildMarker). Identity-less public backend loads are deprecated (ADR-0019/MV-G23) and will be rejected in a future major.';
|
|
31
|
-
__webpack_require__.d(__webpack_exports__, {}, {
|
|
32
|
-
LEGACY_LOAD_WARNING: LEGACY_LOAD_WARNING
|
|
33
|
-
});
|
|
34
|
-
exports.LEGACY_LOAD_WARNING = __webpack_exports__.LEGACY_LOAD_WARNING;
|
|
35
|
-
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
36
|
-
"LEGACY_LOAD_WARNING"
|
|
37
|
-
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
38
|
-
Object.defineProperty(exports, '__esModule', {
|
|
39
|
-
value: true
|
|
40
|
-
});
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __webpack_require__ = {};
|
|
3
|
-
(()=>{
|
|
4
|
-
__webpack_require__.d = (exports1, getters, values)=>{
|
|
5
|
-
var define = (defs, kind)=>{
|
|
6
|
-
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
[kind]: defs[key]
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
define(getters, "get");
|
|
12
|
-
define(values, "value");
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
|
-
(()=>{
|
|
16
|
-
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
-
})();
|
|
18
|
-
(()=>{
|
|
19
|
-
__webpack_require__.r = (exports1)=>{
|
|
20
|
-
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
|
-
value: 'Module'
|
|
22
|
-
});
|
|
23
|
-
Object.defineProperty(exports1, '__esModule', {
|
|
24
|
-
value: true
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
})();
|
|
28
|
-
var __webpack_exports__ = {};
|
|
29
|
-
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
-
generateEffectClient: ()=>generateEffectClient,
|
|
32
|
-
generateEffectClientCode: ()=>generateEffectClientCode
|
|
33
|
-
});
|
|
34
|
-
const effect_namespaceObject = require("@modern-js/bff-effect/effect");
|
|
35
|
-
const utils_namespaceObject = require("@modern-js/utils");
|
|
36
|
-
const external_rendering_js_namespaceObject = require("./rendering.js");
|
|
37
|
-
const external_runtime_js_namespaceObject = require("./runtime.js");
|
|
38
|
-
function generateEffectClient(options) {
|
|
39
|
-
return (0, external_runtime_js_namespaceObject.loadEffectApi)({
|
|
40
|
-
appDir: options.appDir,
|
|
41
|
-
resourcePath: options.resourcePath,
|
|
42
|
-
onDependency: options.onDependency
|
|
43
|
-
}).then((api)=>{
|
|
44
|
-
if (null === api) {
|
|
45
|
-
utils_namespaceObject.logger.warn(`[BFF][Effect] Failed to generate client for ${options.resourcePath}: unable to resolve exported HttpApi.`);
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
return (0, external_runtime_js_namespaceObject.getHttpApiRuntime)().then((httpApiRuntime)=>{
|
|
49
|
-
const endpoints = (0, effect_namespaceObject.collectEffectEndpoints)(httpApiRuntime.reflect, api, options.prefix);
|
|
50
|
-
const generation = (0, external_rendering_js_namespaceObject.createEffectClientGeneration)(endpoints, options);
|
|
51
|
-
return {
|
|
52
|
-
code: (0, external_rendering_js_namespaceObject.renderEffectClientCode)(generation),
|
|
53
|
-
declaration: (0, external_rendering_js_namespaceObject.renderEffectClientDeclaration)(endpoints),
|
|
54
|
-
endpoints,
|
|
55
|
-
operationContracts: generation.operationContracts,
|
|
56
|
-
operationVersion: generation.operationVersion,
|
|
57
|
-
requestId: generation.requestId
|
|
58
|
-
};
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
function generateEffectClientCode(options) {
|
|
63
|
-
return generateEffectClient(options).then((artifacts)=>null === artifacts ? null : artifacts.code);
|
|
64
|
-
}
|
|
65
|
-
exports.generateEffectClient = __webpack_exports__.generateEffectClient;
|
|
66
|
-
exports.generateEffectClientCode = __webpack_exports__.generateEffectClientCode;
|
|
67
|
-
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
68
|
-
"generateEffectClient",
|
|
69
|
-
"generateEffectClientCode"
|
|
70
|
-
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
71
|
-
Object.defineProperty(exports, '__esModule', {
|
|
72
|
-
value: true
|
|
73
|
-
});
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __webpack_require__ = {};
|
|
3
|
-
(()=>{
|
|
4
|
-
__webpack_require__.d = (exports1, getters, values)=>{
|
|
5
|
-
var define = (defs, kind)=>{
|
|
6
|
-
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
[kind]: defs[key]
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
define(getters, "get");
|
|
12
|
-
define(values, "value");
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
|
-
(()=>{
|
|
16
|
-
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
-
})();
|
|
18
|
-
(()=>{
|
|
19
|
-
__webpack_require__.r = (exports1)=>{
|
|
20
|
-
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
|
-
value: 'Module'
|
|
22
|
-
});
|
|
23
|
-
Object.defineProperty(exports1, '__esModule', {
|
|
24
|
-
value: true
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
})();
|
|
28
|
-
var __webpack_exports__ = {};
|
|
29
|
-
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
-
bundleBuiltEffectEntryForNode: ()=>external_built_entry_js_namespaceObject.bundleBuiltEffectEntryForNode,
|
|
32
|
-
generateEffectClient: ()=>external_generator_js_namespaceObject.generateEffectClient,
|
|
33
|
-
generateEffectClientCode: ()=>external_generator_js_namespaceObject.generateEffectClientCode,
|
|
34
|
-
resolveEffectEntryFile: ()=>external_paths_js_namespaceObject.resolveEffectEntryFile,
|
|
35
|
-
resolveEffectEntryPaths: ()=>external_built_entry_js_namespaceObject.resolveEffectEntryPaths
|
|
36
|
-
});
|
|
37
|
-
const external_built_entry_js_namespaceObject = require("./built-entry.js");
|
|
38
|
-
const external_generator_js_namespaceObject = require("./generator.js");
|
|
39
|
-
const external_paths_js_namespaceObject = require("./paths.js");
|
|
40
|
-
exports.bundleBuiltEffectEntryForNode = __webpack_exports__.bundleBuiltEffectEntryForNode;
|
|
41
|
-
exports.generateEffectClient = __webpack_exports__.generateEffectClient;
|
|
42
|
-
exports.generateEffectClientCode = __webpack_exports__.generateEffectClientCode;
|
|
43
|
-
exports.resolveEffectEntryFile = __webpack_exports__.resolveEffectEntryFile;
|
|
44
|
-
exports.resolveEffectEntryPaths = __webpack_exports__.resolveEffectEntryPaths;
|
|
45
|
-
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
46
|
-
"bundleBuiltEffectEntryForNode",
|
|
47
|
-
"generateEffectClient",
|
|
48
|
-
"generateEffectClientCode",
|
|
49
|
-
"resolveEffectEntryFile",
|
|
50
|
-
"resolveEffectEntryPaths"
|
|
51
|
-
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
52
|
-
Object.defineProperty(exports, '__esModule', {
|
|
53
|
-
value: true
|
|
54
|
-
});
|