@bleedingdev/modern-js-app-tools-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 (107) hide show
  1. package/dist/cjs/backend-federation-build/codegen.js +256 -0
  2. package/dist/cjs/backend-federation-build/config.js +204 -0
  3. package/dist/cjs/backend-federation-build/emit.js +150 -0
  4. package/dist/cjs/backend-federation-build/index.js +53 -0
  5. package/dist/cjs/build-config/build-environment.js +268 -0
  6. package/dist/cjs/build-config/precompress/plugin.js +124 -0
  7. package/dist/cjs/build-config/precompress/types.js +18 -0
  8. package/dist/cjs/build-config/public.js +46 -0
  9. package/dist/cjs/cloudflare/constants.js +1 -1
  10. package/dist/cjs/cloudflare/delivery-unit.js +9 -9
  11. package/dist/cjs/cloudflare-output-contract.js +37 -1
  12. package/dist/cjs/cloudflare-output-verifier/identity.js +6 -6
  13. package/dist/cjs/cloudflare-output-verifier/worker-bundles.js +4 -1
  14. package/dist/cjs/config.js +29 -1
  15. package/dist/cjs/deploy-output/npmAliases.js +226 -0
  16. package/dist/cjs/deploy-output/plugin.js +76 -0
  17. package/dist/cjs/deploy-output/target.js +48 -0
  18. package/dist/cjs/native-type-checker.js +150 -0
  19. package/dist/cjs/release-envelope/framework-output.js +27 -27
  20. package/dist/cjs/release-envelope/plugin.js +2 -1
  21. package/dist/cjs/release-identity.js +3 -6
  22. package/dist/esm/backend-federation-build/codegen.mjs +205 -0
  23. package/dist/esm/backend-federation-build/config.mjs +128 -0
  24. package/dist/esm/backend-federation-build/emit.mjs +99 -0
  25. package/dist/esm/backend-federation-build/index.mjs +1 -0
  26. package/dist/esm/build-config/build-environment.mjs +224 -0
  27. package/dist/esm/build-config/precompress/plugin.mjs +76 -0
  28. package/dist/esm/build-config/precompress/types.mjs +0 -0
  29. package/dist/esm/build-config/public.mjs +1 -0
  30. package/dist/esm/cloudflare/constants.mjs +1 -1
  31. package/dist/esm/cloudflare/delivery-unit.mjs +1 -1
  32. package/dist/esm/cloudflare-output-contract.mjs +35 -2
  33. package/dist/esm/cloudflare-output-verifier/identity.mjs +1 -1
  34. package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +5 -2
  35. package/dist/esm/config.mjs +1 -0
  36. package/dist/esm/deploy-output/npmAliases.mjs +174 -0
  37. package/dist/esm/deploy-output/plugin.mjs +28 -0
  38. package/dist/esm/deploy-output/target.mjs +10 -0
  39. package/dist/esm/native-type-checker.mjs +99 -0
  40. package/dist/esm/release-envelope/framework-output.mjs +1 -1
  41. package/dist/esm/release-envelope/plugin.mjs +2 -1
  42. package/dist/esm/release-identity.mjs +3 -6
  43. package/dist/esm-node/backend-federation-build/codegen.mjs +206 -0
  44. package/dist/esm-node/backend-federation-build/config.mjs +129 -0
  45. package/dist/esm-node/backend-federation-build/emit.mjs +100 -0
  46. package/dist/esm-node/backend-federation-build/index.mjs +2 -0
  47. package/dist/esm-node/build-config/build-environment.mjs +225 -0
  48. package/dist/esm-node/build-config/precompress/plugin.mjs +77 -0
  49. package/dist/esm-node/build-config/precompress/types.mjs +1 -0
  50. package/dist/esm-node/build-config/public.mjs +2 -0
  51. package/dist/esm-node/cloudflare/constants.mjs +1 -1
  52. package/dist/esm-node/cloudflare/delivery-unit.mjs +1 -1
  53. package/dist/esm-node/cloudflare-output-contract.mjs +35 -2
  54. package/dist/esm-node/cloudflare-output-verifier/identity.mjs +1 -1
  55. package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +5 -2
  56. package/dist/esm-node/config.mjs +1 -0
  57. package/dist/esm-node/deploy-output/npmAliases.mjs +175 -0
  58. package/dist/esm-node/deploy-output/plugin.mjs +31 -0
  59. package/dist/esm-node/deploy-output/target.mjs +11 -0
  60. package/dist/esm-node/native-type-checker.mjs +100 -0
  61. package/dist/esm-node/release-envelope/framework-output.mjs +1 -1
  62. package/dist/esm-node/release-envelope/plugin.mjs +2 -1
  63. package/dist/esm-node/release-identity.mjs +3 -6
  64. package/dist/types/backend-federation-build/codegen.d.ts +86 -0
  65. package/dist/types/backend-federation-build/config.d.ts +103 -0
  66. package/dist/types/backend-federation-build/emit.d.ts +21 -0
  67. package/dist/types/backend-federation-build/index.d.ts +2 -0
  68. package/dist/types/build-config/build-environment.d.ts +22 -0
  69. package/dist/types/build-config/precompress/plugin.d.ts +4 -0
  70. package/dist/types/build-config/precompress/types.d.ts +19 -0
  71. package/dist/types/build-config/public.d.ts +2 -0
  72. package/dist/types/cloudflare/constants.d.ts +1 -1
  73. package/dist/types/cloudflare/delivery-unit.d.ts +1 -1
  74. package/dist/types/cloudflare/worker-manifest.d.ts +2 -2
  75. package/dist/types/cloudflare-output-contract.d.ts +2 -1
  76. package/dist/types/cloudflare-output-verifier/identity.d.ts +1 -1
  77. package/dist/types/config.d.ts +2 -0
  78. package/dist/types/deploy-output/npmAliases.d.ts +14 -0
  79. package/dist/types/deploy-output/plugin.d.ts +15 -0
  80. package/dist/types/deploy-output/target.d.ts +6 -0
  81. package/dist/types/native-type-checker.d.ts +15 -0
  82. package/dist/types/precompress/LICENSE +20 -0
  83. package/dist/types/precompress/index.d.ts +76 -0
  84. package/package.json +55 -8
  85. package/src/backend-federation-build/codegen.ts +245 -0
  86. package/src/backend-federation-build/config.ts +376 -0
  87. package/src/backend-federation-build/emit.ts +205 -0
  88. package/src/backend-federation-build/index.ts +2 -0
  89. package/src/build-config/build-environment.ts +404 -0
  90. package/src/build-config/precompress/plugin.ts +140 -0
  91. package/src/build-config/precompress/types.ts +26 -0
  92. package/src/build-config/public.ts +6 -0
  93. package/src/cloudflare/constants.ts +1 -1
  94. package/src/cloudflare/delivery-unit.ts +2 -2
  95. package/src/cloudflare/worker-manifest.ts +1 -0
  96. package/src/cloudflare-builder.ts +1 -0
  97. package/src/cloudflare-output-contract.ts +37 -0
  98. package/src/cloudflare-output-verifier/identity.ts +1 -1
  99. package/src/cloudflare-output-verifier/worker-bundles.ts +5 -3
  100. package/src/config.ts +7 -0
  101. package/src/deploy-output/npmAliases.ts +333 -0
  102. package/src/deploy-output/plugin.ts +49 -0
  103. package/src/deploy-output/target.ts +23 -0
  104. package/src/native-type-checker.ts +122 -0
  105. package/src/release-envelope/framework-output.ts +1 -1
  106. package/src/release-envelope/plugin.ts +5 -1
  107. package/src/release-identity.ts +3 -2
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "directory": "packages/solutions/app-tools-extensions"
12
12
  },
13
13
  "license": "MIT",
14
- "version": "3.9.0-ultramodern.3",
14
+ "version": "3.9.0-ultramodern.5",
15
15
  "files": [
16
16
  "dist",
17
17
  "src"
@@ -81,6 +81,31 @@
81
81
  "types": "./dist/types/release-identity.d.ts",
82
82
  "import": "./dist/esm-node/release-identity.mjs",
83
83
  "require": "./dist/cjs/release-identity.js"
84
+ },
85
+ "./native-type-checker": {
86
+ "types": "./dist/types/native-type-checker.d.ts",
87
+ "import": "./dist/esm-node/native-type-checker.mjs",
88
+ "require": "./dist/cjs/native-type-checker.js"
89
+ },
90
+ "./build-config/precompress/plugin": {
91
+ "types": "./dist/types/build-config/precompress/plugin.d.ts",
92
+ "import": "./dist/esm-node/build-config/precompress/plugin.mjs",
93
+ "require": "./dist/cjs/build-config/precompress/plugin.js"
94
+ },
95
+ "./backend-federation-build": {
96
+ "types": "./dist/types/backend-federation-build/index.d.ts",
97
+ "import": "./dist/esm-node/backend-federation-build/index.mjs",
98
+ "require": "./dist/cjs/backend-federation-build/index.js"
99
+ },
100
+ "./deploy-output/plugin": {
101
+ "types": "./dist/types/deploy-output/plugin.d.ts",
102
+ "import": "./dist/esm-node/deploy-output/plugin.mjs",
103
+ "require": "./dist/cjs/deploy-output/plugin.js"
104
+ },
105
+ "./deploy-output/target": {
106
+ "types": "./dist/types/deploy-output/target.d.ts",
107
+ "import": "./dist/esm-node/deploy-output/target.mjs",
108
+ "require": "./dist/cjs/deploy-output/target.js"
84
109
  }
85
110
  },
86
111
  "typesVersions": {
@@ -88,6 +113,18 @@
88
113
  "*": [
89
114
  "./dist/types/*",
90
115
  "./src/*"
116
+ ],
117
+ "build-config/precompress/plugin": [
118
+ "./dist/types/build-config/precompress/plugin.d.ts"
119
+ ],
120
+ "backend-federation-build": [
121
+ "./dist/types/backend-federation-build/index.d.ts"
122
+ ],
123
+ "deploy-output/plugin": [
124
+ "./dist/types/deploy-output/plugin.d.ts"
125
+ ],
126
+ "deploy-output/target": [
127
+ "./dist/types/deploy-output/target.d.ts"
91
128
  ]
92
129
  }
93
130
  },
@@ -98,17 +135,24 @@
98
135
  "@babel/parser": "^8.0.4",
99
136
  "@babel/traverse": "^8.0.4",
100
137
  "@loadable/component": "5.16.7",
101
- "@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.9.0-ultramodern.3",
102
- "@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.3",
103
- "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.3",
104
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.3",
138
+ "@modern-js/backend-federation-contracts": "npm:@bleedingdev/modern-js-backend-federation-contracts@3.9.0-ultramodern.5",
139
+ "@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.9.0-ultramodern.5",
140
+ "@modern-js/prod-server": "npm:@bleedingdev/modern-js-prod-server@3.9.0-ultramodern.5",
141
+ "@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.9.0-ultramodern.5",
142
+ "@modern-js/server-runtime-extensions": "npm:@bleedingdev/modern-js-server-runtime-extensions@3.9.0-ultramodern.5",
143
+ "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.5",
144
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.5",
105
145
  "@swc/helpers": "^0.5.23",
146
+ "compression-webpack-plugin": "^12.0.0",
147
+ "esbuild": "^0.28.2",
106
148
  "std-env": "4.2.0"
107
149
  },
108
150
  "peerDependencies": {
109
151
  "@rsbuild/core": "2.2.3"
110
152
  },
111
153
  "devDependencies": {
154
+ "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.0-ultramodern.5",
155
+ "@modern-js/plugin-bff-extensions": "npm:@bleedingdev/modern-js-plugin-bff-extensions@3.9.0-ultramodern.5",
112
156
  "@module-federation/runtime-tools": "2.9.0",
113
157
  "@rsbuild/core": "2.2.3",
114
158
  "@rslib/core": "1.0.0",
@@ -116,7 +160,9 @@
116
160
  "@types/babel__traverse": "7.28.0",
117
161
  "@types/node": "^26.4.1",
118
162
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
119
- "core-js": "^3.50.0"
163
+ "core-js": "^3.50.0",
164
+ "effect": "4.0.0-rc.112",
165
+ "ndepe": "^0.1.13"
120
166
  },
121
167
  "sideEffects": false,
122
168
  "publishConfig": {
@@ -125,7 +171,8 @@
125
171
  "scripts": {
126
172
  "pretest": "pnpm run build",
127
173
  "dev": "rslib build --watch",
128
- "build": "rslib build",
129
- "test": "rstest"
174
+ "build": "rslib build && pnpm run verify:public-surface",
175
+ "test": "rstest",
176
+ "verify:public-surface": "node ./tests/build-config/verify-public-surface.mjs"
130
177
  }
131
178
  }
@@ -0,0 +1,245 @@
1
+ import path from 'node:path';
2
+ import {
3
+ BACKEND_FEDERATION_EFFECT_EXPOSE as BACKEND_EXPOSE,
4
+ BACKEND_FEDERATION_MANIFEST_FILE as BACKEND_MANIFEST_FILE,
5
+ BACKEND_FEDERATION_REMOTE_ENTRY_FILE as BACKEND_REMOTE_ENTRY_FILE,
6
+ BACKEND_FEDERATION_CONTRACT_VERSION as CONTRACT_VERSION,
7
+ formatBackendFederationValidationErrors,
8
+ BACKEND_FEDERATION_NODE_ADAPTER_VERSION as NODE_ADAPTER_VERSION,
9
+ validateBackendFederationManifest,
10
+ } from '@modern-js/backend-federation-contracts';
11
+ import type { BackendFederationEntryIntegrity } from '@modern-js/server-runtime-extensions/backend-federation-security';
12
+ import { build } from 'esbuild';
13
+ import { type BackendFederationApp, normalizeRelativePath } from './config';
14
+
15
+ const createRelativeImportSpecifier = (
16
+ fromDirectory: string,
17
+ toFile: string,
18
+ ) => {
19
+ const relativePath = normalizeRelativePath(
20
+ path.relative(fromDirectory, toFile),
21
+ );
22
+ return relativePath.startsWith('.') ? relativePath : `./${relativePath}`;
23
+ };
24
+
25
+ const createPublicPath = (containerEntry: string, fallbackPort: number) => {
26
+ try {
27
+ return new URL('.', containerEntry).href;
28
+ } catch {
29
+ const slashIndex = containerEntry.lastIndexOf('/');
30
+ if (slashIndex >= 0) {
31
+ return containerEntry.slice(0, slashIndex + 1);
32
+ }
33
+
34
+ return `http://localhost:${fallbackPort}/`;
35
+ }
36
+ };
37
+
38
+ export const createBackendRemoteEntrySource = async (
39
+ workspaceRoot: string,
40
+ app: BackendFederationApp,
41
+ effectApiPath: string,
42
+ entryPath: string,
43
+ ) => {
44
+ const effectApiSpecifier = createRelativeImportSpecifier(
45
+ path.dirname(effectApiPath),
46
+ effectApiPath,
47
+ );
48
+ const containerMetadata = {
49
+ buildVersion: app.buildVersion,
50
+ expose: BACKEND_EXPOSE,
51
+ name: app.backendName,
52
+ packageName: app.packageName,
53
+ remoteType: app.remoteType,
54
+ source: normalizeRelativePath(path.relative(workspaceRoot, effectApiPath)),
55
+ version: app.version,
56
+ ...(app.unitId ? { unitId: app.unitId } : {}),
57
+ ...(app.sourceRevision ? { sourceRevision: app.sourceRevision } : {}),
58
+ };
59
+ const compatibility = {
60
+ build: app.buildVersion,
61
+ contractVersion: CONTRACT_VERSION,
62
+ nodeAdapterVersion: NODE_ADAPTER_VERSION,
63
+ packageName: app.packageName,
64
+ ...(app.unitId ? { unitId: app.unitId } : {}),
65
+ ...(app.sourceRevision ? { sourceRevision: app.sourceRevision } : {}),
66
+ };
67
+ const source = `// Generated by Modern.js backend federation build.
68
+ import * as exposedNamespace from ${JSON.stringify(effectApiSpecifier)};
69
+
70
+ const exposedModule = {
71
+ ...exposedNamespace,
72
+ backendFederationContract: {
73
+ ...(exposedNamespace.backendFederationContract ?? {}),
74
+ compatibility: {
75
+ ...(exposedNamespace.backendFederationContract?.compatibility ?? {}),
76
+ ...${JSON.stringify(compatibility)},
77
+ },
78
+ name: ${JSON.stringify(app.backendName)},
79
+ role: 'microvertical-server',
80
+ runtimeFramework: 'effect',
81
+ strictEffectApproach: true,
82
+ },
83
+ };
84
+ const exposedModules = {
85
+ ${JSON.stringify(BACKEND_EXPOSE)}: () => Promise.resolve(exposedModule),
86
+ };
87
+ const __modernjsBackendFederation = ${JSON.stringify(containerMetadata)};
88
+
89
+ function init() {}
90
+
91
+ function get(id) {
92
+ const load = exposedModules[id];
93
+ if (!load) {
94
+ throw new Error(\`Unexpected backend federation expose: \${id}\`);
95
+ }
96
+
97
+ return async () => load();
98
+ }
99
+
100
+ module.exports = { __modernjsBackendFederation, get, init };
101
+ `;
102
+ const result = await build({
103
+ absWorkingDir: path.dirname(effectApiPath),
104
+ bundle: true,
105
+ format: 'cjs',
106
+ logLevel: 'silent',
107
+ platform: 'node',
108
+ stdin: {
109
+ contents: source,
110
+ loader: 'ts',
111
+ resolveDir: path.dirname(effectApiPath),
112
+ sourcefile: path.basename(entryPath),
113
+ },
114
+ target: 'node20',
115
+ write: false,
116
+ });
117
+ const output = result.outputFiles[0];
118
+ if (!output) {
119
+ throw new Error(
120
+ '[backend-federation-build] CommonJS backend federation container emitted no output.',
121
+ );
122
+ }
123
+ return output.text;
124
+ };
125
+
126
+ export const createBackendManifest = (
127
+ workspaceRoot: string,
128
+ distDirectory: string,
129
+ app: BackendFederationApp,
130
+ entryIntegrity: BackendFederationEntryIntegrity,
131
+ ) => {
132
+ const sourceModule = `${app.directory}/api/effect-api.ts`;
133
+ const publicPath = createPublicPath(app.containerEntry, app.port);
134
+
135
+ const manifest = {
136
+ schemaVersion: 1,
137
+ id: app.backendName,
138
+ name: app.backendName,
139
+ version: app.version,
140
+ buildVersion: app.buildVersion,
141
+ metaData: {
142
+ name: app.backendName,
143
+ type: 'backend',
144
+ buildInfo: {
145
+ buildVersion: app.buildVersion,
146
+ buildName: app.packageName,
147
+ },
148
+ remoteEntry: {
149
+ name: BACKEND_REMOTE_ENTRY_FILE,
150
+ path: '',
151
+ type: app.remoteType,
152
+ },
153
+ globalName: app.backendName,
154
+ publicPath,
155
+ ssrRemoteEntry: {
156
+ name: BACKEND_REMOTE_ENTRY_FILE,
157
+ path: '',
158
+ type: app.remoteType,
159
+ },
160
+ ssrPublicPath: publicPath,
161
+ },
162
+ entry: {
163
+ ...entryIntegrity,
164
+ file: BACKEND_REMOTE_ENTRY_FILE,
165
+ path: normalizeRelativePath(
166
+ path.relative(
167
+ workspaceRoot,
168
+ path.join(distDirectory, BACKEND_REMOTE_ENTRY_FILE),
169
+ ),
170
+ ),
171
+ type: app.remoteType,
172
+ url: app.containerEntry,
173
+ },
174
+ exposes: [
175
+ {
176
+ id: `${app.backendName}:${BACKEND_EXPOSE}`,
177
+ name: BACKEND_EXPOSE,
178
+ path: '',
179
+ assets: {
180
+ js: {
181
+ async: [],
182
+ sync: [BACKEND_REMOTE_ENTRY_FILE],
183
+ },
184
+ css: {
185
+ async: [],
186
+ sync: [],
187
+ },
188
+ },
189
+ },
190
+ ],
191
+ shared: [],
192
+ backendFederation: {
193
+ role: 'microvertical-server',
194
+ appId: app.id,
195
+ name: app.backendName,
196
+ runtimeFramework: 'effect',
197
+ strictEffectApproach: true,
198
+ contractVersion: CONTRACT_VERSION,
199
+ nodeAdapterVersion: NODE_ADAPTER_VERSION,
200
+ remoteType: app.remoteType,
201
+ expose: BACKEND_EXPOSE,
202
+ manifestUrl: app.manifestUrl,
203
+ containerEntry: app.containerEntry,
204
+ source: {
205
+ module: sourceModule,
206
+ },
207
+ readinessPath: `${app.apiPrefix}/${app.apiStem}/readiness`,
208
+ openapiPath: `${app.apiPrefix}/openapi.json`,
209
+ ...(app.deliveryUnit ? { deliveryUnit: app.deliveryUnit } : {}),
210
+ versionBoundary: {
211
+ invariant: 'web-and-api-same-build',
212
+ packageName: app.packageName,
213
+ version: app.version,
214
+ buildVersion: app.buildVersion,
215
+ ...(app.uiManifestUrl ? { uiManifestUrl: app.uiManifestUrl } : {}),
216
+ ...(app.deliveryUnit
217
+ ? {
218
+ deliveryUnit: {
219
+ unitId: app.deliveryUnit.unitId,
220
+ buildMarker: app.deliveryUnit.buildMarker,
221
+ sourceRevision: app.deliveryUnit.sourceRevision,
222
+ },
223
+ }
224
+ : {}),
225
+ },
226
+ },
227
+ };
228
+
229
+ const validation = validateBackendFederationManifest(manifest, {
230
+ path: 'backendFederationManifest',
231
+ requireEffectExpose: true,
232
+ requireEffectRuntime: true,
233
+ requireVersionFields: true,
234
+ });
235
+
236
+ if (!validation.ok) {
237
+ throw new Error(
238
+ `[backend-federation-build] Invalid backend federation manifest: ${formatBackendFederationValidationErrors(
239
+ validation.errors,
240
+ )}.`,
241
+ );
242
+ }
243
+
244
+ return manifest;
245
+ };