@bleedingdev/modern-js-plugin-bff-extensions 3.9.0-ultramodern.3 → 3.9.0-ultramodern.5

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.
Files changed (92) hide show
  1. package/dist/cjs/backend-federation/edge.js +6 -6
  2. package/dist/cjs/backend-federation/index.js +5 -5
  3. package/dist/cjs/backend-federation/load.js +2 -2
  4. package/dist/cjs/backend-federation-manifest/metadata.js +3 -3
  5. package/dist/cjs/backend-federation-manifest/remote.js +2 -2
  6. package/dist/cjs/backend-federation-manifest/validation.js +3 -3
  7. package/dist/cjs/client-generator/rendering.js +4 -4
  8. package/dist/cjs/cross-project-policy/evaluation.js +3 -3
  9. package/dist/cjs/cross-project-policy/node.js +4 -3
  10. package/dist/cjs/cross-project-policy/producer-runtime.js +58 -0
  11. package/dist/cjs/effect-adapter/entry.js +1 -0
  12. package/dist/cjs/effect-adapter/index.js +9 -2
  13. package/dist/cjs/effect-source-loader/index.js +4 -0
  14. package/dist/cjs/effect-source-loader/loader.js +6 -4
  15. package/dist/cjs/effect-source-loader/rspack-loader.js +89 -0
  16. package/dist/cjs/effect-source-loader/worker-runtime-source.js +71 -0
  17. package/dist/cjs/effect-source-loader/worker-runtime-wrapper.js +2 -30
  18. package/dist/cjs/hono/cross-project-policy.js +2 -1
  19. package/dist/cjs/hono/node.js +51 -0
  20. package/dist/esm/backend-federation/edge.mjs +1 -1
  21. package/dist/esm/backend-federation/index.mjs +1 -1
  22. package/dist/esm/backend-federation/load.mjs +1 -1
  23. package/dist/esm/backend-federation-manifest/metadata.mjs +1 -1
  24. package/dist/esm/backend-federation-manifest/remote.mjs +1 -1
  25. package/dist/esm/backend-federation-manifest/validation.mjs +1 -1
  26. package/dist/esm/client-generator/rendering.mjs +2 -2
  27. package/dist/esm/cross-project-policy/evaluation.mjs +1 -1
  28. package/dist/esm/cross-project-policy/node.mjs +2 -1
  29. package/dist/esm/cross-project-policy/producer-runtime.mjs +20 -0
  30. package/dist/esm/effect-adapter/entry.mjs +1 -0
  31. package/dist/esm/effect-adapter/index.mjs +5 -1
  32. package/dist/esm/effect-source-loader/index.mjs +1 -0
  33. package/dist/esm/effect-source-loader/loader.mjs +6 -4
  34. package/dist/esm/effect-source-loader/rspack-loader.mjs +51 -0
  35. package/dist/esm/effect-source-loader/worker-runtime-source.mjs +23 -0
  36. package/dist/esm/effect-source-loader/worker-runtime-wrapper.mjs +2 -30
  37. package/dist/esm/hono/cross-project-policy.mjs +2 -1
  38. package/dist/esm-node/backend-federation/edge.mjs +1 -1
  39. package/dist/esm-node/backend-federation/index.mjs +1 -1
  40. package/dist/esm-node/backend-federation/load.mjs +1 -1
  41. package/dist/esm-node/backend-federation-manifest/metadata.mjs +1 -1
  42. package/dist/esm-node/backend-federation-manifest/remote.mjs +1 -1
  43. package/dist/esm-node/backend-federation-manifest/validation.mjs +1 -1
  44. package/dist/esm-node/client-generator/rendering.mjs +2 -2
  45. package/dist/esm-node/cross-project-policy/evaluation.mjs +1 -1
  46. package/dist/esm-node/cross-project-policy/node.mjs +2 -1
  47. package/dist/esm-node/cross-project-policy/producer-runtime.mjs +21 -0
  48. package/dist/esm-node/effect-adapter/entry.mjs +1 -0
  49. package/dist/esm-node/effect-adapter/index.mjs +5 -1
  50. package/dist/esm-node/effect-source-loader/index.mjs +1 -0
  51. package/dist/esm-node/effect-source-loader/loader.mjs +6 -4
  52. package/dist/esm-node/effect-source-loader/rspack-loader.mjs +53 -0
  53. package/dist/esm-node/effect-source-loader/worker-runtime-source.mjs +24 -0
  54. package/dist/esm-node/effect-source-loader/worker-runtime-wrapper.mjs +2 -30
  55. package/dist/esm-node/hono/cross-project-policy.mjs +2 -1
  56. package/dist/esm-node/hono/node.mjs +14 -0
  57. package/dist/types/backend-federation/edge.d.ts +1 -1
  58. package/dist/types/backend-federation/index.d.ts +1 -1
  59. package/dist/types/backend-federation/types.d.ts +1 -1
  60. package/dist/types/client-generator/rendering.d.ts +1 -1
  61. package/dist/types/client-generator/types.d.ts +1 -1
  62. package/dist/types/cross-project-policy/evaluation.d.ts +1 -1
  63. package/dist/types/cross-project-policy/node.d.ts +2 -1
  64. package/dist/types/cross-project-policy/producer-runtime.d.ts +20 -0
  65. package/dist/types/effect-adapter/entry.d.ts +1 -0
  66. package/dist/types/effect-adapter/index.d.ts +2 -0
  67. package/dist/types/effect-source-loader/index.d.ts +1 -0
  68. package/dist/types/effect-source-loader/rspack-loader.d.ts +23 -0
  69. package/dist/types/effect-source-loader/worker-runtime-source.d.ts +4 -0
  70. package/dist/types/hono/node.d.ts +4 -0
  71. package/package.json +48 -8
  72. package/src/backend-federation/edge.ts +1 -1
  73. package/src/backend-federation/index.ts +1 -1
  74. package/src/backend-federation/load.ts +1 -1
  75. package/src/backend-federation/types.ts +1 -1
  76. package/src/backend-federation-manifest/metadata.ts +1 -1
  77. package/src/backend-federation-manifest/remote.ts +1 -1
  78. package/src/backend-federation-manifest/validation.ts +1 -1
  79. package/src/client-generator/rendering.ts +6 -6
  80. package/src/client-generator/types.ts +1 -1
  81. package/src/cross-project-policy/evaluation.ts +1 -1
  82. package/src/cross-project-policy/node.ts +3 -3
  83. package/src/cross-project-policy/producer-runtime.ts +43 -0
  84. package/src/effect-adapter/entry.ts +1 -0
  85. package/src/effect-adapter/index.ts +5 -0
  86. package/src/effect-source-loader/index.ts +1 -0
  87. package/src/effect-source-loader/loader.ts +29 -23
  88. package/src/effect-source-loader/rspack-loader.ts +102 -0
  89. package/src/effect-source-loader/worker-runtime-source.ts +34 -0
  90. package/src/effect-source-loader/worker-runtime-wrapper.ts +2 -30
  91. package/src/hono/cross-project-policy.ts +2 -1
  92. package/src/hono/node.ts +24 -0
@@ -1,4 +1,4 @@
1
- import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "@modern-js/utils/universal";
1
+ import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "@modern-js/backend-federation-contracts";
2
2
  import { createBackendFederationLoadEntryPlugin, createBackendFederationRuntime, createBackendFederationRuntimeForLoad } from "./edge-runtime.mjs";
3
3
  import { LEGACY_LOAD_WARNING } from "./legacy-warning.mjs";
4
4
  import { normalizeExpose } from "./utils.mjs";
@@ -1,4 +1,4 @@
1
- export { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "@modern-js/utils/universal";
1
+ export { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "@modern-js/backend-federation-contracts";
2
2
  export { validateExpectedBackendFederationIdentity } from "./identity.mjs";
3
3
  export { createBackendFederationLoadEntryPlugin } from "./plugin.mjs";
4
4
  export { createBackendFederationRuntime } from "./runtime.mjs";
@@ -1,4 +1,4 @@
1
- import { BACKEND_FEDERATION_EFFECT_EXPOSE } from "@modern-js/utils/universal";
1
+ import { BACKEND_FEDERATION_EFFECT_EXPOSE } from "@modern-js/backend-federation-contracts";
2
2
  import { LEGACY_LOAD_WARNING } from "./legacy-warning.mjs";
3
3
  import { collectRemotes } from "./remotes.mjs";
4
4
  import { createBackendFederationRuntime } from "./runtime.mjs";
@@ -1,4 +1,4 @@
1
- import { backendFederationMetadata, backendFederationVersionBoundary } from "@modern-js/utils/universal";
1
+ import { backendFederationMetadata, backendFederationVersionBoundary } from "@modern-js/backend-federation-contracts";
2
2
  function stringValue(value) {
3
3
  return 'string' == typeof value && value.length > 0 ? value : void 0;
4
4
  }
@@ -1,5 +1,5 @@
1
+ import { backendFederationExposeNames } from "@modern-js/backend-federation-contracts";
1
2
  import { BackendFederationRemoteEntryError, resolveBackendFederationRemoteEntryVerification } from "@modern-js/server-runtime-extensions/backend-federation-security";
2
- import { backendFederationExposeNames } from "@modern-js/utils/universal";
3
3
  import { BACKEND_FEDERATION_EFFECT_EXPOSE } from "../backend-federation/index.mjs";
4
4
  import { BackendFederationManifestAdapterError, assertManifestAdapter } from "./errors.mjs";
5
5
  import { backendFederationMetadata, recordField, resolveRemoteEntryFromMetadata, stringValue } from "./metadata.mjs";
@@ -1,4 +1,4 @@
1
- import { formatBackendFederationValidationErrors, validateBackendFederationManifest } from "@modern-js/utils/universal";
1
+ import { formatBackendFederationValidationErrors, validateBackendFederationManifest } from "@modern-js/backend-federation-contracts";
2
2
  import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "../backend-federation/index.mjs";
3
3
  import { BackendFederationManifestAdapterError, assertConsistentValue, assertManifestAdapter, assertVersionValue } from "./errors.mjs";
4
4
  import { backendFederationMetadata, manifestDeliveryUnit, recordField, stringValue, versionBoundaryMetadata } from "./metadata.mjs";
@@ -1,8 +1,8 @@
1
- import { buildOperationContractMap, deriveOperationVersion } from "@modern-js/bff-core";
2
1
  import { createEffectEndpointContractHash, ensureLeadingSlash, normalizeEffectPrefix, toOperationContractSources } from "@modern-js/bff-effect/effect";
2
+ import { buildOperationContractMap, deriveOperationVersion } from "@modern-js/server-runtime-extensions/bff-policy/node";
3
3
  import { fs, upath } from "@modern-js/utils";
4
4
  const DEFAULT_REQUEST_CREATOR = '@modern-js/plugin-bff/client';
5
- const EFFECT_CLIENT_RUNTIME_IMPORT = '@modern-js/plugin-bff/effect-client-runtime';
5
+ const EFFECT_CLIENT_RUNTIME_IMPORT = '@modern-js/bff-effect/effect-client-runtime';
6
6
  function isAbsoluteUrl(value) {
7
7
  try {
8
8
  new URL(value);
@@ -1,4 +1,4 @@
1
- import { evaluateCrossProjectPolicy, resolveCrossProjectRequestObservation } from "@modern-js/bff-core/security/cross-project-policy";
1
+ import { evaluateCrossProjectPolicy, resolveCrossProjectRequestObservation } from "@modern-js/server-runtime-extensions/bff-policy";
2
2
  const DENIAL_HEADERS = {
3
3
  'content-type': 'application/json; charset=utf-8'
4
4
  };
@@ -1,6 +1,7 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import node_path from "node:path";
3
- import { deriveOperationVersion, resolveCrossProjectPolicy } from "@modern-js/bff-core";
3
+ import "@modern-js/server-runtime-extensions/server-config";
4
+ import { deriveOperationVersion, resolveCrossProjectPolicy } from "@modern-js/server-runtime-extensions/bff-policy/node";
4
5
  const readNearestPackageVersion = (startDir)=>{
5
6
  if (!startDir) return;
6
7
  let current = node_path.resolve(startDir);
@@ -0,0 +1,20 @@
1
+ function createProducerClient(configure, { requestId }) {
2
+ return (options)=>configure({
3
+ requestId,
4
+ requireEnvelope: true,
5
+ ...options,
6
+ identityBinding: {
7
+ enabled: true,
8
+ strict: true,
9
+ ...options?.identityBinding
10
+ },
11
+ operationContract: {
12
+ enabled: true,
13
+ strict: true,
14
+ requireSchemaHash: true,
15
+ requireOperationVersion: true,
16
+ ...options?.operationContract
17
+ }
18
+ });
19
+ }
20
+ export { createProducerClient };
@@ -1,4 +1,5 @@
1
1
  import node_path from "node:path";
2
+ import "@modern-js/server-runtime-extensions/server-config";
2
3
  import { API_DIR, findExists, fs, isProd } from "@modern-js/utils";
3
4
  const JS_OR_TS_EXTS = [
4
5
  '.js',
@@ -1,4 +1,5 @@
1
1
  import node_path from "node:path";
2
+ import "@modern-js/server-runtime-extensions/server-config";
2
3
  import { dispatchEffectBffRequest, resolveEffectBffModuleHandler, useEffectContext } from "@modern-js/bff-effect/effect";
3
4
  import { createDisposableServerRuntimeHandle, registerServerRuntimeDisposer } from "@modern-js/server-runtime-extensions/runtime-lifecycle";
4
5
  import { fs, isProd, logger } from "@modern-js/utils";
@@ -136,4 +137,7 @@ class EffectAdapter {
136
137
  this.api = api;
137
138
  }
138
139
  }
139
- export { EffectAdapter };
140
+ const createRuntimeAdapters = (api)=>[
141
+ new EffectAdapter(api)
142
+ ];
143
+ export { EffectAdapter, createRuntimeAdapters };
@@ -1,3 +1,4 @@
1
1
  export { resolveEffectEntryFile } from "../client-generator/paths.mjs";
2
2
  export { bundleEffectEntryForNode } from "./loader.mjs";
3
+ export { bundleEffectWorkerRuntimeSource } from "./worker-runtime-source.mjs";
3
4
  export { generateEffectClientCode, generateEffectWorkerRuntimeWrapper } from "./worker-runtime-wrapper.mjs";
@@ -47,16 +47,18 @@ function preserveSourceModuleSemantics() {
47
47
  name: 'modern-js-effect-source-semantics',
48
48
  setup (buildApi) {
49
49
  buildApi.onLoad({
50
- filter: /\.[cm]?[jt]sx?$/
50
+ filter: /\.[cm]?[jt]sx?$/,
51
+ namespace: 'file'
51
52
  }, async (args)=>{
52
53
  const loader = sourceLoader(args);
53
54
  if (!loader) return;
54
55
  const source = await node_fs.promises.readFile(args.path, 'utf8');
56
+ const canonicalSourcePath = await node_fs.promises.realpath(args.path);
55
57
  const compiled = await transform(source, {
56
58
  define: {
57
- __dirname: JSON.stringify(node_path.dirname(args.path)),
58
- __filename: JSON.stringify(args.path),
59
- 'import.meta.url': JSON.stringify(pathToFileURL(args.path).href)
59
+ __dirname: JSON.stringify(node_path.dirname(canonicalSourcePath)),
60
+ __filename: JSON.stringify(canonicalSourcePath),
61
+ 'import.meta.url': JSON.stringify(pathToFileURL(canonicalSourcePath).href)
60
62
  },
61
63
  jsx: 'automatic',
62
64
  loader,
@@ -0,0 +1,51 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { bundleEffectWorkerRuntimeSource, generateEffectClientCode, generateEffectWorkerRuntimeWrapper, resolveEffectEntryFile } from "./index.mjs";
3
+ async function loader(source) {
4
+ this.cacheable();
5
+ delete require.cache[this.resourcePath];
6
+ const callback = this.async();
7
+ try {
8
+ const options = this.getOptions();
9
+ const entry = resolveEffectEntryFile(options);
10
+ if (!entry || realpathSync(entry) !== realpathSync(this.resourcePath)) throw new Error(`Unexpected Effect BFF loader resource: ${this.resourcePath}`);
11
+ const query = new URLSearchParams(this.resourceQuery);
12
+ if (query.has('modern-bff-runtime-source')) {
13
+ const { transform } = await import("@swc/core");
14
+ const transformed = await transform(source, {
15
+ filename: this.resourcePath,
16
+ sourceMaps: false,
17
+ jsc: {
18
+ parser: {
19
+ syntax: "typescript",
20
+ tsx: /\.[jt]sx$/.test(this.resourcePath)
21
+ },
22
+ target: 'es2024'
23
+ },
24
+ module: {
25
+ type: 'es6'
26
+ }
27
+ });
28
+ callback(void 0, await bundleEffectWorkerRuntimeSource(transformed.code, this.resourcePath, this));
29
+ } else if (query.has('modern-bff-runtime')) callback(void 0, await generateEffectWorkerRuntimeWrapper(this, options, this.resourcePath));
30
+ else {
31
+ const code = await generateEffectClientCode({
32
+ appDir: options.appDir,
33
+ apiDir: options.apiDir,
34
+ resourcePath: this.resourcePath,
35
+ prefix: options.prefix,
36
+ port: Number(options.port),
37
+ target: options.target,
38
+ requestId: options.requestId,
39
+ requestCreator: options.requestCreator,
40
+ httpMethodDecider: options.httpMethodDecider,
41
+ dataPlatformBatch: options.effectDataPlatformBatch,
42
+ onDependency: (dependency)=>this.addDependency(dependency)
43
+ });
44
+ if (null === code) throw new Error(`Failed to generate Effect client for ${this.resourcePath}`);
45
+ callback(void 0, code);
46
+ }
47
+ } catch (error) {
48
+ callback(error instanceof Error ? error : new Error(String(error)));
49
+ }
50
+ }
51
+ export default loader;
@@ -0,0 +1,23 @@
1
+ import node_path from "node:path";
2
+ import { build } from "esbuild";
3
+ async function bundleEffectWorkerRuntimeSource(source, resourcePath, loader) {
4
+ const result = await build({
5
+ absWorkingDir: node_path.dirname(resourcePath),
6
+ bundle: true,
7
+ format: 'esm',
8
+ metafile: true,
9
+ packages: 'external',
10
+ platform: 'neutral',
11
+ stdin: {
12
+ contents: source,
13
+ loader: 'js',
14
+ resolveDir: node_path.dirname(resourcePath),
15
+ sourcefile: resourcePath
16
+ },
17
+ target: 'es2024',
18
+ write: false
19
+ });
20
+ for (const dependency of Object.keys(result.metafile.inputs))if ('<stdin>' !== dependency) loader.addDependency(node_path.resolve(node_path.dirname(resourcePath), dependency));
21
+ return result.outputFiles[0].text;
22
+ }
23
+ export { bundleEffectWorkerRuntimeSource };
@@ -16,36 +16,8 @@ async function generateEffectWorkerRuntimeWrapper(loader, options, resourcePath)
16
16
  const sourceRequest = `${resourcePath}?modern-bff-runtime-source`;
17
17
  const operationContracts = artifacts?.operationContracts ?? {};
18
18
  return `import * as effectBffModule from ${JSON.stringify(sourceRequest)};
19
- import { createEffectBffEdgeDispatcher } from '@modern-js/plugin-bff/effect-edge/dispatcher';
20
-
21
- const __generatedOperationContracts = ${JSON.stringify(operationContracts)};
22
-
23
- const __mergeGeneratedOperationContracts = policy => {
24
- if (
25
- !policy ||
26
- !policy.expectedOperationContracts ||
27
- typeof policy.expectedOperationContracts !== 'object' ||
28
- Array.isArray(policy.expectedOperationContracts)
29
- ) {
30
- return policy;
31
- }
32
- return {
33
- ...policy,
34
- expectedOperationContracts: {
35
- ...policy.expectedOperationContracts,
36
- ...__generatedOperationContracts,
37
- },
38
- };
39
- };
40
-
41
- export const __modern_create_effect_bff_dispatcher = options =>
42
- createEffectBffEdgeDispatcher({
43
- ...options,
44
- crossProjectPolicy: __mergeGeneratedOperationContracts(
45
- options?.crossProjectPolicy,
46
- ),
47
- module: effectBffModule,
48
- });
19
+ import { createEffectBffEdgeDispatcherFactory } from '@modern-js/bff-effect/effect-edge';
20
+ export const __modern_create_effect_bff_dispatcher = createEffectBffEdgeDispatcherFactory(effectBffModule, ${JSON.stringify(operationContracts)});
49
21
  `;
50
22
  }
51
23
  async function generateEffectClientCode(options) {
@@ -5,6 +5,7 @@ const createHonoCrossProjectPolicyMiddleware = (policy, routePath)=>async functi
5
5
  routePath
6
6
  });
7
7
  if (denial) return denial;
8
- return next();
8
+ const result = await next();
9
+ return result instanceof Response ? result : void 0;
9
10
  };
10
11
  export { createHonoCrossProjectPolicyMiddleware };
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "@modern-js/utils/universal";
2
+ import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "@modern-js/backend-federation-contracts";
3
3
  import { createBackendFederationLoadEntryPlugin, createBackendFederationRuntime, createBackendFederationRuntimeForLoad } from "./edge-runtime.mjs";
4
4
  import { LEGACY_LOAD_WARNING } from "./legacy-warning.mjs";
5
5
  import { normalizeExpose } from "./utils.mjs";
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- export { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "@modern-js/utils/universal";
2
+ export { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "@modern-js/backend-federation-contracts";
3
3
  export { validateExpectedBackendFederationIdentity } from "./identity.mjs";
4
4
  export { createBackendFederationLoadEntryPlugin } from "./plugin.mjs";
5
5
  export { createBackendFederationRuntime } from "./runtime.mjs";
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { BACKEND_FEDERATION_EFFECT_EXPOSE } from "@modern-js/utils/universal";
2
+ import { BACKEND_FEDERATION_EFFECT_EXPOSE } from "@modern-js/backend-federation-contracts";
3
3
  import { LEGACY_LOAD_WARNING } from "./legacy-warning.mjs";
4
4
  import { collectRemotes } from "./remotes.mjs";
5
5
  import { createBackendFederationRuntime } from "./runtime.mjs";
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { backendFederationMetadata, backendFederationVersionBoundary } from "@modern-js/utils/universal";
2
+ import { backendFederationMetadata, backendFederationVersionBoundary } from "@modern-js/backend-federation-contracts";
3
3
  function stringValue(value) {
4
4
  return 'string' == typeof value && value.length > 0 ? value : void 0;
5
5
  }
@@ -1,6 +1,6 @@
1
1
  import "node:module";
2
+ import { backendFederationExposeNames } from "@modern-js/backend-federation-contracts";
2
3
  import { BackendFederationRemoteEntryError, resolveBackendFederationRemoteEntryVerification } from "@modern-js/server-runtime-extensions/backend-federation-security";
3
- import { backendFederationExposeNames } from "@modern-js/utils/universal";
4
4
  import { BACKEND_FEDERATION_EFFECT_EXPOSE } from "../backend-federation/index.mjs";
5
5
  import { BackendFederationManifestAdapterError, assertManifestAdapter } from "./errors.mjs";
6
6
  import { backendFederationMetadata, recordField, resolveRemoteEntryFromMetadata, stringValue } from "./metadata.mjs";
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { formatBackendFederationValidationErrors, validateBackendFederationManifest } from "@modern-js/utils/universal";
2
+ import { formatBackendFederationValidationErrors, validateBackendFederationManifest } from "@modern-js/backend-federation-contracts";
3
3
  import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from "../backend-federation/index.mjs";
4
4
  import { BackendFederationManifestAdapterError, assertConsistentValue, assertManifestAdapter, assertVersionValue } from "./errors.mjs";
5
5
  import { backendFederationMetadata, manifestDeliveryUnit, recordField, stringValue, versionBoundaryMetadata } from "./metadata.mjs";
@@ -1,9 +1,9 @@
1
1
  import "node:module";
2
- import { buildOperationContractMap, deriveOperationVersion } from "@modern-js/bff-core";
3
2
  import { createEffectEndpointContractHash, ensureLeadingSlash, normalizeEffectPrefix, toOperationContractSources } from "@modern-js/bff-effect/effect";
3
+ import { buildOperationContractMap, deriveOperationVersion } from "@modern-js/server-runtime-extensions/bff-policy/node";
4
4
  import { fs, upath } from "@modern-js/utils";
5
5
  const DEFAULT_REQUEST_CREATOR = '@modern-js/plugin-bff/client';
6
- const EFFECT_CLIENT_RUNTIME_IMPORT = '@modern-js/plugin-bff/effect-client-runtime';
6
+ const EFFECT_CLIENT_RUNTIME_IMPORT = '@modern-js/bff-effect/effect-client-runtime';
7
7
  function isAbsoluteUrl(value) {
8
8
  try {
9
9
  new URL(value);
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { evaluateCrossProjectPolicy, resolveCrossProjectRequestObservation } from "@modern-js/bff-core/security/cross-project-policy";
2
+ import { evaluateCrossProjectPolicy, resolveCrossProjectRequestObservation } from "@modern-js/server-runtime-extensions/bff-policy";
3
3
  const DENIAL_HEADERS = {
4
4
  'content-type': 'application/json; charset=utf-8'
5
5
  };
@@ -1,7 +1,8 @@
1
1
  import "node:module";
2
2
  import { readFileSync } from "node:fs";
3
3
  import node_path from "node:path";
4
- import { deriveOperationVersion, resolveCrossProjectPolicy } from "@modern-js/bff-core";
4
+ import "@modern-js/server-runtime-extensions/server-config";
5
+ import { deriveOperationVersion, resolveCrossProjectPolicy } from "@modern-js/server-runtime-extensions/bff-policy/node";
5
6
  const readNearestPackageVersion = (startDir)=>{
6
7
  if (!startDir) return;
7
8
  let current = node_path.resolve(startDir);
@@ -0,0 +1,21 @@
1
+ import "node:module";
2
+ function createProducerClient(configure, { requestId }) {
3
+ return (options)=>configure({
4
+ requestId,
5
+ requireEnvelope: true,
6
+ ...options,
7
+ identityBinding: {
8
+ enabled: true,
9
+ strict: true,
10
+ ...options?.identityBinding
11
+ },
12
+ operationContract: {
13
+ enabled: true,
14
+ strict: true,
15
+ requireSchemaHash: true,
16
+ requireOperationVersion: true,
17
+ ...options?.operationContract
18
+ }
19
+ });
20
+ }
21
+ export { createProducerClient };
@@ -1,5 +1,6 @@
1
1
  import "node:module";
2
2
  import node_path from "node:path";
3
+ import "@modern-js/server-runtime-extensions/server-config";
3
4
  import { API_DIR, findExists, fs, isProd } from "@modern-js/utils";
4
5
  const JS_OR_TS_EXTS = [
5
6
  '.js',
@@ -1,5 +1,6 @@
1
1
  import "node:module";
2
2
  import node_path from "node:path";
3
+ import "@modern-js/server-runtime-extensions/server-config";
3
4
  import { dispatchEffectBffRequest, resolveEffectBffModuleHandler, useEffectContext } from "@modern-js/bff-effect/effect";
4
5
  import { createDisposableServerRuntimeHandle, registerServerRuntimeDisposer } from "@modern-js/server-runtime-extensions/runtime-lifecycle";
5
6
  import { fs, isProd, logger } from "@modern-js/utils";
@@ -137,4 +138,7 @@ class EffectAdapter {
137
138
  this.api = api;
138
139
  }
139
140
  }
140
- export { EffectAdapter };
141
+ const createRuntimeAdapters = (api)=>[
142
+ new EffectAdapter(api)
143
+ ];
144
+ export { EffectAdapter, createRuntimeAdapters };
@@ -1,4 +1,5 @@
1
1
  import "node:module";
2
2
  export { resolveEffectEntryFile } from "../client-generator/paths.mjs";
3
3
  export { bundleEffectEntryForNode } from "./loader.mjs";
4
+ export { bundleEffectWorkerRuntimeSource } from "./worker-runtime-source.mjs";
4
5
  export { generateEffectClientCode, generateEffectWorkerRuntimeWrapper } from "./worker-runtime-wrapper.mjs";
@@ -48,16 +48,18 @@ function preserveSourceModuleSemantics() {
48
48
  name: 'modern-js-effect-source-semantics',
49
49
  setup (buildApi) {
50
50
  buildApi.onLoad({
51
- filter: /\.[cm]?[jt]sx?$/
51
+ filter: /\.[cm]?[jt]sx?$/,
52
+ namespace: 'file'
52
53
  }, async (args)=>{
53
54
  const loader = sourceLoader(args);
54
55
  if (!loader) return;
55
56
  const source = await node_fs.promises.readFile(args.path, 'utf8');
57
+ const canonicalSourcePath = await node_fs.promises.realpath(args.path);
56
58
  const compiled = await transform(source, {
57
59
  define: {
58
- __dirname: JSON.stringify(node_path.dirname(args.path)),
59
- __filename: JSON.stringify(args.path),
60
- 'import.meta.url': JSON.stringify(pathToFileURL(args.path).href)
60
+ __dirname: JSON.stringify(node_path.dirname(canonicalSourcePath)),
61
+ __filename: JSON.stringify(canonicalSourcePath),
62
+ 'import.meta.url': JSON.stringify(pathToFileURL(canonicalSourcePath).href)
61
63
  },
62
64
  jsx: 'automatic',
63
65
  loader,
@@ -0,0 +1,53 @@
1
+ import __rslib_shim_module__ from "node:module";
2
+ const require = /*#__PURE__*/ __rslib_shim_module__.createRequire(/*#__PURE__*/ (()=>import.meta.url)());
3
+ import { realpathSync } from "node:fs";
4
+ import { bundleEffectWorkerRuntimeSource, generateEffectClientCode, generateEffectWorkerRuntimeWrapper, resolveEffectEntryFile } from "./index.mjs";
5
+ async function loader(source) {
6
+ this.cacheable();
7
+ delete require.cache[this.resourcePath];
8
+ const callback = this.async();
9
+ try {
10
+ const options = this.getOptions();
11
+ const entry = resolveEffectEntryFile(options);
12
+ if (!entry || realpathSync(entry) !== realpathSync(this.resourcePath)) throw new Error(`Unexpected Effect BFF loader resource: ${this.resourcePath}`);
13
+ const query = new URLSearchParams(this.resourceQuery);
14
+ if (query.has('modern-bff-runtime-source')) {
15
+ const { transform } = await import("@swc/core");
16
+ const transformed = await transform(source, {
17
+ filename: this.resourcePath,
18
+ sourceMaps: false,
19
+ jsc: {
20
+ parser: {
21
+ syntax: "typescript",
22
+ tsx: /\.[jt]sx$/.test(this.resourcePath)
23
+ },
24
+ target: 'es2024'
25
+ },
26
+ module: {
27
+ type: 'es6'
28
+ }
29
+ });
30
+ callback(void 0, await bundleEffectWorkerRuntimeSource(transformed.code, this.resourcePath, this));
31
+ } else if (query.has('modern-bff-runtime')) callback(void 0, await generateEffectWorkerRuntimeWrapper(this, options, this.resourcePath));
32
+ else {
33
+ const code = await generateEffectClientCode({
34
+ appDir: options.appDir,
35
+ apiDir: options.apiDir,
36
+ resourcePath: this.resourcePath,
37
+ prefix: options.prefix,
38
+ port: Number(options.port),
39
+ target: options.target,
40
+ requestId: options.requestId,
41
+ requestCreator: options.requestCreator,
42
+ httpMethodDecider: options.httpMethodDecider,
43
+ dataPlatformBatch: options.effectDataPlatformBatch,
44
+ onDependency: (dependency)=>this.addDependency(dependency)
45
+ });
46
+ if (null === code) throw new Error(`Failed to generate Effect client for ${this.resourcePath}`);
47
+ callback(void 0, code);
48
+ }
49
+ } catch (error) {
50
+ callback(error instanceof Error ? error : new Error(String(error)));
51
+ }
52
+ }
53
+ export default loader;
@@ -0,0 +1,24 @@
1
+ import "node:module";
2
+ import node_path from "node:path";
3
+ import { build } from "esbuild";
4
+ async function bundleEffectWorkerRuntimeSource(source, resourcePath, loader) {
5
+ const result = await build({
6
+ absWorkingDir: node_path.dirname(resourcePath),
7
+ bundle: true,
8
+ format: 'esm',
9
+ metafile: true,
10
+ packages: 'external',
11
+ platform: 'neutral',
12
+ stdin: {
13
+ contents: source,
14
+ loader: 'js',
15
+ resolveDir: node_path.dirname(resourcePath),
16
+ sourcefile: resourcePath
17
+ },
18
+ target: 'es2024',
19
+ write: false
20
+ });
21
+ for (const dependency of Object.keys(result.metafile.inputs))if ('<stdin>' !== dependency) loader.addDependency(node_path.resolve(node_path.dirname(resourcePath), dependency));
22
+ return result.outputFiles[0].text;
23
+ }
24
+ export { bundleEffectWorkerRuntimeSource };
@@ -17,36 +17,8 @@ async function generateEffectWorkerRuntimeWrapper(loader, options, resourcePath)
17
17
  const sourceRequest = `${resourcePath}?modern-bff-runtime-source`;
18
18
  const operationContracts = artifacts?.operationContracts ?? {};
19
19
  return `import * as effectBffModule from ${JSON.stringify(sourceRequest)};
20
- import { createEffectBffEdgeDispatcher } from '@modern-js/plugin-bff/effect-edge/dispatcher';
21
-
22
- const __generatedOperationContracts = ${JSON.stringify(operationContracts)};
23
-
24
- const __mergeGeneratedOperationContracts = policy => {
25
- if (
26
- !policy ||
27
- !policy.expectedOperationContracts ||
28
- typeof policy.expectedOperationContracts !== 'object' ||
29
- Array.isArray(policy.expectedOperationContracts)
30
- ) {
31
- return policy;
32
- }
33
- return {
34
- ...policy,
35
- expectedOperationContracts: {
36
- ...policy.expectedOperationContracts,
37
- ...__generatedOperationContracts,
38
- },
39
- };
40
- };
41
-
42
- export const __modern_create_effect_bff_dispatcher = options =>
43
- createEffectBffEdgeDispatcher({
44
- ...options,
45
- crossProjectPolicy: __mergeGeneratedOperationContracts(
46
- options?.crossProjectPolicy,
47
- ),
48
- module: effectBffModule,
49
- });
20
+ import { createEffectBffEdgeDispatcherFactory } from '@modern-js/bff-effect/effect-edge';
21
+ export const __modern_create_effect_bff_dispatcher = createEffectBffEdgeDispatcherFactory(effectBffModule, ${JSON.stringify(operationContracts)});
50
22
  `;
51
23
  }
52
24
  async function generateEffectClientCode(options) {
@@ -6,6 +6,7 @@ const createHonoCrossProjectPolicyMiddleware = (policy, routePath)=>async functi
6
6
  routePath
7
7
  });
8
8
  if (denial) return denial;
9
- return next();
9
+ const result = await next();
10
+ return result instanceof Response ? result : void 0;
10
11
  };
11
12
  export { createHonoCrossProjectPolicyMiddleware };
@@ -0,0 +1,14 @@
1
+ import "node:module";
2
+ import { logger } from "@modern-js/utils";
3
+ import { resolveAdapterCrossProjectPolicy } from "../cross-project-policy/node.mjs";
4
+ import { bindHonoRouteHandlers } from "./bind-route-handlers.mjs";
5
+ const createHonoRouteBinder = (api, handlers)=>{
6
+ const policy = resolveAdapterCrossProjectPolicy(api, handlers);
7
+ return (options)=>bindHonoRouteHandlers({
8
+ ...options,
9
+ policy,
10
+ onError: api.getServerConfig()?.onError,
11
+ reportError: (error)=>logger.error(error)
12
+ });
13
+ };
14
+ export { createHonoRouteBinder };
@@ -1,4 +1,4 @@
1
- import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from '@modern-js/utils/universal';
1
+ import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from '@modern-js/backend-federation-contracts';
2
2
  import { type BackendFederationEdgeLoadEntryPlugin, type BackendFederationEdgeLoadEntryPluginOptions, type BackendFederationEdgeRemote, type BackendFederationEdgeRuntimeOptions } from './edge-runtime.js';
3
3
  import type { BackendFederatedEffectApiModule, BackendFederationLoadOptions, BackendFederationIdentityLoadOptions as UniversalBackendFederationIdentityLoadOptions } from './types.js';
4
4
  export { type BackendFederationEdgeLoadEntryPlugin, type BackendFederationEdgeLoadEntryPluginOptions, type BackendFederationEdgeRemote, type BackendFederationEdgeRuntime, type BackendFederationEdgeRuntimeOptions, createBackendFederationLoadEntryPlugin, createBackendFederationRuntime, } from './edge-runtime.js';
@@ -1,4 +1,4 @@
1
- import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from '@modern-js/utils/universal';
1
+ import { BACKEND_FEDERATION_CONTRACT_VERSION, BACKEND_FEDERATION_EFFECT_EXPOSE, BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_NODE_ADAPTER_VERSION } from '@modern-js/backend-federation-contracts';
2
2
  export { type BackendFederationExpectedIdentity, type BackendFederationIdentityIssue, validateExpectedBackendFederationIdentity, } from './identity.js';
3
3
  export { createBackendFederationLoadEntryPlugin } from './plugin.js';
4
4
  export { createBackendFederationRuntime } from './runtime.js';
@@ -1,6 +1,6 @@
1
+ import type { BACKEND_FEDERATION_EFFECT_EXPOSE } from '@modern-js/backend-federation-contracts';
1
2
  import type { EffectApiModule } from '@modern-js/bff-effect/effect';
2
3
  import type { BackendFederationRemoteEntryPolicy, BackendFederationRemoteEntryVerification } from '@modern-js/server-runtime-extensions/backend-federation-security';
3
- import type { BACKEND_FEDERATION_EFFECT_EXPOSE } from '@modern-js/utils/universal';
4
4
  import type { ModuleFederation, ModuleFederationRuntimePlugin } from '@module-federation/runtime';
5
5
  import type { BackendFederationExpectedIdentity } from './identity.js';
6
6
  export type BackendFederationRemote = {
@@ -1,5 +1,5 @@
1
- import { type OperationContractMap } from '@modern-js/bff-core';
2
1
  import { type EffectEndpointMeta } from '@modern-js/bff-effect/effect';
2
+ import { type OperationContractMap } from '@modern-js/server-runtime-extensions/bff-policy/node';
3
3
  import type { EffectClientCodegenOptions } from './types.js';
4
4
  export type EffectClientGeneration = {
5
5
  config: Record<string, unknown>;
@@ -1,5 +1,5 @@
1
- import type { OperationContractMap } from '@modern-js/bff-core';
2
1
  import type { EffectEndpointMeta } from '@modern-js/bff-effect/effect';
2
+ import type { OperationContractMap } from '@modern-js/server-runtime-extensions/bff-policy/node';
3
3
  import type { HttpMethodDecider } from '@modern-js/types';
4
4
  export type EffectClientCodegenOptions = {
5
5
  appDir: string;