@bleedingdev/modern-js-ultramodern-create 3.9.3-ultramodern.1 → 3.9.3-ultramodern.11
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 +46 -5
- package/dist/cjs/ultramodern-tooling/config/normalize.cjs +1 -1
- package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +2 -7
- package/dist/cjs/ultramodern-workspace/api/client.cjs +2 -37
- package/dist/cjs/ultramodern-workspace/api.cjs +0 -3
- package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +9 -8
- package/dist/cjs/ultramodern-workspace/native-app.cjs +0 -2
- package/dist/cjs/ultramodern-workspace/native-federation.cjs +1 -1
- package/dist/cjs/ultramodern-workspace/package-json.cjs +10 -5
- package/dist/cjs/ultramodern-workspace/patch-inventory.cjs +20 -2
- package/dist/cjs/ultramodern-workspace/policy.cjs +6 -1
- package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +5 -0
- package/dist/cjs/ultramodern-workspace/validation/architecture.cjs +25 -11
- package/dist/cjs/ultramodern-workspace/validation/native-shell-runtime.cjs +117 -0
- package/dist/cjs/ultramodern-workspace/validation/renderer.cjs +3 -3
- package/dist/cjs/ultramodern-workspace/validation/workspace.cjs +1 -1
- package/dist/cjs/ultramodern-workspace/versions.cjs +52 -21
- package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +6 -1
- package/dist/cjs/ultramodern-workspace/write-app.cjs +1 -3
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +9 -2
- package/dist/esm/ultramodern-tooling/config/normalize.js +2 -2
- package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +3 -8
- package/dist/esm/ultramodern-workspace/api/client.js +4 -36
- package/dist/esm/ultramodern-workspace/api.js +1 -1
- package/dist/esm/ultramodern-workspace/module-federation/config.js +9 -8
- package/dist/esm/ultramodern-workspace/native-app.js +0 -2
- package/dist/esm/ultramodern-workspace/native-federation.js +1 -1
- package/dist/esm/ultramodern-workspace/package-json.js +10 -5
- package/dist/esm/ultramodern-workspace/patch-inventory.js +20 -2
- package/dist/esm/ultramodern-workspace/policy.js +7 -2
- package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +5 -0
- package/dist/esm/ultramodern-workspace/validation/architecture.js +25 -11
- package/dist/esm/ultramodern-workspace/validation/native-shell-runtime.js +76 -0
- package/dist/esm/ultramodern-workspace/validation/renderer.js +3 -3
- package/dist/esm/ultramodern-workspace/validation/workspace.js +1 -1
- package/dist/esm/ultramodern-workspace/versions.js +47 -22
- package/dist/esm/ultramodern-workspace/workspace-script-plan.js +6 -1
- package/dist/esm/ultramodern-workspace/write-app.js +1 -3
- package/dist/esm/ultramodern-workspace/write-workspace.js +9 -2
- package/dist/esm-node/ultramodern-tooling/config/normalize.js +2 -2
- package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +3 -8
- package/dist/esm-node/ultramodern-workspace/api/client.js +4 -36
- package/dist/esm-node/ultramodern-workspace/api.js +1 -1
- package/dist/esm-node/ultramodern-workspace/module-federation/config.js +9 -8
- package/dist/esm-node/ultramodern-workspace/native-app.js +0 -2
- package/dist/esm-node/ultramodern-workspace/native-federation.js +1 -1
- package/dist/esm-node/ultramodern-workspace/package-json.js +10 -5
- package/dist/esm-node/ultramodern-workspace/patch-inventory.js +20 -2
- package/dist/esm-node/ultramodern-workspace/policy.js +7 -2
- package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +5 -0
- package/dist/esm-node/ultramodern-workspace/validation/architecture.js +25 -11
- package/dist/esm-node/ultramodern-workspace/validation/native-shell-runtime.js +77 -0
- package/dist/esm-node/ultramodern-workspace/validation/renderer.js +3 -3
- package/dist/esm-node/ultramodern-workspace/validation/workspace.js +1 -1
- package/dist/esm-node/ultramodern-workspace/versions.js +47 -22
- package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +6 -1
- package/dist/esm-node/ultramodern-workspace/write-app.js +1 -3
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +9 -2
- package/dist/types/ultramodern-workspace/api/client.d.ts +1 -2
- package/dist/types/ultramodern-workspace/api.d.ts +1 -1
- package/dist/types/ultramodern-workspace/policy.d.ts +34 -27
- package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +2 -2
- package/dist/types/ultramodern-workspace/validation/native-shell-runtime.d.ts +22 -0
- package/dist/types/ultramodern-workspace/versions.d.ts +49 -45
- package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +1 -1
- package/package.json +35 -34
- package/release-cohort.json +52 -64
- package/template-workspace/README.md.handlebars +14 -5
- package/templates/workspace/apps/modern.config.ts.handlebars +1 -2
- package/templates/workspace-scripts/materialize-zerops-runtime.mjs +332 -82
- package/templates/workspace-scripts/proof-workerd-ssr.mjs +398 -43
- package/templates/workspace-scripts/ultramodern-compiler-prepare.mjs +89 -0
- package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +5 -2
- package/templates/workspace-scripts/ultramodern-typecheck.mjs +9 -65
package/README.md
CHANGED
|
@@ -96,7 +96,7 @@ workspaces declare an engine baseline of Node `>=26` with pnpm `12+`.
|
|
|
96
96
|
`packageManager`, `.mise.toml`, generated validation, and CI should all agree
|
|
97
97
|
on those values; do not reintroduce Corepack or older pnpm aliases.
|
|
98
98
|
|
|
99
|
-
The current React dependency cohort also pins `@effect/tsgo@0.
|
|
99
|
+
The current React dependency cohort also pins `@effect/tsgo@0.59.0`,
|
|
100
100
|
`@tanstack/react-router@1.170.41`, `@tanstack/router-core@1.171.34`,
|
|
101
101
|
`@tanstack/history@1.162.4`, and the Module Federation integration `2.9.2`
|
|
102
102
|
cohort, `@module-federation/node@2.7.52`. Move these only through the
|
|
@@ -120,15 +120,32 @@ pnpm --filter @modern-js/ultramodern-create build
|
|
|
120
120
|
```
|
|
121
121
|
|
|
122
122
|
That command lets Rslib emit runtime modules and declarations together through
|
|
123
|
-
the
|
|
123
|
+
the repository's compiler integration. The same declaration configuration
|
|
124
124
|
stays active during `rslib build --watch`. Run
|
|
125
125
|
`pnpm --filter @modern-js/ultramodern-create test` when changing generator behavior; it
|
|
126
126
|
includes a boundary test that scans generator sources, templates, and generated
|
|
127
127
|
workspace output for compiler API imports.
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
Generated workspaces and apps pin `tsrs@0.20.0-ts7.1.0-beta` and
|
|
130
|
+
`@effect/tsgo@0.59.0`. Root postinstall runs
|
|
131
|
+
`ultramodern-create ultramodern compiler-prepare` before skills install.
|
|
132
|
+
The installed tsrs platform metadata selects the official
|
|
133
|
+
`effect-tsgo tsrs --version` readiness check on supported hosts.
|
|
134
|
+
Hosts without a declared native tsrs package use `effect-tsgo tsc --version`
|
|
135
|
+
and print an explicit Effect-Go notice. Missing supported artifacts remain
|
|
136
|
+
fatal. These official proxy commands run the provider's Effect-enabled
|
|
137
|
+
binaries without changing the package store.
|
|
138
|
+
The shared compiler resolver selects the provider's tsrs for generated React and
|
|
139
|
+
Solid checks and Modern/Rspack builds, or Effect-Go on unsupported tsrs hosts.
|
|
140
|
+
The installed typecheck command sets
|
|
141
|
+
`TSRS_CHECKER_ASSIGNMENT` to the caller's explicit value or `go` by default,
|
|
142
|
+
and does not add `--checkers` or `--builders` in build mode. Octane apps retain
|
|
143
|
+
`octane-tsc` for their native TS7 checker.
|
|
144
|
+
All renderer profiles retain exact stable `typescript@7.0.2` for metadata and
|
|
145
|
+
tool dependencies. This is separate from tsrs's embedded TypeScript
|
|
146
|
+
`7.1.0-beta`. Only these exact compiler releases and their declared native
|
|
147
|
+
platform packages receive a release-age exception; the strict 24-hour gate
|
|
148
|
+
still applies to other packages apart from the authenticated release cohort.
|
|
132
149
|
Generated app/package source must not
|
|
133
150
|
depend on compiler API internals. If a future AST utility is needed, keep it
|
|
134
151
|
behind a dedicated TypeScript adapter and test it against stable `typescript`.
|
|
@@ -365,6 +382,30 @@ Cloudflare Worker output. The shell consumes vertical UI through Module
|
|
|
365
382
|
Federation manifests and vertical APIs through generated Effect clients
|
|
366
383
|
exported by the vertical packages.
|
|
367
384
|
|
|
385
|
+
Shell routes load federated modules through `createLazyComponent` or the
|
|
386
|
+
generated loaders. A route that drives the runtime itself calls
|
|
387
|
+
`loadRemote()` or `loadShare()` on the instance from `getInstance()`
|
|
388
|
+
(`@module-federation/modern-js-v3/runtime`), and only inside the true branch
|
|
389
|
+
of `import.meta.env.MODERN_TARGET === 'browser'`:
|
|
390
|
+
|
|
391
|
+
```tsx
|
|
392
|
+
import { getInstance } from '@module-federation/modern-js-v3/runtime';
|
|
393
|
+
|
|
394
|
+
export const loadWidget = () => {
|
|
395
|
+
if (import.meta.env.MODERN_TARGET === 'browser') {
|
|
396
|
+
const host = getInstance();
|
|
397
|
+
if (host !== null) return host.loadRemote('inventory/Widget');
|
|
398
|
+
}
|
|
399
|
+
return undefined;
|
|
400
|
+
};
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
The React composition defines `import.meta.env.MODERN_TARGET` per bundle as
|
|
404
|
+
`'browser'` or `'node'`, the same value as `process.env.MODERN_TARGET`, so the
|
|
405
|
+
server bundle drops the branch. Shell routes must not read `process.env`:
|
|
406
|
+
`pnpm typecheck` rejects it through Effect's `processEnv` rule and
|
|
407
|
+
`pnpm contract:check` rejects it too.
|
|
408
|
+
|
|
368
409
|
Route metadata is route-owned and colocated in
|
|
369
410
|
`src/routes/**/route.meta.ts`; each file exports `routeMeta`.
|
|
370
411
|
`ultramodern-create ultramodern routes-generate` (run before every app `dev`
|
|
@@ -165,7 +165,7 @@ function normalizeWorkspaceInputs(workspaceRoot, inputs) {
|
|
|
165
165
|
rendererProfile: app.rendererProfile,
|
|
166
166
|
routerBindings: app.routerBindings,
|
|
167
167
|
rendererCapabilities: app.rendererCapabilities,
|
|
168
|
-
...'api-only' === app.surfaceProfile || void 0 !== app.renderer && !(0, renderer_profile_cjs_namespaceObject.
|
|
168
|
+
...'api-only' === app.surfaceProfile || void 0 !== app.renderer && ('none' === app.renderer || !(0, renderer_profile_cjs_namespaceObject.getRendererGenerationProfile)(app.renderer).capabilities.federation) ? {} : {
|
|
169
169
|
moduleFederation: {
|
|
170
170
|
role: 'shell' === app.kind ? 'host' : 'remote',
|
|
171
171
|
name: app.mfName,
|
|
@@ -45,7 +45,6 @@ const external_node_fs_namespaceObject = require("node:fs");
|
|
|
45
45
|
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
46
46
|
const external_node_path_namespaceObject = require("node:path");
|
|
47
47
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
48
|
-
const external_api_cjs_namespaceObject = require("../api.cjs");
|
|
49
48
|
const external_app_files_cjs_namespaceObject = require("../app-files.cjs");
|
|
50
49
|
const external_demo_components_cjs_namespaceObject = require("../demo-components.cjs");
|
|
51
50
|
const external_descriptors_cjs_namespaceObject = require("../descriptors.cjs");
|
|
@@ -85,10 +84,7 @@ function shellAppArtifacts(scope, packageSource, enableTailwind, remotes, bridge
|
|
|
85
84
|
...Object.fromEntries((0, external_native_federation_cjs_namespaceObject.createNativeFederationArtifacts)(scope, shellHost, remotes).map((artifact)=>[
|
|
86
85
|
`${shellHost.directory}/${artifact.path}`,
|
|
87
86
|
artifact.content
|
|
88
|
-
]))
|
|
89
|
-
...remotes.some(external_descriptors_cjs_namespaceObject.appHasApi) ? {
|
|
90
|
-
[`${shellHost.directory}/src/api/vertical-clients.ts`]: (0, external_api_cjs_namespaceObject.createShellApiClient)(scope, remotes)
|
|
91
|
-
} : {}
|
|
87
|
+
]))
|
|
92
88
|
};
|
|
93
89
|
return {
|
|
94
90
|
shellHost,
|
|
@@ -128,8 +124,7 @@ function shellAppArtifacts(scope, packageSource, enableTailwind, remotes, bridge
|
|
|
128
124
|
[`${shellHost.directory}/src/routes/[lang]/page.tsx`]: (0, external_demo_components_cjs_namespaceObject.createShellPage)(shellHost, uiRemotes),
|
|
129
125
|
[`${shellHost.directory}/src/routes/vertical-components.tsx`]: (0, external_demo_components_cjs_namespaceObject.createShellRemoteComponents)(shellHost, uiRemotes),
|
|
130
126
|
[`${shellHost.directory}/src/routes/vertical-components.worker.tsx`]: (0, external_demo_components_cjs_namespaceObject.createShellWorkerRemoteComponents)(shellHost, uiRemotes),
|
|
131
|
-
[`${shellHost.directory}/src/routes/shell-frame.tsx`]: (0, external_app_files_cjs_namespaceObject.createShellFrameComponent)(shellHost)
|
|
132
|
-
[`${shellHost.directory}/src/api/vertical-clients.ts`]: (0, external_api_cjs_namespaceObject.createShellApiClient)(scope, remotes)
|
|
127
|
+
[`${shellHost.directory}/src/routes/shell-frame.tsx`]: (0, external_app_files_cjs_namespaceObject.createShellFrameComponent)(shellHost)
|
|
133
128
|
};
|
|
134
129
|
return {
|
|
135
130
|
shellHost,
|
|
@@ -28,8 +28,7 @@ var __webpack_require__ = {};
|
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
30
|
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
-
createApiClient: ()=>createApiClient
|
|
32
|
-
createShellApiClient: ()=>createShellApiClient
|
|
31
|
+
createApiClient: ()=>createApiClient
|
|
33
32
|
});
|
|
34
33
|
const external_descriptors_cjs_namespaceObject = require("../descriptors.cjs");
|
|
35
34
|
const external_naming_cjs_namespaceObject = require("../naming.cjs");
|
|
@@ -181,43 +180,9 @@ export const ${createName} = (
|
|
|
181
180
|
);${checkoutCartClientExports}
|
|
182
181
|
`;
|
|
183
182
|
}
|
|
184
|
-
function createShellApiClient(scope, remotes = []) {
|
|
185
|
-
const exports1 = (0, external_descriptors_cjs_namespaceObject.verticalApiApps)(remotes).map((remote)=>{
|
|
186
|
-
const stem = (0, external_descriptors_cjs_namespaceObject.resolveApiStem)(remote);
|
|
187
|
-
const pascalStem = (0, external_naming_cjs_namespaceObject.toPascalCase)(stem);
|
|
188
|
-
const rpc = 'rpc' === (0, external_descriptors_cjs_namespaceObject.resolveApiProtocol)(remote);
|
|
189
|
-
const pascalSingular = (0, external_naming_cjs_namespaceObject.toPascalCase)((0, external_names_cjs_namespaceObject.verticalApiErrorStem)(remote));
|
|
190
|
-
const checkoutCartExports = !rpc && (0, external_checkout_cart_cjs_namespaceObject.serviceHasCheckoutCartState)(remote) ? ` addCheckoutCartItem,
|
|
191
|
-
clearCheckoutCart,
|
|
192
|
-
getCheckoutCart,
|
|
193
|
-
removeCheckoutCartItem,
|
|
194
|
-
type CheckoutAddCartItemInput,
|
|
195
|
-
type CheckoutCart,
|
|
196
|
-
type CheckoutCartLine,
|
|
197
|
-
` : '';
|
|
198
|
-
if (rpc) return `export {
|
|
199
|
-
get${pascalStem}Rpc,
|
|
200
|
-
list${pascalStem}Rpc,
|
|
201
|
-
make${pascalStem}RpcClient,
|
|
202
|
-
type ${pascalStem}RpcClientOptions,
|
|
203
|
-
} from '${(0, external_naming_cjs_namespaceObject.packageName)(scope, remote.packageSuffix)}/api/rpc-client';`;
|
|
204
|
-
return `export {
|
|
205
|
-
${checkoutCartExports} create${pascalSingular},
|
|
206
|
-
create${pascalStem}Client,
|
|
207
|
-
get${pascalSingular},
|
|
208
|
-
get${pascalStem}Readiness,
|
|
209
|
-
list${pascalStem},
|
|
210
|
-
type ${pascalStem}ClientOptions,
|
|
211
|
-
} from '${(0, external_naming_cjs_namespaceObject.packageName)(scope, remote.packageSuffix)}/api/client';`;
|
|
212
|
-
}).join('\n\n');
|
|
213
|
-
return exports1 ? `${exports1}\n` : `export const ultramodernVerticalClients = [] as const;
|
|
214
|
-
`;
|
|
215
|
-
}
|
|
216
183
|
exports.createApiClient = __webpack_exports__.createApiClient;
|
|
217
|
-
exports.createShellApiClient = __webpack_exports__.createShellApiClient;
|
|
218
184
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
219
|
-
"createApiClient"
|
|
220
|
-
"createShellApiClient"
|
|
185
|
+
"createApiClient"
|
|
221
186
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
222
187
|
Object.defineProperty(exports, '__esModule', {
|
|
223
188
|
value: true
|
|
@@ -36,7 +36,6 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
36
36
|
createRpcClientFile: ()=>rpc_cjs_namespaceObject.createRpcClientFile,
|
|
37
37
|
createRpcContractFile: ()=>rpc_cjs_namespaceObject.createRpcContractFile,
|
|
38
38
|
createSharedApi: ()=>shared_cjs_namespaceObject.createSharedApi,
|
|
39
|
-
createShellApiClient: ()=>client_cjs_namespaceObject.createShellApiClient,
|
|
40
39
|
rpcPath: ()=>rpc_cjs_namespaceObject.rpcPath,
|
|
41
40
|
verticalApiCreatePayloadSchemaExport: ()=>names_cjs_namespaceObject.verticalApiCreatePayloadSchemaExport,
|
|
42
41
|
verticalApiErrorStem: ()=>names_cjs_namespaceObject.verticalApiErrorStem,
|
|
@@ -65,7 +64,6 @@ exports.createRpcApiServiceEntry = __webpack_exports__.createRpcApiServiceEntry;
|
|
|
65
64
|
exports.createRpcClientFile = __webpack_exports__.createRpcClientFile;
|
|
66
65
|
exports.createRpcContractFile = __webpack_exports__.createRpcContractFile;
|
|
67
66
|
exports.createSharedApi = __webpack_exports__.createSharedApi;
|
|
68
|
-
exports.createShellApiClient = __webpack_exports__.createShellApiClient;
|
|
69
67
|
exports.rpcPath = __webpack_exports__.rpcPath;
|
|
70
68
|
exports.verticalApiCreatePayloadSchemaExport = __webpack_exports__.verticalApiCreatePayloadSchemaExport;
|
|
71
69
|
exports.verticalApiErrorStem = __webpack_exports__.verticalApiErrorStem;
|
|
@@ -88,7 +86,6 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
88
86
|
"createRpcClientFile",
|
|
89
87
|
"createRpcContractFile",
|
|
90
88
|
"createSharedApi",
|
|
91
|
-
"createShellApiClient",
|
|
92
89
|
"rpcPath",
|
|
93
90
|
"verticalApiCreatePayloadSchemaExport",
|
|
94
91
|
"verticalApiErrorStem",
|
|
@@ -44,12 +44,12 @@ function createAppModernConfig(app, enableTailwind = true) {
|
|
|
44
44
|
const renderer = (0, external_renderer_profile_cjs_namespaceObject.resolveWorkspaceRenderer)(app);
|
|
45
45
|
if ((0, external_renderer_generations_cjs_namespaceObject.hasNativeAppGeneration)(renderer)) {
|
|
46
46
|
const generation = (0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app);
|
|
47
|
-
const
|
|
48
|
-
return `import { defineConfig } from '@modern-js/ultramodern-app-tools';
|
|
49
|
-
${
|
|
47
|
+
const authoredAssetPrefix = !generation.capabilities.workers && Object.keys(app.exposes ?? {}).length > 0;
|
|
48
|
+
return `import { defineConfig${generation.capabilities.workers ? ', presetUltramodernWorkspace' : ''} } from '@modern-js/ultramodern-app-tools';
|
|
49
|
+
${authoredAssetPrefix ? "import { createRemoteManifestUrl } from '@modern-js/app-tools-extensions/config';\n" : ''}
|
|
50
50
|
${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? "import { bffPlugin } from '@modern-js/plugin-bff-build-extensions';\n" : ''}
|
|
51
51
|
${enableTailwind ? "import { pluginTailwindcss } from '@rsbuild/plugin-tailwindcss';\n" : ''}
|
|
52
|
-
${
|
|
52
|
+
${authoredAssetPrefix ? `// Set ${(0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app)} to this remote's public origin when deploying.
|
|
53
53
|
const remoteAddress = createRemoteManifestUrl({
|
|
54
54
|
manifestEnv: ${JSON.stringify((0, external_descriptors_cjs_namespaceObject.createRemoteManifestEnv)(app))},
|
|
55
55
|
publicUrlEnv: ${JSON.stringify((0, external_descriptors_cjs_namespaceObject.createCloudflarePublicUrlEnv)(app))},
|
|
@@ -59,10 +59,10 @@ const remoteAddress = createRemoteManifestUrl({
|
|
|
59
59
|
const assetPrefix = new URL('.', remoteAddress.replace(/^[^@]+@(?=https?:\\/\\/)/u, '')).href;
|
|
60
60
|
|
|
61
61
|
` : ''}
|
|
62
|
-
export default defineConfig({
|
|
62
|
+
export default defineConfig(${generation.capabilities.workers ? 'presetUltramodernWorkspace(' : ''}{
|
|
63
63
|
${enableTailwind ? ' builderPlugins: [pluginTailwindcss()],\n' : ''} renderer: ${JSON.stringify(renderer)},
|
|
64
64
|
${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? ' plugins: [bffPlugin()],\n' : ''}
|
|
65
|
-
${
|
|
65
|
+
${authoredAssetPrefix ? ' output: { assetPrefix },\n' : ''}
|
|
66
66
|
server: { port: ${app.port}, ssr: ${generation.capabilities.ssr}${(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? `,
|
|
67
67
|
bff: {
|
|
68
68
|
effect: {
|
|
@@ -73,7 +73,7 @@ ${'rest' === (0, external_descriptors_cjs_namespaceObject.resolveApiProtocol)(ap
|
|
|
73
73
|
runtimeFramework: 'effect',
|
|
74
74
|
}` : ''} },
|
|
75
75
|
source: { mainEntryName: 'main' },
|
|
76
|
-
});
|
|
76
|
+
}${generation.capabilities.workers ? `, { appId: ${JSON.stringify(app.id)}, from: import.meta.url })` : ''});
|
|
77
77
|
`;
|
|
78
78
|
}
|
|
79
79
|
const emitsUi = (0, external_descriptors_cjs_namespaceObject.appEmitsBrowserUi)(app);
|
|
@@ -104,7 +104,8 @@ ${'rest' === (0, external_descriptors_cjs_namespaceObject.resolveApiProtocol)(ap
|
|
|
104
104
|
localisedUrls: ' localisedUrls: ultramodernLocalisedUrls as Record<string, Record<string, string>>,\n'
|
|
105
105
|
}) : '',
|
|
106
106
|
bffPlugin: (0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? ' bffPlugin(),\n' : '',
|
|
107
|
-
federationPlugin: emitsUi ? ' moduleFederationPlugin(),\n' : ''
|
|
107
|
+
federationPlugin: emitsUi ? ' moduleFederationPlugin(),\n' : '',
|
|
108
|
+
renderer: emitsUi ? ` renderer: '${renderer}',\n` : ''
|
|
108
109
|
});
|
|
109
110
|
}
|
|
110
111
|
function createModuleFederationBridgeConfig(enableBridgeRouter) {
|
|
@@ -30,7 +30,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
30
30
|
__webpack_require__.d(__webpack_exports__, {
|
|
31
31
|
writeNativeApp: ()=>writeNativeApp
|
|
32
32
|
});
|
|
33
|
-
const external_api_cjs_namespaceObject = require("./api.cjs");
|
|
34
33
|
const write_app_api_cjs_namespaceObject = require("./api/write-app-api.cjs");
|
|
35
34
|
const external_app_files_cjs_namespaceObject = require("./app-files.cjs");
|
|
36
35
|
const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
|
|
@@ -93,7 +92,6 @@ function writeNativeApp(targetDir, scope, app, packageSource, enableTailwind, re
|
|
|
93
92
|
resolvedApp: app,
|
|
94
93
|
emitsUi: true
|
|
95
94
|
});
|
|
96
|
-
if ('shell' === app.kind && remotes.some(external_descriptors_cjs_namespaceObject.appHasApi)) write('src/api/vertical-clients.ts', (0, external_api_cjs_namespaceObject.createShellApiClient)(scope, remotes));
|
|
97
95
|
}
|
|
98
96
|
exports.writeNativeApp = __webpack_exports__.writeNativeApp;
|
|
99
97
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
@@ -71,7 +71,7 @@ function createNativeFederationArtifacts(scope, app, remotes = []) {
|
|
|
71
71
|
const relativePath = source.slice(2);
|
|
72
72
|
if (exposedSources.has(relativePath)) continue;
|
|
73
73
|
exposedSources.add(relativePath);
|
|
74
|
-
const counterPath = external_node_path_default().posix.relative(external_node_path_default().posix.dirname(relativePath), 'src/components/Counter').replace(/^(?!\.)/u, './');
|
|
74
|
+
const counterPath = external_node_path_default().posix.relative(external_node_path_default().posix.dirname(relativePath), 'octane' === generation.renderer ? 'src/components/counter' : 'src/components/Counter').replace(/^(?!\.)/u, './');
|
|
75
75
|
artifacts.push({
|
|
76
76
|
path: relativePath,
|
|
77
77
|
content: `import { Link } from ${JSON.stringify(adapter.runtime.router)};
|
|
@@ -102,7 +102,7 @@ function appDevDependencies(packageSource, enableTailwind, app) {
|
|
|
102
102
|
const { '@rsbuild/plugin-tailwindcss': tailwindPluginVersion, tailwindcss: tailwindVersion, ...always } = external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.appDevDependencies;
|
|
103
103
|
const renderer = (0, external_renderer_profile_cjs_namespaceObject.resolveWorkspaceRenderer)(app);
|
|
104
104
|
const generationProfile = (0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app);
|
|
105
|
-
const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && 'wrangler' !== name));
|
|
105
|
+
const selectedAlways = 'react' === renderer ? always : Object.fromEntries(Object.entries(always).filter(([name])=>'@types/react' !== name && '@types/react-dom' !== name && 'zephyr-rspack-plugin' !== name && ('wrangler' !== name || generationProfile?.capabilities.workers === true)));
|
|
106
106
|
return {
|
|
107
107
|
...(0, external_descriptors_cjs_namespaceObject.appHasApi)(app) || 'shell' === app.kind && 'react' === renderer ? {
|
|
108
108
|
'@modern-js/plugin-bff-build-extensions': frameworkRequest(packageSource)
|
|
@@ -128,8 +128,10 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
|
|
|
128
128
|
...additionalShells,
|
|
129
129
|
...remotes
|
|
130
130
|
];
|
|
131
|
+
const workerApps = apps.filter((app)=>(0, external_renderer_profile_cjs_namespaceObject.resolveAppGenerationProfile)(app)?.capabilities.workers);
|
|
132
|
+
const workerFilters = workerApps.map((app)=>`--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}`).join(' ');
|
|
131
133
|
if (bridge) throw new Error(`Renderer ${renderer} does not support React bridge configuration.`);
|
|
132
|
-
const rootDevDependencies = Object.fromEntries(Object.entries(external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>'wrangler' !== name && 'zephyr-agent' !== name && 'miniflare' !== name));
|
|
134
|
+
const rootDevDependencies = Object.fromEntries(Object.entries(external_versions_cjs_namespaceObject.ULTRAMODERN_PACKAGE_PINS.rootDevDependencies).filter(([name])=>('wrangler' !== name || workerApps.length > 0) && 'zephyr-agent' !== name && 'miniflare' !== name));
|
|
133
135
|
return {
|
|
134
136
|
private: true,
|
|
135
137
|
name: scope,
|
|
@@ -144,6 +146,11 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge, addit
|
|
|
144
146
|
dev: `pnpm --parallel ${apps.map((app)=>`--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}`).join(' ')} dev`,
|
|
145
147
|
'dev:shell': `pnpm --filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, primaryShell.packageSuffix)} dev`,
|
|
146
148
|
build: 'pnpm -r --filter "./apps/*" --filter "./verticals/*" run build',
|
|
149
|
+
...workerApps.length > 0 ? {
|
|
150
|
+
'cloudflare:build': `pnpm -r ${workerFilters} run cloudflare:build`,
|
|
151
|
+
'cloudflare:deploy': `pnpm -r ${workerFilters} run cloudflare:deploy`,
|
|
152
|
+
'cloudflare:preview': `pnpm --parallel ${workerFilters} run cloudflare:preview`
|
|
153
|
+
} : {},
|
|
147
154
|
typecheck: 'pnpm -r --filter "./packages/*" run typecheck && pnpm -r --filter "./apps/*" --filter "./verticals/*" run typecheck',
|
|
148
155
|
'contract:check': 'ultramodern-create ultramodern validate',
|
|
149
156
|
check: 'pnpm format:check && pnpm lint && pnpm typecheck && pnpm contract:check',
|
|
@@ -312,9 +319,7 @@ function createAppPackage(scope, app, packageSource, enableTailwind, remotes = [
|
|
|
312
319
|
'./api': './shared/api.ts',
|
|
313
320
|
'./api/client': `./${clientDirectory}/${app.api.stem}-client.ts`
|
|
314
321
|
});
|
|
315
|
-
}
|
|
316
|
-
'./api/clients': './src/api/vertical-clients.ts'
|
|
317
|
-
});
|
|
322
|
+
}
|
|
318
323
|
if (Object.keys(packageExports).length > 0) packageJson.exports = packageExports;
|
|
319
324
|
return packageJson;
|
|
320
325
|
}
|
|
@@ -28,10 +28,28 @@ var __webpack_require__ = {};
|
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
30
|
const __rspack_default_export = [
|
|
31
|
+
{
|
|
32
|
+
packageName: '@tanstack/router-core',
|
|
33
|
+
version: '1.171.34',
|
|
34
|
+
path: 'patches/@tanstack__router-core@1.171.34.patch',
|
|
35
|
+
sha256: '0e526bc0a1fd038c459fbf45b2b62da81f7f2516176b585f41fed7098ac4abbb',
|
|
36
|
+
repository: true,
|
|
37
|
+
workspace: null,
|
|
38
|
+
reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, including public types and emitted CJS/ESM source maps. Applies only to the accepted Octane router-core 1.171.34 closure during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
packageName: '@tanstack/router-core',
|
|
42
|
+
version: '1.171.37',
|
|
43
|
+
path: 'patches/@tanstack__router-core@1.171.37.patch',
|
|
44
|
+
sha256: '6ffa70914ed338f3cb56d3cd1f526e35286e09f287ecf48ee6dbc1aa18305458',
|
|
45
|
+
repository: true,
|
|
46
|
+
workspace: null,
|
|
47
|
+
reason: 'Let native localized masks inherit the canonical resolved search without rerunning middleware or validation, preserving current location caching and SSR rewrite behavior, public types and emitted CJS/ESM source maps. Applies only to Modern router-core 1.171.37 during local qualification. Generated workspaces remain patch-free; retire when their mature accepted router sidecar or upstream release supplies the same runtime and declaration contract.'
|
|
48
|
+
},
|
|
31
49
|
{
|
|
32
50
|
packageName: 'ultracite',
|
|
33
|
-
version: '
|
|
34
|
-
path: 'patches/ultracite@
|
|
51
|
+
version: '8.0.1',
|
|
52
|
+
path: 'patches/ultracite@8.0.1.patch',
|
|
35
53
|
sha256: 'a18b2c7be68a6823a793f0def8ce13d7655c67c56c2200978a2be600cb29ba74',
|
|
36
54
|
repository: false,
|
|
37
55
|
workspace: null,
|
|
@@ -264,9 +264,14 @@ const ULTRAMODERN_WORKSPACE_POLICY = {
|
|
|
264
264
|
pnpm: {
|
|
265
265
|
overrides: {
|
|
266
266
|
'braces@>=3.0.0 <3.0.4': `npm:@bleedingdev/braces@${external_versions_cjs_namespaceObject.BRACES_FORK_VERSION}`,
|
|
267
|
-
'sharp@>=0.35.0 <0.35.5': external_versions_cjs_namespaceObject.SHARP_VERSION
|
|
267
|
+
'sharp@>=0.35.0 <0.35.5': external_versions_cjs_namespaceObject.SHARP_VERSION,
|
|
268
|
+
'undici@>=7.0.0 <7.30.1': '7.30.1',
|
|
269
|
+
'undici@>=8.0.0 <8.12.2': '8.12.2',
|
|
270
|
+
'body-parser@>=2.0.0 <2.4.0': '2.4.0',
|
|
271
|
+
'dompurify@>=3.0.0 <3.4.17': '3.4.17'
|
|
268
272
|
},
|
|
269
273
|
minimumReleaseAge: 1440,
|
|
274
|
+
minimumReleaseAgeExclude: external_versions_cjs_namespaceObject.COMPILER_RELEASE_AGE_EXCEPTIONS,
|
|
270
275
|
minimumReleaseAgeStrict: true,
|
|
271
276
|
minimumReleaseAgeIgnoreMissingTime: false,
|
|
272
277
|
trustPolicy: 'no-downgrade',
|
|
@@ -41,6 +41,11 @@ const generatedToolingCommands = [
|
|
|
41
41
|
templatePath: "templates/workspace-scripts/ultramodern-typecheck.mjs",
|
|
42
42
|
cwd: 'invocation'
|
|
43
43
|
}),
|
|
44
|
+
defineToolingCommand({
|
|
45
|
+
id: 'compilerPrepare',
|
|
46
|
+
command: 'compiler-prepare',
|
|
47
|
+
templatePath: "templates/workspace-scripts/ultramodern-compiler-prepare.mjs"
|
|
48
|
+
}),
|
|
44
49
|
defineToolingCommand({
|
|
45
50
|
id: 'mfTypes',
|
|
46
51
|
command: 'mf-types',
|
|
@@ -47,6 +47,7 @@ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_no
|
|
|
47
47
|
const external_renderer_generations_cjs_namespaceObject = require("../renderer-generations.cjs");
|
|
48
48
|
const external_renderer_profile_cjs_namespaceObject = require("../renderer-profile.cjs");
|
|
49
49
|
const external_assertions_cjs_namespaceObject = require("./assertions.cjs");
|
|
50
|
+
const external_native_shell_runtime_cjs_namespaceObject = require("./native-shell-runtime.cjs");
|
|
50
51
|
const external_renderer_cjs_namespaceObject = require("./renderer.cjs");
|
|
51
52
|
function assertCompilerArchitecture(root, workspaceValidationContract) {
|
|
52
53
|
const fullStackVerticals = workspaceValidationContract.apps.filter((app)=>'shell' !== app.kind);
|
|
@@ -105,12 +106,16 @@ function assertCompilerArchitecture(root, workspaceValidationContract) {
|
|
|
105
106
|
]
|
|
106
107
|
});
|
|
107
108
|
};
|
|
108
|
-
const
|
|
109
|
+
const compilerInput = (absolutePath)=>{
|
|
109
110
|
const project = compilerSnapshot?.getDefaultProjectForFile(absolutePath);
|
|
110
111
|
const sourceFile = project?.program.getSourceFile(absolutePath);
|
|
111
|
-
(0, external_assertions_cjs_namespaceObject.assert)(void 0 !== sourceFile, `Native TypeScript compiler could not parse ${external_node_path_default().relative(root, absolutePath)}`);
|
|
112
|
-
return
|
|
112
|
+
(0, external_assertions_cjs_namespaceObject.assert)(void 0 !== project && void 0 !== sourceFile, `Native TypeScript compiler could not parse ${external_node_path_default().relative(root, absolutePath)}`);
|
|
113
|
+
return {
|
|
114
|
+
checker: project.checker,
|
|
115
|
+
sourceFile
|
|
116
|
+
};
|
|
113
117
|
};
|
|
118
|
+
const parseCompilerInput = (absolutePath)=>compilerInput(absolutePath).sourceFile;
|
|
114
119
|
const nodeName = (node)=>{
|
|
115
120
|
if (!node) return;
|
|
116
121
|
if (typescript.isIdentifier(node) || typescript.isPrivateIdentifier(node) || typescript.isStringLiteralLikeNode(node) || typescript.isNumericLiteral(node)) return node.text;
|
|
@@ -198,6 +203,12 @@ function assertCompilerArchitecture(root, workspaceValidationContract) {
|
|
|
198
203
|
const accessPath = propertyAccessPath(node.expression);
|
|
199
204
|
return void 0 !== accessPath && names.has(accessPath.at(-1));
|
|
200
205
|
};
|
|
206
|
+
const calleeName = (node)=>{
|
|
207
|
+
let callee = node.expression;
|
|
208
|
+
while(typescript.isParenthesizedExpression(callee) || typescript.isNonNullExpression(callee) || typescript.isAsExpression(callee))callee = callee.expression;
|
|
209
|
+
if (typescript.isIdentifier(callee)) return callee.text;
|
|
210
|
+
if (typescript.isPropertyAccessExpression(callee)) return callee.name.text;
|
|
211
|
+
};
|
|
201
212
|
const objectLiteralProperty = (objectLiteral, name)=>objectLiteral.properties.find((property)=>typescript.isPropertyAssignment(property) && nodeName(property.name) === name);
|
|
202
213
|
const moduleFederationConfigArgument = (sourceFile)=>{
|
|
203
214
|
let argument;
|
|
@@ -345,11 +356,12 @@ function assertCompilerArchitecture(root, workspaceValidationContract) {
|
|
|
345
356
|
...configFiles.map((relativePath)=>external_node_path_default().join(root, relativePath)).filter((absolutePath)=>external_node_fs_default().existsSync(absolutePath))
|
|
346
357
|
]);
|
|
347
358
|
for (const absolutePath of checkedFiles){
|
|
348
|
-
const sourceFile =
|
|
359
|
+
const { checker, sourceFile } = compilerInput(absolutePath);
|
|
349
360
|
const isShellRoute = shellRouteDirectories.some((relativeDirectory)=>{
|
|
350
361
|
const absoluteDirectory = external_node_path_default().join(root, relativeDirectory);
|
|
351
362
|
return absolutePath.startsWith(absoluteDirectory + external_node_path_default().sep);
|
|
352
363
|
});
|
|
364
|
+
const shellRuntime = isShellRoute ? (0, external_native_shell_runtime_cjs_namespaceObject.createNativeShellRuntimeEvidence)(typescript, typescriptApi, checker, sourceFile) : void 0;
|
|
353
365
|
const moduleFederationAppPath = moduleFederationConfigAppPaths.get(absolutePath);
|
|
354
366
|
const nativeFederation = void 0 === moduleFederationAppPath ? void 0 : nativeModuleFederationApps.get(moduleFederationAppPath);
|
|
355
367
|
const tailwindFactories = new Set();
|
|
@@ -372,6 +384,12 @@ function assertCompilerArchitecture(root, workspaceValidationContract) {
|
|
|
372
384
|
].includes(imported)) presetFactories.add(binding.name.text);
|
|
373
385
|
}
|
|
374
386
|
}
|
|
387
|
+
const manualLoadingCallees = new Set([
|
|
388
|
+
'hydrateRoot',
|
|
389
|
+
'loadRemote',
|
|
390
|
+
'loadShare',
|
|
391
|
+
...nativeRemoteLoaders
|
|
392
|
+
]);
|
|
375
393
|
const modernConfigApp = workspaceValidationContract.apps.find((app)=>absolutePath === external_node_path_default().join(root, app.path, 'modern.config.ts'));
|
|
376
394
|
let insideDefaultExport = false;
|
|
377
395
|
const visit = (node)=>{
|
|
@@ -399,7 +417,8 @@ function assertCompilerArchitecture(root, workspaceValidationContract) {
|
|
|
399
417
|
if ((0, external_assertions_cjs_namespaceObject.sameJson)(accessPath, [
|
|
400
418
|
'process',
|
|
401
419
|
'env'
|
|
402
|
-
])) compilerFailure(sourceFile, node, 'framework config API direct-process-env-access', 'Generated config must use the framework config environment API instead of process.env.', 'use getBuildConfigEnvironment');
|
|
420
|
+
])) compilerFailure(sourceFile, node, 'framework config API direct-process-env-access', isShellRoute ? 'Shell routes must not read process.env.' : 'Generated config must use the framework config environment API instead of process.env.', isShellRoute ? 'branch on import.meta.env.MODERN_TARGET for the build target' : 'use getBuildConfigEnvironment');
|
|
421
|
+
if (!isShellRoute && (0, external_native_shell_runtime_cjs_namespaceObject.isBuildTargetAccess)(typescript, node)) compilerFailure(sourceFile, node, 'framework config API build-target-outside-bundle', 'Config runs in Node, where the framework defines no import.meta.env.MODERN_TARGET.', 'use getBuildConfigEnvironment');
|
|
403
422
|
if (typescript.isIdentifier(node) && 'ULTRAMODERN_ZEPHYR' === node.text) compilerFailure(sourceFile, node, 'zephyr gating ultramodern-zephyr-environment-gate', 'Generated Zephyr integration must not be gated through ULTRAMODERN_ZEPHYR.', 'use Zephyr native deploy-token behavior');
|
|
404
423
|
if (typescript.isPropertyAssignment(node) || typescript.isShorthandPropertyAssignment(node)) {
|
|
405
424
|
const property = nodeName(node.name);
|
|
@@ -407,12 +426,7 @@ function assertCompilerArchitecture(root, workspaceValidationContract) {
|
|
|
407
426
|
}
|
|
408
427
|
if (isShellRoute) {
|
|
409
428
|
if (typescript.isJsxOpeningElement(node) && 'a' === jsxTagName(node.tagName) && void 0 !== jsxAttribute(node.attributes, 'onClick')) compilerFailure(sourceFile, node, 'shell routing synthetic-anchor-click-interception', 'Shell routing must not intercept anchor clicks synthetically.', 'use the router Link primitive');
|
|
410
|
-
if (
|
|
411
|
-
'hydrateRoot',
|
|
412
|
-
'loadRemote',
|
|
413
|
-
'loadShare',
|
|
414
|
-
...nativeRemoteLoaders
|
|
415
|
-
])) && !nativeLoaderCalls.has(node)) compilerFailure(sourceFile, node, 'module federation native loading', 'Shell routing must use framework Module Federation loading primitives.', 'remove manual hydration or remote-loading wrappers');
|
|
429
|
+
if (typescript.isCallExpression(node) && manualLoadingCallees.has(calleeName(node) ?? '') && !nativeLoaderCalls.has(node) && !shellRuntime?.isBrowserFederationMemberLoad(node)) compilerFailure(sourceFile, node, 'module federation native loading', 'Shell routing must use framework Module Federation loading primitives.', 'remove manual hydration or remote-loading wrappers');
|
|
416
430
|
if (typescript.isBinaryExpression(node) && node.operatorToken.kind === typescript.SyntaxKind.EqualsToken && propertyAccessPath(node.left)?.slice(0, 2).join('.') === 'window.location' || typescript.isCallExpression(node) && propertyAccessPath(node.expression)?.slice(0, 2).join('.') === 'window.location') compilerFailure(sourceFile, node, 'shell routing window-location-navigation', 'Shell routing must use router navigation instead of window.location.', 'use the router navigation primitive');
|
|
417
431
|
}
|
|
418
432
|
node.forEachChild(visit);
|
|
@@ -0,0 +1,117 @@
|
|
|
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 FEDERATION_RUNTIME = '@module-federation/modern-js-v3/runtime';
|
|
31
|
+
const FEDERATION_MEMBER_LOADERS = new Set([
|
|
32
|
+
'loadRemote',
|
|
33
|
+
'loadShare'
|
|
34
|
+
]);
|
|
35
|
+
function isBuildTargetAccess(typescript, node) {
|
|
36
|
+
if (!typescript.isPropertyAccessExpression(node) || void 0 !== node.questionDotToken || 'MODERN_TARGET' !== node.name.text) return false;
|
|
37
|
+
const env = node.expression;
|
|
38
|
+
return typescript.isPropertyAccessExpression(env) && void 0 === env.questionDotToken && 'env' === env.name.text && typescript.isMetaProperty(env.expression) && env.expression.keywordToken === typescript.SyntaxKind.ImportKeyword && 'meta' === env.expression.name.text;
|
|
39
|
+
}
|
|
40
|
+
function createNativeShellRuntimeEvidence(typescript, typescriptApi, checker, sourceFile) {
|
|
41
|
+
const unwrapParentheses = (node)=>{
|
|
42
|
+
while(typescript.isParenthesizedExpression(node))node = node.expression;
|
|
43
|
+
return node;
|
|
44
|
+
};
|
|
45
|
+
const isBuildTargetLiteral = (node)=>typescript.isStringLiteral(node) && ('browser' === node.text || 'node' === node.text);
|
|
46
|
+
const buildTargetComparison = (node)=>{
|
|
47
|
+
node = unwrapParentheses(node);
|
|
48
|
+
if (!typescript.isBinaryExpression(node) || node.operatorToken.kind !== typescript.SyntaxKind.EqualsEqualsEqualsToken) return;
|
|
49
|
+
const literal = isBuildTargetAccess(typescript, node.left) ? node.right : isBuildTargetAccess(typescript, node.right) ? node.left : void 0;
|
|
50
|
+
return void 0 !== literal && isBuildTargetLiteral(literal) ? literal.text : void 0;
|
|
51
|
+
};
|
|
52
|
+
const conjuncts = (node)=>{
|
|
53
|
+
node = unwrapParentheses(node);
|
|
54
|
+
return typescript.isBinaryExpression(node) && node.operatorToken.kind === typescript.SyntaxKind.AmpersandAmpersandToken ? [
|
|
55
|
+
...conjuncts(node.left),
|
|
56
|
+
...conjuncts(node.right)
|
|
57
|
+
] : [
|
|
58
|
+
node
|
|
59
|
+
];
|
|
60
|
+
};
|
|
61
|
+
const requiresBrowserTarget = (condition)=>conjuncts(condition).some((conjunct)=>'browser' === buildTargetComparison(conjunct));
|
|
62
|
+
const isBrowserGuarded = (node)=>{
|
|
63
|
+
for(let child = node; void 0 !== child.parent; child = child.parent){
|
|
64
|
+
const parent = child.parent;
|
|
65
|
+
if (typescript.isIfStatement(parent) && parent.thenStatement === child && requiresBrowserTarget(parent.expression)) return true;
|
|
66
|
+
if (typescript.isConditionalExpression(parent) && parent.whenTrue === child && requiresBrowserTarget(parent.condition)) return true;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
};
|
|
70
|
+
let federationInstanceTypeIds;
|
|
71
|
+
const federationInstanceTypes = ()=>{
|
|
72
|
+
if (void 0 !== federationInstanceTypeIds) return federationInstanceTypeIds;
|
|
73
|
+
const typeIds = new Set();
|
|
74
|
+
const recordRuntime = (specifier)=>{
|
|
75
|
+
const runtime = checker.getSymbolAtLocation(specifier);
|
|
76
|
+
const getInstance = void 0 === runtime ? void 0 : checker.getMemberInModuleExports(runtime, 'getInstance');
|
|
77
|
+
const getInstanceType = void 0 === getInstance ? void 0 : checker.getTypeOfSymbol(getInstance);
|
|
78
|
+
if (void 0 === getInstanceType) return;
|
|
79
|
+
for (const signature of checker.getSignaturesOfType(getInstanceType, typescriptApi.SignatureKind.Call)){
|
|
80
|
+
const returnType = checker.getReturnTypeOfSignature(signature);
|
|
81
|
+
const instanceType = void 0 === returnType ? void 0 : checker.getNonNullableType(returnType);
|
|
82
|
+
if (void 0 !== instanceType && instanceType.getSymbol()?.name === 'ModuleFederation') typeIds.add(instanceType.id);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const visit = (node)=>{
|
|
86
|
+
if (typescript.isImportDeclaration(node) && typescript.isStringLiteralLikeNode(node.moduleSpecifier) && node.moduleSpecifier.text === FEDERATION_RUNTIME && node.importClause?.phaseModifier !== typescript.SyntaxKind.TypeKeyword) recordRuntime(node.moduleSpecifier);
|
|
87
|
+
else if (typescript.isCallExpression(node) && node.expression.kind === typescript.SyntaxKind.ImportKeyword && 1 === node.arguments.length && typescript.isStringLiteralLikeNode(node.arguments[0]) && node.arguments[0].text === FEDERATION_RUNTIME) recordRuntime(node.arguments[0]);
|
|
88
|
+
node.forEachChild(visit);
|
|
89
|
+
};
|
|
90
|
+
visit(sourceFile);
|
|
91
|
+
federationInstanceTypeIds = typeIds;
|
|
92
|
+
return typeIds;
|
|
93
|
+
};
|
|
94
|
+
const isBrowserFederationMemberLoad = (node)=>{
|
|
95
|
+
if (!typescript.isCallExpression(node)) return false;
|
|
96
|
+
const callee = unwrapParentheses(node.expression);
|
|
97
|
+
if (!typescript.isPropertyAccessExpression(callee) || !FEDERATION_MEMBER_LOADERS.has(callee.name.text)) return false;
|
|
98
|
+
const receiverType = checker.getTypeAtLocation(callee.expression);
|
|
99
|
+
return void 0 !== receiverType && federationInstanceTypes().has(receiverType.id) && isBrowserGuarded(node);
|
|
100
|
+
};
|
|
101
|
+
return {
|
|
102
|
+
isBrowserFederationMemberLoad
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
106
|
+
createNativeShellRuntimeEvidence: ()=>createNativeShellRuntimeEvidence,
|
|
107
|
+
isBuildTargetAccess: ()=>isBuildTargetAccess
|
|
108
|
+
});
|
|
109
|
+
exports.createNativeShellRuntimeEvidence = __webpack_exports__.createNativeShellRuntimeEvidence;
|
|
110
|
+
exports.isBuildTargetAccess = __webpack_exports__.isBuildTargetAccess;
|
|
111
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
112
|
+
"createNativeShellRuntimeEvidence",
|
|
113
|
+
"isBuildTargetAccess"
|
|
114
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
115
|
+
Object.defineProperty(exports, '__esModule', {
|
|
116
|
+
value: true
|
|
117
|
+
});
|