From 3b6d3649251704ee094917b2ea67d2252a148120 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 05:15:28 +0000 Subject: [PATCH 01/68] feat(lynx): add native module federation support --- .changeset/calm-tasms-federate.md | 8 + .changeset/tiny-lynxes-federate.md | 9 + .github/workflows/build-and-test.yml | 5 + .github/workflows/e2e-lynx.yml | 87 + apps/lynx-module-federation-demo/.gitignore | 3 + apps/lynx-module-federation-demo/README.md | 94 + .../design/orbit-control-mobile.png | Bin 0 -> 1195373 bytes .../design/orbit-control-wide.png | Bin 0 -> 1253726 bytes .../federation.config.mjs | 98 + .../lynx.config.mjs | 64 + .../lynx.remote.native.config.mjs | 40 + .../lynx.remote.web.config.mjs | 36 + .../lynx.web.config.mjs | 39 + apps/lynx-module-federation-demo/package.json | 49 + .../rspack-canary-rspeedy.mjs | 25 + .../src/app/App.css | 447 ++++ .../src/app/App.tsx | 352 +++ .../src/app/federation.d.ts | 52 + .../src/app/federation.ts | 58 + .../src/app/index.tsx | 10 + .../src/app/useFederatedCatalog.ts | 212 ++ .../src/remote-ui/ActivityFeed.tsx | 104 + .../src/remote-ui/Card.tsx | 73 + .../src/remote-ui/Details.tsx | 48 + .../src/remote-ui/Remote.css | 287 +++ .../src/remote-ui/bootstrap.ts | 1 + .../src/remote-ui/contracts.ts | 29 + .../src/shared-app/federationState.ts | 40 + .../test/native-artifacts.mjs | 145 ++ .../test/native-dev-server.mjs | 112 + .../test/real-web/README.md | 18 + .../test/real-web/index.html | 45 + .../test/real-web/run.mjs | 400 ++++ .../test/real-web/shell.js | 26 + package.json | 1 + packages/lynx/LICENSE | 21 + packages/lynx/README.md | 195 ++ packages/lynx/package.json | 106 + packages/lynx/rstest.config.mts | 7 + packages/lynx/src/chunkLoadingMatcher.test.ts | 227 ++ packages/lynx/src/chunkLoadingMatcher.ts | 274 +++ packages/lynx/src/compilerFederation.ts | 20 + packages/lynx/src/externalBundle.test.ts | 215 ++ packages/lynx/src/externalBundle.ts | 177 ++ packages/lynx/src/index.ts | 12 + packages/lynx/src/plugin.test.ts | 709 ++++++ packages/lynx/src/plugin.ts | 167 ++ packages/lynx/src/pluginOptions.ts | 321 +++ packages/lynx/src/remoteBundle.ts | 409 ++++ packages/lynx/src/remoteManifest.test.ts | 154 ++ packages/lynx/src/remoteManifest.ts | 139 ++ packages/lynx/src/runtimeChunkLoading.ts | 388 +++ packages/lynx/src/runtimeCore.ts | 126 + packages/lynx/src/runtimeEntryLoader.ts | 264 +++ packages/lynx/src/runtimePlugin.test.ts | 860 +++++++ packages/lynx/src/runtimePlugin.ts | 105 + packages/lynx/src/runtimeTimeout.ts | 35 + packages/lynx/src/webEncode.test.ts | 37 + packages/lynx/src/webEncode.ts | 71 + packages/lynx/tsconfig.json | 31 + packages/lynx/tsconfig.lib.json | 10 + packages/lynx/tsconfig.spec.json | 14 + packages/lynx/tsdown.config.mts | 37 + packages/runtime-core/src/global.ts | 18 +- packages/webpack-bundler-runtime/src/init.ts | 8 +- .../src/updateOptions.ts | 4 +- pnpm-lock.yaml | 2106 ++++++++++++----- tools/scripts/ci-e2e-suites.mjs | 4 + tools/scripts/ci-local.mjs | 12 + 69 files changed, 9735 insertions(+), 565 deletions(-) create mode 100644 .changeset/calm-tasms-federate.md create mode 100644 .changeset/tiny-lynxes-federate.md create mode 100644 .github/workflows/e2e-lynx.yml create mode 100644 apps/lynx-module-federation-demo/.gitignore create mode 100644 apps/lynx-module-federation-demo/README.md create mode 100644 apps/lynx-module-federation-demo/design/orbit-control-mobile.png create mode 100644 apps/lynx-module-federation-demo/design/orbit-control-wide.png create mode 100644 apps/lynx-module-federation-demo/federation.config.mjs create mode 100644 apps/lynx-module-federation-demo/lynx.config.mjs create mode 100644 apps/lynx-module-federation-demo/lynx.remote.native.config.mjs create mode 100644 apps/lynx-module-federation-demo/lynx.remote.web.config.mjs create mode 100644 apps/lynx-module-federation-demo/lynx.web.config.mjs create mode 100644 apps/lynx-module-federation-demo/package.json create mode 100644 apps/lynx-module-federation-demo/rspack-canary-rspeedy.mjs create mode 100644 apps/lynx-module-federation-demo/src/app/App.css create mode 100644 apps/lynx-module-federation-demo/src/app/App.tsx create mode 100644 apps/lynx-module-federation-demo/src/app/federation.d.ts create mode 100644 apps/lynx-module-federation-demo/src/app/federation.ts create mode 100644 apps/lynx-module-federation-demo/src/app/index.tsx create mode 100644 apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts create mode 100644 apps/lynx-module-federation-demo/src/remote-ui/ActivityFeed.tsx create mode 100644 apps/lynx-module-federation-demo/src/remote-ui/Card.tsx create mode 100644 apps/lynx-module-federation-demo/src/remote-ui/Details.tsx create mode 100644 apps/lynx-module-federation-demo/src/remote-ui/Remote.css create mode 100644 apps/lynx-module-federation-demo/src/remote-ui/bootstrap.ts create mode 100644 apps/lynx-module-federation-demo/src/remote-ui/contracts.ts create mode 100644 apps/lynx-module-federation-demo/src/shared-app/federationState.ts create mode 100644 apps/lynx-module-federation-demo/test/native-artifacts.mjs create mode 100644 apps/lynx-module-federation-demo/test/native-dev-server.mjs create mode 100644 apps/lynx-module-federation-demo/test/real-web/README.md create mode 100644 apps/lynx-module-federation-demo/test/real-web/index.html create mode 100644 apps/lynx-module-federation-demo/test/real-web/run.mjs create mode 100644 apps/lynx-module-federation-demo/test/real-web/shell.js create mode 100644 packages/lynx/LICENSE create mode 100644 packages/lynx/README.md create mode 100644 packages/lynx/package.json create mode 100644 packages/lynx/rstest.config.mts create mode 100644 packages/lynx/src/chunkLoadingMatcher.test.ts create mode 100644 packages/lynx/src/chunkLoadingMatcher.ts create mode 100644 packages/lynx/src/compilerFederation.ts create mode 100644 packages/lynx/src/externalBundle.test.ts create mode 100644 packages/lynx/src/externalBundle.ts create mode 100644 packages/lynx/src/index.ts create mode 100644 packages/lynx/src/plugin.test.ts create mode 100644 packages/lynx/src/plugin.ts create mode 100644 packages/lynx/src/pluginOptions.ts create mode 100644 packages/lynx/src/remoteBundle.ts create mode 100644 packages/lynx/src/remoteManifest.test.ts create mode 100644 packages/lynx/src/remoteManifest.ts create mode 100644 packages/lynx/src/runtimeChunkLoading.ts create mode 100644 packages/lynx/src/runtimeCore.ts create mode 100644 packages/lynx/src/runtimeEntryLoader.ts create mode 100644 packages/lynx/src/runtimePlugin.test.ts create mode 100644 packages/lynx/src/runtimePlugin.ts create mode 100644 packages/lynx/src/runtimeTimeout.ts create mode 100644 packages/lynx/src/webEncode.test.ts create mode 100644 packages/lynx/src/webEncode.ts create mode 100644 packages/lynx/tsconfig.json create mode 100644 packages/lynx/tsconfig.lib.json create mode 100644 packages/lynx/tsconfig.spec.json create mode 100644 packages/lynx/tsdown.config.mts diff --git a/.changeset/calm-tasms-federate.md b/.changeset/calm-tasms-federate.md new file mode 100644 index 00000000000..d82a9688f28 --- /dev/null +++ b/.changeset/calm-tasms-federate.md @@ -0,0 +1,8 @@ +--- +'@module-federation/runtime-core': patch +'@module-federation/webpack-bundler-runtime': patch +--- + +Avoid logical assignment syntax and use a standards-safe own-property check in +embedded federation runtime initializers so ES2019 and Lynx TASM consumers can +parse the generated runtime. diff --git a/.changeset/tiny-lynxes-federate.md b/.changeset/tiny-lynxes-federate.md new file mode 100644 index 00000000000..506ee841ac3 --- /dev/null +++ b/.changeset/tiny-lynxes-federate.md @@ -0,0 +1,9 @@ +--- +'@module-federation/lynx': minor +--- + +Add an Rspeedy build adapter plus background and Lynx for Web main-thread +transports. Dual-realm remotes publish a standard Module Federation manifest +whose remote entry resolves to one HTTP-loadable external `.lynx.bundle`. +Compiled federated `import()` calls skip Lynx's local loader for remote-only +chunk IDs while preserving normal local JavaScript chunk loading. diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index a0793b07b2a..3f65992eec7 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -149,6 +149,11 @@ jobs: uses: ./.github/workflows/e2e-runtime.yml secrets: inherit + e2e-lynx: + needs: checkout-install + uses: ./.github/workflows/e2e-lynx.yml + secrets: inherit + e2e-manifest: needs: checkout-install if: ${{ fromJSON(needs.checkout-install.outputs.e2e_suites).manifest }} diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml new file mode 100644 index 00000000000..0bd8ca23b8e --- /dev/null +++ b/.github/workflows/e2e-lynx.yml @@ -0,0 +1,87 @@ +# .github/workflows/e2e-lynx.yml +name: E2E Test for Lynx Module Federation + +on: + workflow_call: + +jobs: + e2e-lynx: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout Repository + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + fetch-depth: 0 + + - name: Setup pnpm + uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4 + + - name: Setup Node.js 24 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 + with: + node-version: '24' + cache: 'pnpm' + cache-dependency-path: '**/pnpm-lock.yaml' + + - name: Export SKIP_DEVTOOLS_POSTINSTALL + run: echo "SKIP_DEVTOOLS_POSTINSTALL=true" >> "$GITHUB_ENV" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Restore Turborepo cache + uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 + with: + path: .turbo/cache + key: ${{ runner.os }}-turbo-${{ github.ref_name }}-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-turbo-${{ github.ref_name }}- + ${{ runner.os }}-turbo- + + - name: Build shared packages + run: pnpm run build:packages + + - name: Check CI conditions + id: check-ci + run: | + ci_status=0 + node tools/scripts/ci-is-affected.mjs --e2eSuite=lynx || ci_status=$? + if [ "$ci_status" -eq 0 ]; then + echo "run-e2e=true" >> "$GITHUB_OUTPUT" + elif [ "$ci_status" -eq 1 ]; then + echo "run-e2e=false" >> "$GITHUB_OUTPUT" + else + echo "ci-is-affected failed with unexpected exit code: $ci_status" >&2 + exit "$ci_status" + fi + + - name: Install Playwright Chromium + if: steps.check-ci.outputs.run-e2e == 'true' + run: pnpm --filter lynx-module-federation-demo exec playwright install --with-deps chromium + + - name: Test Lynx federation compiler and transport + if: steps.check-ci.outputs.run-e2e == 'true' + run: pnpm --filter @module-federation/lynx test + + - name: Build and validate native Lynx artifacts + if: steps.check-ci.outputs.run-e2e == 'true' + run: pnpm --filter lynx-module-federation-demo run e2e:native + + - name: Run real Lynx for Web E2E + if: steps.check-ci.outputs.run-e2e == 'true' + run: pnpm --filter lynx-module-federation-demo run e2e:web + + - name: Upload Lynx E2E failure artifacts + if: failure() && steps.check-ci.outputs.run-e2e == 'true' + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: lynx-module-federation-e2e-failure + path: | + apps/lynx-module-federation-demo/test/real-web/artifacts/ + apps/lynx-module-federation-demo/dist/host-native/ + apps/lynx-module-federation-demo/dist/remote-native/ + apps/lynx-module-federation-demo/dist/host-web/ + apps/lynx-module-federation-demo/dist/remote-web/ + if-no-files-found: ignore + retention-days: 7 diff --git a/apps/lynx-module-federation-demo/.gitignore b/apps/lynx-module-federation-demo/.gitignore new file mode 100644 index 00000000000..17c7c106e9b --- /dev/null +++ b/apps/lynx-module-federation-demo/.gitignore @@ -0,0 +1,3 @@ +dist/ +.turbo/ +test/real-web/artifacts/ diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md new file mode 100644 index 00000000000..fd3a4a0012e --- /dev/null +++ b/apps/lynx-module-federation-demo/README.md @@ -0,0 +1,94 @@ +# Lynx Module Federation demo + +This is an official Rspeedy + ReactLynx application, not a browser-only +simulation. It includes: + +- a native background host and remote built as `.lynx.bundle` artifacts; +- a Lynx for Web host mounted in the official `` custom element; +- ordinary `import('catalog/Card')` and runtime `loadRemote()` consumers; +- three lazy remote screens loaded over HTTP from `mf-manifest.json`; +- host, Card, Details, and ActivityFeed consumers of one shared singleton; +- independent background and main-thread layer scopes. + +The remote uses the default split transport: + +```mermaid +flowchart LR + A["Orbit Control host"] -->|"GET"| M["mf-manifest.json"] + M -->|"remoteEntry"| C["catalog.*.lynx.bundle"] + C --> E["container only"] + E -->|"on demand"| F["ActivityFeed .bundle"] + E -->|"on demand"| G["Card .bundle"] + E -->|"on demand"| H["Details .bundle"] +``` + +The host never addresses a generated `remoteEntry.js` directly. Both import +styles resolve the manifest, whose `metaData.remoteEntry` names the public +`.lynx.bundle` container. Lazy expose bundles are fetched separately. + +## Run the native app + +Build the official native host and remote and validate their manifests: + +```sh +pnpm e2e:native +``` + +For Lynx Explorer on a phone, use a LAN-reachable origin and bind the Rspeedy +server to the network: + +```sh +LYNX_DEV_HOST=0.0.0.0 \ +LYNX_REMOTE_ORIGIN=http://:3000 \ + pnpm dev +``` + +The configured official `pluginQRCode()` prints the app QR code. Open Lynx +Explorer on the device and scan it. The phone must be able to reach +`:3000`; `127.0.0.1` refers to the phone itself and will not work. +Set `CATALOG_NATIVE_MANIFEST_URL` when the remote manifest is hosted elsewhere. + +`e2e:native` is intentionally named artifact validation: CI has no iOS or +Android Lynx runtime. It compiles the real Rspeedy host and remote, verifies +both binary bundles, checks the manifest's background expose/share layer +metadata, then launches the dev server and fetches the host, manifest, +container, and every lazy bundle over HTTP. Scanning the QR runs those same +served artifacts in the native runtime. + +## Run the real Lynx Web E2E + +Install Chromium once, then run: + +```sh +pnpm exec playwright install chromium +pnpm e2e:web +``` + +The test builds the official Rspeedy web host and remote, starts an ephemeral +HTTP server, and mounts `dist/host-web/main.web.bundle` through +`@lynx-js/web-core`'s public ``. Playwright uses a mobile viewport +and touch input. It verifies: + +- manifest, container, and lazy expose requests over HTTP; +- compiled `import()` and runtime `loadRemote()` results; +- rendering and navigation through the ReactLynx UI; +- shared-state identity and mutations across host and remote consumers; +- no Lynx, page, or console errors. + +A failed run writes `test/real-web/artifacts/failure.png`. Override artifact +paths with `LYNX_HOST_WEB_BUNDLE`, `LYNX_REMOTE_MANIFEST`, +`LYNX_REMOTE_WEB_BUNDLE`, and `LYNX_WEB_E2E_SCREENSHOT`. + +## Test matrix + +| Command | Evidence | +| ----------------- | ---------------------------------------------------------- | +| `pnpm e2e:native` | Real native Rspeedy builds plus binary/manifest validation | +| `pnpm e2e:web` | Real official `` browser runtime E2E | +| `pnpm test` | Both official Rspeedy checks | + +The web remote enables `mainThread: true`, so each exposure has background and +main-thread variants. The demo deliberately scopes `orbit-shared-state` to +the semantic `background` realm; E2E proves singleton identity across the host +and all remotes in that realm. It does not claim cross-thread identity because +JavaScript objects cannot cross Lynx's realm boundary. diff --git a/apps/lynx-module-federation-demo/design/orbit-control-mobile.png b/apps/lynx-module-federation-demo/design/orbit-control-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..501d48e1a081d6591c2ad6d6ec80db74bec87d37 GIT binary patch literal 1195373 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 z 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�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 Nw*^Q$}>aUpGn3ejCw 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 z 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

HRtx{eSZ3ww%S0Oc8I^X{KX?$ELnMyk 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%0ANiPje6`xEZs3;Q|$fV}!tXg_Y4Nzn~ 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�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

w?g{C12`(iz!8KG#ktb_Z{=xsMbm5^Q(wkC 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

NkM!qKF633Z5hX_-7f0~Y_C6$O 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 z zQM&&)?6$4a-CK=;IwrSWu8>~#Y3?=>e?~k@db@M~EK6%iFlYVNn#I(Rd=JT#yWx~=LxleRo3}1Q&YsJo-^FsOWRa9xMH?sjI z5YDvdR$%NS923xf^mVV;MSxN_zrMm-&d>63=%2CkL9ATd8`1^q z^EK~=GCsIzJQh_PKU}!}s{ZLD-CQvz*L>FQlva|rZItwKvPX2TN2h$(zknU^X*dcD z)yPfaLWl!W>c{wUoU^wa{K~iA47@4a&8*on@uMSx9$A#2x=2rrZgKtMZ8a?=kJ3`J z1I#;432P5;&ILDHMuj#)WdBHF$;I&tub7$jfKUNabbEm`LPw@9KCy)M1LjUE^?9>oUJyOeB|d@yzTC@9FK zaGU?h{$YCSuUYJXaHf4@$l%)XbwELfZ=(WB#}aW$t*2A?YDz$S&BbvLrF61&gM0C) ztvG)se62Ty8%h+T;{|8F#Rz;H*3BK`NXfE#>015Th**%Ha52UChJeyj0cP=0_!&Ii zTTH{^&&7-2h5F3wZ0%s8oKvjD`0lZa&(yC7(q-kuI**Be7FG`9*kCSEwZqo_{Lx*| z)vFslQbk6^L0BJf1j&)MUX<;-Wj@{~CE_>g>gE zUIci>>$=vQpvj(ll6(P+TkS@7o~w3hp%`iTMV}BGd+=|K9@ZzX-^F#>TRH?f1jHHN zt!p?Rc?tjJC;A-@KAbK(S2X+Rp_8?prUX&kjlKAX+WCqbUCSl65`f*v-=D6-9hgq8 zwX3o$TAh-gN!$fp5fBSEDQ&Uc{9}DH;dAQ?(wzY61<<#**OgzrYx^o(dxI;FmP;aC zeRpS+p^Md%Q9@k*egeojJI=(m0WN9w(tU4WfZoF#;(mZaBr4ILK~kR|)#YTHegE*& zVuD;lA6h&ye;FHfRR*BkaPx_W(Yfx7zXESBa7bEsa0p)C5f7fb_|HWeP+I_O+xn3V zC@ocp;zDRIeTNT!s*kHK{aC|>b9qs{30C^+jxA@{%;2gHR0fU8s|io^_-HKy^N(s1 zd8N;vAGWSd%0M)j%^x7(XuF^}O^35cTJ3IwZHQL&QF|UT=ph$w3c6^fSv4O^jWEHUS zS~rtU14IwQ`sbtQXRcG7Uw+cAeOkE1e;jmU^W_Y`QtsbB=j{B17(KVwM@JXK57>vY zX4I~K*yO@g8`yFS(OICEK1{C*92xaKil39c*UA3gFh6>#1=8Wn9`64|;dUxWTUY;< z+N*EnBKKt5ucYUFwH}_^c?PeDjTlQ)f#!u;&xL;5e&Id~f4zzBq9Uuos@_^DA3KU} znx!z5-0@;n(`{V=smar=mGQgZliLyXxngJV?Zfn02%E0;Nfg?yc4*8-mwgz!eD?CR zH^z-lGKpBXoWFUqgIv{rf$_KdIG;?ZXbR%qu_HgzipV}-sqM=KS9l|fG`MJUv<18v ziH@ZE_3MJ__;QYR`tu2PfX!fy)U9Jyb|y_)C!Zaa?nB-cFspDxdU$zNXe#mdoj$mi zv}wXqomNsaW(~09V`O%&ux|+&r%x`iz6jFByY(-s4&YU~niBc%ofLH2EMJrKll%EdFfD$Z3P54cOEGHmQ!Z0w1hb3C(>1v+p znD@*tQfgHbS(bWO1({!P*P;FSA9$j^zV=1uFeSNdlO(G}eaq`TPn1o)wYupQxU6vf zTeryDy$~1=KSAJ^-GX zWAe#sQc1#@;k#arC#7DM&2*tCu8Rz$OeOEm)X(x8UOV9-GF5UEFn>xlin{Mf95rTK zd?VWWT#4iDaAah+&GQkxI6zJDIcaNpp9`OMD8V`KYG=|Gio&kM;tB?)mS))sSK{@LB$ zM_sqmSs>SISxN%M{xO#jjhPY|^nYYMgtGJktP3s}v6dDIFt*3Ruk;U0F)GnDvydjh zsu|nTgLr@((0Y^Sm`%l~Dn}0axV&3tU|>*W8(pz!#6!Q{2!1u*Xk4ri$JXI<(?HIn z{7(_w%Paa0;8&W_D7~Ft!Z&@IwNHR<Tky5(O3kWl`_6+)^pdE zw@;EGdxnKGHYKosU+8igb8nK1a>_z48eQ=E@%sY9#fsujeOsUAOMV}!{(j=}V@u&c zYC0h~?mnYBT3+CD87*=nXmxzzgO7xho=$ow`6fYMI4r4oagth!xxvsX0 zPj$okVgRM@+ZhYP4$4Yt$1352*ui9~9p-1%b@6J>tUFP{JW=Oo7?&S=Ritk=5(e2 zK&hy|>%3Ps%Lr$MQjSf5;QXxzMp+D!vsip(>!B+h0AVcU7M-GH()Ex+)c%QI#1Usz zIH-75gd;w|jSjzlS><){u~)SfYvKlMxVe+r>0%09MQxsLo}Ql0T&~7PCJoi;8J2J$ zMzV5Z)=E#F$eiDPN$FOF(&)v-9cNM4T8a<~bVOxh^+jx@?NRb3K^nP5aEj{U@DKL$ zIU550UP~N;wTY(@2)#cZ)d1)&`-_$c(jmO>cD0knd&CU$gMPTRX-u-cB;rX3*nnXnGPUs6^fX5EyuxA`ypS}+NQ1w8UhT{SU~ySF%z(m zOAH*}Ze)oKeXr=702$ODsVB&cREzQ(u!RgO)z|kJS7=0b1vJpD2FqU_;$OV!R?)p0 z#f5jLtHL(c8QQKVbBJ))#-Qv1Ptf##HlMdn*lsPz6g{A& z93;nf9>8DjQ`f2*M&3?zF4EA-S)9xl_^b?Y!CqMQhvD1L26miY?$)jsSK2KyDSESb z_@vK;O-*nraMBU9$bK%F>7v&quS@g_-UB=df7B$!!3ECFcc#TsN z;KZ0UZSbOJNkIOU0EW*NUq*W>tj}Ggdsrj3+H5g}|5Ie*2ZwFg69~A)fUcp_MERZb z7x(=&OP)rhMcrQ(KQs3v1EB9*^15L5dmUQRxj^*+c;S&LaI5V{S+3_! zFpmtU4`GGRgp%Hvj9T(!G%)5&O+nuJe6Hf07pM4yLHKFo{ua_nXeOA^TYY5G??3Zb zhpJnm;`)tu09_+i-T6B^L6E6>kRm^aMy}^+*DMupAhwlwLZ3;s(dCG+(d-2^VXlgL zsoaReqkQo6&d$Kp@86uN^Jgc14lRLy-Y-|z(D$psv2LE8o`Ig^B3s{9x`+NFJi*&+ z(w9);BY23tAOckenVtGM*|PhR0rN_~<|F0~WFwZ>6(72FLslK>CI=dxBE~ES+>h}S z=7>v$C+y7Bd&#yETj|}8N%5(lBWY&z6mMc;tU93rTE$x!o0wR#pvWgxgM;W6zz?(k z%t+`Ll5g|~7lSMAsg+~dhk%4Ibn~yu`0mag+EzYoDS1J$-kbanW0yADFLR5jp$Jhk z)H?>1)bvNxaDqVw3H3hR-8a#wC1FO*W^eMl9&p6+6US1GacjDDNARG}QpWM%CyX*l z2avBJeKB8XXMO0%4R*lzk>lBCtG4Yc#-qYhDDX=t)FZoF(}<089OTo72n%^7I}Gbm zV2e}DG@e%z7UCdZ-I*e0VAGfVAGt6j)*BmeM$PoQWf#?0TX+mtNCx8P00rEq60an) zzf!WPZ@;PZELR3YBuKIA>9K3qx}z&C*RO5(&2~Y5WdHb5A5T%!e}C=yO%r$0-|qf( zimcE2TTGK0toFaIpW5sTuNaR^PKs&!3V|v|gr_+68|DLZuahL7F z*#D2W_l~!$C=$o3`kZ_3%WraEhMY49ih=whUChGZ(B*gEcH4%BhX#h`431ILTz3DTcT%T0G-xw3G&r1@90&%R zEh5SXn(L<~9-iEaXodzx9^Sd}=l9%DWH2;50u9q@HnS`@CYw7lK9IGtEFWkM&K(>> zfMXXOaMWJ=OthzF2rjn7s z1M>`VurV;uYGno+jcjyq2muXZj%NPw*hs6@Xy&a}3lR%$ zg}+?BdU6KYKp;+af6&xJT2)%TH7e1Nlj2Op-J!&HBxz(wv&F z)&UgmLZV)E{+iTeR0V8XH5KByYSb{Gr1YX8G+-@0^*JziA>|F+xC#Dp6?A7IZ-TW* zgkX(R4p|OB)b5~ZP+0&F<_$muW390cDi=EjYoXhPp&@(!3b^G)EDfQ7gO7r_i=eb1 zAr^)Z!+aXVsV34`GARLws9UrRm}aX5#-PcJG1gM2({a1h5unj%3=9lz+_3I5pZmXe zthlQ^GkwyNp7ilgetf~g1@4IEx#Qz6e&O?nMuw=gJ9kZe@>8F_@ut7boik@-WOQ_7 zY;0_NYI^4LU;N_7KlvH5U=Xa|h5tG?&vPQ`cDs3&S)Y+f%~mVSRQ#Ef#`6i4 zjVwF+r7wca433W8_{ST*@wKnM;JIhbojae%W}J}0yzPT&mJFh?WeM&pC}=E|1FZo9 zp9@l!Ww+aHG#ZE*0SycekW0`m%eTJeE%WA&O;1hDpFjUAU;XMuKe;$>ax@tLl0j>2S(YXP2eUDlZ~ie(#doukQj(Q~A*5bw9c7noTo1325oyoaN*5C%c_Twr~B?&6j^;#c$8O`DdTL z?xL0JS7W2q$>5fC5B%h=KW*>MZk^hB!|MCDO-~k`^1-!hu3fcarsxiufw!Ib{3k8i zce*=s=eozfaKoklcKuI3f8%AJz5e3&|MuHguUhfq!%jM8;a(#qTRv~>kB{B=x!?cf z#`O<&&~$)SY<&3g2kz()KL3c54xF=u$SOSo8D^I3A@i2K`MA>$9baQ;z~;5rJ$l!U&h)G;@7VCjEssAi z)oHKUvE>hs-nnUJCmD0s#)ns|dt|!oJicS|^{ZAsxN~i8S|z{(Ti2|7{84M|=3Nul zKXljn$?X}Klb0X)#wVXXkei3MZTQZOzx~8jKmNCCfBG-i{P=yp{N{iC>6d$r&U^O$ zM_XH>@}E%8Nvad1UV*O4HnhsDu~vg5(h*+N2%3{_r5@ZrlC?@{1;j`-QWXgFwY+C3 zpLYxI`d#XET)0wCrmhG8Xfi`Z*DP38KJ^s1@=_Qap=+*yeGkJEP90082zz_?5?XU56`^8uLLX0P}etX&I@CN1929Cad?3_5Md@}SqFkB9oWOO3G* z<4Tm}d9yVD0G&=TFf=?gI5<2sx^&5sX0zFxH&2?n{`%{`^yM%A?2=y$&zbjv=brKL zkALjQBai5GJMM$lWm!Js8P7cD?Qi=0e|~;!{?dEyx%WNq|NED{^hHbeTAJng#P%J( zx%|rOuD||cANk0WpYjv{Xf&FGLxVun9B3d=tJNA97}z!0X*8PSW23Xv?SY{YG+9xU zjYgj5L(W04rENAFC!KWCfrlKpY4bL0HcXbi`Au(_ZMOl?9}q+E?9-n8?)SX?zs~*I z=-Bv0Kl#PlHS3@8^pp2mz8n!YZ`yR#Z?C%XrW?QYwQmd#4m#X2G_BTPt2Nl^bf_!` z1_mQ5?C0)81h!~D_c>?mwQTPV8`rnHvj(#lzvyq=(G0T6NgN13znKe&?D+UN03c?K z)d99 zEVDMVL|K*%wg#-Fk{goP{D$_gu{w*^t)gB8fyDQTRWs`w_&k`@|&Z#5- z%SgR9wg(r>KJAHG@v!K=&?jx}Q9Mm;F6mK#0qEfchP2E6FzyL3y?TioQd!|zsXpN& zZ@hizl^t1GxbNGPzgQ1ev8Xa>#8FW%`ZuLC@vWnq>~ds9_>lno!VTHMEPKVFPo3W! z{p0HU*X-Q(#lQS!!SHCi+g?AjvkTql9(dwu%a3^Oen+>+ltJP6o()2`D6fBLBF0cDGph=&D1;_BvpEVNThbjyq%F;P`LuyX|{7U;T##cMkzRwrk7s(fO}D`st@E zKf2}4M zMW@p_a^XHjx47w{d-tEa_=KegZQQl>lH0Fey>a7_i}vkyyMMU%&i&>u+k4*JU#%YI5B+(s`;T9??^XBTw0iUU zqxLzt(=C2~--?Cf3*LO}nOkSKUV871_pEvJpn1z?yXCEqJ$l{JdtZI@$*rvMnxjsg zJ1}Haf-}>Th~N`_!feSeH3NinR}y`Ka(W2KXCHaD zo%7RBi7P(`_kC2dR8CJ$62bfhi?hs7utM?FQ=DkOTiVZY5x^E*V{)3@X20~Wu;Fnm z3Fptlw|@u@IGSdr-JU1!hm+5uAp~-vcv}z>A)w9N?kg%f0GJK7?9VT-7hj0hSSZZv z-jTiVRqlh3ZU-q?;Df})5e$E{cPLC>S~4b^*s=Y_n{K}Rs^49B(ZyTVJqCbaS}%Ud z3y(YY=x)(Q#ObM-wQJVic;k&*x9&LQ=}$fLj5A;L%Cq<0dv6!Lb0*)~BF`I}Hf{R! zXFvPHA6_^yIYaF!0D^1~YzfpE8JY8mPyF-WfAE8O!))EM>7q+6zUU{vxc-{!%|O#w zc*VL2v|0m1RF-9)=i4WCeDaf@{?SE0*)g%p&h7*N zzyY8xKsj&T;(!15&%EOuZzrNn8#n#vq6;s%_!l?cbaSK87#bQl>p5q<`K@n0tFYZx4!Ak2On~`&Hi*}CPNcfRYg%Pt2nkefpfI%IILWo`MAm%eD-+VwyD@lR(ar{*r0J2pJ@ z)h~bX$RiH@`DIsp`@285Z`H%p>5h(#zT`#Ed)GVPdE$vDA|j&w%)kHpXaD^RMYqhe ze7}A7hO#|1+x^1l|IdlXAN%8rFaGug|NYpi2LUWV^G$Dl!#m&k_9q?xB((PT*I)mI zbH8%s6~A@cElxb?DIa|QdtUJTv&P59tSx!}sWW=&D+eJ*ndDn#I<{n7CNyV{Q8?Gb z380$Xg5Db;|M)C@X+bM62b5&6p_c2AxfW)|Zr8onV;uSdPEu#pmL5$)KIv9_JdAK~ z{(3r(Qn82grzs#jD9%=-xHVqAJK8fhR$ZF5$Pf^*?juW zMau>n*`4cF=cYMl zXlSxMJJp_DFfulOboi0Y>vy#~bB4!?vfMhgbII7eV;1kbvpsqD<~5y8F>i3BB%JAV z<`0h?xp=wz%q9S=+qHSs_RW*UOi|du#=rsdmmDy*5CDp@n*pD7t`2XapjH7ek{bfz z6Jb1aP43z`xohX>=$OeeW887Des<2DBi|CR8$|L40C>ZNSLnVs<&Z(pmfi%QoRsOD zzc8HzpS`4bt_t^OZm_L89$qcD4orS%Iy_`RHM?{ve(XcmPL*F^q z0K&{J*#97W%ZFf}Luh6OOon+z#sC49rO&(13?Kqo!jixx+#_|{045t6px^z>e(!wj zly-L7KJ^)mcmEU2T>zanWSLT>@yRr-gRqD5R}^KV*;@1X>TiDgf*WtXeQ>bZ%o}B4 zi=sQzp0;I)e1OOB;K)%&9`@uDPdMtxBM(005CABOZk{(vYi(I(CL^%jZl^UcG(A0a z$xko7_S)+nest}`u3fh1jt&hUdDIbSzw+g0KKqPrQ8x1IvDJ@!=5wFhxOw}+h4XB; zoSkiN*|hD2FM0mE&UxE~KmPG|e{kW#`SY{9VbDxZPcB$6?_(eN=>7-n-|2LW0c#1- z+;sDe|Mst+ZL|hn|N7Uz@)c)K&rCNPO&7JY)>^Q+$tNeLetOAIue$o0RgXTpbH^?~ z8Xq1x`q*P$`|4Mndg?RFqRjGa^`nn|@?SnPH9a#lH~<7>X#L~sPJQ-i|NOC!I_J+? zOO^+Y4`{Khw4{hC)Bu$Y<5Z~2$SUvd6yv)Q`fJLiAr z`xnibKX;(nYBbF3Onc#ic^~?R4<35(p)2mV^*_JxrHRSu@$vB-OuN%5I_(dB@O>wr zd@=yo(wfZt=}$LY`s-h>TzS{_Z9Ar>CI?#0<;(Ux^UPDvKKty23m0@dGi6y04vpM( z*PZ8o>)W^9e#fqfU0`6p<@>(yMKAcW7cjc<7Mt6vR3naMV9+4P<7eCIb;{%*(QRA+j6|Gk&J z?d|V)*~?#Y?KM}Q`<3%1CU=eu58J|)Wmy!Rm%r?#Z+i2a8wS7hm9Jj<>)*~9AIq`~ z5w>pKcKmV2{{08vxA)$AmxT`!Yv<2SjyFGFKAoy585mMDTWBCSEve(5TpL_`Ti8y}{`C)r{)jEHn zDKRhv;5Qhh&Yymu8%|-1$6NJVI0f>*|wzhP~xf783 zGMK-_=P0d3L<3-n5d2wP4wbSjJ7ssUIgro}2rO6=x7jTUAaJVN)h8+ut6!vrvMh+8 zB%5bh6|inmfUyR;rA2~9j);IJ%iNsh;Qw<@^CT0h^kfM8J6q7G=g*OXB7Ba{e5|91cLYmJ39Xqy5}%ft33KQ%R1|>Z&lp0{9>KXw0w7usdS)lW%*@WrY}&jn%d^4Z0oyH!fGk-mof-m! zJkLi*MuvulTx*?f2Q1}{+ae-pt2F#`fE1 z?}5RgnVA`5OtaZ4i|&qziM-)XdjUk8o}M)g7#|&(*fH7Zc87)r$YR!L01;6+G(6mD zww&mawQiMU-MWonXz`*&dDbAZ?xbXgrX^c+i!5*CnOVPX-J_2`HapvHwpwGuBM0oa z@9^koyWKGc8+mStc5L5?8MrNDm|=US)9JSN-Dh8S&W-c=+@2KxXygcpt%1RJpYxt8 zuDa$A*IvDJ$zq^_H~AXBv&V5dSOBt?5OMS7Ewk-*Yj7|_ljj)#PEAeDojX1-FtBUq z&Ye4_hDL_6EJGr|tmqcQBSQlNgNWGec5P`}11+-l{s$h~IXPhohK7cgEL^x~(INnt znVxAh01(^la(H-na<T!;ef)w@1fD_Sed#lkp=zs&}%$-woXSZ$NF+0=E zawH%k%(HA}X13L8EMC0WAa2>RwcRZmjm*heQI^J-xpU^UTCH%Pb8>92miNfh3f@&u z=g<9&B0>Kn=Z~+{2}>e>qC#q&KTt-c?s=W_*Q4J(yL2PFcm8?<)1&o0E0#Kc67v%f zD$bu)o$43FpoVFHKfu|FPIt8|03b$dpc*QySo%nNL*nuWc&e=hvlmDbw&jIF9O2e} zuXg^Vl$crpmVhjQ*cf^e11CKLm#XbN5JKyCqP! zbn`3(AY)ACk2ZA29J-@q$QhCNumM8nd)l&efDx6>kunC2$vG(HKAGYU#V`gl9+9Ff z%d&KYaKr?F!WO)l4vjGlL^M#ikOH~Gx!p&Ws8iaKeJMjWM;`_*h%CC{#tcoCWtlsK z7HnZ{>30yj!&ZIQ=uVs=TC>Vl&Y6I1PJR$;@5q&RE4*B3tg7a?amEx0jy$ zw?yKDSt&vufj>Bc?ldJ!WeIssohiETJiOvpIM9OG3EKY9w;05~{_ zsM{@w?BGDtsF_pI?RJZ9mNkq);||&Efi4hP|E)EfH*&WQGCMm{6h)RbPCM<4Lk~Or z8{hbHBg4#;;0`p1oj>qyiM7^dSu^bH4Hy+g(aEyhWDRl$a>iSX-DVoMi=xqN#?Vr? z(=II`nmj83Oi@5-yUj+PHwGEmcBk6~Fa}Mtk(Zx;(_=OX0M15ODl#-utSGwO zcE=dV8x41AR{|;kk+oQvk;^+rQkO35_)zaBq0)U1>}-iT4WvR2 z08|2siOZE-e#KH3<8H*iiQGGOi!08buOtMicWx`Iz(N+Q9tZFt7%`rm^H1HTcK+NG zKRpmi>2YF0Ror)Fab#tSoQo$d5WmNyJs}VzDEJ_TGeG1H5Obe!bdCs-+kc2;JZ8?- zFzB}GTMwk0ixCoL{wab%%rMKqA9hxf-_maYOj#Hz38*xg#hl$!cL*~8p!*(@8(|mL zBkzKssBiSmk|nP*z_(*OG{(5itu9#TN{}TB76H(mEa6;N>q9yQG2`kb(+2aL2NCt;JH#ZS`KEA@E6x8G`y|0m@*xHr*P!E9s6Pvqa9VG60!70v|I= z#!~5s<_`B_(@9-x-IyCdXIz#!S&`Im?# zpyjE9L4TYWP-%fIKuO-o<0%HBJ4M?2L?O`t091kkJAc{@^2gOX&j0~oYS+XrANljn zpVNdcxaT=DMAcXXG02^AIC*td+%ewzL2{6(s3{^s^@Wd`PlQA>d(w}BTN#(F>YR9r z9JR}J)X~+|E86@*{;xqO2@%K^I4}xlzlGWzxav2U4ZwpB(ht5$>mSF{UxZ@|$f*Zo zkUtPgmH-GFgU}+l?-u&?kKs=@7#f0ZNedR@Ti=UMc_tKHAc-@3^{UdKNr57OdxH4+ zjURPFKx@mg+a<@~tWt@CE0`JM-5SjEyezRSyCj-AwonLQGLxIE=(fAF9dJTGm}jPu z<<@5mIQ=VATkl~xS?+dct#t|pjV%!!vuBF>WDJ6}o!J>b@5+prD7lEN$q>o3+p|Qo zMAl`F8I$FC4(haFYc0ez2_Vbd**R{ajO#b7zvPmi4-JpJ_SLT$9vZp+Pk+4m_S--E zxzFTT22h5n0|2n}aID*r(R4a(=cIbmM{X*Q#+ahpwe2=IRM8ldp>Y#tHx~Y|8?v@t zbchJttQU>RGDM&131AUSo@Hgx?R2^XXaLY)mKlHy!FD>cL}W6P=M9q?vbJK2NOcMZ z4UwIloi43KB7>Oc1`&&H$Hg)sGsa|@F|M$)2;I)Cb*VD|V2}th1mI*5W=Ry;B$1#< zS&G@Vf`xZsYbkJED0DKrM`SZc70>-592AOp% zNzMtxV0&D~p-c$SLGCgf6xaLz{CY_2b_1XZJnsz(fh1h9_7F=a-i!mxqF=D}&Z1E; zXVK^?rsZ*$g#rX90YoigKi5D!DnWr{^MQ2)W(pZZ{!EfvBPZ_O4F`{*&;EDH%X$26 zYUe)$Kui??%f;Mufh{pZ!|RhlrE-FDEgOm&?(w_lCEO|zZ1;;Zd3u%yWgbH#>78U=i;m0POX;x_0J7vuyfM> z{73ZoDs%F4@VJvOA0Pl*bP*7YL6@em?qRy|8v5Pk`1l$#I6~8tcCUT$jqk#zJcA00 zVAEKgfdyW0m%s2|UmYGDnm2#Z$xnUCM?dz-XPxr&lb-TqaPDm_ zgP|e}P@d<+))9Re8GuS4$}(dzL*zUtG{)!{p)m&0g*GwI8$<-;j*&({a34zYsYC8F z9hjl<>o^GR^MEA)=6Ocw=HYH8TNi!h@o;~gyKk(sApR`dEHhbd5DhtB)qf5S0SJk* zMk5chtQo`xx$P~NeWFnHLQLT!9^4)UcTm_r*82S3Ki&hMPqch>uZ5tIdeZ${4CSJ} zF?kmQK`KX#l2T$!Rb;TA-(2b1KT&bA08a?}fu=!dAnl1X|2ucq6<{`qd)A(@j*RLE zX&>+v7*bf(WdAQAHJixV;a8l?p^Er07KeA1)~m(cUBogzs8vmkD?ki_x-96^!L#z zVqeiaJn|m^0oW`=#Xx)-bVdurGFfm@GXNwq?vz-y8_n<_=>sK0Q?7aRCq=ub2EkAu zq%ml%K_DZH%VrKyc{1dpEmAKUF9xCB0hAl%Th;4Dby|Q5x#?I!?B)fbh{W0lyn{su z9k|ZL`AbZ^21UDJLG&Wbl4suR*SV)8=lnTr%$`I8s=X6jLGvHi2O$(L>>@~0V0c# za+i3Yyl?>=;&pi{;)_}1lH?#G2q7roU}2ahf?q}=_8gU!0+$wI43M?#`XZ|cLLlcl z6PQR($D`=P7~CErYj3>iFI2Xtr_9Gb_OT_47Tvw_{wprKxRK|jCAY~J-Kj49Vi^cB zI~Q+3&;cYsA|!M>S}YpxQ)VV3P^K&RHV8my5G?`{5*Z)_i*D2iEJB80(6W{Qg3Nt6 zlTD!(2senxL+SLh<<02m=!V8P3KO~dXk99biwht~98%;``GB#Ll=?85RN@^&|L?h_ z6jq536{8;PcijL5kEgy8!;4kzi73je;$hS^)5n9 z7`0^Qg|^81?46_-7u*f>Jv;4Px^}4hP)xB_j|KyMtmVjHZvZMJMyx!mK8U+aWx)XF zM4(%BBtWl%wIjvigun?$t~GpnKJwdKA6NA|Zklh%!D8gv@zJoI&-Mfa^NkgHa#*_!c!NN;j?lo})jTd~a z!@yf>G~lh6Bab(tM%-ZcjZAOdiCt;}zu02Pr+&$pQijHYmA%D`pb$MoY)!afaM8PS z#Lbb$Pe;BiU+dhUCQ|Z34N^cTjI<<{#5HQ&s9q|&ulT2G1p%op^4II?;T`%G z)yWby9mn<rV z#$!%`!D0L0eQ?{K@&5a8=M3ge=+4m45S;!zc;TyH`TjIJ4M>1FLrUlpI*rUps(=bH z2|%Vd{<-@3@MMsd0HlBG3lI)$RYu#bq$4?PoW`~=Ru%Jr$UVYWWi+bd+)oqY}&eh!{#-s zS3_BT{j2}=v{O#%cDu%(919_bz_bXac@zi=-W0vkOq9RpwCM)hTIM>e>4FAfJp+(1c+dWzpfQYr39Er#-s89RseBc zoDy=*7PypOz@RFGD*iM&Ub`iPNH(mJZPcB{ra5TL01X943K1x_Ei6xLV-OtTU;s+j zyydQ5_lb!+lA5`9Ot-b9AT=%%i zGT1c>*Iq++-T?zG+^`j-Tkr$qRt*ceuHw5dyzaCjaFSCIm8D{N% z`{W@%Y<&bS27{Xvw(#|X^$sPgSfct{)1?Z0$j^lL*rbMW+C2PNT(Km>@) zYlMi^z;J#RDKs5b;^kM@hx*NpRGnL_o>x-`G@~cxk&^d`)b?m7P@e$8EUwRm(GBu6 zD1KWLsSc``X=DNmvt!+3n1XQCwOIkmgVqC+1Od5MGUq@+PZAG!nx-RynKoA^>D;n7 z`JAHd?%iA2_W&XI$q$4nVixLQN2D(JueK^%q2U$ok%x|I;fQ9{V`>SMW~)hIlDrl- z{f|-sgt3+A?U71O!05p)wE)-30I}$xr<~EZb)`V4Ji;Z zfWc?C5COVxxDuL-5NLYJ%w3wl;5Fs3Po~>%qPuQ~wU1+w!H!9^y8sB984V85UWele zPsNj-1xuDuyA3l_(8!(9h4AfP?urcp)*%wgM6a}vQOsSAQ9=cyI8rx_e0YcTJS}Ot z)&KxnAh!YE6_5DRaijntZiVwUtcgmyi6)Ct#lUOLt_+m-f`~+481(b2V5H=^13pez@lDEQh<3o9}Ge_D0 zHOPcUe85B(AbZ$eA+S>(Ko;61w}_rjexwa+8b7fQmBW!6F}B2E=h)ZX!>dwsH>Qzl zZ|jO-{L?iZD|WT5P||C(8j>c&+v5fF8l~9R|Eb5S*7fMIaQp-=9jNQ6ztbxIuY~R* zkdh;2C`Cw_JLN{yVOK$|k58|wc;AIv_OruYz8m`t0b-Jfd!+bx!)E65y>~ zOdP&JqXXCEvjDl8H`dNm5Pcyv*oWpIqKg^TfZ^4G`Wl2zkJHGLWj${zu7>D;CwP`~U3Ov(zK)G(p@@WI_GWUJjIIQ9_bu=wk{Fu>cRjmeQ_XRy&Q%MXI( z2ho#GhP!X42k(Ln8=x#`Xb_g{4Tm0$haHOxmw+v4W*Pypk^3O9L&?a-ra-tF+nuJu zh&!m(KR`=`e@^-j?*$RQCIJ7*;R-D{ykP)I7G=o*_yjwx*T5KbnS4Cz2FU`tj2FwU zg=Q@Ur?;*0wtjjGfPfaIx?Ajsiz13cX{wICK???K3A=VpdOy;gD3}3&HK5M+RO}LD zk;NJPZWSl6Dx=#gN|H6zDo=%>CarFLbHw)=Em=;`i|=TZL+N9t%3U^*6$AnxLIgxP zS1lr4fJ8A3@(Tm#j-lWc%8;_{wMLzH+v}=uXl)_>KS`8Lk0z;frqpQEG!^UINM&&w zk@$g@tN4m}H+mX=)ZuAd>1s`hxFrtAXeASA*Iwfq*hR%z zqZ?qv0v6Dve~y0v@SV*^wjYxy)rNhgv~0FI-CC&-VP z3Tn~VvVqu8XRc>Xsh@08e809|pW?d4Zh>#kHv-ajVb!ZWAG_hdmkk@c|dqje6;P>p#AWh7NgVJXe|%}l9fjtVD3 zr#tHDH0_b1Qe9|(qt&E187O4ksl&FMd{FG2>#$1HN2SeJM+8!%uDe@&dc{rqM2BQU z3-{fVD}1q-BN8CFSPihLnTm?V?W9n63^-&I8w=f)5_2abK2Sv>G7Jj!Fo0Z4F(MzH zq6ELjo;iaTre_ISR#!@Tj#p(-5rqU7hnXgma+0e<5+LQGJ$epv?F3+HF4|iy>sVoh zhOAmy3g$)VgZnUm0IBzk|TO6u)+dw5|#>JxCQR05*xQW@uFKMWO zWYgu@G}?OORa77v(@w_6z0}SC8`v{J<=59-3mx}#%F%|ofwfa zbSKXU&0|~?9K&J;M*w;8Q#pfO~XD`V2s>M$M<(u9>2b6{FbD)1)dsBle;#lvRA+@MBQ zT6JTCT#qwMQNF_{);;M>RBTKn&y{WtUSCDDc`T=qk^`nTTRx^w%=oJPaJs4IyP#(^ zgnp^?;Kb2XSJouaf!eagD$>YPpl1z+USQ}k8<)&@&Y1|;st&oR;PF>}T*BFz*lzlbMA z5W@*EsmbE{q@c0Vcu*wj3i%k^Dn|_zO9*u+qK7*SF}y+uN5C-eifvSMmAI3iFtYC{-J#+# z)}|B_AzIYn!E}c|D6~;Gt2hE9cU1n3433_c0r=R36pK`AjjE_B1aWz|!C=@peCN$M zvds>fGmg2jc~d9V=nz$|itgqLp*aO(9TrqYDJod4>tA?d#bQz0NMMYlV+25BfKbB5 zZc{jr1zUh6scR4k8-NzP(MVS+8AUJ1Y}v3H0Kp#jNo%Op6+{aex{SJPdgDhJ19Y`L z2NNZxl5}#juPpr~8ZoS6sWv?ShX&$ca8N@8iGNSpKOrfl0C9*JAER=iLs2pw2=UMo z%`M>}6hw6HheuwM)-RWMoHgK3y$xC{ly&)%YEU#da!!K8w?GerwCSs>#l*O0t`a1c zpF0mODwu4x=GqbzO(ZS#ReJddF+=vwqmOFTUbP!e>suhN;j2|hQeUUO={`m3-d15mhQF3Pdq%R}K-37OYqxj9sXLyQ zWL=S_&T#SSo|Y;VYIM18(#xOIW-6l2PL}^6gR0b*_AnCS+t3jP1uXxhBP9wt8I?#C zM}f=!Y@qI=pm2Chs3$I>Y2&&IkXqK%Xe3~(now0S(jzb-Bi*YFxu2=}v0^s`bu%#t z%82Q;0l=tPF$K<`hnWCXMuuXzM7i|j=*0C);OkjSw7e`{IfhiOh^Dsq5W$>j)FU%n z6X3;!c)nTozS&jpuaPRjz8;vzHR8BWG=3PyNsVS*C*ethvP4^=wdl@O8IrXBaU#zGUh%}EAAr1McjK8yNooF;W=Eo6N*T>v+`e}nVph11~Mdc zXK%XWJB?8-@BUKjJhjLG)WoVO`5RG^fU|evb`SvEG0|#U2qvIPn{s2_5j(l8b_r- zD8a%Tb*gfJkR@VWOagK$nq70%3fdmIwe_Gx)hX`6Ik<^s3Ha9NnJQ$e2u8}rA>G@c zu~yb}j6H76S48qM7H%S_#E~Io%LotZL1a?@crIdu5DZ9KcE7{3BQ52g}}6f=PeRqMK7s&Hal6>(Fy z$P0ABVxdvB0u$A#xgwgS7Pxj;>&zWtsM=E(Y6v5okS%ib#*^MhxGN4Bc-x06IGC_Y z6a~@jn1%%^vsq;(Qj4gDyJo{joS^IO$#Gv0!gLCjRMD|#d8PTkx6X1Hh8pC}0|#-O zwkF`m@uHwGJAwsw@FP(=ZTDq1?R8}3sSSyS?b^O6$Y=?orBB>|Wp<%UxrgKwjnOQXu=&7hFtLf2e z1{R~=sSw9&He&nLYGCzHozR#IT##@bF$oe@sa#5+qNXc53EZGylKrdzcC~_KiWIC? zp;2tle@R(yp-_jRg!0Ppq=M{$Cp9$Op-)cmEeA?l=4fEiuwnDD7YIE;zJ!E;@PDuP|T^snY7LqTU8HS@WASDKnFNjF<-p%s zxpAtM)DS?Wte+9-xf^iC0!AEEyGKqW& zA(bC z24Vcj{KZ~m9bCXlTQV^L#6M+@B0vDkg5$J(ILxGmJTZ7IkMeIQs{IgxK4WZoR|6ZW zs;27A95r+gpc41)2_3Dq!pW?72c54us6tcs+tlRAP+_?V(P5x-Ydjbch= zuPXya5zxVCYLKL0@F|1yq+h2P=|*I}Aif9#6Sbq-2z(NJCls+$Fp(yybf*t+0Uoe~ z;OV!{q5>+HH4VPq@nclC7DHp01`E3jD25 zV|I)fKC*5U-9{#oZJJVgx(EiueLj`iPox+xHqU`Cfz#YlwVOZ)5S%MeU9fYcP(DQL=$I8CVc}0ev3T;<1-GxBn3-k|4wBL1pRty0`tWTA8f~dMN93M0lbWHR^hg zhfOJKfR$4NDm0-%gpg=q!J-i|{2DmI1a$5_TU zsuu`S=~`3<`S=9d7J+^z6&<=e^ai`=%?=kJF3BzV3slkz7Rr6FiLK8Crba- zsE8ikKzwNlvn(jq*Q&%8=5v?RcOZQ;2UU$)HJD1o;|g9SqeMY6}g97qL}TBY@(!dzMT@tB34} zH!AUEOuH1t#rXePEEZefo6vL8gaIa(2lDa7##l$odtB~-%V)COJf%NWE&#^kh z7;G`j(M*gWti}T{�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

v(kiV?H}g_(iWZ#qLPU@fh-5&a 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

SrTq}8UNeamb@+nsKtNCN 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�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%0DyoYq@~%Avgna8f1(W_eTP0NEg@nD0U;tl`Y&Jz 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

8_d)4ack;`r~Z92}&F~ zCuIVpT`pp1k_kn@e&vNV=;k&=aGb{gwCfo5raU5mtMc#KoGLksmQy5G=~cnwiJW^k z<@*+Z4e*n-aI)2*6bkMt?pRxis4@~+kweyNEw~nGd_t#0!I`*e!Kh?|LHq=gJiav+ z8IFrj^gmc_qqSP=OsQlc@#a3DX{ zA1NQkCJ0y=)xMqZjgG!48ss z+qFxH=0wA#Kwu;QY;B(wtyHqpqBEJ&Q$@|HU!z3In>i%6o~2PkB~77UC6BC`WMhva z9jLO;6cu2T_p|;~^0@XO(QN&w7b`E?vf+tByR49+XSk-sIq1Qj#b!p5;^-2NM{-GI z@W3?TWhhD50B0Yp3b>9la7##7Y!9O5g#@yVk^PQS*D#1H92fo1_RI(im!n;Z!LQ4~ zMrcZOdE}A6hA_E^sHGsuafu&9;M?b6#OwwFa%2EnE|iGAp%8|{hKq^RBR;0y^T|>k z=2P&(SAh0|JkY!hS6{Apv zU&19B6G79s8B!uiYu)R#%d!9xM)YM%s`Y)6QFtG@*`(ZDQWMg|=2%D`WJthtxaCza z^JG<67Gk2Dmi@%cS(XnE&sKRRYN%_ow^GSL^3}v#LaL!fH}R=1p;YaRj!R5R9(BMKmo9ELSLTO^9xV#YxNn#W`3c7Qz}4KUM9*1=e&z zTw^Fc_AeCvAGwNJ!L9=seP2cOrm7bK-inno4}%|0{eW$YrMn6f5>0ecUDY{BKn&me zx22k9N(rgj-Kh&t(^OkTf(WjoM-(TWe@vIOG5u?wqF7UiU|kwyNfxV%Z9Y-Rr*b

l&^&&2+rrrcC_B%7R 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%0A1c)&05u^W|)8lOK+{SkM56;ZXY@5 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

#f|y(7`;jdh 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 literal 0 HcmV?d00001 diff --git a/apps/lynx-module-federation-demo/design/orbit-control-wide.png b/apps/lynx-module-federation-demo/design/orbit-control-wide.png new file mode 100644 index 0000000000000000000000000000000000000000..5c84b6ea6cfb337dd320098b9cef984b6b5b95f0 GIT binary patch literal 1253726 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

?m&J;$Y|vtY=if-EDzGe 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%0DhPI?}j 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�Ti`5ws2ZnD=wA9JwXS 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⪚d9QKeZ&MO(Qj90M{MyUHc^n8K;TD|yae zdKywv?3+(rF}v;Q1&J3bDzjTfu35JrI!HewLjkN%c0iQWsw#7(;)o>GgRG)UDCjAy z<(@e%no-cJm&1SWGB&Z9v^BW4T-E!E3JJu?Cw2x0%B7%&LshI z(&b_Yiyz*&yPhC=rhC}-agr?lN_ zDEV1FAy)ZfIACG(EQr1&+uNl4ECaxcTp4OswMnWFMn=w6;o{;V|FHgBCEpktpq{GP z9Odib$hjEBklZkh#_k@fxJPP0iII0p=|9qGrDw_g3mQr7-O^MEB2DhM5_}t;N?tuo zm)iuRkT+FDv*ISywoL&k*^~hZQTfr3?4mF!S!yH91mJW%E@wUH1lIK zyvhe=+~P{+4N?va;DA7&>B4kn&$b@@1T7eWoQD#bd$cr}EKTQq$IQ%8+fp4u6`ryh zOXr4cOcocm?byEA_jepTbkDQTyx;xL{r3-lXl-?Eb!~NHa}6PcHej}S>w(*j3414P zGwH!UqKzvJz1-@aqlOJ01* z8~^^zUF@5ti7`^iyAF#+Our}rbEBy8DH6|+h)Cw%QOn_#7&#M6wsvUclYe2RWte}< zrL};WqB4y}%jb6{LZ*}ou~IAPLU8QxvX!S{Iv}YbKi@1bO){v1OL8koT55k793yj@ z7d1_2Cv6wI1RI5*-vSfW#eLTuK6K=}-~P@kU-2t<96GeIzR@=AU;gEvoq3PDfBp+! z0#OqJH30Meg9i>CJQxCPY;LTst$yy(&%fr?zq+)t?a<-F_c`~RM?d0`U_SfaXFvSm z7hU+k`(OISF9P`IcfafLkABp1p8d@K`ot%;Z{Jp;pqA!(d?P=LCs_&E0ns(~2ItXa z%dW}aN9n7`Od!ZaE3J(N5K(AC+qTzUd)+Vn;w%5_2$m&;IxSe$$)&@v5(V?S+>-ZxW_` z)Dr-i(}u7TJtdS;0gGS|x;}1htlfI!cb@jtC;#c6|Haq8_RYnm#n3csNA~~d3!lI5 z#1p^!o$u^Fa7ScDKnTQy+i$T^ z^^J9EL*Mmx+;N}@)5*ewITFC3IehR?*LB;r?I5DrtncQr2N;on5a{+>Z|i2O0Gi3l zp543p$P8|pmYT5tw%g~kRRAkH_UzcceLkC|5rqKeP}8N*Efxh)a?ya3hO~4~8HLXA zb)B<7#e*cIYM0G<%u0?x?350I zt#wL!A3`yqciojj=KHXdNK6x|E*uxO;&dPnyZ$@y8Wm_liRD2NQ}~W*I$9a@$gpx< zb&YI}US{pHn^V|U=7Bp>_QZ?r zD=zViat}UBy(~6%@9r$}0Y87%UVY~pQ6MPZ?H6QvRC9_$jU_UdUVwwlZ~9YgIQ}E{ zl)#9oR%9#3IhVZhAnHpbq;wZbLuWWDpA{@q0F@4Ucg{hrD9vdxJTRQ}TKiPgs)sNf zlCKNVFryw$*~~b8T%$$QxXh6kZp><(Jx19^XVUFDc7o$TF%&U|*k=^8tgN!6R1`RU zpA6YgY^mK*J6BJ1x7V}lUJgxj>6W1t70T0xr!?* zSWb6wS;z22S#cLDmmY&I9PK+Ezl!Ocqt>7pYM$C!a=pjn$R|q6f*b?WGdPDvz$#^1 zba-iQ*oLk(x6m-9r7rp`Yq<8zaFvMlOzHVBs2OJ^*imq{)m5p4DhZ{$3OTEv+iO$Q zCdDgJ zgBXa+foZ-zzvJfp4N>2992tSZSyeM^p)xraIoAQ{{6+lDU%&BP?|jz@C!Dykxp9xX z-|fHu!GHgwKlq);J^m{j>zi#e2^3PrK_Wx7>W| z{sRY&*}HpTW%;Z#@AjSRufOivukSngl*wdr%Wb!Q;*+0z=tCdcv`y^ieV;xf(;av0 zu?y4b6Q1~_$3FJr9Xqxk*ni->2i))UyWj0Dr<`*A4c}c}TuNCPa!}iF0DjC5GNu-#mPH?fBzQ453K@8UiQ~M{HYJY1{Vj z+K~{#_HEm5`tFT4-*WruXPkEE(4mfdW^NZI%w1kyW9G<{rsWvB7>TH9nlFF(D`=;u zo_gB#H(Y<{;GvC;)ppX}=j^lk`R1>^_ONB6&v9fJxVG%@4Gl?AUxc$Ig?|R1FPCt#AuDt5XZ-3`Id-fjF zG))tl&5gCqjm`7VKlh&ZxW|n*-287J_&^u?&@=#1q`Tkk9tRE{ICStxpa4SOb*G(r zmxbx#*T3-%rjSrvKU$sV97 zM~w>2YkQ7KIw*dRx;sKw*;N1kalC5nz0W!KoO5%UL>eRqL52|&L{u=7 zM>43di5C>*70e>|A{hZi1VKfSBw0|&VMwB+88X8R%nTElaPvL)?7i2j-yhvo^;CE7 zGo#=4^IHt}?7dd6?&=CpRae(qJFrGoT?G;2Aoi;v67m2ebXEj45XxavrSc_;BE`zi zy^g@}TSPCgGPU1nbBF59aL3*-GCk!GQ7qo4->}And>hrYE+QK<6sjmL>f5YX^;WCY zm{1}DJvJAX!FstkrTwO>rqb#Pb<&O96Z;)5FcqDE6^?0;5f~(aQnQtuUUdz~)5Vo% zv}tByoN}H9<5Y`*+bU96Bbi3zs4|R=x)Ln`4+k4B8^RK=^c(Y`g+*p+(#0Dsr0hEr z7+}KuDDxz9+{eLcmHUF0s!+sAEy*BtrB3-Y>$`(gjZ0m(0YB-7` zP|_!+k*1AgZSWpDu!>6QRQ9@%;XxrK3MM7mw$PqvY;_o{@Pq1VhfhfsLtqD^5c;7ATvi!1%5FlX_Je)DNNd0XEOV&$Opy zfhu(3*5LCs7KIX-XrQ@exf2vM-0lkQ)Bn1{1#Bsh2b5o=YHQy*M<5l6m%9TwDMQj0 ze!9n9849$sq2VX($CL5&_{K&5@uj=m=U&$zziwD!>QY1QW#D1h)-PZ5jc;H1_3x}M zFZHuIiTzwH*UFi=*Kx;PN9k3eBAe6A`Or_NvyXo46R-Wp*Zs-U|KQfQzV&qT6j8T1 zolPd=rKRPQM~;rW5wSU2UfZ_Xjp+E1cgG8}w0}2Jb>$iZRci zKD$S&V=|?-uL~0WT5+cha+$kIj5Lr42|Gt*iC}EN!mb(Cna9m09&3ZoBN&kCUW*fM zwZsdQ%)&3NlY!esbQpk0=m+hVt4?EkTXYmV08D&hW8(`KTzJoWeE<5|wqY1nS6BOf z7>_1LufFQ`x4GTYWb(DIe|0Y&u_Fn#eGWCzI9HH6pp}$}3JB+t|K++hnx#jA#7Gl~-J~G#U5( zkbXbNC6oj60muh7MCTcKYYnU#DVD1V5z)9KEtO~W1%NRBUk^!dT%qM{tGiZ~j-NRG z<~P6f;~)FPJKy>4M?dNjKmC(Gao0QF`PB5(*|#|ReeZqG-~IhRzW@Cny6({RJ9h5e zf7*e`WJ1gXiLhs65|Lf{)tn(c3l^Pc3o?aYEM9_eLoD->Grj?zx>OWod3~} zKKt3vUs_t?j!#Wzzx~vw?%%WP@jw5+PEBV-GM~@5BN_PU;iHd#+|NJx$xl3Z#%WzQ zx%|>gUh&FT{L|~-xHMi_U0(jpKm6mzJoXW*+qW~1F8;>X{{FT9@b-7STXHT~n%2Y+ zX1E+(4`RfH>ZF=Iql=mSF-&k1=@0u2RE7UWr<5IA^yjvwlcpzKLPaMm0RZg4(EGGnKDMT-A3 z3}dvi!mLz%guwxTtwrQ*-~zW;7nRsM(kzK9Fu)=N3Hhxc_5FT2bEf@ z5aZ0eXLt8h$rZ^2aRkMuGB6Bs1Gi0_L+UDCwM>KH!yaY02{sAu)d=;!jl7))i+QFM zB$ElI^v`WhC_NlBk-*Q#`G>n;pd9LOA$@CRAsRyu@$DQ&w}S)64iceJrd1UmptvDN zkOAr|90i^w`iN9M`kB+7QAiX)KolG$TAGp+!z7^}4WW6MPBz&>Z!5dSZ%pKsr&;{b`|A3) zepI?RK&qvoihAEH(k(#9=`;kS8*+Mau-K+Pd&B6LK^3)~j61pY;!SxjKOqg84F&Mj z|LgOhAUMAZ53WDy*04GLINO@iaxKlCVN_4Kg@7WjG^x$*$CL)H?vl`jd1Y}!7J@yS z=D-y^acNnBuOLyN&ZnSJ1k<4JtJ>;d_%|P&U1A{_hot#cL*LSRPH|qOgD#Liv^~8s+ziu?pXf)cjbJy{W6N88d&F8aOKb`lz5cPe3 zYV*{1X^Dj|x#ZFZJYdi2`uf+t@r~`P>&LFW`j$7l`D{KZ%<(cHZH(x4ZuEp~+-v!2DJ#7Ev*KfIvjHAp%Y_sx?I$Hk-1& z3xfzTEjBZ-CoIcY#mWQ8mDOl3G;aassJ)r>MGp_s1L{jKmiRe488*C)HYDJ2s?Z1N z0y5f*%=neN1rmrn7lJ2r~`R&-#9IJ|Bi&nC5*yANqb6I_{Xe zSwCm)Cf)dwZ+~lbb=xcd>Xo1W{AYIVIdJ6Ab^G@py!qL;*qqPCqcIIEaq(rWs;8Ag zmkKwy{0QKJfWhGxZ)(^z-Ar+9UU>*<8AeGB+&@ryoKc9V?`3mybGkWQURvJ2ci;8b zANsq$`}<%0)n9x53tqTq-|jPSde)0x^uquBq~Ch|8{T~U#PI|B_AW1tXR~SF&q+uI z8HQmH2dR!YA01cw4h`@Z8v4H9w!HGPSN_e>!^a-;=trJBcI+mnpZ1jB`t^6d>tD|Q z=%==CUnlOm@#xgX#*?1##OFTm+26eA8_#&gpFaIhpK<-Q*FXPx&w1E`AF#P`^5pRo z&-jyP{Mr+K?fvh0-xL4$lV0-jm;Km}{_xp1yZLlF6&bpY&b|BHzV}XdOv3BBPKfSw z$2;8N_O~04m*%tiAT*uMN8|D4iQ^CanFs&nU;f4M6UU$boaaC5&;D%l`0OPwdeP7R z)K4BidicDDJnZRz@`o2*c;U02@ux3;*kDq>U|AC<&{GBPjcc8+s9PdKQ zg&@a}2#^K-6TAdmr5x3Gdrto)6-nU0O!>#gk(!K7tN~&Eak(TcAr_!NJQ5{DA|jke zB$5=8GYFYQBekR!k?uu4J*97?k&5J;QfS{Q#Ygq$f=o;`Xo(BTlVn0MTVO2Dm8~La za8^F#t1y|w*CMnt5wNNRld(yM&S!iG=c#f|DNYQ?dS&M`v+cY#&*ZWHmm6h@IH;GQ ziTVn`{iRHvv5L*w+4&@5(pH62c34OSnn`(>bff8{-d}@=0-5Wt>nEymqF0U4SYGi% z!ha-wi9llF5>7Fua)2Vw)x6jk$DF%_(gk(#o=IT09|sOXTFrY)eq%!--r~wMS)nuo zqg6ByWMwJBoVth%7Ai+p26+_djkCf)MJU2v?uAVnrh81n!e$JJh^h^41%yo3AzVQ* zLJxYAg^+5vL?6k|TBnvvTO4SW$=)4XSm1Vpj%YFfAFarMbLVOZ{-4g#)L;34Jj_FI zW~3o}f++B^qA*T%H;EsllgnC43XBffS!~Kk*987&mzR4JvWMasnVi~x;>hiI}K{e)*U&(sGHVD+0^?e z_mfCb{m3~R)zbM1`r|-uzKyfP(^LmC!sMvpN-cunrUAuM`M@&Lctj;diB0ZYv&#Tt zLKFh~yMjc4?XWs3G2PLA(nH$WJqK8>{RSF$ZUa7C+!$SN-MY26&}o2tCKVi`>>`Lk z{bbNaz>kVra`+|EP|AIeU&zoO?{!=%wJ~uhGgdhRY;%>d5rCqMD}|fX{)MtPCAS(j z+%v_3Aj{Z}?C=1B4e6sHxWWW8vf7(?>tz;Wxk8P3~~J+dlXC&$`8}&K`zAhJi=CZFOZd8uzn-h^dpMrSa*f9bBF) zedr_SkGk<6{@(ANap1tN?Q4Jh^glW8kq@6vH^<`%bGL1Eb=RJqtLxjp^yRN!@TD*P z{_p+XeSY}9W2PU!-;ccU_5b+rhd=bt;iHq$L}X!li=Ed1{x(r{bqp=cV`ZI5w#DqG z=FU7QPH^BBdNeK4bqyRMhfX|f#~?r4kG6zBil3~BzR@W7LqL!4QSUYK)U}}oyGI1* zgtbg7Ix+=g@d!l{NHCj<9D9++ozv)+JXHCe)1>o_v%;w&F$}S zhv&cOMTd?Y+p%N&jvYHz*4Bj58%0Q1x~^MYTOIm=d9-8Kj%{n(rqfMg-nPCr$Uq&h zEH5oDk7XFT(TF=9b=}V0JGZZ|fAsv1U-XS{zVt6%ddEB7ad|R2@4WNg``&-M|NZZG z{KQ5#8j0mULhQvAt5K*iP!o&8irJG`Cwh$2XzAZAyiV-L-HBv}>q88KbOu;LeadR3 zjMi+5K-+`$9;UhA7j(6SW*0=f9U-@5ed*|DJ>6d@y#ED}>{Dsec{*AAH-O^+-8jol5+4a|5 zf8^*f=A1m@j!$izI7~uaN-L$OG3S%<oUMaf*bR z5}Gqyt2@%}I6oOpDNABRu+vXkj12tgI-)Jm9By_61Kq2t2y8A}u-_wka~g!xM(Z-G z!|1Y}J^o3p7HFf()MM;e+gM|T(m;+7ROijK>P8eE*W>}&;f)iP zLg66&TBGvXU#~U_3UIW7yf#t-VMPd_VO`KJLkM;#bHKm~bSZl-;5|JN5U=RIQ_x{% zxKbXdceN)g(JiR|hy)hqv zOZ{}KDTXcQuU!>K7kyxL>;^2aO-RPD1B}@TDv_C z={SmV1*1VDswz1l&<1z{2d?WkSW#o+l5FRmTM}GO5*BbcN*0k2D3YjNc@?LgW-fH6 z#&dI_we4;FkU;y4VKpFz0E})#;>T1#?K^k za8TKL8<5>3r0SK@dpYx|K{{R;EnoJ@Fa7<~{`~F_yw};czxCRl9kb0--~Hz0|MhR5 zxadO{tc)i_c^izY!6hvc1VE_>h|+L_R)Ku`vcvmn+@}CU;3@P-{aid z-1asXU3~E${_!9G-)H>E>;CDVF8%hm&p!JWM~@wT)vI5%ytGYZa3>=rZ^)Il^esuI z40oVXYo6GgO+yG3hBZRY8cjG`h`=i=3d2yMeDAG36k9|1rT8m~NN$W$>P*?G?}n8O zDc~*gp#h66a+OdiqofQN!d*9=&3^9>|LEk###5j6)JH$+F`Lub8K<2#n{WQ%AN}#a zzURHWckN;tjvhZTpU%dkQ7=6aPdBGWjvb%(gABtZ-@5pL5Bljle(xPG`uauvF!Zy2 zG#U5(?BvOf`MhVAei%C9*=#zUPRA?DmtA({(|-T=pZScZzxK7Sz5MdazV}Yw`{l2G z`MvLb&&tYjs>~8yG+LTGVIXf6Iwk%i*q4{V*c`>j)H*O(6F2S6qgV* zsZyxFdU!E0M$>nWdhXy3Oh4^0xJtzxq{=e8j__^5oz6U%&M8uYc29 zKKoyvTUp&E#LT1F=BabfIcLxAoxk(6R~$NW?BMA)rLMdBJKuWyzr5@BfA6Vl+jso% zkNhz4@ZuM}bk+}N-t_E#)_?HB=U?=VZyeaazZ;E6WIP^q>4iB;-paNW9wpj3V(vzx z+2+RSH@WG}ZhqF6zx?_8-uFk>*Vjkmr7N$z?C6mrKXjiTy7?`>=RF^I&*L8VsK0pe zOWyLfcU<(%i$C?rPkiokpV_*A_A1LONb|0rJHGE8`U|4)2U{7#_lMqFV(A`Y$S=G;8MAG-&5+t+-I>CRi64; z6}fY}0oyLlTJ^MNV_xpM8CB{OL7RngnOdC-$_ax^moXvq>AoDWOtl1DgHIt1gR-_f zOj20g1u#-Dtq;*cP%PtPP$dG#v-mJS#fo=?zKY0}eXuarR+t>k7peuisufAKfW((i zWloE8z7nE1I~LU5i0%$cQ`Jkt0;X8jK#G?N*v|sgT7@H5-9tDK?7+8Wd~ieK9J_?H z5))c_T$qFbNqY&3;>6W>idgB!V~}J%3e~FRkGwF1ZG59coudupibjqp%DsCtqM1YK`D*eJ#=zfW)EVlqONvlhSN;exB6?MJ0GFaE5f z^0=ITeVFb=FDWt4;F_Q)g3AQVb#b^Q?E68W!C>i-5zU!CMAJOcsE%3is_IEEYIaJP zS&QMm1rxME4cc}Da|d|10+>y(r*8q=lkw@#Z_1T^Bdl@eRb`&cewr9`u0n|ec7)*;Yk;L*byAeAlIye*0ecy4R5-N0wKXU+|Kb-1=W{ zJsbM9we6q!)Te*tSAO-Uf8r+(o__j!Kk$Kfz58FkdC9kS@7yz+&3sD(cpF1Ah$qzw zOvi1*%OQxto2W&&0%RmoS8rnXR$u~OELN(YYWL{L&GQ+2PR*SXF&NEL8 zXH&)-&Aj1_F>ROng^fhg06EZ2U>Z)YC@tDOV5K0aSzIN<(1#vzH8^JU;XOUmDQ!C=b=%wC z{*I4-;**Du9NoTs?ZY4Y_%Hv;uifv*estTmm4AEx`~T&g|9a^9!@G9x>gPjF#<(BV znQ>{3r37mnm-3THyjx`KD%Uc`*eL?JyG(o3#O@Iy5gCSoyG}@`#-s5?U;F0Yy!vnd;Ay{o_}J0sJm-a@aVI4GFpvy`3}@ZsEa``DUUKQ`+S;k< zsg6h8Xzi+NzT3}cYwK$_z1dBto6|$rA70+Jy0Nh_o-B_ildG@3>cIZ}G7QYz&wK8e z(gcQqnL6r7a`I^ChtYT}GC%FW{@HAHzx)5#9qxG7wQWn|@n|~j*H%|9z2xFudv^W% zzrFu?FM7$N9)8}v?)#&&&5bX7{_`(<@k>AU@lTA$qxAZ(AqQDSAY)!rO%X)`Yfx$2 zCTJ;9Welj2NSR1PTb5jPtK5TC2+1DQ$>@!LELG65xIq`(z3A zhQ?J`b5!~r0#_hz(HZ5IbDM2~p;)M4NjeE*e8?%4S$_7AU_mWZ(Eir+$|Vqf+d_~K zBN$kjHL-;&7DuT*V;8l}7DIKC%K_(v~APks%c&p(k+Du%hOOX4p~aURAI?B;@{}xm_*Z?o?`c0}!I>Kw1v+vdRSP zIAkXacq+X^v{>+kadu1^#ab9uFI^TS;L?VhN7d-!5Vcj+?Ln9{RcKysKlml`OX&&2 z;7N;3wz`;_+WdiIVVuC=6VT%=?uvB672K#u8>OZdS97(3j>)Cu)XMAqY#`Dn)h4pW zKD`HX*NuC@`Yl&S1~Lq;E{^7KA>>=juER}-U5*?K&9-xVUx$Jib<|+GI45NoP{{hY zu|1DudWCDRbh;=DA;!^(Yy}xbsBIQZwL)FsUvG9QNYq6QFUjdfX)0}VvoXgt2`vhRHH!Y`A^AVb&X=PI|YukPBpW45_D8IPya z*&E;ZhPS-=&3!+N$4l3Z4}I;Di+1hWd+fxCcfIS~>uc*P+qTId-Gskz;RW-}>E3<& zx~}Vn@w?yizW2WG{lm}?B5Uj0-~86M?%26&WqIYoFMZ`RpZ)xsf&6?`q&6A4%(s>KP*QL3J_Ww`Z*jtWETjaD3`<>O&O zrCUKV(8kjsqNo{Ev>HJjT+JVV3n@|tA!tz6+%RIP{z^d;{2C(@$uO+1uWxK@{PRD* z_04a7YuB+1GM+5$+OcyO`l0W;ZuE(df1C!|xpUVrpEGyY9J>CU@BEjwZEGuQ>)*Qc zvM+!6E30ekD{Jc?Isc=5KkVMMXJcdfmbblqZQJVV+M4vkcry9Igjc_Y z3#B?G=B;tn4Vq0kwLS>-^I>y7ot`?izGv@jI!!MMXYSI!and~!@Q5T#ZN;FFm<-x1qaRX&~?1Lyfg?i(P%vGGU^T@Lr2n$CbNEXd1dL1Z+y%9-t(_Z%PXVt zm_@F<;)?HHbKTX~TzBNqk>CBD-+#y3-u8Xxo^!j~-1c#geawq)a+3!==pmP1amCWo zascN*7{6kxC@3&x<16gVE3TwrW_HnFTSEea^5AYOQ}%6L${A|bVdHq{v%%$tB{Q^* z?oLm$J*AFy0p6_`!KEv<0aNGr>Ls`RWG*r0_rSqu@SDhCQQ=!~9HoP56eCYPyRQx= z-&l6WnG}ZwIEj5W2}@*Hd}2&%RNlnrUu?AIh_)XP{60_!aiDfAHo1}=;r5958YT#p zn>pdD?n*==%#o0|zp-0j0>*IcvY|xkfD(p^5vIh1P3Wi%B2`3AI6_g%BQDd#Ja&B- z!GSzziy>k<ZstnzHoYse@*yrVd}MpMtXuZK^$zMkb=Mugs$NRWxpEmV;!m@E5!kCBc>?Z&~Xj{z=)5X((-Gn1sEwDdZsG~8FZ%BG;0W8&RL^^ zKerP#)-={j_$Zo~Jpz=al7IGJb#fJ|9GTJ=OERD@r7Yc9a*7=K(x$m@XfhGWO#0De zw7$H9IwIj-WZw5A(sc?#@biqB6az6eH71r}=w(=5T0Zm4GjkP5{+(#)`}u4-B_SDP zX=&;7gJ(?VGbZlFoeZ)r>+`-Jb)(Y`p4RvMAbrQ3i0s?5n~3{)KMcdtWODk!1M|M8 zVVF#o`o3RVSsi2;hJMeEox;@j^Z9(*akpphJ|XGn^HDeIM%`>SB`*>qr(2B4Ok@Qw zFhRk&W?NJZNZ0J0gyri19C@W&JEA65+%<6=Aa?&C_n(eV+=P0}e{y%p%dGBO1YMt2d|HZqyOa z`o15EKwymwM&F8az-tXMCtK+Wk`>yLw zKX9<``=Rfdx$pb+_4OUwcg*{~@8?XsXV2a}d-l%f{g}BQ`q_NibvebwFoDb_b`6k{ zli8tz0hUK(pDPS6de+JB^u?Zq&Y*S5#Tu=WOW3xwGFck$-LZ3Rb=x)9T(fKE&gJEm zdEa-;9dkG8Mx)VqJQD8GUekCy8Fiy$$BrF2di2hBy3_LVQYWh;CK-gffd(FkyFv1g zT!9{Fz~s|R@2%mEiFp|MY2S+sOUsk%uRrpHCp_t@E3V$YYbPrCzr-F8jU}9 z!G%2Hd)@2aAO67mr?Z_MQQyz*`2*)}ZcYzfd;M3w_@&8Ya_+fzzu>d~)$zV#hpzpe zTi)hYxB8x=$Bu~5eCX%Hu(ECS*s&vhKR_^L_jFedjxu&ilUWXg;4EKYna3 zeDNjUo^DQ09zXfkx4y;rb*o$7?j|?6`Q=w!@pC`-&?~=l<%d7=zE6DYBSiFp4}9P) zZ+!h-zwgeMeEZvz$r1=u-MxFSXiK$@z&Z5X4GgB_nUjv7z6lkL%L`#AG1_QLF{ub! zvr>xH8ag;a1%Xeos+bNBQniXUJj^9#-*hZvIGCujE^J?bj~5CI@%eZh$^NWjc)3Ku zM_`}AaxuLy6?4kmx^8(o4qfp=;RQb-I7tiQVq{?rygPGr4W<&*F5#4c7ZOg#$I-)f zF%h;d4t7%0oT_sYuK$3Secpy^5R)Q3fl~Ev}@GNg)mX(tBj{y!2jNk0!uy zwT^kqG969Ijg(NSf;dbDXkZ@{eTb=hOL| zyG~@7P3J}nGtcI;j;Tv)K%x0OU+p>?=JVNn-i z1XK{UJ|J|UUor^f9Bp0!U}T~CCRCzIW06I1bp|_pqNc{#qup?T0^|$9%*dE&+#s6I zW>7J+d!n#g!Ox$e4a zP8>ga{~x>GOJDNB*S-EtA36WyhmRcFvuF46%5vWiGW5(m>PAF7nM_7Y<5L?O*BrX` zCTE@Xh@U&}!4H1mfdi+1_(SiTPG`(CknkYHJP;EN#Ul@tJiMRmh*MIjn~X+F%gakk zONnJ`+g88u`7f-k?O55iGW7Gl??)X^md2CiZU6OOpMC!aKk{3@`5WK5_?sX3$j4{1 z=`Z~J;($dRK&Rxs_`R0%dk#Y*Un7~YqVTO+_a*MhXom5|vnK_n{b z)ewJOQR;nw8(N-Xo~@-yrgUl7S2tyGLydrxcI_fpSCm_Nk6=S$Vx6V1j_XXV%Q6zH z&0^sJZ`eayF#iDX)F{sO+<>}tE^wJVzph0Wh*cWsG4>dC(~8dgi@heJ5ti6|i|JLt zhBf8D>^zjOeBz#RO#K=Kaf8Ca(bPx^1yKtCo^jxWaSsi|?&HEha9clnZxyv-H$&5` zda(WLx@wuDf`1KlG4TTnoV}E?SxQMl>(XBs(}K1W5mxyaks4@~o3*w`A#lUz6l7rIvUO`WK}?d`2DG$4RiK~m<-EZL zaAkkN2vt4uciZ~1{U&&}y_|TV(O$G9a?SKOLdK)wpYAky7qi}XT8TsdJ#V_-D0GP9gH*RV3r-7tu`QVhu21bZ|O z&L%jq9g_m7!|iIBskl`^AhRjiq6dEkld1eFSz+^M4>T%!0tXKKtYv2864Z362i9vA zy5vDYb>raKkGL{Ns*)lW_8XM1oOE$fHQC|5ZCKSbjTYrt6q&Dc+q}ttxLD5>BdMez z^#I5kR*8#E7dMc=jvV<5$nZe`EG1y&g4qx`hGoyHXCpTw@{v1YRfq*iZ72b&^NXw* z)!^oW$|^6!o&{mwI?}!hE?6Jn;$REK8`eCjo+ZQ2QS6AwvAtiGmU zmYm<@8F10yt1$F5u}l?nO3(~6XqTbp)aRDt5>7wSosvvlH^QDhwoVjUs+KcD)5{}> ziMt%hY9wH>c}8RDd+T$M!6S&|o+L^=f*H8ZD0y^k=FJ!`NiKDgcvC4TuuIWig2}00 z^J-gw)YP;&u@PFXFvP7jZ-IAS69=|5HfX>@kILh_19guG+uu210ML8 z$3F6Be)^}0=$~Hq+LyolRedj`Q741t>rz&;+D3q_h@7D4IuTx5U7Ppw+2*wCM#M}s z>^rbu2I+@6(}eR|ig`SqoZ6iK@zek0#V>mPt6ufjU-;|=B65d2-Qi7ddegI>^_ z{_a&@{?eBZ95~~XpZdgm-}iyD&OCE@W##aZBj5byHy`?t2R`EA5C8KQz4!&sf8Oq$ z>%a3mPkrp89<@0=b-UZ#`ob?=_}8y^#eAUGzv&I%celI#)yrOb!RJ5ExTS`LoaIF61qdOUG&Si&t9K1gO)3?>?)$7`h}w*!y1KUH`rN6dcPR&7Dm z)n>G5fl!*{MhB&_62w`owjkLthJa%cwb^2c>JXvf_Mxj>s640l z>Af6pX?B&)LG+~kyUK>;nY%roSwW|8Q{w;MkHCAWfS{OkOrwM@s1aN&7|*(FC{nVq z9O^a3X|xZg%+A{h*Pxt5KUJH?xn^e+R3W5XYhzJVb>uDgL!@Y(&+*nR;36zQfw~(b zop_I_YgH*GI*$r$xyikXc|n#17i%h+LKj>zw0)b%q6x?M0uY41MTI`<_JZ|YivUX( zY?)<`#X(WowAeS$;8#O8<<$)4i};^cE<{ABN+$YAZJ(ZBH_yx%Ayv@Hc7Kzya^-J> z)K9ZWY(v$MEj4Z!kl7!iK4i8kM-Y{~BB})m3yuav*`*RcE4U>ar#PJhn__?Dg1MvUPV6zaTd9FfRoar?ugSD=WQi#u`!wR?sIhHxk@Dm zB^)3%bXvqBI5AONM&sAWyoUC`^b~P2rBW4kUm_$lcyIWkpq$;2X4p{U0x+elX7c+N zM9S#bDw9Xxkf5+0<3(>6n43Ib(hBnDg-fn6mHJMA!0D=_U#O1{$|Gwktn^LExQe3| zM=2X9tA}KU=!)5Qy-HLI;erw@5L4uo9J?H>O=uQipuz(is4?{tzYAI_LLD;^U3cB#yWH`%kAB>v9{ZTb96WgNt6%%-Ti^cncm2z|Kl9ly?A^WR zqHlcp%I{op*K>bhOnk>X+~EYSKDNGdhsYp< zY6D|v1O)2q8~jAav+4Zwg9pyN`}ckBf(tLb?6OfeQW&Q698^D>-}~P8nkwZ6apIy86{O5mt_I0m){mpKE(>vVh z_W$~C@7*}Lar@id_MZ3n{;ywj@y9=Q{;An)=i1u+?*F5Ayu%&$?cH|pv!I- z5>vQ=;FP2WCB>hGls6}LgU8lBvuqq=6O0k8yOwZnh^(6Qb}u(_q$m#b7)4oD8C?ZF zG-UceyR?|jI-)9$s9Μ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

Kdk-xFS%qs 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

;3h+-}#=u{;Nfc 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 uI|jsr0(NhERr*LCt@~-6{1C5Dj?{;#x}N=6M(Y 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

AD%UAX`X`-Q3` zCd-1tr`Fs_JMQICCEv@~WEP{>987Ha=^7Nd(9 zQjaoXUEnVdi-*wdfPb(Ini+#+?XPAugV;4+$M+`h;0(?bKRlXFM4HIM16S$QID9g~_on@G(bqFEJZS{36kg5;f*b zXui{B{;ki=!*!R>7H~LK-+B}KdeH87Kt;a9RiFKNqHQyc1i%W0=g56!EZxtF3o`|c zPhpyGPxv?gY>V6j0g0EfA`i!0b=39!!^p<}ts{4T4-t<_9gr+mOZrsdSr5jS_c z^)}DJ_{Bz69h=l=X_3cCXuwG~;3yYpZXLTCZ+F^1^{CT3og)1c?v3(~HeLlTwD_~E zT+zdCIc(8BX-*Z6Z!}8Cu6W<}qT;xZLKFRb>BHgra8>42V8^g3Vx{MsaMFn4-WP}t zMF5Kp} zxtAgSI%@PU2G5!X%dyPCo>$Qm+1}+)!b}~l2&y5H`0V7jGh<|(Icz;1A&L?NVU_&@ zCo`x#R$0GfN=W<_(O2Kc)mr>w z0|OVN_7rqiyLMh^Ui>9L|jG!4Bd;st?)0(MH>N$QCwc z397AvYV|eNjThNV!CJyxM0_HPSfPoIVp=0{n4;mshD$-HN|efkmBdqU7wlx`(M&Mo z4)6QLK^;+~Ue0+YXP1OB*=oG(Xjb~=^LM)7p{DOJbk3*<44LuyLKi2cUnAfDx?ECI zIYBmQQ8*vDwB>SnKS91QteN+i4CH4z_)G(JWdt;h?7msuuGphz18W}WI zu7f>3{7X`^n}QaCe0J&tsW{P+lBtz`%ND^LH#ZbxPnF;OJ#{BWd{adi1&Y~p%a;DM z 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�NyA~Qo{STqnnL6C?$79vqbCO}i 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%0AwB~p;rwpI0Iyr6NpQ7%wmV9a9M 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

lE=(vn+UekWJvZu+D zhTu-_Xj3E6QmsvxqUKSg!b>J(WNX5XnutnZO|IskI za(XC{1d+g}w?MKpsIsQkgyLtRS5~ z7@V4MPF{D{c&b7`g<*K!P;w!Nv8gv!GuYl>_O+?iog4hGAtuYM++}9V0lX}M1koj% z>}(~xLA+&^9jPQ$9MMomX_ONO73V`|g{?V}$)Om`M9?rPyQ;A1e7!Z51Fib52$;TpKuAdbXNcumbv=-K{1;0DgBtb5G*w1a=|-C`-T3K6|ZOx9*=l@PQBh z%STu5v(I3-1O(M@)n+bth~;Q--V2`p@lSr@^wUmj=Q#kMn&Tt<)y&~vVD#-_0YWdL zJkRFl_S|~g?dP6*PPfyVU)Zx^dS-Ulu1>r2_TT%x`yRMw(}NFu?(?6$`DZ`-w~zko z+}!-HzUFm@9`y_lK5yl@%eqtDe!t%z4&VH1Z+Ok?Ui)`{`!_ph_e^vr-t|X+-0pRX z;b_<&bUIyd*dGmgy)IEn&ik^+98OO5X6I*j&o8W4vEu!I`M&x2J*!r&y!E!*Zo28G zD^{-bzC=KDp{lDOX!kmqgSkDkd6s$dMOn7G-JkvJ*1!3?zg@q6Utg9xcJ7#8>bH8` z{?dR5C#NTu_AK-|?GJzOpG(R<`jHPW%+DWo=wW~M=YPJ`Uu?Hq4ztpi8KU!kZg#hG zZeh>-`~U2Hmwfl)v(Gx~oO93p=!gILH{SH-O`9K^=ypqADx*hQMNoUoMmlRx$tAQg zl1_JyK)=M`KvBp9E>+IJ8Ja9}naj(f@I+A~m`Dj- z`9u$)WpY_x8Q~IRq-d&!&D99PX=8KMUTzhAG)%5q143E)g35NMJ1k1)oXc|XSe7LK z__8d^k;}4Hr(JqaC6ORm+L*UmMNtq!SrmD@)o!;5AV-%0c@Je-ltodD zM&6eps7F9V^1i5EG6X6{MSnERvK$=(_*N@l>h}>4U54O2m916>0kf=?Wtqba0T96x z6{7;3YqeT{-~ck00l3opQBjchWmzC1I2esazAU{jz4s=VK#>hfV>@FxbHpl_&I<1^)|CD@WJk+dd= z$FUJG1&~p~T?w89+-01ql5`b}@PaK33y|yW?Hb#Z4lO?qPZrh>#8o;mZfXEI=Ea3* z%@d}UG6K)&kdRQ&vqdi4CB9Un%5Kzz5{|0%pMp6hgpKKHv8e4XlA)ZtxgWox{a}WP zRJBPc(~>nPX~W~_++IR@d+>+(P?v(S0$4+;p+Rs5I8D?QqgHb(q$yak8??{NsA2_E`B;+?kt0m?Z1EMK?fgr-~q3F&1-JB@rGlLJN~d|95EOS%F&?o zzSo=BfBnA0h57zq<*~<|@ZkLqeECaX0)S_pa@y*>S1&9qc%u0|3$0bHg{7ryulvd0 z{PkZy=eg%x{=>_srY2wgdv9-dTi0HH!@4zVz?Yx=*vId<{}pJ+$eehaPAm-5;k^UQM#JG5r=I$ZBaiyzr#^M{<(FS_%Cmlc-PMO2wBMcgJ}}wqdGg3q z6^#{x8XcQh8e%iew*up>ON}SJ#Nnj6Mr}}<6A7E*2b7Hh9d;8SxmK&?obyEJfIOAH zh+QHeq-(9nIaiEEJGbp9DU_YGvV7&Ll>q2{3Frt3$yIub@!addU~yEGGgB){U+&nt zZE||L-EMpGk!loub(3+etUqypAQaN^SfC71EM35*rT$(;K>wCTZ4YxUgR>_G<}xNgnrn`d|T zhf6zWcki?J-owEXAT1W7Vz{*TK6?#{0uT@h5n6dx3`Ra{@7}p%{od<3?RF)IJ9h1U z){%#0xm)ZnO;1iPEX+x#eVzl zyEMPh%2yOH8jS{r9CXlN*dL7sh|>ff0K6w6?|}dybFTWCa3v6NFF!Gx#xytPy6lUl zrah^Ufs{UKpQrYLk=G%lcVZHdYVI3i;KkN~Y^R3c4k3ymh$3)bQ1-hT7&#n@5Rn=u zv_q+RVA19+9f;dT1`Y*|+@@e62x>7=XdvB~Ly`~Wq6|g6coaf|b5AT>@_uwud?Lir zBP6U)aUYRYIrE7uubQOG7Qxk{mSC*pvCfI1g^XiA6}MpAU#abXb54RR4U<4b1IBFt zpjK^#Vdk z_1X}zh*>>TrKCaJvGtDWI9jz35U;Ips%NpnP6(CWBT%o`>rGBg_IkMkK!*;U za}Kf7>rM71I-TA%*Zky?OD@ja9rE4-6vb#*3=yD}x3Vnv#gG&UDXL|hoTVwonuxt# z_oqMm*#|%T(Rcpg+fO_7l!qVMe9Tct9r=tSzxw5`Uh|V1*6y|XjypE|`zJnj$A)_k zIQYO;-aY7$^(UQr>SLQXZ@BlK_q_X$k2~(zPk!<@6W`b$}!d+%F$zH{e}fBx_XKl~5>{Jl&5cW%$z z+P(JPv3=*nWVh4pe)=XmEOtoGgy$UpPs z<4!*D#QvcF?svcI7he3ryKcMZ=#!4U^vWOIe#eH%iOEqhV!=%nJDNF3%Y*2&dfDG@ z#1SN6tZ@fwPfy>f$)*N_L)f6271t5bIXAbsXSmdN&SiPt?zDT|N$94n@ zrcONVh=(40sMzf@bOCpt5qJPZM1rzP5kmD+4Wc=<#vIe2)`vj+Arw)1KhfIIB2kRkC4D&7tXlA429DQ~m7Ib5!`Uo&98X*%g%bvSvTHz^UUPbi(d4?qmMbd z-|subVShL~JA3pqj@ozM^$$Jt@KMh=>Vnt&@~9|^VuX2q^DQ^O_!nOIrZ@iD7ykQ; z3kwSeA8^ng{PEkbzUrFmuDhN*OiWDdx8M5d>4}xARt}3ntJ5Z;Jj>^I&tHGTjpx7U zg&QAu;Kmz%IvNe0cka1oob~LBFTQBlAE3iBq=zD@OY)^xq*0O`i#5UcNgWI+4r@PQ_W@Quc^<5U|dYG zzIemEuO3RbOzJ6` zg3mgHl$6+uskiTQa(A-x){t!i)V9&knW1!?D>|SIl;m}&8d zR_yMS<4OyPQnbK!Nn7wzjn2$2>UM2+zc!z4*b(3VsYpb-G2U-6g6 zOrTy}-ey$*Btw|kOf`7)8nLC;FzxOHUY+)^LKNl(<2kItgP0icq&DLNioLSIE@P0U zaHD^>C>ZOc`9NkusKvr5YU3s`-RcP%lVc3@3oOB!m^3Iyl)FZ6L||XrjmRjoVlq!q zEz2@~BZ-L05CqfGU@#gDhoj+OG<1lF89L0ed~VzJ!D9cWrJrqh#~(bgZCkh9ZMR@? zajDhmOtgDtG1|Rn52Blz>~(`#k#i|d)yV!uyf>Wgb*<0{dA0{c8%3ViZIC=C(>$8<}nJq|K%o<3T83)kXB%jQL07Y32^5S*xe8brP(ZOC=WmR*fU@8{I7lb%j@^s z`+XmM-zWb5lh=Ls$17H>F3S=ztFSCaBPt8TjJ(hCJa6RySQcej7EVVqLIfnPnu%%u zpg8FIOZ_+h_HSHp!E68i1OIr@|9)@%K6?*GBcK?*G}sfn0T*nJ+R3otS>Q_b6Fc?r zC0;q0>!)Q>fU%$T7ZU5`XKe=PqY_HpM zc|JKcnPun+T3NQZu=wS#e(iVO`sP1<&!24C`0$#wt5>gH^x?s3tX#2c_w2(DZ#w$uV|o)k@^tB?mmhQVGyeR&?|$sj#}7I9kehG5 zaei@O?YgzCJiq&{4PXAsS1)+&YmPtexNX~a9C*M1Tb|f@)sKGMo1B`PU%ct2pT6it z=bie@lS`t1{KpUO*}Z3KYO2$11Hy&h`OeCjskgl4&F8)7yrS@j9CGj#S6=zO?|vU$ z-fFjdlhczE6TTp70}-^l?bU17wA*d(eU>>JbV}5%-A_fYG^(mwJ4l2{d9}!2;PPvB z!*Me-9RmR5ttTBY=(vyLGF3(c;%>qq%c^<=Ac%Xc$bU_7SXQ68))UP2|_X?ug(B5#R&SdtoWrw0*zeMl!J>#h(Nu0 z!Q8fSq$v^+x@#@3|8P>QLej~f=3o(6m^egM)fxPlL(oKSr683`DQT*k zL0+J<)HawLw)@Ezlah29kf){qHb{0&u;W3{u)RrnOv$2rj9J!(EfFoQ{E^j+O^C{r zD(j1}^e61~8MiC>jOahr>YXhp0x5o^C3!Lyr1wdCXzhlQKFSUuBOqQW+C_|(P0V3c zF3yu`dq|bmF{4E47;!MZAW$`3h--rLc^p=vjG{#o9dR|@m_TpB2) zV;5=&!j|zanmCLX7aEv79;Tlb0_`v`HQ)B~o)E#4uiR-_dIIv~0X&gIAo4IQhbJC; z>;A+s7v-CO!E6Qoq~lO?0PUbpClaTzlhR{`LE3R<7wUE&S4}e(@_`{I8FE zH-Fb^<)eOoI4thGXG6P{XD++&I~RI_ zsj10(@4N4|JMZY^xy#_PD=xq0njiNjIkEORPH#mT>N){npO z!(0C6+UZWuT8_$BQok5J^Ze7!f6Xs^{vSSfe6TlI_=s1o-Awc-oE3jpZe0{_dn9k@?n1oJQPLI@Ao0c ziQZJ6=S5MttTh@f?cBa2bJ^62>2{}Gj0%ifLl~VSNx?%Exhe7yWtqGG{`>adcb~uc zo4=f!pTFkXYuD|y*Kjzj0=(3+HCcZ#z!ifN+OwrXN#w{oQ_%?J05Jy_dCHt19yxA8 zBB)am!iYLoUFD$26OBfrZ-48OLk>RZ)KgD=^sz^OeBE{T-E)7p*F}PFUw9FbM{q97 zh^WP<9FW8pnki;}HK*KA zu4(y8?F-0iJAf=P9jK2=co zv`um~1(xDP>#;(8*y{2Dt(0C86RLPi&s|S?B_k{gzm|+~U?vnbIHKX4!AQ@UoL{yK zLF$(-J*Xu>%y?-<-?9_wC=6o27=kjTzWTH2o+y!?l?+`aelvz0qi1Z2Bw2N+Aw-X| ziuIkwYARXTiiWek>DHkrJ=LZrB_h);+^GBDj{3dUgDB^e{<_;T`Zho zGP~9^cIPQ2MCNYfweD`;VXBr&75e}n63f4Dnn>3GJiAIEk zbZ2vppc>X#Ounf8O&Z2=wS$N<(^O>j6c-C-nrdi*!YZlt84U$B$%Qen8RuC450}*^ zraZ~#gxn3EDZOdB)Zh_+SNHV-2rFn5-Rgf9yd-17Jrkcu0N@n4jTx_@B6a&z4+Ii6 zH6d01nzE>gJKFB33`^YPkM;Fq*`0z?X}bcUL8;Lmq)`JGwWqH6xdeFB%!s#LQz#`9 zshO&I)Fb3JaYx%m01!IFJd6danZ!tHiZRY7KErCtbeULfJ5}qF>TCu?AWuL*9?$_H z3OE zh{9ns0aNPX0Dypy;>krpDCZ{l7wfAs161zw7Y*^qF8&P7h zIgg6M22zZL_zqK}yUHW19K6=uP~=Z)B1r2ZM=AtR6r(-!b93{HKfdPrTW`N(RE&nB zQLi_F2p;^;Zn*_LwA!u8brV6W)w*xvgBv$(%JbZlFALx4PB@2UQMB^b?%jKSc zRz}_rha-n>%QahD?T*Wl3iq?0-+JrMZ)>$%i~Xf6%dWriCPZv^+Ahny_c#9Zr#Ij7 zvsT_Jicy}mdcB_arE|Dr=g!M7zY-mI?|a?e*6mv#dHm5%r<>(jp69!F@44*qD_iXr z5sgNpR^IM*yPo{w;^GxoT-9y2vMlr7XL+{i!A}(DCBq6QfP^pc2`cdmqlr&M9C&3uqqU<7YJ;&e*&(@EjTOm?f+4fLOvo3bf~en`QVMH{hV3P<8^vcN z!zp2jl(Ru~(^d28wYW$34yJ-7FNwJ^1=%e5LU3B!kfYicJ!mAR#5c`2K#)^erwM<@ zgnNw_3P5TY?VNa*AjZ2DcqFyP@((CBYs5m5RD-C(#hA6nsP19rYUN!EaFU2CK0-m& z?rC!58Ktp-s^V&OiKj(Pb3aO&9mv2Jxnn0HH5&_a9GTSZa4VR_`Wpkr4A~jN3n$25 z_yM;U2qKL&WhitsVsEOAG+%WaE@HB;Awd!hp*qH01x!)N6JiB53>2bdG!_hzz<8g) zfKV?T(D227q5`n-5e5kkHYI_~3aa}l zBdLuqI~cx44YnN@y8u|=Uw;AtXNT&B_Hy^Ah3@# zKmia@S(fOq+v#El5zu>Ij0ytqBu zWmy11-pPrel{>^%g$scUwR1#?Lyq9dXVvsSkYK;9F8@3uPF z$q1kt4ODM*5x7%W0)bxS)e)JNl|2tU39Y;!C`O|->-T!&dw=V@|NfN+?!52i z?|Nmgo3;H^Z*qEK@5x)Qy#9($UeqtkwMQTLx_7^&)9d*DXjqnC{+CbB-?zP;w|$kS zsS06i#AIm{lAEn|>*DYI0DkWspZK?b{nwBF%e(&gPcOUT%9U%^_@accJsFGxt2WjK z)1*cK0&{c>=Y+($+bdVGNHlADt`Gs$_Ygwcgvp2w0jDRYCMPFbEjKaI9gYehn3|aM z-dB*dTW#=!h~8JH3i;|}snYwh^ciODZU>OcqNt$hb~zCyF)9GC*PCqR8Tm@Mson1QtVQGz5gh_Sx7$O+ z>ge)LyVJ_^vMj;-iQc4hSe69*O$R4`p3gIdK? z;_l*#L846)oIcGfvP-j@xPqBsh^~YKHE}gdpDS~K+wP-9KYcwHYqG+Q(?hz(d}{eh71 zeGD}6P=&&=X;>17G0{yyeT~AdDT9r+Ro$violANt)BvD*>)OWA5m3~S=(RPec!&T1 zT=2KzOL-odIt3y%ugg7%x14>VBQnq{k1^xb=i(+wHRSSFZT9fBHh9{wQ9z!K^=5&o zw^jB=TB7=_t&w?mjd`mDUoYydl8OA9wMlV(sp}3?as{P866BXW zAOYlg-s^U|6FrZVxeO7Au-oZwdGg7-@4LU%ZQr@!UId@zxX)gDuUN6}lJ8zREc?Z1 zc*os$k4B?zw?pJz7G{w+1}!+424_?qisKdB@eq7Z-g^%Si0A;z5}5Zy-dE1mx#|nV znqBY7IY&U`ORih;Md@Sm2m#6A6FYZ&@M9levwBS{&qt%t?Cx10n4Fj_ePQH_pe#$t zCwPxgEhE8uPu>HftA11(002CdRF)Kz-X)gg%SzJ;eGsCuLXkWX_^M*Y0TOv%#?(i( zURItaa9=x<2xelrj0J44omG&@51Il>^$WC7+|&>VKuHiKL%X6Z*X+G|{qYCwTG*52 z=v`4@L7s{db`AIJf6xJ|)~}v@U~9YE=AUhG1SL^tvIl^3bBkF!AC;rBC^Dp0JKz5J z7V^F|)n2*Zy2DRC>PO%Gj~yGgt=MPPo8JFhXZ*rBU;ohOT`Lbhu;mXretmCdayS|t za{OTnv$I$H=lAFLEFE{=sn7rA^KSe8jhi<;`s#PSaba%T*Z<|hiHYf#{o(6h^2YPN z_-CK*VmrR)ln|sUaf^k4{NfW4I+&Q~{_yfE-}uJ2e)JJ(ZkLF>FM%j?s9y=|cG>_y z-g{4ZmO(IuNZzA^cDr4n?Y-w93w&8=2mlfJU}QpCj64*G*vj+jxSo(p0&)Q0T;OSp zc$`CKZ^8<-N>k<=f_sZcqhZ=n*eqLCV)yxJleblDPop>p2_xdwX}SjndJ1Jsqurnw z1X(!J$vF-n`S}bPNz;kU-SizWc`Gl@!|CFb*kY-|*LcVXv73@-kfa>R4x_6bVFDpjcuc0j_`666c7?Ubt$L_(=JF6t69os0N~|>^!}|(46Id!D+Yd$> zI7sA3BLRjBo+y4ZWEAOZ5a#N>vO7^U>XK&B(TRZwn-yRF5UsTC)}U*~^f49GN}REg zP(UNwfMV)t8?a|BXlkgdHWD|ajZm}i663xJfE zjVa}-7Pxdhsz#Gm!6TPm%0!9gf9#AJy2 z6SazUJ4Mejh?o%Srj|9Hs7?bO4Xwf9K@uGnL(lX<#Q?GF(jdCn1iYGBMSTwI4NyeU zMpkP|qM}xB`ANfD_^P>vM{zs_k3AJ>(=C;+ip55=<=9U(Y(rH6#PL($60meXYv8DE zkQ*FRupkjC`zl=IW8KFmcaqu=l4KdH20_@pM>~dg^oSrfw{8MSvQ!#_M%*gHBm@(d z>jUQ-uQ9|DCj(sYR5cf`7%3jTQIw?UhO9Uu1RyJ2u?A0sD{{uZHe~Fxz#VU4LnE?H z^~coQiH)@_*))b2vId0Ktw1qsqBb_PPt}*jiD9$?q4caKqGN5F_HKyjTn$DgHmJ!L z%YuwtRo;d?O&vwuz4=j8^NM&Fa7XZLlB3x0T7Z}k+ORTSdIm(mR;%Sp>h~8HW_RqG znp|93%w3kZTh8S!cim2Buf6xmT6wQK(doJ!TehEg;&JbM$M4L|?fmW~mrQmiTCKJx z@I;tp2!P?Ya+(4O1kmrLH8!B={Hiwbpb($LEFwu2T|}Rpi`EN)LPHYDRE#3*wtEhS z+js161X-4MI}@!|UX&wJs#|q(4#zv84tA({+pO_;c8L$(1V)=ILBvFJtvE2gS}dHe_K&*KmX(3+ZnPEOFzvQ~*D zA(TKsRFuA5X03LoD2o=fsr29g03lj3mt_FXgmZ}A`_a&sB@wutkM6wXd)N1O^oyLH z{nF>{fA9fBrSp^_W-cp=Vt#QB3WC!6C3yH}8*jPj+E%AKw|o9M&wKXF+7)Zd;ZY|a z@x_1s`1Z|D^aqdq9BeK9Nvs3=ANIvWB(d}CC=X*Qs;WT{m)6A`=zfRfEnRsX`m7Kw!sGK_u&fxvqo zBdDq(D2lePQl6Co@H%oOz+f&o5g7tZu#z4sWvm%D#8N#_>iDBNgB&fyNd!;lEnTR?%LQ<<|nu zKCDh2Yvojopw%i`c~RRYN^|&OQLi_upj+nWLC_C)s#(gQpfIGf^b9u_FKga@upUzLzCTWiISa zU^??ytN_qqqMO=rrR~Qr*rKOtqH_dM_Wu#|c}oo^TB9YKAVHQ4z~NgmX=;UZAP@_Y zqC!Z3RZX4hW)0~Y3`R1>8bI^C0iC41m=Eh~8#`c49<(1Z!;S%|PWWhV%;d?;$%%eu z&RTJ_z@7|b{C@(YT)x`mX%??qYiK}!?9Dn}HA~BLJcZqsl9E`wC?--JWC#IQFU#MW z&20i4ZQG}Ol#s@7T)bq>@&LeiWv>sfMhlWVrh=x1A<3Vp&Xqw5#1rKtGemVch_7$T zvl{j~+G%t#jd#YJ&yqx4soAOfkdzS0$S&*E8kQo>wk6nat$rxaYFbIca%jRmozl+E zf0eahI|{7a0)vi&YH904Vr!u4y&sD$2q7!0fC%J4qb{KEACc7sbf9yBD z_VrG?3m)=313+|+&;dG?U{G^|@#Yc6@RZ_?X;>ckDBHVmv4iiCfmjofZ=Jbr!8G2QdiopyIL>~~t7J+q5z z)~qU){KEW#b5M>(?Yz}m*(r1A&-Z(62cDcS0g6zKlsU)%J!J^P#eR2Ua(ZgU4WU23 zM2;rbP7iZ;?#o|%?s+d;n(MdM&Fp+~XXah?N*q-yNxOw6iGjHCuSCc}w*85%=RWtG zzy9mLJocEQ-}@JTb=jp?PE7WSa>QjMu_iyhH=`?~Y7DDrtEZ2?Rav??a&_h5o|r54 zZN@(&hfSb)2+BF4LztVJD@)()_9_uUfT~ud<^hvnwhFJMO_gS<>f=a})1lM8D%ppC z^ouwkR2w}^qX>zCOs+0l55 zN1U5AI7SyC$}a=2fh91+HT4n_uULXh!b1>X(PhIW5)#$Ul2bCAyjd#ZAM&DV0&R%p zk0foAHJidoM2(_^sZ_4AC@P~VyFt)cx|3d}GR5S2;$a7}AzV`{#r#CsrOKyPb#JJj z9&kYNfJfHq7tN^-GZQ4479`Ke{3YN)#kiP2O__F3hDUr2TWN-YB|ro`$#)n?BD2LS zYW6j5sj_A%AgVrf&Vbr;1pu~FX+vb>DdK{W8mPhL-VxM#YRrtCyh9NAq?CcAkMxv6 zm8KCDJIw5n5`t0m9~}N!TT!*NyIw)obOUI-tZc;gWCRrwjz*7&W+#x>BO&aGUd2ww zvv9!}hS8#dV4KY9qur*S3Kh*ve1|@?WGe~kkNm{8$gy`~i{@|vE?!N1;*Zd(!GkYj;SaM(#4ys%i3L?Y)vUO+ zMrho4#F&`T-e0?^FruIqfKiK@H1mgmBtkCtg$SV6Q3725917oN58?u`pOX1m=sm8A#r<%lxO+gO4}00)Ffh>&Lv z3-s07dxb}b;JhzKK!tOzKN^jO!_jR2JD>Vu$9MA?bfF!JNHM4T@I>u>mMl!|4n~>icU~9V87v{ps>LYlO?xug^s{asA)_%`0D$U6OLz(c zm=22~`v71zVANf#FKrYkLa!z|D?=NNTa(UccW7r%u`$~X%@8$Q`sab{(tfN4>!Y(w zp2hf)@O{iE#P&waOA{p<=QkYJ1hG@sulk`#rel1joz~cE{G)~{jOOmjD{3-X4VM%S z-_|V?c;pVRNc0Ik%U%dihx^U5rH_=70B7BkaqD0SVz{hTvHk6M{E_W8q!MDv;Ts1w zuaepkRQ^daAD9jhXEL{!=KwW*=7F8YH0g%%94Kvb>O-rym#~3m_7W==KE*O7dK!|H zV!>k)`0zFoPcBB>$bB^>67h-*Ei;M#S3zdHN03Bw3N2_RwH?K_QZH0Oa+=dJE`|6X zJuX2)b*&LKN8Jdrd<#>Ic>x@(d6)4Bd~@|B#9U1}CrVd6OodEhj|`|!w+fbO;Rt&6 zA>)jZESm!;q;wvlYN9+u?xh#;22BL&b-Ry0vE|SI;;&wJ!7r~^xpFufjf$d`XAf?A zs6Q&#u30l07Q1)u9+m|V_4|Evbks8rKj`2C7yFBa_j#uch?#Q^kux-M*hRH23Uxc6 zm|xLBuqcyIrG~=4zJdl2oO5Ma0sxW+ z1gzeysarKf0*n>0K-EbWmB@O@K^x~z0jD^7)sa-Dg9soIc??*%z#&4*DP+WK2@+^A zK~oU}0I>o{-~y8o6?nO$VL+JbOfBc(k_Fi+;$wv(a3;og1 zxn9=IZusBpulW3>6P;dVwAgzR5N6H|;LTJIIpUjK&ozW2|L zIP&m6`jbET>}UR~)9Z9P-J&RvaYD35X9(pQFG{{>_a-bfN4e(0{~-1D z2*xyEbudt-=7NTh4;2KzR?O<7b=Bn>U0OYCnX4j=DVh}jwT{4c(e$YcD173iIBzeE){Ue zAGQE83sgHzmG6iTtNRKxL@j~|;^Z>T@Am(*(W@Xe|BbwT#lA)&vv(UocZ*Wt@P^(|H ztKujVqwu&98zxe7jGxTL8xYn}RQ!s2j*@~2z^1;#Y<$^j7)vBWhzN^9MuRZMuW;sH zfU4qL5duMyC!=)0x@}h`HSQnRvRp}#tNzt%j*@H9|7gk(kgY9=@<0KEgqeC?3~rgJhPDYLrJ|894gOGEAKQ4* zYhzj(lN~Ze&95h7AOwj*Bv{t$v?i6}gwPTYlXWL^LQk5&&l?$u?bCN8S&Wg4BHIid z)}niJQ7ACvlNR&}Ypg<~AXy(0W)Aly24J6L`UTMOG}#`-n?PM-4AZs)a&&S05fzBGnYAln4B+ayZIb zc|2bf5CI$^IZ;72;RskAmx9h^t~xmt(P8cop)5=C9x#It%#l)=uw@+3jFG9;WF-MjW3-D;`(J^sb3Oa*Go^G^RlqpS_mZS`K|ZP@d)6 z?t1uhfBtW0|I+i0J@u&eWPA6HU3Xr6`?cTs@o4)(r_=USMnDlNCrQ53?riwUtzY|( zFTecPUvb(wr|;apd(Ha2T15Z-;V(RN=f;VN>2huaL(C!bL>XkQVT(rIwesCh&hE2j z{k{k8w=|gVxQUh1tH?vkccyyNp2&NGl17WZUAA^Vy7i*}{`zmc{cX=V|Ammb{f|EK z+V5Og3<~H0l|&9OB}h;;jK$2Abd;q(=eg$`b>!iH_UG^Y%xAtZIWdv9va(9hR0c;9 zmDY#opoV~|15r3gwJq!12~3a8@)~bs4l5|y;OOwgekCy6Ps24aq?|CRzG*X8MFZEET4}JU%b8~g=2LqI08+$~Ab^N47PMIo)~@t!B#vlSFb;`SFbCeIQDSq7oB-BWpX?uN;C3rspOrM()g#+Zqo zsui%H>Xv9}@-)zDn7(P(DWP->w36rXqk7pv51h#0r zv#9CZH5|rDds8r@0mPb^H4YN29yPUf4OTgd9L0sqID7y=ue$v6<3J~xR|3Q{x;=H?g-YIcn3%@OJks1cUtEA)*1NBQ3ID%Nmu zaY&8QO{T$!n=JuWTyCJT?CRRP06Y=aZYdxPjMh6ZOES{KSJ0w~=M-SdoGxbrL2yp- zX|NyC(Kw)5D8tJ;_>Z2#&M-3oI2&V!S-LH6RSX*wh`DWxJBR<}=4ElssnY>GesybsnbgCMTZ0L8?M&Z_H|8 zn6*+s0?7m$KaQZl}}jbX=BYdDd#R zv(_~~x#^yJ?%%p&+v+u|21|oho&jL>iz%_r1%X$dS`I1^Ab?m=qTeM1AS5WM@TG6J z+eB2BHW;~if+4IdY@$(MTw2YGe`jKEcZl3St3;Dh_W9gDm@`M=P=95 zVx)G&y!X|sDF{@R>_Du4s8&P{$j{F$__A~k31CzdtyXJtY8tbQk2D1Ua0DLs)R_z& zIxNaU-aAJmAF@Y);LCEy_8pUx6TMD%Zf>sC%DdeOqR41j2BVTCs#O=cOU`+V{1nRX~JMMVoqD^1EX8r0`uRWaa@7}x}`em=z33W^{ z{;DpI1O&aTbNLs4@c09d9(3eEF3aw?@wSI=-}vPHk4&|DCHeb*x?$&*9aums%hBPF zzHzB9M=PdR-Eqaw`@09_{BXE9`pO6Y=g|$DCi00({{8EVv$K<(Ne9_*_wY*}`0SJS zJ-lLK)m2~r!LCQP?tke1!{O-43x9a;&3Cl3PU%a4Q1}=$Bf$-{LTV<2gyA#wjCwCj5==A_|vvuI#r$2fdjoX&;@hHQgm4 zTTQE-6Z=i#m-!inIGcip)NE$IB=|k#5Zw?Xk|^BaTcCl52)l|mR2D}ESegOKK@)q6 zV11F{V>(E=gDo-$FI2Mpsbj0P*E1U_HpMe&(4cJAg5d9}bxqx&iW7774 zDIkQa?*%bXT0BX5rIZ%AsOG2*h4p@F1WpE`1&CNR>wOq{t&gO?*ehBF(HL9JqVtdO zmU(VUPD$bj)yX(EDaJ|xY22-|(Qur(_7+%U=8GpJp0&XpB?W)-QS6CPCKYV(Zc`#E z>TPq9A(62U-Q!ndVfmRJQI*P}N{C1+RKr=(N>s%zBN}RBh`}eY{%AamNvv;=I7sM5s^R$cn=1T3)uDR89I6vT17H-XCW^KTs)mWR)$=!PipJ4wQZU$9 zt;X8TXs|0x;%AK$M*_w&E0a~NIK|{qox&9yW>-fyNR>tRMKzV$VrCP=%W8EZ6((a= zaSe`r53N?uXnl}|JhhhQ%|3SRl=32Q0vkpF2|g7?>J~=XWub??sQ$&4&op$?k7L^S35AH0Gq^?r$IiC6S(Eb;1F;0G#+sG2(m(-S?wtTJ^j%Zg$&Sn7MiZnrZW4QFQ; zdK2BzaO6wBZP(5RHf@}lo^}rA=I4h+LEylJj7H2NflR18wkDZHk`S>di*~nt{!3o+ z=p&C_cl~v1*RDPD*=HVd$N^JI2;^&@PVhF{;Y3*>pN8aX19+i93(_^fF2Ra0Wu!oebMQ(&pGWmYgezC znVA@k28;7c_uha1y$?Lt?e-ix03d!-Ezaj0_LusD;b3B7f;?g7zymrdB=X*88NT$T z=Wlu9$&DKyI{$?)d~(~C4IA#Bn3(e9E9|HW0Ye!!1=exKM^Q8pK9pj)xV{2Vm0*|} z+TfeDjImXz=?R7rQcVGUZi)wh>B-(;X|Q9%W1c9(tlP=6iC#%1x~SkBI0R!%tvsKi z-iE7hzx&!dvfTNy%psrb^#BpkZGUX*6AwM!>-I8-0J!P)dx5AoF}dT>t&czSc(>EV z%w2!+k8|hR?arN7{}chc?G6!@OXa=S-qvolI_;ht4sX8nx?5Tqc_;>hZl{;Ev+xVf z$Uz8K#72)1^E8z!$n)&J`|i8zuDfQYr(5lI=?ivY9BKBXlH2lvPeHQ`SV zCV>Y!k73MQQ*eijs;HqL206W_D_Q_PceV=|Y)JPGo~NC}x@nb^{r<)?q85ZA*3 z1q*3`NMk0`Qa>8^+E@Lm_cdSbK}b#XgES+TqJm8fN>ybZ%ka1&?v~ z*bUIc_}5mG5fZcSU58y&WHpMb23-3CJwp7|h_E{2G>QzW9LIPk`;`1b6PX(L%+-`) zXjb6F3|LZ!@XYKu=z+EDTEv$3zzUTy^#BdRlDdin3w^(N$V39hpRhFcz8+(YP%e8J zF#qqC9=PNGr%T&ez8rg3byX7lf42EmF=;cWnn$m@sAZ|s++>*&g(jFA62rDZ^0_uR z>UdQ92rY+=k)VcG2WFr@i`_AzHdb!K`xptFY6DxbL;)6KLMxU3UuDd|1!{bNCVFaw zNv|6c*ISngO`CvPZTMvcso8#x?U8m-UrEibuCbwNZSF>^ExG@v9@Wq|Y!|3wbI3E8iPjgp#_>A#3Xo<^P!O9DVd=Zj)g4hO^8+1>l?fACAsf5DAE{dv3H0|fGv zw{wRM(UqhA(!#eFHI%OYI~E^e*u2)_g}y7i6@@0;m!>+Gt;kn<*N=k z?BES|-RZqQ>BJLHdge)=`1gPJRaakq*_A(@nqE;BMV7lf%Lo9727`W46uyL2YgSE9PdxeL zHYlk8pJiE=xr#MqIT{ViR;zo&;fIxj!TlQ_JnPIeZu$AGxBTqZnH4KTT@X41D25}b zeve9Y$;3iT-Xxh=eG6|D1YeH;)ej8uxkb@>Bs%p}uC5+9s0gZhP6U7@bUN*Bw^J#- z{3ta#6ze84A%OS3-OARiTv7OvO3FG}1#nfu-O5|-yp0r=)7^F#5zzZqE6cJR0ipE0 zRvQq&L$}?nrmSlIrY9$XfQq8kYOS1ESrjAkl=mjV`_g-iNlPhT(h7$d&-#w9E)&em z%n%Wg_uf~`vLUG@$?{$q<9~{zkveSQvGyy;PHI`uG>*A7-oJ~h zA;TQ*Tz6?>MvD9VN>%98MN(8(bG&1ox>fQoI=&#N~Da;(^dp#eyQ>% zcKBGMfR4-J3xPJNV!V+;3Wbq^f<-j?=_p+|#yC}NDj4L17I_>ON{ta-az|te<*6R8 zwg;xoVZ%0b{K~HmO2HO^u*7I~qBik4!>@PeK)oXpGLjU7o2E*8g;w<;EsF^E`J@Hr znK|!@C{5Q1-dc^-dvnpkCETebOF6NIQH7~7>1rvjbvy2a2rHrv3jFd$AO|3|t&3^` zV;1;k+D>CGN|Fdqv=V?o@)D#*p^ml)M|15 zV_bqFIv8n+)R%?} zL3y1911l!g_Oa#w0b-?0-8XVu@xX|YDya`s##P;ofLdIwgvcW?zx;qTB`N>2s5EJ2 zD)-#9p|Sba{AMaOj1^(G{w_Qs!{dexDsf?`zG$}zQN$uL7Vh*1&d350M+;}BHo|V> zBfH5_GZe{W7!Wg}Z8lb-RFbL;;@J(TF(oC~H`E>phk`+F085%`t>>=|3yWG&LilWO zHChyHImdkLmU-V?=9d!6hJn*rno$`e$HqyamLiU;p2qO}lz=QT$OC5Rq5R3U*Z%JB z{??JSx<~P5+ zYR%fkg~g@*?5G&ETirElRu1}0qtWOE=brP!%ddF+vBwTN^pK2bFzC5S!Mu%sfe%f=-ea^$1AA4ZqL(|hU{lQ@8u3g2ba9K99a>_YaT3R~$yyups z|LF}k?X}~38{rSm*y9;JYVWBwK^Si4uEEN&KBMS zxK5`tJvrfhAfRY$R84ULzzZ<5p=@n)JS8WXeieqHF}(VN3AJOBas z^d(Cyh5Vs%?`)kyi3&LY?@K_;GK9<##orflG0+MBR`$gQ`%35#sqY*lTF$%Mt(xDV`-H5sQ+2{a3G6$L%Ze1m=q@ zI;>02&7NEHT1(pr{-7g^FolYF5bVk%4J7K@4iulTzhiMRujgn9Vkd9hQ2d_KXRME= zm_m~~X`m$=ABI9$pGD6Xe?ux9`-NasK=^9-O*|~8(?VDqsji)q1*8Gx+My9~%mx;u z(IT-+t_OLwsK9c#wk;iiS3(>oHDfRDXzctP8^!pC)1a!+*a1`C2~hGbdo6;An5j2i z8x*E4_{*bZKxtgKHug~f>f+#L{TdI3UNDLg*V@n&M%f$9HC{FKNLwwdKTr1x@-r@= z(}Gf)+Uj}AZ%TQuda-Il)NiVt148B-C}hV0s|ZqktRz}q>Qw8`l*hqjSjLT;MX(Dy z7@9r=png~-fvcHmVqBDsktelPVlarLtDE%fW5A~dW}|7Vp2UL{7%uWnTcVM%5I}4) zq{-lc3)*7qLwvNUW?!ro_NlHU?yp}lYSBPP8CHFUL>YiC_x0( zt1pr(2nwfcE2z{K<9K_u8Fjo^;|3H{N*D4L7e@vzCB1Kl<1=zw@1E zp7hLKr?<4QFf%oM@-t89^}0_yzV(4k5BJ*n$)}!h!2bK4e9{S-%eQRbvDjbgcG@SO z{p?P=y>a8FO^-g&>vWvU9AZi202b#L)~;Ifg6EyPYv=CU?zm&2=ub^f4u=CM>GYFM zS-0O>KPro1vGKvpgW<3o7V``99-u5~es1pjmt8S4J@fo?&)u}~p+Udzi{ja*ojN@; z@%Up;Zn%FV5*~fzktZH=)UMgt=brogEjzbv-MYPn?zoeVTeEi6_U*gwzW0GvyOU*E zmgVj4#Gd)N#l?kgw^J6r-yfWC%yGw^c=WDq+wQ#U-mSB{C%V0|7=b<+Me)rzN6C_i zEMQy$P&7308!Ed`sXSmRg*DMhlq{Ac15curKgwtbRyl@=W)wq7GXYe;r6tKv$H|#6 z4TMxme65QJygslwP8){^Ke`ilfT9F?Btk?4$EQq~%^!n>qIDd*+V@3pHKSqxNFM0W zO~Tnqm#Y($nDX@vOnVVfuESVin!LqZx6PcwO9V->%!ZE4*f6XNT3=Sh*nT!d~1=5Xc9Je6_6^V`DAemtl1{1k(ybcxnh7th&pG$uGW0BF7qpQ9l#X6U|79^J#koqs8p+c4nFv30YV=7`9o0W*3MI+f5tn>IPm{d*_sG&!4 zKk2Wu(n18uz|C|HEl6xp)uDt z8<_+{WjnUX6PPj|v6pcqLa><~m7g`a;zX*)nA1A;3YNOeQra4LE)?^P5e>mGLWeBH z^>K(PVDSY-(O9U5swyl(Ybp@K-SKQSvzU&_8`8+DPJnas`+W{Z<;C7PxRGlJT-OSC;|eNg8XHHM-f#u7!?)GFEt3L<*%A+GG~ zVuz9;E6Pc9A3@eI$QuKkhbQs`4zp1?y!d-R`2G(sL+2>W>MQ+pm^p_obEPLln3|mS zzLXQ5WN6ZW#Wxx%0#?uyKvgb52OhA0=Ca#wzx|K{5AJq4cieT?)YSCEWVa}aUaz}j z*X)mfe2vR-|NZxW^Bdo|`SC}GgQXWd_uTJYdd0^3??3FYLp$Bh!3Q7Q@0U+JarHq5 z?)U0f{o>Bq9mQbj+~=J2^$Wjy=j|KXd8?JTfM8S>r=0Z6^IrIZhaP$8kOK~U?m1_D z<=fxh`uLW;*6sD87rn66%6IMDzW?F-AAG=ppZUyx%`Gf+JMApXI^9mz%BLr%mPUiS zHr(^tU;d@lt5(b{EWP2^es%Tgl}|pl`LvUcKYsIZ-~Hc9A0BW1j!~b3XUqU)%i1O*T*Q~yT>Bd_`n~7`=NE~3gu;6rr z4b@_q8~{N4<*DR#8l_SeQUHhv82~O4ksq}%`k{h7?Z4R`rlFZYZDFzWsJufsV#X+k zOl(Y#?7O0@=*dQMqVnN(T5~=o#53^fT@3LIe4M6TxaS5-Wm?gsl64DY@AGu7am~iq zFj@1dDa5cMJ9#50l|U+FHIo`=NhhsiYQOQ=p-vl^|nwcp>A@^4Vuh5 z#f`YwPGo(wfgy%43H-{JC+&4W^Aw=!C^I_lR7LETf72LhgoOOeF=c(y3jrv_gsciB zg4V3urV%A?Gm(l<8oOidb8|CIB5Y`hwrwN)%TCR5(A>0v<;z}8##HVj0CKgXVUzOM z@k5ikKYcLdojC(XGjz2ul$}*$H|r|LZ0-SpBvqnEOxx)RB#uqqwNh7A#uAeq%kY`T zerbdtWm~E|%ZR9I5{*ZQIqZny=G5GERjR+6iC$-T>W9a-NknVRfOT0|{=OMt3^jsSG(Q|qL6XOf3_#`W8b|p*nywmTEXFz} zwsQ0|E&MnL&Ep2!AWu`@+UP&5U0QB71@|%>Pd)^*tt!3~z$BSshPOC9J(U>;l^Ur@ zpRrLO6rP%usux*UN$xdGY$pUuc;y&UIF`T0#cfYtjH^%qbz&1i`9ajsClqdAw?q?= zNI}wajENq1aXqF6g!nC(afG*#N`s}W1LMIXAQ5>Y=iJJfnZa=A3lHFOhXA>A;Lug4 ziXdU9<=UN28BZIDYg?jmD-x>ytv|DXY9y8bL_I~#BpI>&_<$Lz*`Gxad`26QS=bpRnzWT@4@4N5*Kf31n zJAQt9yW84-|9v0W_`vsmaOvXW;`7fv`#EPm>(-y$T9l=8*=W$;Yp=at@$y$(cf++; zTy@pzH7j5G3+MmR%U)S!aPv8CKBN&PJAOLzii7Bw^$KAI&NhwNIy}}l0a7<+&kX7 zg?s5voMmgplV#*lghB+O_SOK&hXkvbMDlfxgggAtxJpQ%P^OFd1(#Oq-MZFOn&H-qj<6GBOF$t*1Jz>!~FbJh2$23Q-F(!Db;Fu4@0kF8tBxo6ezH zQ8h>irs;%=dlckXNg*0jq`^p1z~eNlA)1V{MJVIh@!ERSTsY|g5mVU;@M<dJ!^Iri8TC^RxS?ptS*X+?nAmB_J}q;s^*hAiKn@cVx9L@G{svX|?M>ygqA=)yDpf2iMiHWMKEPhpeAZIeJ*6JeDhbmH z)r^9LDI4KFM$1y}fwsLA)k?Qk4=kXGTT>LUrqIk@e-!)GSRWq?Ap%24fUOZJJQ7h$ zaI-UoJ`@jnhvsXH%he_*ea3&aipjHvbpRU(+q81oO+JTpLS&yne!nGxE{tQcVDdzW zW@?=P>LEfbaRf7NG(v2;ds*s+!-F$5EBvs9*IdDu~lVM`~6FqcbCZV+Km{0PQ@d zT>7G1;Ls6JQ50Sbbo5Y-xC#acK+fd=;K>uhe(U!;V7~*exZ=M%-3~!`$vV$-07U0< zmwWGva@6hg9(-ui=0_hr@PGrdR(EQ8B?2xD2F3Pm3rqcNTek0*-L>Do>+igCLs1Nm zJnYbwd#&4dpM6%$tjh9yG#a@qBY^em_bI5jlYYV%`{UVhot&b6kdCyTO()QfxQQYIRyiU6{bSJhQ~OUlwD zfD0;5sLR=`aMVsDY`WqRs|;o&6{YPGn;G8Bh{);LbsSgyqigU&0gVJPvbv08u=5tk ztRmN3Izp;-aoMgwi3i>wq68;oN7Bbq30<2alx5-tcD-pE20TxJPn>h&UjVpPNf|jM z2pXvHic>nbjRLFB)jMMnGh*ZwuNHXR$`0xHvgt*n+7)dys$fyV2TZdn+7L4qsVJtQ zFsjbh&sssmDA(-QYY`FJf7K8c%yf#H>%;K&VinpEzYK?U`^t`%SB5D;8|YhSFeP`D z$3f0su{3Nz+k%UQUC^PWztpamc7=AZ*i&k{TW(_?ZpL3mssW(Br`6m+zW*Q49B+pHU(o6)ZCVmAChbuf91N`h02AR|W{Sjv zEe}JzLvjf`%SKJh^*56=Pu3tUNq;phjBN~wVwja(+z?wfj%olcKEZlyqGEOJ${WTd zfa({dDO!0#Kp)WY@yDgZOp>Ajk0wz>VS&JBBKR7=u`;>U2_!{PwDQ~$w(|VgqmSM_ zH@Erm$EK#IcI=$Z@@(z8wOhCESTVDrC`VAzXfT?bobtZhZ{PjSfARTL(EQ^3M5ni~ z&_@ToUOUfVV!F3t^~`Y8U$=VQ3(tQMc-pmlN2lE>39`(Q_bzjtPABiQcI?>RYj@VI z-)muM5y8zZEavUj-2B{eCmi>tx4d=5%*@)gdp)r6{`rN46)UF!AaA zIN6(+U)tk642vSqGnct6&s>%f`NEUSGDP>oORrj5>YsY@31^*s`nIjxzVqEncFoRZ z&c(7LQc-A3i`c-5;tO+iy^y^lOdqho)ZTyK(T#~~ev#s-d<^@1^X3kRzh)d%I!TiB z2^iF^2$?!FhTJBLX$;`t7*oU;a-^WMmPLgL&@&ckB&fk?qKsDm80Lkk&01y5fl`P$ z*T2*sH(xR5WC~Ugi~}=Z$$^(ic}2b2Lf-a_45~~|LT}zO1prdnM68{JAI2wUAc9R9 z>SDcG#!c_dFqWykH&hYmVtGi26%c?>Y8!MUE#Xa+8UCo^?C>!ShC#k38VUNL9o(QG zFZiPp?dDik@wJwCCEhY((;cWG%7(R|r6Jy>sNSS*lOQd7G-)KlZc{xNlb*q_w^EJE zXTg9DLBmjJH~#7}ZXP#I*7&71QA7Ef9T#IpTp8>bJ*5Fp5<_v2m8P*Zg+xSBKsYo| z(~Og~tQ})`^=%o?ZkUI4 zDan4C6w>k7vR522iwL5{m0zY4nT|Y=J68RZ>P~xdL0o{x+KY70mBF=_2*emOgVDzj zw^w#GO|_@4x;7d_cdW)?5o9elK>(OE4cL`iy@WH(%M0RI@1=Zx(~gsJ41Bm&y%Z&_ zU{)MsjJat70wT&#M2U;#zote80HdlgP#}L3J*K)FRB~ttRdv_Lhz0p(V!58$2qwl4Mf8xQ(5(h7y_QjNRA_LJd#? zKvft`iRTT-CA!@(CIh4BqD4L(G>WUSZ2&R6=YG-sff~OWqE;NE2T3Vl94L(MsoK~9 z#T+Ffq*gR$y6AhA!&XWqqNBx5+0U}9)$Mk-@7VVElTV&|_SqXY+_QE2 zc1J{I`Qr1>Klb?JzWmj%oO|xMTb|hZ&2N0w7j(|q&pGStbG-MZ2L$Z*`#ZPq-2Z^} zFMq|$@49Ql6<1ukFt>Qxsi(g9WiQE`1E_wEherLu0sHP(dcS$|BS>)I3Hz>CwQ}o@ z?MIYH&hJ^+yy@Ys-Oe@FT=T@^Pk?h-o)3n@ojZ2y*s-G+4t(hkI&l9NoO|w1Z~5ug zZQIGYJ$n|u{*7<1Uc0W}A53(+y~#-eDn=s!+A+J!A)bHUc~cXUpZMgz^@rtN>(>1C z+uo8nM^uiAQAs5Lj7G!3VA$=pXQrnwy7-bGUUtR)`|ka^3ts#DbIX zhvhtb!$sbFS{z`hfFaHwR;A;>vEo6&EK9Ko8jx&519;@rI9G}^GfgePS|qrIGl>a-UY|0}NdpT-ocrl8KA@4f%0@1Y4-GH~ z{Bo_a_Lb@sNuxmks1X5!YGNa2ot*{K@(1v z{>i?9C4=@EQ9gy~3VUnAi4vJfG0?kC4YDv+aBDU$y%cVk{MBs$aGW`5T92`V5NYDa zso0y43Zt`&a?jsMK5ZluoSuYIb??fjqcz&0R( zz@Pv^0)zyTKoZIUh4-YF-@9REPS^LNyHfX=D|x>?h_sUnl?v zd+zz?e*K!S@87$Ber~>pxOUCj6HYwktaHv9%=ANOhAYb<^iDhZl%3ljo1dSLv0cBg zux4S+lh1qVx#ylWH#?1i`u*PKEt}S_U;pq!kL*3L|1CfIqt|@xYlm#wdhv^2c-^%R4^SG??HuX)8Q@4f%N4I4L}cIv5LzWl14kL?()j7~rCq$i(sW@vhC94*Yv z9OJ;Napi zhmvK@j6@rC`YDb>)TD!57_4d)=`#~O-wA$@xQtm{=VJc}eNe+t_iA0qN!Jt5aDqc& z5p3$S7IxYjWOb+%d3883Pa!*SsUWieba)fi&UU)2y)0xV8n5oJ#UQH=-qR)>6tFw} z!gQ)u=;|X&?9XClpk81x!4%^>i~r#C1#^`@YW@jc8k9p*wXh^Y3}W?4WQ#k<(N-#l zMIJI$$yO_l@JBOmWFalqKhopmY9KG|LE#kHSfLuQjPR-lAbA-T`Z5-F~?`Gn9~@pUEKP|D)nDyEt#TeQ<9^wNh{&fZnA zJZRWe2dV7aT&x>e@&t4gZw`fbGy~H?<7gtT6hA;)VuHp3Zr=kY&pI7u%Ol2HQ0kJ7 zoARcqTgadtcPkhw2u@?!Vzpw=*pl_Dx#`?kI_Xx;LV=SAIgdT+3Ynv)5iYI<;4#ao zOG&@za!75F#Z)RImnT2_s|bsevVhU&^0UCuaBJ!gG3h=v1_%gd-+$4od=x43zMl{A z(1{H)Z{)UA9c(l_UY-Ik11TaekY5+(p@ zzqOK)`UKDw7j?c>7wiSdDlB|LX=z(!-+}2`Mqe{vyBtSvPHoR@?_5z*j7q!7&sdIB zYARi$AN7;>U2J2UFZRcE48Mnp3a6?ZIQ4hU#)PiK$O+x3KooNz(!V@bZl+u`p4EHx z^&KsSwzteueDO=`*00~NdGla;>e%Ct zUB7ni^k9|(eCa>Fyl>CGTW|aR+I4Fd7UqdCw(WOrzVR#9T)VuuGBp_7amQVs`@$E_ zKl_}+4m+gR?`?nd;fEi2sA+oF-SF+ud(tzX{`A{#zw`3TubR4e@Zy)gZ1LcMgG&d$ zdhOR2msXn4zw_RE9(wqpsj2?G_us#M{W=8r-mSNsciy?Lc=-=c_4~Je|F)~Hx@LBE zE*-{Pvy1Z)Sa^AUCMsCQhway7#UieP>MjJ~U>}*cNq(6nkw?1}8>y_Gm~{_-<78B9#^5uB(o8Y6x4&UAhxR1%Guo7`+LV zyFe{1ZD-$P)rRY9Hz1&!t8|+x|9s*~8nDSI9fN!>D4Ql*JP$zS zXLK}AxpTij@Ss0ql0mRQ(F5+Zf)OX@Q@Le@Z>QH8VQuI6#;K}bwz$%+Ck*T#!FDwZM zWDJ}UlhR}wz-p{&YE4AI*)A2AQW||7EZke@pmlfO*gY_n2jNIkWx)_XpLALMQtM*7 zoS@(vGG^=3l>=OD8Jh%v9g@`qp}UfQYOlIPK}~KFzf66?Z(vnY>I5f5c*p#5F z@I;heISOvfp72$qUOi!I3j}7{dZly8`Uzd(fhRt?r4T?jnx3!#RZia%Fb)4V7Uv0F zED+SqtgCTvhnv}Do4oCM0v*U3SEU|EqFPve{DcJ~12%eN_~(NA78790V*sJ7Vq%+V~`#)nT5v4Axz*g9e@rCiI479;t7rqfM%wmkvE< z`R)>*PHF6L0{s|tq~;dZy@pDvIs=!>aj2Tqm#NGTZzM`*Idq153WN-h#SX)&{XzlC ziVZ?25MV-ju_AqE_{0E^4o2?v8pP(3&wUXIwr<@zY}@Ou|JGnIP0#{Bz|iaWzkk;q z4?OsTwF_%P)9l-SV9&0d{lOqK;pXps?|}y&Tr)qnYv=BLd-ttbw{~T?OaZU``Zw;l z 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 z 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%0D$QXcv3179smIUDv1~Z08u1D2muj8 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�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 D0bKnpQw$I2%9D(VXy+k*a3v$ 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 literal 0 HcmV?d00001 diff --git a/apps/lynx-module-federation-demo/federation.config.mjs b/apps/lynx-module-federation-demo/federation.config.mjs new file mode 100644 index 00000000000..f9b44641cd3 --- /dev/null +++ b/apps/lynx-module-federation-demo/federation.config.mjs @@ -0,0 +1,98 @@ +import path from 'node:path'; +import { createRequire } from 'node:module'; +import { fileURLToPath } from 'node:url'; + +import { pluginLynxModuleFederation } from '@module-federation/lynx'; + +const appRoot = path.dirname(fileURLToPath(import.meta.url)); +const require = createRequire(import.meta.url); +const implementation = require.resolve('@module-federation/runtime-tools'); + +export const sharedStateRequest = 'orbit-shared-state'; + +export const resolveAliases = { + [sharedStateRequest]: path.resolve( + appRoot, + 'src/shared-app/federationState.ts', + ), +}; + +const singleton = { + singleton: true, + eager: true, + requiredVersion: false, +}; + +export const createAppSharedConfig = () => ({ + [sharedStateRequest]: { + ...singleton, + realm: 'background', + }, +}); + +const createRemoteSharedConfig = () => + Object.fromEntries( + Object.entries(createAppSharedConfig()).map(([name, config]) => [ + name, + { ...config, import: false }, + ]), + ); + +const createFederationOptions = (remotes) => ({ + name: 'orbit_control', + implementation, + remotes, + shareStrategy: 'loaded-first', + shared: createAppSharedConfig(), +}); + +export const createWebHostFederationPlugin = (manifestUrl) => + pluginLynxModuleFederation( + createFederationOptions({ catalog: `catalog@${manifestUrl}` }), + { + environment: 'web', + mainThread: true, + runtimePluginOptions: { timeout: 15_000 }, + }, + ); + +export const createNativeHostFederationPlugin = (manifestUrl) => + pluginLynxModuleFederation( + createFederationOptions({ catalog: `catalog@${manifestUrl}` }), + { + environment: 'lynx', + runtimePluginOptions: { timeout: 15_000 }, + }, + ); + +const createRemoteOptions = () => ({ + name: 'catalog', + implementation, + shareStrategy: 'loaded-first', + exposes: { + './ActivityFeed': './src/remote-ui/ActivityFeed.tsx', + './Card': './src/remote-ui/Card.tsx', + './Details': './src/remote-ui/Details.tsx', + }, + shared: createRemoteSharedConfig(), +}); + +export const createWebRemoteFederationPlugin = () => + pluginLynxModuleFederation(createRemoteOptions(), { + environment: 'web', + remoteBundle: { + target: 'web', + filename: 'catalog.web.lynx.bundle', + preserveSourceEntryBundles: false, + }, + }); + +export const createNativeRemoteFederationPlugin = () => + pluginLynxModuleFederation(createRemoteOptions(), { + environment: 'lynx', + remoteBundle: { + target: 'lynx', + filename: 'catalog.native.lynx.bundle', + preserveSourceEntryBundles: false, + }, + }); diff --git a/apps/lynx-module-federation-demo/lynx.config.mjs b/apps/lynx-module-federation-demo/lynx.config.mjs new file mode 100644 index 00000000000..e0d60168b62 --- /dev/null +++ b/apps/lynx-module-federation-demo/lynx.config.mjs @@ -0,0 +1,64 @@ +import { pluginQRCode } from '@lynx-js/qrcode-rsbuild-plugin'; +import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; +import { defineConfig } from '@lynx-js/rspeedy'; + +import { + createNativeHostFederationPlugin, + resolveAliases, +} from './federation.config.mjs'; + +const nativeRemoteOrigin = + process.env.LYNX_REMOTE_ORIGIN ?? 'http://127.0.0.1:3000'; +const devHost = process.env.LYNX_DEV_HOST ?? '127.0.0.1'; +const devPort = Number(process.env.LYNX_DEV_PORT ?? 3000); +const nativeManifestUrl = + process.env.CATALOG_NATIVE_MANIFEST_URL ?? + `${nativeRemoteOrigin}/remote-native/mf-manifest.json`; +const pluginNativeRemoteAssets = { + name: 'demo:native-remote-assets', + setup(api) { + api.modifyRsbuildConfig((config, { mergeRsbuildConfig }) => + mergeRsbuildConfig(config, { + server: { + publicDir: { + copyOnBuild: false, + name: 'dist', + watch: false, + }, + }, + }), + ); + }, +}; + +export default defineConfig({ + plugins: [ + pluginReactLynx({ defaultDisplayLinear: false }), + createNativeHostFederationPlugin(nativeManifestUrl), + pluginNativeRemoteAssets, + pluginQRCode({ fullscreen: true }), + ], + source: { + entry: { + main: './src/app/index.tsx', + }, + }, + environments: { + lynx: {}, + }, + output: { + cleanDistPath: false, + distPath: { + root: 'dist/host-native', + }, + minify: true, + }, + server: { + host: devHost, + port: devPort, + }, + resolve: { + alias: resolveAliases, + }, + splitChunks: false, +}); diff --git a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs new file mode 100644 index 00000000000..1e779135630 --- /dev/null +++ b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs @@ -0,0 +1,40 @@ +import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; +import { defineConfig } from '@lynx-js/rspeedy'; + +import { + createNativeRemoteFederationPlugin, + resolveAliases, +} from './federation.config.mjs'; + +const nativeRemoteOrigin = + process.env.LYNX_REMOTE_ORIGIN ?? 'http://127.0.0.1:3000'; + +export default defineConfig({ + plugins: [ + pluginReactLynx({ + defaultDisplayLinear: false, + experimental_isLazyBundle: true, + }), + createNativeRemoteFederationPlugin(), + ], + source: { + entry: { + bootstrap: './src/remote-ui/bootstrap.ts', + }, + }, + environments: { + lynx: {}, + }, + output: { + assetPrefix: `${nativeRemoteOrigin}/remote-native/`, + cleanDistPath: false, + distPath: { + root: 'dist/remote-native', + }, + minify: true, + }, + resolve: { + alias: resolveAliases, + }, + splitChunks: false, +}); diff --git a/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs new file mode 100644 index 00000000000..57a4bba5921 --- /dev/null +++ b/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs @@ -0,0 +1,36 @@ +import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; +import { defineConfig } from '@lynx-js/rspeedy'; + +import { + createWebRemoteFederationPlugin, + resolveAliases, +} from './federation.config.mjs'; + +export default defineConfig({ + plugins: [ + pluginReactLynx({ + defaultDisplayLinear: false, + experimental_isLazyBundle: true, + }), + createWebRemoteFederationPlugin(), + ], + source: { + entry: { + bootstrap: './src/remote-ui/bootstrap.ts', + }, + }, + environments: { + web: {}, + }, + output: { + cleanDistPath: false, + distPath: { + root: 'dist/remote-web', + }, + minify: false, + }, + resolve: { + alias: resolveAliases, + }, + splitChunks: false, +}); diff --git a/apps/lynx-module-federation-demo/lynx.web.config.mjs b/apps/lynx-module-federation-demo/lynx.web.config.mjs new file mode 100644 index 00000000000..fee9e502d94 --- /dev/null +++ b/apps/lynx-module-federation-demo/lynx.web.config.mjs @@ -0,0 +1,39 @@ +import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; +import { defineConfig } from '@lynx-js/rspeedy'; + +import { + createWebHostFederationPlugin, + resolveAliases, +} from './federation.config.mjs'; + +const manifestUrl = + process.env.CATALOG_WEB_MANIFEST_URL ?? '/remote-web/mf-manifest.json'; + +export default defineConfig({ + plugins: [ + pluginReactLynx({ defaultDisplayLinear: false }), + createWebHostFederationPlugin(manifestUrl), + ], + source: { + entry: { + main: './src/app/index.tsx', + }, + }, + environments: { + web: {}, + }, + output: { + cleanDistPath: false, + distPath: { + root: 'dist/host-web', + }, + minify: false, + }, + server: { + port: 3000, + }, + resolve: { + alias: resolveAliases, + }, + splitChunks: false, +}); diff --git a/apps/lynx-module-federation-demo/package.json b/apps/lynx-module-federation-demo/package.json new file mode 100644 index 00000000000..09ed6d6f327 --- /dev/null +++ b/apps/lynx-module-federation-demo/package.json @@ -0,0 +1,49 @@ +{ + "name": "lynx-module-federation-demo", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "build:adapter": "pnpm --dir ../../packages/lynx run build", + "build:host:native": "node rspack-canary-rspeedy.mjs build -c lynx.config.mjs", + "build:host:web": "node rspack-canary-rspeedy.mjs build -c lynx.web.config.mjs", + "build:remote:native": "node rspack-canary-rspeedy.mjs build -c lynx.remote.native.config.mjs", + "build:remote:web": "node rspack-canary-rspeedy.mjs build -c lynx.remote.web.config.mjs", + "clean:dist": "node --eval \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"", + "build:native": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:native && pnpm run build:host:native", + "build:web": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:web && pnpm run build:host:web", + "build": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:native && pnpm run build:remote:web && pnpm run build:host:native && pnpm run build:host:web", + "dev": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:native && node rspack-canary-rspeedy.mjs dev -c lynx.config.mjs", + "dev:web": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:web && node rspack-canary-rspeedy.mjs dev -c lynx.web.config.mjs", + "e2e:native": "pnpm run build:native && pnpm run test:native-artifacts && pnpm run test:native-dev-server", + "e2e:web": "pnpm run build:web && node test/real-web/run.mjs", + "preview": "node rspack-canary-rspeedy.mjs preview -c lynx.config.mjs", + "preview:web": "node rspack-canary-rspeedy.mjs preview -c lynx.web.config.mjs", + "test": "pnpm run e2e:native && pnpm run e2e:web", + "test:native-artifacts": "node test/native-artifacts.mjs", + "test:native-dev-server": "node test/native-dev-server.mjs" + }, + "dependencies": { + "@lynx-js/react": "0.122.1", + "@module-federation/runtime": "workspace:*" + }, + "devDependencies": { + "@lynx-js/lynx-bundle-rslib-config": "0.5.1", + "@lynx-js/qrcode-rsbuild-plugin": "0.5.0", + "@lynx-js/react-rsbuild-plugin": "0.17.2", + "@lynx-js/rspeedy": "0.15.0", + "@lynx-js/types": "4.0.0", + "@lynx-js/web-core": "0.22.1", + "@lynx-js/web-elements": "0.12.5", + "@module-federation/lynx": "workspace:*", + "@module-federation/runtime-tools": "workspace:*", + "@playwright/test": "1.57.0", + "@rsbuild/core": "2.1.4", + "@rspack-canary/core": "2.1.5-canary-54a0d8f3-20260715194831", + "@rspack/core": "npm:@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831", + "@types/react": "18.3.28" + }, + "engines": { + "node": ">=24" + } +} diff --git a/apps/lynx-module-federation-demo/rspack-canary-rspeedy.mjs b/apps/lynx-module-federation-demo/rspack-canary-rspeedy.mjs new file mode 100644 index 00000000000..9f96c96cbe6 --- /dev/null +++ b/apps/lynx-module-federation-demo/rspack-canary-rspeedy.mjs @@ -0,0 +1,25 @@ +import { registerHooks } from 'node:module'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const canaryUrl = import.meta.resolve('@rspack-canary/core'); +const rsbuildUrl = import.meta.resolve('@rsbuild/core'); + +registerHooks({ + resolve(specifier, context, nextResolve) { + if (specifier === '@rspack/core') { + return { shortCircuit: true, url: canaryUrl }; + } + if (specifier === '@rsbuild/core') { + return { shortCircuit: true, url: rsbuildUrl }; + } + return nextResolve(specifier, context); + }, +}); + +const rspeedyPackage = fileURLToPath( + import.meta.resolve('@lynx-js/rspeedy/package.json'), +); +const rspeedyBin = resolve(dirname(rspeedyPackage), 'bin/rspeedy.js'); +process.argv = [process.execPath, rspeedyBin, ...process.argv.slice(2)]; +await import(pathToFileURL(rspeedyBin).href); diff --git a/apps/lynx-module-federation-demo/src/app/App.css b/apps/lynx-module-federation-demo/src/app/App.css new file mode 100644 index 00000000000..313eecb66bd --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/App.css @@ -0,0 +1,447 @@ +:root { + background-color: #f4f7f8; +} + +.Page { + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + background-color: #f4f7f8; +} + +.TopBar { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding: 20px 20px 12px; + background-color: #f4f7f8; +} + +.Brand { + display: flex; + flex-direction: row; + align-items: center; +} + +.BrandMark { + width: 34px; + height: 34px; + border-radius: 12px; + background-color: #17212b; + align-items: center; + justify-content: center; + margin-right: 10px; +} + +.BrandMarkText { + color: #60e2a4; + font-size: 17px; + font-weight: 800; +} + +.BrandName { + color: #17212b; + font-size: 17px; + font-weight: 750; +} + +.Connection { + display: flex; + flex-direction: row; + align-items: center; +} + +.ConnectionDot { + width: 8px; + height: 8px; + border-radius: 4px; + background-color: #30bd78; + margin-right: 6px; +} + +.ConnectionText { + color: #50606d; + font-size: 11px; + font-weight: 650; +} + +.Content { + flex: 1; + padding-left: 20px; + padding-right: 20px; +} + +.Screen { + display: flex; + flex-direction: column; + padding-bottom: 24px; +} + +.Hero { + display: flex; + flex-direction: column; + padding-top: 16px; + padding-bottom: 18px; +} + +.HeroTitle { + color: #17212b; + font-size: 31px; + line-height: 36px; + font-weight: 800; + letter-spacing: -0.6px; + margin-bottom: 8px; +} + +.HeroCopy { + color: #64717d; + font-size: 13px; + line-height: 19px; + max-width: 330px; +} + +.PrimaryAction { + height: 48px; + border-radius: 15px; + background-color: #17212b; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 14px; +} + +.PrimaryActionText { + color: #ffffff; + font-size: 13px; + font-weight: 700; +} + +.PrimaryActionMeta { + color: #8da0af; + font-size: 10px; +} + +.PrimaryActionLoading { + background-color: #33404c; +} + +.PrimaryActionReady { + background-color: #1d6144; +} + +.PrimaryActionError { + background-color: #9d392d; +} + +.LoadEvidence { + display: flex; + flex-direction: row; + justify-content: space-between; + margin-top: -4px; + margin-bottom: 14px; +} + +.LoadEvidenceText { + color: #788590; + font-size: 9px; + font-weight: 650; +} + +.LoadEvidenceReady { + color: #258a5b; +} + +.LoadError { + color: #9d392d; + font-size: 11px; + margin-bottom: 14px; +} + +.SingletonProof { + display: flex; + flex-direction: row; + align-items: stretch; + margin-bottom: 16px; + border: 1px solid #2e3d50; + border-radius: 16px; + background: #111b29; + overflow: hidden; +} + +.SingletonProofCopy { + display: flex; + width: 112px; + padding: 14px 16px; + border-right: 1px solid #2e3d50; +} + +.SingletonProofCopyWide { + flex: 1; + width: auto; + border-right: 0; +} + +.SingletonProofLabel { + color: #7f93aa; + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; +} + +.SingletonProofValue { + margin-top: 6px; + color: #ffffff; + font-size: 28px; + font-weight: 800; +} + +.SingletonProofStatus { + margin-top: 8px; + color: #9fb0c2; + font-size: 13px; + font-weight: 600; +} + +.SingletonProofStatusReady { + color: #61e5a1; +} + +.HealthPanel { + background-color: #ffffff; + border-radius: 20px; + padding: 18px; + margin-bottom: 12px; + border-width: 1px; + border-color: #e5eaed; +} + +.PanelHeader { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + margin-bottom: 15px; +} + +.PanelTitle { + color: #17212b; + font-size: 18px; + font-weight: 750; +} + +.PanelMeta { + color: #30a66e; + font-size: 10px; + font-weight: 700; +} + +.HealthGrid { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.HealthCell { + width: 31%; + display: flex; + flex-direction: column; + background-color: #f4f7f8; + border-radius: 14px; + padding: 12px; +} + +.HealthCellValue { + color: #17212b; + font-size: 16px; + font-weight: 750; + margin-bottom: 5px; +} + +.HealthCellLabel { + color: #788590; + font-size: 9px; + line-height: 13px; +} + +.SectionHeader { + display: flex; + flex-direction: row; + align-items: flex-end; + justify-content: space-between; + margin-top: 14px; + margin-bottom: 10px; +} + +.SectionTitle { + color: #17212b; + font-size: 19px; + font-weight: 750; +} + +.SectionMeta { + color: #788590; + font-size: 10px; +} + +.RemoteFallback { + min-height: 148px; + background-color: #e8edf1; + border-radius: 20px; + align-items: center; + justify-content: center; + padding: 28px; + margin-bottom: 12px; +} + +.RemoteFallbackText { + color: #64717d; + font-size: 13px; + line-height: 19px; + text-align: center; +} + +.QuickActions { + display: flex; + flex-direction: row; + justify-content: space-between; + margin-top: 14px; +} + +.SecondaryAction { + width: 48%; + height: 44px; + border-radius: 14px; + border-width: 1px; + border-color: #d7dfe4; + background-color: #ffffff; + align-items: center; + justify-content: center; +} + +.SecondaryActionText { + color: #33404c; + font-size: 12px; + font-weight: 650; +} + +.ModuleList { + display: flex; + flex-direction: column; + background-color: #ffffff; + border-radius: 20px; + padding-left: 16px; + padding-right: 16px; + border-width: 1px; + border-color: #e5eaed; +} + +.ModuleRow { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + min-height: 68px; + border-bottom-width: 1px; + border-bottom-color: #e8edf1; +} + +.ModuleRowLast { + border-bottom-width: 0; +} + +.ModuleCopy { + display: flex; + flex-direction: column; +} + +.ModuleName { + color: #17212b; + font-size: 13px; + font-weight: 700; + margin-bottom: 4px; +} + +.ModulePath { + color: #788590; + font-size: 10px; +} + +.ModuleStatus { + color: #30a66e; + font-size: 10px; + font-weight: 700; +} + +.SettingsPanel { + background-color: #17212b; + border-radius: 20px; + padding: 18px; +} + +.SettingsTitle { + color: #ffffff; + font-size: 18px; + font-weight: 750; + margin-bottom: 14px; +} + +.SettingsLabel { + color: #8da0af; + font-size: 10px; + margin-bottom: 4px; +} + +.SettingsValue { + color: #f7fbff; + font-size: 12px; + line-height: 18px; + margin-bottom: 14px; +} + +.BottomNav { + height: 76px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-around; + background-color: #ffffff; + border-top-width: 1px; + border-top-color: #e0e6ea; + padding-left: 8px; + padding-right: 8px; +} + +.NavItem { + width: 23%; + height: 54px; + align-items: center; + justify-content: center; +} + +.NavIndicator { + width: 18px; + height: 4px; + border-radius: 2px; + background-color: transparent; + margin-bottom: 8px; +} + +.NavIndicatorActive { + background-color: #ff6c47; +} + +.NavLabel { + color: #8b969f; + font-size: 10px; + font-weight: 600; +} + +.NavLabelActive { + color: #17212b; + font-weight: 750; +} diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx new file mode 100644 index 00000000000..ba04e709d59 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -0,0 +1,352 @@ +import { useCallback, useState } from '@lynx-js/react'; + +import type { SharedStateView } from '../remote-ui/contracts'; +import { type LoadState, useFederatedCatalog } from './useFederatedCatalog'; +import './App.css'; + +type Screen = 'overview' | 'activity' | 'modules' | 'settings'; + +const NAVIGATION: Array<{ id: Screen; label: string }> = [ + { id: 'overview', label: 'Overview' }, + { id: 'activity', label: 'Activity' }, + { id: 'modules', label: 'Modules' }, + { id: 'settings', label: 'Settings' }, +]; + +const MODULES = [ + { name: 'Card', path: "import('catalog/Card')" }, + { name: 'Details', path: "import('catalog/Details')" }, + { name: 'ActivityFeed', path: "loadRemote('catalog/ActivityFeed')" }, +]; + +function LoadButton({ state, onTap }: { state: LoadState; onTap: () => void }) { + const label = + state === 'loading' + ? 'Loading catalog…' + : state === 'ready' + ? 'Catalog connected' + : state === 'error' + ? 'Retry catalog' + : 'Load remote catalog'; + const stateClass = + state === 'loading' + ? 'PrimaryAction PrimaryActionLoading' + : state === 'ready' + ? 'PrimaryAction PrimaryActionReady' + : state === 'error' + ? 'PrimaryAction PrimaryActionError' + : 'PrimaryAction'; + + return ( + + {label} + MF MANIFEST · HTTP + + ); +} + +function DeliveryHealth({ ready }: { ready: boolean }) { + return ( + + + Delivery health + + {ready ? '3 MODULES ONLINE' : 'CONNECTING'} + + + + + {ready ? 'Ready' : 'Wait'} + Catalog remote + + + JSON + MF manifest + + + HTTP + Lynx bundle + + + + ); +} + +function ModuleList({ ready }: { ready: boolean }) { + return ( + + {MODULES.map((module, index) => ( + + + {module.name} + {module.path} + + {ready ? 'READY' : 'PENDING'} + + ))} + + ); +} + +function SingletonProof({ + ready, + shared, + state, +}: { + ready: boolean; + shared: boolean; + state: SharedStateView; +}) { + return ( + + + HOST OBSERVER + + {state.count} + + + + REALM-LOCAL IDENTITY + + {ready + ? shared + ? 'Shared singleton verified' + : 'Singleton identity mismatch' + : 'Waiting for remote observers'} + + + + ); +} + +export function App() { + const [screen, setScreen] = useState('overview'); + const { + ActivityFeedComponent, + CardComponent, + DetailsComponent, + activity, + filter, + handleHostIncrement, + handleRemoteStateChange, + handleReset, + loadError, + loadFederatedSurface, + loadState, + selectFilter, + sharedState, + singletonShared, + } = useFederatedCatalog(); + + const selectScreen = useCallback((nextScreen: Screen) => { + 'background-only'; + setScreen(nextScreen); + }, []); + + const renderActivity = () => + ActivityFeedComponent ? ( + + ) : ( + + + The runtime-loaded activity feed will appear after the catalog + manifest resolves. + + + ); + + return ( + + + + + O + + Orbit Control + + + + Connected + + + + + + + Federated workspace + + Live modules, shared state, and delivery health in one native Lynx + surface. + + + + + + + Compiled imports {loadState === 'ready' ? 'ready' : loadState} + + + Runtime API {loadState === 'ready' ? 'ready' : loadState} + + + {loadError ? ( + + {loadError} + + ) : null} + + + {screen === 'overview' ? ( + <> + + {CardComponent ? ( + + ) : ( + + + Loading the shared state card through a standard federated + import. + + + )} + {DetailsComponent ? : null} + + Live activity + RUNTIME API + + {renderActivity()} + + ) : null} + + {screen === 'activity' ? ( + <> + + Activity timeline + {activity.length} EVENTS + + {renderActivity()} + + + Add state event + + + Reset feed + + + + ) : null} + + {screen === 'modules' ? ( + <> + + Remote modules + CATALOG + + + + ) : null} + + {screen === 'settings' ? ( + <> + + Runtime settings + READ ONLY + + + Lynx federation + REMOTE ENTRY + + catalog@mf-manifest.json · HTTP + + REMOTE BUNDLE + + External .lynx.bundle container + + LAYERS + + Background and main thread, isolated per realm + + LAST ERROR + {loadError || 'None'} + + + ) : null} + + + + + {NAVIGATION.map((item) => ( + selectScreen(item.id)} + > + + + {item.label} + + + ))} + + + ); +} diff --git a/apps/lynx-module-federation-demo/src/app/federation.d.ts b/apps/lynx-module-federation-demo/src/app/federation.d.ts new file mode 100644 index 00000000000..8f1ca3cfc5a --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/federation.d.ts @@ -0,0 +1,52 @@ +declare module 'orbit-shared-state' { + export type FederationStateSource = + | 'host' + | 'host/action' + | 'catalog/Card' + | 'catalog/Details'; + + export interface FederationStateSnapshot { + count: number; + instanceId: string; + lastSource: FederationStateSource; + revision: number; + } + + export const instanceId: string; + export const token: object; + export function increment(source?: FederationStateSource): number; + export function reset(): FederationStateSnapshot; + export function snapshot(): FederationStateSnapshot; +} + +declare module 'catalog/Card' { + const Card: import('@lynx-js/react').ComponentType< + import('../remote-ui/contracts.js').RemoteCardProps + >; + export const sharedInstance: () => string; + export const sharedSnapshot: typeof import('../shared-app/federationState.js').snapshot; + export const sharedToken: () => object; + export const touchSharedState: typeof import('../shared-app/federationState.js').snapshot; + export default Card; +} + +declare module 'catalog/Details' { + const Details: import('@lynx-js/react').ComponentType< + import('../remote-ui/contracts.js').RemoteDetailsProps + >; + export const sharedInstance: () => string; + export const sharedSnapshot: typeof import('../shared-app/federationState.js').snapshot; + export const sharedToken: () => object; + export const touchSharedState: typeof import('../shared-app/federationState.js').snapshot; + export default Details; +} + +declare module 'catalog/ActivityFeed' { + const ActivityFeed: import('@lynx-js/react').ComponentType< + import('../remote-ui/contracts.js').ActivityFeedProps + >; + export const sharedInstance: () => string; + export const sharedSnapshot: typeof import('../shared-app/federationState.js').snapshot; + export const sharedToken: () => object; + export default ActivityFeed; +} diff --git a/apps/lynx-module-federation-demo/src/app/federation.ts b/apps/lynx-module-federation-demo/src/app/federation.ts new file mode 100644 index 00000000000..78524686f7d --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/federation.ts @@ -0,0 +1,58 @@ +import type { ComponentType } from '@lynx-js/react'; +import { getInstance } from '@module-federation/runtime-tools'; + +import type { + ActivityFeedProps, + RemoteCardProps, + RemoteDetailsProps, +} from '../remote-ui/contracts'; + +export interface SharedObserverExports { + sharedInstance: () => string; + sharedSnapshot: () => { count: number; instanceId: string }; + sharedToken: () => object; +} + +export interface SharedRemoteExports extends SharedObserverExports { + touchSharedState: () => { count: number; instanceId: string }; +} + +export interface CardRemoteModule extends SharedRemoteExports { + default: ComponentType; +} + +export interface DetailsRemoteModule extends SharedRemoteExports { + default: ComponentType; +} + +export interface ActivityFeedRemoteModule extends SharedObserverExports { + default: ComponentType; +} + +export async function loadCompiledImportRemotes() { + const [card, details] = await Promise.all([ + import('catalog/Card'), + import('catalog/Details'), + ]); + + return { card, details }; +} + +export async function loadRuntimeActivityFeed() { + const instance = getInstance( + (candidate) => candidate.name === 'orbit_control', + ); + if (!instance) { + throw new Error('The orbit_control federation instance is unavailable.'); + } + + const activityFeed = await instance.loadRemote( + 'catalog/ActivityFeed', + ); + + if (!activityFeed) { + throw new Error('catalog/ActivityFeed returned no module.'); + } + + return activityFeed; +} diff --git a/apps/lynx-module-federation-demo/src/app/index.tsx b/apps/lynx-module-federation-demo/src/app/index.tsx new file mode 100644 index 00000000000..86c1e378589 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/index.tsx @@ -0,0 +1,10 @@ +import '@lynx-js/react/experimental/lazy/import'; +import { root } from '@lynx-js/react'; + +import { App } from './App'; + +root.render(); + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept(); +} diff --git a/apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts b/apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts new file mode 100644 index 00000000000..b0b58e687d6 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts @@ -0,0 +1,212 @@ +import { + type ComponentType, + useCallback, + useRef, + useState, +} from '@lynx-js/react'; + +import { + increment, + instanceId, + reset, + snapshot, + token, +} from 'orbit-shared-state'; +import type { + ActivityEntry, + ActivityFeedProps, + ActivityFilter, + RemoteCardProps, + RemoteDetailsProps, + SharedStateView, +} from '../remote-ui/contracts'; +import { + loadCompiledImportRemotes, + loadRuntimeActivityFeed, +} from './federation'; + +export type LoadState = 'idle' | 'loading' | 'ready' | 'error'; + +const INITIAL_ACTIVITY: ActivityEntry[] = [ + { + id: 'boot-host', + category: 'runtime', + detail: 'Rspeedy started the official ReactLynx host bundle.', + time: 'NOW', + title: 'Host launched', + }, +]; + +export function useFederatedCatalog() { + const [loadState, setLoadState] = useState('idle'); + const [loadError, setLoadError] = useState(''); + const [sharedState, setSharedState] = useState(snapshot()); + const [singletonShared, setSingletonShared] = useState(false); + const [activity, setActivity] = useState(INITIAL_ACTIVITY); + const [filter, setFilter] = useState('all'); + const [CardComponent, setCardComponent] = + useState | null>(null); + const [DetailsComponent, setDetailsComponent] = + useState | null>(null); + const [ActivityFeedComponent, setActivityFeedComponent] = + useState | null>(null); + const validatedRef = useRef(false); + + const loadFederatedSurface = useCallback(async () => { + 'background-only'; + if (loadState === 'loading') { + return; + } + + setLoadState('loading'); + setLoadError(''); + + try { + const [compiled, runtime] = await Promise.all([ + loadCompiledImportRemotes(), + loadRuntimeActivityFeed(), + ]); + + setCardComponent(() => compiled.card.default); + setDetailsComponent(() => compiled.details.default); + setActivityFeedComponent(() => runtime.default); + + let nextSnapshot = snapshot(); + if (!validatedRef.current) { + compiled.card.touchSharedState(); + nextSnapshot = compiled.details.touchSharedState(); + validatedRef.current = true; + } + + const identityShared = + compiled.card.sharedToken() === token && + compiled.details.sharedToken() === token && + runtime.sharedToken() === token && + compiled.card.sharedInstance() === instanceId && + compiled.details.sharedInstance() === instanceId && + runtime.sharedInstance() === instanceId && + [ + compiled.card.sharedSnapshot(), + compiled.details.sharedSnapshot(), + runtime.sharedSnapshot(), + ].every( + (remoteState) => + remoteState.count === nextSnapshot.count && + remoteState.instanceId === nextSnapshot.instanceId, + ); + + setSharedState(nextSnapshot); + setSingletonShared(identityShared); + setLoadState('ready'); + setActivity((entries) => [ + { + id: `state-${nextSnapshot.revision}`, + category: 'state', + detail: `Host, Card, and Details share instance ${instanceId}.`, + time: 'NOW', + title: 'Shared counter updated', + }, + { + id: 'runtime-feed', + category: 'runtime', + detail: "Runtime API resolved loadRemote('catalog/ActivityFeed').", + time: 'NOW', + title: 'Activity feed mounted', + }, + { + id: 'compiled-imports', + category: 'runtime', + detail: 'Compiled imports resolved catalog/Card and catalog/Details.', + time: 'NOW', + title: 'Catalog modules mounted', + }, + { + id: 'manifest-resolved', + category: 'runtime', + detail: 'mf-manifest.json resolved the remote Lynx bundle over HTTP.', + time: 'NOW', + title: 'Manifest resolved', + }, + ...entries.filter((entry) => entry.id === 'boot-host'), + ]); + } catch (error) { + setLoadError(error instanceof Error ? error.message : String(error)); + setLoadState('error'); + } + }, [loadState]); + + const handleHostIncrement = useCallback(() => { + 'background-only'; + increment('host/action'); + const nextSnapshot = snapshot(); + setSharedState(nextSnapshot); + setActivity((entries) => [ + { + id: `increment-${nextSnapshot.revision}`, + category: 'state', + detail: `All singleton consumers now observe count ${nextSnapshot.count}.`, + time: 'NOW', + title: 'Shared counter incremented', + }, + ...entries, + ]); + }, []); + + const handleRemoteStateChange = useCallback( + (nextSnapshot: SharedStateView) => { + 'background-only'; + setSharedState(nextSnapshot); + setActivity((entries) => [ + { + id: `increment-${nextSnapshot.revision}`, + category: 'state', + detail: `catalog/Card mutated the shared singleton to ${nextSnapshot.count}; every observer re-read it.`, + time: 'NOW', + title: 'Remote changed shared state', + }, + ...entries, + ]); + }, + [], + ); + + const handleReset = useCallback(() => { + 'background-only'; + const nextSnapshot = reset(); + setSharedState(nextSnapshot); + setFilter('all'); + setActivity([ + { + id: `reset-${nextSnapshot.revision}`, + category: 'state', + detail: + 'Host reset the shared singleton and cleared the activity feed.', + time: 'NOW', + title: 'Workspace reset', + }, + ...INITIAL_ACTIVITY, + ]); + }, []); + + const selectFilter = useCallback((nextFilter: ActivityFilter) => { + 'background-only'; + setFilter(nextFilter); + }, []); + + return { + ActivityFeedComponent, + CardComponent, + DetailsComponent, + activity, + filter, + handleHostIncrement, + handleRemoteStateChange, + handleReset, + loadError, + loadFederatedSurface, + loadState, + selectFilter, + sharedState, + singletonShared, + }; +} diff --git a/apps/lynx-module-federation-demo/src/remote-ui/ActivityFeed.tsx b/apps/lynx-module-federation-demo/src/remote-ui/ActivityFeed.tsx new file mode 100644 index 00000000000..fb5b2a485e4 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/remote-ui/ActivityFeed.tsx @@ -0,0 +1,104 @@ +import { useCallback } from '@lynx-js/react'; +import { instanceId, snapshot, token } from 'orbit-shared-state'; + +import type { ActivityFeedProps, ActivityFilter } from './contracts'; +import './Remote.css'; + +const FILTERS: Array<{ id: ActivityFilter; label: string }> = [ + { id: 'all', label: 'All' }, + { id: 'runtime', label: 'Runtime' }, + { id: 'state', label: 'Shared state' }, +]; + +export function ActivityFeed({ + entries, + filter, + onFilterChange, +}: ActivityFeedProps) { + const sharedState = snapshot(); + const selectFilter = useCallback( + (nextFilter: ActivityFilter) => { + 'background-only'; + onFilterChange(nextFilter); + }, + [onFilterChange], + ); + + const visibleEntries = + filter === 'all' + ? entries + : entries.filter((entry) => entry.category === filter); + + return ( + + + Federated activity + + SHARED COUNT {sharedState.count} + + + + {FILTERS.map((item) => ( + selectFilter(item.id)} + > + + {item.label} + + + ))} + + + + {visibleEntries.map((entry) => ( + + + + + {entry.title} + {entry.time} + + {entry.detail} + + + ))} + + + {visibleEntries.length === 0 ? ( + + No activity in this filter. + + ) : null} + + ); +} + +export const sharedInstance = () => instanceId; +export const sharedSnapshot = snapshot; +export const sharedToken = () => token; + +export default ActivityFeed; diff --git a/apps/lynx-module-federation-demo/src/remote-ui/Card.tsx b/apps/lynx-module-federation-demo/src/remote-ui/Card.tsx new file mode 100644 index 00000000000..463bb179ca2 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/remote-ui/Card.tsx @@ -0,0 +1,73 @@ +import { useCallback } from '@lynx-js/react'; +import { increment, instanceId, snapshot, token } from 'orbit-shared-state'; + +import type { RemoteCardProps } from './contracts'; +import './Remote.css'; + +export function Card({ loadPath, onStateChange }: RemoteCardProps) { + const sharedState = snapshot(); + const incrementFromRemote = useCallback(() => { + 'background-only'; + increment('catalog/Card'); + onStateChange(snapshot()); + }, [onStateChange]); + + return ( + + + + Shared state + + + + + REMOTE CARD + + + + + + + {sharedState.count} + + read by catalog/Card + + + + + Last writer + + {sharedState.lastSource} + + + + Revision + {sharedState.revision} + + + + + Direct singleton read · {sharedState.instanceId} · {loadPath} + + + + Increment from remote + + + ); +} + +export function touchSharedState() { + increment('catalog/Card'); + return snapshot(); +} + +export const sharedInstance = () => instanceId; +export const sharedSnapshot = snapshot; +export const sharedToken = () => token; + +export default Card; diff --git a/apps/lynx-module-federation-demo/src/remote-ui/Details.tsx b/apps/lynx-module-federation-demo/src/remote-ui/Details.tsx new file mode 100644 index 00000000000..d037f3e16cd --- /dev/null +++ b/apps/lynx-module-federation-demo/src/remote-ui/Details.tsx @@ -0,0 +1,48 @@ +import { increment, instanceId, snapshot, token } from 'orbit-shared-state'; + +import './Remote.css'; + +export function Details() { + const sharedState = snapshot(); + + return ( + + + Realm status + + + REMOTE DETAILS + + + + + + Background + + READY · COUNT {sharedState.count} + + + + Main thread + READY · ISOLATED + + + + + Direct singleton read · {sharedState.instanceId} · revision{' '} + {sharedState.revision} + + + ); +} + +export const sharedInstance = () => instanceId; +export const sharedSnapshot = snapshot; +export const sharedToken = () => token; + +export function touchSharedState() { + increment('catalog/Details'); + return snapshot(); +} + +export default Details; diff --git a/apps/lynx-module-federation-demo/src/remote-ui/Remote.css b/apps/lynx-module-federation-demo/src/remote-ui/Remote.css new file mode 100644 index 00000000000..a9826ebe166 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/remote-ui/Remote.css @@ -0,0 +1,287 @@ +.RemotePanel { + display: flex; + flex-direction: column; + background-color: #17212b; + border-width: 1px; + border-color: #2c3946; + border-radius: 20px; + padding: 18px; + margin-bottom: 12px; +} + +.RemotePanelAccent { + background-color: #effcf6; + border-color: #b7ecd1; +} + +.RemotePanelHeader { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; +} + +.RemotePanelTitle { + color: #f7fbff; + font-size: 18px; + font-weight: 700; +} + +.RemotePanelTitleDark { + color: #13221a; +} + +.RemoteStatus { + display: flex; + flex-direction: row; + align-items: center; +} + +.RemoteStatusDot { + width: 8px; + height: 8px; + border-radius: 4px; + background-color: #60e2a4; + margin-right: 7px; +} + +.RemoteStatusText { + color: #93a3b3; + font-size: 11px; + font-weight: 600; +} + +.RemoteStatusTextDark { + color: #35654d; +} + +.HealthRow { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding-top: 10px; + padding-bottom: 10px; + border-bottom-width: 1px; + border-bottom-color: #2c3946; +} + +.HealthRowLast { + border-bottom-width: 0; +} + +.HealthLabel { + color: #93a3b3; + font-size: 13px; +} + +.HealthValue { + color: #f7fbff; + font-size: 13px; + font-weight: 650; +} + +.CountHero { + display: flex; + flex-direction: row; + align-items: flex-end; + margin-bottom: 14px; +} + +.CountValue { + color: #13221a; + font-size: 44px; + font-weight: 750; + line-height: 48px; +} + +.CountLabel { + color: #52705f; + font-size: 12px; + margin-left: 10px; + margin-bottom: 6px; +} + +.CountGrid { + display: flex; + flex-direction: row; + justify-content: space-between; + background-color: #dff7e9; + border-radius: 14px; + padding: 12px; + margin-bottom: 12px; +} + +.CountCell { + display: flex; + flex-direction: column; + align-items: center; + width: 31%; +} + +.CountCellLabel { + color: #52705f; + font-size: 10px; + margin-bottom: 4px; +} + +.CountCellValue { + color: #13221a; + font-size: 18px; + font-weight: 700; +} + +.RemoteAction { + height: 42px; + border-radius: 13px; + background-color: #ff6c47; + align-items: center; + justify-content: center; +} + +.RemoteActionText { + color: #ffffff; + font-size: 13px; + font-weight: 700; +} + +.IdentityLine { + color: #35654d; + font-size: 11px; + line-height: 16px; + margin-bottom: 12px; +} + +.RealmGrid { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.RealmCell { + width: 48%; + background-color: #22303d; + border-radius: 14px; + padding: 13px; +} + +.RealmName { + color: #f7fbff; + font-size: 12px; + font-weight: 650; + margin-bottom: 6px; +} + +.RealmMeta { + color: #60e2a4; + font-size: 10px; +} + +.ActivityPanel { + display: flex; + flex-direction: column; + margin-top: 8px; +} + +.FilterRow { + display: flex; + flex-direction: row; + margin-bottom: 12px; +} + +.FilterButton { + height: 34px; + padding-left: 14px; + padding-right: 14px; + border-radius: 17px; + background-color: #e8edf1; + align-items: center; + justify-content: center; + margin-right: 8px; +} + +.FilterButtonActive { + background-color: #17212b; +} + +.FilterText { + color: #64717d; + font-size: 11px; + font-weight: 650; +} + +.FilterTextActive { + color: #ffffff; +} + +.ActivityList { + width: 100%; + height: 324px; + background-color: #ffffff; + border-radius: 18px; +} + +.ActivityRow { + width: 100%; + min-height: 76px; + display: flex; + flex-direction: row; + padding: 14px; + border-bottom-width: 1px; + border-bottom-color: #e8edf1; +} + +.ActivityMarker { + width: 10px; + height: 10px; + border-radius: 5px; + background-color: #4a7cfa; + margin-top: 4px; + margin-right: 12px; +} + +.ActivityMarkerState { + background-color: #ff6c47; +} + +.ActivityCopy { + display: flex; + flex-direction: column; + flex: 1; +} + +.ActivityTopline { + display: flex; + flex-direction: row; + justify-content: space-between; + margin-bottom: 4px; +} + +.ActivityTitle { + color: #17212b; + font-size: 13px; + font-weight: 700; +} + +.ActivityTime { + color: #89949e; + font-size: 10px; +} + +.ActivityDetail { + color: #64717d; + font-size: 11px; + line-height: 16px; +} + +.EmptyActivity { + height: 140px; + align-items: center; + justify-content: center; +} + +.EmptyActivityText { + color: #64717d; + font-size: 13px; +} diff --git a/apps/lynx-module-federation-demo/src/remote-ui/bootstrap.ts b/apps/lynx-module-federation-demo/src/remote-ui/bootstrap.ts new file mode 100644 index 00000000000..cb0ff5c3b54 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/remote-ui/bootstrap.ts @@ -0,0 +1 @@ +export {}; diff --git a/apps/lynx-module-federation-demo/src/remote-ui/contracts.ts b/apps/lynx-module-federation-demo/src/remote-ui/contracts.ts new file mode 100644 index 00000000000..bff4168cc06 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/remote-ui/contracts.ts @@ -0,0 +1,29 @@ +export interface RemoteCardProps { + loadPath: string; + onStateChange: (state: SharedStateView) => void; +} + +export interface SharedStateView { + count: number; + instanceId: string; + lastSource: string; + revision: number; +} + +export type RemoteDetailsProps = Record; + +export type ActivityFilter = 'all' | 'runtime' | 'state'; + +export interface ActivityEntry { + id: string; + category: Exclude; + detail: string; + time: string; + title: string; +} + +export interface ActivityFeedProps { + entries: ActivityEntry[]; + filter: ActivityFilter; + onFilterChange: (filter: ActivityFilter) => void; +} diff --git a/apps/lynx-module-federation-demo/src/shared-app/federationState.ts b/apps/lynx-module-federation-demo/src/shared-app/federationState.ts new file mode 100644 index 00000000000..bb67da54a3b --- /dev/null +++ b/apps/lynx-module-federation-demo/src/shared-app/federationState.ts @@ -0,0 +1,40 @@ +export type FederationStateSource = + | 'host' + | 'host/action' + | 'catalog/Card' + | 'catalog/Details'; + +export interface FederationStateSnapshot { + count: number; + instanceId: string; + lastSource: FederationStateSource; + revision: number; +} + +export const instanceId = `orbit-${Date.now().toString(36)}-${Math.random() + .toString(36) + .slice(2, 8)}`; + +export const token = {}; + +let count = 1; +let lastSource: FederationStateSource = 'host'; +let revision = 0; + +export function increment(source: FederationStateSource = 'host'): number { + count += 1; + revision += 1; + lastSource = source; + return count; +} + +export function reset(): FederationStateSnapshot { + count = 0; + revision += 1; + lastSource = 'host'; + return snapshot(); +} + +export function snapshot(): FederationStateSnapshot { + return { count, instanceId, lastSource, revision }; +} diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs new file mode 100644 index 00000000000..c5bfc67d91c --- /dev/null +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -0,0 +1,145 @@ +import assert from 'node:assert/strict'; +import { readFile, readdir, stat } from 'node:fs/promises'; +import { createRequire } from 'node:module'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const appRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url))); +const requireFromAdapter = createRequire( + path.join(appRoot, '../../packages/lynx/package.json'), +); +const { decode_napi: decodeTemplate } = requireFromAdapter('@lynx-js/tasm'); +const hostBundlePath = path.join(appRoot, 'dist/host-native/main.lynx.bundle'); +const remoteBundlePath = path.join( + appRoot, + 'dist/remote-native/catalog.native.lynx.bundle', +); +const remoteManifestPath = path.join( + appRoot, + 'dist/remote-native/mf-manifest.json', +); +const remoteStatsPath = path.join(appRoot, 'dist/remote-native/mf-stats.json'); + +const [ + hostBundle, + remoteBundle, + manifestSource, + statsSource, + remoteFiles, + lazyFiles, +] = await Promise.all([ + stat(hostBundlePath), + stat(remoteBundlePath), + readFile(remoteManifestPath, 'utf8'), + readFile(remoteStatsPath, 'utf8'), + readdir(path.join(appRoot, 'dist/remote-native')), + readdir(path.join(appRoot, 'dist/remote-native/async')), +]); + +assert.ok(hostBundle.isFile() && hostBundle.size > 1_000, hostBundlePath); +assert.ok(remoteBundle.isFile() && remoteBundle.size > 1_000, remoteBundlePath); +assert.ok(!remoteFiles.includes('bootstrap.lynx.bundle')); +assert.equal(lazyFiles.filter((name) => name.endsWith('.bundle')).length, 3); + +const [hostTemplate, remoteTemplate] = await Promise.all([ + readFile(hostBundlePath).then(decodeTemplate), + readFile(remoteBundlePath).then(decodeTemplate), +]); +assert.equal(remoteTemplate['app-type'], 'DynamicComponent'); +assert.equal(remoteTemplate['engine-version'], '3.7'); +assert.deepEqual(Object.keys(remoteTemplate['custom-sections']), ['catalog']); +const containerSource = remoteTemplate['custom-sections'].catalog; +assert.match(containerSource, /lynx_chunking/); +assert.match(containerSource, /split/); +for (const implementationText of [ + 'Increment from remote', + 'Federated activity', + 'Realm status', +]) { + assert.ok( + !containerSource.includes(implementationText), + `split container includes exposed implementation: ${implementationText}`, + ); +} + +const hostSource = JSON.stringify(hostTemplate); +assert.match( + hostSource, + /http:\/\/127\.0\.0\.1:3000\/remote-native\/mf-manifest\.json/, +); +assert.match(hostSource, /lynx-federation-runtime-plugin/); +for (const request of [ + 'catalog/ActivityFeed', + 'catalog/Card', + 'catalog/Details', +]) { + assert.ok(hostSource.includes(request), `host omits ${request}`); +} + +const manifest = JSON.parse(manifestSource); +const stats = JSON.parse(statsSource); +assert.equal(manifest.metaData?.name, 'catalog'); +assert.deepEqual(manifest.metaData?.remoteEntry, { + name: 'catalog.native.lynx.bundle', + path: '', + type: 'lynx', +}); + +assert.ok(Array.isArray(manifest.exposes)); +assert.deepEqual(manifest.exposes.map(({ name }) => name).sort(), [ + 'ActivityFeed', + 'Card', + 'Details', +]); +assert.deepEqual( + stats.exposes.map(({ name }) => name).sort(), + manifest.exposes.map(({ name }) => name).sort(), +); +for (const exposed of manifest.exposes) { + assert.equal(exposed.layer, 'react:background', exposed.name); + assert.equal(exposed.path, `./${exposed.name}`); + assert.deepEqual(exposed.assets?.js, { sync: [], async: [] }); + assert.deepEqual(exposed.assets?.css, { sync: [], async: [] }); + const lazyName = lazyFiles.find((name) => + name.startsWith(`catalog__background_${exposed.name}.`), + ); + assert.ok(lazyName, `${exposed.name} lazy bundle is missing`); + const lazyPath = path.join(appRoot, 'dist/remote-native/async', lazyName); + const lazyStat = await stat(lazyPath); + assert.ok(lazyStat.isFile() && lazyStat.size > 1_000, lazyPath); + const lazyTemplate = decodeTemplate(await readFile(lazyPath)); + assert.equal(lazyTemplate['app-type'], 'DynamicComponent', lazyName); + assert.ok( + lazyTemplate['background-thread-script']?.length > 0, + `${lazyName} has no background script`, + ); + assert.ok( + !JSON.stringify(exposed).includes('__main_thread'), + `${exposed.name} contains a main-thread alias`, + ); +} + +assert.ok(Array.isArray(manifest.shared)); +assert.deepEqual( + manifest.shared.map(({ name }) => name), + ['orbit-shared-state'], +); +for (const shared of manifest.shared) { + assert.equal(shared.layer, 'react:background', shared.name); + assert.equal(shared.shareScope, undefined); + assert.equal(shared.singleton, true, shared.name); +} +assert.deepEqual( + stats.shared.map(({ name }) => name), + ['orbit-shared-state'], +); +assert.ok( + manifest.exposes.some((exposed) => + exposed.requiredShared?.some( + (shared) => shared.name === 'orbit-shared-state', + ), + ), + 'no expose records its shared-state dependency', +); + +console.log('Native Lynx host and federation remote artifacts verified.'); diff --git a/apps/lynx-module-federation-demo/test/native-dev-server.mjs b/apps/lynx-module-federation-demo/test/native-dev-server.mjs new file mode 100644 index 00000000000..cbecbc1ec2e --- /dev/null +++ b/apps/lynx-module-federation-demo/test/native-dev-server.mjs @@ -0,0 +1,112 @@ +import assert from 'node:assert/strict'; +import { readdir, rm } from 'node:fs/promises'; +import { createServer } from 'node:net'; +import { spawn, spawnSync } from 'node:child_process'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const appRoot = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '..', +); + +const reservePort = () => + new Promise((resolve, reject) => { + const server = createServer(); + server.once('error', reject); + server.listen(0, '127.0.0.1', () => { + const address = server.address(); + assert.ok(address && typeof address === 'object'); + server.close((error) => (error ? reject(error) : resolve(address.port))); + }); + }); + +const port = await reservePort(); +const origin = `http://127.0.0.1:${port}`; +const devEnvironment = { + ...process.env, + LYNX_DEV_HOST: '127.0.0.1', + LYNX_DEV_PORT: String(port), + LYNX_REMOTE_ORIGIN: origin, +}; +await rm(path.join(appRoot, 'dist/remote-native'), { + force: true, + recursive: true, +}); +const remoteBuild = spawnSync( + process.execPath, + ['rspack-canary-rspeedy.mjs', 'build', '-c', 'lynx.remote.native.config.mjs'], + { cwd: appRoot, encoding: 'utf8', env: devEnvironment }, +); +assert.equal( + remoteBuild.status, + 0, + `Native remote rebuild failed:\n${remoteBuild.stdout}\n${remoteBuild.stderr}`, +); +const output = []; +const child = spawn( + process.execPath, + ['rspack-canary-rspeedy.mjs', 'dev', '-c', 'lynx.config.mjs'], + { + cwd: appRoot, + env: devEnvironment, + stdio: ['ignore', 'pipe', 'pipe'], + }, +); +child.stdout.on('data', (chunk) => output.push(chunk.toString())); +child.stderr.on('data', (chunk) => output.push(chunk.toString())); + +const fetchReady = async (url, timeout = 30_000) => { + const deadline = Date.now() + timeout; + let lastError; + while (Date.now() < deadline) { + try { + const response = await fetch(url); + if (response.ok) return response; + lastError = new Error(`${response.status} ${response.statusText}`); + } catch (error) { + lastError = error; + } + await new Promise((resolve) => setTimeout(resolve, 100)); + } + throw new Error( + `Native dev asset did not become available at ${url}: ${lastError}\n${output.join('')}`, + ); +}; + +try { + await fetchReady(`${origin}/main.lynx.bundle`); + const manifestResponse = await fetchReady( + `${origin}/remote-native/mf-manifest.json`, + ); + const manifest = await manifestResponse.json(); + assert.equal(manifest.metaData.publicPath, `${origin}/remote-native/`); + const remoteEntry = manifest.metaData.remoteEntry; + await fetchReady( + new URL( + `${remoteEntry.path}${remoteEntry.name}`, + manifest.metaData.publicPath, + ), + ); + + const lazyFiles = await readdir( + path.join(appRoot, 'dist/remote-native/async'), + ); + const lazyBundles = lazyFiles.filter((name) => name.endsWith('.bundle')); + assert.equal(lazyBundles.length, 3); + await Promise.all( + lazyBundles.map((name) => + fetchReady(`${origin}/remote-native/async/${name}`), + ), + ); + process.stdout.write( + `Native Rspeedy dev server served host, manifest, container, and ${lazyBundles.length} lazy bundles.\n`, + ); +} finally { + child.kill('SIGTERM'); + await Promise.race([ + new Promise((resolve) => child.once('exit', resolve)), + new Promise((resolve) => setTimeout(resolve, 5_000)), + ]); + if (child.exitCode === null) child.kill('SIGKILL'); +} diff --git a/apps/lynx-module-federation-demo/test/real-web/README.md b/apps/lynx-module-federation-demo/test/real-web/README.md new file mode 100644 index 00000000000..74b9a0d6f6f --- /dev/null +++ b/apps/lynx-module-federation-demo/test/real-web/README.md @@ -0,0 +1,18 @@ +# Real Lynx Web E2E + +`run.mjs` mounts the official Rspeedy `main.web.bundle` in the public +`@lynx-js/web-core` `` client at a mobile viewport. It serves the +federation manifest and remote Lynx bundle over HTTP, exercises both import +styles and shared singleton state, and terminates its browser and ephemeral +server on success or failure. + +Expected artifacts: + +- `dist/host-web/main.web.bundle` +- `dist/remote-web/mf-manifest.json` +- `dist/remote-web/catalog.web.lynx.bundle` + +Override them with `LYNX_HOST_WEB_BUNDLE`, `LYNX_REMOTE_MANIFEST`, and +`LYNX_REMOTE_WEB_BUNDLE`. A failed run writes +`test/real-web/artifacts/failure.png` (override with +`LYNX_WEB_E2E_SCREENSHOT`). diff --git a/apps/lynx-module-federation-demo/test/real-web/index.html b/apps/lynx-module-federation-demo/test/real-web/index.html new file mode 100644 index 00000000000..eca3dc2a438 --- /dev/null +++ b/apps/lynx-module-federation-demo/test/real-web/index.html @@ -0,0 +1,45 @@ + + + + + + + Orbit Control · Lynx Web E2E + + + + + + + + + diff --git a/apps/lynx-module-federation-demo/test/real-web/run.mjs b/apps/lynx-module-federation-demo/test/real-web/run.mjs new file mode 100644 index 00000000000..ea19fef6f60 --- /dev/null +++ b/apps/lynx-module-federation-demo/test/real-web/run.mjs @@ -0,0 +1,400 @@ +import assert from 'node:assert/strict'; +import { access, mkdir, readFile, stat } from 'node:fs/promises'; +import { createServer } from 'node:http'; +import { createRequire } from 'node:module'; +import path from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const testRoot = path.dirname(fileURLToPath(import.meta.url)); +const appRoot = path.resolve(testRoot, '../..'); +const repoRoot = path.resolve(appRoot, '../..'); +const requireFromApp = createRequire(path.join(appRoot, 'package.json')); +const requireFromRepo = createRequire(path.join(repoRoot, 'package.json')); + +const resolveFromApp = (specifier) => + path.dirname(requireFromApp.resolve(`${specifier}/package.json`)); +const webCoreRoot = resolveFromApp('@lynx-js/web-core'); +const requireFromWebCore = createRequire( + path.join(webCoreRoot, 'package.json'), +); +const webElementsRoot = path.dirname( + requireFromWebCore.resolve('@lynx-js/web-elements/package.json'), +); + +const fromAppRoot = (value, fallback) => + path.resolve(appRoot, value ?? fallback); +const hostBundlePath = fromAppRoot( + process.env.LYNX_HOST_WEB_BUNDLE, + 'dist/host-web/main.web.bundle', +); +const remoteManifestPath = fromAppRoot( + process.env.LYNX_REMOTE_MANIFEST, + 'dist/remote-web/mf-manifest.json', +); +const remoteBundlePath = fromAppRoot( + process.env.LYNX_REMOTE_WEB_BUNDLE, + 'dist/remote-web/catalog.web.lynx.bundle', +); +const hostOutputRoot = path.dirname(hostBundlePath); +const remoteOutputRoot = path.dirname(remoteManifestPath); +const screenshotPath = fromAppRoot( + process.env.LYNX_WEB_E2E_SCREENSHOT, + 'test/real-web/artifacts/failure.png', +); +const readinessTimeout = Number(process.env.LYNX_WEB_E2E_TIMEOUT ?? 60_000); + +const requiredArtifacts = [ + ['Rspeedy host web bundle', hostBundlePath], + ['federation manifest', remoteManifestPath], + ['federated Lynx web bundle', remoteBundlePath], +]; +for (const [name, file] of requiredArtifacts) { + await assert.doesNotReject( + access(file), + `${name} is missing at ${file}; build the official Rspeedy demo first`, + ); +} + +const contentTypes = new Map([ + ['.bundle', 'application/octet-stream'], + ['.css', 'text/css; charset=utf-8'], + ['.html', 'text/html; charset=utf-8'], + ['.js', 'text/javascript; charset=utf-8'], + ['.json', 'application/json; charset=utf-8'], + ['.map', 'application/json; charset=utf-8'], + ['.wasm', 'application/wasm'], +]); + +const inside = (root, pathname) => { + const relative = decodeURIComponent(pathname).replace(/^\/+/, ''); + const file = path.resolve(root, relative); + const back = path.relative(root, file); + return back === '' || (!back.startsWith('..') && !path.isAbsolute(back)) + ? file + : undefined; +}; + +const routes = [ + ['/dist/host-web/', hostOutputRoot], + ['/dist/remote-web/', remoteOutputRoot], + ['/remote-web/', remoteOutputRoot], + ['/node_modules/@lynx-js/web-core/', webCoreRoot], + ['/node_modules/@lynx-js/web-elements/', webElementsRoot], + ['/test/real-web/', testRoot], +]; + +const requests = []; +let baseUrl; + +const resolveAsset = (pathname) => { + if (pathname === '/') return path.join(testRoot, 'index.html'); + for (const [prefix, root] of routes) { + if (pathname.startsWith(prefix)) { + return inside(root, pathname.slice(prefix.length)); + } + } + return undefined; +}; + +const server = createServer(async (request, response) => { + const pathname = new URL(request.url ?? '/', 'http://127.0.0.1').pathname; + requests.push(pathname); + try { + const file = resolveAsset(pathname); + if (!file || !(await stat(file)).isFile()) { + response.writeHead(404).end('Not found'); + return; + } + + let body = await readFile(file); + if (path.resolve(file) === path.resolve(remoteManifestPath)) { + const manifest = JSON.parse(body.toString('utf8')); + manifest.metaData ??= {}; + manifest.metaData.publicPath = `${baseUrl}/dist/remote-web/`; + body = Buffer.from(JSON.stringify(manifest)); + } + + response.writeHead(200, { + 'access-control-allow-origin': '*', + 'cache-control': 'no-store', + 'content-length': body.byteLength, + 'content-type': + contentTypes.get(path.extname(file)) ?? 'application/octet-stream', + 'cross-origin-embedder-policy': 'require-corp', + 'cross-origin-opener-policy': 'same-origin', + }); + if (request.method === 'HEAD') response.end(); + else response.end(body); + } catch (error) { + if (error?.code === 'ENOENT' || error?.code === 'ENOTDIR') { + response.writeHead(404).end('Not found'); + return; + } + response.writeHead(500).end(String(error)); + } +}); + +await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', resolve); +}); + +const address = server.address(); +assert.ok(address && typeof address === 'object'); +baseUrl = `http://127.0.0.1:${address.port}`; + +const playwrightEntry = requireFromRepo.resolve('@playwright/test'); +const playwrightModule = await import(pathToFileURL(playwrightEntry)); +const { chromium } = playwrightModule.default ?? playwrightModule; +let browser; +let page; + +const closeServer = () => + new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); + +const close = async () => { + await browser?.close(); + await closeServer(); +}; + +const onSignal = () => { + close().finally(() => process.exit(130)); +}; +process.once('SIGINT', onSignal); +process.once('SIGTERM', onSignal); + +const poll = async (read, accept, label, timeout = readinessTimeout) => { + const deadline = Date.now() + timeout; + let value; + let lastError; + while (Date.now() < deadline) { + try { + value = await read(); + if (accept(value)) return value; + } catch (error) { + lastError = error; + } + await new Promise((resolve) => setTimeout(resolve, 100)); + } + assert.fail( + `${label} did not become ready; last value: ${JSON.stringify(value)}${ + lastError ? `; last error: ${lastError.message}` : '' + }`, + ); +}; + +const text = (locator) => locator.textContent({ timeout: 1_000 }); +const numberFrom = async (locator) => { + const value = await text(locator); + const match = value?.match(/-?\d+/); + assert.ok(match, `Expected a numeric value in ${JSON.stringify(value)}`); + return Number(match[0]); +}; +const readCounts = (locators) => Promise.all(locators.map(numberFrom)); +const allEqual = (values) => values.every((value) => value === values[0]); +const tap = async (locator) => { + await locator.scrollIntoViewIfNeeded(); + await locator.tap(); +}; + +const pageErrors = []; +const consoleErrors = []; + +try { + browser = await chromium.launch({ + headless: true, + args: ['--disable-gpu', '--no-sandbox'], + }); + const context = await browser.newContext({ + deviceScaleFactor: 1, + hasTouch: true, + isMobile: true, + viewport: { width: 430, height: 932 }, + }); + page = await context.newPage(); + page.on('pageerror', (error) => + pageErrors.push(error.stack ?? error.message), + ); + page.on('console', (message) => { + if (message.type() === 'error') consoleErrors.push(message.text()); + }); + + await page.goto(`${baseUrl}/`, { + timeout: 60_000, + waitUntil: 'domcontentloaded', + }); + + const activePage = page.locator( + '#orbit-lynx-view [part="page"]:not([l-disposed])', + ); + await poll( + () => activePage.count(), + (count) => count === 1, + 'single active Lynx page', + ); + const app = activePage.getByTestId('orbit-control-app'); + await app.waitFor({ state: 'visible', timeout: readinessTimeout }); + assert.equal(await app.count(), 1, 'the app must render exactly once'); + + await tap(activePage.getByTestId('load-remotes')); + const ready = /ready|loaded|passed|success/i; + for (const testId of ['import-status', 'runtime-status']) { + const locator = activePage.getByTestId(testId); + const status = await poll( + () => text(locator), + (value) => ready.test(value ?? '') || /error/i.test(value ?? ''), + `${testId} evidence`, + ); + if (/error/i.test(status ?? '')) { + assert.fail( + `${testId} failed: ${await text(activePage.getByTestId('load-error'))}`, + ); + } + } + + const remoteCard = activePage.getByTestId('remote-card'); + await remoteCard.waitFor({ state: 'visible', timeout: readinessTimeout }); + assert.equal(await remoteCard.count(), 1, 'remote Card must render once'); + assert.equal( + await remoteCard.evaluate( + (element) => getComputedStyle(element).backgroundColor, + ), + 'rgb(239, 252, 246)', + 'remote CSS must be applied through the external Lynx bundle', + ); + const remoteDetails = activePage.getByTestId('remote-details'); + await remoteDetails.waitFor({ state: 'visible', timeout: readinessTimeout }); + assert.equal( + await remoteDetails.evaluate( + (element) => getComputedStyle(element).backgroundColor, + ), + 'rgb(23, 33, 43)', + 'Details must retain its dark remote style', + ); + assert.equal( + await app.evaluate((element) => getComputedStyle(element).backgroundColor), + 'rgb(244, 247, 248)', + 'remote CSS must not overwrite the host surface', + ); + + const singletonStatus = activePage.getByTestId('singleton-status'); + await poll( + () => text(singletonStatus), + (value) => /shared singleton verified/i.test(value ?? ''), + 'singleton identity proof', + ); + + const counts = [ + activePage.getByTestId('shared-host-count'), + activePage.getByTestId('shared-card-count'), + activePage.getByTestId('shared-details-count'), + activePage.getByTestId('shared-activity-count'), + ]; + const baseline = await poll( + () => readCounts(counts), + allEqual, + 'singleton counts', + ); + + await tap(activePage.getByTestId('increment-shared')); + const incremented = await poll( + () => readCounts(counts), + (values) => allEqual(values) && values[0] > baseline[0], + 'shared singleton increment', + ); + assert.ok(incremented[0] > baseline[0]); + await poll( + () => text(activePage.getByTestId('shared-last-source')), + (value) => value?.trim() === 'catalog/Card', + 'remote singleton mutation source', + ); + + await tap(activePage.getByTestId('nav-activity')); + await tap(activePage.getByTestId('reset-feed')); + await tap(activePage.getByTestId('nav-overview')); + await poll( + () => readCounts(counts), + (values) => allEqual(values) && values[0] === 0, + 'shared singleton reset', + ); + + const modulesNav = activePage.getByTestId('nav-modules'); + await tap(modulesNav); + await poll( + async () => ({ + active: await modulesNav.getAttribute('data-active'), + current: await modulesNav.getAttribute('aria-current'), + selected: await modulesNav.getAttribute('aria-selected'), + }), + ({ active, current, selected }) => + active === 'true' || current === 'page' || selected === 'true', + 'modules navigation state', + ); + + await poll( + () => Promise.resolve(requests), + (values) => + values.includes('/dist/remote-web/mf-manifest.json') || + values.includes('/remote-web/mf-manifest.json'), + 'manifest HTTP request', + ); + assert.ok( + requests.some((value) => + value.endsWith(`/${path.basename(remoteBundlePath)}`), + ), + `Remote bundle was not requested: ${JSON.stringify(requests)}`, + ); + const lazyBundleRequests = requests.filter( + (value) => value.includes('/async/') && value.endsWith('.bundle'), + ); + assert.equal( + lazyBundleRequests.length, + 3, + `each lazy exposure should be fetched once: ${JSON.stringify(lazyBundleRequests)}`, + ); + assert.equal( + new Set(lazyBundleRequests).size, + 3, + `split mode must fetch one lazy bundle per expose: ${JSON.stringify(lazyBundleRequests)}`, + ); + + const lynxErrors = await page.evaluate( + () => globalThis.__LYNX_WEB_E2E__?.errors ?? [], + ); + assert.deepEqual( + lynxErrors, + [], + `lynx-view errors: ${lynxErrors.join('\n')}`, + ); + assert.deepEqual(pageErrors, [], `page errors: ${pageErrors.join('\n')}`); + assert.deepEqual( + consoleErrors, + [], + `console errors: ${consoleErrors.join('\n')}`, + ); + + process.stdout.write( + `Real Lynx Web E2E passed at ${baseUrl} (${requests.length} requests)\n`, + ); +} catch (error) { + if (page) { + await mkdir(path.dirname(screenshotPath), { recursive: true }); + await page.screenshot({ path: screenshotPath, fullPage: true }); + } + throw new Error( + [ + error instanceof Error ? error.message : String(error), + `Failure screenshot: ${screenshotPath}`, + `Page errors: ${JSON.stringify(pageErrors)}`, + `Console errors: ${JSON.stringify(consoleErrors)}`, + `Requests: ${JSON.stringify(requests)}`, + ].join('\n'), + { cause: error }, + ); +} finally { + process.removeListener('SIGINT', onSignal); + process.removeListener('SIGTERM', onSignal); + await close(); +} diff --git a/apps/lynx-module-federation-demo/test/real-web/shell.js b/apps/lynx-module-federation-demo/test/real-web/shell.js new file mode 100644 index 00000000000..3824ea52863 --- /dev/null +++ b/apps/lynx-module-federation-demo/test/real-web/shell.js @@ -0,0 +1,26 @@ +import '@lynx-js/web-core/client'; + +const state = { + errors: [], + timings: [], +}; + +globalThis.__LYNX_WEB_E2E__ = state; + +await customElements.whenDefined('lynx-view'); + +const lynxView = document.createElement('lynx-view'); +lynxView.id = 'orbit-lynx-view'; +lynxView.initData = { e2e: true, surface: 'lynx-web' }; +lynxView.globalProps = { e2e: true, platform: 'web' }; +lynxView.setAttribute('height', '100%'); +lynxView.setAttribute('width', '100%'); +lynxView.addEventListener('error', (event) => { + state.errors.push(String(event.detail?.message ?? event.detail ?? event)); +}); +lynxView.addEventListener('timing', (event) => { + state.timings.push(event.detail); +}); + +document.body.append(lynxView); +lynxView.setAttribute('url', '/dist/host-web/main.web.bundle'); diff --git a/package.json b/package.json index 55523b699b2..6505747743e 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "verify:turbo": "node tools/scripts/verify-turbo-conventions.mjs", "e2e:modern": "pnpm exec turbo run test --filter=@module-federation/modern-js --filter=@module-federation/modern-js-v3 --concurrency=20", "e2e:runtime": "pnpm exec turbo run test:e2e --filter=runtime-host", + "e2e:lynx": "pnpm exec turbo run test --filter=lynx-module-federation-demo", "e2e:manifest:dev": "pnpm exec turbo run test:e2e --filter=3008-webpack-host", "e2e:manifest:prod": "pnpm exec turbo run test:e2e:production --filter=3008-webpack-host", "e2e:node": "node tools/scripts/run-node-e2e.mjs", diff --git a/packages/lynx/LICENSE b/packages/lynx/LICENSE new file mode 100644 index 00000000000..b0cebd8b67b --- /dev/null +++ b/packages/lynx/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Module Federation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/lynx/README.md b/packages/lynx/README.md new file mode 100644 index 00000000000..1cf4eef8cb3 --- /dev/null +++ b/packages/lynx/README.md @@ -0,0 +1,195 @@ +# Module Federation for Lynx + +`@module-federation/lynx` adapts Rspack Module Federation to official Rspeedy +applications. It preserves normal federated imports, adds a Lynx transport for +manifest-addressed `.lynx.bundle` files, and isolates shared modules by Lynx +JavaScript realm. + +The package requires a layers-capable Rspack build. The version verified by this +repository is `2.1.5-canary-54a0d8f3-20260715194831`. The bundle transport uses +`lynx.loadScript`, available in Lynx SDK 3.7 and later; `remoteBundle.engineVersion` +therefore defaults to `3.7`. + +## Host + +Register the adapter after the Lynx DSL plugin so it can use the official +`BACKGROUND` and `MAIN_THREAD` layers: + +```ts +import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; +import { defineConfig } from '@lynx-js/rspeedy'; +import { pluginLynxModuleFederation } from '@module-federation/lynx'; + +export default defineConfig({ + plugins: [ + pluginReactLynx(), + pluginLynxModuleFederation( + { + name: 'lynx_host', + remotes: { + catalog: 'catalog@https://example.test/mf-manifest.json', + }, + shared: { + 'app-state': { singleton: true, realm: 'background' }, + }, + }, + { + environment: 'lynx', + }, + ), + ], +}); +``` + +Application code keeps the usual syntax: + +```ts +const { default: Card } = await import('catalog/Card'); +``` + +The same manifest works through the runtime API: + +```ts +import { createInstance } from '@module-federation/runtime'; +import lynxRuntimePlugin from '@module-federation/lynx/runtimePlugin'; + +const federation = createInstance({ + name: 'lynx_runtime_host', + remotes: [ + { + name: 'catalog', + entry: 'https://example.test/mf-manifest.json', + }, + ], + plugins: [lynxRuntimePlugin()], +}); + +const Card = await federation.loadRemote('catalog/Card'); +``` + +Use the Module Federation manifest URL, not the generated JavaScript container +URL. The adapter rewrites `metaData.remoteEntry` to the public +`.lynx.bundle`; the generated `.js` container is an internal encoder input. + +## Remote bundles + +Native remotes are background-only: + +```ts +pluginLynxModuleFederation( + { + name: 'catalog', + exposes: { + './Card': './src/Card', + }, + shared: { + '@lynx-js/react': { singleton: true }, + }, + }, + { + environment: 'lynx', + remoteBundle: { + target: 'lynx', + filename: 'catalog.lynx.bundle', + }, + }, +); +``` + +Set `target: 'web'` and `mainThread: true` for a Lynx for Web remote that +supports both realms: + +```ts +pluginLynxModuleFederation(federationOptions, { + environment: 'web', + mainThread: true, + remoteBundle: { + target: 'web', + filename: 'catalog.web.lynx.bundle', + }, +}); +``` + +### Chunking modes + +`remoteBundle.chunking` controls deployment shape: + +| Mode | Output | Best for | +| ----------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------- | +| `split` (default) | Small container `.lynx.bundle` plus independently fetched lazy `.bundle` chunks | ReactLynx UI, caching, and requested-expose loading | +| `single` | One native `.lynx.bundle` containing background-only module chunks | Non-UI native modules requiring one deployment artifact | + +`split` is the federation-safe default. It avoids placing every expose and +shared fallback in the entry bundle. Keep all emitted lazy `.bundle` files +beside the remote entry (or under its manifest `publicPath`) when publishing. +Each ReactLynx exposure needs its own paired background/main-thread lazy root, +so Web remotes reject `single`. Native `single` is limited to background-only +modules; ReactLynx UI exposures must remain split. + +Ordinary Rspeedy entry bundles are preserved by default. A dedicated remote +environment may set `preserveSourceEntryBundles: false` to publish only its +manifest, federation container, and split exposure bundles. + +```mermaid +flowchart LR + H["Host import or loadRemote"] --> M["mf-manifest.json"] + M --> C["container.lynx.bundle"] + C --> R["Module Federation container"] + R --> A["ActivityFeed lazy .bundle"] + R --> D["Details lazy .bundle"] + R --> S["host-provided shared modules"] +``` + +The runtime fetches and registers the container with `lynx.fetchBundle`, then +evaluates its section with `lynx.loadScript`. In split mode, the generated +Lynx async-chunk map supplies the lazy `.bundle` URL; `lynx.loadLazyBundle` +fetches it, and the returned `ids`, `modules`, and `runtime` install into the +calling webpack runtime. Failed and timed-out entry loads are evicted so a +later request can retry. The default timeout is 30 seconds and can be changed +with `runtimePluginOptions.timeout`. + +The manifest declares `remoteEntry.type: 'lynx'`. The runtime plugin handles +only that type (or a `.lynx.bundle` URL), leaving `script`, `module`, and other +runtime-core loaders untouched. Explicit background-only raw JavaScript entries +may use `type: 'lynx-js'` and `lynx.requireModuleAsync`. + +## Layers and singletons + +With `mainThread: true`, exposes are compiled for both Lynx issuer layers and +shared declarations are registered in a realm-qualified scope. Unqualified +shares default to the background realm; use `realm: 'main-thread'` only for a +module authored for that runtime. The semantic realm is resolved against the +DSL's exposed layer constants, so application configs do not hard-code layer +names. + +A singleton is unique within one JavaScript realm, share scope, and share key. +The host, compiled imports, runtime API consumers, and remotes can therefore +share one stateful instance inside the background realm. The main-thread realm +gets a separate instance by design: Lynx does not transfer JavaScript object +identity across its thread boundary. + +Prefer the official ReactLynx lazy-runtime bridge for UI bundles. An exact +`@lynx-js/react` share does not cover `/internal`, JSX-runtime, Lepus, and lazy +subpaths; partial ReactLynx sharing creates distinct runtime state. Application +state and other ordinary libraries are safe singleton candidates. + +One realm-neutral container program carries internal layer-specific expose +aliases. Keys ending in `__main_thread` are reserved for those aliases; users +still import the public key such as `catalog/Card`. + +```mermaid +flowchart TB + C["One compiled container"] --> B["BACKGROUND expose aliases"] + C --> T["MAIN_THREAD expose aliases"] + B --> BS["default:react:background"] + T --> TS["default:react:main-thread"] + BS --> BI["background singleton instance"] + TS --> TI["main-thread singleton instance"] +``` + +Native TASM/MTS main-thread output is currently rejected because the enhanced +federation runtime is not TASM-compatible. Native federation supports the +background realm; dual-realm federation targets Lynx for Web. + +See `apps/lynx-module-federation-demo` for an official Rspeedy native app, +native artifact checks, and a real Lynx for Web browser E2E. diff --git a/packages/lynx/package.json b/packages/lynx/package.json new file mode 100644 index 00000000000..ebc7778bad5 --- /dev/null +++ b/packages/lynx/package.json @@ -0,0 +1,106 @@ +{ + "name": "@module-federation/lynx", + "version": "0.0.0", + "description": "Module Federation adapter for native Lynx and Lynx for Web runtimes", + "keywords": [ + "module-federation", + "lynx", + "rspeedy", + "rspack" + ], + "type": "commonjs", + "license": "MIT", + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/module-federation/core.git", + "directory": "packages/lynx" + }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "sideEffects": false, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "./runtimePlugin": { + "import": { + "types": "./dist/runtimePlugin.d.mts", + "default": "./dist/runtimePlugin.mjs" + }, + "require": { + "types": "./dist/runtimePlugin.d.ts", + "default": "./dist/runtimePlugin.js" + } + }, + "./package.json": "./package.json" + }, + "typesVersions": { + "*": { + ".": [ + "./dist/index.d.ts" + ], + "runtimePlugin": [ + "./dist/runtimePlugin.d.ts" + ] + } + }, + "dependencies": { + "@module-federation/runtime-core": "workspace:*", + "@module-federation/runtime-tools": "workspace:*", + "@module-federation/sdk": "workspace:*" + }, + "peerDependencies": { + "@lynx-js/cache-events-webpack-plugin": "^0.1.0", + "@lynx-js/css-serializer": "^0.1.6", + "@lynx-js/tasm": "^0.0.39", + "@lynx-js/web-core": "^0.22.1", + "@rsbuild/core": "^2.0.0", + "@rspack/core": ">=2.1.5-canary-54a0d8f3-20260715194831 <3" + }, + "peerDependenciesMeta": { + "@lynx-js/tasm": { + "optional": true + }, + "@lynx-js/web-core": { + "optional": true + } + }, + "devDependencies": { + "@lynx-js/cache-events-webpack-plugin": "0.1.0", + "@lynx-js/css-serializer": "0.1.6", + "@lynx-js/chunk-loading-webpack-plugin": "0.4.0", + "@lynx-js/tasm": "0.0.39", + "@lynx-js/web-core": "0.22.1", + "@rsbuild/core": "2.1.4", + "@rspack/core": "npm:@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831", + "@rstest/core": "^0.10.6", + "typescript": "7.0.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "scripts": { + "build": "tsdown --config tsdown.config.mts", + "lint": "ESLINT_USE_FLAT_CONFIG=false pnpm exec eslint --ignore-pattern node_modules \"**/*.ts\" \"package.json\"", + "test": "pnpm exec rstest --passWithNoTests", + "typecheck": "tsc -p tsconfig.lib.json --noEmit", + "pre-release": "pnpm run test && pnpm run build" + } +} diff --git a/packages/lynx/rstest.config.mts b/packages/lynx/rstest.config.mts new file mode 100644 index 00000000000..cf8350429f5 --- /dev/null +++ b/packages/lynx/rstest.config.mts @@ -0,0 +1,7 @@ +import { defineConfig } from '@rstest/core'; + +export default defineConfig({ + testEnvironment: 'node', + include: ['src/**/*.{test,spec}.ts'], + reporters: ['default'], +}); diff --git a/packages/lynx/src/chunkLoadingMatcher.test.ts b/packages/lynx/src/chunkLoadingMatcher.test.ts new file mode 100644 index 00000000000..b9f28d6f9b7 --- /dev/null +++ b/packages/lynx/src/chunkLoadingMatcher.test.ts @@ -0,0 +1,227 @@ +import { describe, expect, it, rs } from '@rstest/core'; + +import { createLynxChunkLoadingMatcherPlugin } from './chunkLoadingMatcher'; + +describe('Lynx chunk-loading matcher', () => { + it('guards chunks without JavaScript while preserving local JavaScript chunks', () => { + const entryChunk = { + files: new Set(['host.js']), + getAllAsyncChunks: () => new Set(), + ids: ['host'], + name: 'host', + }; + const nestedChunk = { + files: new Set(['nested.js']), + getAllAsyncChunks: () => new Set(), + ids: ['nested'], + name: 'nested-feature', + }; + const remoteChunk = { + files: new Set(), + getAllAsyncChunks: () => new Set([nestedChunk]), + ids: [802], + name: 'remote-react__background', + }; + const localChunk = { + files: new Set(['local.js']), + getAllAsyncChunks: () => new Set(), + ids: [123], + name: 'local', + }; + const cssChunk = { + files: new Set(['styles.css']), + getAllAsyncChunks: () => new Set(), + ids: [456], + name: 'styles', + }; + const chunks = new Set([entryChunk, remoteChunk, localChunk, cssChunk]); + const chunkGraph = { + getNumberOfEntryModules(chunk: unknown) { + return chunk === entryChunk ? 1 : 0; + }, + getChunkModulesIterableBySourceType(chunk: unknown) { + return chunk === localChunk ? [{}] : []; + }, + }; + let onCompilation: ((compilation: any) => void) | undefined; + let addMatcher: ((chunk: unknown) => void) | undefined; + let renameAsyncChunk: ((chunkName: string) => string) | undefined; + let beforeEncode: ((args: any) => any) | undefined; + let beforeEmit: ((args: any) => any) | undefined; + const addRuntimeModule = rs.fn(); + const discardedTemplateAssets = new Set(); + const lazyBundleAssets = new Set(); + + class RuntimeModule { + static STAGE_TRIGGER = 20; + protected compilation: any; + protected chunkGraph: any; + + constructor( + readonly name: string, + readonly stage: number, + ) {} + + attach(compilation: any, _chunk: unknown, graph: any) { + this.compilation = compilation; + this.chunkGraph = graph; + } + } + + const compiler = { + webpack: { + RuntimeGlobals: { ensureChunkHandlers: 'ensureChunkHandlers' }, + RuntimeModule, + Template: { + asString: (lines: string[]) => lines.flat().join('\n'), + indent: (lines: string | string[]) => + (Array.isArray(lines) ? lines : [lines]) + .flat() + .map((line) => ` ${line}`) + .join('\n'), + }, + }, + hooks: { + thisCompilation: { + tap(_name: string, callback: (compilation: any) => void) { + onCompilation = callback; + }, + }, + }, + }; + const compilation = { + addRuntimeModule, + chunkGraph, + chunks, + entrypoints: new Map([['remote', { chunks: [remoteChunk] }]]), + hooks: { + runtimeRequirementInTree: { + for() { + return { + tap(_name: string, callback: (chunk: unknown) => void) { + addMatcher = callback; + }, + }; + }, + }, + }, + }; + + createLynxChunkLoadingMatcherPlugin( + { + getLynxTemplatePluginHooks() { + return { + asyncChunkName: { + tap(_name, callback) { + renameAsyncChunk = callback; + }, + }, + beforeEncode: { + tap(_name, callback) { + beforeEncode = callback; + }, + }, + beforeEmit: { + tap(_name, callback) { + beforeEmit = callback; + }, + }, + }; + }, + }, + { + backgroundOnlyRemote: true, + chunking: 'split', + discardSourceEntryBundles: true, + discardedTemplateAssets, + includedChunkPrefixes: ['catalog__background_'], + lazyBundleAssets, + remoteEntryName: 'remote', + pairedRealmChunkPrefixes: { + background: 'catalog__background_', + mainThread: 'catalog__main-thread__', + }, + pairedRealmChunkSuffixes: { + background: '-react__background', + mainThread: '-react__main-thread', + }, + }, + ).apply(compiler as any); + onCompilation!(compilation); + addMatcher!(entryChunk); + + const cardArgs = { + encodeData: { + lepusCode: { root: { source: 'main-thread runtime' } }, + sourceContent: { appType: 'card' }, + }, + }; + expect(beforeEncode!(cardArgs)).toBe(cardArgs); + expect(cardArgs.encodeData.lepusCode.root).toBeUndefined(); + const lazyRoot = { source: 'component main thread' }; + beforeEncode!({ + encodeData: { + lepusCode: { root: lazyRoot }, + sourceContent: { appType: 'DynamicComponent' }, + }, + }); + expect(lazyRoot).toEqual({ source: 'component main thread' }); + + const lazyArgs = { + finalEncodeOptions: { + sourceContent: { appType: 'DynamicComponent' }, + }, + entryNames: ['remote-react__background'], + outputName: 'async/catalog__background_Card.hash.bundle', + }; + expect(beforeEmit!(lazyArgs)).toBe(lazyArgs); + beforeEmit!({ + entryNames: ['remote-react__background'], + finalEncodeOptions: { sourceContent: { appType: 'card' } }, + outputName: 'bootstrap.lynx.bundle', + }); + beforeEmit!({ + entryNames: ['nested-feature'], + finalEncodeOptions: { + sourceContent: { appType: 'DynamicComponent' }, + }, + outputName: 'async/nested-feature.bundle', + }); + expect(lazyBundleAssets).toEqual( + new Set([ + 'async/catalog__background_Card.hash.bundle', + 'async/nested-feature.bundle', + ]), + ); + expect(discardedTemplateAssets).toEqual(new Set(['bootstrap.lynx.bundle'])); + + expect(addRuntimeModule).toHaveBeenCalledTimes(2); + const runtimeModule = addRuntimeModule.mock.calls.find( + ([, module]) => module.name === 'lynx chunk loading matcher', + )![1]; + runtimeModule.attach(compilation, entryChunk, chunkGraph); + const source = runtimeModule.generate(); + + expect(source).toContain('"802":1'); + expect(source).toContain('__webpack_require__.lynx_chunking = "split"'); + expect(source).toContain('"456":1'); + expect(source).not.toContain('"123":1'); + expect(source).not.toContain('"host":1'); + expect(source).toContain('__webpack_require__.f.require = function'); + const startupModule = addRuntimeModule.mock.calls.find( + ([, module]) => module.name === 'lynx federation startup promise', + )![1]; + startupModule.attach(compilation, entryChunk, chunkGraph); + expect(startupModule.generate()).toContain( + 'Promise.resolve(lynxFederationStartup.apply(this, arguments))', + ); + expect(renameAsyncChunk!('remote')).toBe(''); + expect(renameAsyncChunk!('local')).toBe('local'); + expect(renameAsyncChunk!('catalog__background_Card')).toBe( + 'catalog__background_Card', + ); + expect(renameAsyncChunk!('catalog__main-thread__Card')).toBe( + 'catalog__background_Card', + ); + }); +}); diff --git a/packages/lynx/src/chunkLoadingMatcher.ts b/packages/lynx/src/chunkLoadingMatcher.ts new file mode 100644 index 00000000000..3301d6ea49d --- /dev/null +++ b/packages/lynx/src/chunkLoadingMatcher.ts @@ -0,0 +1,274 @@ +import type { Chunk, Compiler, WebpackPluginInstance } from '@rspack/core'; + +interface TemplateEncodeArgs { + encodeData: { + lepusCode: { + root?: unknown; + }; + sourceContent: { + appType: string; + }; + }; +} + +interface TemplateEmitArgs { + entryNames: string[]; + finalEncodeOptions: { + sourceContent: { + appType: string; + }; + }; + outputName: string; +} + +export interface LynxTemplatePluginApi { + getLynxTemplatePluginHooks(compilation: unknown): { + asyncChunkName: { + tap(name: string, callback: (chunkName: string) => string): void; + }; + beforeEncode?: { + tap(name: string, callback: (args: TemplateEncodeArgs) => unknown): void; + }; + beforeEmit?: { + tap(name: string, callback: (args: TemplateEmitArgs) => unknown): void; + }; + }; +} + +interface ChunkLoadingMatcherOptions { + backgroundOnlyRemote?: boolean; + chunking?: 'single' | 'split'; + discardSourceEntryBundles?: boolean; + discardedTemplateAssets?: Set; + includedChunkPrefixes?: string[]; + lazyBundleAssets?: Set; + remoteEntryName?: string; + pairedRealmChunkPrefixes?: { + background: string; + mainThread: string; + }; + pairedRealmChunkSuffixes?: { + background: string; + mainThread: string; + }; +} + +interface ChunkGraph { + getNumberOfEntryModules(chunk: Chunk): number; + getChunkModulesIterableBySourceType( + chunk: Chunk, + sourceType: string, + ): Iterable | undefined; +} + +const chunkHasJavaScript = (chunk: Chunk, chunkGraph: ChunkGraph): boolean => { + if (chunkGraph.getNumberOfEntryModules(chunk) > 0) { + return true; + } + + const modules = chunkGraph.getChunkModulesIterableBySourceType( + chunk, + 'javascript', + ); + return modules?.[Symbol.iterator]().next().done === false; +}; + +const getNonJavaScriptChunkIds = ( + chunks: Iterable, + chunkGraph: ChunkGraph, +): Array => + Array.from(chunks).flatMap((chunk) => + chunkHasJavaScript(chunk, chunkGraph) ? [] : [...(chunk.ids ?? [])], + ); + +const getRemoteChunkNames = ( + compilation: { + chunks: Iterable; + entrypoints: ReadonlyMap }>; + }, + options: ChunkLoadingMatcherOptions, +): Set => { + const chunks = new Set(); + const addChunkGraph = (chunk: Chunk): void => { + chunks.add(chunk); + for (const asyncChunk of chunk.getAllAsyncChunks()) { + chunks.add(asyncChunk); + } + }; + + if (options.remoteEntryName) { + for (const chunk of compilation.entrypoints.get(options.remoteEntryName) + ?.chunks ?? []) { + addChunkGraph(chunk); + } + } + for (const chunk of compilation.chunks) { + if ( + typeof chunk.name === 'string' && + options.includedChunkPrefixes?.some((prefix) => + chunk.name!.startsWith(prefix), + ) + ) { + addChunkGraph(chunk); + } + } + + return new Set( + Array.from(chunks).flatMap((chunk) => + typeof chunk.name === 'string' ? [chunk.name] : [], + ), + ); +}; + +export const createLynxChunkLoadingMatcherPlugin = ( + lynxTemplatePlugin?: LynxTemplatePluginApi, + options: ChunkLoadingMatcherOptions = {}, +): WebpackPluginInstance => ({ + apply(compiler: Compiler) { + const pluginName = 'LynxModuleFederationChunkLoadingMatcher'; + const { RuntimeGlobals, RuntimeModule, Template } = compiler.webpack; + + compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { + let remoteChunkNames: Set | undefined; + const templateHooks = + lynxTemplatePlugin?.getLynxTemplatePluginHooks(compilation); + templateHooks?.asyncChunkName.tap(pluginName, (chunkName) => { + const layerSuffixes = options.pairedRealmChunkSuffixes; + const hasAssetlessChunk = Array.from(compilation.chunks).some( + (chunk) => { + if ( + chunkHasJavaScript(chunk, compilation.chunkGraph) || + typeof chunk.name !== 'string' + ) { + return false; + } + const suffix = layerSuffixes + ? [layerSuffixes.background, layerSuffixes.mainThread].find( + (candidate) => chunk.name!.endsWith(candidate), + ) + : undefined; + return ( + (suffix ? chunk.name.slice(0, -suffix.length) : chunk.name) === + chunkName + ); + }, + ); + if (hasAssetlessChunk) { + return ''; + } + const prefixes = options.pairedRealmChunkPrefixes; + return prefixes && chunkName.startsWith(prefixes.mainThread) + ? `${prefixes.background}${chunkName.slice(prefixes.mainThread.length)}` + : chunkName; + }); + if (options.backgroundOnlyRemote) { + templateHooks?.beforeEncode?.tap(pluginName, (args) => { + if (args.encodeData.sourceContent.appType !== 'DynamicComponent') { + args.encodeData.lepusCode.root = undefined; + } + return args; + }); + } + templateHooks?.beforeEmit?.tap(pluginName, (args) => { + let chunkNames = remoteChunkNames; + if (!chunkNames) { + chunkNames = getRemoteChunkNames(compilation, options); + remoteChunkNames = chunkNames; + } + const outputBaseName = args.outputName.split('/').pop() ?? ''; + const isDynamicComponent = + args.finalEncodeOptions.sourceContent.appType === 'DynamicComponent'; + const isRemoteOutput = args.entryNames.some((name) => + chunkNames.has(name), + ); + const hasRemotePrefix = options.includedChunkPrefixes?.some((prefix) => + outputBaseName.startsWith(prefix), + ); + + if (isDynamicComponent && (isRemoteOutput || hasRemotePrefix)) { + options.lazyBundleAssets?.add(args.outputName); + if (options.chunking === 'split') { + options.discardedTemplateAssets?.delete(args.outputName); + } else { + options.discardedTemplateAssets?.add(args.outputName); + } + } else if (options.discardSourceEntryBundles) { + options.discardedTemplateAssets?.add(args.outputName); + } + return args; + }); + + class ChunkLoadingMatcherRuntimeModule extends RuntimeModule { + constructor() { + super('lynx chunk loading matcher', RuntimeModule.STAGE_TRIGGER); + } + + override generate(): string { + const chunking = options.chunking + ? `__webpack_require__.lynx_chunking = ${JSON.stringify(options.chunking)};` + : ''; + const chunkIds = getNonJavaScriptChunkIds( + this.compilation!.chunks, + this.chunkGraph!, + ); + if (chunkIds.length === 0) { + return chunking; + } + + const matcher = Object.fromEntries( + chunkIds.map((id) => [String(id), 1]), + ); + return Template.asString([ + chunking, + 'var lynxChunkLoader = __webpack_require__.f.require;', + 'if (lynxChunkLoader) {', + Template.indent([ + `var lynxChunksWithoutJavaScript = ${JSON.stringify(matcher)};`, + '__webpack_require__.f.require = function(chunkId, promises) {', + Template.indent([ + 'if (!__webpack_require__.o(lynxChunksWithoutJavaScript, chunkId)) {', + Template.indent('return lynxChunkLoader(chunkId, promises);'), + '}', + ]), + '};', + ]), + '}', + ]); + } + } + + class StartupPromiseRuntimeModule extends RuntimeModule { + constructor() { + super( + 'lynx federation startup promise', + RuntimeModule.STAGE_TRIGGER - 1, + ); + } + + override generate(): string { + return Template.asString([ + 'var lynxFederationStartup = __webpack_require__.x;', + '__webpack_require__.x = function() {', + Template.indent( + 'return Promise.resolve(lynxFederationStartup.apply(this, arguments));', + ), + '};', + ]); + } + } + + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.ensureChunkHandlers) + .tap(pluginName, (chunk) => { + compilation.addRuntimeModule( + chunk, + new ChunkLoadingMatcherRuntimeModule(), + ); + compilation.addRuntimeModule( + chunk, + new StartupPromiseRuntimeModule(), + ); + }); + }); + }, +}); diff --git a/packages/lynx/src/compilerFederation.ts b/packages/lynx/src/compilerFederation.ts new file mode 100644 index 00000000000..b8c0f8a2ff3 --- /dev/null +++ b/packages/lynx/src/compilerFederation.ts @@ -0,0 +1,20 @@ +import type { + Compiler, + ModuleFederationPluginOptions, + WebpackPluginInstance, +} from '@rspack/core'; + +interface CompilerModuleFederationPlugin extends WebpackPluginInstance { + _options: ModuleFederationPluginOptions; +} + +export const createCompilerModuleFederationPlugin = ( + options: ModuleFederationPluginOptions, +): CompilerModuleFederationPlugin => ({ + _options: options, + apply(compiler: Compiler) { + new compiler.webpack.container.ModuleFederationPlugin(options).apply( + compiler, + ); + }, +}); diff --git a/packages/lynx/src/externalBundle.test.ts b/packages/lynx/src/externalBundle.test.ts new file mode 100644 index 00000000000..0786c9dcded --- /dev/null +++ b/packages/lynx/src/externalBundle.test.ts @@ -0,0 +1,215 @@ +import { describe, expect, it, rs } from '@rstest/core'; + +import { createLynxExternalBundlePlugin } from './externalBundle'; + +interface TestAsset { + name: string; + source: { source(): string | Buffer }; +} + +const createAsset = (name: string, content = name): TestAsset => ({ + name, + source: { source: () => content }, +}); + +const setupPlugin = (chunking: 'split' | 'single') => { + const encode = rs.fn(async () => ({ buffer: Buffer.from('external') })); + const discardedTemplateAssets = new Set(['bootstrap.bundle']); + if (chunking === 'single') { + discardedTemplateAssets.add('async/Card.hash.bundle'); + discardedTemplateAssets.add('async/Nested.hash.bundle'); + } + const plugin = createLynxExternalBundlePlugin({ + bundleFileName: 'catalog.lynx.bundle', + chunking, + discardedTemplateAssets, + encode, + entryAssets: ['catalog.js'], + entryName: 'catalog', + includedChunkPrefixes: ['catalog__background_', 'catalog__main-thread__'], + lazyBundleAssets: new Set([ + 'async/Card.hash.bundle', + 'async/Nested.hash.bundle', + ]), + mainThreadChunks: ['catalog__main-thread.js'], + preservedAssets: ['mf-manifest.json', 'mf-stats.json'], + }); + let onCompilation: ((compilation: any) => void) | undefined; + let onEmit: ((compilation: any) => Promise) | undefined; + const compiler = { + webpack: { + Compilation: { PROCESS_ASSETS_STAGE_REPORT: 5_000 }, + sources: { + RawSource: class { + constructor(readonly value: Buffer | string) {} + }, + }, + }, + hooks: { + thisCompilation: { + tap(_name: string, callback: (compilation: any) => void) { + onCompilation = callback; + }, + }, + emit: { + tapPromise( + _name: string, + callback: (compilation: any) => Promise, + ) { + onEmit = callback; + }, + }, + }, + }; + plugin.apply(compiler as any); + + return { encode, onCompilation: () => onCompilation!, onEmit: () => onEmit! }; +}; + +const createCompilation = (sourceAssets: TestAsset[]) => { + let assets = [...sourceAssets]; + let snapshot: (() => void) | undefined; + const deleteAsset = rs.fn((name: string) => { + assets = assets.filter((asset) => asset.name !== name); + }); + const emitAsset = rs.fn((name: string, source: TestAsset['source']) => { + assets = [ + ...assets.filter((asset) => asset.name !== name), + { name, source }, + ]; + }); + const nestedChunk = { + name: 'nested-feature', + files: new Set(['async/nested-feature.js', 'async/nested-feature.css']), + auxiliaryFiles: new Set(), + getAllAsyncChunks: () => new Set(), + }; + const remoteChunk = { + name: 'catalog__background_Card', + files: new Set([ + 'async/catalog__background_Card.js', + 'async/catalog__background_Card.css', + ]), + auxiliaryFiles: new Set(), + getAllAsyncChunks: () => new Set([nestedChunk]), + }; + const compilation = { + entrypoints: new Map([ + [ + 'catalog', + { + chunks: [remoteChunk], + getFiles: () => ['catalog.js', 'runtime.js'], + }, + ], + ]), + chunks: [remoteChunk, nestedChunk], + getAssets: () => assets, + deleteAsset, + emitAsset, + hooks: { + processAssets: { + tap(options: { stage: number }, callback: () => void) { + expect(options.stage).toBe(5_000); + snapshot = callback; + }, + }, + }, + }; + + return { + compilation, + names: () => assets.map(({ name }) => name).sort(), + replaceAssets(nextAssets: TestAsset[]) { + assets = nextAssets; + }, + snapshot: () => snapshot!(), + }; +}; + +describe('Lynx external bundle', () => { + const sourceAssets = [ + createAsset('catalog.js', 'module.exports = "container"'), + createAsset('runtime.js', 'module.exports = "runtime"'), + createAsset('async/catalog__background_Card.js', 'module.exports = "card"'), + createAsset('async/catalog__background_Card.css', '.card {}'), + createAsset('async/nested-feature.js', 'module.exports = "nested"'), + createAsset('async/nested-feature.css', '.nested {}'), + createAsset('unrelated-app.js', 'module.exports = "unrelated"'), + createAsset('ignored.map'), + ]; + + it('keeps split lazy bundles outside the container bundle', async () => { + const { encode, onCompilation, onEmit } = setupPlugin('split'); + const harness = createCompilation(sourceAssets); + onCompilation()(harness.compilation); + harness.snapshot(); + harness.replaceAssets([ + createAsset('mf-manifest.json'), + createAsset('mf-stats.json'), + createAsset('async/Card.hash.bundle'), + createAsset('async/Nested.hash.bundle'), + createAsset('bootstrap.bundle'), + createAsset('unrelated-app.js'), + createAsset('images/orbit.png'), + ]); + + await onEmit()(harness.compilation); + + const encodeOptions = encode.mock.calls[0][0] as any; + expect(encodeOptions.compilerOptions.targetSdkVersion).toBe('3.7'); + expect(Object.keys(encodeOptions.customSections).sort()).toEqual([ + 'catalog', + 'runtime', + ]); + expect(harness.names()).toEqual([ + 'async/Card.hash.bundle', + 'async/Nested.hash.bundle', + 'catalog.lynx.bundle', + 'images/orbit.png', + 'mf-manifest.json', + 'mf-stats.json', + 'unrelated-app.js', + ]); + }); + + it('snapshots every JS and CSS chunk into one atomic bundle', async () => { + const { encode, onCompilation, onEmit } = setupPlugin('single'); + const harness = createCompilation(sourceAssets); + onCompilation()(harness.compilation); + harness.snapshot(); + harness.replaceAssets([ + createAsset('mf-manifest.json'), + createAsset('mf-stats.json'), + createAsset('async/Card.hash.bundle'), + createAsset('async/Nested.hash.bundle'), + createAsset('unrelated-app.js'), + createAsset('fonts/orbit.woff2'), + ]); + + await onEmit()(harness.compilation); + + const encodeOptions = encode.mock.calls[0][0] as any; + expect(Object.keys(encodeOptions.customSections).sort()).toEqual([ + 'async/catalog__background_Card', + 'async/catalog__background_Card:CSS', + 'async/nested-feature', + 'async/nested-feature:CSS', + 'catalog', + 'runtime', + ]); + expect( + encodeOptions.customSections['async/catalog__background_Card:CSS'], + ).toMatchObject({ + encoding: 'CSS', + }); + expect(encodeOptions.customSections).not.toHaveProperty('unrelated-app'); + expect(harness.names()).toEqual([ + 'catalog.lynx.bundle', + 'fonts/orbit.woff2', + 'mf-manifest.json', + 'mf-stats.json', + 'unrelated-app.js', + ]); + }); +}); diff --git a/packages/lynx/src/externalBundle.ts b/packages/lynx/src/externalBundle.ts new file mode 100644 index 00000000000..9fd064e9354 --- /dev/null +++ b/packages/lynx/src/externalBundle.ts @@ -0,0 +1,177 @@ +import { cssChunksToMap } from '@lynx-js/css-serializer'; +import type { Chunk, Compiler, WebpackPluginInstance } from '@rspack/core'; + +interface ExternalBundleOptions { + bundleFileName: string; + chunking: 'split' | 'single'; + discardedTemplateAssets: Set; + encode: (value: unknown) => Promise<{ buffer: Buffer }>; + engineVersion?: string; + entryAssets: string[]; + entryName: string; + includedChunkPrefixes: string[]; + lazyBundleAssets: Set; + mainThreadChunks: string[]; + preservedAssets: string[]; +} + +interface LynxExternalBundlePlugin extends WebpackPluginInstance { + options: ExternalBundleOptions; +} + +export const createLynxExternalBundlePlugin = ( + options: ExternalBundleOptions, +): LynxExternalBundlePlugin => ({ + options, + apply(compiler: Compiler) { + type AssetSnapshot = { + content: string; + name: string; + }; + + let sourceAssets: AssetSnapshot[] = []; + compiler.hooks.thisCompilation.tap( + 'LynxModuleFederationExternalBundleSources', + (compilation) => { + compilation.hooks.processAssets.tap( + { + name: 'LynxModuleFederationExternalBundleSources', + stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT, + }, + () => { + const includedAssets = new Set(options.entryAssets); + const entrypoint = compilation.entrypoints.get(options.entryName); + for (const asset of entrypoint?.getFiles() ?? []) { + includedAssets.add(asset); + } + const includedChunks = new Set(); + const addChunkGraph = (chunk: Chunk): void => { + includedChunks.add(chunk); + for (const asyncChunk of chunk.getAllAsyncChunks()) { + includedChunks.add(asyncChunk); + } + }; + for (const chunk of entrypoint?.chunks ?? []) { + addChunkGraph(chunk); + } + for (const chunk of compilation.chunks) { + if ( + typeof chunk.name !== 'string' || + !options.includedChunkPrefixes.some((prefix) => + chunk.name!.startsWith(prefix), + ) + ) { + continue; + } + addChunkGraph(chunk); + } + for (const chunk of includedChunks) { + for (const asset of [ + ...chunk.files, + ...(chunk.auxiliaryFiles ?? []), + ]) { + includedAssets.add(asset); + } + } + sourceAssets = compilation + .getAssets() + .filter( + ({ name }) => + includedAssets.has(name) && + (name.endsWith('.js') || name.endsWith('.css')), + ) + .map(({ name, source }) => ({ + content: source.source().toString(), + name, + })); + }, + ); + }, + ); + + compiler.hooks.emit.tapPromise( + { + name: 'LynxModuleFederationExternalBundle', + stage: 10_000, + }, + async (compilation) => { + const entryAssets = new Set(options.entryAssets); + for (const asset of compilation.entrypoints + .get(options.entryName) + ?.getFiles() ?? []) { + entryAssets.add(asset); + } + const encodedAssets = + options.chunking === 'single' + ? sourceAssets + : sourceAssets.filter(({ name }) => entryAssets.has(name)); + const customSections = encodedAssets.reduce>( + (sections, asset) => { + if (asset.name.endsWith('.js')) { + sections[asset.name.replace(/\.js$/, '')] = { + ...(options.mainThreadChunks.includes(asset.name) + ? { encoding: 'JsBytecode' } + : {}), + content: asset.content, + }; + } else if (asset.name.endsWith('.css')) { + sections[`${asset.name.replace(/\.css$/, '')}:CSS`] = { + encoding: 'CSS', + content: { + ruleList: + cssChunksToMap([asset.content], [], true).cssMap[0] ?? [], + }, + }; + } + return sections; + }, + {}, + ); + const encodeOptions = { + compilerOptions: { + enableFiberArch: true, + useLepusNG: true, + targetSdkVersion: options.engineVersion ?? '3.7', + enableCSSInvalidation: true, + enableCSSSelector: true, + }, + sourceContent: { appType: 'DynamicComponent' }, + customSections, + }; + const { buffer } = await options.encode(encodeOptions); + const preservedAssets = new Set(options.preservedAssets); + if (options.chunking === 'split') { + for (const name of options.lazyBundleAssets) { + preservedAssets.add(name); + } + } + for (const { name } of sourceAssets) { + if (!preservedAssets.has(name)) { + compilation.deleteAsset(name); + } + } + for (const name of options.discardedTemplateAssets) { + if (!preservedAssets.has(name)) { + compilation.deleteAsset(name); + } + } + compilation.emitAsset( + options.bundleFileName, + new compiler.webpack.sources.RawSource(buffer, false), + ); + if ( + process.env.DEBUG?.toLowerCase() + .split(',') + .some((value) => ['*', 'rsbuild', 'rspeedy'].includes(value)) + ) { + compilation.emitAsset( + 'tasm.json', + new compiler.webpack.sources.RawSource( + JSON.stringify(encodeOptions, null, 2), + ), + ); + } + }, + ); + }, +}); diff --git a/packages/lynx/src/index.ts b/packages/lynx/src/index.ts new file mode 100644 index 00000000000..cb89aae92ff --- /dev/null +++ b/packages/lynx/src/index.ts @@ -0,0 +1,12 @@ +export { LYNX_RUNTIME_PLUGIN, pluginLynxModuleFederation } from './plugin'; +export type { + LynxModuleFederationAdapterOptions, + LynxModuleFederationOptions, + LynxNativeRemoteBundleOptions, + LynxRemoteBundleOptions, + LynxRuntimePluginOptions, + LynxShared, + LynxSharedConfig, + LynxSharedRealm, + LynxWebRemoteBundleOptions, +} from './plugin'; diff --git a/packages/lynx/src/plugin.test.ts b/packages/lynx/src/plugin.test.ts new file mode 100644 index 00000000000..2ccab12e869 --- /dev/null +++ b/packages/lynx/src/plugin.test.ts @@ -0,0 +1,709 @@ +import { describe, expect, it, rs } from '@rstest/core'; +import { LynxCacheEventsPlugin } from '@lynx-js/cache-events-webpack-plugin'; + +import { + LYNX_RUNTIME_PLUGIN, + normalizeLynxExposes, + normalizeLynxShared, + pluginLynxModuleFederation, +} from './plugin'; +import type { + LynxModuleFederationAdapterOptions, + LynxModuleFederationOptions, +} from './plugin'; + +const LAYERS = { + BACKGROUND: 'background', + MAIN_THREAD: 'main-thread', +}; + +type ModifyRspackConfig = (config: any, context: any) => any; +type ModifyEnvironmentConfig = (config: any, context: any) => any; + +const setupPlugin = ( + options: LynxModuleFederationOptions, + adapterOptions?: LynxModuleFederationAdapterOptions, + layers: unknown = LAYERS, +) => { + let modifyRspackConfig: ModifyRspackConfig | undefined; + let modifyEnvironmentConfigCallback: ModifyEnvironmentConfig | undefined; + const modifyEnvironmentConfig = rs.fn((callback: ModifyEnvironmentConfig) => { + modifyEnvironmentConfigCallback = callback; + }); + const plugin = pluginLynxModuleFederation(options, adapterOptions); + + plugin.setup!({ + modifyEnvironmentConfig, + modifyRspackConfig(callback: ModifyRspackConfig) { + modifyRspackConfig = callback; + }, + useExposed(symbol: symbol) { + return symbol === Symbol.for('LAYERS') ? layers : undefined; + }, + } as any); + + return { + modifyEnvironmentConfig, + applyEnvironmentConfig: (config: any, environment = 'lynx') => + modifyEnvironmentConfigCallback!(config, { name: environment }), + modifyRspackConfig: (config: any, environment = 'lynx') => + modifyRspackConfig!(config, { environment: { name: environment } }), + }; +}; + +const federationOptions = (plugin: unknown) => (plugin as any)._options; + +describe('pluginLynxModuleFederation', () => { + it('defaults exposes and shared modules to the background layer', () => { + expect( + normalizeLynxExposes( + { + './Button': './src/Button', + './Card': { + import: './src/Card', + layer: 'custom-layer', + }, + }, + LAYERS.BACKGROUND, + ), + ).toEqual({ + './Button': { import: './src/Button', layer: LAYERS.BACKGROUND }, + './Card': { import: './src/Card', layer: 'custom-layer' }, + }); + + expect( + normalizeLynxShared( + { + react: '^19.0.0', + '@lynx-js/react': { + singleton: true, + layer: 'custom-layer', + }, + }, + LAYERS.BACKGROUND, + ), + ).toEqual({ + react: { + import: 'react', + requiredVersion: '^19.0.0', + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + }, + '@lynx-js/react': { + singleton: true, + layer: 'custom-layer', + issuerLayer: LAYERS.BACKGROUND, + }, + }); + }); + + it('preserves duplicate shared array entries and explicit layers', () => { + expect( + normalizeLynxShared( + [ + { react: '^19.0.0' }, + { + react: { + singleton: true, + layer: 'provided-layer', + issuerLayer: 'consumer-layer', + }, + }, + ], + LAYERS.BACKGROUND, + ), + ).toEqual([ + { + react: { + import: 'react', + requiredVersion: '^19.0.0', + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + }, + }, + { + react: { + singleton: true, + layer: 'provided-layer', + issuerLayer: 'consumer-layer', + }, + }, + ]); + }); + + it('installs the Rspack plugin with Lynx output and layer defaults', async () => { + const { modifyEnvironmentConfig, modifyRspackConfig } = setupPlugin({ + name: 'lynx_host', + exposes: { './App': './src/App' }, + runtimePlugins: ['custom-runtime-plugin'], + }); + const config = await modifyRspackConfig({ plugins: [] }); + const federationPlugin = config.plugins[0]; + + expect(config.output).toEqual({ + chunkLoading: 'lynx', + chunkFormat: 'commonjs', + iife: false, + uniqueName: 'lynx_host', + }); + expect(config.experiments.layers).toBe(true); + expect(federationOptions(federationPlugin)).toMatchObject({ + name: 'lynx_host', + filename: 'remoteEntry.js', + library: { type: 'commonjs-module' }, + remoteType: 'script', + runtimePlugins: ['custom-runtime-plugin', LYNX_RUNTIME_PLUGIN], + exposes: { + './App': { import: './src/App', layer: LAYERS.BACKGROUND }, + }, + }); + expect(modifyEnvironmentConfig).toHaveBeenCalledTimes(1); + }); + + it('keeps unqualified host shares in the background realm', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + remotes: { catalog: 'catalog@catalog.lynx.bundle' }, + shared: [{ react: '^19.0.0' }, { react: { singleton: true } }], + runtimePlugins: ['custom-runtime-plugin'], + }, + { + mainThread: true, + runtimePluginOptions: { timeout: 2_000 }, + }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(config.plugins).toHaveLength(2); + expect(federationOptions(config.plugins[0])).toMatchObject({ + name: 'lynx_host', + shareScope: [ + `default:${LAYERS.BACKGROUND}`, + `default:${LAYERS.MAIN_THREAD}`, + ], + runtimePlugins: [ + ['custom-runtime-plugin', {}], + [LYNX_RUNTIME_PLUGIN, { timeout: 2_000 }], + ], + shared: [ + { + react: { + import: 'react', + requiredVersion: '^19.0.0', + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + { + react: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ], + }); + }); + + it('maps semantic shared realms to exposed Lynx layers', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { + 'main-thread-state': { + realm: 'main-thread', + singleton: true, + }, + }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0]).shared).toEqual([ + { + 'main-thread-state': { + singleton: true, + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + shareScope: [`default:${LAYERS.MAIN_THREAD}`], + }, + }, + ]); + }); + + it('does not duplicate an explicitly issuer-layered shared entry', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { + react: { + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + }, + }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0]).shared).toEqual([ + { + react: { + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + shareScope: [`default:${LAYERS.MAIN_THREAD}`], + }, + }, + ]); + }); + + it('does not duplicate an explicit entry beside a default shared entry', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { + react: { + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + }, + lodash: { singleton: true }, + }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0]).shared).toEqual([ + { + react: { + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + shareScope: [`default:${LAYERS.MAIN_THREAD}`], + }, + lodash: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ]); + }); + + it('builds background and main-thread containers into one external bundle', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './Card': './src/Card' }, + shared: { react: { singleton: true } }, + }, + { + remoteBundle: { + target: 'web', + filename: 'catalog-custom.lynx.bundle', + engineVersion: '3.6', + }, + }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + const [federationPlugin, , collector] = config.plugins; + const remoteOptions = federationOptions(federationPlugin); + + expect(remoteOptions).toMatchObject({ + name: 'catalog', + shareScope: [ + `default:${LAYERS.BACKGROUND}`, + `default:${LAYERS.MAIN_THREAD}`, + ], + filename: 'catalog.js', + manifest: true, + runtime: false, + exposes: { + './Card': { + import: './src/Card', + layer: LAYERS.BACKGROUND, + name: 'catalog__background_Card', + }, + './Card__main_thread': { + import: './src/Card', + layer: LAYERS.MAIN_THREAD, + name: 'catalog__main-thread__Card', + }, + }, + shared: [ + { + react: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ], + }); + + const encoder = config.plugins.find( + (plugin: any) => plugin.options?.bundleFileName, + ) as any; + + expect(config.plugins).toHaveLength(5); + expect(encoder.options).toMatchObject({ + bundleFileName: 'catalog-custom.lynx.bundle', + engineVersion: '3.6', + }); + + let collectAssets: (() => void) | undefined; + let processAssetsStage: number | undefined; + let onCompilation: ((compilation: any) => void) | undefined; + collector.apply({ + webpack: { + Compilation: { PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE: 400 }, + sources: { ConcatSource: class {} }, + }, + hooks: { + thisCompilation: { + tap(_name: string, callback: (compilation: any) => void) { + onCompilation = callback; + }, + }, + }, + } as any); + const emitAsset = rs.fn(); + onCompilation!({ + chunks: [ + { + files: new Set(['catalog.js']), + layers: [LAYERS.BACKGROUND, LAYERS.MAIN_THREAD], + }, + { + files: new Set(['catalog__main-thread__Card.js', 'styles.css']), + layers: [LAYERS.MAIN_THREAD], + }, + { + files: new Set(['catalog__background_Card.js']), + layers: [LAYERS.BACKGROUND], + }, + ], + chunkGraph: { + getChunkModulesIterable(chunk: { layers: string[] }) { + return chunk.layers.map((layer) => ({ layer })); + }, + }, + emitAsset, + getAsset(name: string) { + return name === 'catalog.js' + ? { source: { source: () => 'container' }, info: {} } + : undefined; + }, + hooks: { + processAssets: { + tap(options: { stage: number }, callback: () => void) { + processAssetsStage = options.stage; + collectAssets = callback; + }, + }, + }, + }); + collectAssets!(); + + expect(processAssetsStage).toBe(402); + expect(encoder.options.mainThreadChunks).toEqual([ + 'catalog__main-thread.js', + 'catalog__main-thread__Card.js', + ]); + expect(emitAsset).toHaveBeenCalledWith( + 'catalog__main-thread.js', + expect.any(Object), + {}, + ); + }); + + it('disables app event caching in external remote entry runtimes', async () => { + const original = new LynxCacheEventsPlugin({ existing: true }); + const { modifyRspackConfig } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { remoteBundle: { target: 'web' } }, + ); + const config = await modifyRspackConfig({ plugins: [original] }, 'web'); + const replacement = config.plugins[0] as LynxCacheEventsPlugin & { + options: Record; + }; + + expect(replacement).toBeInstanceOf(LynxCacheEventsPlugin); + expect(replacement).not.toBe(original); + expect(replacement.options.existing).toBe(true); + expect(replacement.options.setupListTransformer).toEqual( + expect.any(Function), + ); + expect( + (replacement.options.setupListTransformer as () => unknown[])(), + ).toEqual([]); + }); + + it('builds a native background-only remote with the official TASM encoder', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './Card': './src/Card' }, + shared: { '@lynx-js/react': { singleton: true } }, + }, + { + remoteBundle: { + target: 'lynx', + filename: 'catalog-native.lynx.bundle', + engineVersion: '3.6', + }, + }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + const remoteOptions = federationOptions(config.plugins[0]); + const encoder = config.plugins.find( + (plugin: any) => plugin.options?.bundleFileName, + ) as any; + + expect(config.plugins).toHaveLength(4); + expect(remoteOptions).toMatchObject({ + name: 'catalog', + filename: 'catalog.js', + manifest: true, + runtime: false, + exposes: { + './Card': { + import: './src/Card', + layer: LAYERS.BACKGROUND, + name: 'catalog__background_Card', + }, + }, + shared: { + '@lynx-js/react': { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + }, + }, + }); + expect(remoteOptions.exposes).not.toHaveProperty('./Card__main_thread'); + expect(encoder.options).toMatchObject({ + bundleFileName: 'catalog-native.lynx.bundle', + engineVersion: '3.6', + mainThreadChunks: [], + }); + expect(encoder.options.encode).toBeTypeOf('function'); + const { buffer } = await encoder.options.encode({ + compilerOptions: { + enableFiberArch: true, + useLepusNG: true, + targetSdkVersion: '3.5', + enableCSSInvalidation: true, + enableCSSSelector: true, + }, + sourceContent: { appType: 'DynamicComponent' }, + customSections: { + catalog: { + content: 'module.exports = { get() {}, init() {} };', + }, + }, + }); + expect(Buffer.isBuffer(buffer)).toBe(true); + expect(buffer.byteLength).toBeGreaterThan(100); + }); + + it('preserves manifest file customization', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './Card': './src/Card' }, + manifest: { + fileName: 'catalog-manifest.json', + }, + }, + { + remoteBundle: { + target: 'web', + filename: 'remotes/catalog.lynx.bundle', + }, + }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + const remoteOptions = federationOptions(config.plugins[0]); + expect(remoteOptions.manifest).toEqual({ + fileName: 'catalog-manifest.json', + }); + expect(config.plugins).toHaveLength(5); + }); + + it.each([ + [ + { + name: 'catalog', + exposes: { './Card': './src/Card' }, + filename: 'x.js', + }, + 'remove `options.filename`', + ], + [ + { name: 'catalog', exposes: { './Card': './src/Card' }, runtime: 'x' }, + 'remove `options.runtime`', + ], + [ + { + name: 'catalog', + exposes: { './Card': './src/Card' }, + manifest: false, + }, + 'requires the Module Federation manifest', + ], + [ + { + name: 'catalog', + exposes: { + './Card': { import: './src/Card', layer: LAYERS.MAIN_THREAD }, + }, + }, + 'owns expose layers', + ], + [ + { + name: 'catalog', + exposes: { + './Card__main_thread': './src/Card', + }, + }, + 'reserves expose keys ending in "__main_thread"', + ], + ])('rejects conflicting remote bundle options', async (options, message) => { + const { modifyRspackConfig } = setupPlugin(options as any, { + remoteBundle: { target: 'web' }, + }); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow(message); + }); + + it('reserves internal main-thread expose keys for native remotes', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './Card__main_thread': './src/Card' }, + }, + { remoteBundle: { target: 'lynx' } }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + 'reserves expose keys ending in "__main_thread"', + ); + }); + + it('requires exposes for a remote bundle', async () => { + const { modifyRspackConfig } = setupPlugin( + { name: 'catalog' }, + { remoteBundle: { target: 'web' } }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + 'requires at least one expose', + ); + }); + + it('rejects expose keys that collide after chunk-name sanitization', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { + './profile/card': './src/Card', + './profile?card': './src/OtherCard', + }, + }, + { remoteBundle: { target: 'web' } }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + 'both map to chunk name "profile_card"', + ); + }); + + it('rejects unknown remote bundle targets', async () => { + const { modifyRspackConfig } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { + remoteBundle: { target: 'native' } as any, + }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + 'must be either `"lynx"` or `"web"`', + ); + }); + + it('rejects atomic web bundles because exposures require paired lazy roots', async () => { + const { modifyRspackConfig } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { + remoteBundle: { target: 'web', chunking: 'single' } as any, + }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + 'one external bundle has only one main-thread root', + ); + }); + + it('rejects remote bundle filenames that the runtime cannot recognize', async () => { + const { modifyRspackConfig } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { + remoteBundle: { target: 'web', filename: 'catalog.bin' }, + }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + 'must end with `.lynx.bundle`', + ); + }); + + it('rejects remote bundle library types that contradict the manifest', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './Card': './src/Card' }, + library: { type: 'module' }, + }, + { remoteBundle: { target: 'web' } }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + 'requires `library.type: "commonjs-module"`', + ); + }); + + it('only applies to configured environments', async () => { + const { applyEnvironmentConfig, modifyRspackConfig } = setupPlugin( + { name: 'lynx_host' }, + { environment: 'lynx' }, + ); + const config = { plugins: [] }; + const environmentConfig = { source: { include: [] } }; + + expect(await modifyRspackConfig(config, 'web')).toBe(config); + expect(config.plugins).toHaveLength(0); + expect(applyEnvironmentConfig(environmentConfig, 'web')).toBe( + environmentConfig, + ); + expect(environmentConfig.source.include).toEqual([]); + }); + + it('fails clearly when the Lynx DSL exposes invalid layers', async () => { + const { modifyRspackConfig } = setupPlugin( + { name: 'lynx_host' }, + undefined, + { BACKGROUND: 'background' }, + ); + + await expect(modifyRspackConfig({})).rejects.toThrow( + 'distinct string `BACKGROUND` and `MAIN_THREAD` values', + ); + }); +}); diff --git a/packages/lynx/src/plugin.ts b/packages/lynx/src/plugin.ts new file mode 100644 index 00000000000..16193e1b564 --- /dev/null +++ b/packages/lynx/src/plugin.ts @@ -0,0 +1,167 @@ +import { + LynxCacheEventsPlugin, + type LynxCacheEventsPluginOptions, +} from '@lynx-js/cache-events-webpack-plugin'; +import type { Configuration } from '@rspack/core'; +import type { RsbuildPlugin } from '@rsbuild/core'; + +import { + createLynxChunkLoadingMatcherPlugin, + type LynxTemplatePluginApi, +} from './chunkLoadingMatcher'; +import { createCompilerModuleFederationPlugin } from './compilerFederation'; +import { + createFederationOptions, + getLynxShareScopes, + getRemoteBundleOptions, + normalizeLynxExposes, + normalizeLynxShared, + normalizeSharedForBothLayers, + shouldApplyToEnvironment, + validateLayers, + type ExposedLayers, + type LynxModuleFederationAdapterOptions, + type LynxModuleFederationOptions, +} from './pluginOptions'; +import { configureRemoteBundle } from './remoteBundle'; +import type { LynxRuntimePluginOptions } from './runtimeCore'; + +export const LYNX_RUNTIME_PLUGIN = '@module-federation/lynx/runtimePlugin'; + +const disableRemoteEntryEventCaching = (config: Configuration): void => { + const index = config.plugins?.findIndex( + (plugin) => + plugin !== false && + plugin !== null && + plugin !== undefined && + plugin instanceof LynxCacheEventsPlugin, + ); + if (index === undefined || index < 0) { + return; + } + + const current = config.plugins![index] as LynxCacheEventsPlugin & { + options?: LynxCacheEventsPluginOptions; + }; + config.plugins![index] = new LynxCacheEventsPlugin({ + ...current.options, + setupListTransformer: () => [], + }); +}; + +export { normalizeLynxExposes, normalizeLynxShared }; +export type { + LynxModuleFederationAdapterOptions, + LynxModuleFederationOptions, + LynxNativeRemoteBundleOptions, + LynxRemoteBundleOptions, + LynxShared, + LynxSharedConfig, + LynxSharedRealm, + LynxWebRemoteBundleOptions, +} from './pluginOptions'; +export type { LynxRuntimePluginOptions } from './runtimeCore'; + +export const pluginLynxModuleFederation = ( + options: LynxModuleFederationOptions, + adapterOptions: LynxModuleFederationAdapterOptions = {}, +): RsbuildPlugin => { + if (!options?.name) { + throw new Error( + 'The module federation option "name" is required in @module-federation/lynx.', + ); + } + + return { + name: 'module-federation:lynx', + setup(api) { + api.modifyEnvironmentConfig((config, { name }) => { + if (!shouldApplyToEnvironment(adapterOptions.environment, name)) { + return config; + } + config.source.include = [ + ...(config.source.include || []), + /@module-federation[\\/]/, + ]; + return config; + }); + + api.modifyRspackConfig(async (config, { environment }) => { + if ( + !shouldApplyToEnvironment( + adapterOptions.environment, + environment.name, + ) + ) { + return config; + } + + const layers = validateLayers( + api.useExposed(Symbol.for('LAYERS')), + ); + const defaultLayer = adapterOptions.layer ?? layers.BACKGROUND; + const runtimePlugin = + adapterOptions.runtimePlugin ?? LYNX_RUNTIME_PLUGIN; + const lynxTemplatePlugin = api.useExposed<{ + LynxTemplatePlugin: LynxTemplatePluginApi; + }>(Symbol.for('LynxTemplatePlugin'))?.LynxTemplatePlugin; + const remoteBundle = getRemoteBundleOptions(adapterOptions); + const mainThreadEnabled = + Boolean(adapterOptions.mainThread) || remoteBundle?.target === 'web'; + + config.output ||= {}; + config.output.chunkLoading ??= 'lynx'; + config.output.chunkFormat ??= 'commonjs'; + config.output.iife ??= false; + config.output.uniqueName ??= options.name; + config.experiments ||= {}; + const experiments = config.experiments as typeof config.experiments & { + layers?: boolean; + }; + experiments.layers ??= true; + + if (remoteBundle) { + disableRemoteEntryEventCaching(config as unknown as Configuration); + await configureRemoteBundle( + config as unknown as Configuration, + options, + adapterOptions, + layers, + remoteBundle, + runtimePlugin, + lynxTemplatePlugin, + ); + return config; + } + + const federationOptions = createFederationOptions( + mainThreadEnabled + ? { + ...options, + shareScope: getLynxShareScopes(options.shareScope, layers), + } + : options, + normalizeLynxExposes(options.exposes, defaultLayer), + mainThreadEnabled + ? normalizeSharedForBothLayers(options.shared, layers) + : normalizeLynxShared(options.shared, defaultLayer, layers), + runtimePlugin, + adapterOptions.runtimePluginOptions, + ); + + config.plugins ||= []; + config.plugins.push( + createCompilerModuleFederationPlugin(federationOptions), + createLynxChunkLoadingMatcherPlugin(lynxTemplatePlugin, { + pairedRealmChunkSuffixes: { + background: `-${layers.BACKGROUND.replace(/:/g, '__')}`, + mainThread: `-${layers.MAIN_THREAD.replace(/:/g, '__')}`, + }, + }), + ); + + return config; + }); + }, + }; +}; diff --git a/packages/lynx/src/pluginOptions.ts b/packages/lynx/src/pluginOptions.ts new file mode 100644 index 00000000000..9a230443f7c --- /dev/null +++ b/packages/lynx/src/pluginOptions.ts @@ -0,0 +1,321 @@ +import { isRequiredVersion } from '@module-federation/sdk'; +import type { + Exposes, + ExposesConfig, + ModuleFederationPluginOptions, + Shared, + SharedConfig, +} from '@rspack/core'; + +import type { LynxRuntimePluginOptions } from './runtimeCore'; + +export interface ExposedLayers { + BACKGROUND: string; + MAIN_THREAD: string; +} + +interface LynxRemoteBundleBaseOptions { + /** Output name ending in `.lynx.bundle`. Defaults to `.lynx.bundle`. */ + filename?: string; + /** Lynx engine version passed to the external bundle encoder. Defaults to `3.7`. */ + engineVersion?: string; + /** + * Keep ordinary Rspeedy entry bundles beside federation artifacts. Disable + * only for a dedicated remote environment whose source entry is disposable. + * + * @defaultValue `true` + */ + preserveSourceEntryBundles?: boolean; +} + +export interface LynxNativeRemoteBundleOptions extends LynxRemoteBundleBaseOptions { + /** Emit a native Lynx background-runtime bundle using `@lynx-js/tasm`. */ + target: 'lynx'; + /** + * Keep lazy bundles separate (`split`) or embed background-only module + * chunks in the container (`single`). ReactLynx UI exposures require split. + * + * @defaultValue `'split'` + */ + chunking?: 'split' | 'single'; +} + +export interface LynxWebRemoteBundleOptions extends LynxRemoteBundleBaseOptions { + /** Emit a Lynx for Web bundle containing background and main-thread sections. */ + target: 'web'; + /** Paired ReactLynx exposure roots require independently loadable bundles. */ + chunking?: 'split'; +} + +export type LynxRemoteBundleOptions = + | LynxNativeRemoteBundleOptions + | LynxWebRemoteBundleOptions; + +export type LynxSharedRealm = 'background' | 'main-thread'; + +export interface LynxSharedConfig extends SharedConfig { + /** Select the Lynx JavaScript realm without depending on DSL layer names. */ + realm?: LynxSharedRealm; +} + +export type LynxShared = + | string + | Record + | Array>; + +export type LynxModuleFederationOptions = Omit< + ModuleFederationPluginOptions, + 'shared' +> & { + shared?: LynxShared; +}; + +export interface LynxModuleFederationAdapterOptions { + /** Only apply federation to these Rsbuild environments. */ + environment?: string | string[]; + /** Default Rspack layer for exposes and shared modules. */ + layer?: string; + /** Emit a manifest-addressable native or web external bundle. */ + remoteBundle?: LynxRemoteBundleOptions; + /** Enable main-thread federation. */ + mainThread?: boolean; + /** Override the runtime transport plugin module. */ + runtimePlugin?: string; + /** Options passed to the Lynx runtime transport plugin. */ + runtimePluginOptions?: LynxRuntimePluginOptions; +} + +export const shouldApplyToEnvironment = ( + configuredEnvironment: string | string[] | undefined, + environmentName: string, +): boolean => { + if (!configuredEnvironment) { + return true; + } + + return Array.isArray(configuredEnvironment) + ? configuredEnvironment.includes(environmentName) + : configuredEnvironment === environmentName; +}; + +export const validateLayers = ( + layers: ExposedLayers | undefined, +): ExposedLayers => { + if ( + !layers || + typeof layers.BACKGROUND !== 'string' || + !layers.BACKGROUND || + typeof layers.MAIN_THREAD !== 'string' || + !layers.MAIN_THREAD || + layers.BACKGROUND === layers.MAIN_THREAD + ) { + throw new Error( + '@module-federation/lynx requires exposed `LAYERS` with distinct string `BACKGROUND` and `MAIN_THREAD` values. Install a Lynx DSL plugin such as `pluginReactLynx` before it.', + ); + } + + return layers; +}; + +export const normalizeLynxExposes = ( + exposes: Exposes | undefined, + defaultLayer: string, +): Exposes | undefined => { + if (!exposes) { + return undefined; + } + + const normalized: Record = {}; + for (const item of Array.isArray(exposes) ? exposes : [exposes]) { + if (typeof item === 'string') { + normalized[item] = { import: item, layer: defaultLayer }; + continue; + } + + for (const [key, value] of Object.entries(item)) { + normalized[key] = + typeof value === 'string' || Array.isArray(value) + ? { import: value, layer: defaultLayer } + : { ...value, layer: value.layer ?? defaultLayer }; + } + } + + return normalized; +}; + +const normalizeSharedValue = ( + key: string, + value: string | LynxSharedConfig, + defaultLayer: string, + isolateShareScope = false, + layers?: ExposedLayers, +): SharedConfig => { + const config: LynxSharedConfig = + typeof value === 'string' + ? value === key || !isRequiredVersion(value) + ? { import: value } + : { import: key, requiredVersion: value } + : value; + const { realm, ...sharedConfig } = config; + const realmLayer = + realm === 'background' + ? layers?.BACKGROUND + : realm === 'main-thread' + ? layers?.MAIN_THREAD + : undefined; + if (realm && !realmLayer) { + throw new Error( + `@module-federation/lynx cannot resolve shared realm "${realm}" without exposed Lynx layers.`, + ); + } + if ( + realmLayer && + ((sharedConfig.layer && sharedConfig.layer !== realmLayer) || + (sharedConfig.issuerLayer && sharedConfig.issuerLayer !== realmLayer)) + ) { + throw new Error( + `@module-federation/lynx shared module "${key}" cannot combine realm "${realm}" with a different layer or issuerLayer.`, + ); + } + const layer = sharedConfig.layer ?? realmLayer ?? defaultLayer; + const issuerLayer = sharedConfig.issuerLayer ?? realmLayer ?? defaultLayer; + + return { + ...sharedConfig, + layer, + issuerLayer, + ...(isolateShareScope + ? { + shareScope: (Array.isArray(config.shareScope) + ? config.shareScope + : [config.shareScope ?? 'default'] + ).map((scope) => `${scope}:${issuerLayer}`), + } + : {}), + }; +}; + +const normalizeSharedItem = ( + item: string | Record, + defaultLayer: string, + isolateShareScope = false, + layers?: ExposedLayers, +): Record => { + if (typeof item === 'string') { + return { + [item]: normalizeSharedValue( + item, + item, + defaultLayer, + isolateShareScope, + layers, + ), + }; + } + + return Object.fromEntries( + Object.entries(item).map(([key, value]) => [ + key, + normalizeSharedValue(key, value, defaultLayer, isolateShareScope, layers), + ]), + ); +}; + +export const normalizeLynxShared = ( + shared: LynxShared | undefined, + defaultLayer: string, + layers?: ExposedLayers, +): Shared | undefined => { + if (!shared) { + return undefined; + } + + return Array.isArray(shared) + ? shared.map((item) => + normalizeSharedItem(item, defaultLayer, false, layers), + ) + : normalizeSharedItem(shared, defaultLayer, false, layers); +}; + +export const normalizeSharedForBothLayers = ( + shared: LynxShared | undefined, + layers: ExposedLayers, +): Shared | undefined => { + if (!shared) { + return undefined; + } + + const items = Array.isArray(shared) ? shared : [shared]; + return items.map((item) => + normalizeSharedItem(item, layers.BACKGROUND, true, layers), + ); +}; + +export const getLynxShareScopes = ( + shareScope: ModuleFederationPluginOptions['shareScope'], + layers: ExposedLayers, +): string[] => + (Array.isArray(shareScope) ? shareScope : [shareScope ?? 'default']).flatMap( + (scope) => [ + `${scope}:${layers.BACKGROUND}`, + `${scope}:${layers.MAIN_THREAD}`, + ], + ); + +export const injectRuntimePlugin = ( + runtimePlugins: ModuleFederationPluginOptions['runtimePlugins'], + runtimePlugin: string, + runtimePluginOptions: LynxRuntimePluginOptions | undefined, +): NonNullable => { + const plugins = runtimePlugins ?? []; + if ( + plugins.some((plugin) => + Array.isArray(plugin) + ? plugin[0] === runtimePlugin + : plugin === runtimePlugin, + ) + ) { + return plugins; + } + + const useTuples = + runtimePluginOptions !== undefined || plugins.some(Array.isArray); + if (useTuples) { + return [ + ...plugins.map((plugin) => + Array.isArray(plugin) ? plugin : [plugin, {}], + ), + [runtimePlugin, runtimePluginOptions ?? {}], + ] as [string, Record][]; + } + + return [...plugins, runtimePlugin] as string[]; +}; + +export const getRemoteBundleOptions = ( + adapterOptions: LynxModuleFederationAdapterOptions, +): LynxRemoteBundleOptions | undefined => adapterOptions.remoteBundle; + +export const createFederationOptions = ( + options: LynxModuleFederationOptions, + exposes: Exposes | undefined, + shared: Shared | undefined, + runtimePlugin: string, + runtimePluginOptions: LynxRuntimePluginOptions | undefined, +): ModuleFederationPluginOptions => ({ + ...options, + exposes, + shared, + filename: options.filename ?? 'remoteEntry.js', + library: options.library ?? { type: 'commonjs-module' }, + remoteType: options.remoteType ?? 'script', + experiments: { + ...options.experiments, + asyncStartup: options.experiments?.asyncStartup ?? true, + }, + runtimePlugins: injectRuntimePlugin( + options.runtimePlugins, + runtimePlugin, + runtimePluginOptions, + ), +}); diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts new file mode 100644 index 00000000000..9eb7633e6aa --- /dev/null +++ b/packages/lynx/src/remoteBundle.ts @@ -0,0 +1,409 @@ +import type { + Compiler, + Configuration, + Exposes, + ExposesConfig, +} from '@rspack/core'; +import { getManifestFileName } from '@module-federation/sdk'; + +import { + createLynxChunkLoadingMatcherPlugin, + type LynxTemplatePluginApi, +} from './chunkLoadingMatcher'; +import { createCompilerModuleFederationPlugin } from './compilerFederation'; +import { createLynxExternalBundlePlugin } from './externalBundle'; +import { + createFederationOptions, + getLynxShareScopes, + normalizeLynxExposes, + normalizeLynxShared, + normalizeSharedForBothLayers, + type ExposedLayers, + type LynxModuleFederationAdapterOptions, + type LynxModuleFederationOptions, + type LynxRemoteBundleOptions, +} from './pluginOptions'; +import { createLynxRemoteManifestPlugin } from './remoteManifest'; +import { MAIN_THREAD_EXPOSE_SUFFIX } from './runtimeCore'; +import { getLynxWebEncodeMode } from './webEncode'; + +const hasExposes = (exposes: Exposes | undefined): boolean => { + if (!exposes) { + return false; + } + + return Array.isArray(exposes) + ? exposes.some( + (item) => typeof item === 'string' || Object.keys(item).length > 0, + ) + : Object.keys(exposes).length > 0; +}; + +const findConflictingExposeLayer = ( + exposes: Exposes, + backgroundLayer: string, +): string | undefined => { + for (const item of Array.isArray(exposes) ? exposes : [exposes]) { + if (typeof item === 'string') { + continue; + } + + for (const value of Object.values(item)) { + if ( + value !== null && + typeof value === 'object' && + !Array.isArray(value) && + value.layer !== undefined && + value.layer !== backgroundLayer + ) { + return value.layer; + } + } + } + + return undefined; +}; + +const findReservedExposeKey = ( + exposes: Exposes, + suffix: string, +): string | undefined => { + for (const item of Array.isArray(exposes) ? exposes : [exposes]) { + const keys = typeof item === 'string' ? [item] : Object.keys(item); + const reservedKey = keys.find((key) => key.endsWith(suffix)); + if (reservedKey) { + return reservedKey; + } + } + + return undefined; +}; + +const toChunkName = (key: string): string => { + const name = key.replace(/^\.\//, '').replace(/[^A-Za-z0-9_-]+/g, '_'); + return name || 'expose'; +}; + +const assertUniqueChunkNames = (exposes: Exposes): void => { + const normalized = normalizeLynxExposes(exposes, '') as Record< + string, + ExposesConfig + >; + const keysByChunkName = new Map(); + for (const key of Object.keys(normalized)) { + const chunkName = toChunkName(key); + const previousKey = keysByChunkName.get(chunkName); + if (previousKey) { + throw new Error( + `@module-federation/lynx expose keys "${previousKey}" and "${key}" both map to chunk name "${chunkName}"; rename one expose to keep lazy bundle names unique.`, + ); + } + keysByChunkName.set(chunkName, key); + } +}; + +const createRemoteExposes = ( + exposes: Exposes, + layer: string, + prefix: string, + keySuffix = '', +): Record => { + const normalized = normalizeLynxExposes(exposes, layer) as Record< + string, + ExposesConfig + >; + + return Object.fromEntries( + Object.entries(normalized).map(([key, value]) => [ + `${key}${keySuffix}`, + { + ...value, + layer, + name: `${prefix}${toChunkName(key)}`, + }, + ]), + ); +}; + +const isModuleInLayer = (module: unknown, layer: string): boolean => { + return (module as { layer?: string }).layer === layer; +}; + +const createWebRemoteAssetsPlugin = ( + mainThreadChunks: string[], + backgroundEntry: string, + mainThreadEntry: string, + backgroundChunkPrefix: string, + mainThreadLayer: string, +) => ({ + apply(compiler: Compiler) { + const pluginName = 'LynxModuleFederationMainThreadChunks'; + compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { + compilation.hooks.processAssets.tap( + { + name: pluginName, + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + 2, + }, + () => { + mainThreadChunks.length = 0; + const entryAsset = compilation.getAsset(backgroundEntry); + if (!entryAsset) { + throw new Error( + `@module-federation/lynx could not find generated container asset "${backgroundEntry}".`, + ); + } + compilation.emitAsset( + mainThreadEntry, + entryAsset.source, + entryAsset.info, + ); + mainThreadChunks.push(mainThreadEntry); + + for (const chunk of compilation.chunks) { + const containsMainThreadModule = Array.from( + compilation.chunkGraph.getChunkModulesIterable(chunk), + ).some((module) => isModuleInLayer(module, mainThreadLayer)); + const containsBackgroundExpose = + typeof chunk.name === 'string' && + chunk.name.startsWith(backgroundChunkPrefix); + if (!containsMainThreadModule && !containsBackgroundExpose) { + continue; + } + + for (const filename of chunk.files) { + if (filename.endsWith('.js') && filename !== backgroundEntry) { + mainThreadChunks.push(filename); + const asset = compilation.getAsset(filename); + if (asset) { + compilation.updateAsset( + filename, + containsMainThreadModule + ? new compiler.webpack.sources.ConcatSource( + '(function (globDynamicComponentEntry) {\n', + ' const module = { exports: {} };\n', + ' const exports = module.exports;\n', + asset.source, + '\n module.exports.__lynx_dynamic_component_entry__ = globDynamicComponentEntry;\n', + ' return module.exports;\n})', + ) + : new compiler.webpack.sources.ConcatSource( + asset.source, + "\nif (typeof globDynamicComponentEntry !== 'string') { throw new Error('Lynx DynamicComponent entry identity is unavailable.'); }\n", + 'exports.__lynx_dynamic_component_entry__ = globDynamicComponentEntry;\n', + ), + { + ...asset.info, + ...(containsMainThreadModule + ? { 'lynx:main-thread': true } + : {}), + }, + ); + } + } + } + } + }, + ); + }); + }, +}); + +export const configureRemoteBundle = async ( + config: Configuration, + options: LynxModuleFederationOptions, + adapterOptions: LynxModuleFederationAdapterOptions, + layers: ExposedLayers, + remoteBundle: LynxRemoteBundleOptions, + runtimePlugin: string, + lynxTemplatePlugin?: LynxTemplatePluginApi, +): Promise => { + if (!hasExposes(options.exposes)) { + throw new Error( + '@module-federation/lynx `remoteBundle` requires at least one expose.', + ); + } + if (remoteBundle.target !== 'lynx' && remoteBundle.target !== 'web') { + throw new Error( + '@module-federation/lynx `remoteBundle.target` must be either `"lynx"` or `"web"`.', + ); + } + if ( + remoteBundle.target === 'web' && + (remoteBundle as { chunking?: string }).chunking === 'single' + ) { + throw new Error( + '@module-federation/lynx web remotes require `chunking: "split"`; one external bundle has only one main-thread root and cannot activate independently scoped ReactLynx exposure roots.', + ); + } + if ( + remoteBundle.filename !== undefined && + !remoteBundle.filename.endsWith('.lynx.bundle') + ) { + throw new Error( + '@module-federation/lynx `remoteBundle.filename` must end with `.lynx.bundle`.', + ); + } + if (options.filename !== undefined) { + throw new Error( + '@module-federation/lynx `remoteBundle` manages container filenames; remove `options.filename`.', + ); + } + if (options.library && options.library.type !== 'commonjs-module') { + throw new Error( + '@module-federation/lynx `remoteBundle` requires `library.type: "commonjs-module"`.', + ); + } + if (options.runtime !== undefined) { + throw new Error( + '@module-federation/lynx `remoteBundle` manages the container runtime; remove `options.runtime`.', + ); + } + if (options.manifest === false) { + throw new Error( + '@module-federation/lynx `remoteBundle` requires the Module Federation manifest; remove `manifest: false`.', + ); + } + if (adapterOptions.layer && adapterOptions.layer !== layers.BACKGROUND) { + throw new Error( + '@module-federation/lynx `remoteBundle` requires the adapter layer to be `LAYERS.BACKGROUND`.', + ); + } + + const conflictingLayer = findConflictingExposeLayer( + options.exposes!, + layers.BACKGROUND, + ); + if (conflictingLayer) { + throw new Error( + `@module-federation/lynx \`remoteBundle\` owns expose layers; remove the explicit \`${conflictingLayer}\` expose layer.`, + ); + } + assertUniqueChunkNames(options.exposes!); + + const reservedExposeKey = findReservedExposeKey( + options.exposes!, + MAIN_THREAD_EXPOSE_SUFFIX, + ); + if (reservedExposeKey) { + throw new Error( + `@module-federation/lynx remoteBundle reserves expose keys ending in "${MAIN_THREAD_EXPOSE_SUFFIX}"; rename "${reservedExposeKey}".`, + ); + } + + const bundleFileName = remoteBundle.filename ?? `${options.name}.lynx.bundle`; + const backgroundEntry = `${options.name}.js`; + const mainThreadEntry = `${options.name}__main-thread.js`; + const backgroundChunkPrefix = `${options.name}__background_`; + const mainThreadChunkPrefix = `${options.name}__main-thread__`; + const webTarget = remoteBundle.target === 'web'; + const remoteExposes = webTarget + ? { + ...createRemoteExposes( + options.exposes!, + layers.BACKGROUND, + backgroundChunkPrefix, + ), + ...createRemoteExposes( + options.exposes!, + layers.MAIN_THREAD, + mainThreadChunkPrefix, + MAIN_THREAD_EXPOSE_SUFFIX, + ), + } + : createRemoteExposes( + options.exposes!, + layers.BACKGROUND, + backgroundChunkPrefix, + ); + const remoteShared = webTarget + ? normalizeSharedForBothLayers(options.shared, layers) + : normalizeLynxShared(options.shared, layers.BACKGROUND, layers); + const federationOptions = { + ...createFederationOptions( + webTarget + ? { + ...options, + shareScope: getLynxShareScopes(options.shareScope, layers), + } + : options, + remoteExposes, + remoteShared, + runtimePlugin, + adapterOptions.runtimePluginOptions, + ), + manifest: options.manifest ?? true, + filename: backgroundEntry, + runtime: false as const, + }; + const mainThreadChunks: string[] = []; + const lazyBundleAssets = new Set(); + const discardedTemplateAssets = new Set(); + const { manifestFileName, statsFileName } = getManifestFileName( + federationOptions.manifest, + ); + const encode = webTarget + ? getLynxWebEncodeMode() + : ((await import('@lynx-js/tasm')).getEncodeMode() as ( + value: unknown, + ) => Promise<{ buffer: Buffer }>); + config.plugins ||= []; + config.plugins.push( + createCompilerModuleFederationPlugin(federationOptions), + createLynxChunkLoadingMatcherPlugin(lynxTemplatePlugin, { + backgroundOnlyRemote: !webTarget, + chunking: remoteBundle.chunking ?? 'split', + discardSourceEntryBundles: + remoteBundle.preserveSourceEntryBundles === false, + discardedTemplateAssets, + includedChunkPrefixes: [ + backgroundChunkPrefix, + ...(webTarget ? [mainThreadChunkPrefix] : []), + ], + lazyBundleAssets, + remoteEntryName: options.name, + ...(webTarget + ? { + pairedRealmChunkPrefixes: { + background: backgroundChunkPrefix, + mainThread: mainThreadChunkPrefix, + }, + pairedRealmChunkSuffixes: { + background: `-${layers.BACKGROUND.replace(/:/g, '__')}`, + mainThread: `-${layers.MAIN_THREAD.replace(/:/g, '__')}`, + }, + } + : {}), + }), + ); + if (webTarget) { + config.plugins.push( + createWebRemoteAssetsPlugin( + mainThreadChunks, + backgroundEntry, + mainThreadEntry, + backgroundChunkPrefix, + layers.MAIN_THREAD, + ), + ); + } + config.plugins.push( + createLynxExternalBundlePlugin({ + bundleFileName, + chunking: remoteBundle.chunking ?? 'split', + discardedTemplateAssets, + encode, + engineVersion: remoteBundle.engineVersion, + entryAssets: [backgroundEntry, ...(webTarget ? [mainThreadEntry] : [])], + entryName: options.name, + includedChunkPrefixes: [ + backgroundChunkPrefix, + ...(webTarget ? [mainThreadChunkPrefix] : []), + ], + lazyBundleAssets, + mainThreadChunks, + preservedAssets: [manifestFileName, statsFileName], + }), + createLynxRemoteManifestPlugin(federationOptions.manifest, bundleFileName), + ); +}; diff --git a/packages/lynx/src/remoteManifest.test.ts b/packages/lynx/src/remoteManifest.test.ts new file mode 100644 index 00000000000..b6453a9953e --- /dev/null +++ b/packages/lynx/src/remoteManifest.test.ts @@ -0,0 +1,154 @@ +import { describe, expect, it, rs } from '@rstest/core'; + +import { + createLynxRemoteManifestPlugin, + retargetRemoteEntry, +} from './remoteManifest'; + +const createManifest = () => ({ + id: 'catalog', + metaData: { + remoteEntry: { + path: 'static/js/', + name: 'catalog.js', + type: 'global', + extra: 'preserved', + }, + }, + exposes: [ + { + name: 'Card', + requiredShared: [{ name: 'react' }], + assets: { + js: { sync: ['static/Card.js'], async: ['static/vendor.js'] }, + css: { sync: ['static/Card.css'], async: [] }, + }, + }, + { + name: 'Card__main_thread', + path: './Card__main_thread', + assets: { + js: { sync: ['static/Card.main.js'], async: [] }, + css: { sync: [], async: [] }, + }, + }, + ], +}); + +describe('Lynx remote manifest', () => { + it('retargets the public remote entry to the external bundle', () => { + const result = JSON.parse( + retargetRemoteEntry( + JSON.stringify(createManifest()), + 'mf-manifest.json', + 'remotes/catalog.lynx.bundle', + ), + ); + + expect(result).toMatchObject({ + id: 'catalog', + metaData: { + remoteEntry: { + path: 'remotes/', + name: 'catalog.lynx.bundle', + type: 'lynx', + extra: 'preserved', + }, + }, + exposes: [ + { + name: 'Card', + requiredShared: [{ name: 'react' }], + assets: { + js: { sync: [], async: [] }, + css: { sync: [], async: [] }, + }, + }, + ], + }); + }); + + it('does not advertise external bundle sections as browser assets', () => { + const manifest = createManifest(); + const result = JSON.parse( + retargetRemoteEntry( + JSON.stringify(manifest), + 'mf-manifest.json', + 'catalog.lynx.bundle', + ), + ); + + expect(result.exposes[0].assets).toEqual({ + js: { sync: [], async: [] }, + css: { sync: [], async: [] }, + }); + expect(result.exposes).toHaveLength(1); + expect(manifest.exposes[0].assets.js.sync).toEqual(['static/Card.js']); + }); + + it.each([ + ['not JSON', 'could not parse'], + [JSON.stringify({ metaData: {} }), 'has no metaData.remoteEntry'], + ])('rejects an invalid generated asset', (source, message) => { + expect(() => + retargetRemoteEntry(source, 'mf-manifest.json', 'catalog.lynx.bundle'), + ).toThrow(message); + }); + + it('rewrites configured manifest and stats assets after generation', () => { + const plugin = createLynxRemoteManifestPlugin( + { filePath: 'metadata', fileName: 'catalog-manifest.json' }, + 'catalog.lynx.bundle', + ); + let rewriteAssets: (() => void) | undefined; + const updateAsset = rs.fn(); + const compiler = { + webpack: { + Compilation: { PROCESS_ASSETS_STAGE_REPORT: 5_000 }, + sources: { + RawSource: class { + constructor(readonly value: string) {} + }, + }, + }, + hooks: { + emit: { + tap(_name: string, callback: (compilation: any) => void) { + rewriteAssets = () => callback(compilation); + }, + }, + }, + }; + const source = JSON.stringify(createManifest()); + const compilation = { + getAsset(name: string) { + return [ + 'metadata/catalog-manifest.json', + 'metadata/catalog-manifest-stats.json', + ].includes(name) + ? { source: { source: () => source } } + : undefined; + }, + updateAsset, + }; + plugin.apply(compiler as any); + rewriteAssets!(); + + expect(updateAsset).toHaveBeenCalledTimes(2); + expect(updateAsset.mock.calls.map((call) => call[0])).toEqual([ + 'metadata/catalog-manifest.json', + 'metadata/catalog-manifest-stats.json', + ]); + for (const call of updateAsset.mock.calls) { + expect(JSON.parse(call[1].value)).toMatchObject({ + metaData: { + remoteEntry: { + path: '', + name: 'catalog.lynx.bundle', + type: 'lynx', + }, + }, + }); + } + }); +}); diff --git a/packages/lynx/src/remoteManifest.ts b/packages/lynx/src/remoteManifest.ts new file mode 100644 index 00000000000..e0244c9c062 --- /dev/null +++ b/packages/lynx/src/remoteManifest.ts @@ -0,0 +1,139 @@ +import { getManifestFileName } from '@module-federation/sdk'; +import type { + Compiler, + ModuleFederationPluginOptions, + WebpackPluginInstance, +} from '@rspack/core'; + +import { MAIN_THREAD_EXPOSE_SUFFIX } from './runtimeCore'; + +interface RemoteEntryRecord extends Record { + name: string; + path: string; + type: string; +} + +interface FederationMetadata extends Record { + remoteEntry: RemoteEntryRecord; +} + +interface FederationManifest extends Record { + exposes?: unknown; + metaData: FederationMetadata; +} + +const isRecord = (value: unknown): value is Record => + typeof value === 'object' && value !== null; + +const parseManifest = ( + source: string, + assetName: string, +): FederationManifest => { + let value: unknown; + try { + value = JSON.parse(source); + } catch { + throw new Error( + `@module-federation/lynx could not parse generated manifest asset "${assetName}".`, + ); + } + + if ( + !isRecord(value) || + !isRecord(value.metaData) || + !isRecord(value.metaData.remoteEntry) + ) { + throw new Error( + `@module-federation/lynx generated manifest asset "${assetName}" has no metaData.remoteEntry.`, + ); + } + + return value as FederationManifest; +}; + +const getBundleResource = ( + bundleFileName: string, +): Pick => { + const lastSlash = bundleFileName.lastIndexOf('/'); + return { + path: lastSlash === -1 ? '' : bundleFileName.slice(0, lastSlash + 1), + name: bundleFileName.slice(lastSlash + 1), + type: 'lynx', + }; +}; + +export const retargetRemoteEntry = ( + source: string, + assetName: string, + bundleFileName: string, +): string => { + const manifest = parseManifest(source, assetName); + manifest.metaData.remoteEntry = { + ...manifest.metaData.remoteEntry, + ...getBundleResource(bundleFileName), + }; + if (Array.isArray(manifest.exposes)) { + const exposes = manifest.exposes.filter( + (expose) => + !isRecord(expose) || + ![expose.name, expose.path].some( + (value) => + typeof value === 'string' && + value.endsWith(MAIN_THREAD_EXPOSE_SUFFIX), + ), + ); + manifest.exposes = exposes; + for (const expose of exposes) { + if (!isRecord(expose) || !isRecord(expose.assets)) { + continue; + } + + for (const type of ['js', 'css']) { + const assets = expose.assets[type]; + if (isRecord(assets)) { + expose.assets[type] = { ...assets, sync: [], async: [] }; + } + } + } + } + return JSON.stringify(manifest, null, 2); +}; + +export const createLynxRemoteManifestPlugin = ( + manifest: ModuleFederationPluginOptions['manifest'], + bundleFileName: string, +): WebpackPluginInstance => { + const { manifestFileName, statsFileName } = getManifestFileName(manifest); + const assetNames = [manifestFileName, statsFileName]; + + return { + apply(compiler: Compiler) { + const pluginName = 'LynxModuleFederationRemoteManifest'; + compiler.hooks.emit.tap(pluginName, (compilation) => { + for (const assetName of assetNames) { + const asset = compilation.getAsset(assetName); + if (!asset) { + const emittedAssets = compilation + .getAssets() + .map(({ name }) => name) + .sort() + .join(', '); + throw new Error( + `@module-federation/lynx could not find generated manifest asset "${assetName}". Emitted assets: ${emittedAssets || '(none)'}.`, + ); + } + compilation.updateAsset( + assetName, + new compiler.webpack.sources.RawSource( + retargetRemoteEntry( + asset.source.source().toString(), + assetName, + bundleFileName, + ), + ), + ); + } + }); + }, + }; +}; diff --git a/packages/lynx/src/runtimeChunkLoading.ts b/packages/lynx/src/runtimeChunkLoading.ts new file mode 100644 index 00000000000..b0e665618fc --- /dev/null +++ b/packages/lynx/src/runtimeChunkLoading.ts @@ -0,0 +1,388 @@ +import { + getLynxRealm, + getLynxRuntime, + getRemoteOriginKey, + getRegistryKey, + isRecord, + LYNX_BUNDLE_REGISTRY, + type LynxGlobal, +} from './runtimeCore'; +import { loadWithTimeout } from './runtimeTimeout'; + +type ChunkId = string | number; +type ChunkHandler = (chunkId: ChunkId, promises: Promise[]) => void; + +export interface LynxWebpackRequire { + consumesLoadingData?: { + chunkMapping?: Record; + }; + f: Record; + lynx_aci?: Record; + lynx_chunking?: 'single' | 'split'; + m: Record; + p?: string; + u(chunkId: ChunkId): string; +} + +interface LynxChunk { + __lynx_dynamic_component_entry__?: string; + ids: ChunkId[]; + modules: Record; + runtime?: (webpackRequire: LynxWebpackRequire) => void; +} + +type InstalledChunk = 0 | [() => void, (error: unknown) => void, Promise]; + +const isChunk = (value: unknown): value is LynxChunk => + isRecord(value) && + Array.isArray(value.ids) && + isRecord(value.modules) && + (value.runtime === undefined || typeof value.runtime === 'function'); + +const getChunkSectionPath = (filename: string): string => + filename.split(/[?#]/, 1)[0].replace(/\.js$/, ''); + +const joinRemoteUrl = ( + entryUrl: string, + publicPath: string | undefined, + assetPath: string, +): string => { + if (/^(?:[a-z][a-z\d+.-]*:)?\/\//i.test(assetPath)) { + return assetPath; + } + + const entry = entryUrl.split(/[?#]/, 1)[0]; + const origin = entry.match(/^([a-z][a-z\d+.-]*:\/\/[^/]+)/i)?.[1] ?? ''; + const base = + publicPath && publicPath !== 'auto' && publicPath !== '/' + ? publicPath + : entry.slice(0, entry.lastIndexOf('/') + 1); + if (/^(?:[a-z][a-z\d+.-]*:)?\/\//i.test(base)) { + return `${base.replace(/\/$/, '')}/${assetPath.replace(/^\//, '')}`; + } + if (base.startsWith('/')) { + return `${origin}${base.replace(/\/$/, '')}/${assetPath.replace(/^\//, '')}`; + } + return `${entry.slice(0, entry.lastIndexOf('/') + 1)}${base}${assetPath}`; +}; + +const installChunk = ( + chunk: LynxChunk, + webpackRequire: LynxWebpackRequire, + installedChunks: Record, + globalObject: LynxGlobal, +): void => { + const entryName = chunk.__lynx_dynamic_component_entry__; + const modules = Object.fromEntries( + Object.entries(chunk.modules).map(([id, factory]) => [ + id, + typeof factory !== 'function' || !entryName + ? factory + : function wrappedFactory( + module: unknown, + exports: unknown, + runtimeRequire: LynxWebpackRequire, + ) { + const hadEntryName = Object.prototype.hasOwnProperty.call( + globalObject, + 'globDynamicComponentEntry', + ); + const previousEntryName = globalObject.globDynamicComponentEntry; + globalObject.globDynamicComponentEntry = entryName; + try { + return factory(module, exports, runtimeRequire); + } finally { + if (hadEntryName) { + globalObject.globDynamicComponentEntry = previousEntryName; + } else { + delete globalObject.globDynamicComponentEntry; + } + } + }, + ]), + ); + Object.assign(webpackRequire.m, modules); + chunk.runtime?.(webpackRequire); + + for (const id of chunk.ids) { + const installed = installedChunks[id]; + if (installed) { + installed[0](); + } + installedChunks[id] = 0; + } +}; + +const installChunkAfterConsumes = ( + chunk: LynxChunk, + webpackRequire: LynxWebpackRequire, + installedChunks: Record, + globalObject: LynxGlobal, +): void => { + const getMissingConsumes = (): string[] => + chunk.ids.flatMap( + (id) => + webpackRequire.consumesLoadingData?.chunkMapping?.[String(id)]?.filter( + (moduleId) => typeof webpackRequire.m[moduleId] !== 'function', + ) ?? [], + ); + const install = (): void => { + const missing = getMissingConsumes(); + if (missing.length > 0) { + throw new Error( + `Lynx chunk shared dependencies were not installed: ${missing.join(', ')}.`, + ); + } + installChunk(chunk, webpackRequire, installedChunks, globalObject); + }; + const consume = webpackRequire.f.consumes; + if (!consume) { + install(); + return; + } + + const promises: Promise[] = []; + for (const id of chunk.ids) { + consume(id, promises); + } + if (promises.length === 0) { + install(); + return; + } + + Promise.all(promises) + .then(() => { + install(); + }) + .catch((error) => { + for (const id of chunk.ids) { + const installed = installedChunks[id]; + if (installed) { + delete installedChunks[id]; + installed[1](error); + } + } + }); +}; + +interface QueryResolver { + promise: Promise; + reject(error: Error): void; + resolve(value: unknown): void; +} + +const createQueryResolver = (): QueryResolver => { + let resolve!: (value: unknown) => void; + let reject!: (error: Error) => void; + const promise = new Promise((resolvePromise, rejectPromise) => { + resolve = resolvePromise; + reject = rejectPromise; + }); + return { promise, reject, resolve }; +}; + +const queryError = (request: string, result: unknown): Error => { + const error = new Error(`Failed to load Lynx lazy bundle "${request}".`); + (error as Error & { cause?: string }).cause = JSON.stringify(result); + return error; +}; + +const withLazyBundleTimeout = ( + request: string, + timeout: number, + load: Promise, +): Promise => + loadWithTimeout( + timeout, + `Timed out loading Lynx lazy bundle "${request}" after ${timeout}ms.`, + (resolve, reject) => { + load.then(resolve, reject); + }, + ); + +const loadQueryComponent = ( + request: string, + lynx: NonNullable>, + globalObject: LynxGlobal, +): Promise => { + if (lynx.loadLazyBundle) { + return Promise.resolve(lynx.loadLazyBundle(request)); + } + + if (getLynxRealm(lynx) === 'main-thread') { + const queryComponent = globalObject.__QueryComponent; + if (!queryComponent) { + return Promise.reject( + new Error( + 'Lynx main-thread split chunk loading requires __QueryComponent.', + ), + ); + } + const resolver = createQueryResolver(); + try { + const query = queryComponent(request, (result) => { + if (result.code === 0 && result.data && 'evalResult' in result.data) { + resolver.resolve(result.data.evalResult); + } else { + resolver.reject(queryError(request, result)); + } + }); + if (query && 'evalResult' in query) { + resolver.resolve(query.evalResult); + } + } catch (error) { + resolver.reject( + error instanceof Error ? error : new Error(String(error)), + ); + } + return resolver.promise; + } + + const queryComponent = + lynx.QueryComponent ?? lynx.getNativeLynx?.().QueryComponent; + const getExports = + globalObject.lynxCoreInject?.tt?.getDynamicComponentExports; + if (!queryComponent || !getExports) { + return Promise.reject( + new Error( + 'Lynx background split chunk loading requires QueryComponent and getDynamicComponentExports.', + ), + ); + } + + const resolver = createQueryResolver(); + queryComponent(request, (result) => { + const schema = result.detail?.schema; + const exports = + result.code === 0 && schema ? getExports(schema) : undefined; + if (exports !== undefined) { + resolver.resolve(exports); + return; + } + resolver.reject(queryError(request, result)); + }); + return resolver.promise; +}; + +export const patchLynxChunkLoading = ( + webpackRequire: LynxWebpackRequire, + originName: string, + globalObject: LynxGlobal = globalThis as LynxGlobal, + timeout = 30_000, +): boolean => { + const lynx = getLynxRuntime(globalObject); + if (!lynx?.loadScript) { + return false; + } + const { loadScript } = lynx; + + const registry = globalObject[LYNX_BUNDLE_REGISTRY]; + const bundleName = + registry?.get(originName) ?? + registry?.get(getRegistryKey(originName, getLynxRealm(lynx))); + if (!bundleName) { + return false; + } + + const installedChunks: Record = {}; + + const loadChunk: ChunkHandler = (chunkId, promises) => { + const key = String(chunkId); + const installed = installedChunks[key]; + if (installed === 0) { + return; + } + if (installed) { + promises.push(installed[2]); + return; + } + + let resolveChunk!: () => void; + let rejectChunk!: (error: unknown) => void; + const promise = new Promise((resolve, reject) => { + resolveChunk = resolve; + rejectChunk = reject; + }); + installedChunks[key] = [resolveChunk, rejectChunk, promise]; + promises.push(promise); + + const lazyBundlePath = + webpackRequire.lynx_chunking === 'single' + ? undefined + : webpackRequire.lynx_aci?.[key]; + if (lazyBundlePath) { + const baseName = originName.replace(/__main_thread$/, ''); + const remoteOrigin = + registry?.get(getRemoteOriginKey(baseName)) ?? bundleName; + const request = joinRemoteUrl( + remoteOrigin, + webpackRequire.p, + lazyBundlePath, + ); + withLazyBundleTimeout( + request, + timeout, + loadQueryComponent(request, lynx, globalObject), + ) + .then( + (value) => { + if (!isChunk(value)) { + throw new Error( + `Lynx lazy bundle "${request}" did not export a valid webpack chunk.`, + ); + } + if (!value.ids.some((id) => String(id) === key)) { + throw new Error( + `Lynx lazy bundle "${request}" did not include requested chunk "${key}".`, + ); + } + installChunkAfterConsumes( + value, + webpackRequire, + installedChunks, + globalObject, + ); + }, + (error) => { + delete installedChunks[key]; + rejectChunk(error); + }, + ) + .catch((error) => { + delete installedChunks[key]; + rejectChunk(error); + }); + return; + } + + try { + const sectionPath = getChunkSectionPath(webpackRequire.u(chunkId)); + const value = loadScript(sectionPath, { bundleName }); + if (!isChunk(value)) { + throw new Error( + `Lynx section "${sectionPath}" did not export a valid webpack chunk.`, + ); + } + if (!value.ids.some((id) => String(id) === key)) { + throw new Error( + `Lynx section "${sectionPath}" did not include requested chunk "${key}".`, + ); + } + installChunk(value, webpackRequire, installedChunks, globalObject); + } catch (error) { + delete installedChunks[key]; + rejectChunk(error); + } + }; + + const configuredHandlers = ['j', 'require'].filter( + (key) => webpackRequire.f[key] !== undefined, + ); + for (const key of configuredHandlers.length > 0 + ? configuredHandlers + : ['j']) { + webpackRequire.f[key] = loadChunk; + } + + return true; +}; diff --git a/packages/lynx/src/runtimeCore.ts b/packages/lynx/src/runtimeCore.ts new file mode 100644 index 00000000000..4f556c46e96 --- /dev/null +++ b/packages/lynx/src/runtimeCore.ts @@ -0,0 +1,126 @@ +import type { RemoteEntryExports } from '@module-federation/runtime-core/types'; + +export const LYNX_BUNDLE_REGISTRY = Symbol.for( + 'module-federation:lynx:bundle-registry', +); + +export const LYNX_REMOTE_ORIGIN_SUFFIX = ':remote-origin'; + +export interface LynxRuntimePluginOptions { + timeout?: number; +} + +export interface LynxRuntime { + QueryComponent?( + source: string, + callback: (result: { + code: number; + data?: { evalResult?: unknown; url?: string }; + detail?: { schema?: string }; + }) => void, + ): void; + fetchBundle?(bundleUrl: string): PromiseLike; + loadScript?(sectionPath: string, options: { bundleName: string }): unknown; + loadLazyBundle?(bundleUrl: string): PromiseLike; + getNativeApp?(): unknown; + getNativeLynx?(): Pick; + requireModuleAsync?( + moduleUrl: string, + callback: (error: unknown, value: unknown) => void, + ): void; +} + +export interface LynxGlobal { + __QueryComponent?( + source: string, + callback: (result: { + code: number; + data?: { evalResult?: unknown; url?: string }; + }) => void, + ): { evalResult: unknown } | null | undefined; + lynx?: LynxRuntime; + lynxCoreInject?: { + tt?: { + getDynamicComponentExports?(schema: string): unknown; + }; + }; + [LYNX_BUNDLE_REGISTRY]?: Map; + [name: string]: unknown; +} + +declare const lynx: LynxRuntime | undefined; +declare const __MAIN_THREAD__: boolean | undefined; + +export const getLynxRuntime = ( + globalObject: LynxGlobal, +): LynxRuntime | undefined => + globalObject.lynx ?? (typeof lynx === 'undefined' ? undefined : lynx); + +export type LynxRealm = 'background' | 'main-thread'; + +export const MAIN_THREAD_EXPOSE_SUFFIX = '__main_thread'; + +export const isRecord = (value: unknown): value is Record => + typeof value === 'object' && value !== null; + +const isRemoteEntryExports = (value: unknown): value is RemoteEntryExports => + isRecord(value) && + typeof value.get === 'function' && + typeof value.init === 'function'; + +const getDefaultExport = (value: unknown): unknown => + isRecord(value) ? value.default : undefined; + +export const findRemoteEntryExports = ( + value: unknown, + entryGlobalName: string, + globalObject: LynxGlobal, + alternateGlobalName?: string, +): RemoteEntryExports | undefined => { + const globalValue = globalObject[entryGlobalName]; + const alternateGlobalValue = alternateGlobalName + ? globalObject[alternateGlobalName] + : undefined; + + return [ + value, + getDefaultExport(value), + globalValue, + getDefaultExport(globalValue), + alternateGlobalValue, + getDefaultExport(alternateGlobalValue), + ].find(isRemoteEntryExports); +}; + +export const getLynxRealm = (lynx: LynxRuntime): LynxRealm => + typeof __MAIN_THREAD__ !== 'undefined' + ? __MAIN_THREAD__ + ? 'main-thread' + : 'background' + : typeof lynx.requireModuleAsync === 'function' || + typeof lynx.getNativeApp === 'function' + ? 'background' + : 'main-thread'; + +export const getRegistryKey = ( + entryGlobalName: string, + realm: LynxRealm, +): string => + realm === 'background' ? entryGlobalName : `${entryGlobalName}__main_thread`; + +export const getRemoteOriginKey = (entryGlobalName: string): string => + `${entryGlobalName}${LYNX_REMOTE_ORIGIN_SUFFIX}`; + +export const getBundleRegistry = ( + globalObject: LynxGlobal, +): Map => { + let registry = globalObject[LYNX_BUNDLE_REGISTRY]; + if (!registry) { + registry = new Map(); + globalObject[LYNX_BUNDLE_REGISTRY] = registry; + } + return registry; +}; + +export const toErrorMessage = (error: unknown): string => + error instanceof Error ? error.message : String(error); diff --git a/packages/lynx/src/runtimeEntryLoader.ts b/packages/lynx/src/runtimeEntryLoader.ts new file mode 100644 index 00000000000..b7ec28408ed --- /dev/null +++ b/packages/lynx/src/runtimeEntryLoader.ts @@ -0,0 +1,264 @@ +import type { + RemoteEntryExports, + RemoteEntryInitOptions, +} from '@module-federation/runtime-core/types'; + +import { + findRemoteEntryExports, + getBundleRegistry, + getRemoteOriginKey, + getRegistryKey, + isRecord, + MAIN_THREAD_EXPOSE_SUFFIX, + toErrorMessage, + type LynxGlobal, + type LynxRealm, + type LynxRuntime, +} from './runtimeCore'; +import { loadWithTimeout } from './runtimeTimeout'; + +const DEFAULT_TIMEOUT = 30_000; + +interface LynxBundleResponse { + code: number; + url: string; + errorMsg?: string; +} + +export const isBundleEntry = (entry: string): boolean => + entry.split(/[?#]/, 1)[0].endsWith('.lynx.bundle'); + +export const getTimeout = (timeout: number | undefined): number => + timeout !== undefined && Number.isFinite(timeout) && timeout >= 0 + ? timeout + : DEFAULT_TIMEOUT; + +const getBundleResponse = (value: unknown): LynxBundleResponse | undefined => { + if ( + !isRecord(value) || + typeof value.code !== 'number' || + typeof value.url !== 'string' + ) { + return undefined; + } + + return { + code: value.code, + url: value.url, + errorMsg: + typeof value.errorMsg === 'string' + ? value.errorMsg + : typeof value.error_msg === 'string' + ? value.error_msg + : undefined, + }; +}; + +export const loadJavaScriptEntry = ( + lynx: LynxRuntime, + entry: string, + entryGlobalName: string, + globalObject: LynxGlobal, + timeout: number, +): Promise => { + const requireModuleAsync = lynx.requireModuleAsync; + if (!requireModuleAsync) { + throw new Error( + 'Lynx federation requires globalThis.lynx.requireModuleAsync to load JavaScript remote entries in the background runtime.', + ); + } + + return loadWithTimeout( + timeout, + `Timed out loading Lynx remote entry "${entryGlobalName}" from "${entry}" after ${timeout}ms.`, + (resolve, reject, isSettled) => { + requireModuleAsync(entry, (error, value) => { + if (isSettled()) { + return; + } + if (error) { + reject( + new Error( + `Failed to load Lynx remote entry "${entryGlobalName}" from "${entry}": ${toErrorMessage(error)}`, + ), + ); + return; + } + + const exports = findRemoteEntryExports( + value, + entryGlobalName, + globalObject, + ); + if (!exports) { + reject( + new Error( + `Lynx remote entry "${entryGlobalName}" loaded from "${entry}" but did not export a Module Federation container.`, + ), + ); + return; + } + + resolve(exports); + }); + }, + ); +}; + +const adaptContainerToRealm = ( + container: RemoteEntryExports, + realm: LynxRealm, +): RemoteEntryExports => ({ + get: (request) => + container.get( + realm === 'background' + ? request + : `${request}${MAIN_THREAD_EXPOSE_SUFFIX}`, + ), + init: (shareScope, initScope, options) => { + if (!isRecord(options) || !Array.isArray(options.shareScopeKeys)) { + return container.init(shareScope, initScope, options); + } + + const shareScopeKeys = options.shareScopeKeys.filter( + (value): value is string => typeof value === 'string', + ); + const realmSuffix = realm === 'background' ? ':background' : ':main-thread'; + const suffixedKeys = shareScopeKeys.filter((key) => + key.endsWith(realmSuffix), + ); + const realmShareScopeKeys = + suffixedKeys.length > 0 + ? suffixedKeys + : shareScopeKeys.filter( + (_key, index) => index % 2 === (realm === 'background' ? 0 : 1), + ); + const primaryShareScopeKey = realmShareScopeKeys[0]; + if (!primaryShareScopeKey) { + return container.init(shareScope, initScope, options); + } + + const narrowedOptions = Object.create( + Object.getPrototypeOf(options), + Object.getOwnPropertyDescriptors(options), + ) as RemoteEntryInitOptions; + Object.defineProperty(narrowedOptions, 'shareScopeKeys', { + configurable: true, + enumerable: true, + value: + realmShareScopeKeys.length === 1 + ? primaryShareScopeKey + : realmShareScopeKeys, + writable: true, + }); + const shareScopeMap = options.shareScopeMap; + const realmShareScope = isRecord(shareScopeMap) + ? shareScopeMap[primaryShareScopeKey] + : undefined; + return container.init( + isRecord(realmShareScope) ? realmShareScope : shareScope, + initScope, + narrowedOptions, + ); + }, +}); + +export const loadBundleEntry = ( + lynx: LynxRuntime, + entry: string, + entryGlobalName: string, + realm: LynxRealm, + globalObject: LynxGlobal, + timeout: number, +): Promise => { + const { fetchBundle, loadScript } = lynx; + if (!fetchBundle || !loadScript) { + throw new Error( + 'Lynx federation requires globalThis.lynx.fetchBundle and globalThis.lynx.loadScript to load .lynx.bundle remote entries.', + ); + } + + return loadWithTimeout( + timeout, + `Timed out loading Lynx remote bundle "${entryGlobalName}" from "${entry}" after ${timeout}ms.`, + (resolve, reject, isSettled) => { + Promise.resolve(fetchBundle(entry)).then( + (value) => { + if (isSettled()) { + return; + } + + const response = getBundleResponse(value); + if (!response || response.code !== 0 || !response.url) { + const details = response + ? `code ${response.code}${response.errorMsg ? `: ${response.errorMsg}` : ''}` + : 'an invalid response'; + reject( + new Error( + `Failed to fetch Lynx remote bundle "${entryGlobalName}" from "${entry}": ${details}.`, + ), + ); + return; + } + + const registry = getBundleRegistry(globalObject); + registry.set(entryGlobalName, response.url); + registry.set(getRemoteOriginKey(entryGlobalName), entry); + registry.set( + getRegistryKey(entryGlobalName, 'main-thread'), + response.url, + ); + + const sectionPath = + realm === 'background' + ? entryGlobalName + : `${entryGlobalName}__main-thread`; + + try { + const value = loadScript(sectionPath, { bundleName: response.url }); + Promise.resolve(value).then( + (loadedValue) => { + const exports = findRemoteEntryExports( + loadedValue, + entryGlobalName, + globalObject, + getRegistryKey(entryGlobalName, realm), + ); + if (!exports) { + reject( + new Error( + `Lynx remote bundle "${entryGlobalName}" loaded from "${entry}" but did not export a Module Federation container.`, + ), + ); + return; + } + resolve(adaptContainerToRealm(exports, realm)); + }, + (error) => + reject( + new Error( + `Failed to evaluate Lynx remote bundle "${entryGlobalName}" from "${entry}": ${toErrorMessage(error)}`, + ), + ), + ); + } catch (error) { + reject( + new Error( + `Failed to evaluate Lynx remote bundle "${entryGlobalName}" from "${entry}": ${toErrorMessage(error)}`, + ), + ); + } + }, + (error) => { + if (!isSettled()) { + reject( + new Error( + `Failed to fetch Lynx remote bundle "${entryGlobalName}" from "${entry}": ${toErrorMessage(error)}`, + ), + ); + } + }, + ); + }, + ); +}; diff --git a/packages/lynx/src/runtimePlugin.test.ts b/packages/lynx/src/runtimePlugin.test.ts new file mode 100644 index 00000000000..4b50b7c550a --- /dev/null +++ b/packages/lynx/src/runtimePlugin.test.ts @@ -0,0 +1,860 @@ +import { afterEach, describe, expect, it, rs } from '@rstest/core'; +import type { ModuleFederationRuntimePlugin } from '@module-federation/runtime-core/types'; + +import lynxRuntimePlugin, { + LYNX_BUNDLE_REGISTRY, + patchLynxChunkLoading, + type LynxWebpackRequire, +} from './runtimePlugin'; + +type NativeCallback = (error: unknown, value: unknown) => void; + +interface TestLynx { + fetchBundle?(entry: string): PromiseLike; + getNativeApp?(): unknown; + loadScript?(sectionPath: string, options: { bundleName: string }): unknown; + requireModuleAsync?(entry: string, callback: NativeCallback): void; +} + +type LoadEntryArgs = Parameters< + NonNullable +>[0]; + +const remoteInfo = { + name: 'remote', + entry: 'https://example.test/remoteEntry.js', + entryGlobalName: 'remote', + type: 'lynx-js', + shareScope: 'default', +}; + +const bundleRemoteInfo = { + ...remoteInfo, + entry: 'https://example.test/remote.lynx.bundle', +}; + +const createContainer = () => ({ + get: rs.fn(), + init: rs.fn(), +}); + +const setLynx = (lynx: TestLynx): void => { + (globalThis as unknown as Record).lynx = lynx; +}; + +const loadEntry = (plugin: ModuleFederationRuntimePlugin, info = remoteInfo) => + plugin.loadEntry!({ remoteInfo: info } as LoadEntryArgs); + +afterEach(() => { + const globalRecord = globalThis as unknown as Record; + delete globalRecord.lynx; + delete globalRecord.remote; + delete globalRecord[LYNX_BUNDLE_REGISTRY]; + rs.restoreAllMocks(); +}); + +describe('lynxRuntimePlugin entry loading', () => { + it('loads plain JavaScript entries in the background realm', async () => { + const container = createContainer(); + const requireModuleAsync = rs.fn( + (_entry: string, callback: NativeCallback) => callback(null, container), + ); + setLynx({ requireModuleAsync }); + + await expect(loadEntry(lynxRuntimePlugin())).resolves.toBe(container); + expect(requireModuleAsync).toHaveBeenCalledWith( + remoteInfo.entry, + expect.any(Function), + ); + }); + + it('accepts default and global container exports', async () => { + const defaultContainer = createContainer(); + setLynx({ + requireModuleAsync: (_entry, callback) => + callback(null, { default: defaultContainer }), + }); + await expect(loadEntry(lynxRuntimePlugin())).resolves.toBe( + defaultContainer, + ); + + const globalContainer = createContainer(); + (globalThis as unknown as Record).remote = { + default: globalContainer, + }; + setLynx({ + requireModuleAsync: (_entry, callback) => callback(null, undefined), + }); + await expect(loadEntry(lynxRuntimePlugin())).resolves.toBe(globalContainer); + }); + + it('deduplicates concurrent entry loads', async () => { + const container = createContainer(); + let finishLoad: NativeCallback | undefined; + const requireModuleAsync = rs.fn( + (_entry: string, callback: NativeCallback) => { + finishLoad = callback; + }, + ); + setLynx({ requireModuleAsync }); + + const plugin = lynxRuntimePlugin(); + const first = loadEntry(plugin); + const second = loadEntry(plugin); + finishLoad!(null, container); + + await expect(first).resolves.toBe(container); + await expect(second).resolves.toBe(container); + expect(requireModuleAsync).toHaveBeenCalledTimes(1); + }); + + it('loads bundle entries from the background section', async () => { + const container = createContainer(); + const fetchBundle = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://remote', + })); + const loadScript = rs.fn(async () => container); + setLynx({ + fetchBundle, + getNativeApp: () => ({}), + loadScript, + }); + + const loadedContainer = await loadEntry( + lynxRuntimePlugin(), + bundleRemoteInfo, + ); + expect(loadedContainer).not.toBe(container); + loadedContainer.get('./Card'); + expect(container.get).toHaveBeenCalledWith('./Card'); + expect(fetchBundle).toHaveBeenCalledWith(bundleRemoteInfo.entry); + expect(loadScript).toHaveBeenCalledWith('remote', { + bundleName: 'lynx-cache://remote', + }); + expect( + ( + globalThis as unknown as Record< + PropertyKey, + Map | undefined + > + )[LYNX_BUNDLE_REGISTRY]?.get('remote'), + ).toBe('lynx-cache://remote'); + }); + + it('loads bundle entries from the main-thread section', async () => { + const container = createContainer(); + const loadScript = rs.fn(() => ({ default: container })); + setLynx({ + fetchBundle: async () => ({ code: 0, url: 'lynx-cache://remote' }), + loadScript, + }); + + const loadedContainer = await loadEntry( + lynxRuntimePlugin(), + bundleRemoteInfo, + ); + expect(loadedContainer).not.toBe(container); + loadedContainer.get('./Card'); + expect(container.get).toHaveBeenCalledWith('./Card__main_thread'); + expect(loadScript).toHaveBeenCalledWith('remote__main-thread', { + bundleName: 'lynx-cache://remote', + }); + expect( + ( + globalThis as unknown as Record< + PropertyKey, + Map | undefined + > + )[LYNX_BUNDLE_REGISTRY]?.get('remote__main_thread'), + ).toBe('lynx-cache://remote'); + expect( + ( + globalThis as unknown as Record< + PropertyKey, + Map | undefined + > + )[LYNX_BUNDLE_REGISTRY]?.get('remote'), + ).toBe('lynx-cache://remote'); + }); + + it('reports unsuccessful bundle fetches', async () => { + const loadScript = rs.fn(); + setLynx({ + fetchBundle: async () => ({ + code: -1, + url: 'https://example.test/remote.lynx.bundle', + errorMsg: 'not found', + }), + loadScript, + }); + + await expect( + loadEntry(lynxRuntimePlugin(), bundleRemoteInfo), + ).rejects.toThrow('code -1: not found'); + expect(loadScript).not.toHaveBeenCalled(); + }); + + it('reports native snake-case bundle errors', async () => { + const loadScript = rs.fn(); + setLynx({ + fetchBundle: async () => ({ + code: -2, + url: 'https://example.test/remote.lynx.bundle', + error_msg: 'decode failed', + }), + loadScript, + }); + + await expect( + loadEntry(lynxRuntimePlugin(), bundleRemoteInfo), + ).rejects.toThrow('code -2: decode failed'); + expect(loadScript).not.toHaveBeenCalled(); + }); + + it('evicts timed-out entry loads so they can be retried', async () => { + const container = createContainer(); + const requireModuleAsync = rs + .fn<(entry: string, callback: NativeCallback) => void>() + .mockImplementationOnce(() => undefined) + .mockImplementationOnce((_entry, callback) => callback(null, container)); + setLynx({ requireModuleAsync }); + + const plugin = lynxRuntimePlugin({ timeout: 5 }); + await expect(loadEntry(plugin)).rejects.toThrow('Timed out'); + await expect(loadEntry(plugin)).resolves.toBe(container); + expect(requireModuleAsync).toHaveBeenCalledTimes(2); + }); + + it('isolates cached entries by global name and realm', async () => { + const backgroundContainer = createContainer(); + const mainContainer = createContainer(); + const backgroundFetch = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://background', + })); + setLynx({ + requireModuleAsync: () => undefined, + fetchBundle: backgroundFetch, + loadScript: () => backgroundContainer, + }); + + const plugin = lynxRuntimePlugin(); + const loadedBackground = await loadEntry(plugin, bundleRemoteInfo); + loadedBackground.get('./Card'); + expect(backgroundContainer.get).toHaveBeenCalledWith('./Card'); + + const mainFetch = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://main', + })); + setLynx({ + fetchBundle: mainFetch, + loadScript: () => mainContainer, + }); + const loadedMain = await loadEntry(plugin, bundleRemoteInfo); + loadedMain.get('./Card'); + expect(mainContainer.get).toHaveBeenCalledWith('./Card__main_thread'); + + const alternateInfo = { + ...bundleRemoteInfo, + entryGlobalName: 'alternate', + }; + await expect(loadEntry(plugin, alternateInfo)).resolves.toMatchObject({ + get: expect.any(Function), + init: expect.any(Function), + }); + expect(backgroundFetch).toHaveBeenCalledTimes(1); + expect(mainFetch).toHaveBeenCalledTimes(2); + }); + + it('preserves every share scope for the active realm', async () => { + const container = createContainer(); + setLynx({ + fetchBundle: async () => ({ code: 0, url: 'lynx-cache://remote' }), + loadScript: () => container, + }); + const loaded = await loadEntry(lynxRuntimePlugin(), bundleRemoteInfo); + const scopes = { + 'default:react:background': { defaultBackground: true }, + 'default:react:main-thread': { defaultMain: true }, + 'custom:react:background': { customBackground: true }, + 'custom:react:main-thread': { customMain: true }, + }; + + loaded.init(scopes['default:react:main-thread'] as never, [], { + version: 'test', + shareScopeKeys: Object.keys(scopes), + shareScopeMap: scopes as never, + }); + + expect(container.init).toHaveBeenCalledWith( + scopes['default:react:main-thread'], + [], + expect.objectContaining({ + shareScopeKeys: [ + 'default:react:main-thread', + 'custom:react:main-thread', + ], + }), + ); + }); + + it('leaves non-Lynx remote types to the runtime-core loaders', () => { + expect( + loadEntry(lynxRuntimePlugin(), { + ...remoteInfo, + type: 'module', + }), + ).toBeUndefined(); + }); + + it('loads type lynx even when the bundle URL has an opaque suffix', async () => { + const container = createContainer(); + const fetchBundle = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://remote', + })); + setLynx({ fetchBundle, loadScript: () => container }); + + await expect( + loadEntry(lynxRuntimePlugin(), { + ...bundleRemoteInfo, + entry: 'https://example.test/artifact?id=remote', + type: 'lynx', + }), + ).resolves.toMatchObject({ + get: expect.any(Function), + init: expect.any(Function), + }); + expect(fetchBundle).toHaveBeenCalledWith( + 'https://example.test/artifact?id=remote', + ); + }); +}); + +describe('patchLynxChunkLoading', () => { + const createWebpackRequire = ( + filename = 'chunks/feature.js?cache=1#fragment', + ): LynxWebpackRequire => ({ + f: {}, + m: {}, + u: rs.fn(() => filename), + }); + + it('installs and deduplicates section chunks', async () => { + const webpackRequire = createWebpackRequire(); + const factory = rs.fn(); + const runtime = rs.fn(); + const nestedPromises: Promise[] = []; + const loadScript = rs.fn(() => { + webpackRequire.f.j!('feature', nestedPromises); + return { + ids: ['feature'], + modules: { factory }, + runtime, + }; + }); + const globalObject = { + lynx: { requireModuleAsync: () => undefined, loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), + }; + + expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( + true, + ); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + + expect(loadScript).toHaveBeenCalledTimes(1); + expect(loadScript).toHaveBeenCalledWith('chunks/feature', { + bundleName: 'lynx-cache://remote', + }); + expect(nestedPromises[0]).toBe(promises[0]); + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + expect(runtime).toHaveBeenCalledWith(webpackRequire); + }); + + it('loads split remote chunks as independently fetched Lynx lazy bundles', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + feature: 'async/catalog__background_Card.123.bundle', + }; + webpackRequire.p = '/remote-assets/'; + const factory = rs.fn(); + const loadScript = rs.fn(); + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'https://cdn.example/cache/catalog.lynx.bundle'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remote-assets/async/catalog__background_Card.123.bundle', + ); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('preserves protocol-relative lazy bundle and public-path URLs', async () => { + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'https://origin.example/catalog.lynx.bundle'], + ['remote:remote-origin', 'https://origin.example/catalog.lynx.bundle'], + ]), + }; + const publicPathRequire = createWebpackRequire(); + publicPathRequire.lynx_aci = { feature: 'async/Card.bundle' }; + publicPathRequire.p = '//cdn.example/assets/'; + patchLynxChunkLoading(publicPathRequire, 'remote', globalObject); + const publicPathPromises: Promise[] = []; + publicPathRequire.f.j!('feature', publicPathPromises); + await Promise.all(publicPathPromises); + + const assetRequire = createWebpackRequire(); + assetRequire.lynx_aci = { + feature: '//assets.example/chunks/Card.bundle', + }; + patchLynxChunkLoading(assetRequire, 'remote', globalObject); + const assetPromises: Promise[] = []; + assetRequire.f.j!('feature', assetPromises); + await Promise.all(assetPromises); + + expect(loadLazyBundle).toHaveBeenNthCalledWith( + 1, + '//cdn.example/assets/async/Card.bundle', + ); + expect(loadLazyBundle).toHaveBeenNthCalledWith( + 2, + '//assets.example/chunks/Card.bundle', + ); + }); + + it('restores the lazy-bundle identity while deferred module factories execute', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const observedEntries: unknown[] = []; + const factory = rs.fn(() => { + observedEntries.push(globalObject.globDynamicComponentEntry); + }); + const globalObject: any = { + globDynamicComponentEntry: '__Card__', + lynx: { + loadLazyBundle: async () => ({ + __lynx_dynamic_component_entry__: 'https://cdn.example/Card.bundle', + ids: ['feature'], + modules: { factory }, + }), + loadScript: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + ['remote:remote-origin', 'https://cdn.example/catalog.lynx.bundle'], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + ( + webpackRequire.m.factory as ( + module: unknown, + exports: unknown, + require: unknown, + ) => unknown + )({}, {}, webpackRequire); + + expect(observedEntries).toEqual(['https://cdn.example/Card.bundle']); + expect(globalObject.globDynamicComponentEntry).toBe('__Card__'); + }); + + it('loads atomic chunks from sections in the already-fetched container', async () => { + const webpackRequire = createWebpackRequire( + 'async/catalog__background_Card.js', + ); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.lynx_chunking = 'single'; + const factory = rs.fn(); + const loadLazyBundle = rs.fn(); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript, requireModuleAsync: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://catalog']]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).not.toHaveBeenCalled(); + expect(loadScript).toHaveBeenCalledWith('async/catalog__background_Card', { + bundleName: 'lynx-cache://catalog', + }); + }); + + it('uses the official lazy-bundle API for split chunks', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + const fetchBundle = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://Card', + })); + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: { factory }, + })); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { + fetchBundle, + loadLazyBundle, + loadScript, + requireModuleAsync: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + ); + expect(fetchBundle).not.toHaveBeenCalled(); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('times out split chunks and permits retry', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const loadLazyBundle = rs.fn(() => new Promise(() => undefined)); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); + for (let attempt = 0; attempt < 2; attempt += 1) { + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).rejects.toThrow( + 'Timed out loading Lynx lazy bundle', + ); + } + expect(loadLazyBundle).toHaveBeenCalledTimes(2); + }); + + it('rejects split chunks when no DynamicComponent API exists', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const fetchBundle = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://Card', + })); + const loadScript = rs.fn(); + const globalObject = { + lynx: { fetchBundle, loadScript, requireModuleAsync: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).rejects.toThrow( + 'requires QueryComponent and getDynamicComponentExports', + ); + + expect(fetchBundle).not.toHaveBeenCalled(); + expect(loadScript).not.toHaveBeenCalled(); + }); + + it('loads split chunks through QueryComponent when loadLazyBundle is unavailable', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + feature: 'async/Card.123.bundle', + }; + const factory = rs.fn(); + const chunk = { + ids: ['feature'], + modules: { factory }, + }; + const QueryComponent = rs.fn((_source, callback) => + callback({ code: 0, detail: { schema: 'Card' } }), + ); + const loadScript = rs.fn(); + const globalObject = { + lynx: { + loadScript, + QueryComponent, + requireModuleAsync: rs.fn(), + }, + lynxCoreInject: { + tt: { getDynamicComponentExports: () => chunk }, + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(QueryComponent).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.123.bundle', + expect.any(Function), + ); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('loads main-thread split chunks through the asynchronous Web QueryComponent API', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + const chunk = { ids: ['feature'], modules: { factory } }; + const queryComponent = rs.fn((_source, callback) => { + queueMicrotask(() => + callback({ + code: 0, + data: { evalResult: chunk, url: 'https://cdn.example/Card.bundle' }, + }), + ); + return null; + }); + const globalObject = { + __QueryComponent: queryComponent, + lynx: { loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(queryComponent).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + expect.any(Function), + ); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it.each([ + [ + undefined, + 'async/Card.bundle', + 'https://cdn.example/remotes/async/Card.bundle', + ], + [ + 'auto', + 'async/Card.bundle', + 'https://cdn.example/remotes/async/Card.bundle', + ], + ['/', 'async/Card.bundle', 'https://cdn.example/remotes/async/Card.bundle'], + [ + 'assets/', + 'async/Card.bundle', + 'https://cdn.example/remotes/assets/async/Card.bundle', + ], + ['/v2/', 'async/Card.bundle', 'https://cdn.example/v2/async/Card.bundle'], + [ + 'https://assets.example/v3/', + 'async/Card.bundle', + 'https://assets.example/v3/async/Card.bundle', + ], + [ + '/ignored/', + 'https://assets.example/Card.bundle', + 'https://assets.example/Card.bundle', + ], + ])( + 'resolves split public path %s against the manifest entry', + async (publicPath, assetPath, expected) => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: assetPath }; + webpackRequire.p = publicPath; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle?version=1', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith(expected); + }, + ); + + it('preserves the original chunk handler without a registered bundle', () => { + const originalHandler = rs.fn(); + const webpackRequire = createWebpackRequire(); + webpackRequire.f.j = originalHandler; + const globalObject = { + lynx: { loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map(), + }; + + expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( + false, + ); + const promises: Promise[] = []; + webpackRequire.f.j('feature', promises); + expect(originalHandler).toHaveBeenCalledWith('feature', promises); + }); + + it('evicts failed section loads so they can be retried', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const loadScript = rs + .fn<(sectionPath: string, options: { bundleName: string }) => unknown>() + .mockImplementationOnce(() => { + throw new Error('decode failed'); + }) + .mockImplementationOnce(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote__main_thread', 'lynx-cache://remote'], + ]), + }; + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + + const failedPromises: Promise[] = []; + webpackRequire.f.j!('feature', failedPromises); + await expect(Promise.all(failedPromises)).rejects.toThrow('decode failed'); + + const retriedPromises: Promise[] = []; + webpackRequire.f.j!('feature', retriedPromises); + await expect(Promise.all(retriedPromises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledTimes(2); + }); + + it('uses the main-thread container name without appending the realm twice', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote__main_thread', 'lynx-cache://remote'], + ]), + }; + + expect( + patchLynxChunkLoading( + webpackRequire, + 'remote__main_thread', + globalObject, + ), + ).toBe(true); + + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledWith('feature', { + bundleName: 'lynx-cache://remote', + }); + }); + + it('replaces the Lynx require chunk handler emitted by Rspeedy', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const originalHandler = rs.fn(); + webpackRequire.f.require = originalHandler; + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { requireModuleAsync: rs.fn(), loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.require!('feature', promises); + + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledWith('feature', { + bundleName: 'lynx-cache://remote', + }); + expect(originalHandler).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/lynx/src/runtimePlugin.ts b/packages/lynx/src/runtimePlugin.ts new file mode 100644 index 00000000000..9eba247dc11 --- /dev/null +++ b/packages/lynx/src/runtimePlugin.ts @@ -0,0 +1,105 @@ +import type { + ModuleFederationRuntimePlugin, + RemoteEntryExports, +} from '@module-federation/runtime-core/types'; + +import { + isBundleEntry, + getTimeout, + loadBundleEntry, + loadJavaScriptEntry, +} from './runtimeEntryLoader'; +import { + getLynxRealm, + getLynxRuntime, + LYNX_BUNDLE_REGISTRY, + type LynxGlobal, + type LynxRuntimePluginOptions, +} from './runtimeCore'; +import { + patchLynxChunkLoading, + type LynxWebpackRequire, +} from './runtimeChunkLoading'; + +export { LYNX_BUNDLE_REGISTRY, patchLynxChunkLoading }; +export type { LynxRuntimePluginOptions, LynxWebpackRequire }; + +declare const __webpack_require__: LynxWebpackRequire; + +export default function lynxRuntimePlugin( + options: LynxRuntimePluginOptions = {}, +): ModuleFederationRuntimePlugin { + const entryCache = new Map>(); + const timeout = getTimeout(options.timeout); + + return { + name: 'lynx-federation-runtime-plugin', + beforeInit(args) { + if (typeof __webpack_require__ !== 'undefined') { + patchLynxChunkLoading( + __webpack_require__, + args.options.name, + globalThis as LynxGlobal, + timeout, + ); + } + return args; + }, + loadEntry({ remoteInfo }) { + const { entry, entryGlobalName, type } = remoteInfo; + const isBundle = type === 'lynx' || isBundleEntry(entry); + const isJavaScript = type === 'lynx-js'; + if (!isBundle && !isJavaScript) { + return undefined; + } + + const globalObject = globalThis as LynxGlobal; + const lynx = getLynxRuntime(globalObject); + + if (!lynx) { + throw new Error('Lynx federation requires the Lynx runtime API.'); + } + + const realm = getLynxRealm(lynx); + const cacheKey = JSON.stringify([entry, entryGlobalName, realm]); + const cachedEntry = entryCache.get(cacheKey); + if (cachedEntry) { + return cachedEntry; + } + + const loadPromise = isBundle + ? loadBundleEntry( + lynx, + entry, + entryGlobalName, + realm, + globalObject, + timeout, + ) + : loadJavaScriptEntry( + lynx, + entry, + entryGlobalName, + globalObject, + timeout, + ); + let cachedPromise: Promise; + cachedPromise = loadPromise.catch((error) => { + if (entryCache.get(cacheKey) === cachedPromise) { + entryCache.delete(cacheKey); + } + throw error; + }); + + entryCache.set(cacheKey, cachedPromise); + return cachedPromise; + }, + async generatePreloadAssets() { + return { + cssAssets: [], + jsAssetsWithoutEntry: [], + entryAssets: [], + }; + }, + }; +} diff --git a/packages/lynx/src/runtimeTimeout.ts b/packages/lynx/src/runtimeTimeout.ts new file mode 100644 index 00000000000..7f7a7ecd50a --- /dev/null +++ b/packages/lynx/src/runtimeTimeout.ts @@ -0,0 +1,35 @@ +export const loadWithTimeout = ( + timeout: number, + message: string, + start: ( + resolve: (value: T) => void, + reject: (error: unknown) => void, + isSettled: () => boolean, + ) => void, +): Promise => + new Promise((resolve, reject) => { + let settled = false; + const timer = setTimeout(() => { + settled = true; + reject(new Error(message)); + }, timeout); + + const finish = (callback: () => void): void => { + if (settled) { + return; + } + settled = true; + clearTimeout(timer); + callback(); + }; + + try { + start( + (value) => finish(() => resolve(value)), + (error) => finish(() => reject(error)), + () => settled, + ); + } catch (error) { + finish(() => reject(error)); + } + }); diff --git a/packages/lynx/src/webEncode.test.ts b/packages/lynx/src/webEncode.test.ts new file mode 100644 index 00000000000..5b02a2c07eb --- /dev/null +++ b/packages/lynx/src/webEncode.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, it } from '@rstest/core'; + +import { getLynxWebEncodeMode } from './webEncode'; + +describe('getLynxWebEncodeMode', () => { + it('encodes background, main-thread, CSS, and data sections', async () => { + const { buffer } = await getLynxWebEncodeMode()({ + compilerOptions: { targetSdkVersion: '3.5' }, + sourceContent: { appType: 'DynamicComponent' }, + customSections: { + background: { content: 'module.exports = "background"' }, + main: { + encoding: 'JsBytecode', + content: 'module.exports = "main"', + }, + styles: { + encoding: 'CSS', + content: { ruleList: [] }, + }, + metadata: { content: { version: 1 } }, + }, + }); + + expect(Buffer.isBuffer(buffer)).toBe(true); + expect(buffer.byteLength).toBeGreaterThan(100); + }); + + it('rejects invalid JavaScript sections', async () => { + await expect( + getLynxWebEncodeMode()({ + customSections: { + main: { encoding: 'JsBytecode', content: { invalid: true } }, + }, + }), + ).rejects.toThrow('must be a string'); + }); +}); diff --git a/packages/lynx/src/webEncode.ts b/packages/lynx/src/webEncode.ts new file mode 100644 index 00000000000..75012f9fbe1 --- /dev/null +++ b/packages/lynx/src/webEncode.ts @@ -0,0 +1,71 @@ +import type { TasmJSONInfo } from '@lynx-js/web-core/encode'; + +interface ExternalBundleSection { + content: unknown; + encoding?: string; +} + +interface ExternalBundleEncodeOptions { + compilerOptions?: Record; + customSections?: Record; + sourceContent?: { appType?: string }; +} + +const isRecord = (value: unknown): value is Record => + typeof value === 'object' && value !== null; + +const getEncodeOptions = (value: unknown): ExternalBundleEncodeOptions => { + if (!isRecord(value)) { + throw new TypeError('Expected Lynx external-bundle encode options.'); + } + return value as ExternalBundleEncodeOptions; +}; + +const getJavaScript = (name: string, content: unknown): string => { + if (typeof content !== 'string') { + throw new TypeError(`Lynx JavaScript section "${name}" must be a string.`); + } + return content; +}; + +export const getLynxWebEncodeMode = () => async (value: unknown) => { + const options = getEncodeOptions(value); + const styleInfo: TasmJSONInfo['styleInfo'] = {}; + const manifest: TasmJSONInfo['manifest'] = {}; + const lepusCode: TasmJSONInfo['lepusCode'] = {}; + const customSections: TasmJSONInfo['customSections'] = {}; + let cssId = 0; + + for (const [name, section] of Object.entries(options.customSections ?? {})) { + if (section.encoding === 'CSS') { + const ruleList = isRecord(section.content) + ? section.content.ruleList + : undefined; + styleInfo[String(cssId++)] = Array.isArray(ruleList) ? ruleList : []; + } else if (section.encoding === 'JsBytecode') { + lepusCode[name] = getJavaScript(name, section.content); + } else if (typeof section.content === 'string') { + manifest[`/${name}`] = section.content; + } else { + customSections[name] = { + content: section.content as Record, + }; + } + } + + const { encode } = await import('@lynx-js/web-core/encode'); + return { + buffer: Buffer.from( + encode({ + appType: options.sourceContent?.appType ?? 'DynamicComponent', + cardType: 'react', + customSections, + elementTemplates: {}, + lepusCode, + manifest, + pageConfig: options.compilerOptions ?? {}, + styleInfo, + }), + ), + }; +}; diff --git a/packages/lynx/tsconfig.json b/packages/lynx/tsconfig.json new file mode 100644 index 00000000000..89adca0a58e --- /dev/null +++ b/packages/lynx/tsconfig.json @@ -0,0 +1,31 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./", + "outDir": "dist", + "sourceMap": false, + "module": "es2022", + "target": "es2022", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowJs": false, + "strict": true, + "types": ["node"], + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "removeComments": true, + "declaration": true, + "paths": { + "@/*": ["./*"], + "@src/*": ["./src/*"], + "*": ["./*"] + } + }, + "include": ["src", "../../global.d.ts"], + "exclude": ["node_modules/**/*", "../node_modules"], + "references": [ + { "path": "./tsconfig.lib.json" }, + { "path": "./tsconfig.spec.json" } + ] +} diff --git a/packages/lynx/tsconfig.lib.json b/packages/lynx/tsconfig.lib.json new file mode 100644 index 00000000000..d2be5624718 --- /dev/null +++ b/packages/lynx/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["rstest.config.mts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/packages/lynx/tsconfig.spec.json b/packages/lynx/tsconfig.spec.json new file mode 100644 index 00000000000..70848594750 --- /dev/null +++ b/packages/lynx/tsconfig.spec.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["@rstest/core/globals", "@rstest/core/importMeta", "node"] + }, + "include": [ + "rstest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/packages/lynx/tsdown.config.mts b/packages/lynx/tsdown.config.mts new file mode 100644 index 00000000000..f58e71553fc --- /dev/null +++ b/packages/lynx/tsdown.config.mts @@ -0,0 +1,37 @@ +import { defineConfig } from 'tsdown'; + +import { + createDualFormatConfig, + packageDirFromMetaUrl, +} from '../../tools/scripts/tsdown/config-helpers.mjs'; + +const packageDir = packageDirFromMetaUrl(import.meta.url); + +export default defineConfig([ + { + ...createDualFormatConfig({ + name: 'lynx-build', + packageDir, + entry: { + index: 'src/index.ts', + plugin: 'src/plugin.ts', + runtimePlugin: 'src/runtimePlugin.ts', + }, + external: [ + '@lynx-js/*', + '@module-federation/*', + '@rspack/core', + '@rsbuild/core', + ], + unbundle: true, + preferNonModuleCjs: false, + }), + inlineOnly: false, + dts: { + resolver: 'tsc', + }, + outputOptions: { + exports: 'named', + }, + }, +]); diff --git a/packages/runtime-core/src/global.ts b/packages/runtime-core/src/global.ts index 154b9829e31..51c2622c31b 100644 --- a/packages/runtime-core/src/global.ts +++ b/packages/runtime-core/src/global.ts @@ -62,7 +62,7 @@ function definePropertyGlobalVal( } function includeOwnProperty(target: typeof CurrentGlobal, key: string) { - return Object.hasOwnProperty.call(target, key); + return Object.prototype.hasOwnProperty.call(target, key); } // This section is to prevent encapsulation by certain microfrontend frameworks. Due to reuse policies, sandbox escapes. @@ -95,12 +95,16 @@ function setGlobalDefaultVal(target: typeof CurrentGlobal) { definePropertyGlobalVal(target, '__VMOK__', target.__FEDERATION__); } - target.__FEDERATION__.__GLOBAL_PLUGIN__ ??= []; - target.__FEDERATION__.__INSTANCES__ ??= []; - target.__FEDERATION__.moduleInfo ??= {}; - target.__FEDERATION__.__SHARE__ ??= {}; - target.__FEDERATION__.__MANIFEST_LOADING__ ??= {}; - target.__FEDERATION__.__PRELOADED_MAP__ ??= new Map(); + target.__FEDERATION__.__GLOBAL_PLUGIN__ = + target.__FEDERATION__.__GLOBAL_PLUGIN__ || []; + target.__FEDERATION__.__INSTANCES__ = + target.__FEDERATION__.__INSTANCES__ || []; + target.__FEDERATION__.moduleInfo = target.__FEDERATION__.moduleInfo || {}; + target.__FEDERATION__.__SHARE__ = target.__FEDERATION__.__SHARE__ || {}; + target.__FEDERATION__.__MANIFEST_LOADING__ = + target.__FEDERATION__.__MANIFEST_LOADING__ || {}; + target.__FEDERATION__.__PRELOADED_MAP__ = + target.__FEDERATION__.__PRELOADED_MAP__ || new Map(); } setGlobalDefaultVal(CurrentGlobal); diff --git a/packages/webpack-bundler-runtime/src/init.ts b/packages/webpack-bundler-runtime/src/init.ts index d8a7e9e2d7c..4103c5b557e 100644 --- a/packages/webpack-bundler-runtime/src/init.ts +++ b/packages/webpack-bundler-runtime/src/init.ts @@ -43,7 +43,9 @@ export function init({ webpackRequire }: { webpackRequire: WebpackRequire }) { sharedArgs.forEach((sharedArg) => { shared.push([sharedName, sharedArg]); if ('get' in sharedArg) { - sharedArg.treeShaking ||= {}; + if (!sharedArg.treeShaking) { + sharedArg.treeShaking = {}; + } sharedArg.treeShaking.get = sharedArg.get; sharedArg.get = bundlerRuntime!.getSharedFallbackGetter({ shareKey: sharedName, @@ -132,7 +134,9 @@ export function init({ webpackRequire }: { webpackRequire: WebpackRequire }) { }; }; - initOptions.plugins ||= []; + if (!initOptions.plugins) { + initOptions.plugins = []; + } initOptions.plugins.push(treeShakingSharePlugin()); } return runtime!.init(initOptions); diff --git a/packages/webpack-bundler-runtime/src/updateOptions.ts b/packages/webpack-bundler-runtime/src/updateOptions.ts index 9ce36bcc80b..9132b46df59 100644 --- a/packages/webpack-bundler-runtime/src/updateOptions.ts +++ b/packages/webpack-bundler-runtime/src/updateOptions.ts @@ -177,7 +177,9 @@ export function updateRemoteOptions(options: RemotesOptions) { } if (!idToRemoteMap[moduleId] && remoteInfos[data.remoteName]) { const items = remoteInfos[data.remoteName]; - idToRemoteMap[moduleId] ||= []; + if (!idToRemoteMap[moduleId]) { + idToRemoteMap[moduleId] = []; + } items.forEach((item) => { if (!idToRemoteMap[moduleId].includes(item)) { idToRemoteMap[moduleId].push(item); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ea99f92f2e..d4eda1724d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -127,7 +127,7 @@ importers: version: 6.0.1(rollup@4.59.0) '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)(typescript@6.0.3) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)(typescript@6.0.3) '@rspack/cli': specifier: 1.3.9 version: 1.3.9(@rspack/core@1.3.9(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack-cli@5.1.4)(webpack@5.104.1) @@ -139,7 +139,7 @@ importers: version: 1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack-cli@5.1.4)(webpack@5.104.1) '@rstest/core': specifier: ^0.10.6 - version: 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)(jsdom@20.0.3) + version: 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)(jsdom@20.0.3) '@storybook/addon-docs': specifier: 9.0.17 version: 9.0.17(@types/react@19.2.14)(storybook@8.6.17(prettier@3.8.1)) @@ -355,7 +355,7 @@ importers: version: 0.2.1(@rsbuild/core@1.7.3) rstest-fetch-mock: specifier: 0.1.0 - version: 0.1.0(@rstest/core@0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)(jsdom@20.0.3)) + version: 0.1.0(@rstest/core@0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)(jsdom@20.0.3)) serve: specifier: ^14.2.4 version: 14.2.5 @@ -382,7 +382,7 @@ importers: version: 10.9.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.19.5)(typescript@6.0.3) tsdown: specifier: 0.20.3 - version: 0.20.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(publint@0.3.18)(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)) + version: 0.20.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(publint@0.3.18)(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)) tslib: specifier: 2.8.1 version: 2.8.1 @@ -632,6 +632,58 @@ importers: specifier: 7.0.2 version: 7.0.2 + apps/lynx-module-federation-demo: + dependencies: + '@lynx-js/react': + specifier: 0.122.1 + version: 0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28) + '@module-federation/runtime': + specifier: workspace:* + version: link:../../packages/runtime + devDependencies: + '@lynx-js/lynx-bundle-rslib-config': + specifier: 0.5.1 + version: 0.5.1(tslib@2.8.1) + '@lynx-js/qrcode-rsbuild-plugin': + specifier: 0.5.0 + version: 0.5.0(@lynx-js/rspeedy@0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))) + '@lynx-js/react-rsbuild-plugin': + specifier: 0.17.2 + version: 0.17.2(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(tslib@2.8.1) + '@lynx-js/rspeedy': + specifier: 0.15.0 + version: 0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@lynx-js/types': + specifier: 4.0.0 + version: 4.0.0 + '@lynx-js/web-core': + specifier: 0.22.1 + version: 0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) + '@lynx-js/web-elements': + specifier: 0.12.5 + version: 0.12.5(tslib@2.8.1) + '@module-federation/lynx': + specifier: workspace:* + version: link:../../packages/lynx + '@module-federation/runtime-tools': + specifier: workspace:* + version: link:../../packages/runtime-tools + '@playwright/test': + specifier: 1.57.0 + version: 1.57.0 + '@rsbuild/core': + specifier: 2.1.4 + version: 2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) + '@rspack-canary/core': + specifier: 2.1.5-canary-54a0d8f3-20260715194831 + version: 2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23) + '@rspack/core': + specifier: npm:@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831 + version: '@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)' + '@types/react': + specifier: 18.3.28 + version: 18.3.28 + apps/manifest-demo/3009-webpack-provider: dependencies: antd: @@ -1091,7 +1143,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../packages/modernjs-v3 @@ -1110,7 +1162,7 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) @@ -1152,7 +1204,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../packages/modernjs-v3 @@ -1171,7 +1223,7 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) @@ -1222,7 +1274,7 @@ importers: version: link:../../../packages/storybook-addon '@rsbuild/plugin-react': specifier: ^1.4.5 - version: 1.4.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(webpack-hot-middleware@2.26.1) + version: 1.4.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(webpack-hot-middleware@2.26.1) '@rslib/core': specifier: ^0.9.0 version: 0.9.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(typescript@5.9.3) @@ -1249,7 +1301,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../packages/modernjs-v3 @@ -1268,7 +1320,7 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) @@ -1323,7 +1375,7 @@ importers: version: link:../../../packages/rsbuild-plugin '@rsbuild/plugin-react': specifier: ^1.4.5 - version: 1.4.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(webpack-hot-middleware@2.26.1) + version: 1.4.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(webpack-hot-middleware@2.26.1) '@rslib/core': specifier: ^0.9.0 version: 0.9.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(typescript@5.9.3) @@ -1341,7 +1393,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../packages/modernjs-v3 @@ -1360,7 +1412,7 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) @@ -1402,7 +1454,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../packages/modernjs-v3 @@ -1421,7 +1473,7 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) @@ -1463,7 +1515,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../packages/modernjs-v3 @@ -1482,7 +1534,7 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) @@ -1524,7 +1576,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../packages/modernjs-v3 @@ -1543,7 +1595,7 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) @@ -1585,7 +1637,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../packages/modernjs-v3 @@ -1604,7 +1656,7 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) @@ -1880,7 +1932,7 @@ importers: devDependencies: '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) apps/react-ts-host: dependencies: @@ -2054,10 +2106,10 @@ importers: version: link:../../../packages/rsbuild-plugin '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@types/react': specifier: ^18.2.79 version: 18.3.28 @@ -2103,10 +2155,10 @@ importers: version: link:../../../packages/rsbuild-plugin '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@types/react': specifier: ^18.2.79 version: 18.3.28 @@ -2140,10 +2192,10 @@ importers: version: link:../../../packages/rsbuild-plugin '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-vue': specifier: ^2.0.1 - version: 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2)) + version: 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2)) tailwindcss: specifier: ^3.4.3 version: 3.4.13(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@26.1.0)(typescript@7.0.2)) @@ -2180,10 +2232,10 @@ importers: version: 1.24.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@0.7.5(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@0.7.5(@swc/helpers@0.5.23)) '@rsbuild/shared': specifier: ^0.7.10 version: 0.7.10(@swc/helpers@0.5.23) @@ -2226,10 +2278,10 @@ importers: devDependencies: '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@types/react': specifier: ^18.2.79 version: 18.3.28 @@ -2257,10 +2309,10 @@ importers: devDependencies: '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-vue': specifier: ^2.0.1 - version: 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2)) + version: 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2)) '@vue/tsconfig': specifier: ^0.5.1 version: 0.5.1 @@ -2300,10 +2352,10 @@ importers: devDependencies: '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@types/react': specifier: ^18.2.79 version: 18.3.28 @@ -2340,10 +2392,10 @@ importers: devDependencies: '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@types/react': specifier: ^19.0.0 version: 19.2.14 @@ -2383,10 +2435,10 @@ importers: devDependencies: '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@types/react': specifier: ^18.2.79 version: 18.3.28 @@ -2410,10 +2462,10 @@ importers: version: link:../../packages/storybook-addon '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) '@types/react': specifier: ^18.3.11 version: 18.3.28 @@ -2431,10 +2483,10 @@ importers: version: 8.6.17(prettier@3.8.1) storybook-addon-rslib: specifier: ^1.0.1 - version: 1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2))(storybook-builder-rsbuild@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2))(typescript@7.0.2) + version: 1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2))(storybook-builder-rsbuild@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2))(typescript@7.0.2) storybook-react-rsbuild: specifier: ^1.0.1 - version: 1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.25.5)(webpack-cli@5.1.4)) + version: 1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.25.5)(webpack-cli@5.1.4)) apps/runtime-demo/3005-runtime-host: dependencies: @@ -2564,10 +2616,10 @@ importers: devDependencies: '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) apps/shared-tree-shaking/no-server/host: dependencies: @@ -2576,7 +2628,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/enhanced': specifier: workspace:* version: link:../../../../packages/enhanced @@ -2595,13 +2647,13 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/plugin-server': specifier: 2.68.0 - version: 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/server-runtime': specifier: 3.0.1 - version: 3.0.1(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.0.1(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/tsconfig': specifier: 3.0.1 version: 3.0.1 @@ -2646,7 +2698,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/enhanced': specifier: workspace:* version: link:../../../../packages/enhanced @@ -2665,13 +2717,13 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) '@modern-js/plugin-server': specifier: 2.68.0 - version: 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/tsconfig': specifier: 3.0.1 version: 3.0.1 @@ -2713,7 +2765,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../../packages/modernjs-v3 @@ -2732,16 +2784,16 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) '@modern-js/plugin-server': specifier: 2.68.0 - version: 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/server-runtime': specifier: 3.0.1 - version: 3.0.1(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.0.1(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/tsconfig': specifier: 3.0.1 version: 3.0.1 @@ -2789,7 +2841,7 @@ importers: version: 7.28.2 '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@module-federation/modern-js-v3': specifier: workspace:* version: link:../../../../packages/modernjs-v3 @@ -2808,13 +2860,13 @@ importers: version: 2.59.0(typescript@7.0.2) '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@7.0.2) '@modern-js/plugin-server': specifier: 2.68.0 - version: 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/tsconfig': specifier: 3.0.1 version: 3.0.1 @@ -2859,10 +2911,10 @@ importers: version: link:../../packages/runtime '@rsbuild/plugin-sass': specifier: ^2.0.1 - version: 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + version: 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) '@rspress/core': specifier: 2.0.14 - version: 2.0.14(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2) + version: 2.0.14(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2) framer-motion: specifier: ^10.0.0 version: 10.18.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -2893,7 +2945,7 @@ importers: version: 19.2.3(@types/react@19.2.14) zephyr-rspress-plugin: specifier: ^1.1.2 - version: 1.1.2(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@rspress/core@2.0.14(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)) + version: 1.1.2(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@rspress/core@2.0.14(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)) packages/assemble-release-plan: dependencies: @@ -2937,7 +2989,7 @@ importers: version: link:../../runtime-core '@rsbuild/plugin-react': specifier: 2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@testing-library/jest-dom': specifier: 6.6.3 version: 6.6.3 @@ -3032,10 +3084,10 @@ importers: devDependencies: '@rsbuild/plugin-babel': specifier: 2.0.1 - version: 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + version: 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@rsbuild/plugin-vue-jsx': specifier: 2.0.1 - version: 2.0.1(@babel/core@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + version: 2.0.1(@babel/core@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) '@types/react': specifier: ^18.3.11 version: 18.3.28 @@ -3212,7 +3264,7 @@ importers: devDependencies: '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) '@types/glob': specifier: 7.2.0 version: 7.2.0 @@ -3255,7 +3307,7 @@ importers: version: link:../runtime '@rstest/core': specifier: ^0.10.6 - version: 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(jsdom@20.0.3) + version: 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(jsdom@20.0.3) '@types/ws': specifier: 8.5.12 version: 8.5.12 @@ -3391,7 +3443,47 @@ importers: devDependencies: '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) + typescript: + specifier: 7.0.2 + version: 7.0.2 + + packages/lynx: + dependencies: + '@module-federation/runtime-core': + specifier: workspace:* + version: link:../runtime-core + '@module-federation/runtime-tools': + specifier: workspace:* + version: link:../runtime-tools + '@module-federation/sdk': + specifier: workspace:* + version: link:../sdk + devDependencies: + '@lynx-js/cache-events-webpack-plugin': + specifier: 0.1.0 + version: 0.1.0 + '@lynx-js/chunk-loading-webpack-plugin': + specifier: 0.4.0 + version: 0.4.0 + '@lynx-js/css-serializer': + specifier: 0.1.6 + version: 0.1.6 + '@lynx-js/tasm': + specifier: 0.0.39 + version: 0.0.39 + '@lynx-js/web-core': + specifier: 0.22.1 + version: 0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) + '@rsbuild/core': + specifier: 2.1.4 + version: 2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) + '@rspack/core': + specifier: npm:@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831 + version: '@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)' + '@rstest/core': + specifier: ^0.10.6 + version: 0.10.6(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)(jsdom@20.0.3) typescript: specifier: 7.0.2 version: 7.0.2 @@ -3445,7 +3537,7 @@ importers: devDependencies: '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@6.0.3) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@6.0.3) '@types/node': specifier: ^20.19.5 version: 20.19.5 @@ -3517,7 +3609,7 @@ importers: version: 0.7.28 '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@6.0.3) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@6.0.3) '@types/node': specifier: ^20.0.0 version: 20.19.5 @@ -3544,7 +3636,7 @@ importers: version: 0.13.0 '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@6.0.3) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@6.0.3) '@types/node': specifier: ^20.0.0 version: 20.19.5 @@ -3626,10 +3718,10 @@ importers: version: 1.4.5(@rsbuild/core@1.3.21)(webpack-hot-middleware@2.26.1) '@rslib/core': specifier: 0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) '@rstest/core': specifier: ^0.10.6 - version: 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(jsdom@20.0.3) + version: 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(jsdom@20.0.3) '@types/react': specifier: ^18.3.11 version: 18.3.28 @@ -3681,34 +3773,34 @@ importers: devDependencies: '@modern-js/app-tools': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.17))(@types/node@26.1.0)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.17))(@types/node@26.1.0)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@modern-js/module-tools': specifier: 2.70.5 version: 2.70.5(@types/node@26.1.0)(typescript@7.0.2) '@modern-js/runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@modern-js/server-runtime': specifier: 3.5.0 - version: 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@module-federation/manifest': specifier: workspace:* version: link:../manifest '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: 1.4.5 - version: 1.4.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(webpack-hot-middleware@2.26.1) + version: 1.4.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(webpack-hot-middleware@2.26.1) '@rslib/core': specifier: 0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) '@rspack/core': specifier: 2.0.6 - version: 2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17) + version: 2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17) '@rstest/core': specifier: ^0.10.6 - version: 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(jsdom@20.0.3) + version: 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(jsdom@20.0.3) '@types/react': specifier: ^18.3.11 version: 18.3.28 @@ -3741,14 +3833,14 @@ importers: version: 9.2.1 tsdown: specifier: 0.20.3 - version: 0.20.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(publint@0.3.18)(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)) + version: 0.20.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(publint@0.3.18)(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)) unplugin: specifier: ^1.10.1 version: 1.10.1 devDependencies: '@rstest/core': specifier: ^0.10.6 - version: 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(jsdom@20.0.3) + version: 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(jsdom@20.0.3) directory-tree: specifier: 3.5.2 version: 3.5.2 @@ -3779,7 +3871,7 @@ importers: devDependencies: '@rstest/core': specifier: ^0.10.6 - version: 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(jsdom@20.0.3) + version: 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(jsdom@20.0.3) directory-tree: specifier: 3.5.2 version: 3.5.2 @@ -3843,7 +3935,7 @@ importers: version: 18.3.7(@types/react@18.3.28) tsdown: specifier: 0.20.3 - version: 0.20.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(publint@0.3.18)(typescript@7.0.2)(vue-tsc@2.2.12(typescript@6.0.3)) + version: 0.20.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(publint@0.3.18)(typescript@7.0.2)(vue-tsc@2.2.12(typescript@6.0.3)) typescript: specifier: 7.0.2 version: 7.0.2 @@ -3918,7 +4010,7 @@ importers: version: 1.4.5(@rsbuild/core@1.7.3)(webpack-hot-middleware@2.26.1) '@rslib/core': specifier: ^0.12.4 - version: 0.12.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(typescript@7.0.2) + version: 0.12.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(typescript@7.0.2) '@types/node': specifier: ^20.19.5 version: 20.19.5 @@ -3959,13 +4051,13 @@ importers: devDependencies: '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) '@rstest/core': specifier: ^0.10.6 - version: 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(jsdom@20.0.3) + version: 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(jsdom@20.0.3) typescript: specifier: 7.0.2 version: 7.0.2 @@ -4020,7 +4112,7 @@ importers: version: link:../sdk '@rspress/shared': specifier: 2.0.14 - version: 2.0.14(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.0.14(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) cheerio: specifier: 1.0.0-rc.12 version: 1.0.0-rc.12 @@ -4033,10 +4125,10 @@ importers: devDependencies: '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) '@rspress/core': specifier: 2.0.14 - version: 2.0.14(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@18.3.28)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2) + version: 2.0.14(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@18.3.28)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2) '@types/html-to-text': specifier: ^9.0.4 version: 9.0.4 @@ -4121,7 +4213,7 @@ importers: version: 22.5.4(@babel/traverse@7.29.7)(@swc-node/register@1.10.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.41(@swc/helpers@0.5.23))(@swc/helpers@0.5.23)(esbuild@0.25.5)(nx@22.5.4(@swc-node/register@1.10.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(@swc/types@0.1.27)(typescript@6.0.3))(@swc/core@1.15.41(@swc/helpers@0.5.23)))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@7.0.2)(vue-tsc@2.2.12(typescript@7.0.2))(webpack-cli@5.1.4) '@rsbuild/core': specifier: 2.1.4 - version: 2.1.4(@module-federation/runtime-tools@0.21.6)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.2.2(node-fetch@2.7.0(encoding@0.1.13)))(core-js@3.49.0) '@storybook/core': specifier: ^8.4.6 version: 8.6.14(prettier@3.8.1)(storybook@8.6.17(prettier@3.8.1)) @@ -4145,7 +4237,7 @@ importers: devDependencies: '@rstest/core': specifier: ^0.10.6 - version: 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(jsdom@20.0.3) + version: 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(jsdom@20.0.3) '@types/node': specifier: ^20.19.5 version: 20.19.5 @@ -4332,13 +4424,13 @@ importers: version: 1.57.0 '@rsbuild/core': specifier: ^2.1.4 - version: 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + version: 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-react': specifier: ^2.1.0 - version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17)) + version: 2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17)) '@rslib/core': specifier: ^0.23.2 - version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@22.19.15))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@6.0.3) + version: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@22.19.15))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@6.0.3) '@rstest/core': specifier: ^0.6.5 version: 0.6.9(jsdom@20.0.3) @@ -4731,6 +4823,10 @@ packages: resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} hasBin: true + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -5014,7 +5110,6 @@ packages: '@babel/plugin-proposal-object-rest-spread@7.12.1': resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -6014,8 +6109,8 @@ packages: '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - '@emnapi/core@1.9.0': - resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} @@ -6023,12 +6118,12 @@ packages: '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + '@emnapi/runtime@1.9.0': resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} - '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -7297,7 +7392,6 @@ packages: '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -7305,7 +7399,6 @@ packages: '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} @@ -7832,6 +7925,150 @@ packages: '@loadable/component': ^5.0.1 react: ^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@lynx-js/cache-events-webpack-plugin@0.1.0': + resolution: {integrity: sha512-VVPbWkmRegTGFoR/0b9A6hoiyUVy0O54PrKhc87cpV104krJiIfdO3KRuvGO2B1iBZu9ewWIuBGiSG52hSIqwA==} + engines: {node: '>=18'} + + '@lynx-js/chunk-loading-webpack-plugin@0.4.0': + resolution: {integrity: sha512-ud56B1ZzX+ejthk8v7MjpTAOQpr7jC9ea//tgW3hrx36jGzZAmI9EIPoCqkLvUIoFqMXr2lsanh0WYMZ8LUBnw==} + engines: {node: '>=18'} + + '@lynx-js/css-extract-webpack-plugin@0.8.0': + resolution: {integrity: sha512-BXvd5OZfLEp6ekprCxp252ix9imiRAdDeRoZYV3g6TqnYUP9Rj6lj6SNuL/IQNElzzDaCY8o2E3tWjIaTdYULA==} + engines: {node: '>=18'} + peerDependencies: + '@lynx-js/template-webpack-plugin': ^0.11.0 || ^0.12.0 + + '@lynx-js/css-serializer@0.1.6': + resolution: {integrity: sha512-AgYrhsNljp+xBqO2UUGFTfHR+zPBiH9XE8eD13PDkcTDXWA9uKE/cZ6glZUE3Ze0lUDEtp0cSPCOVlHTMEyKIg==} + + '@lynx-js/debug-metadata-rsbuild-plugin@0.1.2': + resolution: {integrity: sha512-IjVcenwGQNAfR0a95jCFO11vsilaCyOFA4QlRuqgdFd998JAwhvrc1EU1ju2aBfW2cgYy4482ZlaFD1QrK08KA==} + engines: {node: '>=18'} + + '@lynx-js/debug-metadata@0.1.0': + resolution: {integrity: sha512-3N+Wgc/kIc4/aG5KpdPWKsC9MsNngygeyg9JS6IOayS8AQJ37xjVEzlz1U3aYzT9al0RJKL7w4poa0tGaXBv1g==} + engines: {node: '>=18'} + hasBin: true + + '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c': + resolution: {integrity: sha512-h2pRrt5oLK9LT1NkjyprtzJij/AdZGvv3CN6B5edL4chixqvITbxoCSdYy667Hl6+uKOBuxmCNZoDddgRfcLnw==} + + '@lynx-js/lynx-bundle-rslib-config@0.5.1': + resolution: {integrity: sha512-zVxyV0fvA11eHKo7uFrk+GEFze0QmgWn2na5TePUurUpPJqXF9FYKIRn2IVAWRTjkEbOsdcoNvtOztbkkl9duw==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@lynx-js/qrcode-rsbuild-plugin@0.5.0': + resolution: {integrity: sha512-+cc2gsv02Cqa7+5Ard7Kow20N/KZC5BKZmEI/TEVTBV21jMyN+g0h4cNp344GwIzkSRG2G1J0YmxML3F/ArKRw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@lynx-js/rspeedy': ^0.15.0 + + '@lynx-js/react-alias-rsbuild-plugin@0.17.2': + resolution: {integrity: sha512-qiGwnrcq34g0WnRLrXGjAXy3WTo5I5fPK9ICQPKsAgww3+Impy6xnC/rK7kCV7cnzVDob+dXDNntc8Q8p+XR/g==} + engines: {node: '>=18'} + + '@lynx-js/react-refresh-webpack-plugin@0.4.0': + resolution: {integrity: sha512-HWkqou1JzmnTWhVQdRYn7KPfT23Rys8/H5x3gAoSEZcbuHi0INpCabuZNdEddk6PRe6NiUFjkW19Xm0/+qDMEw==} + engines: {node: '>=18'} + peerDependencies: + '@lynx-js/react-webpack-plugin': ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0 || ^0.9.0 + + '@lynx-js/react-rsbuild-plugin@0.17.2': + resolution: {integrity: sha512-PbKHo62rwNvnPW4o3kw6ug1SoOqicUixGYQMSHbzoJykh5Q7Gk5Jb2+umJrtjcdQNuOApBrdVyKXPybkRfuB5g==} + engines: {node: '>=18'} + peerDependencies: + '@lynx-js/react': ^0.103.0 || ^0.104.0 || ^0.105.0 || ^0.106.0 || ^0.107.0 || ^0.108.0 || ^0.109.0 || ^0.110.0 || ^0.111.0 || ^0.112.0 || ^0.113.0 || ^0.114.0 || ^0.115.0 || ^0.116.0 || ^0.117.0 || ^0.118.0 || ^0.119.0 || ^0.120.0 || ^0.121.0 || ^0.122.0 + peerDependenciesMeta: + '@lynx-js/react': + optional: true + + '@lynx-js/react-webpack-plugin@0.9.5': + resolution: {integrity: sha512-O1L6xFudztsPM5K3y5dM8F5WmyLKZO/SeELZfc6pMVwX5PqC+/nsBJmrKE8+z8IrORpeTcpZoVDgn+FMiILZ0Q==} + engines: {node: '>=18'} + peerDependencies: + '@lynx-js/react': '*' + '@lynx-js/template-webpack-plugin': ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 + peerDependenciesMeta: + '@lynx-js/react': + optional: true + + '@lynx-js/react@0.122.1': + resolution: {integrity: sha512-uXeG2cfROJJdijimkU6FKfNQezEDb0an/9mv6IylD+zo/YtK8r22cMgppogmFNZZrEUM5UXUrAdMoivydGd43g==} + peerDependencies: + '@lynx-js/types': '*' + '@types/react': ^18 + peerDependenciesMeta: + '@lynx-js/types': + optional: true + + '@lynx-js/rspeedy@0.15.0': + resolution: {integrity: sha512-kapJuvpelodGjVGCMPxPZ6jf9DRWuWZZBKlPG3ML1FfDZmo38NXRWmIuS6FMzDze6YtKbiYmXHKZ1bhILtJhFw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + typescript: 5.1.6 - 5.9.x + peerDependenciesMeta: + typescript: + optional: true + + '@lynx-js/runtime-wrapper-webpack-plugin@0.2.1': + resolution: {integrity: sha512-Igx1LIx1Tlk8ioNLmOawJoPrEPGiUHeDAYqnzwlOViXXeKqLBTB23VVPyDrYQdMzZg53SLUZDBVhYqWzD4u++Q==} + engines: {node: '>=18'} + + '@lynx-js/tasm@0.0.39': + resolution: {integrity: sha512-FNIV6Cc2K0wCKOHVMfpr3M6kpIZqHHNI02GpVl+h0ClyyK44jxEO+lf58gLFD5E3o0hJ1cp3H2OBIxSUJGkPDw==} + hasBin: true + + '@lynx-js/template-webpack-plugin@0.12.2': + resolution: {integrity: sha512-rIcVbM4gOXEoih4NTz/LuO3/ItLnEb74NXsdA4GzJTo7vWuIpoakjPB65fU4TX99lp8MNf9tOwWyb2Wd4DhzRg==} + engines: {node: ^18.14 || >=19.4} + + '@lynx-js/types@4.0.0': + resolution: {integrity: sha512-FBtBV8wt+9/CAUbTdZwvbhGjJEnyzKLWVpq5gaTHTbhDztbhdP0avZ0nHD6I5HSgAhzYNB9oDrqMt/r6YqBkng==} + + '@lynx-js/use-sync-external-store@1.5.0': + resolution: {integrity: sha512-iXwLiGUBgfWLozCIh3ICe07x534p9CVlFS3/iGEiFOce58MLX6/PbAvWcE8qEhYaOKiQNe9hqUnS2RbyCqoqGg==} + peerDependencies: + '@lynx-js/react': '*' + + '@lynx-js/web-core@0.22.1': + resolution: {integrity: sha512-B5XLDjPTU+aO6fq6ylHt7mf3rYxcQAuKHSD86ifoWweO3WI2io6xUSPjnY+MThp8xCihu+NocpmGTi/puRDHxw==} + peerDependencies: + '@lynx-js/css-serializer': 0.1.6 + '@lynx-js/lynx-core': 0.1.4 + tslib: ^2.5.0 + peerDependenciesMeta: + '@lynx-js/css-serializer': + optional: true + '@lynx-js/lynx-core': + optional: true + tslib: + optional: true + + '@lynx-js/web-elements@0.12.5': + resolution: {integrity: sha512-plNOkiI/AvdSqTmsN8jDBtll3SOqfrnLUuqicn3DrMUT7tizUhX6569dLNae8dk9KQqnS1pukUK9d/P/Nw9edg==} + peerDependencies: + tslib: ^2.5.0 + + '@lynx-js/web-rsbuild-server-middleware@0.21.1': + resolution: {integrity: sha512-U9wiYo50HLQhQZfgA1PNQrxYLdsh7H7PqT6E9vI//G6fpO+dBh31XnzHIGt54ewVDS9cADZXFILOmHn+DboTiw==} + + '@lynx-js/web-worker-rpc@0.22.1': + resolution: {integrity: sha512-nvC0axgTFJbpc8QcXbMVEG4EQcF3GCfdoDTmSAIE0J6bOOfvx2hK1ztG6MpRERU5dzMSfaHn425QpbPrume9QQ==} + + '@lynx-js/webpack-dev-transport@0.3.0': + resolution: {integrity: sha512-vpa0X/eqb50DhNhXEEfCi6gEd/ti32bFJtkt9zkPv6dTTsd2HJkYnCiKSUWpHpqPbnRbVLf/UacAY6h1uTtZeA==} + engines: {node: '>=18'} + + '@lynx-js/webpack-runtime-globals@0.0.6': + resolution: {integrity: sha512-VzpJc/w7v38/SHaZ+f3WBVBrsgXOG13YX9mRRxRrCgJQa+wZ6waRz7OIjntuTYJk2p7rQ0wKRGzsMgMfRBs/3g==} + engines: {node: '>=18'} + + '@lynx-js/websocket@0.0.4': + resolution: {integrity: sha512-yXuMiTALLNvkDz8hG+0KdkBodnyJDvyfr8bdIq6zMP9X8JAoBC/czc1HIhUgYEJ3Zee5F/vGKjNxcoSx2t1E6w==} + engines: {node: '>=18'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -8555,8 +8792,8 @@ packages: '@module-federation/error-codes@2.2.2': resolution: {integrity: sha512-e+dxUrqrdRbhfvg8TyG0UQBQAjYZ8pI2b3HWfESLXqWi3xCiivZSnqsPN+zychrQ1hDZAdCheZ9zT91zhMrkxw==} - '@module-federation/error-codes@2.7.0': - resolution: {integrity: sha512-syToF3H77IbBhJ7auGMCIb5ZDmJ5tvaqSeEvncJrOCq7JBT96F4UDlQDyNh6kCVznvYqqHsPeEMrfI9b5/Omlg==} + '@module-federation/error-codes@2.8.0': + resolution: {integrity: sha512-Gaog9904EmxYOQV0hli3XQ7jXeFaADfh5bnBtTCtbZ37Qd/Sz9kQfd+gYQRyIj7RGmkv9DPiN/SsmrTMrTymKw==} '@module-federation/inject-external-runtime-core-plugin@0.21.6': resolution: {integrity: sha512-DJQne7NQ988AVi3QB8byn12FkNb+C2lBeU1NRf8/WbL0gmHsr6kW8hiEJCm8LYaURwtsQqtsEV7i+8+51qjSmQ==} @@ -8633,8 +8870,8 @@ packages: '@module-federation/runtime-core@2.2.2': resolution: {integrity: sha512-JL+W6Yol1+CPJ662H1SEQLwxfBU2kCKhUcYrMr/X6j0qFWB8x5PBSpQbwAIcJiKfflHgBaJZypmCKmq8qRv3Aw==} - '@module-federation/runtime-core@2.7.0': - resolution: {integrity: sha512-5ROZLVIeV9YnWO2RwCwSHcy6sh48yclErO/2GZ2Xe8lFubPrFirgU8pbwBjZw+All0ZzN44BGS4ECRMVFzVcpg==} + '@module-federation/runtime-core@2.8.0': + resolution: {integrity: sha512-Tf98+epGGiPSHqmQHuXa2uXZMMvjGf1IqJDR1/FpXfmobv5ECN0mGZCjUHGNSyxvoDyXKIkKwJu7IwEoh0ouQA==} '@module-federation/runtime-tools@0.1.6': resolution: {integrity: sha512-7ILVnzMIa0Dlc0Blck5tVZG1tnk1MmLnuZpLOMpbdW+zl+N6wdMjjHMjEZFCUAJh2E5XJ3BREwfX8Ets0nIkLg==} @@ -8663,8 +8900,8 @@ packages: '@module-federation/runtime-tools@2.2.2': resolution: {integrity: sha512-UnlKvy/zrbLTLItrI1tORiS6wdp5pYOCrR2LtDEbjJ2r+avzANSf2vJ7lAIT4SX5Pi9WwY5RhE4Y/BOwhAj4DA==} - '@module-federation/runtime-tools@2.7.0': - resolution: {integrity: sha512-AY61QeZ0jV0GywgR9j3Yd37KiXoY6gaSYABhjDF3q7XL9PNtb2Ezm1F/985wqaKJYX+qJvYv+PMH6hTvyHdPYQ==} + '@module-federation/runtime-tools@2.8.0': + resolution: {integrity: sha512-3yOqjdSHXxX4HA3GhlXg3hghGAXW2RJUsnwXCcik2/lTxOHizKI8f3RM+GGCKPxDVqtw43IShe3tA12jNL5A/A==} '@module-federation/runtime@0.1.6': resolution: {integrity: sha512-nj6a+yJ+QxmcE89qmrTl4lphBIoAds0PFPVGnqLRWflwAP88jrCcrrTqRhARegkFDL+wE9AE04+h6jzlbIfMKg==} @@ -8693,8 +8930,8 @@ packages: '@module-federation/runtime@2.2.2': resolution: {integrity: sha512-zV6kbAUU1tQZr4KrZXQhzQP3WTb7oMRlIFw4UBhbh2JhAKGYS5CNc/n7+RV+mDxIs//qVmVzdSpJtTOMBLeFCw==} - '@module-federation/runtime@2.7.0': - resolution: {integrity: sha512-UtLozKKNvhT0D1+F0MEWsAmddJ39ItKW15E22LVMAwXmYZRSnzIvJQ2Y6kQ4LwhWABsw/GRSpUDex5OfhpSQPw==} + '@module-federation/runtime@2.8.0': + resolution: {integrity: sha512-cGtUBQ1/TVy7KrXy6xPgy3FEmOGyIYkBA2T4iGH3ZH5PNPPTmqN9jF2AfneTSOj0RtBr7Pxq3CUt81E/UCvK1A==} '@module-federation/sdk@0.1.6': resolution: {integrity: sha512-qifXpyYLM7abUeEOIfv0oTkguZgRZuwh89YOAYIZJlkP6QbRG7DJMQvtM8X2yHXm9PTk0IYNnOJH0vNQCo6auQ==} @@ -8728,8 +8965,8 @@ packages: node-fetch: optional: true - '@module-federation/sdk@2.7.0': - resolution: {integrity: sha512-piiLEjaIdjbNq8E11Di6vsfryhcdN/+sBCH6NjG7gSU2VHHoHEayZQWWL7VVdS6rVjexF9McLhPTSrl0adUU+A==} + '@module-federation/sdk@2.8.0': + resolution: {integrity: sha512-yBP+9+0Z8nlvKEXAZS3AsQVy7bFbZf8eMivGk4q4ZdwG3TsLMlsPjb1dQb2i7gcAG6ux9y2LWLkj/0LVk74cnQ==} '@module-federation/third-party-dts-extractor@0.21.6': resolution: {integrity: sha512-Il6x4hLsvCgZNk1DFwuMBNeoxD1BsZ5AW2BI/nUgu0k5FiAvfcz1OFawRFEHtaM/kVrCsymMOW7pCao90DaX3A==} @@ -8764,8 +9001,8 @@ packages: '@module-federation/webpack-bundler-runtime@2.2.2': resolution: {integrity: sha512-g5UEn5APnNYvajwWQ0oc3Um+HO1z/jBcBkLSKAoSOCI6XxQk5eAV1PNDuDehAgJEtJw5yFD25kZPW3X7m39y7g==} - '@module-federation/webpack-bundler-runtime@2.7.0': - resolution: {integrity: sha512-3qLRIqcZVBNgJrZpiEzcTP8a6+mCdUV1QGk/XljawsQHyNieMVdLQtdLvkoF5Z5kRXNMovq+wv3vchKOMWyA8w==} + '@module-federation/webpack-bundler-runtime@2.8.0': + resolution: {integrity: sha512-82fDy9v+7qV5fiN8TKVhOdrxhmAZnUIX/IKivYX5ulCt8aoOzVFTiwm/P1GQUDD8z6dqR48xgJdZdf0548Mc9w==} '@monaco-editor/loader@1.7.0': resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==} @@ -11599,6 +11836,16 @@ packages: core-js: optional: true + '@rsbuild/core@2.0.11': + resolution: {integrity: sha512-Mpp/viUSkVdSWJkFipdZxM2nUztrBwSnMm6Q86bPzLHtHnXqQ3VFpSMlA4wWRyySNddP6s6efKiVpx0ZOCf7Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + core-js: '>= 3.0.0' + peerDependenciesMeta: + core-js: + optional: true + '@rsbuild/core@2.0.15': resolution: {integrity: sha512-O8vmMhZu1YImO6jOqt/K/vlJSvkq7UtSq5YM1DIlcEd9LW8Gf6/dkQ1B2KPI6F+hSMFBnTTTumdcIowSLCw97g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -11700,6 +11947,14 @@ packages: '@rsbuild/core': optional: true + '@rsbuild/plugin-css-minimizer@2.0.0': + resolution: {integrity: sha512-gSBkvOJP18JiaUuCyu4dPlEWY5aNTCJD3etsWqht9nO1l5cOBdLtq0vSu1SlLmhVS2b6fXlSs9+thMoHvSXwqw==} + peerDependencies: + '@rsbuild/core': ^1.0.0 || ^2.0.0-0 + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@rsbuild/plugin-css-minimizer@2.0.1': resolution: {integrity: sha512-QZUEBLTYXwtCUVziK3XHaPv+3wLLGvO6X27sIwt12eyuIMSA5WbeuLD9y1hwsXu27jZBofP6s/mdV5H5bA/FOg==} peerDependencies: @@ -11923,10 +12178,43 @@ packages: peerDependencies: '@rsbuild/core': ^1.3.21 + '@rsdoctor/client@1.5.18': + resolution: {integrity: sha512-W3Hpfe8Z1SV/umj7YRnfgTMfddEqYzxejBtwfcPshLjes79+Ggh0IvdH//X1FDs5pjHmydeVlK91dqF0deqqNg==} + + '@rsdoctor/core@1.5.18': + resolution: {integrity: sha512-MBryu0+E/DPuaUV6HsRV25NUTQTXnrYCKKdVrkJgJYnAYjz3wl6iaSA+KfdnUJRxx61BKfFggy0Qwuj/XoLhoQ==} + + '@rsdoctor/graph@1.5.18': + resolution: {integrity: sha512-aYfiMkN4s5QkxTKXlFdaVyeLdoOHkMjTMQYRg5UcyOvPb0YCWyWYm2PyO7gnCoKxrpd9LsCse/kAU9WPFLvbUw==} + + '@rsdoctor/rspack-plugin@1.5.18': + resolution: {integrity: sha512-oB0kKiFS0bs48Z/t7FhRVvv/cOTWM8eQegVKO8dfprf3gS+kTo+yT9Qfe4CRNYd9xiLO/Y10GMOzFa2G5/LX3A==} + peerDependencies: + '@rspack/core': '*' + peerDependenciesMeta: + '@rspack/core': + optional: true + + '@rsdoctor/sdk@1.5.18': + resolution: {integrity: sha512-Kg9YWSV3P0jzQutqd3dIXkHmDHvDUiymDJEq1lvXtnfzBRT0vdrgrz39fvuw9UoS9nU3zGoAEYCj/0NqBsnWOw==} + + '@rsdoctor/types@1.5.18': + resolution: {integrity: sha512-0US5SIlZiRl6BvsO8AySAjpprQ1cyUMpT+o0vsrWdrB+fjtApKmis74NV2utb34EMzFVfV3DFRUu8pNSib3osA==} + peerDependencies: + '@rspack/core': '*' + webpack: 5.x + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + '@rsdoctor/utils@1.5.18': + resolution: {integrity: sha512-+4FUMtxzoDGi4JEuocelxrrTA1s/DysHCxC76V4C9+OaCOYgcoEt8FuRJ6KN8+gU07XCB4OmYNfJu6W1IpW3hA==} + '@rslib/core@0.12.4': resolution: {integrity: sha512-GF+TIacQgtfvKK5r5g08IO795DnorpiHqcERsBua38iB0KsePpOGPAO+/E5YJncZ5regc72y1CByIELEeikgQA==} engines: {node: '>=18.12.0'} - deprecated: deprecated due to bug, please consider using 0.12.2 or >= 0.13.2 hasBin: true peerDependencies: '@microsoft/api-extractor': ^7 @@ -11963,6 +12251,80 @@ packages: typescript: optional: true + '@rspack-canary/binding-darwin-arm64@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-RJFGBPuNFfv5QnsMw9DDxZzyvFRRfB0D062CrV/jr8fZRtMokd2Fv5fDBP8Z7YS7N7FY95Nv9RTlGNPpAxUP6A==} + cpu: [arm64] + os: [darwin] + + '@rspack-canary/binding-darwin-x64@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-77hL1FfeEitPJBO4R//DZm6TonQ+GHKmQGUt7ZSXGRwkI9FtutH53mtooRFyTs+FO7GqWMgVqt2k9n5tmyr2wQ==} + cpu: [x64] + os: [darwin] + + '@rspack-canary/binding-linux-arm64-gnu@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-DJA3ZnYdJNK+X3WJnHXdBvA/g8HTeznUplLWtLWRy5DLu1msW/Iswkts/1BPYBzQ6kbpUhB13i7RGW5OQV3GHg==} + cpu: [arm64] + os: [linux] + + '@rspack-canary/binding-linux-arm64-musl@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-ZLsDbohCGoA5p77yEp0SJARvmB/FJdbv0/U3ZQRVYxJl5MUHQeEoNMxHaKVZdTUpELCJ030JyOspAnkD2sbOpw==} + cpu: [arm64] + os: [linux] + + '@rspack-canary/binding-linux-riscv64-gnu@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-R57VctExS703p9EwG5RF//f60ZQ+obAYGPbmOxRtG/zn3Rqs++L0iqmdJVxUZLl1IaH1+0aMZJ45gjpuFw4aUw==} + cpu: [riscv64] + os: [linux] + + '@rspack-canary/binding-linux-riscv64-musl@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-x3zuNssCW6wELSDx5q4vlMy6NAypPmu1y7Oma6OIQ1T/XuY78IvkmN9fQ+mFkb9kfjeMkehqkbidWnBfYNDMyw==} + cpu: [riscv64] + os: [linux] + + '@rspack-canary/binding-linux-x64-gnu@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-IqEEG8AweqxTWj6dTh1+M8AeHLTB8iGXXPHoyyiB5dbFX4X1md/oMlRfZmINEg9QAxlFDGzdQ074l7JLa2mMbg==} + cpu: [x64] + os: [linux] + + '@rspack-canary/binding-linux-x64-musl@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-ScZaPuu/VxAidHcxLjRr+D0CH7jR8phfv2c277VLnwXqpppvTL9tmA2UVarsBqLRbRuRuoxQb3YfVxvzsczKYg==} + cpu: [x64] + os: [linux] + + '@rspack-canary/binding-wasm32-wasi@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-iNkFwwuaWtJi3mkPgY89azxM3CHwcXq/IfQjZpbMEoGNvIRyFIMjzZWoP7xlD6yDjf6EW3ouvqWi7H+DT0/Iwg==} + cpu: [wasm32] + + '@rspack-canary/binding-win32-arm64-msvc@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-QDiWagMTDXDGzrl/JiUCDOjUKQJBs7oQ77bsUoaPn6sgNoDcudOhOjS+LxyLT6h1RfJTMUJKeXKhHtLgB2pyRA==} + cpu: [arm64] + os: [win32] + + '@rspack-canary/binding-win32-ia32-msvc@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-QAcyX3p5RT3Vo+cN533AHHoqTWMJjCZxsCZg6NH23QuRoW583Vof4YrWSyYH6cbwP5f4PaEeiNIe9RsyG5Qykg==} + cpu: [ia32] + os: [win32] + + '@rspack-canary/binding-win32-x64-msvc@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-b2pZdy/H+muI28zoP6OMpdtcnH18nMenXsC//KZD7uYBqebwxIsfFvONv43v0D01j0BthcPn7ap763NDrIDBfQ==} + cpu: [x64] + os: [win32] + + '@rspack-canary/binding@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-qPwDAwoaXWehRYGSidS6Fgcn0oZj6sUWqKPWEkc5Ff8dQtib35iMWtyy5wcTTAp+yn1dW7nFszDWVyJNIXYBeA==} + + '@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831': + resolution: {integrity: sha512-p1aHWGtzMvcl8UyaYQUEOJWZ+N/iAlk0U62q8aZV1AabseLIvEuHFL85/JbfAkLtKzkhc6ZeeVokLBFrDj738g==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0 + '@swc/helpers': ^0.5.23 + peerDependenciesMeta: + '@module-federation/runtime-tools': + optional: true + '@swc/helpers': + optional: true + '@rspack/binding-darwin-arm64@0.7.5': resolution: {integrity: sha512-mNBIm36s1BA7v4SL/r4f3IXIsjyH5CZX4eXMRPE52lBc3ClVuUB7d/8zk8dkyjJCMAj8PsZSnAJ3cfXnn7TN4g==} cpu: [arm64] @@ -12815,6 +13177,59 @@ packages: '@rspack/core': optional: true + '@rspack/resolver-binding-darwin-arm64@0.2.8': + resolution: {integrity: sha512-nTnK17kmxXEvR+WpOIZPSIzUFYeWCHoffgU9tvOLOwuTBH41kWnSQXXWu+AiMVwvJ6wdRO6Vo30hPhlXEG7Pyw==} + cpu: [arm64] + os: [darwin] + + '@rspack/resolver-binding-darwin-x64@0.2.8': + resolution: {integrity: sha512-Aqr4TK2rA6XVYUOmM5YCtYyCMZhOIR53P4cOGgGARg99A7OuMBMzUL4r1n0M0Fx35v6/sSx1OBe+odHmPxksEg==} + cpu: [x64] + os: [darwin] + + '@rspack/resolver-binding-linux-arm64-gnu@0.2.8': + resolution: {integrity: sha512-wGvkxm2G4mNTztslaOzLzx5JuySQSy5DcOWEZxHcjJJzp5L3ODbYLK18HtUc6cvmaVOmjaGrrYPrqJJ0hHTVFg==} + cpu: [arm64] + os: [linux] + + '@rspack/resolver-binding-linux-arm64-musl@0.2.8': + resolution: {integrity: sha512-EqRJ9zLQsLAvyDKJKVZ45BSqRIMS12f5HtJdy3KkAHU14ZmsGv8e5IKkwUZN5CNBRad8xVlOMMx3dOfF4whJzg==} + cpu: [arm64] + os: [linux] + + '@rspack/resolver-binding-linux-x64-gnu@0.2.8': + resolution: {integrity: sha512-eXbeotNCTntL4/+mxJRVCxK63YeWzTfp0F3POeHJFSs6Nt0f2J/mZNFlasJmd6xm7zvE80h/HWOwbwjRBLcElA==} + cpu: [x64] + os: [linux] + + '@rspack/resolver-binding-linux-x64-musl@0.2.8': + resolution: {integrity: sha512-KWFHlOWGkT+eMngoUgPGXrDi+rU04VCh9jyk0U6Ot2RTWvhGxwKykjmLS+CWZI/EBrzr9A6g2U3jzKTMNz9oCw==} + cpu: [x64] + os: [linux] + + '@rspack/resolver-binding-wasm32-wasi@0.2.8': + resolution: {integrity: sha512-I6GIhgICFViE88jejIV74oiiWHnpLpQ5ogaZM1ozM9KDnfqcHoX0IVEyrIh5KqA8iLDyhuoFSW+Hf0qN7VTBBQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rspack/resolver-binding-win32-arm64-msvc@0.2.8': + resolution: {integrity: sha512-ZXCt3qUfDAEbtc2sHpvxM7lNFZM+DxfblgXUIl3Jy6BuEZbHe1i6z+t9c34ayHoGTVbVSNCtaYuG/MaWdSnPHw==} + cpu: [arm64] + os: [win32] + + '@rspack/resolver-binding-win32-ia32-msvc@0.2.8': + resolution: {integrity: sha512-2LRymjDK8MpUERD8CL0PPae5y2crU5TAg4T4EzpeL5jLARVq6izsEruiWzB6Y+D15vUYlvmgs2370GXVSB861w==} + cpu: [ia32] + os: [win32] + + '@rspack/resolver-binding-win32-x64-msvc@0.2.8': + resolution: {integrity: sha512-hzRpfbtvv4M4EVrKKIAaHDs5wT8lVcbSUjtwPs5u4IeLEix45nQPQ6ZQjmE4lIH0GP/3L3XQhZroYmTcH/xdsQ==} + cpu: [x64] + os: [win32] + + '@rspack/resolver@0.2.8': + resolution: {integrity: sha512-FBWqdHhzS8mcf/WN4Ktzr7EaeaN+hsxbN98EweegX3924beZuY6H70CSFWCv1fIHAieCUv/9XCjKggHvhCsLwA==} + '@rspress/core@2.0.14': resolution: {integrity: sha512-k59i08zwBGgHrjHw8CK1m4CeTrKPvZRmV54bxubQl6AdDdmhJK6WrNg3UthwWmd38scKtqF40ATXDE8RMiNcNA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -12964,6 +13379,9 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@storybook/addon-docs@8.6.18': resolution: {integrity: sha512-55ADer0yNmmeR928Y3UAv3r4i7bJSd9LwywsQ+lRol/FNe0ZcwLEz31xL+jVsqQFNnDh/imsDIp8aYapGMtfEQ==} peerDependencies: @@ -13831,6 +14249,9 @@ packages: '@types/cookie@0.4.1': resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/cross-spawn@6.0.6': resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} @@ -13975,6 +14396,9 @@ packages: '@types/estree@0.0.51': resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -14118,9 +14542,6 @@ packages: '@types/node-forge@1.3.14': resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - '@types/node-schedule@2.1.7': - resolution: {integrity: sha512-G7Z3R9H7r3TowoH6D2pkzUHPhcJrDF4Jz1JOQ80AX0K2DWTHoN9VC94XzFAPNMdbW9TBzMZ3LjpFi7RYdbxtXA==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -14257,6 +14678,9 @@ packages: '@types/stylis@4.2.0': resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} + '@types/tapable@2.3.0': + resolution: {integrity: sha512-oMnbAXeVo+KUnje3hzdORXUbfnzTfqD0H92mLl19NE5hFqH9Q4ktq+xehNSxcNeeLm1COopYwa0zeP6Iz+oIXg==} + '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -14674,7 +15098,6 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unhead/react@2.1.15': resolution: {integrity: sha512-5hfAaZ3XJq9JkspRzZdSPsMrXXA8v/SKiEOxZcN9L40o44byF/50bcQuOLgSSCAx8802mI5VG32KZXWTtsLu9Q==} @@ -15169,7 +15592,6 @@ packages: '@xmldom/xmldom@0.8.11': resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} - deprecated: this version has critical issues, please update to the latest version '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -15224,7 +15646,6 @@ packages: abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -15507,12 +15928,10 @@ packages: are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} - deprecated: This package is no longer supported. are-we-there-yet@4.0.2: resolution: {integrity: sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - deprecated: This package is no longer supported. arg@4.1.0: resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} @@ -15919,6 +16338,9 @@ packages: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} + background-only@0.0.1: + resolution: {integrity: sha512-YXR2zshAf3qs3jnpApQaDUG0x4L6YWpSZfLDhdeiCFxfp/n8YwfoAQ1hAigEF3VpXOMOJeZYFWtBbiFv/v2Qfg==} + bail@1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} @@ -15973,6 +16395,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} @@ -16124,6 +16550,9 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + browserslist-load-config@1.0.3: + resolution: {integrity: sha512-boNaPS4KlW6AITZQ60G+1oDJLuxauljDd7QNQFOYpRtldzcTDknMZ8awbwI0BT/8h1/Y/CG4k/tDOLip9lAGcg==} + browserslist-to-es-version@1.4.1: resolution: {integrity: sha512-1bYCrck5Qh5HUy7P+iDuK39v757/ry5PnQo20vf4sHGeUrYKL2N2OF05U9ARSGt06TpFDQiTv9MT+eitYgWWxA==} hasBin: true @@ -17205,6 +17634,9 @@ packages: csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -17465,7 +17897,6 @@ packages: debug@4.1.1: resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -17767,7 +18198,6 @@ packages: domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} @@ -17929,6 +18359,14 @@ packages: endent@2.1.0: resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.9: + resolution: {integrity: sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==} + engines: {node: '>=10.2.0'} + enhanced-resolve@5.16.1: resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} engines: {node: '>=10.13.0'} @@ -18516,7 +18954,6 @@ packages: eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true eslint@9.26.0: @@ -18713,9 +19150,6 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} engines: {node: '>=0.10.0'} @@ -18891,6 +19325,10 @@ packages: resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} engines: {node: '>= 10.4.0'} + filesize@11.0.22: + resolution: {integrity: sha512-RlCVs9CY+oSsRnNZn95J9vDXjNjOwddKyTFjOYtA4yxYVIxBnwiVVGJX+TFhsmu3uUf81JDGyijtYL9xgawlTw==} + engines: {node: '>= 10.8.0'} + fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} @@ -19211,12 +19649,10 @@ packages: gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} - deprecated: This package is no longer supported. gauge@5.0.2: resolution: {integrity: sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - deprecated: This package is no longer supported. generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} @@ -19311,7 +19747,6 @@ packages: git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} engines: {node: '>=16'} - deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. hasBin: true git-up@7.0.0: @@ -19345,13 +19780,11 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@13.0.6: @@ -19360,25 +19793,20 @@ packages: glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} @@ -19977,7 +20405,6 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.1: resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} @@ -20036,7 +20463,6 @@ packages: intersection-observer@0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} - deprecated: The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019. invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -20812,6 +21238,9 @@ packages: resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} engines: {node: '>= 0.4'} + json-stream-stringify@3.0.1: + resolution: {integrity: sha512-vuxs3G1ocFDiAQ/SX0okcZbtqXwgj1g71qE9+vrjJ2EkjKQlEFDAcUNRxRU8O+GekV4v5cM2qXP0Wyt/EMDBiQ==} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -20916,6 +21345,9 @@ packages: launch-editor@2.13.1: resolution: {integrity: sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==} + launch-editor@2.14.1: + resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -20996,6 +21428,10 @@ packages: resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -22105,7 +22541,6 @@ packages: node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead node-exports-info@1.6.0: resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} @@ -22141,10 +22576,6 @@ packages: encoding: optional: true - node-fetch@3.3.0: - resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -22245,12 +22676,10 @@ packages: npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. npmlog@7.0.1: resolution: {integrity: sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - deprecated: This package is no longer supported. nprogress@0.2.0: resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} @@ -22663,7 +23092,6 @@ packages: path-match@1.2.4: resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} - deprecated: This package is archived and no longer maintained. For support, visit https://github.com/expressjs/express/discussions path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -24213,11 +24641,6 @@ packages: react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - react-error-boundary@4.1.2: - resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} - peerDependencies: - react: '>=16.13.1' - react-error-boundary@5.0.0: resolution: {integrity: sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==} peerDependencies: @@ -24623,7 +25046,6 @@ packages: recharts@2.12.4: resolution: {integrity: sha512-dM4skmk4fDKEDjL9MNunxv6zcTxePGVEzRnLDXALRpfJ85JoQ0P0APJ/CoJlmnQI0gPjBlOkjzrwrfQrRST3KA==} engines: {node: '>=14'} - deprecated: 1.x and 2.x branches are no longer active. Bump to Recharts v3 to receive latest features and bugfixes. See https://github.com/recharts/recharts/wiki/3.0-migration-guide peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 @@ -24871,7 +25293,6 @@ packages: resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} @@ -24924,17 +25345,14 @@ packages: rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@6.0.1: @@ -25075,6 +25493,10 @@ packages: rslog@1.3.2: resolution: {integrity: sha512-1YyYXBvN0a2b1MSIDLwDTqqgjDzRKxUg/S/+KO6EAgbtZW1B3fdLHAMhEEtvk1patJYMqcRvlp3HQwnxj7AdGQ==} + rslog@2.3.0: + resolution: {integrity: sha512-g2wW/ermwzGTLlzGdJBDRc4YKz2/yPBjf57w9g5CvhtpZ91Xq95OaWku0oNHYi+XsuV6v8QrCo2oJJR/pCUR8g==} + engines: {node: ^20.19.0 || >=22.12.0} + rspack-manifest-plugin@5.0.3: resolution: {integrity: sha512-DCLSu5KE/ReIOhK2JTCQSI0JIgJ40E2i+2noqINtfhu12+UsK29dgMITEHIpYNR0JggcmmgZIDxPxm9dOV/2vQ==} engines: {node: '>=14'} @@ -25541,6 +25963,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.2: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} @@ -25649,6 +26076,10 @@ packages: shell-exec@1.0.2: resolution: {integrity: sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==} + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} + engines: {node: '>= 0.4'} + shell-quote@1.8.3: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} @@ -25747,6 +26178,17 @@ packages: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} + socket.io-adapter@2.5.8: + resolution: {integrity: sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==} + + socket.io-parser@4.2.7: + resolution: {integrity: sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} @@ -25782,7 +26224,6 @@ packages: source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -25795,7 +26236,6 @@ packages: source-map-url@0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} @@ -25816,7 +26256,6 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} @@ -25980,7 +26419,6 @@ packages: stream-to-promise@2.2.0: resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} - deprecated: Deprecated. Use node:stream/promises and node:stream/consumers instead. streamroller@3.1.5: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} @@ -26339,6 +26777,10 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + tar-fs@2.1.4: resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} @@ -26352,12 +26794,10 @@ packages: tar@4.4.18: resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} engines: {node: '>=4.5'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me tar@7.5.11: resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} @@ -26512,6 +26952,10 @@ packages: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} @@ -26619,7 +27063,6 @@ packages: trim@0.0.1: resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} - deprecated: Use String.prototype.trim() instead trough@1.0.5: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} @@ -26754,7 +27197,6 @@ packages: tsconfck@2.1.2: resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} engines: {node: ^14.13.1 || ^16 || >=18} - deprecated: unmaintained hasBin: true peerDependencies: typescript: ^4.3.5 || ^5.0.0 @@ -26824,7 +27266,6 @@ packages: tsup@7.3.0: resolution: {integrity: sha512-Ja1eaSRrE+QarmATlNO5fse2aOACYMBX+IZRKy1T+gpyH+jXgRrl5l4nHIQJQ1DoDgEjHDTw8cpE085UdBZuWQ==} engines: {node: '>=18'} - deprecated: Breaking node 16 hasBin: true peerDependencies: '@swc/core': ^1 @@ -27221,7 +27662,6 @@ packages: urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} @@ -27307,17 +27747,14 @@ packages: uuid@3.3.2: resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-compile-cache-lib@3.0.1: @@ -27610,6 +28047,9 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + wasm-feature-detect@1.8.0: + resolution: {integrity: sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==} + watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} @@ -27772,7 +28212,6 @@ packages: whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -28419,6 +28858,12 @@ snapshots: dependencies: default-browser-id: 3.0.0 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -30936,12 +31381,12 @@ snapshots: dependencies: '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 + optional: true - '@emnapi/core@1.9.0': + '@emnapi/core@1.11.2': dependencies: - '@emnapi/wasi-threads': 1.2.0 + '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 - optional: true '@emnapi/runtime@1.10.0': dependencies: @@ -30951,13 +31396,13 @@ snapshots: '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 + optional: true - '@emnapi/runtime@1.9.0': + '@emnapi/runtime@1.11.2': dependencies: tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.2.0': + '@emnapi/runtime@1.9.0': dependencies: tslib: 2.8.1 optional: true @@ -32549,6 +32994,169 @@ snapshots: lodash: 4.18.1 react: 18.3.1 + '@lynx-js/cache-events-webpack-plugin@0.1.0': + dependencies: + '@lynx-js/webpack-runtime-globals': 0.0.6 + + '@lynx-js/chunk-loading-webpack-plugin@0.4.0': + dependencies: + '@lynx-js/webpack-runtime-globals': 0.0.6 + + '@lynx-js/css-extract-webpack-plugin@0.8.0(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1))': + dependencies: + '@lynx-js/template-webpack-plugin': 0.12.2(tslib@2.8.1) + + '@lynx-js/css-serializer@0.1.6': + dependencies: + css-tree: 3.2.1 + + '@lynx-js/debug-metadata-rsbuild-plugin@0.1.2': + dependencies: + '@lynx-js/debug-metadata': 0.1.0 + + '@lynx-js/debug-metadata@0.1.0': {} + + '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c': {} + + '@lynx-js/lynx-bundle-rslib-config@0.5.1(tslib@2.8.1)': + dependencies: + '@lynx-js/css-serializer': 0.1.6 + '@lynx-js/runtime-wrapper-webpack-plugin': 0.2.1 + '@lynx-js/tasm': 0.0.39 + '@lynx-js/web-core': 0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) + transitivePeerDependencies: + - '@lynx-js/lynx-core' + - tslib + + '@lynx-js/qrcode-rsbuild-plugin@0.5.0(@lynx-js/rspeedy@0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)))': + dependencies: + '@lynx-js/rspeedy': 0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + + '@lynx-js/react-alias-rsbuild-plugin@0.17.2': {} + + '@lynx-js/react-refresh-webpack-plugin@0.4.0(@lynx-js/react-webpack-plugin@0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)))': + dependencies: + '@lynx-js/react-webpack-plugin': 0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)) + + '@lynx-js/react-rsbuild-plugin@0.17.2(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(tslib@2.8.1)': + dependencies: + '@lynx-js/css-extract-webpack-plugin': 0.8.0(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)) + '@lynx-js/react-alias-rsbuild-plugin': 0.17.2 + '@lynx-js/react-refresh-webpack-plugin': 0.4.0(@lynx-js/react-webpack-plugin@0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1))) + '@lynx-js/react-webpack-plugin': 0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)) + '@lynx-js/runtime-wrapper-webpack-plugin': 0.2.1 + '@lynx-js/template-webpack-plugin': 0.12.2(tslib@2.8.1) + '@lynx-js/use-sync-external-store': 1.5.0(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28)) + background-only: 0.0.1 + tiny-invariant: 1.3.3 + optionalDependencies: + '@lynx-js/react': 0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28) + transitivePeerDependencies: + - '@lynx-js/lynx-core' + - tslib + + '@lynx-js/react-webpack-plugin@0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1))': + dependencies: + '@lynx-js/debug-metadata': 0.1.0 + '@lynx-js/template-webpack-plugin': 0.12.2(tslib@2.8.1) + '@lynx-js/webpack-runtime-globals': 0.0.6 + tiny-invariant: 1.3.3 + optionalDependencies: + '@lynx-js/react': 0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28) + + '@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28)': + dependencies: + '@types/react': 18.3.28 + preact: '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c' + optionalDependencies: + '@lynx-js/types': 4.0.0 + + '@lynx-js/rspeedy@0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + dependencies: + '@lynx-js/cache-events-webpack-plugin': 0.1.0 + '@lynx-js/chunk-loading-webpack-plugin': 0.4.0 + '@lynx-js/debug-metadata-rsbuild-plugin': 0.1.2 + '@lynx-js/web-rsbuild-server-middleware': 0.21.1 + '@lynx-js/webpack-dev-transport': 0.3.0 + '@lynx-js/websocket': 0.0.4 + '@rsbuild/core': 2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) + '@rsbuild/plugin-css-minimizer': 2.0.0(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/rspack-plugin': 1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + - '@module-federation/runtime-tools' + - '@parcel/css' + - '@rspack/core' + - '@swc/css' + - bufferutil + - clean-css + - core-js + - csso + - esbuild + - lightningcss + - supports-color + - utf-8-validate + - webpack + + '@lynx-js/runtime-wrapper-webpack-plugin@0.2.1': + dependencies: + '@lynx-js/webpack-runtime-globals': 0.0.6 + + '@lynx-js/tasm@0.0.39': {} + + '@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@lynx-js/css-serializer': 0.1.6 + '@lynx-js/tasm': 0.0.39 + '@lynx-js/web-core': 0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) + '@lynx-js/webpack-runtime-globals': 0.0.6 + '@rspack/lite-tapable': 1.1.0 + css-tree: 3.2.1 + object.groupby: 1.0.3 + tinypool: 2.1.0 + transitivePeerDependencies: + - '@lynx-js/lynx-core' + - tslib + + '@lynx-js/types@4.0.0': + dependencies: + csstype: 3.1.3 + + '@lynx-js/use-sync-external-store@1.5.0(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))': + dependencies: + '@lynx-js/react': 0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28) + + '@lynx-js/web-core@0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1)': + dependencies: + '@lynx-js/web-elements': 0.12.5(tslib@2.8.1) + '@lynx-js/web-worker-rpc': 0.22.1 + wasm-feature-detect: 1.8.0 + optionalDependencies: + '@lynx-js/css-serializer': 0.1.6 + tslib: 2.8.1 + + '@lynx-js/web-elements@0.12.5(tslib@2.8.1)': + dependencies: + dompurify: 3.4.11 + markdown-it: 14.1.1 + tslib: 2.8.1 + + '@lynx-js/web-rsbuild-server-middleware@0.21.1': {} + + '@lynx-js/web-worker-rpc@0.22.1': {} + + '@lynx-js/webpack-dev-transport@0.3.0': {} + + '@lynx-js/webpack-runtime-globals@0.0.6': {} + + '@lynx-js/websocket@0.0.4': + dependencies: + eventemitter3: 5.0.4 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.2 @@ -33041,22 +33649,22 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@modern-js/app-tools@3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.17))(@types/node@26.1.0)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@modern-js/app-tools@3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.17))(@types/node@26.1.0)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: '@babel/parser': 7.29.7 '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 - '@modern-js/builder': 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@modern-js/builder': 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@modern-js/i18n-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/plugin-data-loader': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/prod-server': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.17))(@types/node@26.1.0)(typescript@7.0.2))(tsconfig-paths@4.2.0) - '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/prod-server': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.17))(@types/node@26.1.0)(typescript@7.0.2))(tsconfig-paths@4.2.0) + '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/server-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@swc/core': 1.15.41(@swc/helpers@0.5.17) '@swc/helpers': 0.5.17 es-module-lexer: 1.7.0 @@ -33094,22 +33702,22 @@ snapshots: - utf-8-validate - webpack - '@modern-js/app-tools@3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': + '@modern-js/app-tools@3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': dependencies: '@babel/parser': 7.29.7 '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 - '@modern-js/builder': 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + '@modern-js/builder': 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/i18n-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/plugin-data-loader': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/prod-server': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2) - '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/prod-server': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2) + '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/server-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@swc/core': 1.15.41(@swc/helpers@0.5.17) '@swc/helpers': 0.5.17 es-module-lexer: 1.7.0 @@ -33147,22 +33755,22 @@ snapshots: - utf-8-validate - webpack - '@modern-js/app-tools@3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': + '@modern-js/app-tools@3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(core-js@3.49.0)(encoding@0.1.13)(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': dependencies: '@babel/parser': 7.29.7 '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 - '@modern-js/builder': 3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + '@modern-js/builder': 3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) '@modern-js/i18n-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/plugin-data-loader': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/prod-server': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0) - '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/prod-server': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0) + '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/server-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@swc/core': 1.15.41(@swc/helpers@0.5.17) '@swc/helpers': 0.5.17 es-module-lexer: 1.7.0 @@ -33269,7 +33877,7 @@ snapshots: - '@rsbuild/core' - supports-color - '@modern-js/babel-preset@2.68.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@modern-js/babel-preset@2.68.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.7) @@ -33281,7 +33889,7 @@ snapshots: '@babel/preset-typescript': 7.28.5(@babel/core@7.29.7) '@babel/runtime': 7.28.2 '@babel/types': 7.29.7 - '@rsbuild/plugin-babel': 1.0.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + '@rsbuild/plugin-babel': 1.0.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) '@swc/helpers': 0.5.17 '@types/babel__core': 7.20.5 babel-plugin-dynamic-import-node: 2.3.3 @@ -33332,21 +33940,21 @@ snapshots: - '@rsbuild/core' - supports-color - '@modern-js/builder@3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@modern-js/builder@3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - '@rsbuild/plugin-assets-retry': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-check-syntax': 2.0.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-css-minimizer': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) - '@rsbuild/plugin-less': 1.6.4(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) - '@rsbuild/plugin-react': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17)) - '@rsbuild/plugin-rem': 1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-sass': 1.5.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-source-build': 1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-svgr': 2.0.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(typescript@7.0.2) - '@rsbuild/plugin-type-check': 1.5.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(tslib@2.8.1)(typescript@7.0.2) - '@rsbuild/plugin-typed-css-modules': 1.2.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + '@rsbuild/plugin-assets-retry': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-check-syntax': 2.0.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-css-minimizer': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsbuild/plugin-less': 1.6.4(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsbuild/plugin-react': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17)) + '@rsbuild/plugin-rem': 1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-sass': 1.5.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-source-build': 1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-svgr': 2.0.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(typescript@7.0.2) + '@rsbuild/plugin-type-check': 1.5.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(tslib@2.8.1)(typescript@7.0.2) + '@rsbuild/plugin-typed-css-modules': 1.2.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) '@swc/core': 1.15.41(@swc/helpers@0.5.17) '@swc/helpers': 0.5.17 autoprefixer: 10.4.27(postcss@8.5.15) @@ -33363,8 +33971,8 @@ snapshots: postcss-media-minmax: 5.0.0(postcss@8.5.15) postcss-nesting: 12.1.5(postcss@8.5.15) postcss-page-break: 3.0.4(postcss@8.5.15) - rsbuild-plugin-rsc: 0.1.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - rspack-manifest-plugin: 5.2.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17)) + rsbuild-plugin-rsc: 0.1.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + rspack-manifest-plugin: 5.2.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17)) ts-deepmerge: 7.0.3 transitivePeerDependencies: - '@module-federation/runtime-tools' @@ -33384,21 +33992,21 @@ snapshots: - typescript - webpack - '@modern-js/builder@3.5.0(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': + '@modern-js/builder@3.5.0(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(esbuild@0.28.1)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': dependencies: '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - '@rsbuild/plugin-assets-retry': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-check-syntax': 2.0.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-css-minimizer': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) - '@rsbuild/plugin-less': 1.6.4(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) - '@rsbuild/plugin-react': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) - '@rsbuild/plugin-rem': 1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-sass': 1.5.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-source-build': 1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) - '@rsbuild/plugin-svgr': 2.0.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(typescript@7.0.2) - '@rsbuild/plugin-type-check': 1.5.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2) - '@rsbuild/plugin-typed-css-modules': 1.2.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + '@rsbuild/plugin-assets-retry': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-check-syntax': 2.0.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-css-minimizer': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + '@rsbuild/plugin-less': 1.6.4(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + '@rsbuild/plugin-react': 2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) + '@rsbuild/plugin-rem': 1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-sass': 1.5.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-source-build': 1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) + '@rsbuild/plugin-svgr': 2.0.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(typescript@7.0.2) + '@rsbuild/plugin-type-check': 1.5.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2) + '@rsbuild/plugin-typed-css-modules': 1.2.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) '@swc/core': 1.15.41(@swc/helpers@0.5.17) '@swc/helpers': 0.5.17 autoprefixer: 10.4.27(postcss@8.5.15) @@ -33415,8 +34023,8 @@ snapshots: postcss-media-minmax: 5.0.0(postcss@8.5.15) postcss-nesting: 12.1.5(postcss@8.5.15) postcss-page-break: 3.0.4(postcss@8.5.15) - rsbuild-plugin-rsc: 0.1.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - rspack-manifest-plugin: 5.2.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + rsbuild-plugin-rsc: 0.1.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + rspack-manifest-plugin: 5.2.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) ts-deepmerge: 7.0.3 transitivePeerDependencies: - '@module-federation/runtime-tools' @@ -33627,10 +34235,10 @@ snapshots: '@modern-js/utils': 2.70.8 '@swc/helpers': 0.5.17 - '@modern-js/plugin-server@2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@modern-js/plugin-server@2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@modern-js/runtime-utils': 2.68.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server-utils': 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + '@modern-js/server-utils': 2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) '@modern-js/utils': 2.68.0 '@swc/helpers': 0.5.17 transitivePeerDependencies: @@ -33693,12 +34301,12 @@ snapshots: '@modern-js/utils': 2.70.8 '@swc/helpers': 0.5.17 - '@modern-js/plugin@3.0.1(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@modern-js/plugin@3.0.1(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@modern-js/runtime-utils': 3.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.0.1 '@modern-js/utils': 3.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rsbuild/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@swc/helpers': 0.5.17 jiti: 2.6.1 transitivePeerDependencies: @@ -33707,12 +34315,12 @@ snapshots: - react - react-dom - '@modern-js/plugin@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@modern-js/plugin@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@swc/helpers': 0.5.17 jiti: 2.6.1 transitivePeerDependencies: @@ -33741,10 +34349,10 @@ snapshots: - react - react-dom - '@modern-js/prod-server@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@modern-js/prod-server@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/helpers': 0.5.17 transitivePeerDependencies: @@ -33771,23 +34379,23 @@ snapshots: react-dom: 19.2.4(react@19.2.4) react-server-dom-webpack: 19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.19))(esbuild@0.18.20)(webpack-cli@5.1.4)) - '@modern-js/render@3.5.0(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@modern-js/render@3.5.0(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/helpers': 0.5.17 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-server-dom-rspack: 0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-server-dom-rspack: 0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/render@3.5.0(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@modern-js/render@3.5.0(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/helpers': 0.5.17 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-server-dom-rspack: 0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-server-dom-rspack: 0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/rsbuild-plugin-esbuild@2.70.5(@swc/core@1.15.41(@swc/helpers@0.5.17))(webpack-cli@5.1.4)': dependencies: @@ -33936,13 +34544,13 @@ snapshots: - react-server-dom-webpack - supports-color - '@modern-js/runtime@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@modern-js/runtime@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@loadable/component': 5.16.7(react@18.3.1) '@loadable/server': 5.16.7(@loadable/component@5.16.7(react@18.3.1))(react@18.3.1) - '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/plugin-data-loader': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/render': 3.5.0(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@modern-js/render': 3.5.0(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -33965,13 +34573,13 @@ snapshots: - core-js - react-server-dom-rspack - '@modern-js/runtime@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@modern-js/runtime@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@loadable/component': 5.16.7(react@18.3.1) '@loadable/server': 5.16.7(@loadable/component@5.16.7(react@18.3.1))(react@18.3.1) - '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/plugin-data-loader': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/render': 3.5.0(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@modern-js/render': 3.5.0(react-dom@18.3.1(react@18.3.1))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -34030,9 +34638,9 @@ snapshots: - react - react-dom - '@modern-js/server-core@3.0.1(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@modern-js/server-core@3.0.1(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@modern-js/plugin': 3.0.1(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/plugin': 3.0.1(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/runtime-utils': 3.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/utils': 3.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/helpers': 0.5.17 @@ -34049,9 +34657,9 @@ snapshots: - react - react-dom - '@modern-js/server-core@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@modern-js/server-core@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/plugin': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@swc/helpers': 0.5.17 @@ -34077,10 +34685,10 @@ snapshots: - react - react-dom - '@modern-js/server-runtime@3.0.1(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@modern-js/server-runtime@3.0.1(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@modern-js/runtime-utils': 3.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server-core': 3.0.1(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server-core': 3.0.1(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.0.1 '@swc/helpers': 0.5.17 transitivePeerDependencies: @@ -34089,10 +34697,10 @@ snapshots: - react - react-dom - '@modern-js/server-runtime@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@modern-js/server-runtime@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@swc/helpers': 0.5.17 transitivePeerDependencies: @@ -34101,7 +34709,7 @@ snapshots: - react - react-dom - '@modern-js/server-utils@2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@modern-js/server-utils@2.68.0(@babel/traverse@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.7) @@ -34110,7 +34718,7 @@ snapshots: '@babel/preset-typescript': 7.28.5(@babel/core@7.29.7) '@modern-js/babel-compiler': 2.68.0 '@modern-js/babel-plugin-module-resolver': 2.68.0 - '@modern-js/babel-preset': 2.68.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + '@modern-js/babel-preset': 2.68.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) '@modern-js/utils': 2.68.0 '@swc/helpers': 0.5.17 babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.29.7)(@babel/traverse@7.29.7) @@ -34221,10 +34829,10 @@ snapshots: - supports-color - utf-8-validate - '@modern-js/server@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.17))(@types/node@26.1.0)(typescript@7.0.2))(tsconfig-paths@4.2.0)': + '@modern-js/server@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.17))(@types/node@26.1.0)(typescript@7.0.2))(tsconfig-paths@4.2.0)': dependencies: '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/server-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -34248,10 +34856,10 @@ snapshots: - supports-color - utf-8-validate - '@modern-js/server@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2)': + '@modern-js/server@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@3.14.2)': dependencies: '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/server-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -34275,10 +34883,10 @@ snapshots: - supports-color - utf-8-validate - '@modern-js/server@3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)': + '@modern-js/server@3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.41(@swc/helpers@0.5.23))(@types/node@20.19.5)(typescript@7.0.2))(tsconfig-paths@4.2.0)': dependencies: '@modern-js/runtime-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@modern-js/server-core': 3.5.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/server-utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@modern-js/types': 3.5.0 '@modern-js/utils': 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -34937,7 +35545,7 @@ snapshots: '@module-federation/error-codes@2.2.2': {} - '@module-federation/error-codes@2.7.0': + '@module-federation/error-codes@2.8.0': optional: true '@module-federation/inject-external-runtime-core-plugin@0.21.6(@module-federation/runtime-tools@0.21.6)': @@ -35093,10 +35701,10 @@ snapshots: transitivePeerDependencies: - node-fetch - '@module-federation/runtime-core@2.7.0': + '@module-federation/runtime-core@2.8.0': dependencies: - '@module-federation/error-codes': 2.7.0 - '@module-federation/sdk': 2.7.0 + '@module-federation/error-codes': 2.8.0 + '@module-federation/sdk': 2.8.0 optional: true '@module-federation/runtime-tools@0.1.6': @@ -35146,10 +35754,10 @@ snapshots: transitivePeerDependencies: - node-fetch - '@module-federation/runtime-tools@2.7.0': + '@module-federation/runtime-tools@2.8.0': dependencies: - '@module-federation/runtime': 2.7.0 - '@module-federation/webpack-bundler-runtime': 2.7.0 + '@module-federation/runtime': 2.8.0 + '@module-federation/webpack-bundler-runtime': 2.8.0 optional: true '@module-federation/runtime@0.1.6': @@ -35204,11 +35812,11 @@ snapshots: transitivePeerDependencies: - node-fetch - '@module-federation/runtime@2.7.0': + '@module-federation/runtime@2.8.0': dependencies: - '@module-federation/error-codes': 2.7.0 - '@module-federation/runtime-core': 2.7.0 - '@module-federation/sdk': 2.7.0 + '@module-federation/error-codes': 2.8.0 + '@module-federation/runtime-core': 2.8.0 + '@module-federation/sdk': 2.8.0 optional: true '@module-federation/sdk@0.1.6': {} @@ -35231,7 +35839,7 @@ snapshots: optionalDependencies: node-fetch: 2.7.0(encoding@0.1.13) - '@module-federation/sdk@2.7.0': + '@module-federation/sdk@2.8.0': optional: true '@module-federation/third-party-dts-extractor@0.21.6': @@ -35293,11 +35901,11 @@ snapshots: transitivePeerDependencies: - node-fetch - '@module-federation/webpack-bundler-runtime@2.7.0': + '@module-federation/webpack-bundler-runtime@2.8.0': dependencies: - '@module-federation/error-codes': 2.7.0 - '@module-federation/runtime': 2.7.0 - '@module-federation/sdk': 2.7.0 + '@module-federation/error-codes': 2.8.0 + '@module-federation/runtime': 2.8.0 + '@module-federation/sdk': 2.8.0 optional: true '@monaco-editor/loader@1.7.0': @@ -35451,21 +36059,21 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.9.0 - '@emnapi/runtime': 1.9.0 + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 '@tybys/wasm-util': 0.10.1 optional: true '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 '@tybys/wasm-util': 0.9.0 '@napi-rs/wasm-runtime@1.0.7': dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 '@tybys/wasm-util': 0.10.3 optional: true @@ -35483,6 +36091,13 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 + optional: true + '@ndelangen/get-tarball@3.0.9': dependencies: gunzip-maybe: 1.4.2 @@ -38668,17 +39283,17 @@ snapshots: '@rolldown/binding-openharmony-arm64@1.0.0-rc.9': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -38881,9 +39496,9 @@ snapshots: core-js: 3.42.0 jiti: 2.6.1 - '@rsbuild/core@1.5.17(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@rsbuild/core@1.5.17(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: - '@rspack/core': 1.5.8(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/helpers@0.5.17) + '@rspack/core': 1.5.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/helpers@0.5.17) '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 core-js: 3.46.0 @@ -38908,9 +39523,9 @@ snapshots: core-js: 3.47.0 jiti: 2.6.1 - '@rsbuild/core@2.0.0-beta.2(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)': + '@rsbuild/core@2.0.0-beta.2(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)': dependencies: - '@rspack/core': 2.0.0-beta.0(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.0.0-beta.0(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) '@swc/helpers': 0.5.23 jiti: 2.6.1 optionalDependencies: @@ -38918,54 +39533,81 @@ snapshots: transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.0.15(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)': + '@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)': + dependencies: + '@rspack/core': 2.0.6(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23) + '@swc/helpers': 0.5.23 + optionalDependencies: + core-js: 3.49.0 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + + '@rsbuild/core@2.0.15(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)': dependencies: - '@rspack/core': 2.0.8(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.0.8(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) '@swc/helpers': 0.5.23 optionalDependencies: core-js: 3.36.1 transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.0.15(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)': + '@rsbuild/core@2.0.15(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)': dependencies: - '@rspack/core': 2.0.8(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.0.8(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) '@swc/helpers': 0.5.23 optionalDependencies: core-js: 3.49.0 transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)': + '@rsbuild/core@2.0.15(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)': dependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.0.8(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23) '@swc/helpers': 0.5.23 optionalDependencies: core-js: 3.49.0 transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.1.4(@module-federation/runtime-tools@0.21.6)(core-js@3.49.0)': + '@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)': dependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@0.21.6)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) '@swc/helpers': 0.5.23 optionalDependencies: core-js: 3.49.0 transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)': + '@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.2.2(node-fetch@2.7.0(encoding@0.1.13)))(core-js@3.49.0)': dependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.2.2(node-fetch@2.7.0(encoding@0.1.13)))(@swc/helpers@0.5.23) + '@swc/helpers': 0.5.23 + optionalDependencies: + core-js: 3.49.0 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + + '@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)': + dependencies: + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) '@swc/helpers': 0.5.23 optionalDependencies: core-js: 3.36.1 transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)': + '@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)': dependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) + '@swc/helpers': 0.5.23 + optionalDependencies: + core-js: 3.49.0 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + + '@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)': + dependencies: + '@rspack/core': 2.1.2(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23) '@swc/helpers': 0.5.23 optionalDependencies: core-js: 3.49.0 @@ -38976,9 +39618,9 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.7.3 - '@rsbuild/plugin-assets-retry@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-assets-retry@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-babel@1.0.1-rc.4(@rsbuild/core@1.0.1-rc.4)': dependencies: @@ -38994,13 +39636,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@rsbuild/plugin-babel@1.0.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-babel@1.0.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.7) '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.7) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.7) - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@types/babel__core': 7.20.5 deepmerge: 4.3.1 reduce-configs: 1.1.2 @@ -39022,7 +39664,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@rsbuild/plugin-babel@1.2.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-babel@1.2.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.7) @@ -39031,21 +39673,21 @@ snapshots: '@types/babel__core': 7.20.5 reduce-configs: 1.1.2 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - supports-color - '@rsbuild/plugin-babel@2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@rsbuild/plugin-babel@2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) '@types/babel__core': 7.20.5 - babel-loader: 10.1.1(@babel/core@7.29.7)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + babel-loader: 10.1.1(@babel/core@7.29.7)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) reduce-configs: 1.1.2 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - supports-color @@ -39061,7 +39703,17 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.7.3 - '@rsbuild/plugin-check-syntax@2.0.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-check-syntax@1.6.1(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))': + dependencies: + acorn: 8.17.0 + browserslist-to-es-version: 1.4.1 + htmlparser2: 10.0.0 + picocolors: 1.1.1 + source-map: 0.7.6 + optionalDependencies: + '@rsbuild/core': 2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) + + '@rsbuild/plugin-check-syntax@2.0.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: acorn: 8.17.0 browserslist-to-es-version: 1.4.1 @@ -39069,7 +39721,7 @@ snapshots: picocolors: 1.1.1 source-map: 0.7.6 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-css-minimizer@1.1.1(@rsbuild/core@1.7.3)(esbuild@0.18.20)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.19))(esbuild@0.18.20)(webpack-cli@5.1.4))': dependencies: @@ -39116,12 +39768,27 @@ snapshots: - lightningcss - webpack - '@rsbuild/plugin-css-minimizer@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@rsbuild/plugin-css-minimizer@2.0.0(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + dependencies: + css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + reduce-configs: 1.1.2 + optionalDependencies: + '@rsbuild/core': 2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) + transitivePeerDependencies: + - '@parcel/css' + - '@swc/css' + - clean-css + - csso + - esbuild + - lightningcss + - webpack + + '@rsbuild/plugin-css-minimizer@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) reduce-configs: 1.1.2 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@parcel/css' - '@swc/css' @@ -39131,12 +39798,12 @@ snapshots: - lightningcss - webpack - '@rsbuild/plugin-css-minimizer@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': + '@rsbuild/plugin-css-minimizer@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': dependencies: css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) reduce-configs: 1.1.2 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@parcel/css' - '@swc/css' @@ -39152,26 +39819,26 @@ snapshots: deepmerge: 4.3.1 reduce-configs: 1.1.2 - '@rsbuild/plugin-less@1.6.4(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@rsbuild/plugin-less@1.6.4(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: deepmerge: 4.3.1 less: 4.6.4 - less-loader: 12.3.3(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(less@4.6.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) + less-loader: 12.3.3(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(less@4.6.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)) reduce-configs: 1.1.2 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - webpack - '@rsbuild/plugin-less@1.6.4(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': + '@rsbuild/plugin-less@1.6.4(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)))': dependencies: deepmerge: 4.3.1 less: 4.6.4 - less-loader: 12.3.3(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(less@4.6.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) + less-loader: 12.3.3(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(less@4.6.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))) reduce-configs: 1.1.2 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - webpack @@ -39257,83 +39924,83 @@ snapshots: transitivePeerDependencies: - webpack-hot-middleware - '@rsbuild/plugin-react@1.4.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(webpack-hot-middleware@2.26.1)': + '@rsbuild/plugin-react@1.4.5(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(webpack-hot-middleware@2.26.1)': dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rspack/plugin-react-refresh': 1.6.1(react-refresh@0.18.0)(webpack-hot-middleware@2.26.1) react-refresh: 0.18.0 transitivePeerDependencies: - webpack-hot-middleware - '@rsbuild/plugin-react@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))': + '@rsbuild/plugin-react@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))': dependencies: - '@rspack/plugin-react-refresh': 2.0.0(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.0(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - '@rsbuild/plugin-react@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))': + '@rsbuild/plugin-react@2.0.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))': dependencies: - '@rspack/plugin-react-refresh': 2.0.0(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.0(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - '@rsbuild/plugin-react@2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))': + '@rsbuild/plugin-react@2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))': dependencies: - '@rspack/plugin-react-refresh': 2.0.0(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.0(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))': + '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))': dependencies: - '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))': + '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))': dependencies: - '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@0.7.5(@swc/helpers@0.5.23))': + '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@0.7.5(@swc/helpers@0.5.23))': dependencies: '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@0.7.5(@swc/helpers@0.5.23))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))': + '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))': dependencies: - '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))': + '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))': dependencies: - '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' @@ -39344,12 +40011,12 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.7.3 - '@rsbuild/plugin-rem@1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-rem@1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: deepmerge: 4.3.1 terser: 5.48.0 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-sass@1.5.0(@rsbuild/core@1.7.3)': dependencies: @@ -39360,7 +40027,7 @@ snapshots: reduce-configs: 1.1.2 sass-embedded: 1.100.0 - '@rsbuild/plugin-sass@1.5.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-sass@1.5.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: deepmerge: 4.3.1 loader-utils: 2.0.4 @@ -39368,9 +40035,9 @@ snapshots: reduce-configs: 1.1.2 sass-embedded: 1.100.0 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) - '@rsbuild/plugin-sass@2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-sass@2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: deepmerge: 4.3.1 loader-utils: 2.0.4 @@ -39378,7 +40045,7 @@ snapshots: reduce-configs: 2.0.1 sass-embedded: 1.100.0 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-source-build@1.0.4(@rsbuild/core@1.7.3)': dependencies: @@ -39388,13 +40055,13 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.7.3 - '@rsbuild/plugin-source-build@1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-source-build@1.0.6(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: fast-glob: 3.3.3 json5: 2.2.3 yaml: 2.9.0 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@rsbuild/plugin-styled-components@1.6.0(@rsbuild/core@1.7.3)': dependencies: @@ -39417,31 +40084,31 @@ snapshots: - typescript - webpack-hot-middleware - '@rsbuild/plugin-svgr@2.0.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(typescript@7.0.2)': + '@rsbuild/plugin-svgr@2.0.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(typescript@7.0.2)': dependencies: - '@rsbuild/plugin-react': 2.1.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17)) + '@rsbuild/plugin-react': 2.1.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17)) '@svgr/core': 8.1.0(typescript@7.0.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@7.0.2)) '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@7.0.2))(typescript@7.0.2) deepmerge: 4.3.1 loader-utils: 3.3.1 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - supports-color - typescript - '@rsbuild/plugin-svgr@2.0.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(typescript@7.0.2)': + '@rsbuild/plugin-svgr@2.0.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(typescript@7.0.2)': dependencies: - '@rsbuild/plugin-react': 2.1.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) + '@rsbuild/plugin-react': 2.1.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) '@svgr/core': 8.1.0(typescript@7.0.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@6.0.3)) '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@6.0.3))(typescript@7.0.2) deepmerge: 4.3.1 loader-utils: 3.3.1 optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - supports-color @@ -39479,40 +40146,40 @@ snapshots: - tslib - typescript - '@rsbuild/plugin-type-check@1.5.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(tslib@2.8.1)(typescript@7.0.2)': + '@rsbuild/plugin-type-check@1.5.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(tslib@2.8.1)(typescript@7.0.2)': dependencies: deepmerge: 4.3.1 json5: 2.2.3 reduce-configs: 1.1.2 - ts-checker-rspack-plugin: 1.5.1(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(tslib@2.8.1)(typescript@7.0.2) + ts-checker-rspack-plugin: 1.5.1(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(tslib@2.8.1)(typescript@7.0.2) optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - tslib - typescript - '@rsbuild/plugin-type-check@1.5.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2)': + '@rsbuild/plugin-type-check@1.5.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2)': dependencies: deepmerge: 4.3.1 json5: 2.2.3 reduce-configs: 1.1.2 - ts-checker-rspack-plugin: 1.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2) + ts-checker-rspack-plugin: 1.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2) optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - tslib - typescript - '@rsbuild/plugin-type-check@1.5.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2)': + '@rsbuild/plugin-type-check@1.5.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2)': dependencies: deepmerge: 4.3.1 json5: 2.2.3 reduce-configs: 1.1.2 - ts-checker-rspack-plugin: 1.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2) + ts-checker-rspack-plugin: 1.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2) optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - tslib @@ -39522,26 +40189,26 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.7.3 - '@rsbuild/plugin-typed-css-modules@1.2.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-typed-css-modules@1.2.3(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': optionalDependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) - '@rsbuild/plugin-vue-jsx@2.0.1(@babel/core@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))': + '@rsbuild/plugin-vue-jsx@2.0.1(@babel/core@7.29.7)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: - '@rsbuild/plugin-babel': 1.2.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + '@rsbuild/plugin-babel': 1.2.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7) babel-plugin-vue-jsx-hmr: 1.0.0 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@babel/core' - supports-color - '@rsbuild/plugin-vue@2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2))': + '@rsbuild/plugin-vue@2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2))': dependencies: - rspack-vue-loader: 17.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2)) + rspack-vue-loader: 17.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2)) optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) transitivePeerDependencies: - '@rspack/core' - '@vue/compiler-sfc' @@ -39613,10 +40280,113 @@ snapshots: - uglify-js - webpack-cli - '@rslib/core@0.12.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(typescript@7.0.2)': + '@rsdoctor/client@1.5.18': {} + + '@rsdoctor/core@1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + dependencies: + '@rsbuild/plugin-check-syntax': 1.6.1(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)) + '@rsdoctor/graph': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/sdk': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/types': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/utils': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rspack/resolver': 0.2.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + browserslist-load-config: 1.0.3 + es-toolkit: 1.49.0 + filesize: 11.0.22 + fs-extra: 11.3.0 + semver: 7.8.5 + source-map: 0.7.6 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + - '@rsbuild/core' + - '@rspack/core' + - bufferutil + - supports-color + - utf-8-validate + - webpack + + '@rsdoctor/graph@1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + dependencies: + '@rsdoctor/types': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/utils': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + es-toolkit: 1.49.0 + path-browserify: 1.0.1 + source-map: 0.7.6 + transitivePeerDependencies: + - '@rspack/core' + - webpack + + '@rsdoctor/rspack-plugin@1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + dependencies: + '@rsdoctor/core': 1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/graph': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/sdk': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/types': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/utils': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + optionalDependencies: + '@rspack/core': '@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)' + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + - '@rsbuild/core' + - bufferutil + - supports-color + - utf-8-validate + - webpack + + '@rsdoctor/sdk@1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + dependencies: + '@rsdoctor/client': 1.5.18 + '@rsdoctor/graph': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/types': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/utils': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + launch-editor: 2.14.1 + safer-buffer: 2.1.2 + socket.io: 4.8.1 + tapable: 2.3.3 + transitivePeerDependencies: + - '@rspack/core' + - bufferutil + - supports-color + - utf-8-validate + - webpack + + '@rsdoctor/types@1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + dependencies: + '@types/connect': 3.4.38 + '@types/estree': 1.0.5 + '@types/tapable': 2.3.0 + source-map: 0.7.6 + optionalDependencies: + '@rspack/core': '@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)' + webpack: 5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4) + + '@rsdoctor/utils@1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: - '@rsbuild/core': 1.5.17(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) - rsbuild-plugin-dts: 0.12.4(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@1.5.17(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(typescript@7.0.2) + '@babel/code-frame': 7.26.2 + '@rsdoctor/types': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@types/estree': 1.0.5 + acorn: 8.17.0 + acorn-import-attributes: 1.9.5(acorn@8.17.0) + acorn-walk: 8.3.5 + deep-eql: 4.1.4 + envinfo: 7.21.0 + fs-extra: 11.3.0 + get-port: 5.1.1 + json-stream-stringify: 3.0.1 + lines-and-columns: 2.0.4 + picocolors: 1.1.1 + rslog: 2.3.0 + strip-ansi: 7.2.0 + transitivePeerDependencies: + - '@rspack/core' + - webpack + + '@rslib/core@0.12.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(typescript@7.0.2)': + dependencies: + '@rsbuild/core': 1.5.17(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + rsbuild-plugin-dts: 0.12.4(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@1.5.17(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(typescript@7.0.2) tinyglobby: 0.2.15 optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@20.19.5) @@ -39625,10 +40395,10 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - '@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)(typescript@6.0.3)': + '@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)(typescript@6.0.3)': dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1) - rsbuild-plugin-dts: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1))(typescript@6.0.3) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1) + rsbuild-plugin-dts: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1))(typescript@6.0.3) optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@20.19.5) typescript: 6.0.3 @@ -39637,10 +40407,10 @@ snapshots: - '@typescript/native-preview' - core-js - '@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@6.0.3)': + '@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@6.0.3)': dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - rsbuild-plugin-dts: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(typescript@6.0.3) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + rsbuild-plugin-dts: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(typescript@6.0.3) optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@20.19.5) typescript: 6.0.3 @@ -39649,10 +40419,10 @@ snapshots: - '@typescript/native-preview' - core-js - '@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@22.19.15))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@6.0.3)': + '@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@22.19.15))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@6.0.3)': dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - rsbuild-plugin-dts: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@22.19.15))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(typescript@6.0.3) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + rsbuild-plugin-dts: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@22.19.15))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(typescript@6.0.3) optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@22.19.15) typescript: 6.0.3 @@ -39661,10 +40431,10 @@ snapshots: - '@typescript/native-preview' - core-js - '@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2)': + '@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2)': dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - rsbuild-plugin-dts: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(typescript@7.0.2) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + rsbuild-plugin-dts: 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(typescript@7.0.2) optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@26.1.0) typescript: 7.0.2 @@ -39682,6 +40452,68 @@ snapshots: '@microsoft/api-extractor': 7.57.7(@types/node@26.1.0) typescript: 5.9.3 + '@rspack-canary/binding-darwin-arm64@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-darwin-x64@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-linux-arm64-gnu@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-linux-arm64-musl@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-linux-riscv64-gnu@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-linux-riscv64-musl@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-linux-x64-gnu@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-linux-x64-musl@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-wasm32-wasi@2.1.5-canary-54a0d8f3-20260715194831': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@rspack-canary/binding-win32-arm64-msvc@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-win32-ia32-msvc@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding-win32-x64-msvc@2.1.5-canary-54a0d8f3-20260715194831': + optional: true + + '@rspack-canary/binding@2.1.5-canary-54a0d8f3-20260715194831': + optionalDependencies: + '@rspack/binding-darwin-arm64': '@rspack-canary/binding-darwin-arm64@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-darwin-x64': '@rspack-canary/binding-darwin-x64@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-linux-arm64-gnu': '@rspack-canary/binding-linux-arm64-gnu@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-linux-arm64-musl': '@rspack-canary/binding-linux-arm64-musl@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-linux-riscv64-gnu': '@rspack-canary/binding-linux-riscv64-gnu@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-linux-riscv64-musl': '@rspack-canary/binding-linux-riscv64-musl@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-linux-x64-gnu': '@rspack-canary/binding-linux-x64-gnu@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-linux-x64-musl': '@rspack-canary/binding-linux-x64-musl@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-wasm32-wasi': '@rspack-canary/binding-wasm32-wasi@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-win32-arm64-msvc': '@rspack-canary/binding-win32-arm64-msvc@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-win32-ia32-msvc': '@rspack-canary/binding-win32-ia32-msvc@2.1.5-canary-54a0d8f3-20260715194831' + '@rspack/binding-win32-x64-msvc': '@rspack-canary/binding-win32-x64-msvc@2.1.5-canary-54a0d8f3-20260715194831' + + '@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)': + dependencies: + '@rspack/binding': '@rspack-canary/binding@2.1.5-canary-54a0d8f3-20260715194831' + optionalDependencies: + '@module-federation/runtime-tools': link:packages/runtime-tools + '@swc/helpers': 0.5.23 + '@rspack/binding-darwin-arm64@0.7.5': optional: true @@ -39922,9 +40754,9 @@ snapshots: '@rspack/binding-linux-x64-musl@2.1.2': optional: true - '@rspack/binding-wasm32-wasi@1.5.8(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@rspack/binding-wasm32-wasi@1.5.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -40148,7 +40980,7 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.3.9 '@rspack/binding-win32-x64-msvc': 1.3.9 - '@rspack/binding@1.5.8(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@rspack/binding@1.5.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': optionalDependencies: '@rspack/binding-darwin-arm64': 1.5.8 '@rspack/binding-darwin-x64': 1.5.8 @@ -40156,7 +40988,7 @@ snapshots: '@rspack/binding-linux-arm64-musl': 1.5.8 '@rspack/binding-linux-x64-gnu': 1.5.8 '@rspack/binding-linux-x64-musl': 1.5.8 - '@rspack/binding-wasm32-wasi': 1.5.8(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@rspack/binding-wasm32-wasi': 1.5.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) '@rspack/binding-win32-arm64-msvc': 1.5.8 '@rspack/binding-win32-ia32-msvc': 1.5.8 '@rspack/binding-win32-x64-msvc': 1.5.8 @@ -40331,10 +41163,10 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.23 - '@rspack/core@1.5.8(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/helpers@0.5.17)': + '@rspack/core@1.5.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@swc/helpers@0.5.17)': dependencies: '@module-federation/runtime-tools': 0.18.0 - '@rspack/binding': 1.5.8(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@rspack/binding': 1.5.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) '@rspack/lite-tapable': 1.0.1 optionalDependencies: '@swc/helpers': 0.5.17 @@ -40384,48 +41216,69 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.23 - '@rspack/core@2.0.0-beta.0(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)': + '@rspack/core@2.0.0-beta.0(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)': dependencies: '@rspack/binding': 2.0.0-beta.0 '@rspack/lite-tapable': 1.1.0 optionalDependencies: - '@module-federation/runtime-tools': 2.7.0 + '@module-federation/runtime-tools': 2.8.0 '@swc/helpers': 0.5.23 - '@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17)': + '@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17)': dependencies: '@rspack/binding': 2.0.6 optionalDependencies: - '@module-federation/runtime-tools': 2.7.0 + '@module-federation/runtime-tools': 2.8.0 '@swc/helpers': 0.5.17 - '@rspack/core@2.0.8(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)': + '@rspack/core@2.0.6(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)': + dependencies: + '@rspack/binding': 2.0.6 + optionalDependencies: + '@module-federation/runtime-tools': link:packages/runtime-tools + '@swc/helpers': 0.5.23 + + '@rspack/core@2.0.8(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)': dependencies: '@rspack/binding': 2.0.8 optionalDependencies: - '@module-federation/runtime-tools': 2.7.0 + '@module-federation/runtime-tools': 2.8.0 '@swc/helpers': 0.5.23 - '@rspack/core@2.1.2(@module-federation/runtime-tools@0.21.6)(@swc/helpers@0.5.23)': + '@rspack/core@2.0.8(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)': + dependencies: + '@rspack/binding': 2.0.8 + optionalDependencies: + '@module-federation/runtime-tools': link:packages/runtime-tools + '@swc/helpers': 0.5.23 + + '@rspack/core@2.1.2(@module-federation/runtime-tools@2.2.2(node-fetch@2.7.0(encoding@0.1.13)))(@swc/helpers@0.5.23)': dependencies: '@rspack/binding': 2.1.2 optionalDependencies: - '@module-federation/runtime-tools': 0.21.6 + '@module-federation/runtime-tools': 2.2.2(node-fetch@2.7.0(encoding@0.1.13)) '@swc/helpers': 0.5.23 - '@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17)': + '@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17)': dependencies: '@rspack/binding': 2.1.2 optionalDependencies: - '@module-federation/runtime-tools': 2.7.0 + '@module-federation/runtime-tools': 2.8.0 '@swc/helpers': 0.5.17 optional: true - '@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)': + '@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)': dependencies: '@rspack/binding': 2.1.2 optionalDependencies: - '@module-federation/runtime-tools': 2.7.0 + '@module-federation/runtime-tools': 2.8.0 + '@swc/helpers': 0.5.23 + + '@rspack/core@2.1.2(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)': + dependencies: + '@rspack/binding': 2.1.2 + optionalDependencies: + '@module-federation/runtime-tools': link:packages/runtime-tools '@swc/helpers': 0.5.23 '@rspack/dev-server@1.1.1(@rspack/core@1.3.9(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack-cli@5.1.4)(webpack@5.104.1)': @@ -40466,17 +41319,17 @@ snapshots: optionalDependencies: webpack-hot-middleware: 2.26.1 - '@rspack/plugin-react-refresh@2.0.0(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0)': + '@rspack/plugin-react-refresh@2.0.0(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0)': dependencies: react-refresh: 0.18.0 optionalDependencies: - '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17) - '@rspack/plugin-react-refresh@2.0.0(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0)': + '@rspack/plugin-react-refresh@2.0.0(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0)': dependencies: react-refresh: 0.18.0 optionalDependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) '@rspack/plugin-react-refresh@2.0.2(@rspack/core@0.7.5(@swc/helpers@0.5.23))(react-refresh@0.18.0)': dependencies: @@ -40484,31 +41337,82 @@ snapshots: optionalDependencies: '@rspack/core': 0.7.5(@swc/helpers@0.5.23) - '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0)': + '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0)': dependencies: react-refresh: 0.18.0 optionalDependencies: - '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17) - '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0)': + '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-refresh@0.18.0)': dependencies: react-refresh: 0.18.0 optionalDependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17) - '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0)': + '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-refresh@0.18.0)': dependencies: react-refresh: 0.18.0 optionalDependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) + + '@rspack/resolver-binding-darwin-arm64@0.2.8': + optional: true + + '@rspack/resolver-binding-darwin-x64@0.2.8': + optional: true + + '@rspack/resolver-binding-linux-arm64-gnu@0.2.8': + optional: true + + '@rspack/resolver-binding-linux-arm64-musl@0.2.8': + optional: true + + '@rspack/resolver-binding-linux-x64-gnu@0.2.8': + optional: true + + '@rspack/resolver-binding-linux-x64-musl@0.2.8': + optional: true + + '@rspack/resolver-binding-wasm32-wasi@0.2.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@rspack/resolver-binding-win32-arm64-msvc@0.2.8': + optional: true + + '@rspack/resolver-binding-win32-ia32-msvc@0.2.8': + optional: true + + '@rspack/resolver-binding-win32-x64-msvc@0.2.8': + optional: true + + '@rspack/resolver@0.2.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + optionalDependencies: + '@rspack/resolver-binding-darwin-arm64': 0.2.8 + '@rspack/resolver-binding-darwin-x64': 0.2.8 + '@rspack/resolver-binding-linux-arm64-gnu': 0.2.8 + '@rspack/resolver-binding-linux-arm64-musl': 0.2.8 + '@rspack/resolver-binding-linux-x64-gnu': 0.2.8 + '@rspack/resolver-binding-linux-x64-musl': 0.2.8 + '@rspack/resolver-binding-wasm32-wasi': 0.2.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@rspack/resolver-binding-win32-arm64-msvc': 0.2.8 + '@rspack/resolver-binding-win32-ia32-msvc': 0.2.8 + '@rspack/resolver-binding-win32-x64-msvc': 0.2.8 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' - '@rspress/core@2.0.14(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@18.3.28)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2)': + '@rspress/core@2.0.14(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@18.3.28)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2)': dependencies: '@mdx-js/mdx': 3.1.1 '@mdx-js/react': 3.1.1(@types/react@18.3.28)(react@19.2.7) - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - '@rsbuild/plugin-react': 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) - '@rspress/shared': 2.0.14(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + '@rsbuild/plugin-react': 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) + '@rspress/shared': 2.0.14(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@shikijs/rehype': 4.2.0 '@types/unist': 3.0.3 '@unhead/react': 2.1.15(react@19.2.7) @@ -40552,13 +41456,13 @@ snapshots: - micromark-util-types - supports-color - '@rspress/core@2.0.14(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2)': + '@rspress/core@2.0.14(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2)': dependencies: '@mdx-js/mdx': 3.1.1 '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.7) - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - '@rsbuild/plugin-react': 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)) - '@rspress/shared': 2.0.14(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + '@rsbuild/plugin-react': 2.0.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)) + '@rspress/shared': 2.0.14(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@shikijs/rehype': 4.2.0 '@types/unist': 3.0.3 '@unhead/react': 2.1.15(react@19.2.7) @@ -40602,18 +41506,28 @@ snapshots: - micromark-util-types - supports-color - '@rspress/shared@2.0.14(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)': + '@rspress/shared@2.0.14(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)': dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@shikijs/rehype': 4.2.0 unified: 11.0.5 transitivePeerDependencies: - '@module-federation/runtime-tools' - core-js - '@rstest/core@0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)(jsdom@20.0.3)': + '@rstest/core@0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)(jsdom@20.0.3)': + dependencies: + '@rsbuild/core': 2.0.15(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1) + '@types/chai': 5.2.3 + optionalDependencies: + jsdom: 20.0.3 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + - core-js + + '@rstest/core@0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(jsdom@20.0.3)': dependencies: - '@rsbuild/core': 2.0.15(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1) + '@rsbuild/core': 2.0.15(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@types/chai': 5.2.3 optionalDependencies: jsdom: 20.0.3 @@ -40621,9 +41535,9 @@ snapshots: - '@module-federation/runtime-tools' - core-js - '@rstest/core@0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(jsdom@20.0.3)': + '@rstest/core@0.10.6(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)(jsdom@20.0.3)': dependencies: - '@rsbuild/core': 2.0.15(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.0.15(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) '@types/chai': 5.2.3 optionalDependencies: jsdom: 20.0.3 @@ -40860,6 +41774,8 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@socket.io/component-emitter@3.1.2': {} + '@storybook/addon-docs@8.6.18(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))': dependencies: '@mdx-js/react': 3.1.1(@types/react@18.3.28)(react@18.3.1) @@ -42185,6 +43101,10 @@ snapshots: '@types/cookie@0.4.1': {} + '@types/cors@2.8.19': + dependencies: + '@types/node': 20.19.5 + '@types/cross-spawn@6.0.6': dependencies: '@types/node': 20.19.5 @@ -42356,6 +43276,8 @@ snapshots: '@types/estree@0.0.51': {} + '@types/estree@1.0.5': {} + '@types/estree@1.0.8': {} '@types/express-serve-static-core@4.19.8': @@ -42424,9 +43346,9 @@ snapshots: '@types/history@4.7.11': {} - '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14)': + '@types/hoist-non-react-statics@3.3.7(@types/react@18.3.28)': dependencies: - '@types/react': 19.2.14 + '@types/react': 18.3.28 hoist-non-react-statics: 3.3.2 '@types/html-minifier-terser@6.1.0': {} @@ -42474,7 +43396,7 @@ snapshots: '@types/loadable__component@5.13.10': dependencies: - '@types/react': 19.2.14 + '@types/react': 18.3.28 '@types/lodash-es@4.17.12': dependencies: @@ -42515,10 +43437,6 @@ snapshots: dependencies: '@types/node': 20.19.5 - '@types/node-schedule@2.1.7': - dependencies: - '@types/node': 20.19.5 - '@types/node@12.20.55': {} '@types/node@14.18.33': {} @@ -42578,7 +43496,7 @@ snapshots: '@types/react-helmet@6.1.11': dependencies: - '@types/react': 19.2.14 + '@types/react': 18.3.28 '@types/react-router-dom@5.3.3': dependencies: @@ -42589,11 +43507,11 @@ snapshots: '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 19.2.14 + '@types/react': 18.3.28 '@types/react-test-renderer@19.1.0': dependencies: - '@types/react': 19.2.14 + '@types/react': 18.3.28 '@types/react@18.2.79': dependencies: @@ -42664,12 +43582,16 @@ snapshots: '@types/styled-components@5.1.36': dependencies: - '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.14) - '@types/react': 19.2.14 + '@types/hoist-non-react-statics': 3.3.7(@types/react@18.3.28) + '@types/react': 18.3.28 csstype: 3.2.3 '@types/stylis@4.2.0': {} + '@types/tapable@2.3.0': + dependencies: + tapable: 2.3.0 + '@types/tough-cookie@4.0.5': {} '@types/trusted-types@2.0.7': @@ -45048,12 +45970,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.1.1(@babel/core@7.29.7)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)): + babel-loader@10.1.1(@babel/core@7.29.7)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)): dependencies: '@babel/core': 7.29.7 find-up: 5.0.0 optionalDependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) webpack: 5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4) babel-loader@9.2.1(@babel/core@7.29.0)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.19))(esbuild@0.18.20)(webpack-cli@5.1.4)): @@ -45340,6 +46262,8 @@ snapshots: dependencies: '@babel/types': 7.29.7 + background-only@0.0.1: {} + bail@1.0.5: {} bail@2.0.2: {} @@ -45383,6 +46307,8 @@ snapshots: base64-js@1.5.1: {} + base64id@2.0.0: {} + base@0.11.2: dependencies: cache-base: 1.0.1 @@ -45595,6 +46521,8 @@ snapshots: dependencies: pako: 1.0.11 + browserslist-load-config@1.0.3: {} + browserslist-to-es-version@1.4.1: dependencies: browserslist: 4.28.4 @@ -46740,6 +47668,18 @@ snapshots: optionalDependencies: esbuild: 0.28.1 + css-minimizer-webpack-plugin@8.0.0(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + cssnano: 7.1.3(postcss@8.5.10) + jest-worker: 30.4.1 + postcss: 8.5.10 + schema-utils: 4.3.0 + serialize-javascript: 7.0.7 + webpack: 5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4) + optionalDependencies: + esbuild: 0.28.1 + css-select@4.3.0: dependencies: boolbase: 1.0.0 @@ -46929,6 +47869,8 @@ snapshots: csstype@3.1.2: {} + csstype@3.1.3: {} + csstype@3.2.3: {} cuint@0.2.2: {} @@ -47691,6 +48633,25 @@ snapshots: fast-json-parse: 1.0.3 objectorarray: 1.0.5 + engine.io-parser@5.2.3: {} + + engine.io@6.6.9: + dependencies: + '@types/cors': 2.8.19 + '@types/node': 20.19.5 + '@types/ws': 8.5.12 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.6 + debug: 4.4.3(supports-color@8.1.1) + engine.io-parser: 5.2.3 + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + enhanced-resolve@5.16.1: dependencies: graceful-fs: 4.2.11 @@ -49065,8 +50026,6 @@ snapshots: transitivePeerDependencies: - supports-color - exsolve@1.0.8: {} - ext-list@2.2.2: dependencies: mime-db: 1.54.0 @@ -49260,6 +50219,8 @@ snapshots: filesize@10.1.6: {} + filesize@11.0.22: {} + fill-range@4.0.0: dependencies: extend-shallow: 2.0.1 @@ -51813,6 +52774,8 @@ snapshots: jsonify: 0.0.1 object-keys: 1.1.1 + json-stream-stringify@3.0.1: {} + json-stringify-safe@5.0.1: {} json2mq@0.2.0: @@ -51935,6 +52898,11 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.8.3 + launch-editor@2.14.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.10.0 + layout-base@1.0.2: {} layout-base@2.0.1: {} @@ -51954,18 +52922,18 @@ snapshots: less: 4.6.4 webpack: 5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.25.5)(webpack-cli@5.1.4) - less-loader@12.3.3(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(less@4.6.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)): + less-loader@12.3.3(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(less@4.6.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4)): dependencies: less: 4.6.4 optionalDependencies: - '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17) webpack: 5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.17))(esbuild@0.28.1)(webpack-cli@5.1.4) - less-loader@12.3.3(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(less@4.6.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))): + less-loader@12.3.3(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(less@4.6.4)(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1))): dependencies: less: 4.6.4 optionalDependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) webpack: 5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1)) less@4.6.4: @@ -52011,6 +52979,8 @@ snapshots: lines-and-columns@2.0.3: {} + lines-and-columns@2.0.4: {} + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 @@ -53830,12 +54800,6 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-fetch@3.3.0: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 @@ -57176,16 +58140,6 @@ snapshots: react-dom: 19.2.4(react@19.2.4) react-is: 18.1.0 - react-error-boundary@4.1.2(react@18.3.1): - dependencies: - '@babel/runtime': 7.28.2 - react: 18.3.1 - - react-error-boundary@4.1.2(react@19.2.7): - dependencies: - '@babel/runtime': 7.28.2 - react: 19.2.7 - react-error-boundary@5.0.0(react@18.3.1): dependencies: '@babel/runtime': 7.28.2 @@ -57633,15 +58587,15 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) - react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -58291,7 +59245,7 @@ snapshots: transitivePeerDependencies: - typescript - rolldown-plugin-dts@0.22.5(rolldown@1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)): + rolldown-plugin-dts@0.22.5(rolldown@1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)): dependencies: '@babel/generator': 8.0.0-rc.2 '@babel/helper-validator-identifier': 8.0.0-rc.2 @@ -58302,14 +59256,14 @@ snapshots: dts-resolver: 2.1.3 get-tsconfig: 4.13.6 obug: 2.1.1 - rolldown: 1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + rolldown: 1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optionalDependencies: typescript: 6.0.3 vue-tsc: 2.2.12(typescript@6.0.3) transitivePeerDependencies: - oxc-resolver - rolldown-plugin-dts@0.22.5(rolldown@1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(typescript@7.0.2)(vue-tsc@2.2.12(typescript@6.0.3)): + rolldown-plugin-dts@0.22.5(rolldown@1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(typescript@7.0.2)(vue-tsc@2.2.12(typescript@6.0.3)): dependencies: '@babel/generator': 8.0.0-rc.2 '@babel/helper-validator-identifier': 8.0.0-rc.2 @@ -58320,14 +59274,14 @@ snapshots: dts-resolver: 2.1.3 get-tsconfig: 4.13.6 obug: 2.1.1 - rolldown: 1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + rolldown: 1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optionalDependencies: typescript: 7.0.2 vue-tsc: 2.2.12(typescript@6.0.3) transitivePeerDependencies: - oxc-resolver - rolldown@1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): + rolldown@1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): dependencies: '@oxc-project/types': 0.112.0 '@rolldown/pluginutils': 1.0.0-rc.3 @@ -58342,14 +59296,14 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.3 '@rolldown/binding-linux-x64-musl': 1.0.0-rc.3 '@rolldown/binding-openharmony-arm64': 1.0.0-rc.3 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - rolldown@1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): + rolldown@1.0.0-rc.9(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): dependencies: '@oxc-project/types': 0.115.0 '@rolldown/pluginutils': 1.0.0-rc.9 @@ -58366,7 +59320,7 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.9 '@rolldown/binding-linux-x64-musl': 1.0.0-rc.9 '@rolldown/binding-openharmony-arm64': 1.0.0-rc.9 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.9(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.9 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.9 transitivePeerDependencies: @@ -58439,10 +59393,10 @@ snapshots: transitivePeerDependencies: - supports-color - rsbuild-plugin-dts@0.12.4(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@1.5.17(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(typescript@7.0.2): + rsbuild-plugin-dts@0.12.4(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@1.5.17(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(typescript@7.0.2): dependencies: '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 1.5.17(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@rsbuild/core': 1.5.17(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) magic-string: 0.30.21 picocolors: 1.1.1 tinyglobby: 0.2.15 @@ -58451,34 +59405,34 @@ snapshots: '@microsoft/api-extractor': 7.57.7(@types/node@20.19.5) typescript: 7.0.2 - rsbuild-plugin-dts@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1))(typescript@6.0.3): + rsbuild-plugin-dts@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1))(typescript@6.0.3): dependencies: '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1) optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@20.19.5) typescript: 6.0.3 - rsbuild-plugin-dts@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(typescript@6.0.3): + rsbuild-plugin-dts@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(typescript@6.0.3): dependencies: '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@20.19.5) typescript: 6.0.3 - rsbuild-plugin-dts@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@22.19.15))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(typescript@6.0.3): + rsbuild-plugin-dts@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@22.19.15))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(typescript@6.0.3): dependencies: '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@22.19.15) typescript: 6.0.3 - rsbuild-plugin-dts@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(typescript@7.0.2): + rsbuild-plugin-dts@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(typescript@7.0.2): dependencies: '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) optionalDependencies: '@microsoft/api-extractor': 7.57.7(@types/node@26.1.0) typescript: 7.0.2 @@ -58495,12 +59449,12 @@ snapshots: '@microsoft/api-extractor': 7.57.7(@types/node@26.1.0) typescript: 5.9.3 - rsbuild-plugin-html-minifier-terser@1.1.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)): + rsbuild-plugin-html-minifier-terser@1.1.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)): dependencies: '@types/html-minifier-terser': 7.0.2 html-minifier-terser: 7.2.0 optionalDependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) rsbuild-plugin-publint@0.2.1(@rsbuild/core@1.7.3): dependencies: @@ -58509,20 +59463,22 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.7.3 - rsbuild-plugin-rsc@0.1.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + rsbuild-plugin-rsc@0.1.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-server-dom-rspack@0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - react-server-dom-rspack: 0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + react-server-dom-rspack: 0.0.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rsbuild-plugin-rsc@0.1.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + rsbuild-plugin-rsc@0.1.1(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(react-server-dom-rspack@0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - react-server-dom-rspack: 0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rsbuild/core': 2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + react-server-dom-rspack: 0.0.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rslog@1.2.3: {} rslog@1.3.2: {} + rslog@2.3.0: {} + rspack-manifest-plugin@5.0.3(@rspack/core@1.7.9(@swc/helpers@0.5.17)): dependencies: '@rspack/lite-tapable': 1.1.2 @@ -58535,29 +59491,29 @@ snapshots: optionalDependencies: '@rspack/core': 1.7.9(@swc/helpers@0.5.19) - rspack-manifest-plugin@5.2.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17)): + rspack-manifest-plugin@5.2.2(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17)): dependencies: '@rspack/lite-tapable': 1.1.2 optionalDependencies: - '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17) - rspack-manifest-plugin@5.2.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23)): + rspack-manifest-plugin@5.2.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)): dependencies: '@rspack/lite-tapable': 1.1.2 optionalDependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) - rspack-vue-loader@17.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2)): + rspack-vue-loader@17.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(vue@3.5.30(typescript@7.0.2)): dependencies: '@rspack/lite-tapable': 1.1.0 chalk: 4.1.2 optionalDependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) vue: 3.5.30(typescript@7.0.2) - rstest-fetch-mock@0.1.0(@rstest/core@0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)(jsdom@20.0.3)): + rstest-fetch-mock@0.1.0(@rstest/core@0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)(jsdom@20.0.3)): dependencies: - '@rstest/core': 0.10.6(@module-federation/runtime-tools@2.7.0)(core-js@3.36.1)(jsdom@20.0.3) + '@rstest/core': 0.10.6(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)(jsdom@20.0.3) run-applescript@7.1.0: {} @@ -58919,6 +59875,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.5: {} + send@0.19.2: dependencies: debug: 2.6.9 @@ -59115,6 +60073,8 @@ snapshots: shell-exec@1.0.2: {} + shell-quote@1.10.0: {} + shell-quote@1.8.3: {} shiki@4.2.0: @@ -59242,6 +60202,36 @@ snapshots: transitivePeerDependencies: - supports-color + socket.io-adapter@2.5.8: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.7: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.6 + debug: 4.3.4 + engine.io: 6.6.9 + socket.io-adapter: 2.5.8 + socket.io-parser: 4.2.7 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 @@ -59423,18 +60413,18 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook-addon-rslib@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2))(storybook-builder-rsbuild@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2))(typescript@7.0.2): + storybook-addon-rslib@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rslib/core@0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2))(storybook-builder-rsbuild@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2))(typescript@7.0.2): dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - '@rslib/core': 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)(typescript@7.0.2) - storybook-builder-rsbuild: 1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + '@rslib/core': 0.23.2(@microsoft/api-extractor@7.57.7(@types/node@26.1.0))(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)(typescript@7.0.2) + storybook-builder-rsbuild: 1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2) optionalDependencies: typescript: 7.0.2 - storybook-builder-rsbuild@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2): + storybook-builder-rsbuild@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2): dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - '@rsbuild/plugin-type-check': 1.5.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + '@rsbuild/plugin-type-check': 1.5.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2) '@storybook/addon-docs': 8.6.18(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1)) '@storybook/core-webpack': 8.6.18(storybook@8.6.17(prettier@3.8.1)) browser-assert: 1.2.1 @@ -59446,7 +60436,7 @@ snapshots: magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 - rsbuild-plugin-html-minifier-terser: 1.1.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0)) + rsbuild-plugin-html-minifier-terser: 1.1.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0)) sirv: 2.0.4 storybook: 8.6.17(prettier@3.8.1) ts-dedent: 2.2.0 @@ -59461,10 +60451,10 @@ snapshots: - '@typescript/native-preview' - tslib - storybook-react-rsbuild@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.25.5)(webpack-cli@5.1.4)): + storybook-react-rsbuild@1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.25.5)(webpack-cli@5.1.4)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) '@storybook/react': 8.6.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.17(prettier@3.8.1))(typescript@7.0.2) '@storybook/react-docgen-typescript-plugin': 1.0.1(typescript@7.0.2)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.25.5)(webpack-cli@5.1.4)) '@types/node': 18.19.130 @@ -59476,7 +60466,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) resolve: 1.22.11 storybook: 8.6.17(prettier@3.8.1) - storybook-builder-rsbuild: 1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2) + storybook-builder-rsbuild: 1.0.3(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/react@18.3.28)(storybook@8.6.17(prettier@3.8.1))(tslib@2.8.1)(typescript@7.0.2) tsconfig-paths: 4.2.0 optionalDependencies: typescript: 7.0.2 @@ -60151,6 +61141,8 @@ snapshots: tapable@2.3.0: {} + tapable@2.3.3: {} + tar-fs@2.1.4: dependencies: chownr: 1.1.4 @@ -60476,6 +61468,8 @@ snapshots: tinypool@1.1.1: {} + tinypool@2.1.0: {} + tinyspy@2.2.1: {} tldts-core@6.1.86: {} @@ -60615,7 +61609,7 @@ snapshots: transitivePeerDependencies: - tslib - ts-checker-rspack-plugin@1.5.1(@rspack/core@2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17))(tslib@2.8.1)(typescript@7.0.2): + ts-checker-rspack-plugin@1.5.1(@rspack/core@2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17))(tslib@2.8.1)(typescript@7.0.2): dependencies: '@rspack/lite-tapable': 1.1.2 chokidar: 3.6.0 @@ -60623,11 +61617,11 @@ snapshots: picocolors: 1.1.1 typescript: 7.0.2 optionalDependencies: - '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.6(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.17) transitivePeerDependencies: - tslib - ts-checker-rspack-plugin@1.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2): + ts-checker-rspack-plugin@1.5.1(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(tslib@2.8.1)(typescript@7.0.2): dependencies: '@rspack/lite-tapable': 1.1.2 chokidar: 3.6.0 @@ -60635,7 +61629,7 @@ snapshots: picocolors: 1.1.1 typescript: 7.0.2 optionalDependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) transitivePeerDependencies: - tslib @@ -60925,7 +61919,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdown@0.20.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(publint@0.3.18)(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)): + tsdown@0.20.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(publint@0.3.18)(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -60935,14 +61929,14 @@ snapshots: import-without-cache: 0.2.5 obug: 2.1.1 picomatch: 4.0.3 - rolldown: 1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) - rolldown-plugin-dts: 0.22.5(rolldown@1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)) + rolldown: 1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + rolldown-plugin-dts: 0.22.5(rolldown@1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(typescript@6.0.3)(vue-tsc@2.2.12(typescript@6.0.3)) semver: 7.7.4 tinyexec: 1.0.4 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig-core: 7.5.0 - unrun: 0.2.32(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + unrun: 0.2.32(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optionalDependencies: publint: 0.3.18 typescript: 6.0.3 @@ -60955,7 +61949,7 @@ snapshots: - synckit - vue-tsc - tsdown@0.20.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(publint@0.3.18)(typescript@7.0.2)(vue-tsc@2.2.12(typescript@6.0.3)): + tsdown@0.20.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(publint@0.3.18)(typescript@7.0.2)(vue-tsc@2.2.12(typescript@6.0.3)): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -60965,14 +61959,14 @@ snapshots: import-without-cache: 0.2.5 obug: 2.1.1 picomatch: 4.0.3 - rolldown: 1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) - rolldown-plugin-dts: 0.22.5(rolldown@1.0.0-rc.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(typescript@7.0.2)(vue-tsc@2.2.12(typescript@6.0.3)) + rolldown: 1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + rolldown-plugin-dts: 0.22.5(rolldown@1.0.0-rc.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2))(typescript@7.0.2)(vue-tsc@2.2.12(typescript@6.0.3)) semver: 7.7.4 tinyexec: 1.0.4 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig-core: 7.5.0 - unrun: 0.2.32(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + unrun: 0.2.32(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optionalDependencies: publint: 0.3.18 typescript: 7.0.2 @@ -61156,7 +62150,7 @@ snapshots: types-react-dom@19.0.0-rc.1: dependencies: - '@types/react': 19.2.14 + '@types/react': 18.3.28 types-react@19.0.0-rc.1: dependencies: @@ -61464,9 +62458,9 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - unrun@0.2.32(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): + unrun@0.2.32(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): dependencies: - rolldown: 1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + rolldown: 1.0.0-rc.9(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -62083,6 +63077,8 @@ snapshots: dependencies: makeerror: 1.0.12 + wasm-feature-detect@1.8.0: {} + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 @@ -63148,18 +64144,18 @@ snapshots: dependencies: tslib: 2.8.1 - zephyr-rsbuild-plugin@1.1.2(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)): + zephyr-rsbuild-plugin@1.1.2(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)): dependencies: - '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0) - zephyr-rspack-plugin: 1.1.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0) + zephyr-rspack-plugin: 1.1.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)) transitivePeerDependencies: - '@rspack/core' - supports-color - webpack - zephyr-rspack-plugin@1.1.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)): + zephyr-rspack-plugin@1.1.2(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)): dependencies: - '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23) + '@rspack/core': 2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) tslib: 2.8.1 zephyr-agent: 1.1.2 zephyr-xpack-internal: 1.1.2(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)) @@ -63167,13 +64163,13 @@ snapshots: - supports-color - webpack - zephyr-rspress-plugin@1.1.2(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@rspress/core@2.0.14(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)): + zephyr-rspress-plugin@1.1.2(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@rspress/core@2.0.14(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)): dependencies: - '@rspress/core': 2.0.14(@module-federation/runtime-tools@2.7.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2) + '@rspress/core': 2.0.14(@module-federation/runtime-tools@2.8.0)(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.49.0)(micromark-util-types@2.0.2)(micromark@4.0.2) tslib: 2.8.1 zephyr-agent: 1.1.2 zephyr-edge-contract: 1.1.2 - zephyr-rsbuild-plugin: 1.1.2(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.7.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.7.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)) + zephyr-rsbuild-plugin: 1.1.2(@rsbuild/core@2.1.4(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))(@rspack/core@2.1.2(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)) zephyr-xpack-internal: 1.1.2(webpack@5.104.1(@swc/core@1.15.41(@swc/helpers@0.5.23))(esbuild@0.28.1)(webpack-cli@5.1.4)) transitivePeerDependencies: - '@rsbuild/core' diff --git a/tools/scripts/ci-e2e-suites.mjs b/tools/scripts/ci-e2e-suites.mjs index 8edbe57367e..d92fba8d1a5 100644 --- a/tools/scripts/ci-e2e-suites.mjs +++ b/tools/scripts/ci-e2e-suites.mjs @@ -12,6 +12,10 @@ export const E2E_SUITE_DEFINITIONS = { 'tools/scripts/run-manifest-e2e.mjs', ], }, + lynx: { + appNames: ['lynx-module-federation-demo'], + inputs: ['.github/workflows/e2e-lynx.yml'], + }, metro: { appNames: ['example-host'], inputs: [ diff --git a/tools/scripts/ci-local.mjs b/tools/scripts/ci-local.mjs index 3a39eadfd4e..1ae9deee7f1 100644 --- a/tools/scripts/ci-local.mjs +++ b/tools/scripts/ci-local.mjs @@ -219,6 +219,18 @@ const jobs = [ ), ], }, + { + name: 'e2e-lynx', + env: SKIP_DEVTOOLS_POSTINSTALL_ENV, + steps: [ + ...e2eSetupSteps('lynx', { cypress: false }), + step('E2E Test for Lynx Module Federation Demo', (ctx) => + runWhenAffected(ctx, () => + runCommand('pnpm', ['run', 'e2e:lynx'], ctx), + ), + ), + ], + }, { name: 'e2e-manifest', env: SKIP_DEVTOOLS_POSTINSTALL_ENV, From a045ec0bdbdb0436c3164cb57bd7074deadeebc8 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 05:24:03 +0000 Subject: [PATCH 02/68] fix(ci): gate Lynx E2E suite --- .github/workflows/build-and-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 3f65992eec7..b1c3a44d415 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -151,6 +151,7 @@ jobs: e2e-lynx: needs: checkout-install + if: ${{ fromJSON(needs.checkout-install.outputs.e2e_suites).lynx }} uses: ./.github/workflows/e2e-lynx.yml secrets: inherit From 59e4f5e568347a48511fbcacefc97fdc83e63fc7 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 06:37:20 +0000 Subject: [PATCH 03/68] feat(lynx): add standalone iOS application --- .github/workflows/e2e-lynx.yml | 79 +++ apps/lynx-module-federation-demo/.gitignore | 6 + apps/lynx-module-federation-demo/README.md | 62 ++- .../ios/Artwork/OrbitControl.svg | 7 + apps/lynx-module-federation-demo/ios/Gemfile | 3 + .../ios/Gemfile.lock | 134 +++++ .../OrbitControl.xcodeproj/project.pbxproj | 482 ++++++++++++++++++ .../xcschemes/OrbitControl.xcscheme | 32 ++ .../ios/OrbitControl/AppDelegate.swift | 21 + .../AppIcon.appiconset/Contents.json | 14 + .../AppIcon.appiconset/OrbitControl.png | Bin 0 -> 36656 bytes .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 28 + .../ios/OrbitControl/Info.Debug.plist | 52 ++ .../ios/OrbitControl/Info.plist | 34 ++ .../OrbitControl-Bridging-Header.h | 4 + .../ios/OrbitControl/OrbitResourceFetcher.h | 20 + .../ios/OrbitControl/OrbitResourceFetcher.m | 167 ++++++ .../ios/OrbitControl/ViewController.swift | 75 +++ .../OrbitControlUITests.swift | 36 ++ apps/lynx-module-federation-demo/ios/Podfile | 24 + .../ios/Podfile.lock | 158 ++++++ .../ios/UPSTREAM.md | 20 + apps/lynx-module-federation-demo/package.json | 8 +- .../scripts/sync-ios-bundle.mjs | 20 + .../src/app/App.tsx | 17 +- .../test/ios-project.mjs | 63 +++ .../test/ios/run.mjs | 176 +++++++ 28 files changed, 1734 insertions(+), 14 deletions(-) create mode 100644 apps/lynx-module-federation-demo/ios/Artwork/OrbitControl.svg create mode 100644 apps/lynx-module-federation-demo/ios/Gemfile create mode 100644 apps/lynx-module-federation-demo/ios/Gemfile.lock create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/AppDelegate.swift create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/AppIcon.appiconset/OrbitControl.png create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/Contents.json create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/Base.lproj/LaunchScreen.storyboard create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/Info.Debug.plist create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/Info.plist create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitControl-Bridging-Header.h create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.h create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift create mode 100644 apps/lynx-module-federation-demo/ios/Podfile create mode 100644 apps/lynx-module-federation-demo/ios/Podfile.lock create mode 100644 apps/lynx-module-federation-demo/ios/UPSTREAM.md create mode 100644 apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs create mode 100644 apps/lynx-module-federation-demo/test/ios-project.mjs create mode 100644 apps/lynx-module-federation-demo/test/ios/run.mjs diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 0bd8ca23b8e..ed098562c36 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -8,6 +8,8 @@ jobs: e2e-lynx: runs-on: ubuntu-latest timeout-minutes: 30 + outputs: + run-e2e: ${{ steps.check-ci.outputs.run-e2e }} steps: - name: Checkout Repository uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 @@ -68,6 +70,27 @@ jobs: if: steps.check-ci.outputs.run-e2e == 'true' run: pnpm --filter lynx-module-federation-demo run e2e:native + - name: Validate standalone iOS project policy + if: steps.check-ci.outputs.run-e2e == 'true' + run: pnpm --filter lynx-module-federation-demo run test:ios-project + + - name: Prepare iOS native artifacts + if: steps.check-ci.outputs.run-e2e == 'true' + env: + LYNX_REMOTE_ORIGIN: http://127.0.0.1:3000 + run: pnpm --filter lynx-module-federation-demo run build:native + + - name: Upload native artifacts for iOS + if: steps.check-ci.outputs.run-e2e == 'true' + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: lynx-native-ios-input + path: | + apps/lynx-module-federation-demo/dist/host-native/ + apps/lynx-module-federation-demo/dist/remote-native/ + if-no-files-found: error + retention-days: 1 + - name: Run real Lynx for Web E2E if: steps.check-ci.outputs.run-e2e == 'true' run: pnpm --filter lynx-module-federation-demo run e2e:web @@ -85,3 +108,59 @@ jobs: apps/lynx-module-federation-demo/dist/remote-web/ if-no-files-found: ignore retention-days: 7 + + e2e-lynx-ios: + needs: e2e-lynx + if: needs.e2e-lynx.outputs.run-e2e == 'true' + runs-on: macos-15 + timeout-minutes: 60 + env: + DEVELOPER_DIR: /Applications/Xcode_16.4.app/Contents/Developer + NO_COLOR: 1 + RUBY_VERSION: 3.4.9 + steps: + - name: Checkout Repository + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + fetch-depth: 0 + + - name: Setup Node.js 24 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 + with: + node-version: '24' + + - name: Setup Ruby + uses: ruby/setup-ruby@97ecb7b512899eb71ab1bf2310a624c6f1589ac6 # v1 + with: + ruby-version: ${{ env.RUBY_VERSION }} + + - name: Download native artifacts + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: lynx-native-ios-input + path: apps/lynx-module-federation-demo/dist + + - name: Embed native host bundle + run: node apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs + + - name: Install iOS dependencies + working-directory: apps/lynx-module-federation-demo/ios + run: | + bundle config set path vendor/bundle + bundle install --jobs 4 --retry 3 + bundle exec pod install --deployment --repo-update + + - name: Run standalone iOS federation E2E + run: node apps/lynx-module-federation-demo/test/ios/run.mjs + + - name: Upload iOS E2E artifacts + if: always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: lynx-ios-e2e + path: | + apps/lynx-module-federation-demo/ios/build/OrbitControl.xcresult/ + apps/lynx-module-federation-demo/ios/build/orbit-control.png + apps/lynx-module-federation-demo/ios/build/requests.json + if-no-files-found: ignore + retention-days: 7 diff --git a/apps/lynx-module-federation-demo/.gitignore b/apps/lynx-module-federation-demo/.gitignore index 17c7c106e9b..2bc0dd23e5b 100644 --- a/apps/lynx-module-federation-demo/.gitignore +++ b/apps/lynx-module-federation-demo/.gitignore @@ -1,3 +1,9 @@ dist/ .turbo/ test/real-web/artifacts/ +ios/.bundle/ +ios/Pods/ +ios/OrbitControl.xcworkspace/ +ios/Resources/main.lynx.bundle +ios/build/ +ios/vendor/bundle/ diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index fd3a4a0012e..7182b1ab5a7 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -3,6 +3,8 @@ This is an official Rspeedy + ReactLynx application, not a browser-only simulation. It includes: +- a standalone UIKit iOS application derived from Lynx's official + `HelloLynxSwift` starter; - a native background host and remote built as `.lynx.bundle` artifacts; - a Lynx for Web host mounted in the official `` custom element; - ordinary `import('catalog/Card')` and runtime `loadRemote()` consumers; @@ -26,7 +28,42 @@ The host never addresses a generated `remoteEntry.js` directly. Both import styles resolve the manifest, whose `metaData.remoteEntry` names the public `.lynx.bundle` container. Lazy expose bundles are fetched separately. -## Run the native app +## Run the standalone iOS app + +The app under `ios/` is a real iPhone/iPad application embedding `LynxView`. +It does not require Lynx Explorer. Its exact official starter source and commit +are recorded in `ios/UPSTREAM.md`. + +On macOS: + +```sh +pnpm ios:prepare +pnpm ios:pods +pnpm ios:open +pnpm dev +``` + +Run the `OrbitControl` scheme in Xcode. The Debug app loads +`http://localhost:3000/main.lynx.bundle`; set the `LYNX_BUNDLE_URL` scheme +environment variable to a LAN-reachable URL for a physical device. The shell +injects both Lynx template and generic resource fetchers, so the root Bundle, +federated container, and Lazy Bundles can arrive over HTTP(S). + +Release builds embed `ios/Resources/main.lynx.bundle` and retain strict ATS +defaults. Build the host with the production manifest origin before syncing it: + +```sh +LYNX_REMOTE_ORIGIN=https://cdn.example.com/catalog/ pnpm build:native +pnpm ios:sync +``` + +Only the host bundle is embedded. The manifest, container, and lazy expose +bundles remain separately deployable HTTP(S) artifacts. The iOS simulator E2E +launches the app, taps **Load remote catalog**, verifies compiled imports, +runtime `loadRemote()`, and shared singleton identity, then checks every native +bundle request observed by the test server. + +## Run with Lynx Explorer Build the official native host and remote and validate their manifests: @@ -48,12 +85,11 @@ Explorer on the device and scan it. The phone must be able to reach `:3000`; `127.0.0.1` refers to the phone itself and will not work. Set `CATALOG_NATIVE_MANIFEST_URL` when the remote manifest is hosted elsewhere. -`e2e:native` is intentionally named artifact validation: CI has no iOS or -Android Lynx runtime. It compiles the real Rspeedy host and remote, verifies -both binary bundles, checks the manifest's background expose/share layer -metadata, then launches the dev server and fetches the host, manifest, -container, and every lazy bundle over HTTP. Scanning the QR runs those same -served artifacts in the native runtime. +`e2e:native` is artifact and transport validation. It compiles the real Rspeedy +host and remote, verifies both binary bundles, checks the manifest's background +expose/share layer metadata, then launches the dev server and fetches the host, +manifest, container, and every lazy bundle over HTTP. The macOS CI job adds a +real iOS Simulator runtime test of those artifacts. ## Run the real Lynx Web E2E @@ -81,11 +117,13 @@ paths with `LYNX_HOST_WEB_BUNDLE`, `LYNX_REMOTE_MANIFEST`, ## Test matrix -| Command | Evidence | -| ----------------- | ---------------------------------------------------------- | -| `pnpm e2e:native` | Real native Rspeedy builds plus binary/manifest validation | -| `pnpm e2e:web` | Real official `` browser runtime E2E | -| `pnpm test` | Both official Rspeedy checks | +| Command | Evidence | +| ----------------------- | ---------------------------------------------------------------- | +| `pnpm e2e:native` | Real native Rspeedy builds plus binary/manifest validation | +| `pnpm e2e:ios` | Standalone UIKit app + iOS Simulator federation/runtime E2E | +| `pnpm e2e:web` | Real official `` browser runtime E2E | +| `pnpm test:ios-project` | Cross-platform iOS project, provenance, pod, and ATS policy gate | +| `pnpm test` | Cross-platform native artifact and Lynx Web checks | The web remote enables `mainThread: true`, so each exposure has background and main-thread variants. The demo deliberately scopes `orbit-shared-state` to diff --git a/apps/lynx-module-federation-demo/ios/Artwork/OrbitControl.svg b/apps/lynx-module-federation-demo/ios/Artwork/OrbitControl.svg new file mode 100644 index 00000000000..756a969a304 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/Artwork/OrbitControl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/lynx-module-federation-demo/ios/Gemfile b/apps/lynx-module-federation-demo/ios/Gemfile new file mode 100644 index 00000000000..dfdcb67ca47 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' + +gem 'cocoapods', '1.16.2' diff --git a/apps/lynx-module-federation-demo/ios/Gemfile.lock b/apps/lynx-module-federation-demo/ios/Gemfile.lock new file mode 100644 index 00000000000..fe59c0580d5 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/Gemfile.lock @@ -0,0 +1,134 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.8) + activesupport (7.2.3.1) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1, < 6) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (4.1.2) + claide (1.1.0) + cocoapods (1.16.2) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.16.2) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.27.0, < 2.0) + cocoapods-core (1.16.2) + activesupport (>= 5.0, < 8) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (2.1) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.3.7) + connection_pool (3.0.2) + drb (2.2.3) + escape (0.0.4) + ethon (0.18.0) + ffi (>= 1.15.0) + logger + ffi (1.17.4) + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-aarch64-linux-musl) + ffi (1.17.4-arm-linux-gnu) + ffi (1.17.4-arm-linux-musl) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x86-linux-gnu) + ffi (1.17.4-x86-linux-musl) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) + ffi (1.17.4-x86_64-linux-musl) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.9.0) + mutex_m + i18n (1.15.2) + concurrent-ruby (~> 1.0) + json (2.21.1) + logger (1.7.0) + minitest (5.27.0) + molinillo (0.8.0) + mutex_m (0.3.0) + nanaimo (0.4.0) + nap (1.1.0) + netrc (0.11.0) + nkf (0.3.0) + public_suffix (4.0.7) + rexml (3.4.4) + ruby-macho (2.5.1) + securerandom (0.4.1) + typhoeus (1.6.0) + ethon (>= 0.18.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcodeproj (1.28.1) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + base64 + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.4.0) + nkf + rexml (>= 3.3.6, < 4.0) + +PLATFORMS + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-musl + arm64-darwin + ruby + x86-linux-gnu + x86-linux-musl + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + cocoapods (= 1.16.2) + +BUNDLED WITH + 2.6.9 diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..5806c92123f --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj @@ -0,0 +1,482 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 0D3C69BC3F0039D57FBCE3E2 /* libPods-OrbitControl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A53B1B55000D34C4A561687 /* libPods-OrbitControl.a */; }; + 100000000000000000000001 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 100000000000000000000011 /* AppDelegate.swift */; }; + 100000000000000000000002 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 100000000000000000000012 /* ViewController.swift */; }; + 100000000000000000000003 /* OrbitResourceFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 100000000000000000000014 /* OrbitResourceFetcher.m */; }; + 100000000000000000000004 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 100000000000000000000018 /* LaunchScreen.storyboard */; }; + 100000000000000000000005 /* main.lynx.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 100000000000000000000019 /* main.lynx.bundle */; }; + 100000000000000000000006 /* OrbitControlUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001A /* OrbitControlUITests.swift */; }; + 100000000000000000000007 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001C /* Assets.xcassets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 100000000000000000000020 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 100000000000000000000030 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 100000000000000000000040; + remoteInfo = OrbitControl; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 100000000000000000000010 /* OrbitControl.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OrbitControl.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 100000000000000000000011 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 100000000000000000000012 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 100000000000000000000013 /* OrbitResourceFetcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OrbitResourceFetcher.h; sourceTree = ""; }; + 100000000000000000000014 /* OrbitResourceFetcher.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OrbitResourceFetcher.m; sourceTree = ""; }; + 100000000000000000000015 /* OrbitControl-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OrbitControl-Bridging-Header.h"; sourceTree = ""; }; + 100000000000000000000016 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 100000000000000000000017 /* Info.Debug.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.Debug.plist; sourceTree = ""; }; + 100000000000000000000018 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 100000000000000000000019 /* main.lynx.bundle */ = {isa = PBXFileReference; lastKnownFileType = file; path = main.lynx.bundle; sourceTree = ""; }; + 10000000000000000000001A /* OrbitControlUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrbitControlUITests.swift; sourceTree = ""; }; + 10000000000000000000001B /* OrbitControlUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OrbitControlUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 10000000000000000000001C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 2A53B1B55000D34C4A561687 /* libPods-OrbitControl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OrbitControl.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CA6D515EC78DF0FF9866EA0 /* Pods-OrbitControl.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OrbitControl.debug.xcconfig"; path = "Target Support Files/Pods-OrbitControl/Pods-OrbitControl.debug.xcconfig"; sourceTree = ""; }; + 89120448DFA86FDA0491C6AB /* Pods-OrbitControl.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OrbitControl.release.xcconfig"; path = "Target Support Files/Pods-OrbitControl/Pods-OrbitControl.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 100000000000000000000050 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D3C69BC3F0039D57FBCE3E2 /* libPods-OrbitControl.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 100000000000000000000051 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 100000000000000000000060 = { + isa = PBXGroup; + children = ( + 100000000000000000000061 /* OrbitControl */, + 100000000000000000000062 /* Resources */, + 100000000000000000000063 /* OrbitControlUITests */, + 100000000000000000000064 /* Products */, + E38B361A9360FB49B8107C77 /* Pods */, + 637A738AE6E27E006103F4CC /* Frameworks */, + ); + sourceTree = ""; + }; + 100000000000000000000061 /* OrbitControl */ = { + isa = PBXGroup; + children = ( + 100000000000000000000011 /* AppDelegate.swift */, + 100000000000000000000012 /* ViewController.swift */, + 100000000000000000000013 /* OrbitResourceFetcher.h */, + 100000000000000000000014 /* OrbitResourceFetcher.m */, + 100000000000000000000015 /* OrbitControl-Bridging-Header.h */, + 100000000000000000000016 /* Info.plist */, + 100000000000000000000017 /* Info.Debug.plist */, + 100000000000000000000018 /* LaunchScreen.storyboard */, + 10000000000000000000001C /* Assets.xcassets */, + ); + path = OrbitControl; + sourceTree = ""; + }; + 100000000000000000000062 /* Resources */ = { + isa = PBXGroup; + children = ( + 100000000000000000000019 /* main.lynx.bundle */, + ); + path = Resources; + sourceTree = ""; + }; + 100000000000000000000063 /* OrbitControlUITests */ = { + isa = PBXGroup; + children = ( + 10000000000000000000001A /* OrbitControlUITests.swift */, + ); + path = OrbitControlUITests; + sourceTree = ""; + }; + 100000000000000000000064 /* Products */ = { + isa = PBXGroup; + children = ( + 100000000000000000000010 /* OrbitControl.app */, + 10000000000000000000001B /* OrbitControlUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 637A738AE6E27E006103F4CC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2A53B1B55000D34C4A561687 /* libPods-OrbitControl.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + E38B361A9360FB49B8107C77 /* Pods */ = { + isa = PBXGroup; + children = ( + 4CA6D515EC78DF0FF9866EA0 /* Pods-OrbitControl.debug.xcconfig */, + 89120448DFA86FDA0491C6AB /* Pods-OrbitControl.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 100000000000000000000040 /* OrbitControl */ = { + isa = PBXNativeTarget; + buildConfigurationList = 100000000000000000000070 /* Build configuration list for PBXNativeTarget "OrbitControl" */; + buildPhases = ( + 28AC290F0830F258FCA83BC2 /* [CP] Check Pods Manifest.lock */, + 100000000000000000000080 /* Sources */, + 100000000000000000000050 /* Frameworks */, + 100000000000000000000081 /* Resources */, + 99866C7BB9F0FB220A1EC64C /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OrbitControl; + productName = OrbitControl; + productReference = 100000000000000000000010 /* OrbitControl.app */; + productType = "com.apple.product-type.application"; + }; + 100000000000000000000041 /* OrbitControlUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 100000000000000000000071 /* Build configuration list for PBXNativeTarget "OrbitControlUITests" */; + buildPhases = ( + 100000000000000000000082 /* Sources */, + 100000000000000000000051 /* Frameworks */, + 100000000000000000000083 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 100000000000000000000090 /* PBXTargetDependency */, + ); + name = OrbitControlUITests; + productName = OrbitControlUITests; + productReference = 10000000000000000000001B /* OrbitControlUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 100000000000000000000030 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1640; + LastUpgradeCheck = 1640; + TargetAttributes = { + 100000000000000000000040 = { + CreatedOnToolsVersion = 16.4; + }; + 100000000000000000000041 = { + CreatedOnToolsVersion = 16.4; + TestTargetID = 100000000000000000000040; + }; + }; + }; + buildConfigurationList = 100000000000000000000072 /* Build configuration list for PBXProject "OrbitControl" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 100000000000000000000060; + productRefGroup = 100000000000000000000064 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 100000000000000000000040 /* OrbitControl */, + 100000000000000000000041 /* OrbitControlUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 100000000000000000000081 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 100000000000000000000004 /* LaunchScreen.storyboard in Resources */, + 100000000000000000000005 /* main.lynx.bundle in Resources */, + 100000000000000000000007 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 100000000000000000000083 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 28AC290F0830F258FCA83BC2 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-OrbitControl-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 99866C7BB9F0FB220A1EC64C /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-OrbitControl/Pods-OrbitControl-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-OrbitControl/Pods-OrbitControl-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-OrbitControl/Pods-OrbitControl-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 100000000000000000000080 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 100000000000000000000001 /* AppDelegate.swift in Sources */, + 100000000000000000000002 /* ViewController.swift in Sources */, + 100000000000000000000003 /* OrbitResourceFetcher.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 100000000000000000000082 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 100000000000000000000006 /* OrbitControlUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 100000000000000000000090 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 100000000000000000000040 /* OrbitControl */; + targetProxy = 100000000000000000000020 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1000000000000000000000A0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 1000000000000000000000A1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 1000000000000000000000A2 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4CA6D515EC78DF0FF9866EA0 /* Pods-OrbitControl.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = OrbitControl/Info.Debug.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = org.modulefederation.lynx.demo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "OrbitControl/OrbitControl-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1000000000000000000000A3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 89120448DFA86FDA0491C6AB /* Pods-OrbitControl.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = OrbitControl/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = org.modulefederation.lynx.demo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "OrbitControl/OrbitControl-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 1000000000000000000000A4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + PRODUCT_BUNDLE_IDENTIFIER = org.modulefederation.lynx.demo.uitests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = OrbitControl; + }; + name = Debug; + }; + 1000000000000000000000A5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + PRODUCT_BUNDLE_IDENTIFIER = org.modulefederation.lynx.demo.uitests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = OrbitControl; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 100000000000000000000070 /* Build configuration list for PBXNativeTarget "OrbitControl" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1000000000000000000000A2 /* Debug */, + 1000000000000000000000A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 100000000000000000000071 /* Build configuration list for PBXNativeTarget "OrbitControlUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1000000000000000000000A4 /* Debug */, + 1000000000000000000000A5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 100000000000000000000072 /* Build configuration list for PBXProject "OrbitControl" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1000000000000000000000A0 /* Debug */, + 1000000000000000000000A1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 100000000000000000000030 /* Project object */; +} diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme new file mode 100644 index 00000000000..89de9fd1c94 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/AppDelegate.swift b/apps/lynx-module-federation-demo/ios/OrbitControl/AppDelegate.swift new file mode 100644 index 00000000000..6624bad4921 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/AppDelegate.swift @@ -0,0 +1,21 @@ +// Derived from the official Lynx HelloLynxSwift starter (Apache-2.0). + +import UIKit + +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + LynxEnv.sharedInstance() + + let window = UIWindow(frame: UIScreen.main.bounds) + window.rootViewController = ViewController() + window.makeKeyAndVisible() + self.window = window + return true + } +} diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000000..3eae7b620aa --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images": [ + { + "filename": "OrbitControl.png", + "idiom": "universal", + "platform": "ios", + "size": "1024x1024" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/AppIcon.appiconset/OrbitControl.png b/apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/AppIcon.appiconset/OrbitControl.png new file mode 100644 index 0000000000000000000000000000000000000000..b2789f9df5327ef5b4738296e776a6dda6202474 GIT binary patch literal 36656 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 literal 0 HcmV?d00001 diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/Contents.json b/apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/Contents.json new file mode 100644 index 00000000000..74d6a722cf3 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info": { + "author": "xcode", + "version": 1 + } +} diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/Base.lproj/LaunchScreen.storyboard b/apps/lynx-module-federation-demo/ios/OrbitControl/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000000..b4262ae4136 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/Info.Debug.plist b/apps/lynx-module-federation-demo/ios/OrbitControl/Info.Debug.plist new file mode 100644 index 00000000000..4706904f567 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/Info.Debug.plist @@ -0,0 +1,52 @@ + + + + + CFBundleDisplayName + Orbit Control + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsLocalNetworking + + NSExceptionDomains + + 127.0.0.1 + + NSExceptionAllowsInsecureHTTPLoads + + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocalNetworkUsageDescription + Orbit Control connects to a developer-hosted Lynx federation server on the local network. + UILaunchStoryboardName + LaunchScreen + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/Info.plist b/apps/lynx-module-federation-demo/ios/OrbitControl/Info.plist new file mode 100644 index 00000000000..12989ce37cd --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDisplayName + Orbit Control + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSLocalNetworkUsageDescription + Orbit Control connects to a developer-hosted Lynx federation server on the local network. + UILaunchStoryboardName + LaunchScreen + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitControl-Bridging-Header.h b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitControl-Bridging-Header.h new file mode 100644 index 00000000000..d565305c114 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitControl-Bridging-Header.h @@ -0,0 +1,4 @@ +#import +#import +#import +#import "OrbitResourceFetcher.h" diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.h b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.h new file mode 100644 index 00000000000..8844a806cf7 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.h @@ -0,0 +1,20 @@ +// Derived from official Lynx iOS resource fetcher examples (Apache-2.0). + +#import +#import +#import +#import + +@class LynxViewBuilder; + +NS_ASSUME_NONNULL_BEGIN + +@interface OrbitResourceFetcher : NSObject + +- (void)configureBuilder:(LynxViewBuilder *)builder NS_SWIFT_NAME(configure(_:)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m new file mode 100644 index 00000000000..7bd3c5096b4 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m @@ -0,0 +1,167 @@ +// Derived from official Lynx iOS resource fetcher examples (Apache-2.0). + +#import "OrbitResourceFetcher.h" + +#import +#import +#import + +static NSString *const OrbitResourceErrorDomain = @"org.modulefederation.lynx.resources"; + +@interface OrbitResourceFetcher () + +- (dispatch_block_t)loadDataForURLString:(NSString *)urlString + completion:(void (^)(NSData *_Nullable, + NSError *_Nullable))completion; +- (NSURL *_Nullable)localURLForString:(NSString *)urlString; +- (NSError *)errorWithMessage:(NSString *)message; + +@end + +@implementation OrbitResourceFetcher + +- (void)configureBuilder:(LynxViewBuilder *)builder { + builder.enableGenericResourceFetcher = LynxBooleanOptionTrue; + builder.genericResourceFetcher = self; + builder.templateResourceFetcher = self; +} + +- (void)loadTemplateWithUrl:(NSString *)url + onComplete:(LynxTemplateLoadBlock)callback { + [self loadDataForURLString:url + completion:^(NSData *data, NSError *error) { + callback(data, error); + }]; +} + +- (void)fetchTemplate:(LynxResourceRequest *)request + onComplete:(LynxTemplateResourceCompletionBlock)callback { + [self loadDataForURLString:request.url + completion:^(NSData *data, NSError *error) { + callback(data ? [[LynxTemplateResource alloc] initWithNSData:data] : nil, + error); + }]; +} + +- (void)fetchSSRData:(LynxResourceRequest *)request + onComplete:(LynxSSRResourceCompletionBlock)callback { + [self loadDataForURLString:request.url completion:callback]; +} + +- (dispatch_block_t)fetchResource:(LynxResourceRequest *)request + onComplete:(LynxGenericResourceCompletionBlock)callback { + return [self loadDataForURLString:request.url completion:callback]; +} + +- (dispatch_block_t)fetchResourcePath:(LynxResourceRequest *)request + onComplete:(LynxGenericResourcePathCompletionBlock)callback { + NSURL *localURL = [self localURLForString:request.url]; + if (localURL) { + callback(localURL.path, nil); + return ^{}; + } + + return [self loadDataForURLString:request.url + completion:^(NSData *data, NSError *error) { + if (!data) { + callback(nil, error); + return; + } + + NSURL *directory = [NSURL fileURLWithPath:NSTemporaryDirectory() + isDirectory:YES]; + directory = [directory URLByAppendingPathComponent:@"OrbitResources" + isDirectory:YES]; + NSError *writeError = nil; + [[NSFileManager defaultManager] createDirectoryAtURL:directory + withIntermediateDirectories:YES + attributes:nil + error:&writeError]; + NSURL *fileURL = [directory URLByAppendingPathComponent: + [NSUUID UUID].UUIDString]; + if (!writeError && [data writeToURL:fileURL options:NSDataWritingAtomic + error:&writeError]) { + callback(fileURL.path, nil); + } else { + callback(nil, writeError); + } + }]; +} + +- (dispatch_block_t)loadDataForURLString:(NSString *)urlString + completion:(void (^)(NSData *_Nullable, + NSError *_Nullable))completion { + NSURL *localURL = [self localURLForString:urlString]; + if (localURL) { + NSError *error = nil; + NSData *data = [NSData dataWithContentsOfURL:localURL options:0 error:&error]; + completion(data, error); + return ^{}; + } + + NSURL *url = [NSURL URLWithString:urlString]; + if (!url || !([url.scheme isEqualToString:@"http"] || + [url.scheme isEqualToString:@"https"])) { + completion(nil, [self errorWithMessage:[NSString stringWithFormat: + @"Unsupported Lynx resource URL: %@", urlString]]); + return ^{}; + } + + NSURLSessionDataTask *task = [[NSURLSession sharedSession] + dataTaskWithURL:url + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (error) { + completion(nil, error); + return; + } + + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + NSInteger statusCode = ((NSHTTPURLResponse *)response).statusCode; + if (statusCode < 200 || statusCode >= 300) { + completion(nil, [self errorWithMessage:[NSString stringWithFormat: + @"Lynx resource request failed with HTTP %ld: %@", + (long)statusCode, urlString]]); + return; + } + } + + if (!data) { + completion(nil, [self errorWithMessage:[NSString stringWithFormat: + @"Lynx resource request returned no data: %@", urlString]]); + return; + } + completion(data, nil); + }]; + [task resume]; + return ^{ [task cancel]; }; +} + +- (NSURL *_Nullable)localURLForString:(NSString *)urlString { + NSURL *url = [NSURL URLWithString:urlString]; + if ([url.scheme isEqualToString:@"file"]) { + return url; + } + if ([url.scheme isEqualToString:@"http"] || + [url.scheme isEqualToString:@"https"]) { + return nil; + } + if ([urlString isAbsolutePath]) { + return [NSURL fileURLWithPath:urlString]; + } + + NSString *filename = urlString.lastPathComponent; + NSString *extension = filename.pathExtension; + NSString *name = extension.length > 0 + ? [filename stringByDeletingPathExtension] + : filename; + return [[NSBundle mainBundle] URLForResource:name + withExtension:extension.length > 0 ? extension : nil]; +} + +- (NSError *)errorWithMessage:(NSString *)message { + return [NSError errorWithDomain:OrbitResourceErrorDomain + code:1 + userInfo:@{NSLocalizedDescriptionKey: message}]; +} + +@end diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift b/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift new file mode 100644 index 00000000000..7371ed29946 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift @@ -0,0 +1,75 @@ +// Derived from the official Lynx HelloLynxSwift starter (Apache-2.0). + +import UIKit + +final class ViewController: UIViewController { + private let resourceFetcher = OrbitResourceFetcher() + private var lynxView: LynxView? + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .black + + let lynxView = LynxView { builder in + builder.config = LynxConfig(provider: self.resourceFetcher) + builder.screenSize = self.view.bounds.size + builder.fontScale = 1.0 + self.resourceFetcher.configure(builder) + } + + lynxView.frame = view.bounds + lynxView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + lynxView.preferredLayoutWidth = view.bounds.width + lynxView.preferredLayoutHeight = view.bounds.height + lynxView.layoutWidthMode = .exact + lynxView.layoutHeightMode = .exact + view.addSubview(lynxView) + self.lynxView = lynxView + + NotificationCenter.default.addObserver( + self, + selector: #selector(enterForeground), + name: UIApplication.willEnterForegroundNotification, + object: nil + ) + NotificationCenter.default.addObserver( + self, + selector: #selector(enterBackground), + name: UIApplication.didEnterBackgroundNotification, + object: nil + ) + + lynxView.loadTemplate(fromURL: rootBundleURL, initData: nil) + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + lynxView?.preferredLayoutWidth = view.bounds.width + lynxView?.preferredLayoutHeight = view.bounds.height + } + + deinit { + NotificationCenter.default.removeObserver(self) + lynxView?.clearForDestroy() + } + + @objc private func enterForeground() { + lynxView?.onEnterForeground() + } + + @objc private func enterBackground() { + lynxView?.onEnterBackground() + } + + private var rootBundleURL: String { + if let override = ProcessInfo.processInfo.environment["LYNX_BUNDLE_URL"], + !override.isEmpty { + return override + } +#if DEBUG + return "http://localhost:3000/main.lynx.bundle" +#else + return "main.lynx.bundle" +#endif + } +} diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift new file mode 100644 index 00000000000..c7fe67008f6 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift @@ -0,0 +1,36 @@ +import XCTest + +final class OrbitControlUITests: XCTestCase { + func testFederatedImportsRuntimeLoadingAndSingleton() { + addUIInterruptionMonitor(withDescription: "Local network permission") { alert in + guard alert.buttons["Allow"].exists else { return false } + alert.buttons["Allow"].tap() + return true + } + + let app = XCUIApplication() + app.launchEnvironment["LYNX_BUNDLE_URL"] = + ProcessInfo.processInfo.environment["LYNX_BUNDLE_URL"] + ?? "http://localhost:3000/host-native/main.lynx.bundle" + app.launch() + app.tap() + + let loadButton = app.descendants(matching: .any) + .matching(NSPredicate(format: "label == %@", "Load remote catalog")) + .firstMatch + XCTAssertTrue(loadButton.waitForExistence(timeout: 30)) + loadButton.tap() + + let singleton = app.descendants(matching: .any) + .matching(NSPredicate(format: "label == %@", "Shared singleton verified")) + .firstMatch + XCTAssertTrue(singleton.waitForExistence(timeout: 60)) + XCTAssertTrue(app.staticTexts["Compiled imports ready"].exists) + XCTAssertTrue(app.staticTexts["Runtime API ready"].exists) + + let attachment = XCTAttachment(screenshot: XCUIScreen.main.screenshot()) + attachment.name = "Orbit Control federation loaded" + attachment.lifetime = .keepAlways + add(attachment) + } +} diff --git a/apps/lynx-module-federation-demo/ios/Podfile b/apps/lynx-module-federation-demo/ios/Podfile new file mode 100644 index 00000000000..4c38945b082 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/Podfile @@ -0,0 +1,24 @@ +source 'https://cdn.cocoapods.org/' + +platform :ios, '13.0' + +target 'OrbitControl' do + pod 'Lynx', '3.9.0', :subspecs => ['Framework'] + # Lynx 3.9.0 pins this PrimJS engine build in its published podspec. + pod 'PrimJS', '3.8.0-alpha.6', :subspecs => ['quickjs', 'napi'] + pod 'LynxService', '3.9.0', :subspecs => ['Image', 'Log', 'Http'] + pod 'SDWebImage', '5.15.5' + pod 'SDWebImageWebPCoder', '0.11.0' + pod 'XElement', '3.9.0' +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = 'NO' + config.build_settings['OTHER_CFLAGS'] = '$(inherited) -Wno-error -Wno-c99-designator' + config.build_settings['OTHER_CPLUSPLUSFLAGS'] = '$(inherited) -Wno-error -Wno-c99-designator' + config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -Xcc -Wno-deprecated-declarations -Xcc -Wno-deprecated-implementations' + end + end +end diff --git a/apps/lynx-module-federation-demo/ios/Podfile.lock b/apps/lynx-module-federation-demo/ios/Podfile.lock new file mode 100644 index 00000000000..8ec0e011122 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/Podfile.lock @@ -0,0 +1,158 @@ +PODS: + - libwebp (1.5.0): + - libwebp/demux (= 1.5.0) + - libwebp/mux (= 1.5.0) + - libwebp/sharpyuv (= 1.5.0) + - libwebp/webp (= 1.5.0) + - libwebp/demux (1.5.0): + - libwebp/webp + - libwebp/mux (1.5.0): + - libwebp/demux + - libwebp/sharpyuv (1.5.0) + - libwebp/webp (1.5.0): + - libwebp/sharpyuv + - Lynx (3.9.0): + - Lynx/Framework (= 3.9.0) + - Lynx/Framework (3.9.0): + - Lynx/ReleaseResource + - LynxBase/Framework + - LynxServiceAPI + - PrimJS/napi/env + - PrimJS/napi/jsc + - PrimJS/napi/quickjs + - PrimJS/quickjs (= 3.8.0-alpha.6) + - Lynx/ReleaseResource (3.9.0) + - LynxBase (3.9.0): + - LynxBase/Framework (= 3.9.0) + - LynxBase/Framework (3.9.0): + - LynxServiceAPI/Core + - LynxService/Http (3.9.0): + - Lynx (= 3.9.0) + - LynxServiceAPI (= 3.9.0) + - LynxService/Image (3.9.0): + - Lynx (= 3.9.0) + - LynxServiceAPI (= 3.9.0) + - SDWebImage (= 5.15.5) + - SDWebImageWebPCoder (= 0.11.0) + - LynxService/Log (3.9.0): + - Lynx (= 3.9.0) + - LynxBase (= 3.9.0) + - LynxServiceAPI (= 3.9.0) + - LynxServiceAPI (3.9.0): + - LynxServiceAPI/Core (= 3.9.0) + - LynxServiceAPI/Core (3.9.0) + - LynxTextra (0.1.6) + - MJRefresh (3.7.9) + - PrimJS/log (3.8.0-alpha.6) + - PrimJS/napi (3.8.0-alpha.6): + - PrimJS/napi/adapter (= 3.8.0-alpha.6) + - PrimJS/napi/core (= 3.8.0-alpha.6) + - PrimJS/napi/env (= 3.8.0-alpha.6) + - PrimJS/napi/jsc (= 3.8.0-alpha.6) + - PrimJS/napi/quickjs (= 3.8.0-alpha.6) + - PrimJS/napi/adapter (3.8.0-alpha.6): + - PrimJS/napi/core + - PrimJS/napi/env + - PrimJS/napi/core (3.8.0-alpha.6) + - PrimJS/napi/env (3.8.0-alpha.6): + - PrimJS/napi/core + - PrimJS/napi/jsc (3.8.0-alpha.6): + - PrimJS/log + - PrimJS/napi/core + - PrimJS/quickjs + - PrimJS/napi/quickjs (3.8.0-alpha.6): + - PrimJS/napi/core + - PrimJS/quickjs + - PrimJS/quickjs (3.8.0-alpha.6): + - PrimJS/log + - SDWebImage (5.15.5): + - SDWebImage/Core (= 5.15.5) + - SDWebImage/Core (5.15.5) + - SDWebImageWebPCoder (0.11.0): + - libwebp (~> 1.0) + - SDWebImage/Core (~> 5.15) + - ServalMarkdown (0.0.28-alpha.4): + - LynxTextra + - ServalSVG (0.1.1) + - XElement (3.9.0): + - XElement/Behavior (= 3.9.0) + - XElement/Input (= 3.9.0) + - XElement/Markdown (= 3.9.0) + - XElement/Overlay (= 3.9.0) + - XElement/Refresh (= 3.9.0) + - XElement/ScrollCoordinator (= 3.9.0) + - XElement/SVG (= 3.9.0) + - XElement/ViewPager (= 3.9.0) + - XElement/Behavior (3.9.0): + - Lynx (= 3.9.0) + - XElement/Input + - XElement/Markdown + - XElement/Overlay + - XElement/Refresh + - XElement/ScrollCoordinator + - XElement/SVG + - XElement/ViewPager + - XElement/Input (3.9.0): + - Lynx (= 3.9.0) + - XElement/Markdown (3.9.0): + - Lynx (= 3.9.0) + - ServalMarkdown (= 0.0.28-alpha.4) + - XElement/Overlay (3.9.0): + - Lynx (= 3.9.0) + - XElement/Refresh (3.9.0): + - Lynx (= 3.9.0) + - MJRefresh (>= 3.6.1) + - XElement/ScrollCoordinator (3.9.0): + - Lynx (= 3.9.0) + - XElement/ViewPager + - XElement/SVG (3.9.0): + - Lynx (= 3.9.0) + - ServalSVG (>= 0.0.17) + - XElement/ViewPager (3.9.0): + - Lynx (= 3.9.0) + +DEPENDENCIES: + - Lynx/Framework (= 3.9.0) + - LynxService/Http (= 3.9.0) + - LynxService/Image (= 3.9.0) + - LynxService/Log (= 3.9.0) + - PrimJS/napi (= 3.8.0-alpha.6) + - PrimJS/quickjs (= 3.8.0-alpha.6) + - SDWebImage (= 5.15.5) + - SDWebImageWebPCoder (= 0.11.0) + - XElement (= 3.9.0) + +SPEC REPOS: + trunk: + - libwebp + - Lynx + - LynxBase + - LynxService + - LynxServiceAPI + - LynxTextra + - MJRefresh + - PrimJS + - SDWebImage + - SDWebImageWebPCoder + - ServalMarkdown + - ServalSVG + - XElement + +SPEC CHECKSUMS: + libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 + Lynx: ad5ed649ccf1d761e6697bc5d6d4fa6f30ad13e3 + LynxBase: 046fe3d218a88ff0b1a3f058ee8d9a07aa9ae387 + LynxService: a1728eea1ecb9d4bd9a37430b14d431ae000fce0 + LynxServiceAPI: d7fe4bc006716867e5d7cf2d3a4bcaa5207cfa0f + LynxTextra: e1a22775e880e000605091aad8dec614ca2ca79a + MJRefresh: ff9e531227924c84ce459338414550a05d2aea78 + PrimJS: a917134ed564e22594bcda526b940bc9a1de4e4d + SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe + SDWebImageWebPCoder: 295a6573c512f54ad2dd58098e64e17dcf008499 + ServalMarkdown: 60f8b7502cecce269275d38363740cd4b0deeff6 + ServalSVG: 6990830fdd5c1e7d545fc8c842a98bea6007dd86 + XElement: 49b95dcd304c4a3bd4af335962c45a65173033b3 + +PODFILE CHECKSUM: d603a00b878c420aad0fb9115986e2c845592bea + +COCOAPODS: 1.16.2 diff --git a/apps/lynx-module-federation-demo/ios/UPSTREAM.md b/apps/lynx-module-federation-demo/ios/UPSTREAM.md new file mode 100644 index 00000000000..c1396f5e269 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/UPSTREAM.md @@ -0,0 +1,20 @@ +# Official Lynx iOS starter provenance + +This application is derived from the official Lynx `HelloLynxSwift` UIKit +starter: + +- repository: +- source path: `ios/HelloLynxSwift` +- source commit: `f8230ca6aa1c9e629e30272971d0c03450b13e8e` +- upstream license: Apache-2.0 + +The standalone shell retains the starter's `LynxEnv`, `LynxConfig`, +`LynxView`, CocoaPods, and embedded `main.lynx.bundle` integration. It upgrades +the official Lynx pods from 3.8.0 to 3.9.0 (including Lynx 3.9.0's published +PrimJS 3.8.0-alpha.6 engine pin), removes the starter's personal signing team +and bundle identifier, uses a programmatic UIKit root view, and adds the +resource fetchers required for HTTP Bundle, Lazy Bundle, and generic resource +loading. + +The generated host bundle is intentionally not committed. Run +`pnpm ios:prepare` before opening the workspace. diff --git a/apps/lynx-module-federation-demo/package.json b/apps/lynx-module-federation-demo/package.json index 09ed6d6f327..c858f553b06 100644 --- a/apps/lynx-module-federation-demo/package.json +++ b/apps/lynx-module-federation-demo/package.json @@ -16,10 +16,16 @@ "dev": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:native && node rspack-canary-rspeedy.mjs dev -c lynx.config.mjs", "dev:web": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:web && node rspack-canary-rspeedy.mjs dev -c lynx.web.config.mjs", "e2e:native": "pnpm run build:native && pnpm run test:native-artifacts && pnpm run test:native-dev-server", + "e2e:ios": "node test/ios/run.mjs", "e2e:web": "pnpm run build:web && node test/real-web/run.mjs", + "ios:open": "open ios/OrbitControl.xcworkspace", + "ios:pods": "cd ios && bundle install && bundle exec pod install --deployment --repo-update", + "ios:prepare": "LYNX_REMOTE_ORIGIN=http://localhost:3000 pnpm run build:native && pnpm run ios:sync", + "ios:sync": "node scripts/sync-ios-bundle.mjs", "preview": "node rspack-canary-rspeedy.mjs preview -c lynx.config.mjs", "preview:web": "node rspack-canary-rspeedy.mjs preview -c lynx.web.config.mjs", - "test": "pnpm run e2e:native && pnpm run e2e:web", + "test": "pnpm run test:ios-project && pnpm run e2e:native && pnpm run e2e:web", + "test:ios-project": "node test/ios-project.mjs", "test:native-artifacts": "node test/native-artifacts.mjs", "test:native-dev-server": "node test/native-dev-server.mjs" }, diff --git a/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs b/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs new file mode 100644 index 00000000000..a0718c4808e --- /dev/null +++ b/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs @@ -0,0 +1,20 @@ +import assert from 'node:assert/strict'; +import { copyFile, mkdir, stat } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const appRoot = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '..', +); +const source = path.resolve( + appRoot, + process.env.LYNX_IOS_HOST_BUNDLE ?? 'dist/host-native/main.lynx.bundle', +); +const destination = path.join(appRoot, 'ios/Resources/main.lynx.bundle'); + +const sourceStat = await stat(source); +assert.ok(sourceStat.size > 0, `Native host bundle is empty: ${source}`); +await mkdir(path.dirname(destination), { recursive: true }); +await copyFile(source, destination); +process.stdout.write(`Copied ${source} to ${destination}.\n`); diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index ba04e709d59..3ec055d8192 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -38,7 +38,14 @@ function LoadButton({ state, onTap }: { state: LoadState; onTap: () => void }) { : 'PrimaryAction'; return ( - + {label} MF MANIFEST · HTTP @@ -121,6 +128,14 @@ function SingletonProof({ : 'SingletonProofStatus' } data-testid="singleton-status" + accessibility-element + accessibility-label={ + ready + ? shared + ? 'Shared singleton verified' + : 'Singleton identity mismatch' + : 'Waiting for remote observers' + } > {ready ? shared diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs new file mode 100644 index 00000000000..13c31368e03 --- /dev/null +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -0,0 +1,63 @@ +import assert from 'node:assert/strict'; +import { access, readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const appRoot = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '..', +); +const read = (relativePath) => + readFile(path.join(appRoot, relativePath), 'utf8'); + +await Promise.all([ + access(path.join(appRoot, 'ios/OrbitControl.xcodeproj/project.pbxproj')), + access(path.join(appRoot, 'ios/OrbitControl/AppDelegate.swift')), + access( + path.join(appRoot, 'ios/OrbitControlUITests/OrbitControlUITests.swift'), + ), +]); + +const [ + podfile, + podfileLock, + provenance, + fetcher, + releaseInfo, + debugInfo, + project, + uiTest, +] = await Promise.all([ + read('ios/Podfile'), + read('ios/Podfile.lock'), + read('ios/UPSTREAM.md'), + read('ios/OrbitControl/OrbitResourceFetcher.m'), + read('ios/OrbitControl/Info.plist'), + read('ios/OrbitControl/Info.Debug.plist'), + read('ios/OrbitControl.xcodeproj/project.pbxproj'), + read('ios/OrbitControlUITests/OrbitControlUITests.swift'), +]); + +for (const pod of ['Lynx', 'LynxService', 'XElement']) { + assert.match(podfile, new RegExp(`pod '${pod}', '3\\.9\\.0'`)); +} +assert.match(podfile, /pod 'PrimJS', '3\.8\.0-alpha\.6'/); +assert.match(podfileLock, /Lynx \(3\.9\.0\)/); +assert.match(podfileLock, /PrimJS\/quickjs \(3\.8\.0-alpha\.6\)/); +assert.match(provenance, /integrating-lynx-demo-projects/); +assert.match(provenance, /f8230ca6aa1c9e629e30272971d0c03450b13e8e/); +assert.match(fetcher, /LynxBooleanOptionTrue/); +assert.match(fetcher, /builder\.templateResourceFetcher = self/); +assert.match(fetcher, /builder\.genericResourceFetcher = self/); +assert.doesNotMatch(releaseInfo, /NSAllowsArbitraryLoads/); +assert.doesNotMatch(releaseInfo, /NSExceptionAllowsInsecureHTTPLoads/); +assert.match(debugInfo, /NSAllowsLocalNetworking/); +assert.match(debugInfo, /127\.0\.0\.1<\/key>/); +assert.match(debugInfo, /localhost<\/key>/); +assert.doesNotMatch(debugInfo, /NSAllowsArbitraryLoads/); +assert.doesNotMatch(project, /DEVELOPMENT_TEAM/); +assert.match(project, /OrbitControlUITests/); +assert.match(uiTest, /Shared singleton verified/); +process.stdout.write( + 'Standalone official Lynx iOS project policy validated.\n', +); diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs new file mode 100644 index 00000000000..0f81b583f08 --- /dev/null +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -0,0 +1,176 @@ +import assert from 'node:assert/strict'; +import { spawn, spawnSync } from 'node:child_process'; +import { createReadStream } from 'node:fs'; +import { + mkdir, + readFile, + readdir, + rm, + stat, + writeFile, +} from 'node:fs/promises'; +import { createServer } from 'node:http'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const appRoot = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../..', +); +const distRoot = path.join(appRoot, 'dist'); +const iosRoot = path.join(appRoot, 'ios'); +const artifactsRoot = path.join(iosRoot, 'build'); +const requestLogPath = path.join(artifactsRoot, 'requests.json'); +const screenshotPath = path.join(artifactsRoot, 'orbit-control.png'); +const resultBundlePath = path.join(artifactsRoot, 'OrbitControl.xcresult'); +const requestedPaths = []; + +await mkdir(artifactsRoot, { recursive: true }); +await rm(resultBundlePath, { force: true, recursive: true }); +await stat(path.join(distRoot, 'host-native/main.lynx.bundle')); +await stat(path.join(distRoot, 'remote-native/mf-manifest.json')); +const manifest = JSON.parse( + await readFile(path.join(distRoot, 'remote-native/mf-manifest.json'), 'utf8'), +); +const serverURL = new URL(manifest.metaData.publicPath); +assert.ok( + serverURL.hostname === 'localhost' || serverURL.hostname === '127.0.0.1', + `iOS E2E only serves local artifacts, received ${serverURL.origin}`, +); +const serverPort = Number(serverURL.port || 80); + +const contentTypes = new Map([ + ['.bundle', 'application/octet-stream'], + ['.json', 'application/json; charset=utf-8'], + ['.js', 'text/javascript; charset=utf-8'], +]); +const server = createServer(async (request, response) => { + try { + const pathname = decodeURIComponent( + new URL(request.url, 'http://localhost').pathname, + ); + requestedPaths.push(pathname); + const filePath = path.resolve(distRoot, `.${pathname}`); + if (!filePath.startsWith(`${distRoot}${path.sep}`)) { + response.writeHead(403).end('Forbidden'); + return; + } + const fileStat = await stat(filePath); + if (!fileStat.isFile()) throw new Error('Not a file'); + response.writeHead(200, { + 'Access-Control-Allow-Origin': '*', + 'Content-Length': fileStat.size, + 'Content-Type': + contentTypes.get(path.extname(filePath)) ?? 'application/octet-stream', + }); + createReadStream(filePath).pipe(response); + } catch { + response.writeHead(404).end('Not found'); + } +}); + +const run = (command, args, options = {}) => + new Promise((resolve, reject) => { + const child = spawn(command, args, { + cwd: iosRoot, + env: process.env, + stdio: 'inherit', + ...options, + }); + child.once('error', reject); + child.once('exit', (code, signal) => { + if (code === 0) resolve(); + else reject(new Error(`${command} exited with ${code ?? signal}`)); + }); + }); + +const simulatorList = spawnSync( + 'xcrun', + ['simctl', 'list', 'devices', 'available', '-j'], + { encoding: 'utf8' }, +); +assert.equal(simulatorList.status, 0, simulatorList.stderr); +const devices = Object.entries(JSON.parse(simulatorList.stdout).devices) + .reverse() + .flatMap(([runtime, runtimeDevices]) => + runtimeDevices.map((device) => ({ ...device, runtime })), + ) + .filter((device) => device.isAvailable && device.name.startsWith('iPhone')); +assert.ok(devices.length > 0, 'No available iPhone simulator was found.'); +const device = + devices.find(({ name }) => name.includes('16 Pro')) ?? devices[0]; + +await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(serverPort, '127.0.0.1', resolve); +}); + +try { + const boot = spawnSync('xcrun', ['simctl', 'boot', device.udid], { + encoding: 'utf8', + }); + assert.ok( + boot.status === 0 || /current state: Booted/.test(boot.stderr), + boot.stderr, + ); + await run('xcrun', ['simctl', 'bootstatus', device.udid, '-b']); + await run( + 'xcodebuild', + [ + 'test', + '-workspace', + 'OrbitControl.xcworkspace', + '-scheme', + 'OrbitControl', + '-destination', + `platform=iOS Simulator,id=${device.udid}`, + '-derivedDataPath', + 'build/DerivedData', + '-resultBundlePath', + 'build/OrbitControl.xcresult', + '-parallel-testing-enabled', + 'NO', + ], + { + env: { + ...process.env, + LYNX_BUNDLE_URL: `${serverURL.origin}/host-native/main.lynx.bundle`, + }, + }, + ); + + const remoteEntry = manifest.metaData.remoteEntry; + const expected = [ + '/host-native/main.lynx.bundle', + '/remote-native/mf-manifest.json', + new URL( + `${remoteEntry.path}${remoteEntry.name}`, + manifest.metaData.publicPath, + ).pathname, + ]; + const lazyFiles = (await readdir(path.join(distRoot, 'remote-native/async'))) + .filter((file) => file.endsWith('.bundle')) + .map((file) => `/remote-native/async/${file}`); + assert.equal(lazyFiles.length, 3); + expected.push(...lazyFiles); + for (const pathname of expected) { + assert.ok( + requestedPaths.includes(pathname), + `iOS app did not request ${pathname}`, + ); + } + process.stdout.write( + `Native iOS app loaded the host, manifest, container, and ${lazyFiles.length} lazy bundles.\n`, + ); +} finally { + await writeFile(requestLogPath, JSON.stringify(requestedPaths, null, 2)); + spawnSync( + 'xcrun', + ['simctl', 'io', device.udid, 'screenshot', screenshotPath], + { + encoding: 'utf8', + }, + ); + spawnSync('xcrun', ['simctl', 'shutdown', device.udid], { encoding: 'utf8' }); + await new Promise((resolve) => server.close(resolve)); +} From c67e601b62ac5931bc31cd7b07179682437a1a3e Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 07:00:12 +0000 Subject: [PATCH 04/68] fix(lynx): harden native iOS demo --- .github/workflows/e2e-lynx.yml | 7 +- apps/lynx-module-federation-demo/.gitignore | 1 + apps/lynx-module-federation-demo/README.md | 17 ++- .../ios/OrbitControl/OrbitResourceFetcher.m | 133 +++++++++++++++--- .../ios/OrbitControl/ViewController.swift | 25 +++- .../OrbitControlUITests.swift | 15 ++ apps/lynx-module-federation-demo/package.json | 3 +- .../scripts/dev-ios-device.mjs | 31 ++++ .../test/ios-project.mjs | 11 ++ .../test/ios/run.mjs | 81 +++++++++-- .../test/native-dev-server.mjs | 76 +++++----- 11 files changed, 322 insertions(+), 78 deletions(-) create mode 100644 apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index ed098562c36..730646c9d8d 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -74,12 +74,6 @@ jobs: if: steps.check-ci.outputs.run-e2e == 'true' run: pnpm --filter lynx-module-federation-demo run test:ios-project - - name: Prepare iOS native artifacts - if: steps.check-ci.outputs.run-e2e == 'true' - env: - LYNX_REMOTE_ORIGIN: http://127.0.0.1:3000 - run: pnpm --filter lynx-module-federation-demo run build:native - - name: Upload native artifacts for iOS if: steps.check-ci.outputs.run-e2e == 'true' uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 @@ -160,6 +154,7 @@ jobs: name: lynx-ios-e2e path: | apps/lynx-module-federation-demo/ios/build/OrbitControl.xcresult/ + apps/lynx-module-federation-demo/ios/build/OrbitControl-Release.xcresult/ apps/lynx-module-federation-demo/ios/build/orbit-control.png apps/lynx-module-federation-demo/ios/build/requests.json if-no-files-found: ignore diff --git a/apps/lynx-module-federation-demo/.gitignore b/apps/lynx-module-federation-demo/.gitignore index 2bc0dd23e5b..fd86869bb6d 100644 --- a/apps/lynx-module-federation-demo/.gitignore +++ b/apps/lynx-module-federation-demo/.gitignore @@ -1,4 +1,5 @@ dist/ +.lynx-e2e-*/ .turbo/ test/real-web/artifacts/ ios/.bundle/ diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index 7182b1ab5a7..a00b231843d 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -49,6 +49,20 @@ environment variable to a LAN-reachable URL for a physical device. The shell injects both Lynx template and generic resource fetchers, so the root Bundle, federated container, and Lazy Bundles can arrive over HTTP(S). +For a physical device, use the same LAN origin for both the host bundle and +the manifest URL compiled into it: + +```sh +export LYNX_REMOTE_ORIGIN=http://:3000 +pnpm ios:prepare +pnpm ios:device +``` + +Set the Xcode scheme's `LYNX_BUNDLE_URL` to +`http://:3000/main.lynx.bundle`. `ios:device` rejects loopback +origins and binds Rspeedy to `0.0.0.0`, so the phone can fetch the host, +manifest, container, and lazy bundles from the same server. + Release builds embed `ios/Resources/main.lynx.bundle` and retain strict ATS defaults. Build the host with the production manifest origin before syncing it: @@ -61,7 +75,8 @@ Only the host bundle is embedded. The manifest, container, and lazy expose bundles remain separately deployable HTTP(S) artifacts. The iOS simulator E2E launches the app, taps **Load remote catalog**, verifies compiled imports, runtime `loadRemote()`, and shared singleton identity, then checks every native -bundle request observed by the test server. +bundle request observed by the test server. It also launches the Release app +without a root URL override to prove the embedded host and strict ATS branch. ## Run with Lynx Explorer diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m index 7bd3c5096b4..a8c5ef861a1 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m @@ -7,19 +7,48 @@ #import static NSString *const OrbitResourceErrorDomain = @"org.modulefederation.lynx.resources"; +static NSUInteger const OrbitResourcePathCacheLimit = 64; @interface OrbitResourceFetcher () +@property(nonatomic, strong) NSMutableDictionary *resourcePathCache; +@property(nonatomic, strong) NSMutableArray *resourcePathCacheOrder; +@property(nonatomic, strong) NSURL *resourceCacheDirectory; + - (dispatch_block_t)loadDataForURLString:(NSString *)urlString completion:(void (^)(NSData *_Nullable, NSError *_Nullable))completion; - (NSURL *_Nullable)localURLForString:(NSString *)urlString; +- (BOOL)isAllowedLocalURL:(NSURL *)url; +- (NSString *_Nullable)cachedResourcePathForURLString:(NSString *)urlString; +- (NSString *_Nullable)storeResourceData:(NSData *)data + forURLString:(NSString *)urlString + error:(NSError **)error; - (NSError *)errorWithMessage:(NSString *)message; @end @implementation OrbitResourceFetcher +- (instancetype)init { + self = [super init]; + if (self) { + _resourcePathCache = [NSMutableDictionary dictionary]; + _resourcePathCacheOrder = [NSMutableArray array]; + _resourceCacheDirectory = [[[NSURL fileURLWithPath:NSTemporaryDirectory() + isDirectory:YES] + URLByAppendingPathComponent:@"OrbitResources" + isDirectory:YES] + URLByAppendingPathComponent:NSUUID.UUID.UUIDString + isDirectory:YES]; + } + return self; +} + +- (void)dealloc { + [[NSFileManager defaultManager] removeItemAtURL:self.resourceCacheDirectory error:nil]; +} + - (void)configureBuilder:(LynxViewBuilder *)builder { builder.enableGenericResourceFetcher = LynxBooleanOptionTrue; builder.genericResourceFetcher = self; @@ -61,6 +90,12 @@ - (dispatch_block_t)fetchResourcePath:(LynxResourceRequest *)request return ^{}; } + NSString *cachedPath = [self cachedResourcePathForURLString:request.url]; + if (cachedPath) { + callback(cachedPath, nil); + return ^{}; + } + return [self loadDataForURLString:request.url completion:^(NSData *data, NSError *error) { if (!data) { @@ -68,26 +103,60 @@ - (dispatch_block_t)fetchResourcePath:(LynxResourceRequest *)request return; } - NSURL *directory = [NSURL fileURLWithPath:NSTemporaryDirectory() - isDirectory:YES]; - directory = [directory URLByAppendingPathComponent:@"OrbitResources" - isDirectory:YES]; NSError *writeError = nil; - [[NSFileManager defaultManager] createDirectoryAtURL:directory - withIntermediateDirectories:YES - attributes:nil - error:&writeError]; - NSURL *fileURL = [directory URLByAppendingPathComponent: - [NSUUID UUID].UUIDString]; - if (!writeError && [data writeToURL:fileURL options:NSDataWritingAtomic - error:&writeError]) { - callback(fileURL.path, nil); - } else { - callback(nil, writeError); - } + NSString *path = [self storeResourceData:data + forURLString:request.url + error:&writeError]; + callback(path, writeError); }]; } +- (NSString *_Nullable)cachedResourcePathForURLString:(NSString *)urlString { + @synchronized(self) { + return self.resourcePathCache[urlString]; + } +} + +- (NSString *_Nullable)storeResourceData:(NSData *)data + forURLString:(NSString *)urlString + error:(NSError **)error { + NSString *cachedPath = [self cachedResourcePathForURLString:urlString]; + if (cachedPath) return cachedPath; + + [[NSFileManager defaultManager] createDirectoryAtURL:self.resourceCacheDirectory + withIntermediateDirectories:YES + attributes:nil + error:error]; + if (*error) return nil; + + NSString *extension = [NSURL URLWithString:urlString].pathExtension; + NSString *filename = NSUUID.UUID.UUIDString; + if (extension.length > 0) { + filename = [filename stringByAppendingPathExtension:extension]; + } + NSURL *fileURL = [self.resourceCacheDirectory URLByAppendingPathComponent:filename]; + if (![data writeToURL:fileURL options:NSDataWritingAtomic error:error]) return nil; + + @synchronized(self) { + NSString *existingPath = self.resourcePathCache[urlString]; + if (existingPath) { + [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil]; + return existingPath; + } + + self.resourcePathCache[urlString] = fileURL.path; + [self.resourcePathCacheOrder addObject:urlString]; + if (self.resourcePathCacheOrder.count > OrbitResourcePathCacheLimit) { + NSString *expiredURL = self.resourcePathCacheOrder.firstObject; + NSString *expiredPath = self.resourcePathCache[expiredURL]; + [self.resourcePathCacheOrder removeObjectAtIndex:0]; + [self.resourcePathCache removeObjectForKey:expiredURL]; + [[NSFileManager defaultManager] removeItemAtPath:expiredPath error:nil]; + } + } + return fileURL.path; +} + - (dispatch_block_t)loadDataForURLString:(NSString *)urlString completion:(void (^)(NSData *_Nullable, NSError *_Nullable))completion { @@ -139,23 +208,47 @@ - (dispatch_block_t)loadDataForURLString:(NSString *)urlString - (NSURL *_Nullable)localURLForString:(NSString *)urlString { NSURL *url = [NSURL URLWithString:urlString]; if ([url.scheme isEqualToString:@"file"]) { - return url; + return [self isAllowedLocalURL:url] ? url : nil; } if ([url.scheme isEqualToString:@"http"] || [url.scheme isEqualToString:@"https"]) { return nil; } if ([urlString isAbsolutePath]) { - return [NSURL fileURLWithPath:urlString]; + NSURL *fileURL = [NSURL fileURLWithPath:urlString]; + return [self isAllowedLocalURL:fileURL] ? fileURL : nil; } - NSString *filename = urlString.lastPathComponent; + NSString *relativePath = url.path.length > 0 ? url.path : urlString; + relativePath = relativePath.stringByStandardizingPath; + if (relativePath.length == 0 || [relativePath isEqualToString:@"."] || + [relativePath isEqualToString:@".."] || + [relativePath hasPrefix:@"../"]) { + return nil; + } + NSString *filename = relativePath.lastPathComponent; + NSString *subdirectory = relativePath.stringByDeletingLastPathComponent; NSString *extension = filename.pathExtension; NSString *name = extension.length > 0 ? [filename stringByDeletingPathExtension] : filename; return [[NSBundle mainBundle] URLForResource:name - withExtension:extension.length > 0 ? extension : nil]; + withExtension:extension.length > 0 ? extension : nil + subdirectory:[subdirectory isEqualToString:@"."] + ? nil + : subdirectory]; +} + +- (BOOL)isAllowedLocalURL:(NSURL *)url { + NSString *path = url.URLByStandardizingPath.URLByResolvingSymlinksInPath.path; + for (NSURL *directory in @[[NSBundle mainBundle].bundleURL, + self.resourceCacheDirectory]) { + NSString *directoryPath = + directory.URLByStandardizingPath.URLByResolvingSymlinksInPath.path; + NSString *prefix = [directoryPath stringByAppendingString:@"/"]; + if ([path hasPrefix:prefix]) return YES; + } + return NO; } - (NSError *)errorWithMessage:(NSString *)message { diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift b/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift index 7371ed29946..2f0385bc9df 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift @@ -12,15 +12,14 @@ final class ViewController: UIViewController { let lynxView = LynxView { builder in builder.config = LynxConfig(provider: self.resourceFetcher) - builder.screenSize = self.view.bounds.size + builder.screenSize = self.contentFrame.size builder.fontScale = 1.0 self.resourceFetcher.configure(builder) } - lynxView.frame = view.bounds - lynxView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - lynxView.preferredLayoutWidth = view.bounds.width - lynxView.preferredLayoutHeight = view.bounds.height + lynxView.frame = contentFrame + lynxView.preferredLayoutWidth = contentFrame.width + lynxView.preferredLayoutHeight = contentFrame.height lynxView.layoutWidthMode = .exact lynxView.layoutHeightMode = .exact view.addSubview(lynxView) @@ -44,8 +43,15 @@ final class ViewController: UIViewController { override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() - lynxView?.preferredLayoutWidth = view.bounds.width - lynxView?.preferredLayoutHeight = view.bounds.height + guard let lynxView else { return } + let frame = contentFrame + lynxView.frame = frame + lynxView.updateScreenMetrics(withWidth: frame.width, height: frame.height) + lynxView.updateViewport( + withPreferredLayoutWidth: frame.width, + preferredLayoutHeight: frame.height, + needLayout: true + ) } deinit { @@ -72,4 +78,9 @@ final class ViewController: UIViewController { return "main.lynx.bundle" #endif } + + private var contentFrame: CGRect { + let frame = view.safeAreaLayoutGuide.layoutFrame + return frame.isEmpty ? view.bounds : frame + } } diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift index c7fe67008f6..dceafd234dc 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift @@ -1,6 +1,21 @@ import XCTest final class OrbitControlUITests: XCTestCase { + func testEmbeddedReleaseHostLaunches() throws { + try XCTSkipUnless( + ProcessInfo.processInfo.environment["ORBIT_RELEASE_SMOKE"] == "1" + ) + + let app = XCUIApplication() + app.launchEnvironment["LYNX_BUNDLE_URL"] = "" + app.launch() + + let loadButton = app.descendants(matching: .any) + .matching(NSPredicate(format: "label == %@", "Load remote catalog")) + .firstMatch + XCTAssertTrue(loadButton.waitForExistence(timeout: 30)) + } + func testFederatedImportsRuntimeLoadingAndSingleton() { addUIInterruptionMonitor(withDescription: "Local network permission") { alert in guard alert.buttons["Allow"].exists else { return false } diff --git a/apps/lynx-module-federation-demo/package.json b/apps/lynx-module-federation-demo/package.json index c858f553b06..43d0df1434f 100644 --- a/apps/lynx-module-federation-demo/package.json +++ b/apps/lynx-module-federation-demo/package.json @@ -20,7 +20,8 @@ "e2e:web": "pnpm run build:web && node test/real-web/run.mjs", "ios:open": "open ios/OrbitControl.xcworkspace", "ios:pods": "cd ios && bundle install && bundle exec pod install --deployment --repo-update", - "ios:prepare": "LYNX_REMOTE_ORIGIN=http://localhost:3000 pnpm run build:native && pnpm run ios:sync", + "ios:device": "node scripts/dev-ios-device.mjs", + "ios:prepare": "pnpm run build:native && pnpm run ios:sync", "ios:sync": "node scripts/sync-ios-bundle.mjs", "preview": "node rspack-canary-rspeedy.mjs preview -c lynx.config.mjs", "preview:web": "node rspack-canary-rspeedy.mjs preview -c lynx.web.config.mjs", diff --git a/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs b/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs new file mode 100644 index 00000000000..90e84bc6054 --- /dev/null +++ b/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs @@ -0,0 +1,31 @@ +import assert from 'node:assert/strict'; +import { spawn } from 'node:child_process'; + +const origin = process.env.LYNX_REMOTE_ORIGIN; +assert.ok( + origin, + 'Set LYNX_REMOTE_ORIGIN to the phone-reachable LAN origin, for example http://192.168.1.10:3000.', +); +const url = new URL(origin); +assert.ok( + url.protocol === 'http:' || url.protocol === 'https:', + 'LYNX_REMOTE_ORIGIN must use HTTP(S).', +); +assert.ok( + !['localhost', '127.0.0.1', '::1'].includes(url.hostname), + 'LYNX_REMOTE_ORIGIN must be reachable from the phone, not a loopback address.', +); + +const child = spawn('pnpm', ['run', 'dev'], { + env: { + ...process.env, + LYNX_DEV_HOST: '0.0.0.0', + }, + stdio: 'inherit', +}); +child.once('error', (error) => { + throw error; +}); +child.once('exit', (code, signal) => { + process.exitCode = code ?? (signal ? 1 : 0); +}); diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index 13c31368e03..d12fc6c21ec 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -27,6 +27,8 @@ const [ debugInfo, project, uiTest, + packageJson, + deviceServer, ] = await Promise.all([ read('ios/Podfile'), read('ios/Podfile.lock'), @@ -36,6 +38,8 @@ const [ read('ios/OrbitControl/Info.Debug.plist'), read('ios/OrbitControl.xcodeproj/project.pbxproj'), read('ios/OrbitControlUITests/OrbitControlUITests.swift'), + read('package.json'), + read('scripts/dev-ios-device.mjs'), ]); for (const pod of ['Lynx', 'LynxService', 'XElement']) { @@ -49,6 +53,9 @@ assert.match(provenance, /f8230ca6aa1c9e629e30272971d0c03450b13e8e/); assert.match(fetcher, /LynxBooleanOptionTrue/); assert.match(fetcher, /builder\.templateResourceFetcher = self/); assert.match(fetcher, /builder\.genericResourceFetcher = self/); +assert.match(fetcher, /isAllowedLocalURL/); +assert.match(fetcher, /resourcePathCache/); +assert.match(fetcher, /URLByResolvingSymlinksInPath/); assert.doesNotMatch(releaseInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(releaseInfo, /NSExceptionAllowsInsecureHTTPLoads/); assert.match(debugInfo, /NSAllowsLocalNetworking/); @@ -58,6 +65,10 @@ assert.doesNotMatch(debugInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(project, /DEVELOPMENT_TEAM/); assert.match(project, /OrbitControlUITests/); assert.match(uiTest, /Shared singleton verified/); +assert.match(uiTest, /testEmbeddedReleaseHostLaunches/); +assert.match(packageJson, /"ios:device": "node scripts\/dev-ios-device\.mjs"/); +assert.match(deviceServer, /LYNX_DEV_HOST: '0\.0\.0\.0'/); +assert.match(deviceServer, /not a loopback address/); process.stdout.write( 'Standalone official Lynx iOS project policy validated.\n', ); diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index 0f81b583f08..f4ffc393bdb 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -23,10 +23,15 @@ const artifactsRoot = path.join(iosRoot, 'build'); const requestLogPath = path.join(artifactsRoot, 'requests.json'); const screenshotPath = path.join(artifactsRoot, 'orbit-control.png'); const resultBundlePath = path.join(artifactsRoot, 'OrbitControl.xcresult'); +const releaseResultBundlePath = path.join( + artifactsRoot, + 'OrbitControl-Release.xcresult', +); const requestedPaths = []; await mkdir(artifactsRoot, { recursive: true }); await rm(resultBundlePath, { force: true, recursive: true }); +await rm(releaseResultBundlePath, { force: true, recursive: true }); await stat(path.join(distRoot, 'host-native/main.lynx.bundle')); await stat(path.join(distRoot, 'remote-native/mf-manifest.json')); const manifest = JSON.parse( @@ -97,23 +102,43 @@ const devices = Object.entries(JSON.parse(simulatorList.stdout).devices) ) .filter((device) => device.isAvailable && device.name.startsWith('iPhone')); assert.ok(devices.length > 0, 'No available iPhone simulator was found.'); -const device = +const templateDevice = devices.find(({ name }) => name.includes('16 Pro')) ?? devices[0]; +assert.ok( + templateDevice.deviceTypeIdentifier, + `Simulator ${templateDevice.name} did not report a device type.`, +); await new Promise((resolve, reject) => { server.once('error', reject); server.listen(serverPort, '127.0.0.1', resolve); }); +let deviceUDID; try { - const boot = spawnSync('xcrun', ['simctl', 'boot', device.udid], { + const created = spawnSync( + 'xcrun', + [ + 'simctl', + 'create', + `OrbitControl E2E ${process.pid}`, + templateDevice.deviceTypeIdentifier, + templateDevice.runtime, + ], + { encoding: 'utf8' }, + ); + assert.equal(created.status, 0, created.stderr); + deviceUDID = created.stdout.trim(); + assert.ok(deviceUDID, 'simctl create did not return a device identifier.'); + + const boot = spawnSync('xcrun', ['simctl', 'boot', deviceUDID], { encoding: 'utf8', }); assert.ok( boot.status === 0 || /current state: Booted/.test(boot.stderr), boot.stderr, ); - await run('xcrun', ['simctl', 'bootstatus', device.udid, '-b']); + await run('xcrun', ['simctl', 'bootstatus', deviceUDID, '-b']); await run( 'xcodebuild', [ @@ -123,7 +148,7 @@ try { '-scheme', 'OrbitControl', '-destination', - `platform=iOS Simulator,id=${device.udid}`, + `platform=iOS Simulator,id=${deviceUDID}`, '-derivedDataPath', 'build/DerivedData', '-resultBundlePath', @@ -138,6 +163,33 @@ try { }, }, ); + await run( + 'xcodebuild', + [ + 'test', + '-workspace', + 'OrbitControl.xcworkspace', + '-scheme', + 'OrbitControl', + '-configuration', + 'Release', + '-destination', + `platform=iOS Simulator,id=${deviceUDID}`, + '-derivedDataPath', + 'build/DerivedData', + '-resultBundlePath', + 'build/OrbitControl-Release.xcresult', + '-parallel-testing-enabled', + 'NO', + '-only-testing:OrbitControlUITests/OrbitControlUITests/testEmbeddedReleaseHostLaunches', + ], + { + env: { + ...process.env, + ORBIT_RELEASE_SMOKE: '1', + }, + }, + ); const remoteEntry = manifest.metaData.remoteEntry; const expected = [ @@ -164,13 +216,20 @@ try { ); } finally { await writeFile(requestLogPath, JSON.stringify(requestedPaths, null, 2)); - spawnSync( - 'xcrun', - ['simctl', 'io', device.udid, 'screenshot', screenshotPath], - { + if (deviceUDID) { + spawnSync( + 'xcrun', + ['simctl', 'io', deviceUDID, 'screenshot', screenshotPath], + { + encoding: 'utf8', + }, + ); + spawnSync('xcrun', ['simctl', 'shutdown', deviceUDID], { encoding: 'utf8', - }, - ); - spawnSync('xcrun', ['simctl', 'shutdown', device.udid], { encoding: 'utf8' }); + }); + spawnSync('xcrun', ['simctl', 'delete', deviceUDID], { + encoding: 'utf8', + }); + } await new Promise((resolve) => server.close(resolve)); } diff --git a/apps/lynx-module-federation-demo/test/native-dev-server.mjs b/apps/lynx-module-federation-demo/test/native-dev-server.mjs index cbecbc1ec2e..5c12ada1a68 100644 --- a/apps/lynx-module-federation-demo/test/native-dev-server.mjs +++ b/apps/lynx-module-federation-demo/test/native-dev-server.mjs @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { readdir, rm } from 'node:fs/promises'; +import { mkdtemp, readdir, rename, rm } from 'node:fs/promises'; import { createServer } from 'node:net'; import { spawn, spawnSync } from 'node:child_process'; import path from 'node:path'; @@ -29,32 +29,12 @@ const devEnvironment = { LYNX_DEV_PORT: String(port), LYNX_REMOTE_ORIGIN: origin, }; -await rm(path.join(appRoot, 'dist/remote-native'), { - force: true, - recursive: true, -}); -const remoteBuild = spawnSync( - process.execPath, - ['rspack-canary-rspeedy.mjs', 'build', '-c', 'lynx.remote.native.config.mjs'], - { cwd: appRoot, encoding: 'utf8', env: devEnvironment }, -); -assert.equal( - remoteBuild.status, - 0, - `Native remote rebuild failed:\n${remoteBuild.stdout}\n${remoteBuild.stderr}`, -); const output = []; -const child = spawn( - process.execPath, - ['rspack-canary-rspeedy.mjs', 'dev', '-c', 'lynx.config.mjs'], - { - cwd: appRoot, - env: devEnvironment, - stdio: ['ignore', 'pipe', 'pipe'], - }, -); -child.stdout.on('data', (chunk) => output.push(chunk.toString())); -child.stderr.on('data', (chunk) => output.push(chunk.toString())); +const distRoot = path.join(appRoot, 'dist'); +const backupRoot = await mkdtemp(path.join(appRoot, '.lynx-e2e-')); +const preservedDist = path.join(backupRoot, 'dist'); +await rename(distRoot, preservedDist); +let child; const fetchReady = async (url, timeout = 30_000) => { const deadline = Date.now() + timeout; @@ -75,6 +55,33 @@ const fetchReady = async (url, timeout = 30_000) => { }; try { + const remoteBuild = spawnSync( + process.execPath, + [ + 'rspack-canary-rspeedy.mjs', + 'build', + '-c', + 'lynx.remote.native.config.mjs', + ], + { cwd: appRoot, encoding: 'utf8', env: devEnvironment }, + ); + assert.equal( + remoteBuild.status, + 0, + `Native remote rebuild failed:\n${remoteBuild.stdout}\n${remoteBuild.stderr}`, + ); + child = spawn( + process.execPath, + ['rspack-canary-rspeedy.mjs', 'dev', '-c', 'lynx.config.mjs'], + { + cwd: appRoot, + env: devEnvironment, + stdio: ['ignore', 'pipe', 'pipe'], + }, + ); + child.stdout.on('data', (chunk) => output.push(chunk.toString())); + child.stderr.on('data', (chunk) => output.push(chunk.toString())); + await fetchReady(`${origin}/main.lynx.bundle`); const manifestResponse = await fetchReady( `${origin}/remote-native/mf-manifest.json`, @@ -103,10 +110,15 @@ try { `Native Rspeedy dev server served host, manifest, container, and ${lazyBundles.length} lazy bundles.\n`, ); } finally { - child.kill('SIGTERM'); - await Promise.race([ - new Promise((resolve) => child.once('exit', resolve)), - new Promise((resolve) => setTimeout(resolve, 5_000)), - ]); - if (child.exitCode === null) child.kill('SIGKILL'); + if (child) { + child.kill('SIGTERM'); + await Promise.race([ + new Promise((resolve) => child.once('exit', resolve)), + new Promise((resolve) => setTimeout(resolve, 5_000)), + ]); + if (child.exitCode === null) child.kill('SIGKILL'); + } + await rm(distRoot, { force: true, recursive: true }); + await rename(preservedDist, distRoot); + await rm(backupRoot, { force: true, recursive: true }); } From a1b7251d08d7f15ed719ffe1fb2005201d5006ac Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 07:09:06 +0000 Subject: [PATCH 05/68] fix(lynx): tighten iOS lifecycle tests --- .../ios/OrbitControl/OrbitResourceFetcher.m | 15 ++---- .../OrbitControlUITests.swift | 6 +-- .../scripts/dev-ios-device.mjs | 29 +++++++++++- .../test/ios-project.mjs | 21 ++++++++- .../test/ios/run.mjs | 46 ++++++++----------- 5 files changed, 72 insertions(+), 45 deletions(-) diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m index a8c5ef861a1..e4da0450b45 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m @@ -12,7 +12,6 @@ @interface OrbitResourceFetcher () @property(nonatomic, strong) NSMutableDictionary *resourcePathCache; -@property(nonatomic, strong) NSMutableArray *resourcePathCacheOrder; @property(nonatomic, strong) NSURL *resourceCacheDirectory; - (dispatch_block_t)loadDataForURLString:(NSString *)urlString @@ -34,7 +33,6 @@ - (instancetype)init { self = [super init]; if (self) { _resourcePathCache = [NSMutableDictionary dictionary]; - _resourcePathCacheOrder = [NSMutableArray array]; _resourceCacheDirectory = [[[NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES] URLByAppendingPathComponent:@"OrbitResources" @@ -143,16 +141,13 @@ - (NSString *_Nullable)storeResourceData:(NSData *)data [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil]; return existingPath; } + if (self.resourcePathCache.count >= OrbitResourcePathCacheLimit) { + [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil]; + *error = [self errorWithMessage:@"Lynx resource path cache is full"]; + return nil; + } self.resourcePathCache[urlString] = fileURL.path; - [self.resourcePathCacheOrder addObject:urlString]; - if (self.resourcePathCacheOrder.count > OrbitResourcePathCacheLimit) { - NSString *expiredURL = self.resourcePathCacheOrder.firstObject; - NSString *expiredPath = self.resourcePathCache[expiredURL]; - [self.resourcePathCacheOrder removeObjectAtIndex:0]; - [self.resourcePathCache removeObjectForKey:expiredURL]; - [[NSFileManager defaultManager] removeItemAtPath:expiredPath error:nil]; - } } return fileURL.path; } diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift index dceafd234dc..b906211374f 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift @@ -1,11 +1,7 @@ import XCTest final class OrbitControlUITests: XCTestCase { - func testEmbeddedReleaseHostLaunches() throws { - try XCTSkipUnless( - ProcessInfo.processInfo.environment["ORBIT_RELEASE_SMOKE"] == "1" - ) - + func testEmbeddedReleaseHostLaunches() { let app = XCUIApplication() app.launchEnvironment["LYNX_BUNDLE_URL"] = "" app.launch() diff --git a/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs b/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs index 90e84bc6054..0931bc4e9b5 100644 --- a/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs +++ b/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs @@ -1,5 +1,28 @@ import assert from 'node:assert/strict'; import { spawn } from 'node:child_process'; +import { isIP } from 'node:net'; + +const isPhoneReachableHostname = (hostname) => { + const normalized = hostname.replace(/^\[|\]$/g, '').toLowerCase(); + if (normalized === 'localhost' || normalized.endsWith('.localhost')) { + return false; + } + if (isIP(normalized) === 4) { + const firstOctet = Number(normalized.split('.')[0]); + return firstOctet !== 0 && firstOctet !== 127; + } + if (isIP(normalized) === 6) { + if (normalized.startsWith('::ffff:')) { + const mapped = normalized.slice('::ffff:'.length); + const firstOctet = mapped.includes('.') + ? Number(mapped.split('.')[0]) + : Number.parseInt(mapped.split(':')[0], 16) >> 8; + if (firstOctet === 0 || firstOctet === 127) return false; + } + return normalized !== '::' && normalized !== '::1'; + } + return true; +}; const origin = process.env.LYNX_REMOTE_ORIGIN; assert.ok( @@ -12,10 +35,12 @@ assert.ok( 'LYNX_REMOTE_ORIGIN must use HTTP(S).', ); assert.ok( - !['localhost', '127.0.0.1', '::1'].includes(url.hostname), - 'LYNX_REMOTE_ORIGIN must be reachable from the phone, not a loopback address.', + isPhoneReachableHostname(url.hostname), + 'LYNX_REMOTE_ORIGIN must be reachable from the phone, not a loopback or unspecified address.', ); +if (process.argv.includes('--check-origin')) process.exit(0); + const child = spawn('pnpm', ['run', 'dev'], { env: { ...process.env, diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index d12fc6c21ec..04a6a87ef43 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -1,4 +1,5 @@ import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; import { access, readFile } from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -68,7 +69,25 @@ assert.match(uiTest, /Shared singleton verified/); assert.match(uiTest, /testEmbeddedReleaseHostLaunches/); assert.match(packageJson, /"ios:device": "node scripts\/dev-ios-device\.mjs"/); assert.match(deviceServer, /LYNX_DEV_HOST: '0\.0\.0\.0'/); -assert.match(deviceServer, /not a loopback address/); +assert.match(deviceServer, /not a loopback or unspecified address/); +const deviceServerPath = path.join(appRoot, 'scripts/dev-ios-device.mjs'); +const validateDeviceOrigin = (origin) => + spawnSync(process.execPath, [deviceServerPath, '--check-origin'], { + encoding: 'utf8', + env: { ...process.env, LYNX_REMOTE_ORIGIN: origin }, + }).status; +assert.equal(validateDeviceOrigin('http://192.168.1.20:3000'), 0); +for (const origin of [ + 'http://localhost:3000', + 'http://dev.localhost:3000', + 'http://127.42.0.1:3000', + 'http://0.0.0.0:3000', + 'http://[::1]:3000', + 'http://[::]:3000', + 'http://[::ffff:7f00:1]:3000', +]) { + assert.notEqual(validateDeviceOrigin(origin), 0, origin); +} process.stdout.write( 'Standalone official Lynx iOS project policy validated.\n', ); diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index f4ffc393bdb..b6690cabda5 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -155,6 +155,7 @@ try { 'build/OrbitControl.xcresult', '-parallel-testing-enabled', 'NO', + '-only-testing:OrbitControlUITests/OrbitControlUITests/testFederatedImportsRuntimeLoadingAndSingleton', ], { env: { @@ -163,33 +164,24 @@ try { }, }, ); - await run( - 'xcodebuild', - [ - 'test', - '-workspace', - 'OrbitControl.xcworkspace', - '-scheme', - 'OrbitControl', - '-configuration', - 'Release', - '-destination', - `platform=iOS Simulator,id=${deviceUDID}`, - '-derivedDataPath', - 'build/DerivedData', - '-resultBundlePath', - 'build/OrbitControl-Release.xcresult', - '-parallel-testing-enabled', - 'NO', - '-only-testing:OrbitControlUITests/OrbitControlUITests/testEmbeddedReleaseHostLaunches', - ], - { - env: { - ...process.env, - ORBIT_RELEASE_SMOKE: '1', - }, - }, - ); + await run('xcodebuild', [ + 'test', + '-workspace', + 'OrbitControl.xcworkspace', + '-scheme', + 'OrbitControl', + '-configuration', + 'Release', + '-destination', + `platform=iOS Simulator,id=${deviceUDID}`, + '-derivedDataPath', + 'build/DerivedData', + '-resultBundlePath', + 'build/OrbitControl-Release.xcresult', + '-parallel-testing-enabled', + 'NO', + '-only-testing:OrbitControlUITests/OrbitControlUITests/testEmbeddedReleaseHostLaunches', + ]); const remoteEntry = manifest.metaData.remoteEntry; const expected = [ From fd7e78e0e58f8cd43335db369f7cae2d9cf6e321 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 07:11:20 +0000 Subject: [PATCH 06/68] fix(lynx): validate iOS device origin --- .../ios/OrbitControl/OrbitResourceFetcher.m | 7 ------- .../scripts/dev-ios-device.mjs | 13 +++++++++++-- .../test/ios-project.mjs | 4 ++++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m index e4da0450b45..823e07dbf71 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m @@ -7,7 +7,6 @@ #import static NSString *const OrbitResourceErrorDomain = @"org.modulefederation.lynx.resources"; -static NSUInteger const OrbitResourcePathCacheLimit = 64; @interface OrbitResourceFetcher () @@ -141,12 +140,6 @@ - (NSString *_Nullable)storeResourceData:(NSData *)data [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil]; return existingPath; } - if (self.resourcePathCache.count >= OrbitResourcePathCacheLimit) { - [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil]; - *error = [self errorWithMessage:@"Lynx resource path cache is full"]; - return nil; - } - self.resourcePathCache[urlString] = fileURL.path; } return fileURL.path; diff --git a/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs b/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs index 0931bc4e9b5..5f8b39139a4 100644 --- a/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs +++ b/apps/lynx-module-federation-demo/scripts/dev-ios-device.mjs @@ -30,9 +30,18 @@ assert.ok( 'Set LYNX_REMOTE_ORIGIN to the phone-reachable LAN origin, for example http://192.168.1.10:3000.', ); const url = new URL(origin); +assert.equal( + url.protocol, + 'http:', + 'LYNX_REMOTE_ORIGIN must use HTTP because the Rspeedy development server does not terminate TLS.', +); assert.ok( - url.protocol === 'http:' || url.protocol === 'https:', - 'LYNX_REMOTE_ORIGIN must use HTTP(S).', + url.pathname === '/' && + !url.search && + !url.hash && + !url.username && + !url.password, + 'LYNX_REMOTE_ORIGIN must be an HTTP origin without a path, credentials, query, or fragment.', ); assert.ok( isPhoneReachableHostname(url.hostname), diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index 04a6a87ef43..bdd66b0d03a 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -85,6 +85,10 @@ for (const origin of [ 'http://[::1]:3000', 'http://[::]:3000', 'http://[::ffff:7f00:1]:3000', + 'https://192.168.1.20:3000', + 'http://192.168.1.20:3000/prefix', + 'http://192.168.1.20:3000?query=yes', + 'http://user:pass@192.168.1.20:3000', ]) { assert.notEqual(validateDeviceOrigin(origin), 0, origin); } From a85082219c1c19c899e1fe91063d40af8971886c Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 07:14:24 +0000 Subject: [PATCH 07/68] fix(lynx): bound iOS path cache --- .../ios/OrbitControl/OrbitResourceFetcher.m | 45 ++++++++++--------- .../test/ios-project.mjs | 1 + 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m index 823e07dbf71..7da1e0b976f 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m @@ -7,11 +7,13 @@ #import static NSString *const OrbitResourceErrorDomain = @"org.modulefederation.lynx.resources"; +static NSUInteger const OrbitResourcePathCacheByteLimit = 64 * 1024 * 1024; @interface OrbitResourceFetcher () @property(nonatomic, strong) NSMutableDictionary *resourcePathCache; @property(nonatomic, strong) NSURL *resourceCacheDirectory; +@property(nonatomic, assign) NSUInteger resourcePathCacheBytes; - (dispatch_block_t)loadDataForURLString:(NSString *)urlString completion:(void (^)(NSData *_Nullable, @@ -117,32 +119,33 @@ - (NSString *_Nullable)cachedResourcePathForURLString:(NSString *)urlString { - (NSString *_Nullable)storeResourceData:(NSData *)data forURLString:(NSString *)urlString error:(NSError **)error { - NSString *cachedPath = [self cachedResourcePathForURLString:urlString]; - if (cachedPath) return cachedPath; - - [[NSFileManager defaultManager] createDirectoryAtURL:self.resourceCacheDirectory - withIntermediateDirectories:YES - attributes:nil - error:error]; - if (*error) return nil; - - NSString *extension = [NSURL URLWithString:urlString].pathExtension; - NSString *filename = NSUUID.UUID.UUIDString; - if (extension.length > 0) { - filename = [filename stringByAppendingPathExtension:extension]; - } - NSURL *fileURL = [self.resourceCacheDirectory URLByAppendingPathComponent:filename]; - if (![data writeToURL:fileURL options:NSDataWritingAtomic error:error]) return nil; - @synchronized(self) { NSString *existingPath = self.resourcePathCache[urlString]; - if (existingPath) { - [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil]; - return existingPath; + if (existingPath) return existingPath; + if (data.length > + OrbitResourcePathCacheByteLimit - self.resourcePathCacheBytes) { + *error = [self errorWithMessage:@"Lynx resource path cache exceeded 64 MiB"]; + return nil; + } + + [[NSFileManager defaultManager] createDirectoryAtURL:self.resourceCacheDirectory + withIntermediateDirectories:YES + attributes:nil + error:error]; + if (*error) return nil; + + NSString *extension = [NSURL URLWithString:urlString].pathExtension; + NSString *filename = NSUUID.UUID.UUIDString; + if (extension.length > 0) { + filename = [filename stringByAppendingPathExtension:extension]; } + NSURL *fileURL = [self.resourceCacheDirectory URLByAppendingPathComponent:filename]; + if (![data writeToURL:fileURL options:NSDataWritingAtomic error:error]) return nil; + self.resourcePathCache[urlString] = fileURL.path; + self.resourcePathCacheBytes += data.length; + return fileURL.path; } - return fileURL.path; } - (dispatch_block_t)loadDataForURLString:(NSString *)urlString diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index bdd66b0d03a..acbf1944a60 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -56,6 +56,7 @@ assert.match(fetcher, /builder\.templateResourceFetcher = self/); assert.match(fetcher, /builder\.genericResourceFetcher = self/); assert.match(fetcher, /isAllowedLocalURL/); assert.match(fetcher, /resourcePathCache/); +assert.match(fetcher, /OrbitResourcePathCacheByteLimit/); assert.match(fetcher, /URLByResolvingSymlinksInPath/); assert.doesNotMatch(releaseInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(releaseInfo, /NSExceptionAllowsInsecureHTTPLoads/); From 7087042c226779ee911f49a1d123bcbd05c3ace2 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 08:05:13 +0000 Subject: [PATCH 08/68] fix(lynx): stabilize iOS readiness probe --- .../OrbitControlUITests.swift | 8 ++-- .../src/app/App.tsx | 47 ++++++++++++------- .../test/ios-project.mjs | 9 +++- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift index b906211374f..34bc1fbe234 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift @@ -32,12 +32,10 @@ final class OrbitControlUITests: XCTestCase { XCTAssertTrue(loadButton.waitForExistence(timeout: 30)) loadButton.tap() - let singleton = app.descendants(matching: .any) - .matching(NSPredicate(format: "label == %@", "Shared singleton verified")) + let readiness = app.descendants(matching: .any) + .matching(identifier: "federation-ready") .firstMatch - XCTAssertTrue(singleton.waitForExistence(timeout: 60)) - XCTAssertTrue(app.staticTexts["Compiled imports ready"].exists) - XCTAssertTrue(app.staticTexts["Runtime API ready"].exists) + XCTAssertTrue(readiness.waitForExistence(timeout: 60)) let attachment = XCTAttachment(screenshot: XCUIScreen.main.screenshot()) attachment.name = "Orbit Control federation loaded" diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index 3ec055d8192..d41f2fe0086 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -111,6 +111,31 @@ function SingletonProof({ shared: boolean; state: SharedStateView; }) { + const status = !ready + ? { + accessibilityId: undefined, + accessibilityLabel: 'Waiting for remote observers', + className: 'SingletonProofStatus', + key: 'waiting', + text: 'Waiting for remote observers', + } + : shared + ? { + accessibilityId: 'federation-ready', + accessibilityLabel: + 'Federation ready: compiled imports, runtime API, shared singleton', + className: 'SingletonProofStatus SingletonProofStatusReady', + key: 'ready', + text: 'Shared singleton verified', + } + : { + accessibilityId: undefined, + accessibilityLabel: 'Singleton identity mismatch', + className: 'SingletonProofStatus', + key: 'mismatch', + text: 'Singleton identity mismatch', + }; + return ( @@ -122,26 +147,14 @@ function SingletonProof({ REALM-LOCAL IDENTITY - {ready - ? shared - ? 'Shared singleton verified' - : 'Singleton identity mismatch' - : 'Waiting for remote observers'} + {status.text} diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index acbf1944a60..40398063872 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -28,6 +28,7 @@ const [ debugInfo, project, uiTest, + appSource, packageJson, deviceServer, ] = await Promise.all([ @@ -39,6 +40,7 @@ const [ read('ios/OrbitControl/Info.Debug.plist'), read('ios/OrbitControl.xcodeproj/project.pbxproj'), read('ios/OrbitControlUITests/OrbitControlUITests.swift'), + read('src/app/App.tsx'), read('package.json'), read('scripts/dev-ios-device.mjs'), ]); @@ -66,7 +68,12 @@ assert.match(debugInfo, /localhost<\/key>/); assert.doesNotMatch(debugInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(project, /DEVELOPMENT_TEAM/); assert.match(project, /OrbitControlUITests/); -assert.match(uiTest, /Shared singleton verified/); +assert.match(uiTest, /matching\(identifier: "federation-ready"\)/); +assert.match(appSource, /accessibilityId: 'federation-ready'/); +assert.match( + appSource, + /ios-platform-accessibility-id=\{status\.accessibilityId\}/, +); assert.match(uiTest, /testEmbeddedReleaseHostLaunches/); assert.match(packageJson, /"ios:device": "node scripts\/dev-ios-device\.mjs"/); assert.match(deviceServer, /LYNX_DEV_HOST: '0\.0\.0\.0'/); From 36a52bdeebb38e16811bb8335e208887efe8f262 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 08:54:31 +0000 Subject: [PATCH 09/68] ci(lynx): extend native iOS timeout --- .github/workflows/e2e-lynx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 730646c9d8d..dead4de5387 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -107,7 +107,7 @@ jobs: needs: e2e-lynx if: needs.e2e-lynx.outputs.run-e2e == 'true' runs-on: macos-15 - timeout-minutes: 60 + timeout-minutes: 120 env: DEVELOPER_DIR: /Applications/Xcode_16.4.app/Contents/Developer NO_COLOR: 1 From 5fce98bef463862e945c90925a2680913b96c09f Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 09:54:31 +0000 Subject: [PATCH 10/68] fix(lynx): pair native remote UI layers --- apps/lynx-module-federation-demo/README.md | 12 ++-- .../test/native-artifacts.mjs | 12 +++- packages/lynx/README.md | 29 +++++---- packages/lynx/src/plugin.test.ts | 59 ++++++++++++++++--- packages/lynx/src/pluginOptions.ts | 4 +- packages/lynx/src/remoteBundle.ts | 47 ++++++++------- 6 files changed, 111 insertions(+), 52 deletions(-) diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index a00b231843d..2e890802fed 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -5,7 +5,8 @@ simulation. It includes: - a standalone UIKit iOS application derived from Lynx's official `HelloLynxSwift` starter; -- a native background host and remote built as `.lynx.bundle` artifacts; +- a native background host with paired ReactLynx remote UI built as + `.lynx.bundle` artifacts; - a Lynx for Web host mounted in the official `` custom element; - ordinary `import('catalog/Card')` and runtime `loadRemote()` consumers; - three lazy remote screens loaded over HTTP from `mf-manifest.json`; @@ -101,10 +102,11 @@ Explorer on the device and scan it. The phone must be able to reach Set `CATALOG_NATIVE_MANIFEST_URL` when the remote manifest is hosted elsewhere. `e2e:native` is artifact and transport validation. It compiles the real Rspeedy -host and remote, verifies both binary bundles, checks the manifest's background -expose/share layer metadata, then launches the dev server and fetches the host, -manifest, container, and every lazy bundle over HTTP. The macOS CI job adds a -real iOS Simulator runtime test of those artifacts. +host and remote, verifies the background container plus paired main-thread +snapshot bytecode in every lazy UI bundle, checks the manifest's public +background expose/share metadata, then fetches the host, manifest, container, +and every lazy bundle over HTTP. The macOS CI job adds a real iOS Simulator +runtime test of those artifacts. ## Run the real Lynx Web E2E diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index c5bfc67d91c..8564009883b 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -113,6 +113,16 @@ for (const exposed of manifest.exposes) { lazyTemplate['background-thread-script']?.length > 0, `${lazyName} has no background script`, ); + assert.ok( + lazyTemplate['main-thread-script']?.lepus_code_len > 100, + `${lazyName} has no main-thread snapshot bytecode`, + ); + assert.ok( + lazyTemplate['background-thread-script'].some(({ content }) => + content?.includes('__lynx_dynamic_component_entry__'), + ), + `${lazyName} does not preserve its DynamicComponent entry identity`, + ); assert.ok( !JSON.stringify(exposed).includes('__main_thread'), `${exposed.name} contains a main-thread alias`, @@ -126,7 +136,7 @@ assert.deepEqual( ); for (const shared of manifest.shared) { assert.equal(shared.layer, 'react:background', shared.name); - assert.equal(shared.shareScope, undefined); + assert.deepEqual(shared.shareScope, ['default:react:background']); assert.equal(shared.singleton, true, shared.name); } assert.deepEqual( diff --git a/packages/lynx/README.md b/packages/lynx/README.md index 1cf4eef8cb3..3f165a0dfa5 100644 --- a/packages/lynx/README.md +++ b/packages/lynx/README.md @@ -73,7 +73,8 @@ URL. The adapter rewrites `metaData.remoteEntry` to the public ## Remote bundles -Native remotes are background-only: +Native split remotes keep the Module Federation runtime in the background realm +while compiling each ReactLynx exposure for both official issuer layers: ```ts pluginLynxModuleFederation( @@ -122,9 +123,10 @@ pluginLynxModuleFederation(federationOptions, { `split` is the federation-safe default. It avoids placing every expose and shared fallback in the entry bundle. Keep all emitted lazy `.bundle` files beside the remote entry (or under its manifest `publicPath`) when publishing. -Each ReactLynx exposure needs its own paired background/main-thread lazy root, -so Web remotes reject `single`. Native `single` is limited to background-only -modules; ReactLynx UI exposures must remain split. +Each ReactLynx exposure needs its own paired background/main-thread lazy root. +Split native bundles encode both programs into one DynamicComponent artifact; +Web remotes use the equivalent paired external bundle. Web remotes reject +`single`, and native `single` is limited to background-only non-UI modules. Ordinary Rspeedy entry bundles are preserved by default. A dedicated remote environment may set `preserveSourceEntryBundles: false` to publish only its @@ -155,12 +157,12 @@ may use `type: 'lynx-js'` and `lynx.requireModuleAsync`. ## Layers and singletons -With `mainThread: true`, exposes are compiled for both Lynx issuer layers and -shared declarations are registered in a realm-qualified scope. Unqualified -shares default to the background realm; use `realm: 'main-thread'` only for a -module authored for that runtime. The semantic realm is resolved against the -DSL's exposed layer constants, so application configs do not hard-code layer -names. +Split remote bundles and hosts with `mainThread: true` compile exposes for both +Lynx issuer layers and register shared declarations in realm-qualified scopes. +Unqualified shares default to the background realm; use +`realm: 'main-thread'` only for a module authored for that runtime. The semantic +realm is resolved against the DSL's exposed layer constants, so application +configs do not hard-code layer names. A singleton is unique within one JavaScript realm, share scope, and share key. The host, compiled imports, runtime API consumers, and remotes can therefore @@ -187,9 +189,10 @@ flowchart TB TS --> TI["main-thread singleton instance"] ``` -Native TASM/MTS main-thread output is currently rejected because the enhanced -federation runtime is not TASM-compatible. Native federation supports the -background realm; dual-realm federation targets Lynx for Web. +The enhanced federation runtime itself executes in the native background +realm. Native split UI bundles still include their paired TASM/MTS main-thread +snapshot program; this is compiled component output, not a second runtime or a +second remote container. JavaScript object identity remains realm-local. See `apps/lynx-module-federation-demo` for an official Rspeedy native app, native artifact checks, and a real Lynx for Web browser E2E. diff --git a/packages/lynx/src/plugin.test.ts b/packages/lynx/src/plugin.test.ts index 2ccab12e869..0ae54da4ce7 100644 --- a/packages/lynx/src/plugin.test.ts +++ b/packages/lynx/src/plugin.test.ts @@ -444,7 +444,7 @@ describe('pluginLynxModuleFederation', () => { ).toEqual([]); }); - it('builds a native background-only remote with the official TASM encoder', async () => { + it('builds a paired native remote with the official TASM encoder', async () => { const { modifyRspackConfig } = setupPlugin( { name: 'catalog', @@ -465,9 +465,13 @@ describe('pluginLynxModuleFederation', () => { (plugin: any) => plugin.options?.bundleFileName, ) as any; - expect(config.plugins).toHaveLength(4); + expect(config.plugins).toHaveLength(5); expect(remoteOptions).toMatchObject({ name: 'catalog', + shareScope: [ + `default:${LAYERS.BACKGROUND}`, + `default:${LAYERS.MAIN_THREAD}`, + ], filename: 'catalog.js', manifest: true, runtime: false, @@ -477,19 +481,27 @@ describe('pluginLynxModuleFederation', () => { layer: LAYERS.BACKGROUND, name: 'catalog__background_Card', }, - }, - shared: { - '@lynx-js/react': { - singleton: true, - layer: LAYERS.BACKGROUND, - issuerLayer: LAYERS.BACKGROUND, + './Card__main_thread': { + import: './src/Card', + layer: LAYERS.MAIN_THREAD, + name: 'catalog__main-thread__Card', }, }, + shared: [ + { + '@lynx-js/react': { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ], }); - expect(remoteOptions.exposes).not.toHaveProperty('./Card__main_thread'); expect(encoder.options).toMatchObject({ bundleFileName: 'catalog-native.lynx.bundle', engineVersion: '3.6', + entryAssets: ['catalog.js'], mainThreadChunks: [], }); expect(encoder.options.encode).toBeTypeOf('function'); @@ -512,6 +524,35 @@ describe('pluginLynxModuleFederation', () => { expect(buffer.byteLength).toBeGreaterThan(100); }); + it('keeps native single bundles background-only', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './data': './src/data' }, + shared: { state: { singleton: true } }, + }, + { remoteBundle: { target: 'lynx', chunking: 'single' } }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + const remoteOptions = federationOptions(config.plugins[0]); + + expect(config.plugins).toHaveLength(4); + expect(remoteOptions.exposes).toEqual({ + './data': { + import: './src/data', + layer: LAYERS.BACKGROUND, + name: 'catalog__background_data', + }, + }); + expect(remoteOptions.shared).toEqual({ + state: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + }, + }); + }); + it('preserves manifest file customization', async () => { const { modifyRspackConfig } = setupPlugin( { diff --git a/packages/lynx/src/pluginOptions.ts b/packages/lynx/src/pluginOptions.ts index 9a230443f7c..bdaf569ec9b 100644 --- a/packages/lynx/src/pluginOptions.ts +++ b/packages/lynx/src/pluginOptions.ts @@ -29,10 +29,10 @@ interface LynxRemoteBundleBaseOptions { } export interface LynxNativeRemoteBundleOptions extends LynxRemoteBundleBaseOptions { - /** Emit a native Lynx background-runtime bundle using `@lynx-js/tasm`. */ + /** Emit native Lynx bundles using `@lynx-js/tasm`. */ target: 'lynx'; /** - * Keep lazy bundles separate (`split`) or embed background-only module + * Keep paired UI bundles separate (`split`) or embed background-only module * chunks in the container (`single`). ReactLynx UI exposures require split. * * @defaultValue `'split'` diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index 9eb7633e6aa..672e774247c 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -129,10 +129,10 @@ const isModuleInLayer = (module: unknown, layer: string): boolean => { return (module as { layer?: string }).layer === layer; }; -const createWebRemoteAssetsPlugin = ( +const createRemoteAssetsPlugin = ( mainThreadChunks: string[], backgroundEntry: string, - mainThreadEntry: string, + mainThreadEntry: string | undefined, backgroundChunkPrefix: string, mainThreadLayer: string, ) => ({ @@ -147,18 +147,20 @@ const createWebRemoteAssetsPlugin = ( }, () => { mainThreadChunks.length = 0; - const entryAsset = compilation.getAsset(backgroundEntry); - if (!entryAsset) { - throw new Error( - `@module-federation/lynx could not find generated container asset "${backgroundEntry}".`, + if (mainThreadEntry) { + const entryAsset = compilation.getAsset(backgroundEntry); + if (!entryAsset) { + throw new Error( + `@module-federation/lynx could not find generated container asset "${backgroundEntry}".`, + ); + } + compilation.emitAsset( + mainThreadEntry, + entryAsset.source, + entryAsset.info, ); + mainThreadChunks.push(mainThreadEntry); } - compilation.emitAsset( - mainThreadEntry, - entryAsset.source, - entryAsset.info, - ); - mainThreadChunks.push(mainThreadEntry); for (const chunk of compilation.chunks) { const containsMainThreadModule = Array.from( @@ -297,7 +299,8 @@ export const configureRemoteBundle = async ( const backgroundChunkPrefix = `${options.name}__background_`; const mainThreadChunkPrefix = `${options.name}__main-thread__`; const webTarget = remoteBundle.target === 'web'; - const remoteExposes = webTarget + const pairedRealmTarget = remoteBundle.chunking !== 'single'; + const remoteExposes = pairedRealmTarget ? { ...createRemoteExposes( options.exposes!, @@ -316,12 +319,12 @@ export const configureRemoteBundle = async ( layers.BACKGROUND, backgroundChunkPrefix, ); - const remoteShared = webTarget + const remoteShared = pairedRealmTarget ? normalizeSharedForBothLayers(options.shared, layers) : normalizeLynxShared(options.shared, layers.BACKGROUND, layers); const federationOptions = { ...createFederationOptions( - webTarget + pairedRealmTarget ? { ...options, shareScope: getLynxShareScopes(options.shareScope, layers), @@ -351,18 +354,18 @@ export const configureRemoteBundle = async ( config.plugins.push( createCompilerModuleFederationPlugin(federationOptions), createLynxChunkLoadingMatcherPlugin(lynxTemplatePlugin, { - backgroundOnlyRemote: !webTarget, + backgroundOnlyRemote: !pairedRealmTarget, chunking: remoteBundle.chunking ?? 'split', discardSourceEntryBundles: remoteBundle.preserveSourceEntryBundles === false, discardedTemplateAssets, includedChunkPrefixes: [ backgroundChunkPrefix, - ...(webTarget ? [mainThreadChunkPrefix] : []), + ...(pairedRealmTarget ? [mainThreadChunkPrefix] : []), ], lazyBundleAssets, remoteEntryName: options.name, - ...(webTarget + ...(pairedRealmTarget ? { pairedRealmChunkPrefixes: { background: backgroundChunkPrefix, @@ -376,12 +379,12 @@ export const configureRemoteBundle = async ( : {}), }), ); - if (webTarget) { + if (pairedRealmTarget) { config.plugins.push( - createWebRemoteAssetsPlugin( + createRemoteAssetsPlugin( mainThreadChunks, backgroundEntry, - mainThreadEntry, + webTarget ? mainThreadEntry : undefined, backgroundChunkPrefix, layers.MAIN_THREAD, ), @@ -398,7 +401,7 @@ export const configureRemoteBundle = async ( entryName: options.name, includedChunkPrefixes: [ backgroundChunkPrefix, - ...(webTarget ? [mainThreadChunkPrefix] : []), + ...(pairedRealmTarget ? [mainThreadChunkPrefix] : []), ], lazyBundleAssets, mainThreadChunks, From 65f525a0eaef6ab66356648cb389f347e2228f5c Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 10:23:26 +0000 Subject: [PATCH 11/68] fix(lynx): preserve native lazy chunk semantics --- packages/lynx/README.md | 8 +- packages/lynx/src/runtimeChunkLoading.test.ts | 745 ++++++++++++++++++ packages/lynx/src/runtimeChunkLoading.ts | 217 +++-- packages/lynx/src/runtimePlugin.test.ts | 532 +------------ 4 files changed, 910 insertions(+), 592 deletions(-) create mode 100644 packages/lynx/src/runtimeChunkLoading.test.ts diff --git a/packages/lynx/README.md b/packages/lynx/README.md index 3f165a0dfa5..2fb9ab387fb 100644 --- a/packages/lynx/README.md +++ b/packages/lynx/README.md @@ -146,9 +146,11 @@ The runtime fetches and registers the container with `lynx.fetchBundle`, then evaluates its section with `lynx.loadScript`. In split mode, the generated Lynx async-chunk map supplies the lazy `.bundle` URL; `lynx.loadLazyBundle` fetches it, and the returned `ids`, `modules`, and `runtime` install into the -calling webpack runtime. Failed and timed-out entry loads are evicted so a -later request can retry. The default timeout is 30 seconds and can be changed -with `runtimePluginOptions.timeout`. +calling webpack runtime. Cached lazy bundles retain ReactLynx's synchronous +thenable so a first render can resolve in the same turn; asynchronous shared +consumes and network loads remain promise- and timeout-bound. Failed and +timed-out entry loads are evicted so a later request can retry. The default +timeout is 30 seconds and can be changed with `runtimePluginOptions.timeout`. The manifest declares `remoteEntry.type: 'lynx'`. The runtime plugin handles only that type (or a `.lynx.bundle` URL), leaving `script`, `module`, and other diff --git a/packages/lynx/src/runtimeChunkLoading.test.ts b/packages/lynx/src/runtimeChunkLoading.test.ts new file mode 100644 index 00000000000..abc8d77e456 --- /dev/null +++ b/packages/lynx/src/runtimeChunkLoading.test.ts @@ -0,0 +1,745 @@ +import { describe, expect, it, rs } from '@rstest/core'; + +import { + LYNX_BUNDLE_REGISTRY, + patchLynxChunkLoading, + type LynxWebpackRequire, +} from './runtimePlugin'; + +const remoteRegistry = () => + new Map([ + ['remote', 'lynx-cache://catalog'], + ['remote:remote-origin', 'https://cdn.example/remotes/catalog.lynx.bundle'], + ]); + +const createWebpackRequire = ( + filename = 'chunks/feature.js?cache=1#fragment', +): LynxWebpackRequire => ({ + f: {}, + m: {}, + u: rs.fn(() => filename), +}); + +const createGlobalObject = ( + loadLazyBundle: (request: string) => PromiseLike, +) => ({ + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: remoteRegistry(), +}); + +const makeSynchronousThenable = (value: T): PromiseLike => { + const thenable = { + then(onFulfilled?: ((resolved: T) => unknown) | null) { + if (!onFulfilled) { + return makeSynchronousThenable(value); + } + try { + return makeSynchronousThenable(onFulfilled(value)); + } catch (error) { + return Promise.reject(error); + } + }, + }; + return thenable as PromiseLike; +}; + +describe('patchLynxChunkLoading', () => { + it('settles overlapping loads from the first bundle containing both chunks', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + first: 'async/first.bundle', + second: 'async/second.bundle', + }; + const resolvers = new Map void>(); + const globalObject = createGlobalObject( + (request) => + new Promise((resolve) => { + resolvers.set(request, resolve); + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const first: PromiseLike[] = []; + const second: PromiseLike[] = []; + webpackRequire.f.j!('first', first); + webpackRequire.f.j!('second', second); + + const firstFactory = rs.fn(); + const firstRuntime = rs.fn(); + resolvers.get('https://cdn.example/remotes/async/first.bundle')!({ + ids: ['first', 'second'], + modules: { feature: firstFactory }, + runtime: firstRuntime, + }); + await Promise.all([first[0], second[0]]); + + expect(webpackRequire.m.feature).toBe(firstFactory); + expect(firstRuntime).toHaveBeenCalledTimes(1); + + const staleRuntime = rs.fn(); + resolvers.get('https://cdn.example/remotes/async/second.bundle')!({ + ids: ['second'], + modules: { stale: rs.fn() }, + runtime: staleRuntime, + }); + await Promise.resolve(); + expect(webpackRequire.m.stale).toBeUndefined(); + expect(staleRuntime).not.toHaveBeenCalled(); + }); + + it('preserves the official synchronous lazy-bundle thenable', () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + const globalObject = createGlobalObject(() => + makeSynchronousThenable({ + ids: ['feature'], + modules: { factory }, + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + + expect(webpackRequire.m.factory).toBe(factory); + let observed = false; + promises[0].then(() => { + observed = true; + }); + expect(observed).toBe(true); + }); + + it('waits for shared consumes from a synchronous lazy bundle', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.consumesLoadingData = { + chunkMapping: { feature: ['shared-state'] }, + }; + let resolveConsume!: () => void; + const consume = new Promise((resolve) => { + resolveConsume = () => { + webpackRequire.m['shared-state'] = rs.fn(); + resolve(); + }; + }); + webpackRequire.f.consumes = (_chunkId, promises) => { + promises.push(consume); + }; + const factory = rs.fn(); + const globalObject = createGlobalObject(() => + makeSynchronousThenable({ + ids: ['feature'], + modules: { factory }, + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + + let observed = false; + promises[0].then(() => { + observed = true; + }); + expect(observed).toBe(false); + expect(webpackRequire.m.factory).toBeUndefined(); + resolveConsume(); + await expect(promises[0]).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('does not let a stale consume rejection cancel a retry', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.consumesLoadingData = { + chunkMapping: { feature: ['shared-state'] }, + }; + let rejectExpired!: (error: Error) => void; + const expiredConsume = new Promise((_resolve, reject) => { + rejectExpired = reject; + }); + let resolveFresh!: () => void; + const freshConsume = new Promise((resolve) => { + resolveFresh = () => { + webpackRequire.m['shared-state'] = rs.fn(); + resolve(); + }; + }); + let consumeAttempt = 0; + webpackRequire.f.consumes = (_chunkId, promises) => { + promises.push(consumeAttempt++ === 0 ? expiredConsume : freshConsume); + }; + const factory = rs.fn(); + const globalObject = createGlobalObject(() => + makeSynchronousThenable({ + ids: ['feature'], + modules: { factory }, + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); + const expired: PromiseLike[] = []; + webpackRequire.f.j!('feature', expired); + await expect(expired[0]).rejects.toThrow( + 'Timed out loading Lynx lazy bundle', + ); + + const fresh: PromiseLike[] = []; + webpackRequire.f.j!('feature', fresh); + rejectExpired(new Error('stale consume failed')); + await Promise.resolve(); + resolveFresh(); + await expect(fresh[0]).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('ignores a stale lazy bundle that resolves after timeout', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const resolvers: Array<(value: unknown) => void> = []; + const globalObject = createGlobalObject( + () => + new Promise((resolve) => { + resolvers.push(resolve); + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); + const expired: PromiseLike[] = []; + webpackRequire.f.j!('feature', expired); + await expect(expired[0]).rejects.toThrow( + 'Timed out loading Lynx lazy bundle', + ); + + const fresh: PromiseLike[] = []; + webpackRequire.f.j!('feature', fresh); + resolvers[0]({ + ids: ['feature'], + modules: { factory: rs.fn() }, + }); + await Promise.resolve(); + expect(webpackRequire.m.factory).toBeUndefined(); + + const freshFactory = rs.fn(); + resolvers[1]({ ids: ['feature'], modules: { factory: freshFactory } }); + await expect(fresh[0]).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(freshFactory); + }); + + it('installs and deduplicates section chunks', async () => { + const webpackRequire = createWebpackRequire(); + const factory = rs.fn(); + const runtime = rs.fn(); + const nestedPromises: Promise[] = []; + const loadScript = rs.fn(() => { + webpackRequire.f.j!('feature', nestedPromises); + return { + ids: ['feature'], + modules: { factory }, + runtime, + }; + }); + const globalObject = { + lynx: { requireModuleAsync: () => undefined, loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), + }; + + expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( + true, + ); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + + expect(loadScript).toHaveBeenCalledTimes(1); + expect(loadScript).toHaveBeenCalledWith('chunks/feature', { + bundleName: 'lynx-cache://remote', + }); + expect(nestedPromises[0]).toBe(promises[0]); + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + expect(runtime).toHaveBeenCalledWith(webpackRequire); + }); + + it('loads split remote chunks as independently fetched Lynx lazy bundles', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + feature: 'async/catalog__background_Card.123.bundle', + }; + webpackRequire.p = '/remote-assets/'; + const factory = rs.fn(); + const loadScript = rs.fn(); + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'https://cdn.example/cache/catalog.lynx.bundle'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remote-assets/async/catalog__background_Card.123.bundle', + ); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('preserves protocol-relative lazy bundle and public-path URLs', async () => { + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'https://origin.example/catalog.lynx.bundle'], + ['remote:remote-origin', 'https://origin.example/catalog.lynx.bundle'], + ]), + }; + const publicPathRequire = createWebpackRequire(); + publicPathRequire.lynx_aci = { feature: 'async/Card.bundle' }; + publicPathRequire.p = '//cdn.example/assets/'; + patchLynxChunkLoading(publicPathRequire, 'remote', globalObject); + const publicPathPromises: Promise[] = []; + publicPathRequire.f.j!('feature', publicPathPromises); + await Promise.all(publicPathPromises); + + const assetRequire = createWebpackRequire(); + assetRequire.lynx_aci = { + feature: '//assets.example/chunks/Card.bundle', + }; + patchLynxChunkLoading(assetRequire, 'remote', globalObject); + const assetPromises: Promise[] = []; + assetRequire.f.j!('feature', assetPromises); + await Promise.all(assetPromises); + + expect(loadLazyBundle).toHaveBeenNthCalledWith( + 1, + '//cdn.example/assets/async/Card.bundle', + ); + expect(loadLazyBundle).toHaveBeenNthCalledWith( + 2, + '//assets.example/chunks/Card.bundle', + ); + }); + + it('restores the lazy-bundle identity while deferred module factories execute', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const observedEntries: unknown[] = []; + const factory = rs.fn(() => { + observedEntries.push(globalObject.globDynamicComponentEntry); + }); + const globalObject: any = { + globDynamicComponentEntry: '__Card__', + lynx: { + loadLazyBundle: async () => ({ + __lynx_dynamic_component_entry__: 'https://cdn.example/Card.bundle', + ids: ['feature'], + modules: { factory }, + }), + loadScript: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + ['remote:remote-origin', 'https://cdn.example/catalog.lynx.bundle'], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + ( + webpackRequire.m.factory as ( + module: unknown, + exports: unknown, + require: unknown, + ) => unknown + )({}, {}, webpackRequire); + + expect(observedEntries).toEqual(['https://cdn.example/Card.bundle']); + expect(globalObject.globDynamicComponentEntry).toBe('__Card__'); + }); + + it('loads atomic chunks from sections in the already-fetched container', async () => { + const webpackRequire = createWebpackRequire( + 'async/catalog__background_Card.js', + ); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.lynx_chunking = 'single'; + const factory = rs.fn(); + const loadLazyBundle = rs.fn(); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript, requireModuleAsync: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://catalog']]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).not.toHaveBeenCalled(); + expect(loadScript).toHaveBeenCalledWith('async/catalog__background_Card', { + bundleName: 'lynx-cache://catalog', + }); + }); + + it('uses the official lazy-bundle API for split chunks', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + const fetchBundle = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://Card', + })); + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: { factory }, + })); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { + fetchBundle, + loadLazyBundle, + loadScript, + requireModuleAsync: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + ); + expect(fetchBundle).not.toHaveBeenCalled(); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('times out split chunks and permits retry', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const loadLazyBundle = rs.fn(() => new Promise(() => undefined)); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); + for (let attempt = 0; attempt < 2; attempt += 1) { + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).rejects.toThrow( + 'Timed out loading Lynx lazy bundle', + ); + } + expect(loadLazyBundle).toHaveBeenCalledTimes(2); + }); + + it('rejects split chunks when no DynamicComponent API exists', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const fetchBundle = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://Card', + })); + const loadScript = rs.fn(); + const globalObject = { + lynx: { fetchBundle, loadScript, requireModuleAsync: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).rejects.toThrow( + 'requires QueryComponent and getDynamicComponentExports', + ); + + expect(fetchBundle).not.toHaveBeenCalled(); + expect(loadScript).not.toHaveBeenCalled(); + }); + + it('loads split chunks through QueryComponent when loadLazyBundle is unavailable', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + feature: 'async/Card.123.bundle', + }; + const factory = rs.fn(); + const chunk = { + ids: ['feature'], + modules: { factory }, + }; + const QueryComponent = rs.fn((_source, callback) => + callback({ code: 0, detail: { schema: 'Card' } }), + ); + const loadScript = rs.fn(); + const globalObject = { + lynx: { + loadScript, + QueryComponent, + requireModuleAsync: rs.fn(), + }, + lynxCoreInject: { + tt: { getDynamicComponentExports: () => chunk }, + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(QueryComponent).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.123.bundle', + expect.any(Function), + ); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('loads main-thread split chunks through the asynchronous Web QueryComponent API', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + const chunk = { ids: ['feature'], modules: { factory } }; + const queryComponent = rs.fn((_source, callback) => { + queueMicrotask(() => + callback({ + code: 0, + data: { evalResult: chunk, url: 'https://cdn.example/Card.bundle' }, + }), + ); + return null; + }); + const globalObject = { + __QueryComponent: queryComponent, + lynx: { loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(queryComponent).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + expect.any(Function), + ); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it.each([ + [ + undefined, + 'async/Card.bundle', + 'https://cdn.example/remotes/async/Card.bundle', + ], + [ + 'auto', + 'async/Card.bundle', + 'https://cdn.example/remotes/async/Card.bundle', + ], + ['/', 'async/Card.bundle', 'https://cdn.example/remotes/async/Card.bundle'], + [ + 'assets/', + 'async/Card.bundle', + 'https://cdn.example/remotes/assets/async/Card.bundle', + ], + ['/v2/', 'async/Card.bundle', 'https://cdn.example/v2/async/Card.bundle'], + [ + 'https://assets.example/v3/', + 'async/Card.bundle', + 'https://assets.example/v3/async/Card.bundle', + ], + [ + '/ignored/', + 'https://assets.example/Card.bundle', + 'https://assets.example/Card.bundle', + ], + ])( + 'resolves split public path %s against the manifest entry', + async (publicPath, assetPath, expected) => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: assetPath }; + webpackRequire.p = publicPath; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle?version=1', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith(expected); + }, + ); + + it('preserves the original chunk handler without a registered bundle', () => { + const originalHandler = rs.fn(); + const webpackRequire = createWebpackRequire(); + webpackRequire.f.j = originalHandler; + const globalObject = { + lynx: { loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map(), + }; + + expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( + false, + ); + const promises: Promise[] = []; + webpackRequire.f.j('feature', promises); + expect(originalHandler).toHaveBeenCalledWith('feature', promises); + }); + + it('evicts failed section loads so they can be retried', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const loadScript = rs + .fn<(sectionPath: string, options: { bundleName: string }) => unknown>() + .mockImplementationOnce(() => { + throw new Error('decode failed'); + }) + .mockImplementationOnce(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote__main_thread', 'lynx-cache://remote'], + ]), + }; + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + + const failedPromises: Promise[] = []; + webpackRequire.f.j!('feature', failedPromises); + await expect(Promise.all(failedPromises)).rejects.toThrow('decode failed'); + + const retriedPromises: Promise[] = []; + webpackRequire.f.j!('feature', retriedPromises); + await expect(Promise.all(retriedPromises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledTimes(2); + }); + + it('uses the main-thread container name without appending the realm twice', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote__main_thread', 'lynx-cache://remote'], + ]), + }; + + expect( + patchLynxChunkLoading( + webpackRequire, + 'remote__main_thread', + globalObject, + ), + ).toBe(true); + + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledWith('feature', { + bundleName: 'lynx-cache://remote', + }); + }); + + it('replaces the Lynx require chunk handler emitted by Rspeedy', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const originalHandler = rs.fn(); + webpackRequire.f.require = originalHandler; + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { requireModuleAsync: rs.fn(), loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.require!('feature', promises); + + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledWith('feature', { + bundleName: 'lynx-cache://remote', + }); + expect(originalHandler).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/lynx/src/runtimeChunkLoading.ts b/packages/lynx/src/runtimeChunkLoading.ts index b0e665618fc..470c8e83e31 100644 --- a/packages/lynx/src/runtimeChunkLoading.ts +++ b/packages/lynx/src/runtimeChunkLoading.ts @@ -10,7 +10,8 @@ import { import { loadWithTimeout } from './runtimeTimeout'; type ChunkId = string | number; -type ChunkHandler = (chunkId: ChunkId, promises: Promise[]) => void; +type ChunkPromise = PromiseLike; +type ChunkHandler = (chunkId: ChunkId, promises: ChunkPromise[]) => void; export interface LynxWebpackRequire { consumesLoadingData?: { @@ -31,7 +32,13 @@ interface LynxChunk { runtime?: (webpackRequire: LynxWebpackRequire) => void; } -type InstalledChunk = 0 | [() => void, (error: unknown) => void, Promise]; +type InstalledChunk = + | 0 + | [ + ((value?: unknown) => void) | undefined, + ((error: unknown) => void) | undefined, + ChunkPromise | undefined, + ]; const isChunk = (value: unknown): value is LynxChunk => isRecord(value) && @@ -107,7 +114,7 @@ const installChunk = ( for (const id of chunk.ids) { const installed = installedChunks[id]; if (installed) { - installed[0](); + installed[0]?.(chunk); } installedChunks[id] = 0; } @@ -118,7 +125,8 @@ const installChunkAfterConsumes = ( webpackRequire: LynxWebpackRequire, installedChunks: Record, globalObject: LynxGlobal, -): void => { + isActive: () => boolean = () => true, +): Promise | undefined => { const getMissingConsumes = (): string[] => chunk.ids.flatMap( (id) => @@ -127,6 +135,9 @@ const installChunkAfterConsumes = ( ) ?? [], ); const install = (): void => { + if (!isActive()) { + return; + } const missing = getMissingConsumes(); if (missing.length > 0) { throw new Error( @@ -149,20 +160,27 @@ const installChunkAfterConsumes = ( install(); return; } + const participatingLoads = new Map( + chunk.ids.map((id) => [id, installedChunks[id]]), + ); - Promise.all(promises) - .then(() => { + return Promise.all(promises).then( + () => { install(); - }) - .catch((error) => { + }, + (error) => { + if (!isActive()) { + throw error; + } for (const id of chunk.ids) { const installed = installedChunks[id]; - if (installed) { - delete installedChunks[id]; - installed[1](error); + if (installed && installed === participatingLoads.get(id)) { + installed[1]?.(error); } } - }); + throw error; + }, + ); }; interface QueryResolver { @@ -190,7 +208,7 @@ const queryError = (request: string, result: unknown): Error => { const withLazyBundleTimeout = ( request: string, timeout: number, - load: Promise, + load: PromiseLike, ): Promise => loadWithTimeout( timeout, @@ -204,9 +222,9 @@ const loadQueryComponent = ( request: string, lynx: NonNullable>, globalObject: LynxGlobal, -): Promise => { +): PromiseLike => { if (lynx.loadLazyBundle) { - return Promise.resolve(lynx.loadLazyBundle(request)); + return lynx.loadLazyBundle(request); } if (getLynxRealm(lynx) === 'main-thread') { @@ -264,6 +282,109 @@ const loadQueryComponent = ( return resolver.promise; }; +type ImmediateLazyLoad = + | { kind: 'pending' } + | { kind: 'installed' } + | { consumes: Promise; kind: 'waiting-consumes'; value: LynxChunk }; + +const loadLazyChunk = ( + request: string, + chunkKey: string, + timeout: number, + lynx: NonNullable>, + webpackRequire: LynxWebpackRequire, + installedChunks: Record, + globalObject: LynxGlobal, +): ChunkPromise => { + const loading: Exclude = [undefined, undefined, undefined]; + installedChunks[chunkKey] = loading; + let active = true; + let insideLoader = true; + const immediate: { current: ImmediateLazyLoad } = { + current: { kind: 'pending' }, + }; + const loaded = loadQueryComponent(request, lynx, globalObject).then( + (value) => { + if (!active) { + return value; + } + if (!isChunk(value)) { + throw new Error( + `Lynx lazy bundle "${request}" did not export a valid webpack chunk.`, + ); + } + if (!value.ids.some((id) => String(id) === chunkKey)) { + throw new Error( + `Lynx lazy bundle "${request}" did not include requested chunk "${chunkKey}".`, + ); + } + const consumes = installChunkAfterConsumes( + value, + webpackRequire, + installedChunks, + globalObject, + () => active, + ); + if (!consumes) { + if (insideLoader) { + immediate.current = { kind: 'installed' }; + } + return value; + } + if (insideLoader) { + immediate.current = { consumes, kind: 'waiting-consumes', value }; + return value; + } + return consumes.then(() => value); + }, + ); + insideLoader = false; + const outcome = immediate.current; + + let primary: ChunkPromise; + switch (outcome.kind) { + case 'installed': + primary = loaded; + break; + case 'waiting-consumes': + primary = withLazyBundleTimeout( + request, + timeout, + outcome.consumes.then(() => outcome.value), + ); + break; + default: + primary = withLazyBundleTimeout(request, timeout, loaded); + } + + let tracked = primary; + if (outcome.kind !== 'installed') { + const installedElsewhere = new Promise((resolve, reject) => { + loading[0] = (value) => { + active = false; + resolve(value); + }; + loading[1] = (error) => { + active = false; + reject(error); + }; + }); + tracked = Promise.race([primary, installedElsewhere]); + } + const promise = tracked.then( + (value) => value, + (error) => { + active = false; + if (installedChunks[chunkKey] === loading) { + delete installedChunks[chunkKey]; + } + throw error; + }, + ); + loading[2] = promise; + return promise; +}; + export const patchLynxChunkLoading = ( webpackRequire: LynxWebpackRequire, originName: string, @@ -293,19 +414,12 @@ export const patchLynxChunkLoading = ( return; } if (installed) { - promises.push(installed[2]); + if (installed[2]) { + promises.push(installed[2]); + } return; } - let resolveChunk!: () => void; - let rejectChunk!: (error: unknown) => void; - const promise = new Promise((resolve, reject) => { - resolveChunk = resolve; - rejectChunk = reject; - }); - installedChunks[key] = [resolveChunk, rejectChunk, promise]; - promises.push(promise); - const lazyBundlePath = webpackRequire.lynx_chunking === 'single' ? undefined @@ -319,42 +433,29 @@ export const patchLynxChunkLoading = ( webpackRequire.p, lazyBundlePath, ); - withLazyBundleTimeout( - request, - timeout, - loadQueryComponent(request, lynx, globalObject), - ) - .then( - (value) => { - if (!isChunk(value)) { - throw new Error( - `Lynx lazy bundle "${request}" did not export a valid webpack chunk.`, - ); - } - if (!value.ids.some((id) => String(id) === key)) { - throw new Error( - `Lynx lazy bundle "${request}" did not include requested chunk "${key}".`, - ); - } - installChunkAfterConsumes( - value, - webpackRequire, - installedChunks, - globalObject, - ); - }, - (error) => { - delete installedChunks[key]; - rejectChunk(error); - }, - ) - .catch((error) => { - delete installedChunks[key]; - rejectChunk(error); - }); + promises.push( + loadLazyChunk( + request, + key, + timeout, + lynx, + webpackRequire, + installedChunks, + globalObject, + ), + ); return; } + let resolveChunk!: (value?: unknown) => void; + let rejectChunk!: (error: unknown) => void; + const promise = new Promise((resolve, reject) => { + resolveChunk = resolve; + rejectChunk = reject; + }); + installedChunks[key] = [resolveChunk, rejectChunk, promise]; + promises.push(promise); + try { const sectionPath = getChunkSectionPath(webpackRequire.u(chunkId)); const value = loadScript(sectionPath, { bundleName }); diff --git a/packages/lynx/src/runtimePlugin.test.ts b/packages/lynx/src/runtimePlugin.test.ts index 4b50b7c550a..d0c54abe304 100644 --- a/packages/lynx/src/runtimePlugin.test.ts +++ b/packages/lynx/src/runtimePlugin.test.ts @@ -1,11 +1,7 @@ import { afterEach, describe, expect, it, rs } from '@rstest/core'; import type { ModuleFederationRuntimePlugin } from '@module-federation/runtime-core/types'; -import lynxRuntimePlugin, { - LYNX_BUNDLE_REGISTRY, - patchLynxChunkLoading, - type LynxWebpackRequire, -} from './runtimePlugin'; +import lynxRuntimePlugin, { LYNX_BUNDLE_REGISTRY } from './runtimePlugin'; type NativeCallback = (error: unknown, value: unknown) => void; @@ -332,529 +328,3 @@ describe('lynxRuntimePlugin entry loading', () => { ); }); }); - -describe('patchLynxChunkLoading', () => { - const createWebpackRequire = ( - filename = 'chunks/feature.js?cache=1#fragment', - ): LynxWebpackRequire => ({ - f: {}, - m: {}, - u: rs.fn(() => filename), - }); - - it('installs and deduplicates section chunks', async () => { - const webpackRequire = createWebpackRequire(); - const factory = rs.fn(); - const runtime = rs.fn(); - const nestedPromises: Promise[] = []; - const loadScript = rs.fn(() => { - webpackRequire.f.j!('feature', nestedPromises); - return { - ids: ['feature'], - modules: { factory }, - runtime, - }; - }); - const globalObject = { - lynx: { requireModuleAsync: () => undefined, loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), - }; - - expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( - true, - ); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - - expect(loadScript).toHaveBeenCalledTimes(1); - expect(loadScript).toHaveBeenCalledWith('chunks/feature', { - bundleName: 'lynx-cache://remote', - }); - expect(nestedPromises[0]).toBe(promises[0]); - await expect(Promise.all(promises)).resolves.toBeDefined(); - expect(webpackRequire.m.factory).toBe(factory); - expect(runtime).toHaveBeenCalledWith(webpackRequire); - }); - - it('loads split remote chunks as independently fetched Lynx lazy bundles', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { - feature: 'async/catalog__background_Card.123.bundle', - }; - webpackRequire.p = '/remote-assets/'; - const factory = rs.fn(); - const loadScript = rs.fn(); - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: { factory }, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'https://cdn.example/cache/catalog.lynx.bundle'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - - await expect(Promise.all(promises)).resolves.toBeDefined(); - expect(loadLazyBundle).toHaveBeenCalledWith( - 'https://cdn.example/remote-assets/async/catalog__background_Card.123.bundle', - ); - expect(loadScript).not.toHaveBeenCalled(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('preserves protocol-relative lazy bundle and public-path URLs', async () => { - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'https://origin.example/catalog.lynx.bundle'], - ['remote:remote-origin', 'https://origin.example/catalog.lynx.bundle'], - ]), - }; - const publicPathRequire = createWebpackRequire(); - publicPathRequire.lynx_aci = { feature: 'async/Card.bundle' }; - publicPathRequire.p = '//cdn.example/assets/'; - patchLynxChunkLoading(publicPathRequire, 'remote', globalObject); - const publicPathPromises: Promise[] = []; - publicPathRequire.f.j!('feature', publicPathPromises); - await Promise.all(publicPathPromises); - - const assetRequire = createWebpackRequire(); - assetRequire.lynx_aci = { - feature: '//assets.example/chunks/Card.bundle', - }; - patchLynxChunkLoading(assetRequire, 'remote', globalObject); - const assetPromises: Promise[] = []; - assetRequire.f.j!('feature', assetPromises); - await Promise.all(assetPromises); - - expect(loadLazyBundle).toHaveBeenNthCalledWith( - 1, - '//cdn.example/assets/async/Card.bundle', - ); - expect(loadLazyBundle).toHaveBeenNthCalledWith( - 2, - '//assets.example/chunks/Card.bundle', - ); - }); - - it('restores the lazy-bundle identity while deferred module factories execute', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const observedEntries: unknown[] = []; - const factory = rs.fn(() => { - observedEntries.push(globalObject.globDynamicComponentEntry); - }); - const globalObject: any = { - globDynamicComponentEntry: '__Card__', - lynx: { - loadLazyBundle: async () => ({ - __lynx_dynamic_component_entry__: 'https://cdn.example/Card.bundle', - ids: ['feature'], - modules: { factory }, - }), - loadScript: rs.fn(), - }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - ['remote:remote-origin', 'https://cdn.example/catalog.lynx.bundle'], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - ( - webpackRequire.m.factory as ( - module: unknown, - exports: unknown, - require: unknown, - ) => unknown - )({}, {}, webpackRequire); - - expect(observedEntries).toEqual(['https://cdn.example/Card.bundle']); - expect(globalObject.globDynamicComponentEntry).toBe('__Card__'); - }); - - it('loads atomic chunks from sections in the already-fetched container', async () => { - const webpackRequire = createWebpackRequire( - 'async/catalog__background_Card.js', - ); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - webpackRequire.lynx_chunking = 'single'; - const factory = rs.fn(); - const loadLazyBundle = rs.fn(); - const loadScript = rs.fn(() => ({ - ids: ['feature'], - modules: { factory }, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript, requireModuleAsync: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://catalog']]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).not.toHaveBeenCalled(); - expect(loadScript).toHaveBeenCalledWith('async/catalog__background_Card', { - bundleName: 'lynx-cache://catalog', - }); - }); - - it('uses the official lazy-bundle API for split chunks', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const factory = rs.fn(); - const fetchBundle = rs.fn(async () => ({ - code: 0, - url: 'lynx-cache://Card', - })); - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: { factory }, - })); - const loadScript = rs.fn(() => ({ - ids: ['feature'], - modules: { factory }, - })); - const globalObject = { - lynx: { - fetchBundle, - loadLazyBundle, - loadScript, - requireModuleAsync: rs.fn(), - }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).toHaveBeenCalledWith( - 'https://cdn.example/remotes/async/Card.bundle', - ); - expect(fetchBundle).not.toHaveBeenCalled(); - expect(loadScript).not.toHaveBeenCalled(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('times out split chunks and permits retry', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const loadLazyBundle = rs.fn(() => new Promise(() => undefined)); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); - for (let attempt = 0; attempt < 2; attempt += 1) { - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await expect(Promise.all(promises)).rejects.toThrow( - 'Timed out loading Lynx lazy bundle', - ); - } - expect(loadLazyBundle).toHaveBeenCalledTimes(2); - }); - - it('rejects split chunks when no DynamicComponent API exists', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const fetchBundle = rs.fn(async () => ({ - code: 0, - url: 'lynx-cache://Card', - })); - const loadScript = rs.fn(); - const globalObject = { - lynx: { fetchBundle, loadScript, requireModuleAsync: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await expect(Promise.all(promises)).rejects.toThrow( - 'requires QueryComponent and getDynamicComponentExports', - ); - - expect(fetchBundle).not.toHaveBeenCalled(); - expect(loadScript).not.toHaveBeenCalled(); - }); - - it('loads split chunks through QueryComponent when loadLazyBundle is unavailable', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { - feature: 'async/Card.123.bundle', - }; - const factory = rs.fn(); - const chunk = { - ids: ['feature'], - modules: { factory }, - }; - const QueryComponent = rs.fn((_source, callback) => - callback({ code: 0, detail: { schema: 'Card' } }), - ); - const loadScript = rs.fn(); - const globalObject = { - lynx: { - loadScript, - QueryComponent, - requireModuleAsync: rs.fn(), - }, - lynxCoreInject: { - tt: { getDynamicComponentExports: () => chunk }, - }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(QueryComponent).toHaveBeenCalledWith( - 'https://cdn.example/remotes/async/Card.123.bundle', - expect.any(Function), - ); - expect(loadScript).not.toHaveBeenCalled(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('loads main-thread split chunks through the asynchronous Web QueryComponent API', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const factory = rs.fn(); - const chunk = { ids: ['feature'], modules: { factory } }; - const queryComponent = rs.fn((_source, callback) => { - queueMicrotask(() => - callback({ - code: 0, - data: { evalResult: chunk, url: 'https://cdn.example/Card.bundle' }, - }), - ); - return null; - }); - const globalObject = { - __QueryComponent: queryComponent, - lynx: { loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(queryComponent).toHaveBeenCalledWith( - 'https://cdn.example/remotes/async/Card.bundle', - expect.any(Function), - ); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it.each([ - [ - undefined, - 'async/Card.bundle', - 'https://cdn.example/remotes/async/Card.bundle', - ], - [ - 'auto', - 'async/Card.bundle', - 'https://cdn.example/remotes/async/Card.bundle', - ], - ['/', 'async/Card.bundle', 'https://cdn.example/remotes/async/Card.bundle'], - [ - 'assets/', - 'async/Card.bundle', - 'https://cdn.example/remotes/assets/async/Card.bundle', - ], - ['/v2/', 'async/Card.bundle', 'https://cdn.example/v2/async/Card.bundle'], - [ - 'https://assets.example/v3/', - 'async/Card.bundle', - 'https://assets.example/v3/async/Card.bundle', - ], - [ - '/ignored/', - 'https://assets.example/Card.bundle', - 'https://assets.example/Card.bundle', - ], - ])( - 'resolves split public path %s against the manifest entry', - async (publicPath, assetPath, expected) => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: assetPath }; - webpackRequire.p = publicPath; - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle?version=1', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).toHaveBeenCalledWith(expected); - }, - ); - - it('preserves the original chunk handler without a registered bundle', () => { - const originalHandler = rs.fn(); - const webpackRequire = createWebpackRequire(); - webpackRequire.f.j = originalHandler; - const globalObject = { - lynx: { loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map(), - }; - - expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( - false, - ); - const promises: Promise[] = []; - webpackRequire.f.j('feature', promises); - expect(originalHandler).toHaveBeenCalledWith('feature', promises); - }); - - it('evicts failed section loads so they can be retried', async () => { - const webpackRequire = createWebpackRequire('feature.js'); - const loadScript = rs - .fn<(sectionPath: string, options: { bundleName: string }) => unknown>() - .mockImplementationOnce(() => { - throw new Error('decode failed'); - }) - .mockImplementationOnce(() => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote__main_thread', 'lynx-cache://remote'], - ]), - }; - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - - const failedPromises: Promise[] = []; - webpackRequire.f.j!('feature', failedPromises); - await expect(Promise.all(failedPromises)).rejects.toThrow('decode failed'); - - const retriedPromises: Promise[] = []; - webpackRequire.f.j!('feature', retriedPromises); - await expect(Promise.all(retriedPromises)).resolves.toBeDefined(); - expect(loadScript).toHaveBeenCalledTimes(2); - }); - - it('uses the main-thread container name without appending the realm twice', async () => { - const webpackRequire = createWebpackRequire('feature.js'); - const loadScript = rs.fn(() => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote__main_thread', 'lynx-cache://remote'], - ]), - }; - - expect( - patchLynxChunkLoading( - webpackRequire, - 'remote__main_thread', - globalObject, - ), - ).toBe(true); - - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await expect(Promise.all(promises)).resolves.toBeDefined(); - expect(loadScript).toHaveBeenCalledWith('feature', { - bundleName: 'lynx-cache://remote', - }); - }); - - it('replaces the Lynx require chunk handler emitted by Rspeedy', async () => { - const webpackRequire = createWebpackRequire('feature.js'); - const originalHandler = rs.fn(); - webpackRequire.f.require = originalHandler; - const loadScript = rs.fn(() => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { requireModuleAsync: rs.fn(), loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.require!('feature', promises); - - await expect(Promise.all(promises)).resolves.toBeDefined(); - expect(loadScript).toHaveBeenCalledWith('feature', { - bundleName: 'lynx-cache://remote', - }); - expect(originalHandler).not.toHaveBeenCalled(); - }); -}); From 1f1358e33b2e4ee9b36f2b551241251883f78006 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 11:36:35 +0000 Subject: [PATCH 12/68] fix(lynx): harden native federation boundaries --- .github/workflows/e2e-lynx.yml | 25 +-- .../ios/OrbitControl/OrbitResourceFetcher.m | 133 +++++++++++- .../lynx.config.mjs | 3 +- .../lynx.remote.native.config.mjs | 3 +- .../test/ios-project.mjs | 5 + .../test/native-artifacts.mjs | 16 ++ packages/lynx/README.md | 5 + packages/lynx/package.json | 3 +- packages/lynx/scripts/cjs-require-smoke.cjs | 15 ++ packages/lynx/src/chunkLoadingMatcher.test.ts | 29 ++- packages/lynx/src/chunkLoadingMatcher.ts | 17 +- packages/lynx/src/externalBundle.test.ts | 24 +- packages/lynx/src/externalBundle.ts | 10 +- packages/lynx/src/plugin.test.ts | 150 ++++++++++++- packages/lynx/src/plugin.ts | 61 +++++- packages/lynx/src/pluginOptions.ts | 2 +- packages/lynx/src/remoteBundle.ts | 205 ++++++++++++------ packages/lynx/src/runtimeChunkLoading.test.ts | 89 ++++++++ packages/lynx/src/runtimeChunkLoading.ts | 24 +- packages/lynx/src/runtimeEntryLoader.ts | 54 +++-- packages/lynx/src/runtimePlugin.test.ts | 101 ++++++++- packages/lynx/src/runtimePlugin.ts | 15 +- packages/runtime-core/__tests__/load.spec.ts | 36 +++ packages/runtime-core/src/remote/index.ts | 2 +- packages/runtime-core/src/utils/load.ts | 10 +- 25 files changed, 878 insertions(+), 159 deletions(-) create mode 100644 packages/lynx/scripts/cjs-require-smoke.cjs diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index dead4de5387..adc34d0075a 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -8,8 +8,6 @@ jobs: e2e-lynx: runs-on: ubuntu-latest timeout-minutes: 30 - outputs: - run-e2e: ${{ steps.check-ci.outputs.run-e2e }} steps: - name: Checkout Repository uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 @@ -44,38 +42,19 @@ jobs: - name: Build shared packages run: pnpm run build:packages - - name: Check CI conditions - id: check-ci - run: | - ci_status=0 - node tools/scripts/ci-is-affected.mjs --e2eSuite=lynx || ci_status=$? - if [ "$ci_status" -eq 0 ]; then - echo "run-e2e=true" >> "$GITHUB_OUTPUT" - elif [ "$ci_status" -eq 1 ]; then - echo "run-e2e=false" >> "$GITHUB_OUTPUT" - else - echo "ci-is-affected failed with unexpected exit code: $ci_status" >&2 - exit "$ci_status" - fi - - name: Install Playwright Chromium - if: steps.check-ci.outputs.run-e2e == 'true' run: pnpm --filter lynx-module-federation-demo exec playwright install --with-deps chromium - name: Test Lynx federation compiler and transport - if: steps.check-ci.outputs.run-e2e == 'true' run: pnpm --filter @module-federation/lynx test - name: Build and validate native Lynx artifacts - if: steps.check-ci.outputs.run-e2e == 'true' run: pnpm --filter lynx-module-federation-demo run e2e:native - name: Validate standalone iOS project policy - if: steps.check-ci.outputs.run-e2e == 'true' run: pnpm --filter lynx-module-federation-demo run test:ios-project - name: Upload native artifacts for iOS - if: steps.check-ci.outputs.run-e2e == 'true' uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: lynx-native-ios-input @@ -86,11 +65,10 @@ jobs: retention-days: 1 - name: Run real Lynx for Web E2E - if: steps.check-ci.outputs.run-e2e == 'true' run: pnpm --filter lynx-module-federation-demo run e2e:web - name: Upload Lynx E2E failure artifacts - if: failure() && steps.check-ci.outputs.run-e2e == 'true' + if: failure() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: lynx-module-federation-e2e-failure @@ -105,7 +83,6 @@ jobs: e2e-lynx-ios: needs: e2e-lynx - if: needs.e2e-lynx.outputs.run-e2e == 'true' runs-on: macos-15 timeout-minutes: 120 env: diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m index 7da1e0b976f..ba3f9fa9fc9 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m @@ -8,12 +8,95 @@ static NSString *const OrbitResourceErrorDomain = @"org.modulefederation.lynx.resources"; static NSUInteger const OrbitResourcePathCacheByteLimit = 64 * 1024 * 1024; +static NSUInteger const OrbitResourceResponseByteLimit = 64 * 1024 * 1024; + +typedef void (^OrbitResourceDownloadCompletion)(NSURL *_Nullable, + NSURLResponse *_Nullable, + NSError *_Nullable); + +@interface OrbitResourceSessionDelegate : NSObject + +@property(nonatomic, strong) NSMutableDictionary *completions; + +- (NSURLSessionDownloadTask *)downloadURL:(NSURL *)url + session:(NSURLSession *)session + completion:(OrbitResourceDownloadCompletion)completion; + +@end + +@implementation OrbitResourceSessionDelegate + +- (instancetype)init { + self = [super init]; + if (self) { + _completions = [NSMutableDictionary dictionary]; + } + return self; +} + +- (NSURLSessionDownloadTask *)downloadURL:(NSURL *)url + session:(NSURLSession *)session + completion:(OrbitResourceDownloadCompletion)completion { + NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url]; + @synchronized(self) { + self.completions[@(task.taskIdentifier)] = [completion copy]; + } + [task resume]; + return task; +} + +- (OrbitResourceDownloadCompletion)takeCompletionForTask:(NSURLSessionTask *)task { + @synchronized(self) { + NSNumber *key = @(task.taskIdentifier); + OrbitResourceDownloadCompletion completion = self.completions[key]; + [self.completions removeObjectForKey:key]; + return completion; + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { + (void)session; + (void)bytesWritten; + if (totalBytesWritten > (int64_t)OrbitResourceResponseByteLimit || + totalBytesExpectedToWrite > (int64_t)OrbitResourceResponseByteLimit) { + [downloadTask cancel]; + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location { + OrbitResourceDownloadCompletion completion = + [self takeCompletionForTask:downloadTask]; + if (completion) { + completion(location, downloadTask.response, nil); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error { + (void)session; + if (!error) return; + OrbitResourceDownloadCompletion completion = [self takeCompletionForTask:task]; + if (completion) { + completion(nil, task.response, error); + } +} + +@end @interface OrbitResourceFetcher () @property(nonatomic, strong) NSMutableDictionary *resourcePathCache; @property(nonatomic, strong) NSURL *resourceCacheDirectory; @property(nonatomic, assign) NSUInteger resourcePathCacheBytes; +@property(nonatomic, strong) NSURLSession *session; +@property(nonatomic, strong) OrbitResourceSessionDelegate *sessionDelegate; - (dispatch_block_t)loadDataForURLString:(NSString *)urlString completion:(void (^)(NSData *_Nullable, @@ -34,6 +117,15 @@ - (instancetype)init { self = [super init]; if (self) { _resourcePathCache = [NSMutableDictionary dictionary]; + NSURLSessionConfiguration *sessionConfiguration = + [NSURLSessionConfiguration ephemeralSessionConfiguration]; + sessionConfiguration.timeoutIntervalForRequest = 30; + sessionConfiguration.timeoutIntervalForResource = 60; + sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; + _sessionDelegate = [[OrbitResourceSessionDelegate alloc] init]; + _session = [NSURLSession sessionWithConfiguration:sessionConfiguration + delegate:_sessionDelegate + delegateQueue:nil]; _resourceCacheDirectory = [[[NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES] URLByAppendingPathComponent:@"OrbitResources" @@ -45,6 +137,7 @@ - (instancetype)init { } - (void)dealloc { + [self.session invalidateAndCancel]; [[NSFileManager defaultManager] removeItemAtURL:self.resourceCacheDirectory error:nil]; } @@ -167,9 +260,10 @@ - (dispatch_block_t)loadDataForURLString:(NSString *)urlString return ^{}; } - NSURLSessionDataTask *task = [[NSURLSession sharedSession] - dataTaskWithURL:url - completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + NSURLSessionDownloadTask *task = [self.sessionDelegate + downloadURL:url + session:self.session + completion:^(NSURL *location, NSURLResponse *response, NSError *error) { if (error) { completion(nil, error); return; @@ -185,14 +279,43 @@ - (dispatch_block_t)loadDataForURLString:(NSString *)urlString } } - if (!data) { + long long expectedLength = response.expectedContentLength; + if (expectedLength > (long long)OrbitResourceResponseByteLimit) { + completion(nil, [self errorWithMessage:[NSString stringWithFormat: + @"Lynx resource exceeds 64 MiB: %@", urlString]]); + return; + } + + if (!location) { completion(nil, [self errorWithMessage:[NSString stringWithFormat: @"Lynx resource request returned no data: %@", urlString]]); return; } + + NSError *readError = nil; + NSNumber *fileSize = nil; + if (![location getResourceValue:&fileSize + forKey:NSURLFileSizeKey + error:&readError]) { + completion(nil, readError); + return; + } + if (fileSize.unsignedLongLongValue > OrbitResourceResponseByteLimit) { + completion(nil, [self errorWithMessage:[NSString stringWithFormat: + @"Lynx resource exceeds 64 MiB: %@", urlString]]); + return; + } + + NSData *data = [NSData dataWithContentsOfURL:location + options:NSDataReadingMappedIfSafe + error:&readError]; + if (!data) { + completion(nil, readError ?: [self errorWithMessage:[NSString stringWithFormat: + @"Lynx resource request returned no data: %@", urlString]]); + return; + } completion(data, nil); }]; - [task resume]; return ^{ [task cancel]; }; } diff --git a/apps/lynx-module-federation-demo/lynx.config.mjs b/apps/lynx-module-federation-demo/lynx.config.mjs index e0d60168b62..50f90ebf667 100644 --- a/apps/lynx-module-federation-demo/lynx.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.config.mjs @@ -8,7 +8,8 @@ import { } from './federation.config.mjs'; const nativeRemoteOrigin = - process.env.LYNX_REMOTE_ORIGIN ?? 'http://127.0.0.1:3000'; + process.env.LYNX_REMOTE_ORIGIN?.replace(/\/+$/, '') ?? + 'http://127.0.0.1:3000'; const devHost = process.env.LYNX_DEV_HOST ?? '127.0.0.1'; const devPort = Number(process.env.LYNX_DEV_PORT ?? 3000); const nativeManifestUrl = diff --git a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs index 1e779135630..d3abac05964 100644 --- a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs @@ -7,7 +7,8 @@ import { } from './federation.config.mjs'; const nativeRemoteOrigin = - process.env.LYNX_REMOTE_ORIGIN ?? 'http://127.0.0.1:3000'; + process.env.LYNX_REMOTE_ORIGIN?.replace(/\/+$/, '') ?? + 'http://127.0.0.1:3000'; export default defineConfig({ plugins: [ diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index 40398063872..02e19e19c2b 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -59,6 +59,11 @@ assert.match(fetcher, /builder\.genericResourceFetcher = self/); assert.match(fetcher, /isAllowedLocalURL/); assert.match(fetcher, /resourcePathCache/); assert.match(fetcher, /OrbitResourcePathCacheByteLimit/); +assert.match(fetcher, /OrbitResourceResponseByteLimit/); +assert.match(fetcher, /downloadTaskWithURL/); +assert.match(fetcher, /totalBytesWritten > .*OrbitResourceResponseByteLimit/); +assert.match(fetcher, /\[downloadTask cancel\]/); +assert.match(fetcher, /timeoutIntervalForResource = 60/); assert.match(fetcher, /URLByResolvingSymlinksInPath/); assert.doesNotMatch(releaseInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(releaseInfo, /NSExceptionAllowsInsecureHTTPLoads/); diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index 8564009883b..d88d029f5b6 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -117,6 +117,22 @@ for (const exposed of manifest.exposes) { lazyTemplate['main-thread-script']?.lepus_code_len > 100, `${lazyName} has no main-thread snapshot bytecode`, ); + const mainThreadBytecode = Buffer.from( + lazyTemplate['main-thread-script'].lepus_code, + ); + assert.ok( + mainThreadBytecode.includes(Buffer.from('react__main-thread')), + `${lazyName} does not use the ReactLynx main-thread chunk contract`, + ); + for (const backgroundWrapperMarker of [ + 'bundleSupportLoadScript', + '__bundle__holder', + ]) { + assert.ok( + !mainThreadBytecode.includes(Buffer.from(backgroundWrapperMarker)), + `${lazyName} main-thread bytecode contains the background runtime wrapper marker ${backgroundWrapperMarker}`, + ); + } assert.ok( lazyTemplate['background-thread-script'].some(({ content }) => content?.includes('__lynx_dynamic_component_entry__'), diff --git a/packages/lynx/README.md b/packages/lynx/README.md index 2fb9ab387fb..2e9c4753be8 100644 --- a/packages/lynx/README.md +++ b/packages/lynx/README.md @@ -76,6 +76,11 @@ URL. The adapter rewrites `metaData.remoteEntry` to the public Native split remotes keep the Module Federation runtime in the background realm while compiling each ReactLynx exposure for both official issuer layers: +Configure the remote's ReactLynx plugin with +`pluginReactLynx({ experimental_isLazyBundle: true })`. Split federation uses +those DynamicComponent artifacts as independently transported exposures and +fails the build when the option is missing. + ```ts pluginLynxModuleFederation( { diff --git a/packages/lynx/package.json b/packages/lynx/package.json index ebc7778bad5..59d4adf96e6 100644 --- a/packages/lynx/package.json +++ b/packages/lynx/package.json @@ -97,9 +97,10 @@ "node": ">=18.0.0" }, "scripts": { - "build": "tsdown --config tsdown.config.mts", + "build": "tsdown --config tsdown.config.mts && pnpm run test:cjs", "lint": "ESLINT_USE_FLAT_CONFIG=false pnpm exec eslint --ignore-pattern node_modules \"**/*.ts\" \"package.json\"", "test": "pnpm exec rstest --passWithNoTests", + "test:cjs": "node ./scripts/cjs-require-smoke.cjs", "typecheck": "tsc -p tsconfig.lib.json --noEmit", "pre-release": "pnpm run test && pnpm run build" } diff --git a/packages/lynx/scripts/cjs-require-smoke.cjs b/packages/lynx/scripts/cjs-require-smoke.cjs new file mode 100644 index 00000000000..bca7e6bb292 --- /dev/null +++ b/packages/lynx/scripts/cjs-require-smoke.cjs @@ -0,0 +1,15 @@ +'use strict'; + +const assert = require('node:assert/strict'); +const lynx = require('..'); +const packageLynx = require('@module-federation/lynx'); +const runtimePlugin = require('@module-federation/lynx/runtimePlugin'); + +assert.equal(typeof lynx.pluginLynxModuleFederation, 'function'); +assert.equal(lynx.LYNX_RUNTIME_PLUGIN, '@module-federation/lynx/runtimePlugin'); +assert.equal( + packageLynx.pluginLynxModuleFederation, + lynx.pluginLynxModuleFederation, +); +assert.equal(typeof runtimePlugin.default, 'function'); +assert.equal(typeof runtimePlugin.patchLynxChunkLoading, 'function'); diff --git a/packages/lynx/src/chunkLoadingMatcher.test.ts b/packages/lynx/src/chunkLoadingMatcher.test.ts index b9f28d6f9b7..10cdae50f34 100644 --- a/packages/lynx/src/chunkLoadingMatcher.test.ts +++ b/packages/lynx/src/chunkLoadingMatcher.test.ts @@ -22,6 +22,12 @@ describe('Lynx chunk-loading matcher', () => { ids: [802], name: 'remote-react__background', }; + const mainThreadAssetlessChunk = { + files: new Set(), + getAllAsyncChunks: () => new Set(), + ids: [803], + name: 'catalog__main-thread__Empty-react__main-thread', + }; const localChunk = { files: new Set(['local.js']), getAllAsyncChunks: () => new Set(), @@ -34,7 +40,13 @@ describe('Lynx chunk-loading matcher', () => { ids: [456], name: 'styles', }; - const chunks = new Set([entryChunk, remoteChunk, localChunk, cssChunk]); + const chunks = new Set([ + entryChunk, + remoteChunk, + mainThreadAssetlessChunk, + localChunk, + cssChunk, + ]); const chunkGraph = { getNumberOfEntryModules(chunk: unknown) { return chunk === entryChunk ? 1 : 0; @@ -49,8 +61,8 @@ describe('Lynx chunk-loading matcher', () => { let beforeEncode: ((args: any) => any) | undefined; let beforeEmit: ((args: any) => any) | undefined; const addRuntimeModule = rs.fn(); - const discardedTemplateAssets = new Set(); - const lazyBundleAssets = new Set(); + const discardedTemplateAssets = new Set(['stale-template.bundle']); + const lazyBundleAssets = new Set(['stale-lazy.bundle']); class RuntimeModule { static STAGE_TRIGGER = 20; @@ -148,6 +160,8 @@ describe('Lynx chunk-loading matcher', () => { }, ).apply(compiler as any); onCompilation!(compilation); + expect(discardedTemplateAssets.size).toBe(0); + expect(lazyBundleAssets.size).toBe(0); addMatcher!(entryChunk); const cardArgs = { @@ -220,8 +234,11 @@ describe('Lynx chunk-loading matcher', () => { expect(renameAsyncChunk!('catalog__background_Card')).toBe( 'catalog__background_Card', ); - expect(renameAsyncChunk!('catalog__main-thread__Card')).toBe( - 'catalog__background_Card', - ); + expect( + renameAsyncChunk!('catalog__main-thread__Card-react__main-thread'), + ).toBe('catalog__background_Card'); + expect( + renameAsyncChunk!('catalog__main-thread__Empty-react__main-thread'), + ).toBe(''); }); }); diff --git a/packages/lynx/src/chunkLoadingMatcher.ts b/packages/lynx/src/chunkLoadingMatcher.ts index 3301d6ea49d..0f584e8c84b 100644 --- a/packages/lynx/src/chunkLoadingMatcher.ts +++ b/packages/lynx/src/chunkLoadingMatcher.ts @@ -129,11 +129,20 @@ export const createLynxChunkLoadingMatcherPlugin = ( const { RuntimeGlobals, RuntimeModule, Template } = compiler.webpack; compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { + options.lazyBundleAssets?.clear(); + options.discardedTemplateAssets?.clear(); let remoteChunkNames: Set | undefined; const templateHooks = lynxTemplatePlugin?.getLynxTemplatePluginHooks(compilation); templateHooks?.asyncChunkName.tap(pluginName, (chunkName) => { const layerSuffixes = options.pairedRealmChunkSuffixes; + const normalizedChunkName = layerSuffixes + ? [layerSuffixes.background, layerSuffixes.mainThread].reduce( + (name, suffix) => + name.endsWith(suffix) ? name.slice(0, -suffix.length) : name, + chunkName, + ) + : chunkName; const hasAssetlessChunk = Array.from(compilation.chunks).some( (chunk) => { if ( @@ -149,7 +158,7 @@ export const createLynxChunkLoadingMatcherPlugin = ( : undefined; return ( (suffix ? chunk.name.slice(0, -suffix.length) : chunk.name) === - chunkName + normalizedChunkName ); }, ); @@ -157,9 +166,9 @@ export const createLynxChunkLoadingMatcherPlugin = ( return ''; } const prefixes = options.pairedRealmChunkPrefixes; - return prefixes && chunkName.startsWith(prefixes.mainThread) - ? `${prefixes.background}${chunkName.slice(prefixes.mainThread.length)}` - : chunkName; + return prefixes && normalizedChunkName.startsWith(prefixes.mainThread) + ? `${prefixes.background}${normalizedChunkName.slice(prefixes.mainThread.length)}` + : normalizedChunkName; }); if (options.backgroundOnlyRemote) { templateHooks?.beforeEncode?.tap(pluginName, (args) => { diff --git a/packages/lynx/src/externalBundle.test.ts b/packages/lynx/src/externalBundle.test.ts index 0786c9dcded..7a778f43158 100644 --- a/packages/lynx/src/externalBundle.test.ts +++ b/packages/lynx/src/externalBundle.test.ts @@ -12,7 +12,13 @@ const createAsset = (name: string, content = name): TestAsset => ({ source: { source: () => content }, }); -const setupPlugin = (chunking: 'split' | 'single') => { +const setupPlugin = ( + chunking: 'split' | 'single', + lazyBundleAssets = new Set([ + 'async/Card.hash.bundle', + 'async/Nested.hash.bundle', + ]), +) => { const encode = rs.fn(async () => ({ buffer: Buffer.from('external') })); const discardedTemplateAssets = new Set(['bootstrap.bundle']); if (chunking === 'single') { @@ -27,10 +33,7 @@ const setupPlugin = (chunking: 'split' | 'single') => { entryAssets: ['catalog.js'], entryName: 'catalog', includedChunkPrefixes: ['catalog__background_', 'catalog__main-thread__'], - lazyBundleAssets: new Set([ - 'async/Card.hash.bundle', - 'async/Nested.hash.bundle', - ]), + lazyBundleAssets, mainThreadChunks: ['catalog__main-thread.js'], preservedAssets: ['mf-manifest.json', 'mf-stats.json'], }); @@ -173,6 +176,17 @@ describe('Lynx external bundle', () => { ]); }); + it('rejects split builds without ReactLynx lazy bundles', async () => { + const { onCompilation, onEmit } = setupPlugin('split', new Set()); + const harness = createCompilation(sourceAssets); + onCompilation()(harness.compilation); + harness.snapshot(); + + await expect(onEmit()(harness.compilation)).rejects.toThrow( + 'no matching lazy bundle assets were produced', + ); + }); + it('snapshots every JS and CSS chunk into one atomic bundle', async () => { const { encode, onCompilation, onEmit } = setupPlugin('single'); const harness = createCompilation(sourceAssets); diff --git a/packages/lynx/src/externalBundle.ts b/packages/lynx/src/externalBundle.ts index 9fd064e9354..00b828afdad 100644 --- a/packages/lynx/src/externalBundle.ts +++ b/packages/lynx/src/externalBundle.ts @@ -1,4 +1,3 @@ -import { cssChunksToMap } from '@lynx-js/css-serializer'; import type { Chunk, Compiler, WebpackPluginInstance } from '@rspack/core'; interface ExternalBundleOptions { @@ -95,6 +94,15 @@ export const createLynxExternalBundlePlugin = ( stage: 10_000, }, async (compilation) => { + if ( + options.chunking === 'split' && + options.lazyBundleAssets.size === 0 + ) { + throw new Error( + '@module-federation/lynx split remote bundles require each expose to emit a DynamicComponent lazy bundle; no matching lazy bundle assets were produced.', + ); + } + const { cssChunksToMap } = await import('@lynx-js/css-serializer'); const entryAssets = new Set(options.entryAssets); for (const asset of compilation.entrypoints .get(options.entryName) diff --git a/packages/lynx/src/plugin.test.ts b/packages/lynx/src/plugin.test.ts index 0ae54da4ce7..7b2be9130bc 100644 --- a/packages/lynx/src/plugin.test.ts +++ b/packages/lynx/src/plugin.test.ts @@ -19,14 +19,20 @@ const LAYERS = { type ModifyRspackConfig = (config: any, context: any) => any; type ModifyEnvironmentConfig = (config: any, context: any) => any; +type ModifyBundlerChain = (chain: any, context: any) => any; +type ReactResolver = { + resolve(request: string): Promise; +}; const setupPlugin = ( options: LynxModuleFederationOptions, adapterOptions?: LynxModuleFederationAdapterOptions, layers: unknown = LAYERS, + reactResolver?: ReactResolver, ) => { let modifyRspackConfig: ModifyRspackConfig | undefined; let modifyEnvironmentConfigCallback: ModifyEnvironmentConfig | undefined; + let modifyBundlerChainCallback: ModifyBundlerChain | undefined; const modifyEnvironmentConfig = rs.fn((callback: ModifyEnvironmentConfig) => { modifyEnvironmentConfigCallback = callback; }); @@ -34,11 +40,20 @@ const setupPlugin = ( plugin.setup!({ modifyEnvironmentConfig, + modifyBundlerChain(callback: ModifyBundlerChain) { + modifyBundlerChainCallback = callback; + }, modifyRspackConfig(callback: ModifyRspackConfig) { modifyRspackConfig = callback; }, useExposed(symbol: symbol) { - return symbol === Symbol.for('LAYERS') ? layers : undefined; + if (symbol === Symbol.for('LAYERS')) { + return layers; + } + if (symbol === Symbol.for('@lynx-js/react/internal:resolve')) { + return reactResolver; + } + return undefined; }, } as any); @@ -46,6 +61,8 @@ const setupPlugin = ( modifyEnvironmentConfig, applyEnvironmentConfig: (config: any, environment = 'lynx') => modifyEnvironmentConfigCallback!(config, { name: environment }), + modifyBundlerChain: (environment = 'lynx') => + modifyBundlerChainCallback!({}, { environment: { name: environment } }), modifyRspackConfig: (config: any, environment = 'lynx') => modifyRspackConfig!(config, { environment: { name: environment } }), }; @@ -294,6 +311,81 @@ describe('pluginLynxModuleFederation', () => { ]); }); + it('requires the ReactLynx lazy export condition for split remotes', async () => { + const resolve = rs.fn(async (request: string) => + request === '@lynx-js/react' + ? '/virtual/react/runtime/lib/index.js' + : '/virtual/react/runtime/lazy/import.js', + ); + const { modifyBundlerChain } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { remoteBundle: { target: 'lynx' } }, + LAYERS, + { resolve }, + ); + + await expect(modifyBundlerChain()).rejects.toThrow( + 'pluginReactLynx({ experimental_isLazyBundle: true })', + ); + expect(resolve).toHaveBeenCalledTimes(2); + }); + + it('accepts host-backed ReactLynx lazy exports for split remotes', async () => { + const resolve = rs.fn(async (request: string) => + request === '@lynx-js/react' + ? '/virtual/react/runtime/lazy/react.js' + : '/virtual/react/runtime/lazy/import.js', + ); + const { modifyBundlerChain } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { remoteBundle: { target: 'web' } }, + LAYERS, + { resolve }, + ); + + await expect(modifyBundlerChain('web')).resolves.toBeUndefined(); + expect(resolve).toHaveBeenCalledTimes(2); + }); + + it('allows split remotes from non-React Lynx DSL plugins', async () => { + const { modifyBundlerChain } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { remoteBundle: { target: 'lynx' } }, + ); + + await expect(modifyBundlerChain()).resolves.toBeUndefined(); + }); + + it.each([ + ['host builds', undefined, 'lynx'], + [ + 'native single remotes', + { remoteBundle: { target: 'lynx', chunking: 'single' } }, + 'lynx', + ], + [ + 'unselected environments', + { environment: 'web', remoteBundle: { target: 'web' } }, + 'lynx', + ], + ] as const)( + 'skips ReactLynx lazy-export validation for %s', + async (_name, adapterOptions, environment) => { + const resolve = rs.fn(async () => { + throw new Error('unexpected ReactLynx resolver call'); + }); + const { modifyBundlerChain } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + adapterOptions as LynxModuleFederationAdapterOptions | undefined, + LAYERS, + { resolve }, + ); + + await expect(modifyBundlerChain(environment)).resolves.toBeUndefined(); + expect(resolve).not.toHaveBeenCalled(); + }, + ); + it('builds background and main-thread containers into one external bundle', async () => { const { modifyRspackConfig } = setupPlugin( { @@ -331,7 +423,7 @@ describe('pluginLynxModuleFederation', () => { './Card__main_thread': { import: './src/Card', layer: LAYERS.MAIN_THREAD, - name: 'catalog__main-thread__Card', + name: 'catalog__main-thread__Card-main-thread', }, }, shared: [ @@ -380,7 +472,10 @@ describe('pluginLynxModuleFederation', () => { layers: [LAYERS.BACKGROUND, LAYERS.MAIN_THREAD], }, { - files: new Set(['catalog__main-thread__Card.js', 'styles.css']), + files: new Set([ + 'catalog__main-thread__Card-main-thread.js', + 'styles.css', + ]), layers: [LAYERS.MAIN_THREAD], }, { @@ -413,7 +508,7 @@ describe('pluginLynxModuleFederation', () => { expect(processAssetsStage).toBe(402); expect(encoder.options.mainThreadChunks).toEqual([ 'catalog__main-thread.js', - 'catalog__main-thread__Card.js', + 'catalog__main-thread__Card-main-thread.js', ]); expect(emitAsset).toHaveBeenCalledWith( 'catalog__main-thread.js', @@ -484,7 +579,7 @@ describe('pluginLynxModuleFederation', () => { './Card__main_thread': { import: './src/Card', layer: LAYERS.MAIN_THREAD, - name: 'catalog__main-thread__Card', + name: 'catalog__main-thread__Card-main-thread', }, }, shared: [ @@ -524,6 +619,33 @@ describe('pluginLynxModuleFederation', () => { expect(buffer.byteLength).toBeGreaterThan(100); }); + it('derives paired chunk suffixes from custom DSL layers', async () => { + const customLayers = { + BACKGROUND: 'worker:realm', + MAIN_THREAD: 'ui:realm', + }; + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './Card': './src/Card' }, + }, + { remoteBundle: { target: 'lynx' } }, + customLayers, + ); + + const config = await modifyRspackConfig({ plugins: [] }); + expect(federationOptions(config.plugins[0]).exposes).toMatchObject({ + './Card': { + layer: customLayers.BACKGROUND, + name: 'catalog__background_Card', + }, + './Card__main_thread': { + layer: customLayers.MAIN_THREAD, + name: 'catalog__main-thread__Card-ui__realm', + }, + }); + }); + it('keeps native single bundles background-only', async () => { const { modifyRspackConfig } = setupPlugin( { @@ -565,7 +687,7 @@ describe('pluginLynxModuleFederation', () => { { remoteBundle: { target: 'web', - filename: 'remotes/catalog.lynx.bundle', + filename: 'catalog.lynx.bundle', }, }, ); @@ -577,6 +699,22 @@ describe('pluginLynxModuleFederation', () => { expect(config.plugins).toHaveLength(5); }); + it('rejects nested remote bundle filenames', async () => { + const { modifyRspackConfig } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { + remoteBundle: { + target: 'web', + filename: 'remotes/catalog.lynx.bundle', + }, + }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + 'must be a basename without path separators', + ); + }); + it.each([ [ { diff --git a/packages/lynx/src/plugin.ts b/packages/lynx/src/plugin.ts index 16193e1b564..36cd83a2b61 100644 --- a/packages/lynx/src/plugin.ts +++ b/packages/lynx/src/plugin.ts @@ -1,6 +1,8 @@ -import { - LynxCacheEventsPlugin, - type LynxCacheEventsPluginOptions, +import { dirname } from 'node:path'; + +import type { + LynxCacheEventsPlugin as LynxCacheEventsPluginType, + LynxCacheEventsPluginOptions, } from '@lynx-js/cache-events-webpack-plugin'; import type { Configuration } from '@rspack/core'; import type { RsbuildPlugin } from '@rsbuild/core'; @@ -28,22 +30,30 @@ import type { LynxRuntimePluginOptions } from './runtimeCore'; export const LYNX_RUNTIME_PLUGIN = '@module-federation/lynx/runtimePlugin'; -const disableRemoteEntryEventCaching = (config: Configuration): void => { - const index = config.plugins?.findIndex( +const disableRemoteEntryEventCaching = async ( + config: Configuration, +): Promise => { + const plugins = config.plugins; + if (!plugins) { + return; + } + const { LynxCacheEventsPlugin } = + await import('@lynx-js/cache-events-webpack-plugin'); + const index = plugins.findIndex( (plugin) => plugin !== false && plugin !== null && plugin !== undefined && plugin instanceof LynxCacheEventsPlugin, ); - if (index === undefined || index < 0) { + if (index < 0) { return; } - const current = config.plugins![index] as LynxCacheEventsPlugin & { + const current = plugins[index] as LynxCacheEventsPluginType & { options?: LynxCacheEventsPluginOptions; }; - config.plugins![index] = new LynxCacheEventsPlugin({ + plugins[index] = new LynxCacheEventsPlugin({ ...current.options, setupListTransformer: () => [], }); @@ -86,6 +96,37 @@ export const pluginLynxModuleFederation = ( return config; }); + api.modifyBundlerChain(async (_chain, { environment }) => { + const remoteBundle = getRemoteBundleOptions(adapterOptions); + if ( + !remoteBundle || + remoteBundle.chunking === 'single' || + !shouldApplyToEnvironment( + adapterOptions.environment, + environment.name, + ) + ) { + return; + } + + const reactResolver = api.useExposed<{ + resolve(request: string): Promise; + }>(Symbol.for('@lynx-js/react/internal:resolve')); + if (!reactResolver) { + return; + } + + const [reactEntry, lazyImportEntry] = await Promise.all([ + reactResolver.resolve('@lynx-js/react'), + reactResolver.resolve('@lynx-js/react/experimental/lazy/import'), + ]); + if (dirname(reactEntry) !== dirname(lazyImportEntry)) { + throw new Error( + '@module-federation/lynx split ReactLynx remote bundles require `pluginReactLynx({ experimental_isLazyBundle: true })` so exposed components use the host-backed ReactLynx lazy runtime.', + ); + } + }); + api.modifyRspackConfig(async (config, { environment }) => { if ( !shouldApplyToEnvironment( @@ -121,7 +162,9 @@ export const pluginLynxModuleFederation = ( experiments.layers ??= true; if (remoteBundle) { - disableRemoteEntryEventCaching(config as unknown as Configuration); + await disableRemoteEntryEventCaching( + config as unknown as Configuration, + ); await configureRemoteBundle( config as unknown as Configuration, options, diff --git a/packages/lynx/src/pluginOptions.ts b/packages/lynx/src/pluginOptions.ts index bdaf569ec9b..e0111fe8ed0 100644 --- a/packages/lynx/src/pluginOptions.ts +++ b/packages/lynx/src/pluginOptions.ts @@ -15,7 +15,7 @@ export interface ExposedLayers { } interface LynxRemoteBundleBaseOptions { - /** Output name ending in `.lynx.bundle`. Defaults to `.lynx.bundle`. */ + /** Output basename ending in `.lynx.bundle`. Defaults to `.lynx.bundle`. */ filename?: string; /** Lynx engine version passed to the external bundle encoder. Defaults to `3.7`. */ engineVersion?: string; diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index 672e774247c..58c2c450a86 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -27,7 +27,99 @@ import { createLynxRemoteManifestPlugin } from './remoteManifest'; import { MAIN_THREAD_EXPOSE_SUFFIX } from './runtimeCore'; import { getLynxWebEncodeMode } from './webEncode'; -const hasExposes = (exposes: Exposes | undefined): boolean => { +interface RemoteBundlePlanBase { + backgroundChunkPrefix: string; + backgroundEntry: string; + bundleFileName: string; + entryAssets: string[]; + includedChunkPrefixes: string[]; +} + +type RemoteBundlePlan = RemoteBundlePlanBase & + ( + | { + chunking: 'single'; + mainThreadChunkPrefix: undefined; + mainThreadEntry: undefined; + mode: 'native-single'; + } + | { + chunking: 'split'; + mainThreadChunkPrefix: string; + mainThreadEntry: undefined; + mode: 'native-split'; + } + | { + chunking: 'split'; + mainThreadChunkPrefix: string; + mainThreadEntry: string; + mode: 'web-split'; + } + ); + +const normalizeRemoteBundlePlan = ( + name: string, + remoteBundle: LynxRemoteBundleOptions, +): RemoteBundlePlan => { + if (remoteBundle.target !== 'lynx' && remoteBundle.target !== 'web') { + throw new Error( + '@module-federation/lynx `remoteBundle.target` must be either `"lynx"` or `"web"`.', + ); + } + + const chunking = remoteBundle.chunking ?? 'split'; + if (remoteBundle.target === 'web' && chunking === 'single') { + throw new Error( + '@module-federation/lynx web remotes require `chunking: "split"`; one external bundle has only one main-thread root and cannot activate independently scoped ReactLynx exposure roots.', + ); + } + + const backgroundEntry = `${name}.js`; + const backgroundChunkPrefix = `${name}__background_`; + const bundleFileName = remoteBundle.filename ?? `${name}.lynx.bundle`; + const basePlan = { + backgroundChunkPrefix, + backgroundEntry, + bundleFileName, + }; + if (chunking === 'single') { + return { + ...basePlan, + chunking, + entryAssets: [backgroundEntry], + includedChunkPrefixes: [backgroundChunkPrefix], + mainThreadChunkPrefix: undefined, + mainThreadEntry: undefined, + mode: 'native-single', + }; + } + + const mainThreadChunkPrefix = `${name}__main-thread__`; + const splitPlan = { + ...basePlan, + chunking, + includedChunkPrefixes: [backgroundChunkPrefix, mainThreadChunkPrefix], + mainThreadChunkPrefix, + }; + if (remoteBundle.target === 'web') { + const mainThreadEntry = `${name}__main-thread.js`; + return { + ...splitPlan, + entryAssets: [backgroundEntry, mainThreadEntry], + mainThreadEntry, + mode: 'web-split', + }; + } + + return { + ...splitPlan, + entryAssets: [backgroundEntry], + mainThreadEntry: undefined, + mode: 'native-split', + }; +}; + +const hasExposes = (exposes: Exposes | undefined): exposes is Exposes => { if (!exposes) { return false; } @@ -107,6 +199,7 @@ const createRemoteExposes = ( layer: string, prefix: string, keySuffix = '', + chunkNameSuffix = '', ): Record => { const normalized = normalizeLynxExposes(exposes, layer) as Record< string, @@ -119,7 +212,7 @@ const createRemoteExposes = ( { ...value, layer, - name: `${prefix}${toChunkName(key)}`, + name: `${prefix}${toChunkName(key)}${chunkNameSuffix}`, }, ]), ); @@ -220,24 +313,13 @@ export const configureRemoteBundle = async ( runtimePlugin: string, lynxTemplatePlugin?: LynxTemplatePluginApi, ): Promise => { - if (!hasExposes(options.exposes)) { + const exposes = options.exposes; + if (!hasExposes(exposes)) { throw new Error( '@module-federation/lynx `remoteBundle` requires at least one expose.', ); } - if (remoteBundle.target !== 'lynx' && remoteBundle.target !== 'web') { - throw new Error( - '@module-federation/lynx `remoteBundle.target` must be either `"lynx"` or `"web"`.', - ); - } - if ( - remoteBundle.target === 'web' && - (remoteBundle as { chunking?: string }).chunking === 'single' - ) { - throw new Error( - '@module-federation/lynx web remotes require `chunking: "split"`; one external bundle has only one main-thread root and cannot activate independently scoped ReactLynx exposure roots.', - ); - } + const plan = normalizeRemoteBundlePlan(options.name, remoteBundle); if ( remoteBundle.filename !== undefined && !remoteBundle.filename.endsWith('.lynx.bundle') @@ -246,6 +328,11 @@ export const configureRemoteBundle = async ( '@module-federation/lynx `remoteBundle.filename` must end with `.lynx.bundle`.', ); } + if (remoteBundle.filename && /[\\/]/.test(remoteBundle.filename)) { + throw new Error( + '@module-federation/lynx `remoteBundle.filename` must be a basename without path separators so split lazy bundles resolve from the same output root.', + ); + } if (options.filename !== undefined) { throw new Error( '@module-federation/lynx `remoteBundle` manages container filenames; remove `options.filename`.', @@ -273,7 +360,7 @@ export const configureRemoteBundle = async ( } const conflictingLayer = findConflictingExposeLayer( - options.exposes!, + exposes, layers.BACKGROUND, ); if (conflictingLayer) { @@ -281,10 +368,10 @@ export const configureRemoteBundle = async ( `@module-federation/lynx \`remoteBundle\` owns expose layers; remove the explicit \`${conflictingLayer}\` expose layer.`, ); } - assertUniqueChunkNames(options.exposes!); + assertUniqueChunkNames(exposes); const reservedExposeKey = findReservedExposeKey( - options.exposes!, + exposes, MAIN_THREAD_EXPOSE_SUFFIX, ); if (reservedExposeKey) { @@ -293,38 +380,34 @@ export const configureRemoteBundle = async ( ); } - const bundleFileName = remoteBundle.filename ?? `${options.name}.lynx.bundle`; - const backgroundEntry = `${options.name}.js`; - const mainThreadEntry = `${options.name}__main-thread.js`; - const backgroundChunkPrefix = `${options.name}__background_`; - const mainThreadChunkPrefix = `${options.name}__main-thread__`; - const webTarget = remoteBundle.target === 'web'; - const pairedRealmTarget = remoteBundle.chunking !== 'single'; - const remoteExposes = pairedRealmTarget + const pairedPlan = plan.mode === 'native-single' ? undefined : plan; + const mainThreadChunkSuffix = `-${layers.MAIN_THREAD.replace(/:/g, '__')}`; + const remoteExposes = pairedPlan ? { ...createRemoteExposes( - options.exposes!, + exposes, layers.BACKGROUND, - backgroundChunkPrefix, + plan.backgroundChunkPrefix, ), ...createRemoteExposes( - options.exposes!, + exposes, layers.MAIN_THREAD, - mainThreadChunkPrefix, + pairedPlan.mainThreadChunkPrefix, MAIN_THREAD_EXPOSE_SUFFIX, + mainThreadChunkSuffix, ), } : createRemoteExposes( - options.exposes!, + exposes, layers.BACKGROUND, - backgroundChunkPrefix, + plan.backgroundChunkPrefix, ); - const remoteShared = pairedRealmTarget + const remoteShared = pairedPlan ? normalizeSharedForBothLayers(options.shared, layers) : normalizeLynxShared(options.shared, layers.BACKGROUND, layers); const federationOptions = { ...createFederationOptions( - pairedRealmTarget + pairedPlan ? { ...options, shareScope: getLynxShareScopes(options.shareScope, layers), @@ -336,7 +419,7 @@ export const configureRemoteBundle = async ( adapterOptions.runtimePluginOptions, ), manifest: options.manifest ?? true, - filename: backgroundEntry, + filename: plan.backgroundEntry, runtime: false as const, }; const mainThreadChunks: string[] = []; @@ -345,31 +428,29 @@ export const configureRemoteBundle = async ( const { manifestFileName, statsFileName } = getManifestFileName( federationOptions.manifest, ); - const encode = webTarget - ? getLynxWebEncodeMode() - : ((await import('@lynx-js/tasm')).getEncodeMode() as ( - value: unknown, - ) => Promise<{ buffer: Buffer }>); + const encode = + plan.mode === 'web-split' + ? getLynxWebEncodeMode() + : ((await import('@lynx-js/tasm')).getEncodeMode() as ( + value: unknown, + ) => Promise<{ buffer: Buffer }>); config.plugins ||= []; config.plugins.push( createCompilerModuleFederationPlugin(federationOptions), createLynxChunkLoadingMatcherPlugin(lynxTemplatePlugin, { - backgroundOnlyRemote: !pairedRealmTarget, - chunking: remoteBundle.chunking ?? 'split', + backgroundOnlyRemote: !pairedPlan, + chunking: plan.chunking, discardSourceEntryBundles: remoteBundle.preserveSourceEntryBundles === false, discardedTemplateAssets, - includedChunkPrefixes: [ - backgroundChunkPrefix, - ...(pairedRealmTarget ? [mainThreadChunkPrefix] : []), - ], + includedChunkPrefixes: plan.includedChunkPrefixes, lazyBundleAssets, remoteEntryName: options.name, - ...(pairedRealmTarget + ...(pairedPlan ? { pairedRealmChunkPrefixes: { - background: backgroundChunkPrefix, - mainThread: mainThreadChunkPrefix, + background: plan.backgroundChunkPrefix, + mainThread: pairedPlan.mainThreadChunkPrefix, }, pairedRealmChunkSuffixes: { background: `-${layers.BACKGROUND.replace(/:/g, '__')}`, @@ -379,34 +460,34 @@ export const configureRemoteBundle = async ( : {}), }), ); - if (pairedRealmTarget) { + if (pairedPlan) { config.plugins.push( createRemoteAssetsPlugin( mainThreadChunks, - backgroundEntry, - webTarget ? mainThreadEntry : undefined, - backgroundChunkPrefix, + plan.backgroundEntry, + plan.mainThreadEntry, + plan.backgroundChunkPrefix, layers.MAIN_THREAD, ), ); } config.plugins.push( createLynxExternalBundlePlugin({ - bundleFileName, - chunking: remoteBundle.chunking ?? 'split', + bundleFileName: plan.bundleFileName, + chunking: plan.chunking, discardedTemplateAssets, encode, engineVersion: remoteBundle.engineVersion, - entryAssets: [backgroundEntry, ...(webTarget ? [mainThreadEntry] : [])], + entryAssets: plan.entryAssets, entryName: options.name, - includedChunkPrefixes: [ - backgroundChunkPrefix, - ...(pairedRealmTarget ? [mainThreadChunkPrefix] : []), - ], + includedChunkPrefixes: plan.includedChunkPrefixes, lazyBundleAssets, mainThreadChunks, preservedAssets: [manifestFileName, statsFileName], }), - createLynxRemoteManifestPlugin(federationOptions.manifest, bundleFileName), + createLynxRemoteManifestPlugin( + federationOptions.manifest, + plan.bundleFileName, + ), ); }; diff --git a/packages/lynx/src/runtimeChunkLoading.test.ts b/packages/lynx/src/runtimeChunkLoading.test.ts index abc8d77e456..e199d970557 100644 --- a/packages/lynx/src/runtimeChunkLoading.test.ts +++ b/packages/lynx/src/runtimeChunkLoading.test.ts @@ -110,6 +110,59 @@ describe('patchLynxChunkLoading', () => { expect(observed).toBe(true); }); + it('evicts synchronous lazy-bundle failures so they can be retried', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + let attempt = 0; + const globalObject = createGlobalObject(() => { + if (attempt++ === 0) { + throw new Error('synchronous decode failed'); + } + return makeSynchronousThenable({ + ids: ['feature'], + modules: { factory }, + }); + }); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const failed: PromiseLike[] = []; + webpackRequire.f.j!('feature', failed); + await expect(failed[0]).rejects.toThrow('synchronous decode failed'); + + const retried: PromiseLike[] = []; + webpackRequire.f.j!('feature', retried); + await expect(retried[0]).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('captures the remote origin when the container runtime is patched', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const registry = remoteRegistry(); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: registry, + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + registry.set( + 'remote:remote-origin', + 'https://other.example/remotes/catalog.lynx.bundle', + ); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + ); + }); + it('waits for shared consumes from a synchronous lazy bundle', async () => { const webpackRequire = createWebpackRequire(); webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; @@ -374,6 +427,42 @@ describe('patchLynxChunkLoading', () => { expect(globalObject.globDynamicComponentEntry).toBe('__Card__'); }); + it('preserves CommonJS factory this while restoring bundle identity', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const observedThis: unknown[] = []; + const factory = function (this: unknown) { + observedThis.push(this); + }; + const globalObject = { + lynx: { + loadLazyBundle: async () => ({ + __lynx_dynamic_component_entry__: 'https://cdn.example/Card.bundle', + ids: ['feature'], + modules: { factory }, + }), + loadScript: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: remoteRegistry(), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + const module = { exports: {} }; + ( + webpackRequire.m.factory as ( + this: unknown, + module: unknown, + exports: unknown, + runtimeRequire: LynxWebpackRequire, + ) => unknown + ).call(module.exports, module, module.exports, webpackRequire); + + expect(observedThis).toEqual([module.exports]); + }); + it('loads atomic chunks from sections in the already-fetched container', async () => { const webpackRequire = createWebpackRequire( 'async/catalog__background_Card.js', diff --git a/packages/lynx/src/runtimeChunkLoading.ts b/packages/lynx/src/runtimeChunkLoading.ts index 470c8e83e31..08ac33bfff5 100644 --- a/packages/lynx/src/runtimeChunkLoading.ts +++ b/packages/lynx/src/runtimeChunkLoading.ts @@ -86,6 +86,7 @@ const installChunk = ( typeof factory !== 'function' || !entryName ? factory : function wrappedFactory( + this: unknown, module: unknown, exports: unknown, runtimeRequire: LynxWebpackRequire, @@ -97,7 +98,7 @@ const installChunk = ( const previousEntryName = globalObject.globDynamicComponentEntry; globalObject.globDynamicComponentEntry = entryName; try { - return factory(module, exports, runtimeRequire); + return factory.call(this, module, exports, runtimeRequire); } finally { if (hadEntryName) { globalObject.globDynamicComponentEntry = previousEntryName; @@ -303,8 +304,9 @@ const loadLazyChunk = ( const immediate: { current: ImmediateLazyLoad } = { current: { kind: 'pending' }, }; - const loaded = loadQueryComponent(request, lynx, globalObject).then( - (value) => { + let loaded: ChunkPromise; + try { + loaded = loadQueryComponent(request, lynx, globalObject).then((value) => { if (!active) { return value; } @@ -336,8 +338,14 @@ const loadLazyChunk = ( return value; } return consumes.then(() => value); - }, - ); + }); + } catch (error) { + active = false; + if (installedChunks[chunkKey] === loading) { + delete installedChunks[chunkKey]; + } + return Promise.reject(error); + } insideLoader = false; const outcome = immediate.current; @@ -404,6 +412,9 @@ export const patchLynxChunkLoading = ( if (!bundleName) { return false; } + const baseName = originName.replace(/__main_thread$/, ''); + const remoteOrigin = + registry?.get(getRemoteOriginKey(baseName)) ?? bundleName; const installedChunks: Record = {}; @@ -425,9 +436,6 @@ export const patchLynxChunkLoading = ( ? undefined : webpackRequire.lynx_aci?.[key]; if (lazyBundlePath) { - const baseName = originName.replace(/__main_thread$/, ''); - const remoteOrigin = - registry?.get(getRemoteOriginKey(baseName)) ?? bundleName; const request = joinRemoteUrl( remoteOrigin, webpackRequire.p, diff --git a/packages/lynx/src/runtimeEntryLoader.ts b/packages/lynx/src/runtimeEntryLoader.ts index b7ec28408ed..0ddc03e7ba2 100644 --- a/packages/lynx/src/runtimeEntryLoader.ts +++ b/packages/lynx/src/runtimeEntryLoader.ts @@ -68,7 +68,7 @@ export const loadJavaScriptEntry = ( ); } - return loadWithTimeout( + return loadWithTimeout( timeout, `Timed out loading Lynx remote entry "${entryGlobalName}" from "${entry}" after ${timeout}ms.`, (resolve, reject, isSettled) => { @@ -124,15 +124,9 @@ const adaptContainerToRealm = ( (value): value is string => typeof value === 'string', ); const realmSuffix = realm === 'background' ? ':background' : ':main-thread'; - const suffixedKeys = shareScopeKeys.filter((key) => + const realmShareScopeKeys = shareScopeKeys.filter((key) => key.endsWith(realmSuffix), ); - const realmShareScopeKeys = - suffixedKeys.length > 0 - ? suffixedKeys - : shareScopeKeys.filter( - (_key, index) => index % 2 === (realm === 'background' ? 0 : 1), - ); const primaryShareScopeKey = realmShareScopeKeys[0]; if (!primaryShareScopeKey) { return container.init(shareScope, initScope, options); @@ -178,7 +172,8 @@ export const loadBundleEntry = ( ); } - return loadWithTimeout( + let rollbackRegistry: (() => void) | undefined; + return loadWithTimeout( timeout, `Timed out loading Lynx remote bundle "${entryGlobalName}" from "${entry}" after ${timeout}ms.`, (resolve, reject, isSettled) => { @@ -202,12 +197,32 @@ export const loadBundleEntry = ( } const registry = getBundleRegistry(globalObject); - registry.set(entryGlobalName, response.url); - registry.set(getRemoteOriginKey(entryGlobalName), entry); - registry.set( - getRegistryKey(entryGlobalName, 'main-thread'), - response.url, - ); + const updates = [ + [entryGlobalName, response.url], + [getRemoteOriginKey(entryGlobalName), entry], + [getRegistryKey(entryGlobalName, 'main-thread'), response.url], + ] as const; + const previous = updates.map(([key, nextValue]) => ({ + hadValue: registry.has(key), + key, + nextValue, + previousValue: registry.get(key), + })); + for (const [key, value] of updates) { + registry.set(key, value); + } + rollbackRegistry = () => { + for (const state of previous) { + if (registry.get(state.key) !== state.nextValue) { + continue; + } + if (state.hadValue) { + registry.set(state.key, state.previousValue!); + } else { + registry.delete(state.key); + } + } + }; const sectionPath = realm === 'background' @@ -218,6 +233,9 @@ export const loadBundleEntry = ( const value = loadScript(sectionPath, { bundleName: response.url }); Promise.resolve(value).then( (loadedValue) => { + if (isSettled()) { + return; + } const exports = findRemoteEntryExports( loadedValue, entryGlobalName, @@ -232,6 +250,7 @@ export const loadBundleEntry = ( ); return; } + rollbackRegistry = undefined; resolve(adaptContainerToRealm(exports, realm)); }, (error) => @@ -260,5 +279,8 @@ export const loadBundleEntry = ( }, ); }, - ); + ).catch((error) => { + rollbackRegistry?.(); + throw error; + }); }; diff --git a/packages/lynx/src/runtimePlugin.test.ts b/packages/lynx/src/runtimePlugin.test.ts index d0c54abe304..d682b730a35 100644 --- a/packages/lynx/src/runtimePlugin.test.ts +++ b/packages/lynx/src/runtimePlugin.test.ts @@ -1,4 +1,5 @@ import { afterEach, describe, expect, it, rs } from '@rstest/core'; +import { ModuleFederation } from '@module-federation/runtime-core'; import type { ModuleFederationRuntimePlugin } from '@module-federation/runtime-core/types'; import lynxRuntimePlugin, { LYNX_BUNDLE_REGISTRY } from './runtimePlugin'; @@ -15,6 +16,9 @@ interface TestLynx { type LoadEntryArgs = Parameters< NonNullable >[0]; +type GeneratePreloadAssetsArgs = Parameters< + NonNullable +>[0]; const remoteInfo = { name: 'remote', @@ -46,6 +50,14 @@ afterEach(() => { delete globalRecord.lynx; delete globalRecord.remote; delete globalRecord[LYNX_BUNDLE_REGISTRY]; + const globalLoading = globalRecord.__GLOBAL_LOADING_REMOTE_ENTRY__ as + | Record | undefined> + | undefined; + if (globalLoading) { + for (const key of Object.keys(globalLoading)) { + delete globalLoading[key]; + } + } rs.restoreAllMocks(); }); @@ -208,17 +220,58 @@ describe('lynxRuntimePlugin entry loading', () => { expect(loadScript).not.toHaveBeenCalled(); }); + it('rolls back bundle registry mappings after evaluation fails', async () => { + const registry = new Map([ + ['remote', 'lynx-cache://previous'], + ['remote:remote-origin', 'https://previous.test/remote.lynx.bundle'], + ['remote__main_thread', 'lynx-cache://previous'], + ]); + ( + globalThis as unknown as Record< + PropertyKey, + Map | undefined + > + )[LYNX_BUNDLE_REGISTRY] = registry; + setLynx({ + fetchBundle: async () => ({ code: 0, url: 'lynx-cache://failed' }), + loadScript: async () => { + expect(registry.get('remote')).toBe('lynx-cache://failed'); + throw new Error('evaluation failed'); + }, + }); + + await expect( + loadEntry(lynxRuntimePlugin(), bundleRemoteInfo), + ).rejects.toThrow('evaluation failed'); + expect(Object.fromEntries(registry)).toEqual({ + remote: 'lynx-cache://previous', + 'remote:remote-origin': 'https://previous.test/remote.lynx.bundle', + remote__main_thread: 'lynx-cache://previous', + }); + }); + it('evicts timed-out entry loads so they can be retried', async () => { - const container = createContainer(); + const container = { + get: rs.fn(async () => () => ({ default: 'loaded' })), + init: rs.fn(), + }; const requireModuleAsync = rs .fn<(entry: string, callback: NativeCallback) => void>() .mockImplementationOnce(() => undefined) .mockImplementationOnce((_entry, callback) => callback(null, container)); setLynx({ requireModuleAsync }); - const plugin = lynxRuntimePlugin({ timeout: 5 }); - await expect(loadEntry(plugin)).rejects.toThrow('Timed out'); - await expect(loadEntry(plugin)).resolves.toBe(container); + const federation = new ModuleFederation({ + name: 'lynx-retry-host', + plugins: [lynxRuntimePlugin({ timeout: 5 })], + remotes: [remoteInfo], + }); + await expect(federation.loadRemote('remote/Card')).rejects.toThrow( + 'Timed out', + ); + await expect(federation.loadRemote('remote/Card')).resolves.toEqual({ + default: 'loaded', + }); expect(requireModuleAsync).toHaveBeenCalledTimes(2); }); @@ -296,6 +349,28 @@ describe('lynxRuntimePlugin entry loading', () => { ); }); + it('does not infer realm share scopes from array positions', async () => { + const container = createContainer(); + setLynx({ + fetchBundle: async () => ({ code: 0, url: 'lynx-cache://remote' }), + loadScript: () => container, + }); + const loaded = await loadEntry(lynxRuntimePlugin(), bundleRemoteInfo); + const shareScope = { shared: true }; + const options = { + version: 'test', + shareScopeKeys: ['default', 'custom'], + shareScopeMap: { + default: { defaultScope: true }, + custom: { customScope: true }, + }, + }; + + loaded.init(shareScope as never, [], options as never); + + expect(container.init).toHaveBeenCalledWith(shareScope, [], options); + }); + it('leaves non-Lynx remote types to the runtime-core loaders', () => { expect( loadEntry(lynxRuntimePlugin(), { @@ -305,6 +380,24 @@ describe('lynxRuntimePlugin entry loading', () => { ).toBeUndefined(); }); + it('leaves preload assets for non-Lynx remotes to other runtime plugins', async () => { + const generatePreloadAssets = lynxRuntimePlugin().generatePreloadAssets!; + await expect( + generatePreloadAssets({ + remoteInfo: { ...remoteInfo, type: 'module' }, + } as GeneratePreloadAssetsArgs), + ).resolves.toBeUndefined(); + await expect( + generatePreloadAssets({ + remoteInfo: bundleRemoteInfo, + } as GeneratePreloadAssetsArgs), + ).resolves.toEqual({ + cssAssets: [], + entryAssets: [], + jsAssetsWithoutEntry: [], + }); + }); + it('loads type lynx even when the bundle URL has an opaque suffix', async () => { const container = createContainer(); const fetchBundle = rs.fn(async () => ({ diff --git a/packages/lynx/src/runtimePlugin.ts b/packages/lynx/src/runtimePlugin.ts index 9eba247dc11..8b5856c4364 100644 --- a/packages/lynx/src/runtimePlugin.ts +++ b/packages/lynx/src/runtimePlugin.ts @@ -1,6 +1,7 @@ import type { ModuleFederationRuntimePlugin, RemoteEntryExports, + RemoteInfo, } from '@module-federation/runtime-core/types'; import { @@ -26,6 +27,12 @@ export type { LynxRuntimePluginOptions, LynxWebpackRequire }; declare const __webpack_require__: LynxWebpackRequire; +const handlesLynxRemote = ({ + entry, + type, +}: Pick): boolean => + type === 'lynx' || type === 'lynx-js' || isBundleEntry(entry); + export default function lynxRuntimePlugin( options: LynxRuntimePluginOptions = {}, ): ModuleFederationRuntimePlugin { @@ -48,8 +55,7 @@ export default function lynxRuntimePlugin( loadEntry({ remoteInfo }) { const { entry, entryGlobalName, type } = remoteInfo; const isBundle = type === 'lynx' || isBundleEntry(entry); - const isJavaScript = type === 'lynx-js'; - if (!isBundle && !isJavaScript) { + if (!handlesLynxRemote(remoteInfo)) { return undefined; } @@ -94,7 +100,10 @@ export default function lynxRuntimePlugin( entryCache.set(cacheKey, cachedPromise); return cachedPromise; }, - async generatePreloadAssets() { + async generatePreloadAssets({ remoteInfo }) { + if (!handlesLynxRemote(remoteInfo)) { + return undefined; + } return { cssAssets: [], jsAssetsWithoutEntry: [], diff --git a/packages/runtime-core/__tests__/load.spec.ts b/packages/runtime-core/__tests__/load.spec.ts index f2ca8a439ba..d0352e55639 100644 --- a/packages/runtime-core/__tests__/load.spec.ts +++ b/packages/runtime-core/__tests__/load.spec.ts @@ -97,6 +97,42 @@ describe('getRemoteEntry - script load error discrimination', () => { ); }); + it('evicts failed remote entry loads so a later request can retry', async () => { + let attempts = 0; + const container = { + get: rs.fn(), + init: rs.fn(), + }; + const origin = new ModuleFederation({ + name: 'retry-host', + remotes: [], + plugins: [ + { + name: 'retry-entry-loader', + loadEntry() { + attempts += 1; + if (attempts === 1) { + throw new Error('transient entry failure'); + } + return container; + }, + }, + ], + }); + const remoteInfo = getRemoteInfo({ + name: 'retry-remote', + entry: 'https://remote.test/entry.js', + }); + + await expect(getRemoteEntry({ origin, remoteInfo })).rejects.toThrow( + 'transient entry failure', + ); + await expect(getRemoteEntry({ origin, remoteInfo })).resolves.toBe( + container, + ); + expect(attempts).toBe(2); + }); + it('remote container init failure is reported as RUNTIME_015 with the original error', async () => { const entry = `${BASE}/init-error.js`; const mf = new ModuleFederation({ diff --git a/packages/runtime-core/src/remote/index.ts b/packages/runtime-core/src/remote/index.ts index 3ce06056593..891143c5ae6 100644 --- a/packages/runtime-core/src/remote/index.ts +++ b/packages/runtime-core/src/remote/index.ts @@ -177,7 +177,7 @@ export class RemoteHandler { globalSnapshot: GlobalModuleInfo; }, ], - Promise + Promise >('generatePreloadAssets'), afterPreloadRemote: new AsyncHook< [ diff --git a/packages/runtime-core/src/utils/load.ts b/packages/runtime-core/src/utils/load.ts index 7bcc7c3ded6..6fca4d90b91 100644 --- a/packages/runtime-core/src/utils/load.ts +++ b/packages/runtime-core/src/utils/load.ts @@ -309,7 +309,8 @@ export async function getRemoteEntry(params: { const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry; const loaderHook = origin.loaderHook; - globalLoading[uniqueKey] = loadEntryHook + let loadingPromise: Promise; + loadingPromise = loadEntryHook .emit({ origin, loaderHook, @@ -388,7 +389,14 @@ export async function getRemoteEntry(params: { error: err, }); throw err; + }) + .catch((err) => { + if (globalLoading[uniqueKey] === loadingPromise) { + delete globalLoading[uniqueKey]; + } + throw err; }); + globalLoading[uniqueKey] = loadingPromise; } return globalLoading[uniqueKey]; From 2b546e7eb17724ff666d6d50a2b28c42cd2aa18d Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 12:25:58 +0000 Subject: [PATCH 13/68] fix(lynx): inject lazy identity before runtime wrapper --- .../test/native-artifacts.mjs | 12 +- packages/lynx/src/externalBundle.test.ts | 2 +- packages/lynx/src/externalBundle.ts | 4 +- packages/lynx/src/plugin.test.ts | 76 +++++++++--- packages/lynx/src/remoteBundle.ts | 111 +++++++++++++----- 5 files changed, 153 insertions(+), 52 deletions(-) diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index d88d029f5b6..df5cd440467 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -133,12 +133,18 @@ for (const exposed of manifest.exposes) { `${lazyName} main-thread bytecode contains the background runtime wrapper marker ${backgroundWrapperMarker}`, ); } + const entryScript = lazyTemplate['background-thread-script'].find( + ({ content }) => content?.includes('__lynx_dynamic_component_entry__'), + ); assert.ok( - lazyTemplate['background-thread-script'].some(({ content }) => - content?.includes('__lynx_dynamic_component_entry__'), - ), + entryScript, `${lazyName} does not preserve its DynamicComponent entry identity`, ); + assert.ok( + entryScript.content.lastIndexOf('__lynx_dynamic_component_entry__') < + entryScript.content.lastIndexOf('.require('), + `${lazyName} writes its DynamicComponent entry identity outside the Lynx module wrapper`, + ); assert.ok( !JSON.stringify(exposed).includes('__main_thread'), `${exposed.name} contains a main-thread alias`, diff --git a/packages/lynx/src/externalBundle.test.ts b/packages/lynx/src/externalBundle.test.ts index 7a778f43158..67bdbacf093 100644 --- a/packages/lynx/src/externalBundle.test.ts +++ b/packages/lynx/src/externalBundle.test.ts @@ -34,7 +34,7 @@ const setupPlugin = ( entryName: 'catalog', includedChunkPrefixes: ['catalog__background_', 'catalog__main-thread__'], lazyBundleAssets, - mainThreadChunks: ['catalog__main-thread.js'], + pairedBundleChunks: ['catalog__main-thread.js'], preservedAssets: ['mf-manifest.json', 'mf-stats.json'], }); let onCompilation: ((compilation: any) => void) | undefined; diff --git a/packages/lynx/src/externalBundle.ts b/packages/lynx/src/externalBundle.ts index 00b828afdad..365f01717a4 100644 --- a/packages/lynx/src/externalBundle.ts +++ b/packages/lynx/src/externalBundle.ts @@ -10,7 +10,7 @@ interface ExternalBundleOptions { entryName: string; includedChunkPrefixes: string[]; lazyBundleAssets: Set; - mainThreadChunks: string[]; + pairedBundleChunks: string[]; preservedAssets: string[]; } @@ -117,7 +117,7 @@ export const createLynxExternalBundlePlugin = ( (sections, asset) => { if (asset.name.endsWith('.js')) { sections[asset.name.replace(/\.js$/, '')] = { - ...(options.mainThreadChunks.includes(asset.name) + ...(options.pairedBundleChunks.includes(asset.name) ? { encoding: 'JsBytecode' } : {}), content: asset.content, diff --git a/packages/lynx/src/plugin.test.ts b/packages/lynx/src/plugin.test.ts index 7b2be9130bc..3f18ce9687a 100644 --- a/packages/lynx/src/plugin.test.ts +++ b/packages/lynx/src/plugin.test.ts @@ -448,13 +448,33 @@ describe('pluginLynxModuleFederation', () => { engineVersion: '3.6', }); - let collectAssets: (() => void) | undefined; - let processAssetsStage: number | undefined; + const PROCESS_ASSETS_STAGE_ADDITIONS = -100; + const PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE = 400; + const processAssets = new Map void>(); let onCompilation: ((compilation: any) => void) | undefined; collector.apply({ webpack: { - Compilation: { PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE: 400 }, - sources: { ConcatSource: class {} }, + Compilation: { + PROCESS_ASSETS_STAGE_ADDITIONS, + PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE, + }, + sources: { + ConcatSource: class { + private readonly parts: Array; + + constructor(...parts: Array) { + this.parts = parts; + } + + source() { + return this.parts + .map((part) => + typeof part === 'string' ? part : part.source(), + ) + .join(''); + } + }, + }, }, hooks: { thisCompilation: { @@ -465,13 +485,16 @@ describe('pluginLynxModuleFederation', () => { }, } as any); const emitAsset = rs.fn(); + const updateAsset = rs.fn(); onCompilation!({ chunks: [ { + name: 'catalog', files: new Set(['catalog.js']), layers: [LAYERS.BACKGROUND, LAYERS.MAIN_THREAD], }, { + name: 'catalog__main-thread__Card', files: new Set([ 'catalog__main-thread__Card-main-thread.js', 'styles.css', @@ -479,6 +502,7 @@ describe('pluginLynxModuleFederation', () => { layers: [LAYERS.MAIN_THREAD], }, { + name: 'catalog__background_Card', files: new Set(['catalog__background_Card.js']), layers: [LAYERS.BACKGROUND], }, @@ -489,26 +513,50 @@ describe('pluginLynxModuleFederation', () => { }, }, emitAsset, + updateAsset, getAsset(name: string) { - return name === 'catalog.js' - ? { source: { source: () => 'container' }, info: {} } - : undefined; + if (name === 'catalog.js') { + return { source: { source: () => 'container' }, info: {} }; + } + if (name === 'catalog__background_Card.js') { + return { + source: { source: () => 'exports.ids = ["card"];' }, + info: { minimized: true }, + }; + } + return undefined; }, hooks: { processAssets: { tap(options: { stage: number }, callback: () => void) { - processAssetsStage = options.stage; - collectAssets = callback; + processAssets.set(options.stage, callback); }, }, }, }); - collectAssets!(); - - expect(processAssetsStage).toBe(402); - expect(encoder.options.mainThreadChunks).toEqual([ + const backgroundIdentityStage = PROCESS_ASSETS_STAGE_ADDITIONS + 1; + const pairedBundleChunksStage = PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + 2; + processAssets.get(backgroundIdentityStage)!(); + processAssets.get(pairedBundleChunksStage)!(); + + expect([...processAssets.keys()]).toEqual([ + backgroundIdentityStage, + pairedBundleChunksStage, + ]); + expect(updateAsset).toHaveBeenCalled(); + const backgroundSource = updateAsset.mock.calls[0][1].source(); + expect(backgroundSource).toContain( + 'exports.__lynx_dynamic_component_entry__ = globDynamicComponentEntry;', + ); + expect(updateAsset).toHaveBeenCalledWith( + 'catalog__background_Card.js', + expect.any(Object), + { minimized: true }, + ); + expect(encoder.options.pairedBundleChunks).toEqual([ 'catalog__main-thread.js', 'catalog__main-thread__Card-main-thread.js', + 'catalog__background_Card.js', ]); expect(emitAsset).toHaveBeenCalledWith( 'catalog__main-thread.js', @@ -597,7 +645,7 @@ describe('pluginLynxModuleFederation', () => { bundleFileName: 'catalog-native.lynx.bundle', engineVersion: '3.6', entryAssets: ['catalog.js'], - mainThreadChunks: [], + pairedBundleChunks: [], }); expect(encoder.options.encode).toBeTypeOf('function'); const { buffer } = await encoder.options.encode({ diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index 58c2c450a86..ab715337ff3 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -222,16 +222,70 @@ const isModuleInLayer = (module: unknown, layer: string): boolean => { return (module as { layer?: string }).layer === layer; }; +const classifyRemoteChunk = ( + modules: Iterable, + name: string | undefined, + backgroundChunkPrefix: string, + mainThreadLayer: string, +) => ({ + containsBackgroundExpose: + typeof name === 'string' && name.startsWith(backgroundChunkPrefix), + containsMainThreadModule: Array.from(modules).some((module) => + isModuleInLayer(module, mainThreadLayer), + ), +}); + const createRemoteAssetsPlugin = ( - mainThreadChunks: string[], + pairedBundleChunks: string[], backgroundEntry: string, mainThreadEntry: string | undefined, backgroundChunkPrefix: string, mainThreadLayer: string, ) => ({ apply(compiler: Compiler) { - const pluginName = 'LynxModuleFederationMainThreadChunks'; + const pluginName = 'LynxModuleFederationPairedBundleChunks'; compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { + compilation.hooks.processAssets.tap( + { + name: `${pluginName}BackgroundIdentity`, + // ReactLynx adds debug metadata during ADDITIONS, then RuntimeWrapper + // closes over `exports` at stage NONE. Inject the identity between them. + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS + 1, + }, + () => { + for (const chunk of compilation.chunks) { + const { containsBackgroundExpose, containsMainThreadModule } = + classifyRemoteChunk( + compilation.chunkGraph.getChunkModulesIterable(chunk), + chunk.name, + backgroundChunkPrefix, + mainThreadLayer, + ); + if (!containsBackgroundExpose || containsMainThreadModule) { + continue; + } + + for (const filename of chunk.files) { + if (filename.endsWith('.js') && filename !== backgroundEntry) { + const asset = compilation.getAsset(filename); + if (asset) { + compilation.updateAsset( + filename, + new compiler.webpack.sources.ConcatSource( + asset.source, + "\nif (typeof globDynamicComponentEntry !== 'string') { throw new Error('Lynx DynamicComponent entry identity is unavailable.'); }\n", + 'exports.__lynx_dynamic_component_entry__ = globDynamicComponentEntry;\n', + ), + asset.info, + ); + } + } + } + } + }, + ); + compilation.hooks.processAssets.tap( { name: pluginName, @@ -239,7 +293,7 @@ const createRemoteAssetsPlugin = ( compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + 2, }, () => { - mainThreadChunks.length = 0; + pairedBundleChunks.length = 0; if (mainThreadEntry) { const entryAsset = compilation.getAsset(backgroundEntry); if (!entryAsset) { @@ -252,46 +306,39 @@ const createRemoteAssetsPlugin = ( entryAsset.source, entryAsset.info, ); - mainThreadChunks.push(mainThreadEntry); + pairedBundleChunks.push(mainThreadEntry); } for (const chunk of compilation.chunks) { - const containsMainThreadModule = Array.from( - compilation.chunkGraph.getChunkModulesIterable(chunk), - ).some((module) => isModuleInLayer(module, mainThreadLayer)); - const containsBackgroundExpose = - typeof chunk.name === 'string' && - chunk.name.startsWith(backgroundChunkPrefix); + const { containsBackgroundExpose, containsMainThreadModule } = + classifyRemoteChunk( + compilation.chunkGraph.getChunkModulesIterable(chunk), + chunk.name, + backgroundChunkPrefix, + mainThreadLayer, + ); if (!containsMainThreadModule && !containsBackgroundExpose) { continue; } for (const filename of chunk.files) { if (filename.endsWith('.js') && filename !== backgroundEntry) { - mainThreadChunks.push(filename); + pairedBundleChunks.push(filename); const asset = compilation.getAsset(filename); - if (asset) { + if (asset && containsMainThreadModule) { compilation.updateAsset( filename, - containsMainThreadModule - ? new compiler.webpack.sources.ConcatSource( - '(function (globDynamicComponentEntry) {\n', - ' const module = { exports: {} };\n', - ' const exports = module.exports;\n', - asset.source, - '\n module.exports.__lynx_dynamic_component_entry__ = globDynamicComponentEntry;\n', - ' return module.exports;\n})', - ) - : new compiler.webpack.sources.ConcatSource( - asset.source, - "\nif (typeof globDynamicComponentEntry !== 'string') { throw new Error('Lynx DynamicComponent entry identity is unavailable.'); }\n", - 'exports.__lynx_dynamic_component_entry__ = globDynamicComponentEntry;\n', - ), + new compiler.webpack.sources.ConcatSource( + '(function (globDynamicComponentEntry) {\n', + ' const module = { exports: {} };\n', + ' const exports = module.exports;\n', + asset.source, + '\n module.exports.__lynx_dynamic_component_entry__ = globDynamicComponentEntry;\n', + ' return module.exports;\n})', + ), { ...asset.info, - ...(containsMainThreadModule - ? { 'lynx:main-thread': true } - : {}), + 'lynx:main-thread': true, }, ); } @@ -422,7 +469,7 @@ export const configureRemoteBundle = async ( filename: plan.backgroundEntry, runtime: false as const, }; - const mainThreadChunks: string[] = []; + const pairedBundleChunks: string[] = []; const lazyBundleAssets = new Set(); const discardedTemplateAssets = new Set(); const { manifestFileName, statsFileName } = getManifestFileName( @@ -463,7 +510,7 @@ export const configureRemoteBundle = async ( if (pairedPlan) { config.plugins.push( createRemoteAssetsPlugin( - mainThreadChunks, + pairedBundleChunks, plan.backgroundEntry, plan.mainThreadEntry, plan.backgroundChunkPrefix, @@ -482,7 +529,7 @@ export const configureRemoteBundle = async ( entryName: options.name, includedChunkPrefixes: plan.includedChunkPrefixes, lazyBundleAssets, - mainThreadChunks, + pairedBundleChunks, preservedAssets: [manifestFileName, statsFileName], }), createLynxRemoteManifestPlugin( From 1bafb73a237d2a4ab23756efa85162f45e037a80 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 16 Jul 2026 13:28:41 +0000 Subject: [PATCH 14/68] fix(lynx): isolate native sharing by realm --- .../test/native-artifacts.mjs | 13 +++ packages/lynx/src/plugin.test.ts | 106 ++++++++++++++++-- packages/lynx/src/plugin.ts | 28 +++-- packages/lynx/src/pluginOptions.ts | 48 ++++++-- packages/lynx/src/remoteBundle.ts | 29 +++-- 5 files changed, 184 insertions(+), 40 deletions(-) diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index df5cd440467..b91a75cae1e 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -63,11 +63,24 @@ for (const implementationText of [ } const hostSource = JSON.stringify(hostTemplate); +const hostBackgroundSource = hostTemplate['background-thread-script'] + .map(({ content }) => content ?? '') + .join('\n'); assert.match( hostSource, /http:\/\/127\.0\.0\.1:3000\/remote-native\/mf-manifest\.json/, ); assert.match(hostSource, /lynx-federation-runtime-plugin/); +assert.ok( + hostBackgroundSource.includes( + 'scopeToSharingDataMapping:{"default:react:background":', + ) && hostBackgroundSource.includes('name:"orbit-shared-state"'), + 'native host does not provide orbit-shared-state in the background realm share scope', +); +assert.ok( + !hostBackgroundSource.includes('"default:react:main-thread"'), + 'background-only native host initializes the main-thread share scope', +); for (const request of [ 'catalog/ActivityFeed', 'catalog/Card', diff --git a/packages/lynx/src/plugin.test.ts b/packages/lynx/src/plugin.test.ts index 3f18ce9687a..0b1bb0f992b 100644 --- a/packages/lynx/src/plugin.test.ts +++ b/packages/lynx/src/plugin.test.ts @@ -186,7 +186,6 @@ describe('pluginLynxModuleFederation', () => { runtimePlugins: ['custom-runtime-plugin'], }, { - mainThread: true, runtimePluginOptions: { timeout: 2_000 }, }, ); @@ -195,10 +194,7 @@ describe('pluginLynxModuleFederation', () => { expect(config.plugins).toHaveLength(2); expect(federationOptions(config.plugins[0])).toMatchObject({ name: 'lynx_host', - shareScope: [ - `default:${LAYERS.BACKGROUND}`, - `default:${LAYERS.MAIN_THREAD}`, - ], + shareScope: [`default:${LAYERS.BACKGROUND}`], runtimePlugins: [ ['custom-runtime-plugin', {}], [LYNX_RUNTIME_PLUGIN, { timeout: 2_000 }], @@ -225,6 +221,73 @@ describe('pluginLynxModuleFederation', () => { }); }); + it('adds the main-thread share scope only when that realm is enabled', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { react: { singleton: true } }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0])).toMatchObject({ + shareScope: [ + `default:${LAYERS.BACKGROUND}`, + `default:${LAYERS.MAIN_THREAD}`, + ], + shared: [ + { + react: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ], + }); + }); + + it('keeps custom compiler layers separate from runtime share scopes', async () => { + const customLayer = 'custom-layer'; + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { state: { singleton: true } }, + }, + { layer: customLayer }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0])).toMatchObject({ + shareScope: [`default:${LAYERS.BACKGROUND}`], + shared: [ + { + state: { + singleton: true, + layer: customLayer, + issuerLayer: customLayer, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ], + }); + }); + + it('rejects shared modules assigned to a disabled host realm', async () => { + const { modifyRspackConfig } = setupPlugin({ + name: 'lynx_host', + shared: { + state: { realm: 'main-thread', singleton: true }, + }, + }); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + `shared module "state" uses inactive realm layer "${LAYERS.MAIN_THREAD}"`, + ); + }); + it('maps semantic shared realms to exposed Lynx layers', async () => { const { modifyRspackConfig } = setupPlugin( { @@ -707,6 +770,7 @@ describe('pluginLynxModuleFederation', () => { const remoteOptions = federationOptions(config.plugins[0]); expect(config.plugins).toHaveLength(4); + expect(remoteOptions.shareScope).toEqual([`default:${LAYERS.BACKGROUND}`]); expect(remoteOptions.exposes).toEqual({ './data': { import: './src/data', @@ -714,13 +778,33 @@ describe('pluginLynxModuleFederation', () => { name: 'catalog__background_data', }, }); - expect(remoteOptions.shared).toEqual({ - state: { - singleton: true, - layer: LAYERS.BACKGROUND, - issuerLayer: LAYERS.BACKGROUND, + expect(remoteOptions.shared).toEqual([ + { + state: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, }, - }); + ]); + }); + + it('rejects main-thread shares in native single bundles', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './data': './src/data' }, + shared: { + state: { realm: 'main-thread', singleton: true }, + }, + }, + { remoteBundle: { target: 'lynx', chunking: 'single' } }, + ); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + `shared module "state" uses inactive realm layer "${LAYERS.MAIN_THREAD}"`, + ); }); it('preserves manifest file customization', async () => { diff --git a/packages/lynx/src/plugin.ts b/packages/lynx/src/plugin.ts index 36cd83a2b61..186da694290 100644 --- a/packages/lynx/src/plugin.ts +++ b/packages/lynx/src/plugin.ts @@ -18,7 +18,7 @@ import { getRemoteBundleOptions, normalizeLynxExposes, normalizeLynxShared, - normalizeSharedForBothLayers, + normalizeRealmScopedShared, shouldApplyToEnvironment, validateLayers, type ExposedLayers, @@ -149,6 +149,9 @@ export const pluginLynxModuleFederation = ( const remoteBundle = getRemoteBundleOptions(adapterOptions); const mainThreadEnabled = Boolean(adapterOptions.mainThread) || remoteBundle?.target === 'web'; + const activeRealmLayers = mainThreadEnabled + ? [layers.BACKGROUND, layers.MAIN_THREAD] + : [layers.BACKGROUND]; config.output ||= {}; config.output.chunkLoading ??= 'lynx'; @@ -178,16 +181,21 @@ export const pluginLynxModuleFederation = ( } const federationOptions = createFederationOptions( - mainThreadEnabled - ? { - ...options, - shareScope: getLynxShareScopes(options.shareScope, layers), - } - : options, + { + ...options, + shareScope: getLynxShareScopes( + options.shareScope, + layers, + activeRealmLayers, + ), + }, normalizeLynxExposes(options.exposes, defaultLayer), - mainThreadEnabled - ? normalizeSharedForBothLayers(options.shared, layers) - : normalizeLynxShared(options.shared, defaultLayer, layers), + normalizeRealmScopedShared( + options.shared, + layers, + defaultLayer, + activeRealmLayers, + ), runtimePlugin, adapterOptions.runtimePluginOptions, ); diff --git a/packages/lynx/src/pluginOptions.ts b/packages/lynx/src/pluginOptions.ts index e0111fe8ed0..c250ee79aed 100644 --- a/packages/lynx/src/pluginOptions.ts +++ b/packages/lynx/src/pluginOptions.ts @@ -149,6 +149,7 @@ const normalizeSharedValue = ( defaultLayer: string, isolateShareScope = false, layers?: ExposedLayers, + activeRealmLayers?: readonly string[], ): SharedConfig => { const config: LynxSharedConfig = typeof value === 'string' @@ -179,6 +180,22 @@ const normalizeSharedValue = ( } const layer = sharedConfig.layer ?? realmLayer ?? defaultLayer; const issuerLayer = sharedConfig.issuerLayer ?? realmLayer ?? defaultLayer; + const shareScopeLayer = + realmLayer ?? + (issuerLayer === layers?.MAIN_THREAD + ? layers.MAIN_THREAD + : issuerLayer === layers?.BACKGROUND + ? layers.BACKGROUND + : (layers?.BACKGROUND ?? issuerLayer)); + if ( + isolateShareScope && + activeRealmLayers && + !activeRealmLayers.includes(shareScopeLayer) + ) { + throw new Error( + `@module-federation/lynx shared module "${key}" uses inactive realm layer "${shareScopeLayer}". Enable its Lynx realm or choose one of: ${activeRealmLayers.join(', ')}.`, + ); + } return { ...sharedConfig, @@ -189,7 +206,7 @@ const normalizeSharedValue = ( shareScope: (Array.isArray(config.shareScope) ? config.shareScope : [config.shareScope ?? 'default'] - ).map((scope) => `${scope}:${issuerLayer}`), + ).map((scope) => `${scope}:${shareScopeLayer}`), } : {}), }; @@ -200,6 +217,7 @@ const normalizeSharedItem = ( defaultLayer: string, isolateShareScope = false, layers?: ExposedLayers, + activeRealmLayers?: readonly string[], ): Record => { if (typeof item === 'string') { return { @@ -209,6 +227,7 @@ const normalizeSharedItem = ( defaultLayer, isolateShareScope, layers, + activeRealmLayers, ), }; } @@ -216,7 +235,14 @@ const normalizeSharedItem = ( return Object.fromEntries( Object.entries(item).map(([key, value]) => [ key, - normalizeSharedValue(key, value, defaultLayer, isolateShareScope, layers), + normalizeSharedValue( + key, + value, + defaultLayer, + isolateShareScope, + layers, + activeRealmLayers, + ), ]), ); }; @@ -237,9 +263,14 @@ export const normalizeLynxShared = ( : normalizeSharedItem(shared, defaultLayer, false, layers); }; -export const normalizeSharedForBothLayers = ( +export const normalizeRealmScopedShared = ( shared: LynxShared | undefined, layers: ExposedLayers, + defaultLayer = layers.BACKGROUND, + activeRealmLayers: readonly string[] = [ + layers.BACKGROUND, + layers.MAIN_THREAD, + ], ): Shared | undefined => { if (!shared) { return undefined; @@ -247,19 +278,20 @@ export const normalizeSharedForBothLayers = ( const items = Array.isArray(shared) ? shared : [shared]; return items.map((item) => - normalizeSharedItem(item, layers.BACKGROUND, true, layers), + normalizeSharedItem(item, defaultLayer, true, layers, activeRealmLayers), ); }; export const getLynxShareScopes = ( shareScope: ModuleFederationPluginOptions['shareScope'], layers: ExposedLayers, + activeRealmLayers: readonly string[] = [ + layers.BACKGROUND, + layers.MAIN_THREAD, + ], ): string[] => (Array.isArray(shareScope) ? shareScope : [shareScope ?? 'default']).flatMap( - (scope) => [ - `${scope}:${layers.BACKGROUND}`, - `${scope}:${layers.MAIN_THREAD}`, - ], + (scope) => activeRealmLayers.map((layer) => `${scope}:${layer}`), ); export const injectRuntimePlugin = ( diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index ab715337ff3..a9610d584e7 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -16,8 +16,7 @@ import { createFederationOptions, getLynxShareScopes, normalizeLynxExposes, - normalizeLynxShared, - normalizeSharedForBothLayers, + normalizeRealmScopedShared, type ExposedLayers, type LynxModuleFederationAdapterOptions, type LynxModuleFederationOptions, @@ -449,17 +448,25 @@ export const configureRemoteBundle = async ( layers.BACKGROUND, plan.backgroundChunkPrefix, ); - const remoteShared = pairedPlan - ? normalizeSharedForBothLayers(options.shared, layers) - : normalizeLynxShared(options.shared, layers.BACKGROUND, layers); + const activeRealmLayers = pairedPlan + ? [layers.BACKGROUND, layers.MAIN_THREAD] + : [layers.BACKGROUND]; + const remoteShared = normalizeRealmScopedShared( + options.shared, + layers, + layers.BACKGROUND, + activeRealmLayers, + ); const federationOptions = { ...createFederationOptions( - pairedPlan - ? { - ...options, - shareScope: getLynxShareScopes(options.shareScope, layers), - } - : options, + { + ...options, + shareScope: getLynxShareScopes( + options.shareScope, + layers, + activeRealmLayers, + ), + }, remoteExposes, remoteShared, runtimePlugin, From 2292f0b229fbd7abd3e6469d4ce9bc63a1edaa06 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Fri, 17 Jul 2026 21:23:39 +0000 Subject: [PATCH 15/68] feat(lynx): complete standalone federation support --- .changeset/tiny-lynxes-federate.md | 5 + .github/workflows/e2e-lynx.yml | 3 + apps/lynx-module-federation-demo/.gitignore | 1 + apps/lynx-module-federation-demo/README.md | 83 +++- .../federation.config.mjs | 3 +- .../OrbitControl.xcodeproj/project.pbxproj | 4 + .../ios/OrbitControl/OrbitResourceFetcher.h | 3 + .../ios/OrbitControl/OrbitResourceFetcher.m | 36 +- .../ios/OrbitControl/ViewController.swift | 4 +- .../OrbitControlUITests.swift | 84 +++- .../lynx.catalog.native.config.mjs | 38 ++ .../lynx.catalog.web.config.mjs | 30 ++ .../lynx.remote.native.config.mjs | 6 +- .../lynx.remote.web.config.mjs | 1 + apps/lynx-module-federation-demo/package.json | 12 +- .../scripts/sync-ios-bundle.mjs | 23 +- .../src/catalog-app/CatalogApp.css | 285 +++++++++++ .../src/catalog-app/CatalogApp.tsx | 184 +++++++ .../src/catalog-app/index.tsx | 10 + .../src/remote-ui/Card.tsx | 6 +- .../test/ios-project.mjs | 19 + .../test/ios/run.mjs | 29 +- .../test/native-artifacts.mjs | 53 +- .../test/native-dev-server.mjs | 41 +- .../test/real-web/run.mjs | 142 +++++- .../test/real-web/shell.js | 5 +- packages/lynx/README.md | 10 + packages/lynx/src/chunkLoadingMatcher.test.ts | 19 +- packages/lynx/src/chunkLoadingMatcher.ts | 74 ++- packages/lynx/src/externalBundle.test.ts | 38 +- packages/lynx/src/externalBundle.ts | 28 +- packages/lynx/src/plugin.host.test.ts | 418 ++++++++++++++++ .../lynx/src/plugin.normalization.test.ts | 82 +++ ...in.test.ts => plugin.remoteBundle.test.ts} | 469 +++--------------- packages/lynx/src/plugin.testUtils.ts | 65 +++ packages/lynx/src/plugin.ts | 13 +- packages/lynx/src/pluginOptions.ts | 224 ++++++--- packages/lynx/src/remoteBundle.ts | 60 ++- packages/lynx/src/runtimeChunkLoading.test.ts | 69 ++- packages/lynx/src/runtimeChunkLoading.ts | 7 +- packages/lynx/src/runtimeCore.ts | 52 +- packages/lynx/src/runtimeEntryLoader.ts | 23 +- packages/lynx/src/runtimePlugin.test.ts | 76 ++- packages/lynx/src/runtimePlugin.ts | 5 + .../runtime-core/__tests__/snapshot.spec.ts | 52 ++ .../src/plugins/snapshot/SnapshotHandler.ts | 11 + packages/runtime-core/src/remote/index.ts | 2 +- .../generateSnapshotFromManifest.spec.ts | 17 + .../sdk/src/generateSnapshotFromManifest.ts | 7 +- 49 files changed, 2291 insertions(+), 640 deletions(-) create mode 100644 apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs create mode 100644 apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs create mode 100644 apps/lynx-module-federation-demo/src/catalog-app/CatalogApp.css create mode 100644 apps/lynx-module-federation-demo/src/catalog-app/CatalogApp.tsx create mode 100644 apps/lynx-module-federation-demo/src/catalog-app/index.tsx create mode 100644 packages/lynx/src/plugin.host.test.ts create mode 100644 packages/lynx/src/plugin.normalization.test.ts rename packages/lynx/src/{plugin.test.ts => plugin.remoteBundle.test.ts} (63%) create mode 100644 packages/lynx/src/plugin.testUtils.ts diff --git a/.changeset/tiny-lynxes-federate.md b/.changeset/tiny-lynxes-federate.md index 506ee841ac3..1035529ab9e 100644 --- a/.changeset/tiny-lynxes-federate.md +++ b/.changeset/tiny-lynxes-federate.md @@ -1,5 +1,7 @@ --- '@module-federation/lynx': minor +'@module-federation/runtime-core': patch +'@module-federation/sdk': patch --- Add an Rspeedy build adapter plus background and Lynx for Web main-thread @@ -7,3 +9,6 @@ transports. Dual-realm remotes publish a standard Module Federation manifest whose remote entry resolves to one HTTP-loadable external `.lynx.bundle`. Compiled federated `import()` calls skip Lynx's local loader for remote-only chunk IDs while preserving normal local JavaScript chunk loading. + +Resolve manifest `publicPath: 'auto'` from the fetched response URL so +root-relative manifest entries remain portable in browser-like runtimes. diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index adc34d0075a..cd17363e159 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -59,6 +59,7 @@ jobs: with: name: lynx-native-ios-input path: | + apps/lynx-module-federation-demo/dist/catalog-native/ apps/lynx-module-federation-demo/dist/host-native/ apps/lynx-module-federation-demo/dist/remote-native/ if-no-files-found: error @@ -74,6 +75,8 @@ jobs: name: lynx-module-federation-e2e-failure path: | apps/lynx-module-federation-demo/test/real-web/artifacts/ + apps/lynx-module-federation-demo/dist/catalog-native/ + apps/lynx-module-federation-demo/dist/catalog-web/ apps/lynx-module-federation-demo/dist/host-native/ apps/lynx-module-federation-demo/dist/remote-native/ apps/lynx-module-federation-demo/dist/host-web/ diff --git a/apps/lynx-module-federation-demo/.gitignore b/apps/lynx-module-federation-demo/.gitignore index fd86869bb6d..ccd3c66e605 100644 --- a/apps/lynx-module-federation-demo/.gitignore +++ b/apps/lynx-module-federation-demo/.gitignore @@ -6,5 +6,6 @@ ios/.bundle/ ios/Pods/ ios/OrbitControl.xcworkspace/ ios/Resources/main.lynx.bundle +ios/Resources/static/ ios/build/ ios/vendor/bundle/ diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index 2e890802fed..feacf767771 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -5,6 +5,7 @@ simulation. It includes: - a standalone UIKit iOS application derived from Lynx's official `HelloLynxSwift` starter; +- a runnable Orbit Catalog product for native Lynx and Lynx Web; - a native background host with paired ReactLynx remote UI built as `.lynx.bundle` artifacts; - a Lynx for Web host mounted in the official `` custom element; @@ -17,17 +18,58 @@ The remote uses the default split transport: ```mermaid flowchart LR - A["Orbit Control host"] -->|"GET"| M["mf-manifest.json"] + S["Catalog product source"] --> A["Standalone Catalog app"] + S --> E["Federation exposes"] + A -->|"direct imports"| X["Card + Details + ActivityFeed"] + E --> X + H["Orbit Control host"] -->|"GET"| M["mf-manifest.json"] + H -->|"asyncStartup"| T["shared-state startup .js"] M -->|"remoteEntry"| C["catalog.*.lynx.bundle"] - C --> E["container only"] - E -->|"on demand"| F["ActivityFeed .bundle"] - E -->|"on demand"| G["Card .bundle"] - E -->|"on demand"| H["Details .bundle"] + C --> R["container only"] + R -->|"on demand"| F["ActivityFeed .bundle"] + R -->|"on demand"| G["Card .bundle"] + R -->|"on demand"| D["Details .bundle"] ``` The host never addresses a generated `remoteEntry.js` directly. Both import styles resolve the manifest, whose `metaData.remoteEntry` names the public `.lynx.bundle` container. Lazy expose bundles are fetched separately. +Both remote builds use `publicPath: 'auto'`. Module Federation resolves the +container URL from the manifest; the Lynx runtime plugin uses that resolved URL +as the base for split lazy bundles instead of relying on a browser +`document.currentScript`, which points at Lynx Web's internal client. + +## Run the standalone Catalog product + +The Catalog directly renders `Card`, `Details`, and `ActivityFeed` from the +same source files published by `federation.config.mjs`. It is a complete app, +not an artifact placeholder: + +```sh +pnpm dev:catalog:native +pnpm dev:catalog:web +``` + +The native command prints a QR code for Lynx Explorer on port 3001. Production +builds emit regular root apps at `dist/catalog-native/main.lynx.bundle` and +`dist/catalog-web/main.web.bundle`. + +Catalog app and federation transport are separate Rspeedy builds by design. +ReactLynx's `experimental_isLazyBundle` mode applies to the whole compilation +and emits `DynamicComponent` bundles, so the provider build contains only the +manifest, container, and three lazy exposes. The regular Catalog build bundles +its local shared-state implementation; the provider marks that implementation +`import: false`, so Orbit supplies the negotiated singleton and does not +download Catalog's standalone app or duplicate shared state. + +The federation configs explicitly enable `experiments.asyncStartup`. Shared +modules do not use `eager: true`: the host waits for share-scope initialization +and loads its singleton provider from `static/js/async/*.js` before application +startup. The remote's `import: false` consumer then reuses that initialized +background-realm singleton. + +On iOS, root-relative startup paths resolve against an HTTP root bundle's +origin in Debug and against the signed app bundle for an embedded Release root. ## Run the standalone iOS app @@ -50,6 +92,11 @@ environment variable to a LAN-reachable URL for a physical device. The shell injects both Lynx template and generic resource fetchers, so the root Bundle, federated container, and Lazy Bundles can arrive over HTTP(S). +The same shell can launch Catalog as an independent native product by setting +`LYNX_BUNDLE_URL` to `http://localhost:3000/catalog-native/main.lynx.bundle`. +The iOS E2E launches both root apps, interacts with Catalog locally, then proves +that Orbit loads those component sources through federation. + For a physical device, use the same LAN origin for both the host bundle and the manifest URL compiled into it: @@ -72,8 +119,9 @@ LYNX_REMOTE_ORIGIN=https://cdn.example.com/catalog/ pnpm build:native pnpm ios:sync ``` -Only the host bundle is embedded. The manifest, container, and lazy expose -bundles remain separately deployable HTTP(S) artifacts. The iOS simulator E2E +The host bundle and its non-eager async-startup JS are embedded. The manifest, +container, and lazy expose bundles remain separately deployable HTTP(S) +artifacts. The iOS simulator E2E launches the app, taps **Load remote catalog**, verifies compiled imports, runtime `loadRemote()`, and shared singleton identity, then checks every native bundle request observed by the test server. It also launches the Release app @@ -102,7 +150,9 @@ Explorer on the device and scan it. The phone must be able to reach Set `CATALOG_NATIVE_MANIFEST_URL` when the remote manifest is hosted elsewhere. `e2e:native` is artifact and transport validation. It compiles the real Rspeedy -host and remote, verifies the background container plus paired main-thread +host, Catalog app, and remote, verifies the regular standalone root bundle, +the separately transported async-startup singleton, the background container, +and paired main-thread snapshot bytecode in every lazy UI bundle, checks the manifest's public background expose/share metadata, then fetches the host, manifest, container, and every lazy bundle over HTTP. The macOS CI job adds a real iOS Simulator @@ -117,28 +167,33 @@ pnpm exec playwright install chromium pnpm e2e:web ``` -The test builds the official Rspeedy web host and remote, starts an ephemeral -HTTP server, and mounts `dist/host-web/main.web.bundle` through +The test builds the official Rspeedy web host, Catalog app, and remote; starts +an ephemeral HTTP server; and mounts both `dist/host-web/main.web.bundle` and +`dist/catalog-web/main.web.bundle` through `@lynx-js/web-core`'s public ``. Playwright uses a mobile viewport and touch input. It verifies: - manifest, container, and lazy expose requests over HTTP; +- async-startup share initialization over its independent JS request; - compiled `import()` and runtime `loadRemote()` results; - rendering and navigation through the ReactLynx UI; - shared-state identity and mutations across host and remote consumers; +- direct local composition and shared state in the standalone Catalog; +- no federation requests while Catalog runs through direct imports; - no Lynx, page, or console errors. A failed run writes `test/real-web/artifacts/failure.png`. Override artifact paths with `LYNX_HOST_WEB_BUNDLE`, `LYNX_REMOTE_MANIFEST`, -`LYNX_REMOTE_WEB_BUNDLE`, and `LYNX_WEB_E2E_SCREENSHOT`. +`LYNX_REMOTE_WEB_BUNDLE`, `LYNX_CATALOG_WEB_BUNDLE`, and +`LYNX_WEB_E2E_SCREENSHOT`. ## Test matrix | Command | Evidence | | ----------------------- | ---------------------------------------------------------------- | -| `pnpm e2e:native` | Real native Rspeedy builds plus binary/manifest validation | -| `pnpm e2e:ios` | Standalone UIKit app + iOS Simulator federation/runtime E2E | -| `pnpm e2e:web` | Real official `` browser runtime E2E | +| `pnpm e2e:native` | Native Catalog + host/provider binary and transport validation | +| `pnpm e2e:ios` | iOS Catalog launch plus Orbit federation/runtime E2E | +| `pnpm e2e:web` | Standalone Catalog and federated Orbit in official `` | | `pnpm test:ios-project` | Cross-platform iOS project, provenance, pod, and ATS policy gate | | `pnpm test` | Cross-platform native artifact and Lynx Web checks | diff --git a/apps/lynx-module-federation-demo/federation.config.mjs b/apps/lynx-module-federation-demo/federation.config.mjs index f9b44641cd3..32321c89bdc 100644 --- a/apps/lynx-module-federation-demo/federation.config.mjs +++ b/apps/lynx-module-federation-demo/federation.config.mjs @@ -19,7 +19,6 @@ export const resolveAliases = { const singleton = { singleton: true, - eager: true, requiredVersion: false, }; @@ -42,6 +41,7 @@ const createFederationOptions = (remotes) => ({ name: 'orbit_control', implementation, remotes, + experiments: { asyncStartup: true }, shareStrategy: 'loaded-first', shared: createAppSharedConfig(), }); @@ -68,6 +68,7 @@ export const createNativeHostFederationPlugin = (manifestUrl) => const createRemoteOptions = () => ({ name: 'catalog', implementation, + experiments: { asyncStartup: true }, shareStrategy: 'loaded-first', exposes: { './ActivityFeed': './src/remote-ui/ActivityFeed.tsx', diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj index 5806c92123f..6c8730da798 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj +++ b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 100000000000000000000005 /* main.lynx.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 100000000000000000000019 /* main.lynx.bundle */; }; 100000000000000000000006 /* OrbitControlUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001A /* OrbitControlUITests.swift */; }; 100000000000000000000007 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001C /* Assets.xcassets */; }; + 100000000000000000000008 /* static in Resources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001D /* static */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -41,6 +42,7 @@ 10000000000000000000001A /* OrbitControlUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrbitControlUITests.swift; sourceTree = ""; }; 10000000000000000000001B /* OrbitControlUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OrbitControlUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 10000000000000000000001C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 10000000000000000000001D /* static */ = {isa = PBXFileReference; lastKnownFileType = folder; path = static; sourceTree = ""; }; 2A53B1B55000D34C4A561687 /* libPods-OrbitControl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OrbitControl.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 4CA6D515EC78DF0FF9866EA0 /* Pods-OrbitControl.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OrbitControl.debug.xcconfig"; path = "Target Support Files/Pods-OrbitControl/Pods-OrbitControl.debug.xcconfig"; sourceTree = ""; }; 89120448DFA86FDA0491C6AB /* Pods-OrbitControl.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OrbitControl.release.xcconfig"; path = "Target Support Files/Pods-OrbitControl/Pods-OrbitControl.release.xcconfig"; sourceTree = ""; }; @@ -97,6 +99,7 @@ isa = PBXGroup; children = ( 100000000000000000000019 /* main.lynx.bundle */, + 10000000000000000000001D /* static */, ); path = Resources; sourceTree = ""; @@ -222,6 +225,7 @@ 100000000000000000000004 /* LaunchScreen.storyboard in Resources */, 100000000000000000000005 /* main.lynx.bundle in Resources */, 100000000000000000000007 /* Assets.xcassets in Resources */, + 100000000000000000000008 /* static in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.h b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.h index 8844a806cf7..05dca786315 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.h +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.h @@ -13,6 +13,9 @@ NS_ASSUME_NONNULL_BEGIN LynxTemplateResourceFetcher, LynxGenericResourceFetcher> +- (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL + NS_DESIGNATED_INITIALIZER NS_SWIFT_NAME(init(rootBundleURL:)); +- (instancetype)init NS_UNAVAILABLE; - (void)configureBuilder:(LynxViewBuilder *)builder NS_SWIFT_NAME(configure(_:)); @end diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m index ba3f9fa9fc9..fcd9d4c2cb9 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m @@ -95,6 +95,7 @@ @interface OrbitResourceFetcher () @property(nonatomic, strong) NSMutableDictionary *resourcePathCache; @property(nonatomic, strong) NSURL *resourceCacheDirectory; @property(nonatomic, assign) NSUInteger resourcePathCacheBytes; +@property(nonatomic, strong, nullable) NSURL *rootBundleURL; @property(nonatomic, strong) NSURLSession *session; @property(nonatomic, strong) OrbitResourceSessionDelegate *sessionDelegate; @@ -102,6 +103,7 @@ - (dispatch_block_t)loadDataForURLString:(NSString *)urlString completion:(void (^)(NSData *_Nullable, NSError *_Nullable))completion; - (NSURL *_Nullable)localURLForString:(NSString *)urlString; +- (NSString *)resolvedURLString:(NSString *)urlString; - (BOOL)isAllowedLocalURL:(NSURL *)url; - (NSString *_Nullable)cachedResourcePathForURLString:(NSString *)urlString; - (NSString *_Nullable)storeResourceData:(NSData *)data @@ -113,9 +115,14 @@ - (NSError *)errorWithMessage:(NSString *)message; @implementation OrbitResourceFetcher -- (instancetype)init { +- (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL { self = [super init]; if (self) { + NSURL *rootURL = [NSURL URLWithString:rootBundleURL]; + if ([rootURL.scheme isEqualToString:@"http"] || + [rootURL.scheme isEqualToString:@"https"]) { + _rootBundleURL = rootURL; + } _resourcePathCache = [NSMutableDictionary dictionary]; NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; @@ -176,19 +183,20 @@ - (dispatch_block_t)fetchResource:(LynxResourceRequest *)request - (dispatch_block_t)fetchResourcePath:(LynxResourceRequest *)request onComplete:(LynxGenericResourcePathCompletionBlock)callback { - NSURL *localURL = [self localURLForString:request.url]; + NSString *urlString = [self resolvedURLString:request.url]; + NSURL *localURL = [self localURLForString:urlString]; if (localURL) { callback(localURL.path, nil); return ^{}; } - NSString *cachedPath = [self cachedResourcePathForURLString:request.url]; + NSString *cachedPath = [self cachedResourcePathForURLString:urlString]; if (cachedPath) { callback(cachedPath, nil); return ^{}; } - return [self loadDataForURLString:request.url + return [self loadDataForURLString:urlString completion:^(NSData *data, NSError *error) { if (!data) { callback(nil, error); @@ -197,7 +205,7 @@ - (dispatch_block_t)fetchResourcePath:(LynxResourceRequest *)request NSError *writeError = nil; NSString *path = [self storeResourceData:data - forURLString:request.url + forURLString:urlString error:&writeError]; callback(path, writeError); }]; @@ -244,6 +252,7 @@ - (NSString *_Nullable)storeResourceData:(NSData *)data - (dispatch_block_t)loadDataForURLString:(NSString *)urlString completion:(void (^)(NSData *_Nullable, NSError *_Nullable))completion { + urlString = [self resolvedURLString:urlString]; NSURL *localURL = [self localURLForString:urlString]; if (localURL) { NSError *error = nil; @@ -319,6 +328,15 @@ - (dispatch_block_t)loadDataForURLString:(NSString *)urlString return ^{ [task cancel]; }; } +- (NSString *)resolvedURLString:(NSString *)urlString { + if (!self.rootBundleURL || ![urlString hasPrefix:@"/static/"]) { + return urlString; + } + return [NSURL URLWithString:urlString + relativeToURL:self.rootBundleURL].absoluteURL.absoluteString + ?: urlString; +} + - (NSURL *_Nullable)localURLForString:(NSString *)urlString { NSURL *url = [NSURL URLWithString:urlString]; if ([url.scheme isEqualToString:@"file"]) { @@ -328,12 +346,16 @@ - (NSURL *_Nullable)localURLForString:(NSString *)urlString { [url.scheme isEqualToString:@"https"]) { return nil; } + NSString *relativePath; if ([urlString isAbsolutePath]) { NSURL *fileURL = [NSURL fileURLWithPath:urlString]; - return [self isAllowedLocalURL:fileURL] ? fileURL : nil; + if ([self isAllowedLocalURL:fileURL]) return fileURL; + if (![urlString hasPrefix:@"/static/"]) return nil; + relativePath = [urlString substringFromIndex:1]; + } else { + relativePath = url.path.length > 0 ? url.path : urlString; } - NSString *relativePath = url.path.length > 0 ? url.path : urlString; relativePath = relativePath.stringByStandardizingPath; if (relativePath.length == 0 || [relativePath isEqualToString:@"."] || [relativePath isEqualToString:@".."] || diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift b/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift index 2f0385bc9df..8bf65c0a688 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/ViewController.swift @@ -3,7 +3,9 @@ import UIKit final class ViewController: UIViewController { - private let resourceFetcher = OrbitResourceFetcher() + private lazy var resourceFetcher = OrbitResourceFetcher( + rootBundleURL: rootBundleURL + ) private var lynxView: LynxView? override func viewDidLoad() { diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift index 34bc1fbe234..7474bc0f983 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift @@ -1,6 +1,31 @@ import XCTest final class OrbitControlUITests: XCTestCase { + private func launchNetworkBundle( + environmentKey: String, + fallback: String + ) -> XCUIApplication { + addUIInterruptionMonitor(withDescription: "Local network permission") { alert in + guard alert.buttons["Allow"].exists else { return false } + alert.buttons["Allow"].tap() + return true + } + + let app = XCUIApplication() + app.launchEnvironment["LYNX_BUNDLE_URL"] = + ProcessInfo.processInfo.environment[environmentKey] ?? fallback + app.launch() + app.tap() + return app + } + + private func attachScreenshot(named name: String) { + let attachment = XCTAttachment(screenshot: XCUIScreen.main.screenshot()) + attachment.name = name + attachment.lifetime = .keepAlways + add(attachment) + } + func testEmbeddedReleaseHostLaunches() { let app = XCUIApplication() app.launchEnvironment["LYNX_BUNDLE_URL"] = "" @@ -13,18 +38,10 @@ final class OrbitControlUITests: XCTestCase { } func testFederatedImportsRuntimeLoadingAndSingleton() { - addUIInterruptionMonitor(withDescription: "Local network permission") { alert in - guard alert.buttons["Allow"].exists else { return false } - alert.buttons["Allow"].tap() - return true - } - - let app = XCUIApplication() - app.launchEnvironment["LYNX_BUNDLE_URL"] = - ProcessInfo.processInfo.environment["LYNX_BUNDLE_URL"] - ?? "http://localhost:3000/host-native/main.lynx.bundle" - app.launch() - app.tap() + let app = launchNetworkBundle( + environmentKey: "LYNX_BUNDLE_URL", + fallback: "http://localhost:3000/host-native/main.lynx.bundle" + ) let loadButton = app.descendants(matching: .any) .matching(NSPredicate(format: "label == %@", "Load remote catalog")) @@ -37,9 +54,44 @@ final class OrbitControlUITests: XCTestCase { .firstMatch XCTAssertTrue(readiness.waitForExistence(timeout: 60)) - let attachment = XCTAttachment(screenshot: XCUIScreen.main.screenshot()) - attachment.name = "Orbit Control federation loaded" - attachment.lifetime = .keepAlways - add(attachment) + attachScreenshot(named: "Orbit Control federation loaded") + } + + func testStandaloneCatalogRemoteBuildLaunches() { + let app = launchNetworkBundle( + environmentKey: "CATALOG_BUNDLE_URL", + fallback: "http://localhost:3000/catalog-native/main.lynx.bundle" + ) + + let readiness = app.descendants(matching: .any) + .matching(identifier: "catalog-standalone-ready") + .firstMatch + XCTAssertTrue(readiness.waitForExistence(timeout: 30)) + + for label in ["REMOTE CARD", "REMOTE DETAILS", "Federated activity"] { + let component = app.descendants(matching: .any) + .matching(NSPredicate(format: "label == %@", label)) + .firstMatch + XCTAssertTrue(component.waitForExistence(timeout: 30), "Missing \(label)") + } + + let count = app.descendants(matching: .any) + .matching(identifier: "shared-card-count") + .firstMatch + XCTAssertTrue(count.waitForExistence(timeout: 30)) + let baseline = count.label + + let increment = app.descendants(matching: .any) + .matching(NSPredicate(format: "label == %@", "Increment from remote")) + .firstMatch + XCTAssertTrue(increment.waitForExistence(timeout: 30)) + increment.tap() + expectation( + for: NSPredicate(format: "label != %@", baseline), + evaluatedWith: count + ) + waitForExpectations(timeout: 10) + + attachScreenshot(named: "Standalone Orbit Catalog") } } diff --git a/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs b/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs new file mode 100644 index 00000000000..c6a72063526 --- /dev/null +++ b/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs @@ -0,0 +1,38 @@ +import { pluginQRCode } from '@lynx-js/qrcode-rsbuild-plugin'; +import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; +import { defineConfig } from '@lynx-js/rspeedy'; + +import { resolveAliases } from './federation.config.mjs'; + +const catalogDevHost = process.env.CATALOG_DEV_HOST ?? '127.0.0.1'; +const catalogDevPort = Number(process.env.CATALOG_DEV_PORT ?? 3001); + +export default defineConfig({ + plugins: [ + pluginReactLynx({ defaultDisplayLinear: false }), + pluginQRCode({ fullscreen: true }), + ], + source: { + entry: { + main: './src/catalog-app/index.tsx', + }, + }, + environments: { + lynx: {}, + }, + output: { + cleanDistPath: false, + distPath: { + root: 'dist/catalog-native', + }, + minify: true, + }, + server: { + host: catalogDevHost, + port: catalogDevPort, + }, + resolve: { + alias: resolveAliases, + }, + splitChunks: false, +}); diff --git a/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs b/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs new file mode 100644 index 00000000000..03f46622edf --- /dev/null +++ b/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs @@ -0,0 +1,30 @@ +import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; +import { defineConfig } from '@lynx-js/rspeedy'; + +import { resolveAliases } from './federation.config.mjs'; + +export default defineConfig({ + plugins: [pluginReactLynx({ defaultDisplayLinear: false })], + source: { + entry: { + main: './src/catalog-app/index.tsx', + }, + }, + environments: { + web: {}, + }, + output: { + cleanDistPath: false, + distPath: { + root: 'dist/catalog-web', + }, + minify: false, + }, + server: { + port: Number(process.env.CATALOG_DEV_PORT ?? 3001), + }, + resolve: { + alias: resolveAliases, + }, + splitChunks: false, +}); diff --git a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs index d3abac05964..c26f83341e2 100644 --- a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs @@ -6,10 +6,6 @@ import { resolveAliases, } from './federation.config.mjs'; -const nativeRemoteOrigin = - process.env.LYNX_REMOTE_ORIGIN?.replace(/\/+$/, '') ?? - 'http://127.0.0.1:3000'; - export default defineConfig({ plugins: [ pluginReactLynx({ @@ -27,7 +23,7 @@ export default defineConfig({ lynx: {}, }, output: { - assetPrefix: `${nativeRemoteOrigin}/remote-native/`, + assetPrefix: 'auto', cleanDistPath: false, distPath: { root: 'dist/remote-native', diff --git a/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs index 57a4bba5921..4c56a6623de 100644 --- a/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs @@ -23,6 +23,7 @@ export default defineConfig({ web: {}, }, output: { + assetPrefix: 'auto', cleanDistPath: false, distPath: { root: 'dist/remote-web', diff --git a/apps/lynx-module-federation-demo/package.json b/apps/lynx-module-federation-demo/package.json index 43d0df1434f..6a0216bca43 100644 --- a/apps/lynx-module-federation-demo/package.json +++ b/apps/lynx-module-federation-demo/package.json @@ -5,15 +5,19 @@ "type": "module", "scripts": { "build:adapter": "pnpm --dir ../../packages/lynx run build", + "build:catalog:native": "node rspack-canary-rspeedy.mjs build -c lynx.catalog.native.config.mjs", + "build:catalog:web": "node rspack-canary-rspeedy.mjs build -c lynx.catalog.web.config.mjs", "build:host:native": "node rspack-canary-rspeedy.mjs build -c lynx.config.mjs", "build:host:web": "node rspack-canary-rspeedy.mjs build -c lynx.web.config.mjs", "build:remote:native": "node rspack-canary-rspeedy.mjs build -c lynx.remote.native.config.mjs", "build:remote:web": "node rspack-canary-rspeedy.mjs build -c lynx.remote.web.config.mjs", "clean:dist": "node --eval \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"", - "build:native": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:native && pnpm run build:host:native", - "build:web": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:web && pnpm run build:host:web", - "build": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:native && pnpm run build:remote:web && pnpm run build:host:native && pnpm run build:host:web", + "build:native": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:catalog:native && pnpm run build:remote:native && pnpm run build:host:native", + "build:web": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:catalog:web && pnpm run build:remote:web && pnpm run build:host:web", + "build": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:catalog:native && pnpm run build:catalog:web && pnpm run build:remote:native && pnpm run build:remote:web && pnpm run build:host:native && pnpm run build:host:web", "dev": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:native && node rspack-canary-rspeedy.mjs dev -c lynx.config.mjs", + "dev:catalog:native": "pnpm run clean:dist && pnpm run build:adapter && node rspack-canary-rspeedy.mjs dev -c lynx.catalog.native.config.mjs", + "dev:catalog:web": "pnpm run clean:dist && pnpm run build:adapter && node rspack-canary-rspeedy.mjs dev -c lynx.catalog.web.config.mjs", "dev:web": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:web && node rspack-canary-rspeedy.mjs dev -c lynx.web.config.mjs", "e2e:native": "pnpm run build:native && pnpm run test:native-artifacts && pnpm run test:native-dev-server", "e2e:ios": "node test/ios/run.mjs", @@ -24,6 +28,8 @@ "ios:prepare": "pnpm run build:native && pnpm run ios:sync", "ios:sync": "node scripts/sync-ios-bundle.mjs", "preview": "node rspack-canary-rspeedy.mjs preview -c lynx.config.mjs", + "preview:catalog:native": "node rspack-canary-rspeedy.mjs preview -c lynx.catalog.native.config.mjs", + "preview:catalog:web": "node rspack-canary-rspeedy.mjs preview -c lynx.catalog.web.config.mjs", "preview:web": "node rspack-canary-rspeedy.mjs preview -c lynx.web.config.mjs", "test": "pnpm run test:ios-project && pnpm run e2e:native && pnpm run e2e:web", "test:ios-project": "node test/ios-project.mjs", diff --git a/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs b/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs index a0718c4808e..73a7e5a72ec 100644 --- a/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs +++ b/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { copyFile, mkdir, stat } from 'node:fs/promises'; +import { cp, copyFile, mkdir, rm, stat } from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -12,9 +12,24 @@ const source = path.resolve( process.env.LYNX_IOS_HOST_BUNDLE ?? 'dist/host-native/main.lynx.bundle', ); const destination = path.join(appRoot, 'ios/Resources/main.lynx.bundle'); +const sourceStatic = path.join(path.dirname(source), 'static'); +const destinationStatic = path.join(appRoot, 'ios/Resources/static'); -const sourceStat = await stat(source); +const [sourceStat, sourceStaticStat] = await Promise.all([ + stat(source), + stat(sourceStatic), +]); assert.ok(sourceStat.size > 0, `Native host bundle is empty: ${source}`); +assert.ok( + sourceStaticStat.isDirectory(), + `Native host startup assets are missing: ${sourceStatic}`, +); await mkdir(path.dirname(destination), { recursive: true }); -await copyFile(source, destination); -process.stdout.write(`Copied ${source} to ${destination}.\n`); +await rm(destinationStatic, { force: true, recursive: true }); +await Promise.all([ + copyFile(source, destination), + cp(sourceStatic, destinationStatic, { recursive: true }), +]); +process.stdout.write( + `Copied ${source} and ${sourceStatic} to iOS Resources.\n`, +); diff --git a/apps/lynx-module-federation-demo/src/catalog-app/CatalogApp.css b/apps/lynx-module-federation-demo/src/catalog-app/CatalogApp.css new file mode 100644 index 00000000000..df52d807094 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/catalog-app/CatalogApp.css @@ -0,0 +1,285 @@ +:root { + background-color: #f2f5f7; +} + +.CatalogPage { + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + background-color: #f2f5f7; +} + +.CatalogTopBar { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding: 20px 20px 12px; +} + +.CatalogBrand { + display: flex; + flex-direction: row; + align-items: center; +} + +.CatalogBrandMark { + width: 36px; + height: 36px; + border-radius: 12px; + background-color: #ff6c47; + align-items: center; + justify-content: center; + margin-right: 10px; +} + +.CatalogBrandMarkText { + color: #ffffff; + font-size: 17px; + font-weight: 800; +} + +.CatalogBrandCopy { + display: flex; + flex-direction: column; +} + +.CatalogBrandName { + color: #17212b; + font-size: 17px; + font-weight: 750; +} + +.CatalogBrandMeta { + color: #89949e; + font-size: 9px; + font-weight: 700; + margin-top: 2px; +} + +.CatalogLiveBadge { + display: flex; + flex-direction: row; + align-items: center; + padding: 8px 10px; + border-radius: 14px; + background-color: #e0f8eb; +} + +.CatalogLiveDot { + width: 7px; + height: 7px; + border-radius: 4px; + background-color: #30bd78; + margin-right: 6px; +} + +.CatalogLiveText { + color: #247b53; + font-size: 10px; + font-weight: 750; +} + +.CatalogContent { + flex: 1; + padding-left: 20px; + padding-right: 20px; +} + +.CatalogScreen { + display: flex; + flex-direction: column; + padding-bottom: 28px; +} + +.CatalogHero { + display: flex; + flex-direction: column; + padding-top: 18px; + padding-bottom: 20px; +} + +.CatalogEyebrow { + color: #e45331; + font-size: 10px; + font-weight: 750; + letter-spacing: 1.2px; + margin-bottom: 9px; +} + +.CatalogHeroTitle { + color: #17212b; + font-size: 32px; + line-height: 37px; + font-weight: 800; + letter-spacing: -0.7px; + margin-bottom: 9px; +} + +.CatalogHeroCopy { + color: #64717d; + font-size: 13px; + line-height: 19px; + max-width: 350px; +} + +.CatalogProof { + display: flex; + flex-direction: row; + align-items: center; + min-height: 96px; + padding: 16px; + border-radius: 20px; + background-color: #17212b; + margin-bottom: 22px; +} + +.CatalogProofMetric { + display: flex; + flex-direction: column; + flex: 1; + align-items: center; +} + +.CatalogProofMetricWide { + flex: 1.25; +} + +.CatalogProofValue { + color: #ffffff; + font-size: 27px; + font-weight: 800; + margin-bottom: 5px; +} + +.CatalogProofValueSmall { + color: #60e2a4; + font-size: 13px; + margin-top: 8px; + margin-bottom: 10px; +} + +.CatalogProofLabel { + color: #8799a9; + font-size: 8px; + font-weight: 700; +} + +.CatalogProofDivider { + width: 1px; + height: 48px; + background-color: #34424f; +} + +.CatalogSectionHeader { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + margin-top: 4px; + margin-bottom: 12px; +} + +.CatalogActivityHeader { + margin-top: 14px; +} + +.CatalogSectionTitle { + color: #17212b; + font-size: 18px; + font-weight: 750; +} + +.CatalogSectionMeta { + color: #89949e; + font-size: 9px; + font-weight: 700; +} + +.CatalogExposeList { + display: flex; + flex-direction: column; + background-color: #ffffff; + border-width: 1px; + border-color: #e2e8eb; + border-radius: 20px; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 22px; +} + +.CatalogExposeRow { + display: flex; + flex-direction: row; + align-items: center; + min-height: 68px; + border-bottom-width: 1px; + border-bottom-color: #e8edf0; +} + +.CatalogExposeRowLast { + border-bottom-width: 0; +} + +.CatalogExposeIcon { + width: 34px; + height: 34px; + border-radius: 11px; + align-items: center; + justify-content: center; + background-color: #effcf6; + margin-right: 11px; +} + +.CatalogExposeIconText { + color: #218559; + font-size: 13px; + font-weight: 800; +} + +.CatalogExposeCopy { + display: flex; + flex: 1; + flex-direction: column; +} + +.CatalogExposeName { + color: #17212b; + font-size: 13px; + font-weight: 700; +} + +.CatalogExposePath { + color: #7b8791; + font-size: 10px; + margin-top: 3px; +} + +.CatalogExposeStatus { + color: #2a9665; + font-size: 9px; + font-weight: 750; +} + +.CatalogFooter { + display: flex; + flex-direction: column; + padding: 18px; + border-radius: 18px; + background-color: #ffece6; + margin-top: 18px; +} + +.CatalogFooterTitle { + color: #8e3523; + font-size: 14px; + font-weight: 750; + margin-bottom: 5px; +} + +.CatalogFooterCopy { + color: #a04b37; + font-size: 11px; + line-height: 16px; +} diff --git a/apps/lynx-module-federation-demo/src/catalog-app/CatalogApp.tsx b/apps/lynx-module-federation-demo/src/catalog-app/CatalogApp.tsx new file mode 100644 index 00000000000..5f2dbbf86a9 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/catalog-app/CatalogApp.tsx @@ -0,0 +1,184 @@ +import { useCallback, useState } from '@lynx-js/react'; + +import { snapshot } from 'orbit-shared-state'; +import { ActivityFeed } from '../remote-ui/ActivityFeed'; +import { Card } from '../remote-ui/Card'; +import type { + ActivityEntry, + ActivityFilter, + SharedStateView, +} from '../remote-ui/contracts'; +import { Details } from '../remote-ui/Details'; +import './CatalogApp.css'; + +const INITIAL_ACTIVITY: ActivityEntry[] = [ + { + id: 'catalog-boot', + category: 'runtime', + detail: 'Rspeedy launched the Catalog as its own ReactLynx product.', + time: 'NOW', + title: 'Catalog app launched', + }, + { + id: 'catalog-exposes', + category: 'runtime', + detail: 'Card, Details, and ActivityFeed are also published as exposes.', + time: 'NOW', + title: 'Federation surface ready', + }, +]; + +const EXPOSES = [ + { name: 'Card', path: 'catalog/Card' }, + { name: 'Details', path: 'catalog/Details' }, + { name: 'ActivityFeed', path: 'catalog/ActivityFeed' }, +]; + +export function CatalogApp() { + const [activity, setActivity] = useState(INITIAL_ACTIVITY); + const [filter, setFilter] = useState('all'); + const [sharedState, setSharedState] = useState(snapshot()); + + const handleStateChange = useCallback((nextState: SharedStateView) => { + 'background-only'; + setSharedState(nextState); + setActivity((entries) => [ + { + id: `catalog-state-${nextState.revision}`, + category: 'state', + detail: `The standalone Card updated the local singleton to ${nextState.count}.`, + time: 'NOW', + title: 'Shared state changed', + }, + ...entries, + ]); + }, []); + + const selectFilter = useCallback((nextFilter: ActivityFilter) => { + 'background-only'; + setFilter(nextFilter); + }, []); + + return ( + + + + + C + + + Orbit Catalog + REMOTE PRODUCT + + + + + + LIVE + + + + + + + + STANDALONE + FEDERATED + + One product, three exports. + + + This app runs on its own. Orbit Control imports the exact same + components from its manifest over HTTP. + + + + + + 3 + EXPOSED MODULES + + + + + {sharedState.count} + + LOCAL SHARED COUNT + + + + + NATIVE + + LYNX + WEB + + + + + Published surface + MF MANIFEST + + + {EXPOSES.map((expose, index) => ( + + + + {expose.name.slice(0, 1)} + + + + {expose.name} + {expose.path} + + EXPOSED + + ))} + + + + Local composition + DIRECT IMPORTS + + +

+ + + Product activity + SHARED FUNCTIONALITY + + + + + Built once with Rspeedy + + Launch main.lynx.bundle as this app, or consume the three lazy + exposes through mf-manifest.json. + + + + + + ); +} diff --git a/apps/lynx-module-federation-demo/src/catalog-app/index.tsx b/apps/lynx-module-federation-demo/src/catalog-app/index.tsx new file mode 100644 index 00000000000..2472b2e6845 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/catalog-app/index.tsx @@ -0,0 +1,10 @@ +import '@lynx-js/react/experimental/lazy/import'; +import { root } from '@lynx-js/react'; + +import { CatalogApp } from './CatalogApp'; + +root.render(); + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept(); +} diff --git a/apps/lynx-module-federation-demo/src/remote-ui/Card.tsx b/apps/lynx-module-federation-demo/src/remote-ui/Card.tsx index 463bb179ca2..855c197cfd6 100644 --- a/apps/lynx-module-federation-demo/src/remote-ui/Card.tsx +++ b/apps/lynx-module-federation-demo/src/remote-ui/Card.tsx @@ -27,7 +27,11 @@ export function Card({ loadPath, onStateChange }: RemoteCardProps) { - + {sharedState.count} read by catalog/Card diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index 02e19e19c2b..9f2e1ed36b4 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -24,6 +24,8 @@ const [ podfileLock, provenance, fetcher, + fetcherHeader, + viewController, releaseInfo, debugInfo, project, @@ -31,11 +33,14 @@ const [ appSource, packageJson, deviceServer, + syncScript, ] = await Promise.all([ read('ios/Podfile'), read('ios/Podfile.lock'), read('ios/UPSTREAM.md'), read('ios/OrbitControl/OrbitResourceFetcher.m'), + read('ios/OrbitControl/OrbitResourceFetcher.h'), + read('ios/OrbitControl/ViewController.swift'), read('ios/OrbitControl/Info.plist'), read('ios/OrbitControl/Info.Debug.plist'), read('ios/OrbitControl.xcodeproj/project.pbxproj'), @@ -43,6 +48,7 @@ const [ read('src/app/App.tsx'), read('package.json'), read('scripts/dev-ios-device.mjs'), + read('scripts/sync-ios-bundle.mjs'), ]); for (const pod of ['Lynx', 'LynxService', 'XElement']) { @@ -65,6 +71,10 @@ assert.match(fetcher, /totalBytesWritten > .*OrbitResourceResponseByteLimit/); assert.match(fetcher, /\[downloadTask cancel\]/); assert.match(fetcher, /timeoutIntervalForResource = 60/); assert.match(fetcher, /URLByResolvingSymlinksInPath/); +assert.match(fetcher, /resolvedURLString/); +assert.match(fetcher, /relativeToURL:self\.rootBundleURL/); +assert.match(fetcher, /hasPrefix:@"\/static\/"/); +assert.match(fetcher, /relativePath = \[urlString substringFromIndex:1\]/); assert.doesNotMatch(releaseInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(releaseInfo, /NSExceptionAllowsInsecureHTTPLoads/); assert.match(debugInfo, /NSAllowsLocalNetworking/); @@ -73,8 +83,14 @@ assert.match(debugInfo, /localhost<\/key>/); assert.doesNotMatch(debugInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(project, /DEVELOPMENT_TEAM/); assert.match(project, /OrbitControlUITests/); +assert.match(project, /static in Resources/); assert.match(uiTest, /matching\(identifier: "federation-ready"\)/); assert.match(appSource, /accessibilityId: 'federation-ready'/); +assert.match(fetcherHeader, /initWithRootBundleURL/); +assert.match( + viewController, + /OrbitResourceFetcher\(\s*rootBundleURL: rootBundleURL\s*\)/, +); assert.match( appSource, /ios-platform-accessibility-id=\{status\.accessibilityId\}/, @@ -83,6 +99,9 @@ assert.match(uiTest, /testEmbeddedReleaseHostLaunches/); assert.match(packageJson, /"ios:device": "node scripts\/dev-ios-device\.mjs"/); assert.match(deviceServer, /LYNX_DEV_HOST: '0\.0\.0\.0'/); assert.match(deviceServer, /not a loopback or unspecified address/); +assert.match(syncScript, /dist\/host-native\/main\.lynx\.bundle/); +assert.match(syncScript, /sourceStatic/); +assert.match(syncScript, /cp\(sourceStatic, destinationStatic/); const deviceServerPath = path.join(appRoot, 'scripts/dev-ios-device.mjs'); const validateDeviceOrigin = (origin) => spawnSync(process.execPath, [deviceServerPath, '--check-origin'], { diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index b6690cabda5..10cabd61115 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -33,11 +33,20 @@ await mkdir(artifactsRoot, { recursive: true }); await rm(resultBundlePath, { force: true, recursive: true }); await rm(releaseResultBundlePath, { force: true, recursive: true }); await stat(path.join(distRoot, 'host-native/main.lynx.bundle')); +await stat(path.join(distRoot, 'catalog-native/main.lynx.bundle')); await stat(path.join(distRoot, 'remote-native/mf-manifest.json')); +const startupFiles = ( + await readdir(path.join(distRoot, 'host-native/static/js/async')) +).filter((file) => file.endsWith('.js')); +assert.ok(startupFiles.length > 0); const manifest = JSON.parse( await readFile(path.join(distRoot, 'remote-native/mf-manifest.json'), 'utf8'), ); -const serverURL = new URL(manifest.metaData.publicPath); +const serverURL = new URL( + manifest.metaData.publicPath === 'auto' + ? 'http://127.0.0.1:3000/remote-native/' + : manifest.metaData.publicPath, +); assert.ok( serverURL.hostname === 'localhost' || serverURL.hostname === '127.0.0.1', `iOS E2E only serves local artifacts, received ${serverURL.origin}`, @@ -55,8 +64,11 @@ const server = createServer(async (request, response) => { new URL(request.url, 'http://localhost').pathname, ); requestedPaths.push(pathname); - const filePath = path.resolve(distRoot, `.${pathname}`); - if (!filePath.startsWith(`${distRoot}${path.sep}`)) { + const artifactRoot = pathname.startsWith('/static/') + ? path.join(distRoot, 'host-native') + : distRoot; + const filePath = path.resolve(artifactRoot, `.${pathname}`); + if (!filePath.startsWith(`${artifactRoot}${path.sep}`)) { response.writeHead(403).end('Forbidden'); return; } @@ -156,10 +168,12 @@ try { '-parallel-testing-enabled', 'NO', '-only-testing:OrbitControlUITests/OrbitControlUITests/testFederatedImportsRuntimeLoadingAndSingleton', + '-only-testing:OrbitControlUITests/OrbitControlUITests/testStandaloneCatalogRemoteBuildLaunches', ], { env: { ...process.env, + CATALOG_BUNDLE_URL: `${serverURL.origin}/catalog-native/main.lynx.bundle`, LYNX_BUNDLE_URL: `${serverURL.origin}/host-native/main.lynx.bundle`, }, }, @@ -186,11 +200,10 @@ try { const remoteEntry = manifest.metaData.remoteEntry; const expected = [ '/host-native/main.lynx.bundle', + '/catalog-native/main.lynx.bundle', + ...startupFiles.map((file) => `/static/js/async/${file}`), '/remote-native/mf-manifest.json', - new URL( - `${remoteEntry.path}${remoteEntry.name}`, - manifest.metaData.publicPath, - ).pathname, + new URL(`${remoteEntry.path}${remoteEntry.name}`, serverURL).pathname, ]; const lazyFiles = (await readdir(path.join(distRoot, 'remote-native/async'))) .filter((file) => file.endsWith('.bundle')) @@ -204,7 +217,7 @@ try { ); } process.stdout.write( - `Native iOS app loaded the host, manifest, container, and ${lazyFiles.length} lazy bundles.\n`, + `Native iOS app launched Orbit and standalone Catalog, then loaded async startup, the manifest, container, and ${lazyFiles.length} lazy bundles.\n`, ); } finally { await writeFile(requestLogPath, JSON.stringify(requestedPaths, null, 2)); diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index b91a75cae1e..c2a7b0fba85 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -10,6 +10,10 @@ const requireFromAdapter = createRequire( ); const { decode_napi: decodeTemplate } = requireFromAdapter('@lynx-js/tasm'); const hostBundlePath = path.join(appRoot, 'dist/host-native/main.lynx.bundle'); +const standaloneBundlePath = path.join( + appRoot, + 'dist/catalog-native/main.lynx.bundle', +); const remoteBundlePath = path.join( appRoot, 'dist/remote-native/catalog.native.lynx.bundle', @@ -22,34 +26,67 @@ const remoteStatsPath = path.join(appRoot, 'dist/remote-native/mf-stats.json'); const [ hostBundle, + standaloneBundle, remoteBundle, manifestSource, statsSource, remoteFiles, lazyFiles, + startupFiles, ] = await Promise.all([ stat(hostBundlePath), + stat(standaloneBundlePath), stat(remoteBundlePath), readFile(remoteManifestPath, 'utf8'), readFile(remoteStatsPath, 'utf8'), readdir(path.join(appRoot, 'dist/remote-native')), readdir(path.join(appRoot, 'dist/remote-native/async')), + readdir(path.join(appRoot, 'dist/host-native/static/js/async')), ]); assert.ok(hostBundle.isFile() && hostBundle.size > 1_000, hostBundlePath); +assert.ok( + standaloneBundle.isFile() && standaloneBundle.size > 1_000, + standaloneBundlePath, +); assert.ok(remoteBundle.isFile() && remoteBundle.size > 1_000, remoteBundlePath); assert.ok(!remoteFiles.includes('bootstrap.lynx.bundle')); +assert.ok(!remoteFiles.includes('main.lynx.bundle')); assert.equal(lazyFiles.filter((name) => name.endsWith('.bundle')).length, 3); +const startupScripts = startupFiles.filter((name) => name.endsWith('.js')); +assert.ok(startupScripts.length > 0); +const startupSources = await Promise.all( + startupScripts.map((name) => + readFile( + path.join(appRoot, 'dist/host-native/static/js/async', name), + 'utf8', + ), + ), +); +assert.ok( + startupSources.some( + (source) => /orbit-.*Date\.now/.test(source) && /increment/.test(source), + ), + 'async startup assets do not contain the host shared-state provider', +); -const [hostTemplate, remoteTemplate] = await Promise.all([ - readFile(hostBundlePath).then(decodeTemplate), - readFile(remoteBundlePath).then(decodeTemplate), -]); +const [hostBundleSource, standaloneSource, remoteBundleSource] = + await Promise.all([ + readFile(hostBundlePath), + readFile(standaloneBundlePath), + readFile(remoteBundlePath), + ]); +const hostTemplate = decodeTemplate(hostBundleSource); +const standaloneTemplate = decodeTemplate(standaloneSource); +const remoteTemplate = decodeTemplate(remoteBundleSource); +assert.equal(standaloneTemplate['app-type'], 'card'); +assert.ok(standaloneSource.includes(Buffer.from('catalog-standalone-app'))); assert.equal(remoteTemplate['app-type'], 'DynamicComponent'); assert.equal(remoteTemplate['engine-version'], '3.7'); assert.deepEqual(Object.keys(remoteTemplate['custom-sections']), ['catalog']); const containerSource = remoteTemplate['custom-sections'].catalog; assert.match(containerSource, /lynx_chunking/); +assert.match(containerSource, /lynx_public_path_auto/); assert.match(containerSource, /split/); for (const implementationText of [ 'Increment from remote', @@ -81,6 +118,8 @@ assert.ok( !hostBackgroundSource.includes('"default:react:main-thread"'), 'background-only native host initializes the main-thread share scope', ); +assert.match(hostBackgroundSource, /mfAsyncStartup/); +assert.match(hostBackgroundSource, /static\/js\/async\//); for (const request of [ 'catalog/ActivityFeed', 'catalog/Card', @@ -92,6 +131,7 @@ for (const request of [ const manifest = JSON.parse(manifestSource); const stats = JSON.parse(statsSource); assert.equal(manifest.metaData?.name, 'catalog'); +assert.equal(manifest.metaData?.publicPath, 'auto'); assert.deepEqual(manifest.metaData?.remoteEntry, { name: 'catalog.native.lynx.bundle', path: '', @@ -173,6 +213,7 @@ for (const shared of manifest.shared) { assert.equal(shared.layer, 'react:background', shared.name); assert.deepEqual(shared.shareScope, ['default:react:background']); assert.equal(shared.singleton, true, shared.name); + assert.notEqual(shared.eager, true, shared.name); } assert.deepEqual( stats.shared.map(({ name }) => name), @@ -187,4 +228,6 @@ assert.ok( 'no expose records its shared-state dependency', ); -console.log('Native Lynx host and federation remote artifacts verified.'); +console.log( + 'Native Lynx host, standalone Catalog, and federation artifacts verified.', +); diff --git a/apps/lynx-module-federation-demo/test/native-dev-server.mjs b/apps/lynx-module-federation-demo/test/native-dev-server.mjs index 5c12ada1a68..247fb3c91a3 100644 --- a/apps/lynx-module-federation-demo/test/native-dev-server.mjs +++ b/apps/lynx-module-federation-demo/test/native-dev-server.mjs @@ -54,22 +54,22 @@ const fetchReady = async (url, timeout = 30_000) => { ); }; -try { - const remoteBuild = spawnSync( +const build = (config, label) => { + const result = spawnSync( process.execPath, - [ - 'rspack-canary-rspeedy.mjs', - 'build', - '-c', - 'lynx.remote.native.config.mjs', - ], + ['rspack-canary-rspeedy.mjs', 'build', '-c', config], { cwd: appRoot, encoding: 'utf8', env: devEnvironment }, ); assert.equal( - remoteBuild.status, + result.status, 0, - `Native remote rebuild failed:\n${remoteBuild.stdout}\n${remoteBuild.stderr}`, + `${label} failed:\n${result.stdout}\n${result.stderr}`, ); +}; + +try { + build('lynx.remote.native.config.mjs', 'Native remote rebuild'); + build('lynx.catalog.native.config.mjs', 'Native Catalog rebuild'); child = spawn( process.execPath, ['rspack-canary-rspeedy.mjs', 'dev', '-c', 'lynx.config.mjs'], @@ -83,17 +83,26 @@ try { child.stderr.on('data', (chunk) => output.push(chunk.toString())); await fetchReady(`${origin}/main.lynx.bundle`); + await fetchReady(`${origin}/catalog-native/main.lynx.bundle`); + const startupFiles = ( + await readdir(path.join(appRoot, 'dist/host-native/static/js/async')) + ).filter((name) => name.endsWith('.js')); + assert.ok(startupFiles.length > 0); + await Promise.all( + startupFiles.map((name) => fetchReady(`${origin}/static/js/async/${name}`)), + ); const manifestResponse = await fetchReady( `${origin}/remote-native/mf-manifest.json`, ); const manifest = await manifestResponse.json(); - assert.equal(manifest.metaData.publicPath, `${origin}/remote-native/`); + assert.equal(manifest.metaData.publicPath, 'auto'); const remoteEntry = manifest.metaData.remoteEntry; + const remoteBase = + manifest.metaData.publicPath === 'auto' + ? new URL('.', manifestResponse.url) + : new URL(manifest.metaData.publicPath, manifestResponse.url); await fetchReady( - new URL( - `${remoteEntry.path}${remoteEntry.name}`, - manifest.metaData.publicPath, - ), + new URL(`${remoteEntry.path}${remoteEntry.name}`, remoteBase), ); const lazyFiles = await readdir( @@ -107,7 +116,7 @@ try { ), ); process.stdout.write( - `Native Rspeedy dev server served host, manifest, container, and ${lazyBundles.length} lazy bundles.\n`, + `Native Rspeedy dev server served host, async startup, standalone Catalog, manifest, container, and ${lazyBundles.length} lazy bundles.\n`, ); } finally { if (child) { diff --git a/apps/lynx-module-federation-demo/test/real-web/run.mjs b/apps/lynx-module-federation-demo/test/real-web/run.mjs index ea19fef6f60..2833b97017b 100644 --- a/apps/lynx-module-federation-demo/test/real-web/run.mjs +++ b/apps/lynx-module-federation-demo/test/real-web/run.mjs @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { access, mkdir, readFile, stat } from 'node:fs/promises'; +import { access, mkdir, readFile, readdir, stat } from 'node:fs/promises'; import { createServer } from 'node:http'; import { createRequire } from 'node:module'; import path from 'node:path'; @@ -27,6 +27,10 @@ const hostBundlePath = fromAppRoot( process.env.LYNX_HOST_WEB_BUNDLE, 'dist/host-web/main.web.bundle', ); +const standaloneBundlePath = fromAppRoot( + process.env.LYNX_CATALOG_WEB_BUNDLE, + 'dist/catalog-web/main.web.bundle', +); const remoteManifestPath = fromAppRoot( process.env.LYNX_REMOTE_MANIFEST, 'dist/remote-web/mf-manifest.json', @@ -37,6 +41,8 @@ const remoteBundlePath = fromAppRoot( ); const hostOutputRoot = path.dirname(hostBundlePath); const remoteOutputRoot = path.dirname(remoteManifestPath); +const standaloneOutputRoot = path.dirname(standaloneBundlePath); +const hostStartupRoot = path.join(hostOutputRoot, 'static/js/async'); const screenshotPath = fromAppRoot( process.env.LYNX_WEB_E2E_SCREENSHOT, 'test/real-web/artifacts/failure.png', @@ -45,6 +51,7 @@ const readinessTimeout = Number(process.env.LYNX_WEB_E2E_TIMEOUT ?? 60_000); const requiredArtifacts = [ ['Rspeedy host web bundle', hostBundlePath], + ['standalone Catalog web bundle', standaloneBundlePath], ['federation manifest', remoteManifestPath], ['federated Lynx web bundle', remoteBundlePath], ]; @@ -75,7 +82,9 @@ const inside = (root, pathname) => { }; const routes = [ + ['/static/', path.join(hostOutputRoot, 'static')], ['/dist/host-web/', hostOutputRoot], + ['/dist/catalog-web/', standaloneOutputRoot], ['/dist/remote-web/', remoteOutputRoot], ['/remote-web/', remoteOutputRoot], ['/node_modules/@lynx-js/web-core/', webCoreRoot], @@ -106,13 +115,7 @@ const server = createServer(async (request, response) => { return; } - let body = await readFile(file); - if (path.resolve(file) === path.resolve(remoteManifestPath)) { - const manifest = JSON.parse(body.toString('utf8')); - manifest.metaData ??= {}; - manifest.metaData.publicPath = `${baseUrl}/dist/remote-web/`; - body = Buffer.from(JSON.stringify(manifest)); - } + const body = await readFile(file); response.writeHead(200, { 'access-control-allow-origin': '*', @@ -147,7 +150,7 @@ const playwrightEntry = requireFromRepo.resolve('@playwright/test'); const playwrightModule = await import(pathToFileURL(playwrightEntry)); const { chromium } = playwrightModule.default ?? playwrightModule; let browser; -let page; +let failurePage; const closeServer = () => new Promise((resolve, reject) => { @@ -201,6 +204,16 @@ const tap = async (locator) => { const pageErrors = []; const consoleErrors = []; +const observePage = (candidate, label) => { + candidate.on('pageerror', (error) => + pageErrors.push(`${label}: ${error.stack ?? error.message}`), + ); + candidate.on('console', (message) => { + if (message.type() === 'error') { + consoleErrors.push(`${label}: ${message.text()}`); + } + }); +}; try { browser = await chromium.launch({ @@ -213,20 +226,16 @@ try { isMobile: true, viewport: { width: 430, height: 932 }, }); - page = await context.newPage(); - page.on('pageerror', (error) => - pageErrors.push(error.stack ?? error.message), - ); - page.on('console', (message) => { - if (message.type() === 'error') consoleErrors.push(message.text()); - }); + const hostPage = await context.newPage(); + failurePage = hostPage; + observePage(hostPage, 'Orbit'); - await page.goto(`${baseUrl}/`, { + await hostPage.goto(`${baseUrl}/`, { timeout: 60_000, waitUntil: 'domcontentloaded', }); - const activePage = page.locator( + const activePage = hostPage.locator( '#orbit-lynx-view [part="page"]:not([l-disposed])', ); await poll( @@ -359,10 +368,99 @@ try { 3, `split mode must fetch one lazy bundle per expose: ${JSON.stringify(lazyBundleRequests)}`, ); + const hostStartupFiles = (await readdir(hostStartupRoot)).filter((file) => + file.endsWith('.js'), + ); + assert.ok( + hostStartupFiles.length > 0, + 'non-eager sharing did not emit async host startup chunks', + ); + for (const file of hostStartupFiles) { + assert.ok( + requests.includes(`/static/js/async/${file}`), + `async host startup chunk was not requested: ${file}`, + ); + } + + const hostLynxErrors = await hostPage.evaluate( + () => globalThis.__LYNX_WEB_E2E__?.errors ?? [], + ); + await hostPage.close(); + const standaloneRequestStart = requests.length; + const catalogBrowserPage = await context.newPage(); + failurePage = catalogBrowserPage; + observePage(catalogBrowserPage, 'Catalog'); + await catalogBrowserPage.goto( + `${baseUrl}/?bundle=${encodeURIComponent('/dist/catalog-web/main.web.bundle')}`, + { timeout: 60_000, waitUntil: 'domcontentloaded' }, + ); + + const catalogPage = catalogBrowserPage.locator( + '#orbit-lynx-view [part="page"]:not([l-disposed])', + ); + await poll( + () => catalogPage.count(), + (count) => count === 1, + 'single active standalone Catalog page', + ); + const catalog = catalogPage.getByTestId('catalog-standalone-app'); + await catalog.waitFor({ state: 'visible', timeout: readinessTimeout }); + await catalogPage + .getByTestId('catalog-standalone-ready') + .waitFor({ state: 'visible', timeout: readinessTimeout }); + for (const testId of [ + 'remote-card', + 'remote-details', + 'remote-activity-feed', + ]) { + await catalogPage + .getByTestId(testId) + .waitFor({ state: 'visible', timeout: readinessTimeout }); + } + + const catalogCounts = [ + catalogPage.getByTestId('catalog-local-count'), + catalogPage.getByTestId('shared-card-count'), + catalogPage.getByTestId('shared-details-count'), + catalogPage.getByTestId('shared-activity-count'), + ]; + const catalogBaseline = await poll( + () => readCounts(catalogCounts), + allEqual, + 'standalone Catalog shared counts', + ); + await tap(catalogPage.getByTestId('increment-shared')); + await poll( + () => readCounts(catalogCounts), + (values) => allEqual(values) && values[0] > catalogBaseline[0], + 'standalone Catalog shared increment', + ); + await poll( + () => text(catalogPage.getByTestId('shared-last-source')), + (value) => value?.trim() === 'catalog/Card', + 'standalone Catalog mutation source', + ); + + const standaloneRequests = requests.slice(standaloneRequestStart); + assert.ok( + standaloneRequests.includes('/dist/catalog-web/main.web.bundle'), + `standalone Catalog entry was not requested: ${JSON.stringify(standaloneRequests)}`, + ); + assert.ok( + !standaloneRequests.some( + (value) => + value.includes('mf-manifest.json') || + value.includes('/dist/remote-web/async/') || + value.includes('/remote-web/async/') || + value.endsWith(`/${path.basename(remoteBundlePath)}`), + ), + `standalone direct imports unexpectedly used federation transport: ${JSON.stringify(standaloneRequests)}`, + ); - const lynxErrors = await page.evaluate( + const catalogLynxErrors = await catalogBrowserPage.evaluate( () => globalThis.__LYNX_WEB_E2E__?.errors ?? [], ); + const lynxErrors = [...hostLynxErrors, ...catalogLynxErrors]; assert.deepEqual( lynxErrors, [], @@ -376,12 +474,12 @@ try { ); process.stdout.write( - `Real Lynx Web E2E passed at ${baseUrl} (${requests.length} requests)\n`, + `Real Lynx Web E2E passed for Orbit and standalone Catalog at ${baseUrl} (${requests.length} requests)\n`, ); } catch (error) { - if (page) { + if (failurePage) { await mkdir(path.dirname(screenshotPath), { recursive: true }); - await page.screenshot({ path: screenshotPath, fullPage: true }); + await failurePage.screenshot({ path: screenshotPath, fullPage: true }); } throw new Error( [ diff --git a/apps/lynx-module-federation-demo/test/real-web/shell.js b/apps/lynx-module-federation-demo/test/real-web/shell.js index 3824ea52863..1dcefcf17f4 100644 --- a/apps/lynx-module-federation-demo/test/real-web/shell.js +++ b/apps/lynx-module-federation-demo/test/real-web/shell.js @@ -23,4 +23,7 @@ lynxView.addEventListener('timing', (event) => { }); document.body.append(lynxView); -lynxView.setAttribute('url', '/dist/host-web/main.web.bundle'); +const bundleUrl = + new URL(location.href).searchParams.get('bundle') ?? + '/dist/host-web/main.web.bundle'; +lynxView.setAttribute('url', bundleUrl); diff --git a/packages/lynx/README.md b/packages/lynx/README.md index 2e9c4753be8..5441fc5c6c3 100644 --- a/packages/lynx/README.md +++ b/packages/lynx/README.md @@ -133,6 +133,16 @@ Split native bundles encode both programs into one DynamicComponent artifact; Web remotes use the equivalent paired external bundle. Web remotes reject `single`, and native `single` is limited to background-only non-UI modules. +`publicPath: 'auto'` is supported and recommended for colocated split assets. +Module Federation still resolves the public remote entry through manifest +inference or `getPublicPath`. Browser and browser-like transports infer a +root-relative manifest's origin from the fetched `Response.url`; Node hosts +should provide an absolute manifest URL (or a custom fetch response with an +absolute URL). The Lynx runtime plugin then resolves lazy bundles relative to +that actual entry URL, because native and Lynx for Web evaluation do not provide +the DOM `currentScript` signal used by Webpack's browser auto-public-path +runtime. Explicit public paths remain unchanged. + Ordinary Rspeedy entry bundles are preserved by default. A dedicated remote environment may set `preserveSourceEntryBundles: false` to publish only its manifest, federation container, and split exposure bundles. diff --git a/packages/lynx/src/chunkLoadingMatcher.test.ts b/packages/lynx/src/chunkLoadingMatcher.test.ts index 10cdae50f34..1318e117f5c 100644 --- a/packages/lynx/src/chunkLoadingMatcher.test.ts +++ b/packages/lynx/src/chunkLoadingMatcher.test.ts @@ -63,6 +63,7 @@ describe('Lynx chunk-loading matcher', () => { const addRuntimeModule = rs.fn(); const discardedTemplateAssets = new Set(['stale-template.bundle']); const lazyBundleAssets = new Set(['stale-lazy.bundle']); + const lazyBundleAssetByExpose = new Map([['./stale', 'stale-lazy.bundle']]); class RuntimeModule { static STAGE_TRIGGER = 20; @@ -142,11 +143,17 @@ describe('Lynx chunk-loading matcher', () => { }, }, { + autoPublicPath: true, backgroundOnlyRemote: true, chunking: 'split', discardSourceEntryBundles: true, discardedTemplateAssets, + exposeByExpectedLazyBundleChunk: new Map([ + ['catalog__background_Card', './Card'], + ['catalog__background_Details', './Details'], + ]), includedChunkPrefixes: ['catalog__background_'], + lazyBundleAssetByExpose, lazyBundleAssets, remoteEntryName: 'remote', pairedRealmChunkPrefixes: { @@ -162,6 +169,7 @@ describe('Lynx chunk-loading matcher', () => { onCompilation!(compilation); expect(discardedTemplateAssets.size).toBe(0); expect(lazyBundleAssets.size).toBe(0); + expect(lazyBundleAssetByExpose.size).toBe(0); addMatcher!(entryChunk); const cardArgs = { @@ -185,7 +193,10 @@ describe('Lynx chunk-loading matcher', () => { finalEncodeOptions: { sourceContent: { appType: 'DynamicComponent' }, }, - entryNames: ['remote-react__background'], + entryNames: [ + 'catalog__background_Card-react__background', + 'catalog__main-thread__Card-react__main-thread', + ], outputName: 'async/catalog__background_Card.hash.bundle', }; expect(beforeEmit!(lazyArgs)).toBe(lazyArgs); @@ -207,6 +218,9 @@ describe('Lynx chunk-loading matcher', () => { 'async/nested-feature.bundle', ]), ); + expect(lazyBundleAssetByExpose).toEqual( + new Map([['./Card', 'async/catalog__background_Card.hash.bundle']]), + ); expect(discardedTemplateAssets).toEqual(new Set(['bootstrap.lynx.bundle'])); expect(addRuntimeModule).toHaveBeenCalledTimes(2); @@ -218,6 +232,9 @@ describe('Lynx chunk-loading matcher', () => { expect(source).toContain('"802":1'); expect(source).toContain('__webpack_require__.lynx_chunking = "split"'); + expect(source).toContain( + '__webpack_require__.lynx_public_path_auto = true', + ); expect(source).toContain('"456":1'); expect(source).not.toContain('"123":1'); expect(source).not.toContain('"host":1'); diff --git a/packages/lynx/src/chunkLoadingMatcher.ts b/packages/lynx/src/chunkLoadingMatcher.ts index 0f584e8c84b..ef7d4b03d20 100644 --- a/packages/lynx/src/chunkLoadingMatcher.ts +++ b/packages/lynx/src/chunkLoadingMatcher.ts @@ -36,11 +36,14 @@ export interface LynxTemplatePluginApi { } interface ChunkLoadingMatcherOptions { + autoPublicPath?: boolean; backgroundOnlyRemote?: boolean; chunking?: 'single' | 'split'; discardSourceEntryBundles?: boolean; discardedTemplateAssets?: Set; + exposeByExpectedLazyBundleChunk?: ReadonlyMap; includedChunkPrefixes?: string[]; + lazyBundleAssetByExpose?: Map; lazyBundleAssets?: Set; remoteEntryName?: string; pairedRealmChunkPrefixes?: { @@ -120,6 +123,32 @@ const getRemoteChunkNames = ( ); }; +const stripPairedRealmChunkSuffix = ( + chunkName: string, + suffixes: ChunkLoadingMatcherOptions['pairedRealmChunkSuffixes'], +): string => + suffixes + ? [suffixes.background, suffixes.mainThread].reduce( + (name, suffix) => + name.endsWith(suffix) ? name.slice(0, -suffix.length) : name, + chunkName, + ) + : chunkName; + +const normalizeLazyBundleChunkName = ( + chunkName: string, + options: ChunkLoadingMatcherOptions, +): string => { + const normalizedChunkName = stripPairedRealmChunkSuffix( + chunkName, + options.pairedRealmChunkSuffixes, + ); + const prefixes = options.pairedRealmChunkPrefixes; + return prefixes && normalizedChunkName.startsWith(prefixes.mainThread) + ? `${prefixes.background}${normalizedChunkName.slice(prefixes.mainThread.length)}` + : normalizedChunkName; +}; + export const createLynxChunkLoadingMatcherPlugin = ( lynxTemplatePlugin?: LynxTemplatePluginApi, options: ChunkLoadingMatcherOptions = {}, @@ -130,19 +159,17 @@ export const createLynxChunkLoadingMatcherPlugin = ( compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { options.lazyBundleAssets?.clear(); + options.lazyBundleAssetByExpose?.clear(); options.discardedTemplateAssets?.clear(); let remoteChunkNames: Set | undefined; const templateHooks = lynxTemplatePlugin?.getLynxTemplatePluginHooks(compilation); templateHooks?.asyncChunkName.tap(pluginName, (chunkName) => { const layerSuffixes = options.pairedRealmChunkSuffixes; - const normalizedChunkName = layerSuffixes - ? [layerSuffixes.background, layerSuffixes.mainThread].reduce( - (name, suffix) => - name.endsWith(suffix) ? name.slice(0, -suffix.length) : name, - chunkName, - ) - : chunkName; + const normalizedChunkName = stripPairedRealmChunkSuffix( + chunkName, + layerSuffixes, + ); const hasAssetlessChunk = Array.from(compilation.chunks).some( (chunk) => { if ( @@ -165,10 +192,7 @@ export const createLynxChunkLoadingMatcherPlugin = ( if (hasAssetlessChunk) { return ''; } - const prefixes = options.pairedRealmChunkPrefixes; - return prefixes && normalizedChunkName.startsWith(prefixes.mainThread) - ? `${prefixes.background}${normalizedChunkName.slice(prefixes.mainThread.length)}` - : normalizedChunkName; + return normalizeLazyBundleChunkName(chunkName, options); }); if (options.backgroundOnlyRemote) { templateHooks?.beforeEncode?.tap(pluginName, (args) => { @@ -184,18 +208,32 @@ export const createLynxChunkLoadingMatcherPlugin = ( chunkNames = getRemoteChunkNames(compilation, options); remoteChunkNames = chunkNames; } - const outputBaseName = args.outputName.split('/').pop() ?? ''; const isDynamicComponent = args.finalEncodeOptions.sourceContent.appType === 'DynamicComponent'; const isRemoteOutput = args.entryNames.some((name) => chunkNames.has(name), ); - const hasRemotePrefix = options.includedChunkPrefixes?.some((prefix) => - outputBaseName.startsWith(prefix), + const exposedKeys = new Set( + args.entryNames.flatMap((name) => { + const exposedKey = options.exposeByExpectedLazyBundleChunk?.get( + normalizeLazyBundleChunkName(name, options), + ); + return exposedKey === undefined ? [] : [exposedKey]; + }), ); - if (isDynamicComponent && (isRemoteOutput || hasRemotePrefix)) { + if (isDynamicComponent && (isRemoteOutput || exposedKeys.size > 0)) { options.lazyBundleAssets?.add(args.outputName); + for (const exposedKey of exposedKeys) { + const previousAsset = + options.lazyBundleAssetByExpose?.get(exposedKey); + if (previousAsset && previousAsset !== args.outputName) { + throw new Error( + `@module-federation/lynx expose "${exposedKey}" emitted multiple DynamicComponent lazy bundles: "${previousAsset}" and "${args.outputName}".`, + ); + } + options.lazyBundleAssetByExpose?.set(exposedKey, args.outputName); + } if (options.chunking === 'split') { options.discardedTemplateAssets?.delete(args.outputName); } else { @@ -213,6 +251,9 @@ export const createLynxChunkLoadingMatcherPlugin = ( } override generate(): string { + const autoPublicPath = options.autoPublicPath + ? '__webpack_require__.lynx_public_path_auto = true;' + : ''; const chunking = options.chunking ? `__webpack_require__.lynx_chunking = ${JSON.stringify(options.chunking)};` : ''; @@ -221,13 +262,14 @@ export const createLynxChunkLoadingMatcherPlugin = ( this.chunkGraph!, ); if (chunkIds.length === 0) { - return chunking; + return Template.asString([autoPublicPath, chunking]); } const matcher = Object.fromEntries( chunkIds.map((id) => [String(id), 1]), ); return Template.asString([ + autoPublicPath, chunking, 'var lynxChunkLoader = __webpack_require__.f.require;', 'if (lynxChunkLoader) {', diff --git a/packages/lynx/src/externalBundle.test.ts b/packages/lynx/src/externalBundle.test.ts index 67bdbacf093..f2ba1f530bf 100644 --- a/packages/lynx/src/externalBundle.test.ts +++ b/packages/lynx/src/externalBundle.test.ts @@ -18,6 +18,10 @@ const setupPlugin = ( 'async/Card.hash.bundle', 'async/Nested.hash.bundle', ]), + lazyBundleAssetByExpose = new Map([ + ['./Card', 'async/Card.hash.bundle'], + ['./Nested', 'async/Nested.hash.bundle'], + ]), ) => { const encode = rs.fn(async () => ({ buffer: Buffer.from('external') })); const discardedTemplateAssets = new Set(['bootstrap.bundle']); @@ -32,7 +36,13 @@ const setupPlugin = ( encode, entryAssets: ['catalog.js'], entryName: 'catalog', + entrySectionNames: new Map([['catalog.js', 'catalog_global']]), + exposeByExpectedLazyBundleChunk: new Map([ + ['catalog__background_Card', './Card'], + ['catalog__background_Nested', './Nested'], + ]), includedChunkPrefixes: ['catalog__background_', 'catalog__main-thread__'], + lazyBundleAssetByExpose, lazyBundleAssets, pairedBundleChunks: ['catalog__main-thread.js'], preservedAssets: ['mf-manifest.json', 'mf-stats.json'], @@ -108,6 +118,7 @@ const createCompilation = (sourceAssets: TestAsset[]) => { ]), chunks: [remoteChunk, nestedChunk], getAssets: () => assets, + getAsset: (name: string) => assets.find((asset) => asset.name === name), deleteAsset, emitAsset, hooks: { @@ -162,7 +173,7 @@ describe('Lynx external bundle', () => { const encodeOptions = encode.mock.calls[0][0] as any; expect(encodeOptions.compilerOptions.targetSdkVersion).toBe('3.7'); expect(Object.keys(encodeOptions.customSections).sort()).toEqual([ - 'catalog', + 'catalog_global', 'runtime', ]); expect(harness.names()).toEqual([ @@ -176,14 +187,31 @@ describe('Lynx external bundle', () => { ]); }); - it('rejects split builds without ReactLynx lazy bundles', async () => { - const { onCompilation, onEmit } = setupPlugin('split', new Set()); + it('rejects split builds when any expose lacks a ReactLynx lazy bundle', async () => { + const { onCompilation, onEmit } = setupPlugin( + 'split', + new Set(['async/Card.hash.bundle']), + new Map([['./Card', 'async/Card.hash.bundle']]), + ); + const harness = createCompilation(sourceAssets); + onCompilation()(harness.compilation); + harness.snapshot(); + harness.replaceAssets([createAsset('async/Card.hash.bundle')]); + + await expect(onEmit()(harness.compilation)).rejects.toThrow( + 'missing bundles for "./Nested"', + ); + }); + + it('rejects tracked lazy bundles that are missing from the compilation', async () => { + const { onCompilation, onEmit } = setupPlugin('split'); const harness = createCompilation(sourceAssets); onCompilation()(harness.compilation); harness.snapshot(); + harness.replaceAssets([createAsset('async/Card.hash.bundle')]); await expect(onEmit()(harness.compilation)).rejects.toThrow( - 'no matching lazy bundle assets were produced', + 'missing bundles for "./Nested"', ); }); @@ -209,7 +237,7 @@ describe('Lynx external bundle', () => { 'async/catalog__background_Card:CSS', 'async/nested-feature', 'async/nested-feature:CSS', - 'catalog', + 'catalog_global', 'runtime', ]); expect( diff --git a/packages/lynx/src/externalBundle.ts b/packages/lynx/src/externalBundle.ts index 365f01717a4..96d8b4eaa43 100644 --- a/packages/lynx/src/externalBundle.ts +++ b/packages/lynx/src/externalBundle.ts @@ -8,7 +8,10 @@ interface ExternalBundleOptions { engineVersion?: string; entryAssets: string[]; entryName: string; + entrySectionNames: ReadonlyMap; + exposeByExpectedLazyBundleChunk: ReadonlyMap; includedChunkPrefixes: string[]; + lazyBundleAssetByExpose: Map; lazyBundleAssets: Set; pairedBundleChunks: string[]; preservedAssets: string[]; @@ -94,13 +97,21 @@ export const createLynxExternalBundlePlugin = ( stage: 10_000, }, async (compilation) => { - if ( - options.chunking === 'split' && - options.lazyBundleAssets.size === 0 - ) { - throw new Error( - '@module-federation/lynx split remote bundles require each expose to emit a DynamicComponent lazy bundle; no matching lazy bundle assets were produced.', + if (options.chunking === 'split') { + const expectedExposes = new Set( + options.exposeByExpectedLazyBundleChunk.values(), ); + const missingExposes = Array.from(expectedExposes).filter( + (expose) => { + const asset = options.lazyBundleAssetByExpose.get(expose); + return !asset || !compilation.getAsset(asset); + }, + ); + if (missingExposes.length > 0) { + throw new Error( + `@module-federation/lynx split remote bundles require every expose to emit a DynamicComponent lazy bundle; missing bundles for ${missingExposes.map((expose) => `"${expose}"`).join(', ')}.`, + ); + } } const { cssChunksToMap } = await import('@lynx-js/css-serializer'); const entryAssets = new Set(options.entryAssets); @@ -116,7 +127,10 @@ export const createLynxExternalBundlePlugin = ( const customSections = encodedAssets.reduce>( (sections, asset) => { if (asset.name.endsWith('.js')) { - sections[asset.name.replace(/\.js$/, '')] = { + const sectionName = + options.entrySectionNames.get(asset.name) ?? + asset.name.replace(/\.js$/, ''); + sections[sectionName] = { ...(options.pairedBundleChunks.includes(asset.name) ? { encoding: 'JsBytecode' } : {}), diff --git a/packages/lynx/src/plugin.host.test.ts b/packages/lynx/src/plugin.host.test.ts new file mode 100644 index 00000000000..9014ee33f4a --- /dev/null +++ b/packages/lynx/src/plugin.host.test.ts @@ -0,0 +1,418 @@ +import { describe, expect, it, rs } from '@rstest/core'; + +import { LYNX_RUNTIME_PLUGIN } from './plugin'; +import type { LynxModuleFederationAdapterOptions } from './plugin'; +import { federationOptions, LAYERS, setupPlugin } from './plugin.testUtils'; + +describe('pluginLynxModuleFederation host adapter', () => { + it('installs the Rspack plugin with Lynx output and layer defaults', async () => { + const { modifyEnvironmentConfig, modifyRspackConfig } = setupPlugin({ + name: 'lynx_host', + exposes: { './App': './src/App' }, + runtimePlugins: ['custom-runtime-plugin'], + }); + const config = await modifyRspackConfig({ plugins: [] }); + const federationPlugin = config.plugins[0]; + + expect(config.output).toEqual({ + chunkLoading: 'lynx', + chunkFormat: 'commonjs', + iife: false, + uniqueName: 'lynx_host', + }); + expect(config.experiments.layers).toBe(true); + expect(federationOptions(federationPlugin)).toMatchObject({ + name: 'lynx_host', + filename: 'remoteEntry.js', + library: { type: 'commonjs-module' }, + remoteType: 'script', + runtimePlugins: [ + ['custom-runtime-plugin', {}], + [ + LYNX_RUNTIME_PLUGIN, + { + realmLayers: { + background: LAYERS.BACKGROUND, + 'main-thread': LAYERS.MAIN_THREAD, + }, + }, + ], + ], + exposes: { + './App': { import: './src/App', layer: LAYERS.BACKGROUND }, + }, + }); + expect(modifyEnvironmentConfig).toHaveBeenCalledTimes(1); + }); + + it('merges resolved options into an explicitly registered runtime plugin', async () => { + const customLayers = { + BACKGROUND: 'worker:realm', + MAIN_THREAD: 'ui:realm', + }; + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + runtimePlugins: [[LYNX_RUNTIME_PLUGIN, { timeout: 500 }]], + }, + { runtimePluginOptions: { timeout: 2_000 } }, + customLayers, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0]).runtimePlugins).toEqual([ + [ + LYNX_RUNTIME_PLUGIN, + { + timeout: 2_000, + realmLayers: { + background: customLayers.BACKGROUND, + 'main-thread': customLayers.MAIN_THREAD, + }, + }, + ], + ]); + }); + + it('keeps unqualified host shares in the default background share scope', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + remotes: { catalog: 'catalog@catalog.lynx.bundle' }, + shared: [{ react: '^19.0.0' }, { react: { singleton: true } }], + runtimePlugins: ['custom-runtime-plugin'], + }, + { + runtimePluginOptions: { timeout: 2_000 }, + }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(config.plugins).toHaveLength(2); + expect(federationOptions(config.plugins[0])).toMatchObject({ + name: 'lynx_host', + shareScope: [`default:${LAYERS.BACKGROUND}`], + runtimePlugins: [ + ['custom-runtime-plugin', {}], + [LYNX_RUNTIME_PLUGIN, { timeout: 2_000 }], + ], + shared: [ + { + react: { + import: 'react', + requiredVersion: '^19.0.0', + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + { + react: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ], + }); + }); + + it('inherits a custom top-level share scope for host shares', async () => { + const { modifyRspackConfig } = setupPlugin({ + name: 'lynx_host', + shareScope: 'application', + shared: { state: { singleton: true } }, + }); + const config = await modifyRspackConfig({ plugins: [] }); + const options = federationOptions(config.plugins[0]); + + expect(options.shareScope).toEqual([`application:${LAYERS.BACKGROUND}`]); + expect(options.shared).toEqual([ + { + state: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`application:${LAYERS.BACKGROUND}`], + }, + }, + ]); + }); + + it('inherits multiple top-level share scopes for each enabled realm', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shareScope: ['application', 'vendor'], + shared: { state: { singleton: true } }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + const options = federationOptions(config.plugins[0]); + + expect(options.shareScope).toEqual([ + `application:${LAYERS.BACKGROUND}`, + `application:${LAYERS.MAIN_THREAD}`, + `vendor:${LAYERS.BACKGROUND}`, + `vendor:${LAYERS.MAIN_THREAD}`, + ]); + expect(options.shared).toEqual([ + { + state: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [ + `application:${LAYERS.BACKGROUND}`, + `vendor:${LAYERS.BACKGROUND}`, + ], + }, + }, + ]); + }); + + it('qualifies advanced remote share scopes for each enabled realm', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + remotes: { + catalog: { + external: 'catalog@catalog.lynx.bundle', + shareScope: 'application', + }, + analytics: { + external: ['analytics@analytics.lynx.bundle'], + shareScope: ['vendor', 'application'], + }, + }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0]).remotes).toEqual({ + catalog: { + external: 'catalog@catalog.lynx.bundle', + shareScope: [ + `application:${LAYERS.BACKGROUND}`, + `application:${LAYERS.MAIN_THREAD}`, + ], + }, + analytics: { + external: ['analytics@analytics.lynx.bundle'], + shareScope: [ + `vendor:${LAYERS.BACKGROUND}`, + `vendor:${LAYERS.MAIN_THREAD}`, + `application:${LAYERS.BACKGROUND}`, + `application:${LAYERS.MAIN_THREAD}`, + ], + }, + }); + }); + + it('lets a shared item override the top-level share scope', async () => { + const { modifyRspackConfig } = setupPlugin({ + name: 'lynx_host', + shareScope: 'application', + shared: { + state: { shareScope: 'isolated', singleton: true }, + }, + }); + const config = await modifyRspackConfig({ plugins: [] }); + const options = federationOptions(config.plugins[0]); + + expect(options.shareScope).toEqual([`application:${LAYERS.BACKGROUND}`]); + expect(options.shared).toEqual([ + { + state: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`isolated:${LAYERS.BACKGROUND}`], + }, + }, + ]); + }); + + it('adds the main-thread share scope only when that realm is enabled', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { react: { singleton: true } }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0])).toMatchObject({ + shareScope: [ + `default:${LAYERS.BACKGROUND}`, + `default:${LAYERS.MAIN_THREAD}`, + ], + shared: [ + { + react: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ], + }); + }); + + it('keeps custom compiler layers separate from runtime share scopes', async () => { + const customLayer = 'custom-layer'; + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { state: { singleton: true } }, + }, + { layer: customLayer }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0])).toMatchObject({ + shareScope: [`default:${LAYERS.BACKGROUND}`], + shared: [ + { + state: { + singleton: true, + layer: customLayer, + issuerLayer: customLayer, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ], + }); + }); + + it('rejects shared modules assigned to a disabled host realm', async () => { + const { modifyRspackConfig } = setupPlugin({ + name: 'lynx_host', + shared: { + state: { realm: 'main-thread', singleton: true }, + }, + }); + + await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( + `shared module "state" uses inactive realm layer "${LAYERS.MAIN_THREAD}"`, + ); + }); + + it('maps semantic shared realms to exposed Lynx layers', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { + 'main-thread-state': { + realm: 'main-thread', + singleton: true, + }, + }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0]).shared).toEqual([ + { + 'main-thread-state': { + singleton: true, + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + shareScope: [`default:${LAYERS.MAIN_THREAD}`], + }, + }, + ]); + }); + + it('does not duplicate an explicitly issuer-layered shared entry', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { + react: { + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + }, + }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0]).shared).toEqual([ + { + react: { + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + shareScope: [`default:${LAYERS.MAIN_THREAD}`], + }, + }, + ]); + }); + + it('does not duplicate an explicit entry beside a default shared entry', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'lynx_host', + shared: { + react: { + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + }, + lodash: { singleton: true }, + }, + }, + { mainThread: true }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + + expect(federationOptions(config.plugins[0]).shared).toEqual([ + { + react: { + layer: LAYERS.MAIN_THREAD, + issuerLayer: LAYERS.MAIN_THREAD, + shareScope: [`default:${LAYERS.MAIN_THREAD}`], + }, + lodash: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`default:${LAYERS.BACKGROUND}`], + }, + }, + ]); + }); + it('only applies to configured environments', async () => { + const { applyEnvironmentConfig, modifyRspackConfig } = setupPlugin( + { name: 'lynx_host' }, + { environment: 'lynx' }, + ); + const config = { plugins: [] }; + const environmentConfig = { source: { include: [] } }; + + expect(await modifyRspackConfig(config, 'web')).toBe(config); + expect(config.plugins).toHaveLength(0); + expect(applyEnvironmentConfig(environmentConfig, 'web')).toBe( + environmentConfig, + ); + expect(environmentConfig.source.include).toEqual([]); + }); + + it('fails clearly when the Lynx DSL exposes invalid layers', async () => { + const { modifyRspackConfig } = setupPlugin( + { name: 'lynx_host' }, + undefined, + { BACKGROUND: 'background' }, + ); + + await expect(modifyRspackConfig({})).rejects.toThrow( + 'distinct string `BACKGROUND` and `MAIN_THREAD` values', + ); + }); +}); diff --git a/packages/lynx/src/plugin.normalization.test.ts b/packages/lynx/src/plugin.normalization.test.ts new file mode 100644 index 00000000000..aa73e7be2a6 --- /dev/null +++ b/packages/lynx/src/plugin.normalization.test.ts @@ -0,0 +1,82 @@ +import { describe, expect, it } from '@rstest/core'; +import { normalizeLynxExposes, normalizeLynxShared } from './plugin'; +import { LAYERS } from './plugin.testUtils'; + +describe('Lynx federation option normalization', () => { + it('defaults exposes and shared modules to the background layer', () => { + expect( + normalizeLynxExposes( + { + './Button': './src/Button', + './Card': { + import: './src/Card', + layer: 'custom-layer', + }, + }, + LAYERS.BACKGROUND, + ), + ).toEqual({ + './Button': { import: './src/Button', layer: LAYERS.BACKGROUND }, + './Card': { import: './src/Card', layer: 'custom-layer' }, + }); + + expect( + normalizeLynxShared( + { + react: '^19.0.0', + '@lynx-js/react': { + singleton: true, + layer: 'custom-layer', + }, + }, + LAYERS.BACKGROUND, + ), + ).toEqual({ + react: { + import: 'react', + requiredVersion: '^19.0.0', + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + }, + '@lynx-js/react': { + singleton: true, + layer: 'custom-layer', + issuerLayer: LAYERS.BACKGROUND, + }, + }); + }); + + it('preserves duplicate shared array entries and explicit layers', () => { + expect( + normalizeLynxShared( + [ + { react: '^19.0.0' }, + { + react: { + singleton: true, + layer: 'provided-layer', + issuerLayer: 'consumer-layer', + }, + }, + ], + LAYERS.BACKGROUND, + ), + ).toEqual([ + { + react: { + import: 'react', + requiredVersion: '^19.0.0', + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + }, + }, + { + react: { + singleton: true, + layer: 'provided-layer', + issuerLayer: 'consumer-layer', + }, + }, + ]); + }); +}); diff --git a/packages/lynx/src/plugin.test.ts b/packages/lynx/src/plugin.remoteBundle.test.ts similarity index 63% rename from packages/lynx/src/plugin.test.ts rename to packages/lynx/src/plugin.remoteBundle.test.ts index 0b1bb0f992b..119e67b66a5 100644 --- a/packages/lynx/src/plugin.test.ts +++ b/packages/lynx/src/plugin.remoteBundle.test.ts @@ -1,379 +1,10 @@ -import { describe, expect, it, rs } from '@rstest/core'; import { LynxCacheEventsPlugin } from '@lynx-js/cache-events-webpack-plugin'; +import { describe, expect, it, rs } from '@rstest/core'; -import { - LYNX_RUNTIME_PLUGIN, - normalizeLynxExposes, - normalizeLynxShared, - pluginLynxModuleFederation, -} from './plugin'; -import type { - LynxModuleFederationAdapterOptions, - LynxModuleFederationOptions, -} from './plugin'; - -const LAYERS = { - BACKGROUND: 'background', - MAIN_THREAD: 'main-thread', -}; - -type ModifyRspackConfig = (config: any, context: any) => any; -type ModifyEnvironmentConfig = (config: any, context: any) => any; -type ModifyBundlerChain = (chain: any, context: any) => any; -type ReactResolver = { - resolve(request: string): Promise; -}; - -const setupPlugin = ( - options: LynxModuleFederationOptions, - adapterOptions?: LynxModuleFederationAdapterOptions, - layers: unknown = LAYERS, - reactResolver?: ReactResolver, -) => { - let modifyRspackConfig: ModifyRspackConfig | undefined; - let modifyEnvironmentConfigCallback: ModifyEnvironmentConfig | undefined; - let modifyBundlerChainCallback: ModifyBundlerChain | undefined; - const modifyEnvironmentConfig = rs.fn((callback: ModifyEnvironmentConfig) => { - modifyEnvironmentConfigCallback = callback; - }); - const plugin = pluginLynxModuleFederation(options, adapterOptions); - - plugin.setup!({ - modifyEnvironmentConfig, - modifyBundlerChain(callback: ModifyBundlerChain) { - modifyBundlerChainCallback = callback; - }, - modifyRspackConfig(callback: ModifyRspackConfig) { - modifyRspackConfig = callback; - }, - useExposed(symbol: symbol) { - if (symbol === Symbol.for('LAYERS')) { - return layers; - } - if (symbol === Symbol.for('@lynx-js/react/internal:resolve')) { - return reactResolver; - } - return undefined; - }, - } as any); - - return { - modifyEnvironmentConfig, - applyEnvironmentConfig: (config: any, environment = 'lynx') => - modifyEnvironmentConfigCallback!(config, { name: environment }), - modifyBundlerChain: (environment = 'lynx') => - modifyBundlerChainCallback!({}, { environment: { name: environment } }), - modifyRspackConfig: (config: any, environment = 'lynx') => - modifyRspackConfig!(config, { environment: { name: environment } }), - }; -}; - -const federationOptions = (plugin: unknown) => (plugin as any)._options; - -describe('pluginLynxModuleFederation', () => { - it('defaults exposes and shared modules to the background layer', () => { - expect( - normalizeLynxExposes( - { - './Button': './src/Button', - './Card': { - import: './src/Card', - layer: 'custom-layer', - }, - }, - LAYERS.BACKGROUND, - ), - ).toEqual({ - './Button': { import: './src/Button', layer: LAYERS.BACKGROUND }, - './Card': { import: './src/Card', layer: 'custom-layer' }, - }); - - expect( - normalizeLynxShared( - { - react: '^19.0.0', - '@lynx-js/react': { - singleton: true, - layer: 'custom-layer', - }, - }, - LAYERS.BACKGROUND, - ), - ).toEqual({ - react: { - import: 'react', - requiredVersion: '^19.0.0', - layer: LAYERS.BACKGROUND, - issuerLayer: LAYERS.BACKGROUND, - }, - '@lynx-js/react': { - singleton: true, - layer: 'custom-layer', - issuerLayer: LAYERS.BACKGROUND, - }, - }); - }); - - it('preserves duplicate shared array entries and explicit layers', () => { - expect( - normalizeLynxShared( - [ - { react: '^19.0.0' }, - { - react: { - singleton: true, - layer: 'provided-layer', - issuerLayer: 'consumer-layer', - }, - }, - ], - LAYERS.BACKGROUND, - ), - ).toEqual([ - { - react: { - import: 'react', - requiredVersion: '^19.0.0', - layer: LAYERS.BACKGROUND, - issuerLayer: LAYERS.BACKGROUND, - }, - }, - { - react: { - singleton: true, - layer: 'provided-layer', - issuerLayer: 'consumer-layer', - }, - }, - ]); - }); - - it('installs the Rspack plugin with Lynx output and layer defaults', async () => { - const { modifyEnvironmentConfig, modifyRspackConfig } = setupPlugin({ - name: 'lynx_host', - exposes: { './App': './src/App' }, - runtimePlugins: ['custom-runtime-plugin'], - }); - const config = await modifyRspackConfig({ plugins: [] }); - const federationPlugin = config.plugins[0]; - - expect(config.output).toEqual({ - chunkLoading: 'lynx', - chunkFormat: 'commonjs', - iife: false, - uniqueName: 'lynx_host', - }); - expect(config.experiments.layers).toBe(true); - expect(federationOptions(federationPlugin)).toMatchObject({ - name: 'lynx_host', - filename: 'remoteEntry.js', - library: { type: 'commonjs-module' }, - remoteType: 'script', - runtimePlugins: ['custom-runtime-plugin', LYNX_RUNTIME_PLUGIN], - exposes: { - './App': { import: './src/App', layer: LAYERS.BACKGROUND }, - }, - }); - expect(modifyEnvironmentConfig).toHaveBeenCalledTimes(1); - }); - - it('keeps unqualified host shares in the background realm', async () => { - const { modifyRspackConfig } = setupPlugin( - { - name: 'lynx_host', - remotes: { catalog: 'catalog@catalog.lynx.bundle' }, - shared: [{ react: '^19.0.0' }, { react: { singleton: true } }], - runtimePlugins: ['custom-runtime-plugin'], - }, - { - runtimePluginOptions: { timeout: 2_000 }, - }, - ); - const config = await modifyRspackConfig({ plugins: [] }); - - expect(config.plugins).toHaveLength(2); - expect(federationOptions(config.plugins[0])).toMatchObject({ - name: 'lynx_host', - shareScope: [`default:${LAYERS.BACKGROUND}`], - runtimePlugins: [ - ['custom-runtime-plugin', {}], - [LYNX_RUNTIME_PLUGIN, { timeout: 2_000 }], - ], - shared: [ - { - react: { - import: 'react', - requiredVersion: '^19.0.0', - layer: LAYERS.BACKGROUND, - issuerLayer: LAYERS.BACKGROUND, - shareScope: [`default:${LAYERS.BACKGROUND}`], - }, - }, - { - react: { - singleton: true, - layer: LAYERS.BACKGROUND, - issuerLayer: LAYERS.BACKGROUND, - shareScope: [`default:${LAYERS.BACKGROUND}`], - }, - }, - ], - }); - }); - - it('adds the main-thread share scope only when that realm is enabled', async () => { - const { modifyRspackConfig } = setupPlugin( - { - name: 'lynx_host', - shared: { react: { singleton: true } }, - }, - { mainThread: true }, - ); - const config = await modifyRspackConfig({ plugins: [] }); - - expect(federationOptions(config.plugins[0])).toMatchObject({ - shareScope: [ - `default:${LAYERS.BACKGROUND}`, - `default:${LAYERS.MAIN_THREAD}`, - ], - shared: [ - { - react: { - singleton: true, - layer: LAYERS.BACKGROUND, - issuerLayer: LAYERS.BACKGROUND, - shareScope: [`default:${LAYERS.BACKGROUND}`], - }, - }, - ], - }); - }); - - it('keeps custom compiler layers separate from runtime share scopes', async () => { - const customLayer = 'custom-layer'; - const { modifyRspackConfig } = setupPlugin( - { - name: 'lynx_host', - shared: { state: { singleton: true } }, - }, - { layer: customLayer }, - ); - const config = await modifyRspackConfig({ plugins: [] }); - - expect(federationOptions(config.plugins[0])).toMatchObject({ - shareScope: [`default:${LAYERS.BACKGROUND}`], - shared: [ - { - state: { - singleton: true, - layer: customLayer, - issuerLayer: customLayer, - shareScope: [`default:${LAYERS.BACKGROUND}`], - }, - }, - ], - }); - }); - - it('rejects shared modules assigned to a disabled host realm', async () => { - const { modifyRspackConfig } = setupPlugin({ - name: 'lynx_host', - shared: { - state: { realm: 'main-thread', singleton: true }, - }, - }); - - await expect(modifyRspackConfig({ plugins: [] })).rejects.toThrow( - `shared module "state" uses inactive realm layer "${LAYERS.MAIN_THREAD}"`, - ); - }); - - it('maps semantic shared realms to exposed Lynx layers', async () => { - const { modifyRspackConfig } = setupPlugin( - { - name: 'lynx_host', - shared: { - 'main-thread-state': { - realm: 'main-thread', - singleton: true, - }, - }, - }, - { mainThread: true }, - ); - const config = await modifyRspackConfig({ plugins: [] }); - - expect(federationOptions(config.plugins[0]).shared).toEqual([ - { - 'main-thread-state': { - singleton: true, - layer: LAYERS.MAIN_THREAD, - issuerLayer: LAYERS.MAIN_THREAD, - shareScope: [`default:${LAYERS.MAIN_THREAD}`], - }, - }, - ]); - }); - - it('does not duplicate an explicitly issuer-layered shared entry', async () => { - const { modifyRspackConfig } = setupPlugin( - { - name: 'lynx_host', - shared: { - react: { - layer: LAYERS.MAIN_THREAD, - issuerLayer: LAYERS.MAIN_THREAD, - }, - }, - }, - { mainThread: true }, - ); - const config = await modifyRspackConfig({ plugins: [] }); - - expect(federationOptions(config.plugins[0]).shared).toEqual([ - { - react: { - layer: LAYERS.MAIN_THREAD, - issuerLayer: LAYERS.MAIN_THREAD, - shareScope: [`default:${LAYERS.MAIN_THREAD}`], - }, - }, - ]); - }); - - it('does not duplicate an explicit entry beside a default shared entry', async () => { - const { modifyRspackConfig } = setupPlugin( - { - name: 'lynx_host', - shared: { - react: { - layer: LAYERS.MAIN_THREAD, - issuerLayer: LAYERS.MAIN_THREAD, - }, - lodash: { singleton: true }, - }, - }, - { mainThread: true }, - ); - const config = await modifyRspackConfig({ plugins: [] }); - - expect(federationOptions(config.plugins[0]).shared).toEqual([ - { - react: { - layer: LAYERS.MAIN_THREAD, - issuerLayer: LAYERS.MAIN_THREAD, - shareScope: [`default:${LAYERS.MAIN_THREAD}`], - }, - lodash: { - singleton: true, - layer: LAYERS.BACKGROUND, - issuerLayer: LAYERS.BACKGROUND, - shareScope: [`default:${LAYERS.BACKGROUND}`], - }, - }, - ]); - }); +import type { LynxModuleFederationAdapterOptions } from './plugin'; +import { federationOptions, LAYERS, setupPlugin } from './plugin.testUtils'; +describe('pluginLynxModuleFederation remote bundles', () => { it('requires the ReactLynx lazy export condition for split remotes', async () => { const resolve = rs.fn(async (request: string) => request === '@lynx-js/react' @@ -757,6 +388,34 @@ describe('pluginLynxModuleFederation', () => { }); }); + it('inherits a custom top-level share scope for remote bundle shares', async () => { + const { modifyRspackConfig } = setupPlugin( + { + name: 'catalog', + exposes: { './data': './src/data' }, + shareScope: 'application', + shared: { state: { singleton: true } }, + }, + { remoteBundle: { target: 'lynx', chunking: 'single' } }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + const remoteOptions = federationOptions(config.plugins[0]); + + expect(remoteOptions.shareScope).toEqual([ + `application:${LAYERS.BACKGROUND}`, + ]); + expect(remoteOptions.shared).toEqual([ + { + state: { + singleton: true, + layer: LAYERS.BACKGROUND, + issuerLayer: LAYERS.BACKGROUND, + shareScope: [`application:${LAYERS.BACKGROUND}`], + }, + }, + ]); + }); + it('keeps native single bundles background-only', async () => { const { modifyRspackConfig } = setupPlugin( { @@ -831,6 +490,42 @@ describe('pluginLynxModuleFederation', () => { expect(config.plugins).toHaveLength(5); }); + it.each([ + ['catalog', 'catalog'], + ['@scope/catalog', '@scope_catalog'], + ['teams\\catalog', 'teams_catalog'], + ['catalog?blue', 'catalog_blue'], + ['catalog#blue', 'catalog_blue'], + ['teams:catalog', 'teams_catalog'], + ['CON', '_CON'], + ])( + 'derives safe remote bundle artifacts from federation name %s', + async (name, outputName) => { + const { modifyRspackConfig } = setupPlugin( + { name, exposes: { './Card': './src/Card' } }, + { remoteBundle: { target: 'web' } }, + ); + const config = await modifyRspackConfig({ plugins: [] }); + const remoteOptions = federationOptions(config.plugins[0]); + const encoder = config.plugins.find( + (plugin: any) => plugin.options?.bundleFileName, + ) as any; + + expect(remoteOptions).toMatchObject({ + name, + filename: `${outputName}.js`, + }); + expect(encoder.options).toMatchObject({ + bundleFileName: `${outputName}.lynx.bundle`, + entryAssets: [`${outputName}.js`, `${outputName}__main-thread.js`], + includedChunkPrefixes: [ + `${outputName}__background_`, + `${outputName}__main-thread__`, + ], + }); + }, + ); + it('rejects nested remote bundle filenames', async () => { const { modifyRspackConfig } = setupPlugin( { name: 'catalog', exposes: { './Card': './src/Card' } }, @@ -989,32 +684,4 @@ describe('pluginLynxModuleFederation', () => { 'requires `library.type: "commonjs-module"`', ); }); - - it('only applies to configured environments', async () => { - const { applyEnvironmentConfig, modifyRspackConfig } = setupPlugin( - { name: 'lynx_host' }, - { environment: 'lynx' }, - ); - const config = { plugins: [] }; - const environmentConfig = { source: { include: [] } }; - - expect(await modifyRspackConfig(config, 'web')).toBe(config); - expect(config.plugins).toHaveLength(0); - expect(applyEnvironmentConfig(environmentConfig, 'web')).toBe( - environmentConfig, - ); - expect(environmentConfig.source.include).toEqual([]); - }); - - it('fails clearly when the Lynx DSL exposes invalid layers', async () => { - const { modifyRspackConfig } = setupPlugin( - { name: 'lynx_host' }, - undefined, - { BACKGROUND: 'background' }, - ); - - await expect(modifyRspackConfig({})).rejects.toThrow( - 'distinct string `BACKGROUND` and `MAIN_THREAD` values', - ); - }); }); diff --git a/packages/lynx/src/plugin.testUtils.ts b/packages/lynx/src/plugin.testUtils.ts new file mode 100644 index 00000000000..e73b9b69cbc --- /dev/null +++ b/packages/lynx/src/plugin.testUtils.ts @@ -0,0 +1,65 @@ +import { rs } from '@rstest/core'; + +import { pluginLynxModuleFederation } from './plugin'; +import type { + LynxModuleFederationAdapterOptions, + LynxModuleFederationOptions, +} from './plugin'; + +export const LAYERS = { + BACKGROUND: 'background', + MAIN_THREAD: 'main-thread', +}; + +type ModifyRspackConfig = (config: any, context: any) => any; +type ModifyEnvironmentConfig = (config: any, context: any) => any; +type ModifyBundlerChain = (chain: any, context: any) => any; +type ReactResolver = { + resolve(request: string): Promise; +}; + +export const setupPlugin = ( + options: LynxModuleFederationOptions, + adapterOptions?: LynxModuleFederationAdapterOptions, + layers: unknown = LAYERS, + reactResolver?: ReactResolver, +) => { + let modifyRspackConfig: ModifyRspackConfig | undefined; + let modifyEnvironmentConfigCallback: ModifyEnvironmentConfig | undefined; + let modifyBundlerChainCallback: ModifyBundlerChain | undefined; + const modifyEnvironmentConfig = rs.fn((callback: ModifyEnvironmentConfig) => { + modifyEnvironmentConfigCallback = callback; + }); + const plugin = pluginLynxModuleFederation(options, adapterOptions); + + plugin.setup!({ + modifyEnvironmentConfig, + modifyBundlerChain(callback: ModifyBundlerChain) { + modifyBundlerChainCallback = callback; + }, + modifyRspackConfig(callback: ModifyRspackConfig) { + modifyRspackConfig = callback; + }, + useExposed(symbol: symbol) { + if (symbol === Symbol.for('LAYERS')) { + return layers; + } + if (symbol === Symbol.for('@lynx-js/react/internal:resolve')) { + return reactResolver; + } + return undefined; + }, + } as any); + + return { + modifyEnvironmentConfig, + applyEnvironmentConfig: (config: any, environment = 'lynx') => + modifyEnvironmentConfigCallback!(config, { name: environment }), + modifyBundlerChain: (environment = 'lynx') => + modifyBundlerChainCallback!({}, { environment: { name: environment } }), + modifyRspackConfig: (config: any, environment = 'lynx') => + modifyRspackConfig!(config, { environment: { name: environment } }), + }; +}; + +export const federationOptions = (plugin: unknown) => (plugin as any)._options; diff --git a/packages/lynx/src/plugin.ts b/packages/lynx/src/plugin.ts index 186da694290..1b135469c6c 100644 --- a/packages/lynx/src/plugin.ts +++ b/packages/lynx/src/plugin.ts @@ -18,7 +18,9 @@ import { getRemoteBundleOptions, normalizeLynxExposes, normalizeLynxShared, + normalizeRealmScopedRemotes, normalizeRealmScopedShared, + resolveRuntimePluginOptions, shouldApplyToEnvironment, validateLayers, type ExposedLayers, @@ -183,6 +185,11 @@ export const pluginLynxModuleFederation = ( const federationOptions = createFederationOptions( { ...options, + remotes: normalizeRealmScopedRemotes( + options.remotes, + layers, + activeRealmLayers, + ), shareScope: getLynxShareScopes( options.shareScope, layers, @@ -195,9 +202,13 @@ export const pluginLynxModuleFederation = ( layers, defaultLayer, activeRealmLayers, + options.shareScope, ), runtimePlugin, - adapterOptions.runtimePluginOptions, + resolveRuntimePluginOptions( + adapterOptions.runtimePluginOptions, + layers, + ), ); config.plugins ||= []; diff --git a/packages/lynx/src/pluginOptions.ts b/packages/lynx/src/pluginOptions.ts index c250ee79aed..48ed1fc5aa6 100644 --- a/packages/lynx/src/pluginOptions.ts +++ b/packages/lynx/src/pluginOptions.ts @@ -143,13 +143,44 @@ export const normalizeLynxExposes = ( return normalized; }; +type SharedNormalizationContext = + | { + defaultLayer: string; + isolateShareScope: false; + layers?: ExposedLayers; + } + | { + activeRealmLayers: readonly string[]; + defaultLayer: string; + isolateShareScope: true; + layers: ExposedLayers; + shareScope: ModuleFederationPluginOptions['shareScope']; + }; + +const getRealmLayer = ( + realm: LynxSharedConfig['realm'], + layers: ExposedLayers | undefined, +): string | undefined => { + if (realm === 'background') return layers?.BACKGROUND; + if (realm === 'main-thread') return layers?.MAIN_THREAD; + return undefined; +}; + +const getShareScopeLayer = ( + realmLayer: string | undefined, + issuerLayer: string, + layers: ExposedLayers, +): string => { + if (realmLayer) return realmLayer; + if (issuerLayer === layers.MAIN_THREAD) return layers.MAIN_THREAD; + if (issuerLayer === layers.BACKGROUND) return layers.BACKGROUND; + return layers.BACKGROUND; +}; + const normalizeSharedValue = ( key: string, value: string | LynxSharedConfig, - defaultLayer: string, - isolateShareScope = false, - layers?: ExposedLayers, - activeRealmLayers?: readonly string[], + context: SharedNormalizationContext, ): SharedConfig => { const config: LynxSharedConfig = typeof value === 'string' @@ -158,12 +189,7 @@ const normalizeSharedValue = ( : { import: key, requiredVersion: value } : value; const { realm, ...sharedConfig } = config; - const realmLayer = - realm === 'background' - ? layers?.BACKGROUND - : realm === 'main-thread' - ? layers?.MAIN_THREAD - : undefined; + const realmLayer = getRealmLayer(realm, context.layers); if (realm && !realmLayer) { throw new Error( `@module-federation/lynx cannot resolve shared realm "${realm}" without exposed Lynx layers.`, @@ -178,71 +204,49 @@ const normalizeSharedValue = ( `@module-federation/lynx shared module "${key}" cannot combine realm "${realm}" with a different layer or issuerLayer.`, ); } - const layer = sharedConfig.layer ?? realmLayer ?? defaultLayer; - const issuerLayer = sharedConfig.issuerLayer ?? realmLayer ?? defaultLayer; - const shareScopeLayer = - realmLayer ?? - (issuerLayer === layers?.MAIN_THREAD - ? layers.MAIN_THREAD - : issuerLayer === layers?.BACKGROUND - ? layers.BACKGROUND - : (layers?.BACKGROUND ?? issuerLayer)); - if ( - isolateShareScope && - activeRealmLayers && - !activeRealmLayers.includes(shareScopeLayer) - ) { - throw new Error( - `@module-federation/lynx shared module "${key}" uses inactive realm layer "${shareScopeLayer}". Enable its Lynx realm or choose one of: ${activeRealmLayers.join(', ')}.`, + const layer = sharedConfig.layer ?? realmLayer ?? context.defaultLayer; + const issuerLayer = + sharedConfig.issuerLayer ?? realmLayer ?? context.defaultLayer; + let scopedShareScopes: string[] | undefined; + if (context.isolateShareScope) { + const shareScopeLayer = getShareScopeLayer( + realmLayer, + issuerLayer, + context.layers, ); + if (!context.activeRealmLayers.includes(shareScopeLayer)) { + throw new Error( + `@module-federation/lynx shared module "${key}" uses inactive realm layer "${shareScopeLayer}". Enable its Lynx realm or choose one of: ${context.activeRealmLayers.join(', ')}.`, + ); + } + const shareScope = config.shareScope ?? context.shareScope ?? 'default'; + scopedShareScopes = ( + Array.isArray(shareScope) ? shareScope : [shareScope] + ).map((scope) => `${scope}:${shareScopeLayer}`); } return { ...sharedConfig, layer, issuerLayer, - ...(isolateShareScope - ? { - shareScope: (Array.isArray(config.shareScope) - ? config.shareScope - : [config.shareScope ?? 'default'] - ).map((scope) => `${scope}:${shareScopeLayer}`), - } - : {}), + ...(scopedShareScopes ? { shareScope: scopedShareScopes } : {}), }; }; const normalizeSharedItem = ( item: string | Record, - defaultLayer: string, - isolateShareScope = false, - layers?: ExposedLayers, - activeRealmLayers?: readonly string[], + context: SharedNormalizationContext, ): Record => { if (typeof item === 'string') { return { - [item]: normalizeSharedValue( - item, - item, - defaultLayer, - isolateShareScope, - layers, - activeRealmLayers, - ), + [item]: normalizeSharedValue(item, item, context), }; } return Object.fromEntries( Object.entries(item).map(([key, value]) => [ key, - normalizeSharedValue( - key, - value, - defaultLayer, - isolateShareScope, - layers, - activeRealmLayers, - ), + normalizeSharedValue(key, value, context), ]), ); }; @@ -256,11 +260,14 @@ export const normalizeLynxShared = ( return undefined; } + const context: SharedNormalizationContext = { + defaultLayer, + isolateShareScope: false, + layers, + }; return Array.isArray(shared) - ? shared.map((item) => - normalizeSharedItem(item, defaultLayer, false, layers), - ) - : normalizeSharedItem(shared, defaultLayer, false, layers); + ? shared.map((item) => normalizeSharedItem(item, context)) + : normalizeSharedItem(shared, context); }; export const normalizeRealmScopedShared = ( @@ -271,15 +278,21 @@ export const normalizeRealmScopedShared = ( layers.BACKGROUND, layers.MAIN_THREAD, ], + shareScope?: ModuleFederationPluginOptions['shareScope'], ): Shared | undefined => { if (!shared) { return undefined; } const items = Array.isArray(shared) ? shared : [shared]; - return items.map((item) => - normalizeSharedItem(item, defaultLayer, true, layers, activeRealmLayers), - ); + const context: SharedNormalizationContext = { + activeRealmLayers, + defaultLayer, + isolateShareScope: true, + layers, + shareScope, + }; + return items.map((item) => normalizeSharedItem(item, context)); }; export const getLynxShareScopes = ( @@ -294,29 +307,92 @@ export const getLynxShareScopes = ( (scope) => activeRealmLayers.map((layer) => `${scope}:${layer}`), ); +type Remotes = NonNullable; +type RemotesObject = Exclude; + +const normalizeRemotesObject = ( + remotes: RemotesObject, + layers: ExposedLayers, + activeRealmLayers: readonly string[], +): RemotesObject => + Object.fromEntries( + Object.entries(remotes).map(([alias, value]) => { + if (typeof value !== 'object' || value === null || Array.isArray(value)) { + return [alias, value]; + } + const config = value as { shareScope?: string | string[] }; + return [ + alias, + config.shareScope === undefined + ? config + : { + ...config, + shareScope: getLynxShareScopes( + config.shareScope, + layers, + activeRealmLayers, + ), + }, + ]; + }), + ) as RemotesObject; + +export const normalizeRealmScopedRemotes = ( + remotes: ModuleFederationPluginOptions['remotes'], + layers: ExposedLayers, + activeRealmLayers: readonly string[], +): ModuleFederationPluginOptions['remotes'] => { + if (!remotes) return remotes; + if (Array.isArray(remotes)) { + return remotes.map((remote) => + typeof remote === 'string' + ? remote + : normalizeRemotesObject(remote, layers, activeRealmLayers), + ); + } + return normalizeRemotesObject(remotes, layers, activeRealmLayers); +}; + +export const resolveRuntimePluginOptions = ( + options: LynxRuntimePluginOptions | undefined, + layers: ExposedLayers, +): LynxRuntimePluginOptions => ({ + ...options, + realmLayers: { + background: layers.BACKGROUND, + 'main-thread': layers.MAIN_THREAD, + }, +}); + export const injectRuntimePlugin = ( runtimePlugins: ModuleFederationPluginOptions['runtimePlugins'], runtimePlugin: string, runtimePluginOptions: LynxRuntimePluginOptions | undefined, ): NonNullable => { const plugins = runtimePlugins ?? []; - if ( - plugins.some((plugin) => - Array.isArray(plugin) - ? plugin[0] === runtimePlugin - : plugin === runtimePlugin, - ) - ) { - return plugins; - } - const useTuples = runtimePluginOptions !== undefined || plugins.some(Array.isArray); + let hasRuntimePlugin = false; + const normalizedPlugins = plugins.map((plugin) => { + const pluginPath = Array.isArray(plugin) ? plugin[0] : plugin; + if (pluginPath !== runtimePlugin) { + return useTuples && !Array.isArray(plugin) ? [plugin, {}] : plugin; + } + + hasRuntimePlugin = true; + if (!useTuples) return plugin; + const existingOptions = Array.isArray(plugin) ? plugin[1] : undefined; + return [runtimePlugin, { ...existingOptions, ...runtimePluginOptions }]; + }); + + if (hasRuntimePlugin) { + return normalizedPlugins as NonNullable< + ModuleFederationPluginOptions['runtimePlugins'] + >; + } if (useTuples) { return [ - ...plugins.map((plugin) => - Array.isArray(plugin) ? plugin : [plugin, {}], - ), + ...normalizedPlugins, [runtimePlugin, runtimePluginOptions ?? {}], ] as [string, Record][]; } diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index a9610d584e7..bb867327d69 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -16,7 +16,9 @@ import { createFederationOptions, getLynxShareScopes, normalizeLynxExposes, + normalizeRealmScopedRemotes, normalizeRealmScopedShared, + resolveRuntimePluginOptions, type ExposedLayers, type LynxModuleFederationAdapterOptions, type LynxModuleFederationOptions, @@ -56,6 +58,14 @@ type RemoteBundlePlan = RemoteBundlePlanBase & } ); +const toSafeOutputName = (name: string): string => { + const outputName = + name.replace(/[^A-Za-z0-9@_-]+/g, '_').replace(/^_+|_+$/g, '') || 'remote'; + return /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/i.test(outputName) + ? `_${outputName}` + : outputName; +}; + const normalizeRemoteBundlePlan = ( name: string, remoteBundle: LynxRemoteBundleOptions, @@ -73,9 +83,10 @@ const normalizeRemoteBundlePlan = ( ); } - const backgroundEntry = `${name}.js`; - const backgroundChunkPrefix = `${name}__background_`; - const bundleFileName = remoteBundle.filename ?? `${name}.lynx.bundle`; + const outputName = toSafeOutputName(name); + const backgroundEntry = `${outputName}.js`; + const backgroundChunkPrefix = `${outputName}__background_`; + const bundleFileName = remoteBundle.filename ?? `${outputName}.lynx.bundle`; const basePlan = { backgroundChunkPrefix, backgroundEntry, @@ -93,7 +104,7 @@ const normalizeRemoteBundlePlan = ( }; } - const mainThreadChunkPrefix = `${name}__main-thread__`; + const mainThreadChunkPrefix = `${outputName}__main-thread__`; const splitPlan = { ...basePlan, chunking, @@ -101,7 +112,7 @@ const normalizeRemoteBundlePlan = ( mainThreadChunkPrefix, }; if (remoteBundle.target === 'web') { - const mainThreadEntry = `${name}__main-thread.js`; + const mainThreadEntry = `${outputName}__main-thread.js`; return { ...splitPlan, entryAssets: [backgroundEntry, mainThreadEntry], @@ -175,12 +186,13 @@ const toChunkName = (key: string): string => { return name || 'expose'; }; -const assertUniqueChunkNames = (exposes: Exposes): void => { +const assertUniqueChunkNames = (exposes: Exposes): Map => { const normalized = normalizeLynxExposes(exposes, '') as Record< string, ExposesConfig >; const keysByChunkName = new Map(); + const chunkNamesByExpose = new Map(); for (const key of Object.keys(normalized)) { const chunkName = toChunkName(key); const previousKey = keysByChunkName.get(chunkName); @@ -190,7 +202,9 @@ const assertUniqueChunkNames = (exposes: Exposes): void => { ); } keysByChunkName.set(chunkName, key); + chunkNamesByExpose.set(key, chunkName); } + return chunkNamesByExpose; }; const createRemoteExposes = ( @@ -414,7 +428,7 @@ export const configureRemoteBundle = async ( `@module-federation/lynx \`remoteBundle\` owns expose layers; remove the explicit \`${conflictingLayer}\` expose layer.`, ); } - assertUniqueChunkNames(exposes); + const chunkNamesByExpose = assertUniqueChunkNames(exposes); const reservedExposeKey = findReservedExposeKey( exposes, @@ -456,11 +470,17 @@ export const configureRemoteBundle = async ( layers, layers.BACKGROUND, activeRealmLayers, + options.shareScope, ); const federationOptions = { ...createFederationOptions( { ...options, + remotes: normalizeRealmScopedRemotes( + options.remotes, + layers, + activeRealmLayers, + ), shareScope: getLynxShareScopes( options.shareScope, layers, @@ -470,14 +490,32 @@ export const configureRemoteBundle = async ( remoteExposes, remoteShared, runtimePlugin, - adapterOptions.runtimePluginOptions, + resolveRuntimePluginOptions(adapterOptions.runtimePluginOptions, layers), ), manifest: options.manifest ?? true, filename: plan.backgroundEntry, runtime: false as const, }; + const entryGlobalName = + typeof federationOptions.library?.name === 'string' + ? federationOptions.library.name + : options.name; + const entrySectionNames = new Map([[plan.backgroundEntry, entryGlobalName]]); + if (plan.mainThreadEntry) { + entrySectionNames.set( + plan.mainThreadEntry, + `${entryGlobalName}__main-thread`, + ); + } const pairedBundleChunks: string[] = []; const lazyBundleAssets = new Set(); + const lazyBundleAssetByExpose = new Map(); + const exposeByExpectedLazyBundleChunk = new Map( + Array.from(chunkNamesByExpose, ([expose, chunkName]) => [ + `${plan.backgroundChunkPrefix}${chunkName}`, + expose, + ]), + ); const discardedTemplateAssets = new Set(); const { manifestFileName, statsFileName } = getManifestFileName( federationOptions.manifest, @@ -492,6 +530,7 @@ export const configureRemoteBundle = async ( config.plugins.push( createCompilerModuleFederationPlugin(federationOptions), createLynxChunkLoadingMatcherPlugin(lynxTemplatePlugin, { + autoPublicPath: config.output?.publicPath === 'auto', backgroundOnlyRemote: !pairedPlan, chunking: plan.chunking, discardSourceEntryBundles: @@ -499,6 +538,8 @@ export const configureRemoteBundle = async ( discardedTemplateAssets, includedChunkPrefixes: plan.includedChunkPrefixes, lazyBundleAssets, + lazyBundleAssetByExpose, + exposeByExpectedLazyBundleChunk, remoteEntryName: options.name, ...(pairedPlan ? { @@ -534,8 +575,11 @@ export const configureRemoteBundle = async ( engineVersion: remoteBundle.engineVersion, entryAssets: plan.entryAssets, entryName: options.name, + entrySectionNames, includedChunkPrefixes: plan.includedChunkPrefixes, lazyBundleAssets, + lazyBundleAssetByExpose, + exposeByExpectedLazyBundleChunk, pairedBundleChunks, preservedAssets: [manifestFileName, statsFileName], }), diff --git a/packages/lynx/src/runtimeChunkLoading.test.ts b/packages/lynx/src/runtimeChunkLoading.test.ts index e199d970557..8b65c421ed5 100644 --- a/packages/lynx/src/runtimeChunkLoading.test.ts +++ b/packages/lynx/src/runtimeChunkLoading.test.ts @@ -686,7 +686,7 @@ describe('patchLynxChunkLoading', () => { 'async/Card.bundle', 'https://cdn.example/remotes/async/Card.bundle', ], - ['/', 'async/Card.bundle', 'https://cdn.example/remotes/async/Card.bundle'], + ['/', 'async/Card.bundle', 'https://cdn.example/async/Card.bundle'], [ 'assets/', 'async/Card.bundle', @@ -698,11 +698,21 @@ describe('patchLynxChunkLoading', () => { 'async/Card.bundle', 'https://assets.example/v3/async/Card.bundle', ], + [ + 'http://assets.example/v4/', + 'async/Card.bundle', + 'http://assets.example/v4/async/Card.bundle', + ], [ '/ignored/', 'https://assets.example/Card.bundle', 'https://assets.example/Card.bundle', ], + [ + '/ignored/', + 'http://assets.example/Card.bundle', + 'http://assets.example/Card.bundle', + ], ])( 'resolves split public path %s against the manifest entry', async (publicPath, assetPath, expected) => { @@ -733,6 +743,63 @@ describe('patchLynxChunkLoading', () => { }, ); + it('uses the manifest entry directory when Webpack auto-detects the Lynx Web client path', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.lynx_public_path_auto = true; + webpackRequire.p = + 'http://host.example/node_modules/@lynx-js/web-core/dist/client_prod/static/js/'; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + ); + }); + + it('preserves a protocol-relative remote origin for root public paths', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.p = '/'; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + ['remote:remote-origin', '//cdn.example/remotes/catalog.lynx.bundle'], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + '//cdn.example/async/Card.bundle', + ); + }); + it('preserves the original chunk handler without a registered bundle', () => { const originalHandler = rs.fn(); const webpackRequire = createWebpackRequire(); diff --git a/packages/lynx/src/runtimeChunkLoading.ts b/packages/lynx/src/runtimeChunkLoading.ts index 08ac33bfff5..8d4980ed93e 100644 --- a/packages/lynx/src/runtimeChunkLoading.ts +++ b/packages/lynx/src/runtimeChunkLoading.ts @@ -20,6 +20,7 @@ export interface LynxWebpackRequire { f: Record; lynx_aci?: Record; lynx_chunking?: 'single' | 'split'; + lynx_public_path_auto?: boolean; m: Record; p?: string; u(chunkId: ChunkId): string; @@ -59,9 +60,9 @@ const joinRemoteUrl = ( } const entry = entryUrl.split(/[?#]/, 1)[0]; - const origin = entry.match(/^([a-z][a-z\d+.-]*:\/\/[^/]+)/i)?.[1] ?? ''; + const origin = entry.match(/^(?:[a-z][a-z\d+.-]*:)?\/\/[^/]+/i)?.[0] ?? ''; const base = - publicPath && publicPath !== 'auto' && publicPath !== '/' + publicPath && publicPath !== 'auto' ? publicPath : entry.slice(0, entry.lastIndexOf('/') + 1); if (/^(?:[a-z][a-z\d+.-]*:)?\/\//i.test(base)) { @@ -438,7 +439,7 @@ export const patchLynxChunkLoading = ( if (lazyBundlePath) { const request = joinRemoteUrl( remoteOrigin, - webpackRequire.p, + webpackRequire.lynx_public_path_auto ? undefined : webpackRequire.p, lazyBundlePath, ); promises.push( diff --git a/packages/lynx/src/runtimeCore.ts b/packages/lynx/src/runtimeCore.ts index 4f556c46e96..85b30231116 100644 --- a/packages/lynx/src/runtimeCore.ts +++ b/packages/lynx/src/runtimeCore.ts @@ -6,7 +6,11 @@ export const LYNX_BUNDLE_REGISTRY = Symbol.for( export const LYNX_REMOTE_ORIGIN_SUFFIX = ':remote-origin'; +export type LynxRealm = 'background' | 'main-thread'; + export interface LynxRuntimePluginOptions { + /** Resolved DSL layer names injected by the build adapter. */ + realmLayers?: Record; timeout?: number; } @@ -56,8 +60,6 @@ export const getLynxRuntime = ( ): LynxRuntime | undefined => globalObject.lynx ?? (typeof lynx === 'undefined' ? undefined : lynx); -export type LynxRealm = 'background' | 'main-thread'; - export const MAIN_THREAD_EXPOSE_SUFFIX = '__main_thread'; export const isRecord = (value: unknown): value is Record => @@ -71,25 +73,59 @@ const isRemoteEntryExports = (value: unknown): value is RemoteEntryExports => const getDefaultExport = (value: unknown): unknown => isRecord(value) ? value.default : undefined; -export const findRemoteEntryExports = ( - value: unknown, +const getRemoteEntryGlobalCandidates = ( entryGlobalName: string, globalObject: LynxGlobal, alternateGlobalName?: string, -): RemoteEntryExports | undefined => { +): unknown[] => { const globalValue = globalObject[entryGlobalName]; const alternateGlobalValue = alternateGlobalName ? globalObject[alternateGlobalName] : undefined; return [ - value, - getDefaultExport(value), globalValue, getDefaultExport(globalValue), alternateGlobalValue, getDefaultExport(alternateGlobalValue), - ].find(isRemoteEntryExports); + ]; +}; + +export const snapshotRemoteEntryGlobals = ( + entryGlobalName: string, + globalObject: LynxGlobal, + alternateGlobalName?: string, +): ReadonlySet => + new Set( + getRemoteEntryGlobalCandidates( + entryGlobalName, + globalObject, + alternateGlobalName, + ).filter(isRemoteEntryExports), + ); + +export const findRemoteEntryExports = ( + value: unknown, + entryGlobalName: string, + globalObject: LynxGlobal, + alternateGlobalName?: string, + previousGlobalExports: ReadonlySet = new Set(), +): RemoteEntryExports | undefined => { + const loadedExports = [value, getDefaultExport(value)].find( + isRemoteEntryExports, + ); + if (loadedExports) { + return loadedExports; + } + + return getRemoteEntryGlobalCandidates( + entryGlobalName, + globalObject, + alternateGlobalName, + ).find( + (candidate): candidate is RemoteEntryExports => + isRemoteEntryExports(candidate) && !previousGlobalExports.has(candidate), + ); }; export const getLynxRealm = (lynx: LynxRuntime): LynxRealm => diff --git a/packages/lynx/src/runtimeEntryLoader.ts b/packages/lynx/src/runtimeEntryLoader.ts index 0ddc03e7ba2..10905349c24 100644 --- a/packages/lynx/src/runtimeEntryLoader.ts +++ b/packages/lynx/src/runtimeEntryLoader.ts @@ -10,6 +10,7 @@ import { getRegistryKey, isRecord, MAIN_THREAD_EXPOSE_SUFFIX, + snapshotRemoteEntryGlobals, toErrorMessage, type LynxGlobal, type LynxRealm, @@ -68,6 +69,11 @@ export const loadJavaScriptEntry = ( ); } + const previousGlobalExports = snapshotRemoteEntryGlobals( + entryGlobalName, + globalObject, + ); + return loadWithTimeout( timeout, `Timed out loading Lynx remote entry "${entryGlobalName}" from "${entry}" after ${timeout}ms.`, @@ -89,6 +95,8 @@ export const loadJavaScriptEntry = ( value, entryGlobalName, globalObject, + undefined, + previousGlobalExports, ); if (!exports) { reject( @@ -108,6 +116,7 @@ export const loadJavaScriptEntry = ( const adaptContainerToRealm = ( container: RemoteEntryExports, realm: LynxRealm, + realmLayer: string, ): RemoteEntryExports => ({ get: (request) => container.get( @@ -123,7 +132,7 @@ const adaptContainerToRealm = ( const shareScopeKeys = options.shareScopeKeys.filter( (value): value is string => typeof value === 'string', ); - const realmSuffix = realm === 'background' ? ':background' : ':main-thread'; + const realmSuffix = `:${realmLayer}`; const realmShareScopeKeys = shareScopeKeys.filter((key) => key.endsWith(realmSuffix), ); @@ -162,6 +171,7 @@ export const loadBundleEntry = ( entry: string, entryGlobalName: string, realm: LynxRealm, + realmLayer: string, globalObject: LynxGlobal, timeout: number, ): Promise => { @@ -228,6 +238,12 @@ export const loadBundleEntry = ( realm === 'background' ? entryGlobalName : `${entryGlobalName}__main-thread`; + const alternateGlobalName = getRegistryKey(entryGlobalName, realm); + const previousGlobalExports = snapshotRemoteEntryGlobals( + entryGlobalName, + globalObject, + alternateGlobalName, + ); try { const value = loadScript(sectionPath, { bundleName: response.url }); @@ -240,7 +256,8 @@ export const loadBundleEntry = ( loadedValue, entryGlobalName, globalObject, - getRegistryKey(entryGlobalName, realm), + alternateGlobalName, + previousGlobalExports, ); if (!exports) { reject( @@ -251,7 +268,7 @@ export const loadBundleEntry = ( return; } rollbackRegistry = undefined; - resolve(adaptContainerToRealm(exports, realm)); + resolve(adaptContainerToRealm(exports, realm, realmLayer)); }, (error) => reject( diff --git a/packages/lynx/src/runtimePlugin.test.ts b/packages/lynx/src/runtimePlugin.test.ts index d682b730a35..7033a0732a0 100644 --- a/packages/lynx/src/runtimePlugin.test.ts +++ b/packages/lynx/src/runtimePlugin.test.ts @@ -87,15 +87,30 @@ describe('lynxRuntimePlugin entry loading', () => { ); const globalContainer = createContainer(); - (globalThis as unknown as Record).remote = { - default: globalContainer, - }; setLynx({ - requireModuleAsync: (_entry, callback) => callback(null, undefined), + requireModuleAsync: (_entry, callback) => { + (globalThis as unknown as Record).remote = { + default: globalContainer, + }; + callback(null, undefined); + }, }); await expect(loadEntry(lynxRuntimePlugin())).resolves.toBe(globalContainer); }); + it('rejects a pre-existing container global for a newly loaded URL', async () => { + const staleContainer = createContainer(); + (globalThis as unknown as Record).remote = staleContainer; + setLynx({ + fetchBundle: async () => ({ code: 0, url: 'lynx-cache://new-remote' }), + loadScript: () => undefined, + }); + + await expect( + loadEntry(lynxRuntimePlugin(), bundleRemoteInfo), + ).rejects.toThrow('did not export a Module Federation container'); + }); + it('deduplicates concurrent entry loads', async () => { const container = createContainer(); let finishLoad: NativeCallback | undefined; @@ -349,6 +364,59 @@ describe('lynxRuntimePlugin entry loading', () => { ); }); + it('filters custom DSL share-scope layers for each runtime realm', async () => { + const backgroundContainer = createContainer(); + const mainContainer = createContainer(); + const plugin = lynxRuntimePlugin({ + realmLayers: { + background: 'worker:realm', + 'main-thread': 'ui:realm', + }, + }); + const scopes = { + 'default:react:worker:realm': { worker: true }, + 'default:react:ui:realm': { ui: true }, + }; + const initOptions = { + version: 'test', + shareScopeKeys: Object.keys(scopes), + shareScopeMap: scopes as never, + }; + + setLynx({ + fetchBundle: async () => ({ code: 0, url: 'lynx-cache://worker' }), + getNativeApp: () => ({}), + loadScript: () => backgroundContainer, + }); + const background = await loadEntry(plugin, bundleRemoteInfo); + background.init(scopes['default:react:worker:realm'] as never, [], { + ...initOptions, + }); + expect(backgroundContainer.init).toHaveBeenCalledWith( + scopes['default:react:worker:realm'], + [], + expect.objectContaining({ + shareScopeKeys: 'default:react:worker:realm', + }), + ); + + setLynx({ + fetchBundle: async () => ({ code: 0, url: 'lynx-cache://ui' }), + loadScript: () => mainContainer, + }); + const main = await loadEntry(plugin, bundleRemoteInfo); + main.init(scopes['default:react:ui:realm'] as never, [], { + ...initOptions, + }); + expect(mainContainer.init).toHaveBeenCalledWith( + scopes['default:react:ui:realm'], + [], + expect.objectContaining({ + shareScopeKeys: 'default:react:ui:realm', + }), + ); + }); + it('does not infer realm share scopes from array positions', async () => { const container = createContainer(); setLynx({ diff --git a/packages/lynx/src/runtimePlugin.ts b/packages/lynx/src/runtimePlugin.ts index 8b5856c4364..69558739ba7 100644 --- a/packages/lynx/src/runtimePlugin.ts +++ b/packages/lynx/src/runtimePlugin.ts @@ -38,6 +38,10 @@ export default function lynxRuntimePlugin( ): ModuleFederationRuntimePlugin { const entryCache = new Map>(); const timeout = getTimeout(options.timeout); + const realmLayers = options.realmLayers ?? { + background: 'background', + 'main-thread': 'main-thread', + }; return { name: 'lynx-federation-runtime-plugin', @@ -79,6 +83,7 @@ export default function lynxRuntimePlugin( entry, entryGlobalName, realm, + realmLayers[realm], globalObject, timeout, ) diff --git a/packages/runtime-core/__tests__/snapshot.spec.ts b/packages/runtime-core/__tests__/snapshot.spec.ts index 08862ebabf6..24c74506738 100644 --- a/packages/runtime-core/__tests__/snapshot.spec.ts +++ b/packages/runtime-core/__tests__/snapshot.spec.ts @@ -46,4 +46,56 @@ describe('snapshot', () => { }, }); }); + + it('infers an auto public path from the fetched manifest URL', async () => { + const manifestUrl = '/remote-web/mf-manifest.json'; + const resolvedManifestUrl = + 'https://example.test/remote-web/mf-manifest.json'; + const response = new Response( + JSON.stringify({ + id: 'catalog', + name: 'catalog', + metaData: { + name: 'catalog', + publicPath: 'auto', + type: 'app', + buildInfo: { buildVersion: '1.0.0' }, + remoteEntry: { + name: 'catalog.web.lynx.bundle', + path: '', + type: 'global', + }, + types: { name: '', path: '' }, + globalName: 'catalog', + }, + remotes: [], + shared: [], + exposes: [], + }), + { headers: { 'Content-Type': 'application/json' } }, + ); + Object.defineProperty(response, 'url', { value: resolvedManifestUrl }); + + const instance = new ModuleFederation({ + name: 'host', + remotes: [{ name: 'catalog', entry: manifestUrl }], + plugins: [ + { + name: 'resolved-manifest-fetch', + fetch: async () => response, + }, + ], + }); + + const { remoteSnapshot } = + await instance.snapshotHandler.loadRemoteSnapshotInfo({ + moduleInfo: { name: 'catalog', entry: manifestUrl }, + }); + + expect(remoteSnapshot).toMatchObject({ + version: manifestUrl, + publicPath: 'https://example.test/remote-web/', + remoteEntry: 'catalog.web.lynx.bundle', + }); + }); }); diff --git a/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts b/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts index e3661cfdbf7..8a5ea2d80ff 100644 --- a/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts +++ b/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts @@ -75,6 +75,7 @@ export class SnapshotHandler { loadingHostSnapshot: Promise | null = null; HostInstance: ModuleFederation; manifestCache: Map = new Map(); + private manifestResolvedUrlCache: Map = new Map(); hooks = new PluginSystem({ beforeLoadRemoteSnapshot: new AsyncHook< [ @@ -118,6 +119,11 @@ export class SnapshotHandler { this.loaderHook = HostInstance.loaderHook; } + clearManifestCache(manifestUrl: string): void { + this.manifestCache.delete(manifestUrl); + this.manifestResolvedUrlCache.delete(manifestUrl); + } + // eslint-disable-next-line max-lines-per-function async loadRemoteSnapshotInfo({ moduleInfo, @@ -319,6 +325,9 @@ export class SnapshotHandler { if (!res || !(res instanceof Response)) { res = await fetch(manifestUrl, {}); } + if (res.url) { + this.manifestResolvedUrlCache.set(manifestUrl, res.url); + } manifestJson = (await res.json()) as Manifest; } catch (err) { manifestJson = @@ -408,6 +417,8 @@ export class SnapshotHandler { ); const remoteSnapshot = generateSnapshotFromManifest(manifestJson, { version: manifestUrl, + manifestUrl: + this.manifestResolvedUrlCache.get(manifestUrl) ?? manifestUrl, }); const { remoteSnapshot: remoteSnapshotRes } = diff --git a/packages/runtime-core/src/remote/index.ts b/packages/runtime-core/src/remote/index.ts index 891143c5ae6..9b2c9e20460 100644 --- a/packages/runtime-core/src/remote/index.ts +++ b/packages/runtime-core/src/remote/index.ts @@ -711,7 +711,7 @@ export class RemoteHandler { delete CurrentGlobal.__FEDERATION__.moduleInfo[globalSnapshotKey]; if ('entry' in remote) { - host.snapshotHandler.manifestCache.delete(remote.entry); + host.snapshotHandler.clearManifestCache(remote.entry); delete Global.__FEDERATION__.__MANIFEST_LOADING__[remote.entry]; } diff --git a/packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts b/packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts index c1662388843..4de44489585 100644 --- a/packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts +++ b/packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts @@ -45,6 +45,23 @@ describe('generateSnapshotFromManifest', () => { expect(remoteSnapshot.publicPath).toBe('http://localhost:2006/ssr/'); }); + it('infers publicPath from a resolved manifest url without changing version', () => { + const manifestWithAutoPublicPath = JSON.parse( + JSON.stringify(manifest.devAppManifest), + ); + manifestWithAutoPublicPath.metaData.publicPath = 'auto'; + const remoteSnapshot = generateSnapshotFromManifest( + manifestWithAutoPublicPath, + { + version: '/remote-web/mf-manifest.json', + manifestUrl: 'https://example.test/remote-web/mf-manifest.json', + }, + ); + + expect(remoteSnapshot.version).toBe('/remote-web/mf-manifest.json'); + expect(remoteSnapshot.publicPath).toBe('https://example.test/remote-web/'); + }); + it('return basic app snapshot with only manifest params in dev with getPublicPath', () => { const remoteSnapshot = generateSnapshotFromManifest( manifest.devAppManifestWithGetPublicPath, diff --git a/packages/sdk/src/generateSnapshotFromManifest.ts b/packages/sdk/src/generateSnapshotFromManifest.ts index 8f4829b4757..ec5046e83ae 100644 --- a/packages/sdk/src/generateSnapshotFromManifest.ts +++ b/packages/sdk/src/generateSnapshotFromManifest.ts @@ -13,6 +13,7 @@ interface IOptions { remotes?: Record; overrides?: Record; version?: string; + manifestUrl?: string; } export const simpleJoinRemoteEntry = (rPath: string, rName: string): string => { @@ -62,7 +63,7 @@ export function generateSnapshotFromManifest( manifest: Manifest, options: IOptions = {}, ): ProviderModuleInfo { - const { remotes = {}, overrides = {}, version } = options; + const { remotes = {}, overrides = {}, version, manifestUrl } = options; let remoteSnapshot: ProviderModuleInfo; const getPublicPath = (): string => { @@ -70,10 +71,10 @@ export function generateSnapshotFromManifest( if ( (manifest.metaData.publicPath === 'auto' || manifest.metaData.publicPath === '') && - version + (manifestUrl || version) ) { // use same implementation as publicPath auto runtime module implements - return inferAutoPublicPath(version); + return inferAutoPublicPath(manifestUrl || version!); } return manifest.metaData.publicPath; } else { From 49d996d1d6204c2784ffe86e5b1ff0099b56bad4 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Fri, 17 Jul 2026 21:27:26 +0000 Subject: [PATCH 16/68] fix(lynx): avoid backtracking in output names --- packages/lynx/src/plugin.remoteBundle.test.ts | 2 ++ packages/lynx/src/remoteBundle.ts | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/lynx/src/plugin.remoteBundle.test.ts b/packages/lynx/src/plugin.remoteBundle.test.ts index 119e67b66a5..be67d2e5b5c 100644 --- a/packages/lynx/src/plugin.remoteBundle.test.ts +++ b/packages/lynx/src/plugin.remoteBundle.test.ts @@ -497,6 +497,8 @@ describe('pluginLynxModuleFederation remote bundles', () => { ['catalog?blue', 'catalog_blue'], ['catalog#blue', 'catalog_blue'], ['teams:catalog', 'teams_catalog'], + ['___catalog___', 'catalog'], + ['___', 'remote'], ['CON', '_CON'], ])( 'derives safe remote bundle artifacts from federation name %s', diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index bb867327d69..3bfa688116d 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -59,8 +59,16 @@ type RemoteBundlePlan = RemoteBundlePlanBase & ); const toSafeOutputName = (name: string): string => { - const outputName = - name.replace(/[^A-Za-z0-9@_-]+/g, '_').replace(/^_+|_+$/g, '') || 'remote'; + const sanitizedName = name.replace(/[^A-Za-z0-9@_-]+/g, '_'); + let start = 0; + let end = sanitizedName.length; + while (start < end && sanitizedName[start] === '_') { + start += 1; + } + while (end > start && sanitizedName[end - 1] === '_') { + end -= 1; + } + const outputName = sanitizedName.slice(start, end) || 'remote'; return /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/i.test(outputName) ? `_${outputName}` : outputName; From c4cb6ec23ef3bc25e2272cd6cf60ab0be3749711 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Fri, 17 Jul 2026 22:30:22 +0000 Subject: [PATCH 17/68] fix(lynx): use absolute native asset origin --- apps/lynx-module-federation-demo/README.md | 10 +++++----- .../OrbitControlUITests.swift | 7 ++++++- .../lynx.remote.native.config.mjs | 6 +++++- .../src/app/App.tsx | 6 +++++- .../test/native-artifacts.mjs | 8 +++++++- .../test/native-dev-server.mjs | 2 +- packages/lynx/README.md | 20 ++++++++++--------- 7 files changed, 40 insertions(+), 19 deletions(-) diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index feacf767771..59da2abfd2b 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -33,11 +33,11 @@ flowchart LR The host never addresses a generated `remoteEntry.js` directly. Both import styles resolve the manifest, whose `metaData.remoteEntry` names the public -`.lynx.bundle` container. Lazy expose bundles are fetched separately. -Both remote builds use `publicPath: 'auto'`. Module Federation resolves the -container URL from the manifest; the Lynx runtime plugin uses that resolved URL -as the base for split lazy bundles instead of relying on a browser -`document.currentScript`, which points at Lynx Web's internal client. +`.lynx.bundle` container. Lazy expose bundles are fetched separately. The Web +remote uses `publicPath: 'auto'`; Module Federation resolves its container and +split assets from the fetched manifest URL instead of Lynx Web's internal +`document.currentScript`. The native remote uses the absolute +`LYNX_REMOTE_ORIGIN` required by Rspeedy/Lynx's native lazy-bundle loader. ## Run the standalone Catalog product diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift index 7474bc0f983..06b89be0e06 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift @@ -52,7 +52,12 @@ final class OrbitControlUITests: XCTestCase { let readiness = app.descendants(matching: .any) .matching(identifier: "federation-ready") .firstMatch - XCTAssertTrue(readiness.waitForExistence(timeout: 60)) + let isReady = readiness.waitForExistence(timeout: 60) + let error = app.descendants(matching: .any) + .matching(identifier: "federation-error") + .firstMatch + let failure = error.exists ? error.label : "No federation error was rendered." + XCTAssertTrue(isReady, failure) attachScreenshot(named: "Orbit Control federation loaded") } diff --git a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs index c26f83341e2..d3abac05964 100644 --- a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs @@ -6,6 +6,10 @@ import { resolveAliases, } from './federation.config.mjs'; +const nativeRemoteOrigin = + process.env.LYNX_REMOTE_ORIGIN?.replace(/\/+$/, '') ?? + 'http://127.0.0.1:3000'; + export default defineConfig({ plugins: [ pluginReactLynx({ @@ -23,7 +27,7 @@ export default defineConfig({ lynx: {}, }, output: { - assetPrefix: 'auto', + assetPrefix: `${nativeRemoteOrigin}/remote-native/`, cleanDistPath: false, distPath: { root: 'dist/remote-native', diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index d41f2fe0086..d3fa879a86c 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -250,7 +250,11 @@ export function App() { {loadError ? ( - + {loadError} ) : null} diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index c2a7b0fba85..e70e9170585 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -8,6 +8,9 @@ const appRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url))); const requireFromAdapter = createRequire( path.join(appRoot, '../../packages/lynx/package.json'), ); +const nativeRemoteOrigin = + process.env.LYNX_REMOTE_ORIGIN?.replace(/\/+$/, '') ?? + 'http://127.0.0.1:3000'; const { decode_napi: decodeTemplate } = requireFromAdapter('@lynx-js/tasm'); const hostBundlePath = path.join(appRoot, 'dist/host-native/main.lynx.bundle'); const standaloneBundlePath = path.join( @@ -131,7 +134,10 @@ for (const request of [ const manifest = JSON.parse(manifestSource); const stats = JSON.parse(statsSource); assert.equal(manifest.metaData?.name, 'catalog'); -assert.equal(manifest.metaData?.publicPath, 'auto'); +assert.equal( + manifest.metaData?.publicPath, + `${nativeRemoteOrigin}/remote-native/`, +); assert.deepEqual(manifest.metaData?.remoteEntry, { name: 'catalog.native.lynx.bundle', path: '', diff --git a/apps/lynx-module-federation-demo/test/native-dev-server.mjs b/apps/lynx-module-federation-demo/test/native-dev-server.mjs index 247fb3c91a3..405a888d063 100644 --- a/apps/lynx-module-federation-demo/test/native-dev-server.mjs +++ b/apps/lynx-module-federation-demo/test/native-dev-server.mjs @@ -95,7 +95,7 @@ try { `${origin}/remote-native/mf-manifest.json`, ); const manifest = await manifestResponse.json(); - assert.equal(manifest.metaData.publicPath, 'auto'); + assert.equal(manifest.metaData.publicPath, `${origin}/remote-native/`); const remoteEntry = manifest.metaData.remoteEntry; const remoteBase = manifest.metaData.publicPath === 'auto' diff --git a/packages/lynx/README.md b/packages/lynx/README.md index 5441fc5c6c3..046b47d2d06 100644 --- a/packages/lynx/README.md +++ b/packages/lynx/README.md @@ -133,15 +133,17 @@ Split native bundles encode both programs into one DynamicComponent artifact; Web remotes use the equivalent paired external bundle. Web remotes reject `single`, and native `single` is limited to background-only non-UI modules. -`publicPath: 'auto'` is supported and recommended for colocated split assets. -Module Federation still resolves the public remote entry through manifest -inference or `getPublicPath`. Browser and browser-like transports infer a -root-relative manifest's origin from the fetched `Response.url`; Node hosts -should provide an absolute manifest URL (or a custom fetch response with an -absolute URL). The Lynx runtime plugin then resolves lazy bundles relative to -that actual entry URL, because native and Lynx for Web evaluation do not provide -the DOM `currentScript` signal used by Webpack's browser auto-public-path -runtime. Explicit public paths remain unchanged. +`publicPath: 'auto'` is supported and recommended for colocated Web split +assets. Module Federation still resolves the public remote entry through +manifest inference or `getPublicPath`. Browser and browser-like transports +infer a root-relative manifest's origin from the fetched `Response.url`; Node +hosts should provide an absolute manifest URL (or a custom fetch response with +an absolute URL). The Lynx runtime plugin then resolves lazy bundles relative +to that actual entry URL instead of the DOM `currentScript` signal used by +Webpack's browser auto-public-path runtime. Native remotes should follow +Rspeedy and set an absolute `output.assetPrefix` (for example from a CDN or +`LYNX_REMOTE_ORIGIN`) because Lynx's native lazy-bundle bootstrap also consumes +Webpack's public path. Explicit public paths remain unchanged. Ordinary Rspeedy entry bundles are preserved by default. A dedicated remote environment may set `preserveSourceEntryBundles: false` to publish only its From 3fd867098f9e496a9e65370505711e5f4043eff4 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Fri, 17 Jul 2026 23:18:29 +0000 Subject: [PATCH 18/68] ci(lynx): cache native dependencies --- .github/workflows/e2e-lynx.yml | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index cd17363e159..0ec6b018258 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -108,6 +108,18 @@ jobs: with: ruby-version: ${{ env.RUBY_VERSION }} + - name: Cache iOS dependencies + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 + with: + path: | + ~/.cocoapods/repos/trunk + ~/Library/Caches/CocoaPods + apps/lynx-module-federation-demo/ios/Pods + apps/lynx-module-federation-demo/ios/vendor/bundle + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4- + - name: Download native artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: @@ -122,16 +134,27 @@ jobs: run: | bundle config set path vendor/bundle bundle install --jobs 4 --retry 3 - bundle exec pod install --deployment --repo-update + bundle exec pod install --deployment - name: Run standalone iOS federation E2E run: node apps/lynx-module-federation-demo/test/ios/run.mjs - - name: Upload iOS E2E artifacts - if: always() + - name: Upload iOS E2E evidence + if: success() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: lynx-ios-e2e + path: | + apps/lynx-module-federation-demo/ios/build/orbit-control.png + apps/lynx-module-federation-demo/ios/build/requests.json + if-no-files-found: error + retention-days: 7 + + - name: Upload iOS E2E failure artifacts + if: failure() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: lynx-ios-e2e-failure path: | apps/lynx-module-federation-demo/ios/build/OrbitControl.xcresult/ apps/lynx-module-federation-demo/ios/build/OrbitControl-Release.xcresult/ From f855940fa6d456f2056c0011058d62da0dd5c70e Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Fri, 17 Jul 2026 23:29:12 +0000 Subject: [PATCH 19/68] ci(lynx): invalidate cache on pod config --- .github/workflows/e2e-lynx.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 0ec6b018258..72c1dac20b6 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -116,9 +116,9 @@ jobs: ~/Library/Caches/CocoaPods apps/lynx-module-federation-demo/ios/Pods apps/lynx-module-federation-demo/ios/vendor/bundle - key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }} + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }} restore-keys: | - ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4- + ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-ruby-${{ env.RUBY_VERSION }}- - name: Download native artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 From b972a775bd9b2f31671d1733b58c3816a175917b Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Fri, 17 Jul 2026 23:47:54 +0000 Subject: [PATCH 20/68] ci(lynx): disable xcode indexing --- apps/lynx-module-federation-demo/test/ios/run.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index 10cabd61115..6e0f50724e2 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -165,6 +165,7 @@ try { 'build/DerivedData', '-resultBundlePath', 'build/OrbitControl.xcresult', + 'COMPILER_INDEX_STORE_ENABLE=NO', '-parallel-testing-enabled', 'NO', '-only-testing:OrbitControlUITests/OrbitControlUITests/testFederatedImportsRuntimeLoadingAndSingleton', @@ -192,6 +193,7 @@ try { 'build/DerivedData', '-resultBundlePath', 'build/OrbitControl-Release.xcresult', + 'COMPILER_INDEX_STORE_ENABLE=NO', '-parallel-testing-enabled', 'NO', '-only-testing:OrbitControlUITests/OrbitControlUITests/testEmbeddedReleaseHostLaunches', From b3a0f1056db10b7248eecc39efac1aeacafb0e0c Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Sat, 18 Jul 2026 00:43:29 +0000 Subject: [PATCH 21/68] ci(lynx): consolidate ios release tests --- .github/workflows/e2e-lynx.yml | 1 - apps/lynx-module-federation-demo/README.md | 12 +++++---- .../ios/OrbitControl/Info.plist | 5 ++++ .../test/ios-project.mjs | 12 +++++++++ .../test/ios/run.mjs | 26 +++---------------- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 72c1dac20b6..75c6ddc1c92 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -156,7 +156,6 @@ jobs: with: name: lynx-ios-e2e-failure path: | - apps/lynx-module-federation-demo/ios/build/OrbitControl.xcresult/ apps/lynx-module-federation-demo/ios/build/OrbitControl-Release.xcresult/ apps/lynx-module-federation-demo/ios/build/orbit-control.png apps/lynx-module-federation-demo/ios/build/requests.json diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index 59da2abfd2b..8a32e5b9b1f 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -111,8 +111,10 @@ Set the Xcode scheme's `LYNX_BUNDLE_URL` to origins and binds Rspeedy to `0.0.0.0`, so the phone can fetch the host, manifest, container, and lazy bundles from the same server. -Release builds embed `ios/Resources/main.lynx.bundle` and retain strict ATS -defaults. Build the host with the production manifest origin before syncing it: +Release builds embed `ios/Resources/main.lynx.bundle`. ATS permits only local +networking for the simulator/LAN demo; arbitrary and public insecure HTTP loads +remain disabled. Build the host with the production manifest origin before +syncing it: ```sh LYNX_REMOTE_ORIGIN=https://cdn.example.com/catalog/ pnpm build:native @@ -121,11 +123,11 @@ pnpm ios:sync The host bundle and its non-eager async-startup JS are embedded. The manifest, container, and lazy expose bundles remain separately deployable HTTP(S) -artifacts. The iOS simulator E2E +artifacts. One Release simulator build runs all three UI scenarios: it launches the app, taps **Load remote catalog**, verifies compiled imports, runtime `loadRemote()`, and shared singleton identity, then checks every native -bundle request observed by the test server. It also launches the Release app -without a root URL override to prove the embedded host and strict ATS branch. +bundle request observed by the test server; launches Catalog as a standalone +root; and launches without a root URL override to prove the embedded host. ## Run with Lynx Explorer diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/Info.plist b/apps/lynx-module-federation-demo/ios/OrbitControl/Info.plist index 12989ce37cd..626bc5e11db 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/Info.plist +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/Info.plist @@ -20,6 +20,11 @@ $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS + NSAppTransportSecurity + + NSAllowsLocalNetworking + + NSLocalNetworkUsageDescription Orbit Control connects to a developer-hosted Lynx federation server on the local network. UILaunchStoryboardName diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index 9f2e1ed36b4..a906ddf5906 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -34,6 +34,7 @@ const [ packageJson, deviceServer, syncScript, + iosRunner, ] = await Promise.all([ read('ios/Podfile'), read('ios/Podfile.lock'), @@ -49,6 +50,7 @@ const [ read('package.json'), read('scripts/dev-ios-device.mjs'), read('scripts/sync-ios-bundle.mjs'), + read('test/ios/run.mjs'), ]); for (const pod of ['Lynx', 'LynxService', 'XElement']) { @@ -77,6 +79,7 @@ assert.match(fetcher, /hasPrefix:@"\/static\/"/); assert.match(fetcher, /relativePath = \[urlString substringFromIndex:1\]/); assert.doesNotMatch(releaseInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(releaseInfo, /NSExceptionAllowsInsecureHTTPLoads/); +assert.match(releaseInfo, /NSAllowsLocalNetworking/); assert.match(debugInfo, /NSAllowsLocalNetworking/); assert.match(debugInfo, /127\.0\.0\.1<\/key>/); assert.match(debugInfo, /localhost<\/key>/); @@ -102,6 +105,15 @@ assert.match(deviceServer, /not a loopback or unspecified address/); assert.match(syncScript, /dist\/host-native\/main\.lynx\.bundle/); assert.match(syncScript, /sourceStatic/); assert.match(syncScript, /cp\(sourceStatic, destinationStatic/); +assert.equal(iosRunner.match(/await run\(\s*'xcodebuild'/g)?.length, 1); +assert.match(iosRunner, /'-configuration',\s*'Release'/); +for (const testName of [ + 'testFederatedImportsRuntimeLoadingAndSingleton', + 'testStandaloneCatalogRemoteBuildLaunches', + 'testEmbeddedReleaseHostLaunches', +]) { + assert.match(iosRunner, new RegExp(`-only-testing:.*${testName}`)); +} const deviceServerPath = path.join(appRoot, 'scripts/dev-ios-device.mjs'); const validateDeviceOrigin = (origin) => spawnSync(process.execPath, [deviceServerPath, '--check-origin'], { diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index 6e0f50724e2..d35badc77df 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -22,8 +22,7 @@ const iosRoot = path.join(appRoot, 'ios'); const artifactsRoot = path.join(iosRoot, 'build'); const requestLogPath = path.join(artifactsRoot, 'requests.json'); const screenshotPath = path.join(artifactsRoot, 'orbit-control.png'); -const resultBundlePath = path.join(artifactsRoot, 'OrbitControl.xcresult'); -const releaseResultBundlePath = path.join( +const resultBundlePath = path.join( artifactsRoot, 'OrbitControl-Release.xcresult', ); @@ -31,7 +30,6 @@ const requestedPaths = []; await mkdir(artifactsRoot, { recursive: true }); await rm(resultBundlePath, { force: true, recursive: true }); -await rm(releaseResultBundlePath, { force: true, recursive: true }); await stat(path.join(distRoot, 'host-native/main.lynx.bundle')); await stat(path.join(distRoot, 'catalog-native/main.lynx.bundle')); await stat(path.join(distRoot, 'remote-native/mf-manifest.json')); @@ -159,6 +157,8 @@ try { 'OrbitControl.xcworkspace', '-scheme', 'OrbitControl', + '-configuration', + 'Release', '-destination', `platform=iOS Simulator,id=${deviceUDID}`, '-derivedDataPath', @@ -170,6 +170,7 @@ try { 'NO', '-only-testing:OrbitControlUITests/OrbitControlUITests/testFederatedImportsRuntimeLoadingAndSingleton', '-only-testing:OrbitControlUITests/OrbitControlUITests/testStandaloneCatalogRemoteBuildLaunches', + '-only-testing:OrbitControlUITests/OrbitControlUITests/testEmbeddedReleaseHostLaunches', ], { env: { @@ -179,25 +180,6 @@ try { }, }, ); - await run('xcodebuild', [ - 'test', - '-workspace', - 'OrbitControl.xcworkspace', - '-scheme', - 'OrbitControl', - '-configuration', - 'Release', - '-destination', - `platform=iOS Simulator,id=${deviceUDID}`, - '-derivedDataPath', - 'build/DerivedData', - '-resultBundlePath', - 'build/OrbitControl-Release.xcresult', - 'COMPILER_INDEX_STORE_ENABLE=NO', - '-parallel-testing-enabled', - 'NO', - '-only-testing:OrbitControlUITests/OrbitControlUITests/testEmbeddedReleaseHostLaunches', - ]); const remoteEntry = manifest.metaData.remoteEntry; const expected = [ From a7ea37f808ae7add7346ae282f1efd99b50a386d Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Sat, 18 Jul 2026 00:47:53 +0000 Subject: [PATCH 22/68] ci(lynx): retrigger iOS e2e From 94f3f42ab9d3b728ae9652fad6f6ad0565509c2e Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Sat, 18 Jul 2026 01:27:34 +0000 Subject: [PATCH 23/68] ci(lynx): retain release test diagnostics --- apps/lynx-module-federation-demo/test/ios-project.mjs | 1 + apps/lynx-module-federation-demo/test/ios/run.mjs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index a906ddf5906..38e0cb1d100 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -107,6 +107,7 @@ assert.match(syncScript, /sourceStatic/); assert.match(syncScript, /cp\(sourceStatic, destinationStatic/); assert.equal(iosRunner.match(/await run\(\s*'xcodebuild'/g)?.length, 1); assert.match(iosRunner, /'-configuration',\s*'Release'/); +assert.match(iosRunner, /build\/OrbitControl-Release\.xcresult/); for (const testName of [ 'testFederatedImportsRuntimeLoadingAndSingleton', 'testStandaloneCatalogRemoteBuildLaunches', diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index d35badc77df..31725939886 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -164,7 +164,7 @@ try { '-derivedDataPath', 'build/DerivedData', '-resultBundlePath', - 'build/OrbitControl.xcresult', + 'build/OrbitControl-Release.xcresult', 'COMPILER_INDEX_STORE_ENABLE=NO', '-parallel-testing-enabled', 'NO', From 4fb17c2ff09a261564df4c16493938a320638d22 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Sat, 18 Jul 2026 03:11:51 +0000 Subject: [PATCH 24/68] ci(metro): constrain android emulator partition --- .github/workflows/e2e-metro.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index 01b33b19692..7f984697114 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -114,7 +114,8 @@ jobs: emulator-boot-timeout: ${{ env.ANDROID_EMULATOR_BOOT_TIMEOUT }} force-avd-creation: false disable-animations: true - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + # Emulator 36.6 can ignore the AVD disk-size config unless this is explicit. + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -partition-size 1024 script: | node tools/scripts/run-metro-e2e.mjs --platform=android --appName=${{ env.METRO_APP_NAME }} --skip-rock-cache-auth From 2d05685a6d119c964dfa1bf6944ee32f18b270ab Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Mon, 20 Jul 2026 22:55:06 +0000 Subject: [PATCH 25/68] docs(lynx): define architecture refactor --- .../design/architecture-refactor.md | 287 ++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 apps/lynx-module-federation-demo/design/architecture-refactor.md diff --git a/apps/lynx-module-federation-demo/design/architecture-refactor.md b/apps/lynx-module-federation-demo/design/architecture-refactor.md new file mode 100644 index 00000000000..3c1eb8e5344 --- /dev/null +++ b/apps/lynx-module-federation-demo/design/architecture-refactor.md @@ -0,0 +1,287 @@ +# Lynx Federation Architecture Refactor Design + +## Status + +Approved in the Codex task on 2026-07-20. +Stored with the tracked Lynx demo design artifacts because repository `/docs` +is generated output. + +## Objective + +Refactor the Lynx Module Federation implementation and demos until the +architecture is direct, testable, and maintainable without changing the +already-proven behavior: + +- no eager shares; +- native Lynx, iOS, Web, and Node-compatible manifest loading; +- standalone Catalog and federated host flows; +- `asyncStartup` transport; +- native split and single-chunk remote bundles; +- `publicPath: 'auto'` on Web and resolved absolute native origins; +- real Web and iOS E2E coverage; +- optimized CI with retained diagnostics. + +The refactor must address every finding from the thermonuclear review and keep +the PR's public API and emitted artifact contracts stable. + +## Constraints + +- Prefer public Lynx/Rspeedy APIs. A private adapter is permitted only when no + exported configuration surface exists, and then it must be isolated, + version-bounded, and compatibility-tested. +- Preserve synchronous Lynx lazy-bundle thenable semantics. Converting the + official thenable to a native Promise is not behavior-preserving. +- Keep compilation-scoped data out of compiler/plugin-instance state. +- Do not add eager shares, new runtime dependencies, broad ATS exceptions, or + generated-source assertions to application E2E tests. +- Use test-driven development: every behavior change starts with a test that + fails for the intended reason. + +## Considered Approaches + +### 1. Minimal patches + +Fix the stale manifest URL, double-load guard, and destructive test output, but +leave the existing plugin boundaries intact. + +Rejected because it preserves hidden cross-plugin state and the complicated +lazy-load settlement model. It would make CI green without meeting the +maintainability objective. + +### 2. Boundary refactor (selected) + +Keep the proven compiler/runtime behavior, but make ownership explicit at each +boundary: public Rspeedy chain configuration, atomic manifest records, +per-compilation bundle state, one lazy-load controller, transactional React +state, isolated test output, and focused test harnesses. + +Selected because it deletes incidental coupling while preserving externally +observable behavior and allows each change to be proved independently. + +### 3. Single monolithic federation coordinator + +Replace the matcher, asset, manifest, and external bundle plugins with one +large plugin. + +Rejected because hook ordering would be more visible but responsibilities +would become less modular, and the rewrite risk is disproportionate to the +identified problems. + +## Architecture + +### Public Lynx cache-event configuration + +Rspeedy registers the exported `LynxCacheEventsPlugin` in the bundler chain as +`lynx:cache-events`. The federation adapter will configure that slot inside +`modifyBundlerChain` using the exported plugin and +`LynxCacheEventsPluginOptions`: + +```ts +chain.plugin('lynx:cache-events').use(LynxCacheEventsPlugin, [ + { setupListTransformer: () => [] }, +]); +``` + +This replaces `disableRemoteEntryEventCaching`, which currently reads a +protected `.options` field and reconstructs an already-instantiated plugin. +The public chain configuration is applied only for remote-bundle environments. +An adapter test will assert both the chain slot and options. No private API +fallback is required by the current Lynx/Rspeedy release. + +### Atomic manifest cache records + +`SnapshotHandler` will replace its parallel manifest and resolved-URL maps with +one record: + +```ts +interface ManifestCacheRecord { + manifest: Manifest; + resolvedUrl: string; +} +``` + +The record is committed only after `Response.json()` succeeds. A manifest +returned by `errorLoadRemote` uses the requested manifest URL unless that hook +eventually gains an explicit resolved URL contract. Cache clearing and +in-flight loading invalidation will be one `clearManifestCache` operation, so +remote removal cannot clear half the state. + +The SDK option will be renamed from the ambiguous `manifestUrl` to +`resolvedManifestUrl`. `generateSnapshotFromManifest` will derive one local +`publicPathUrl = resolvedManifestUrl ?? version` without a non-null assertion. + +Tests will cover: + +- redirected manifest success; +- failed JSON parsing followed by a response with an empty URL; +- `errorLoadRemote` manifest recovery after a redirected failure; +- cache invalidation and remote re-registration. + +### Per-compilation remote-bundle state + +Compilation data will move into a typed state object: + +```ts +interface RemoteBundleCompilationState { + discardedTemplateAssets: Set; + lazyBundleAssets: Set; + lazyBundleAssetByExpose: Map; + pairedBundleChunks: Set; + sourceAssets: AssetSnapshot[]; +} +``` + +A small `RemoteBundleCompilationStateStore` owns a +`WeakMap` and creates a fresh state +for each compilation. The chunk matcher, paired-assets phase, and external +bundle encoder receive the store and access state with the active +`Compilation`. They no longer share mutable arrays/maps/sets created in +`configureRemoteBundle`, and `externalBundle` no longer retains `sourceAssets` +at compiler scope. + +The existing plugins remain separate because their responsibilities are +distinct: + +- chunk matcher: identify lazy bundles and emit runtime matcher code; +- paired-assets plugin: rewrite paired background/main-thread assets; +- external-bundle plugin: snapshot, encode, preserve, and delete assets. + +A two-compilation watch-mode test will prove that the second compilation does +not observe assets from the first. + +### Explicit lazy-chunk load controller + +`loadLazyChunk` currently combines tuple slots, `active`, `insideLoader`, an +`ImmediateLazyLoad` box, a timeout, and a competing installation promise. +These responsibilities will move into one internal controller with explicit +states: + +```ts +type LazyChunkLoadState = + | { kind: 'loading' } + | { kind: 'waiting-consumes'; chunk: LynxChunk; consumes: Promise } + | { kind: 'installed'; chunk: LynxChunk } + | { kind: 'failed'; error: unknown }; +``` + +The controller owns the installed-chunk tuple, activity generation, timeout, +settlement, and rollback. It invokes the official `PromiseLike.then` directly, +so a synchronous Lynx thenable still installs modules and returns a +synchronously-observable thenable when no consumes are pending. All stale +completion checks are centralized in the controller rather than spread across +callbacks. + +Existing behavioral tests remain authoritative. The 901-line suite will be +split into: + +- `runtimeSectionLoading.test.ts`; +- `runtimeLazyBundleLoading.test.ts`; +- `runtimeChunkUrl.test.ts`; +- a small shared `runtimeChunkLoading.testUtils.ts`. + +### Transactional demo load state + +`useFederatedCatalog` will use one discriminated load state for the components, +error, shared-state proof, and readiness result. An `inFlightRef` stores the +single active load promise. Repeated taps return that promise instead of +starting another import or mutating the shared singleton twice. + +The import/validation transaction will live in a small framework-independent +`catalogLoadController.ts`. The React hook owns rendering state and delegates +deduplication and retry to that controller, so transaction behavior can be +tested without a component renderer or React lifecycle mocks. + +The transaction commits ready components and singleton evidence together. A +failed retry clears stale component data before the next transaction. Activity +and user-selected filtering remain separate UI concerns. + +Tests will prove rapid repeated calls share one import operation, failed loads +do not retain partial modules, and retry succeeds cleanly. + +### Isolated E2E output and shared server support + +`native-dev-server.mjs` will never rename or delete the canonical `dist`. +Build configs will accept an environment-provided output root, and the test +will build into a temporary directory removed in `finally`. + +Web and iOS harnesses will share a focused `test/support/artifact-server.mjs` +that owns static file serving, request recording, readiness polling, and clean +shutdown. Scenario assertions remain in their platform-specific runners. + +The Metro emulator partition size will be defined once as an environment value +and used for both AVD creation and the explicit emulator CLI flag. + +### Native iOS resource boundary + +The 396-line Objective-C fetcher will be decomposed around testable ownership: + +- `OrbitResourceURLResolver`: absolute/relative URL resolution, local-file + containment, and allowed local-network policy; +- `OrbitResourceStore`: bounded path cache and atomic data persistence; +- `OrbitResourceDownloader`: response-size enforcement, cancellation, and + temporary-file lifecycle; +- `OrbitResourceFetcher`: Lynx protocol adaptation and orchestration only. + +The production fetcher will depend on those collaborators. A new +`OrbitControlTests` target will exercise URL traversal/symlink rejection, +relative URL resolution, cache replacement and byte limits, oversized download +cancellation, and cleanup. The real UI tests remain the end-to-end proof that +the assembled fetcher loads standalone and federated bundles. + +The existing single Release `xcodebuild` invocation will include the +`OrbitControlTests` target as well as the three `OrbitControlUITests`, retaining +one compile while making the native boundary tests mandatory in CI. + +`ios-project.mjs` will retain structural policy checks for project wiring and +ATS configuration, but it will stop treating source-code regexes as behavioral +tests. + +### Artifact tests and compatibility wrapper + +Compiler-internal emitted-source assertions belong in `packages/lynx` tests, +where the adapter contract is controlled. Demo artifact tests will assert +public outputs: manifest fields, file existence, bundle counts, HTTP loading, +and runtime behavior. They will not depend on minifier text or wrapper order. + +The Rspack-canary Rspeedy wrapper remains isolated behind package scripts. The +README will document why it exists, the pinned upstream compatibility +constraint, and the condition for deleting it. + +## Error Handling and Invariants + +- Failed manifest parsing never publishes resolved-URL metadata. +- Cache invalidation removes the manifest record and in-flight load together. +- Each Rspack `Compilation` receives fresh mutable state. +- A lazy load settles or rolls back exactly once; stale generations cannot + mutate the chunk table. +- Repeated UI load requests share one in-flight transaction. +- Tests never move, overwrite, or delete canonical build artifacts. +- Native resource paths remain inside the allowed root after symlink + resolution, and downloads exceeding 64 MiB are cancelled and discarded. + +## Verification + +Each task will use red-green-refactor and the narrowest relevant test first. +The completed branch must pass: + +- runtime-core and SDK targeted regression tests; +- all `@module-federation/lynx` unit, type, build, and lint checks; +- demo project policy and artifact tests; +- local `e2e-lynx` parity including real Web E2E; +- real GitHub macOS Lynx iOS E2E and both Metro platform jobs; +- repository formatting and `git diff --check`; +- a fresh thermonuclear correctness and code-quality audit; +- every latest-head PR check. + +## Completion Criteria + +The refactor is complete only when: + +1. Every thermonuclear finding is removed or superseded by stronger evidence. +2. No production file crosses 1,000 lines and the 901-line test is decomposed. +3. No private Lynx plugin state is accessed. +4. Manifest URL metadata and compilation state are atomic and lifecycle-safe. +5. Lazy loading preserves synchronous thenables, timeout/retry, consumes, and + stale-load behavior with clearer state ownership. +6. Demo and native fetch behavior have direct tests rather than regex proxies. +7. Local and real-platform CI are green on the final commit. From 76b37abc273fc7cb65db427c5c8ef2a34f3ab3b2 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Mon, 20 Jul 2026 23:14:17 +0000 Subject: [PATCH 26/68] docs(lynx): plan architecture refactor --- .../design/architecture-refactor-plan.md | 683 ++++++++++++++++++ 1 file changed, 683 insertions(+) create mode 100644 apps/lynx-module-federation-demo/design/architecture-refactor-plan.md diff --git a/apps/lynx-module-federation-demo/design/architecture-refactor-plan.md b/apps/lynx-module-federation-demo/design/architecture-refactor-plan.md new file mode 100644 index 00000000000..b29be711b5f --- /dev/null +++ b/apps/lynx-module-federation-demo/design/architecture-refactor-plan.md @@ -0,0 +1,683 @@ +# Lynx Federation Architecture Refactor Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use +> `superpowers:executing-plans` to implement this plan task-by-task. Steps use +> checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Remove every thermonuclear architecture finding from the Lynx Module +Federation implementation while preserving native, iOS, Web, Node, and CI +behavior. + +**Architecture:** Replace private or implicit state with public, typed +boundaries: Rspeedy chain configuration for cache events, atomic manifest cache +records, per-compilation bundle state, and an explicit lazy-load controller. +Move demo and iOS behavior behind directly testable collaborators, then prove +the assembled product with existing real E2E paths. + +**Tech Stack:** TypeScript, Rspack/Rspeedy, Module Federation runtime-core, +Rstest, Node ESM test runners, Objective-C/XCTest, GitHub Actions, pnpm/Turbo. + +## Global Constraints + +- Node.js `24`, pnpm `10.28.0`, and Turbo are required by repository CI. +- Preserve `asyncStartup`, no eager shares, and existing emitted bundle names. +- Web may use `publicPath: 'auto'`; native requires explicit + `LYNX_REMOTE_ORIGIN`-derived origins. +- Preserve synchronous Lynx `PromiseLike` lazy-bundle behavior. +- Do not add dependencies, broad ATS exceptions, or private Lynx plugin field + access. +- Every production behavior change starts with a test that fails for the + intended reason. +- Keep all new production files below 1,000 lines and split the existing + 901-line runtime chunk test by responsibility. + +--- + +## File Ownership + +| File | Responsibility after refactor | +| --- | --- | +| `packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts` | Atomic requested-URL → manifest/resolved-URL cache records. | +| `packages/sdk/src/generateSnapshotFromManifest.ts` | Typed public-path base URL option. | +| `packages/lynx/src/plugin.ts` | Public Rspeedy chain configuration and adapter orchestration only. | +| `packages/lynx/src/remoteBundleCompilationState.ts` | Fresh, typed state per Rspack `Compilation`. | +| `packages/lynx/src/chunkLoadingMatcher.ts` | Template hooks and runtime matcher generation. | +| `packages/lynx/src/externalBundle.ts` | Asset snapshot/encode/delete phase using compilation state. | +| `packages/lynx/src/remoteBundle.ts` | Remote plan validation and plugin composition. | +| `packages/lynx/src/lazyChunkLoadController.ts` | Synchronous-thenable-safe lazy chunk settlement state machine. | +| `packages/lynx/src/runtimeChunkLoading.ts` | Container patch and section-vs-lazy dispatch. | +| `apps/.../src/app/catalogLoadController.ts` | Framework-independent remote-load transaction. | +| `apps/.../src/app/useFederatedCatalog.ts` | React state projection and one in-flight transaction reference. | +| `apps/.../test/support/artifact-server.mjs` | Shared static artifact serving, request tracing, and shutdown. | +| `apps/.../ios/OrbitControl/OrbitResource*.{h,m}` | Resolver, store, downloader, and Lynx protocol adapter boundaries. | + +## Task 1: Make manifest URL caching atomic + +**Files:** + +- Modify: `packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts:75-435` +- Modify: `packages/runtime-core/src/remote/index.ts:697-716` +- Modify: `packages/runtime-core/__tests__/snapshot.spec.ts` +- Modify: `packages/sdk/src/generateSnapshotFromManifest.ts:12-82` +- Modify: `packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts` + +**Interfaces:** + +- Consumes: requested `manifestUrl`, `Response.url`, and `errorLoadRemote`. +- Produces: `clearManifestCache(manifestUrl): void` clearing manifest record and + in-flight work; `resolvedManifestUrl?: string` SDK option. + +- [ ] **Step 1: Add failing runtime-core regressions.** + + Add tests that make the first response expose a redirect URL and fail JSON + parsing, then recover through `errorLoadRemote` and assert the snapshot uses + the requested URL rather than the stale redirect. Add a second test that + removes/re-registers the remote and verifies both cache data and loading + promise are absent. + + ```ts + expect(snapshot.remoteEntry).toContain('requested.example'); + expect(handler.manifestCache.has(manifestUrl)).toBe(false); + ``` + +- [ ] **Step 2: Run the regression tests red.** + + Run: `pnpm --filter @module-federation/runtime-core exec rstest run __tests__/snapshot.spec.ts` + + Expected: FAIL because `manifestResolvedUrlCache` is written before + `Response.json()` succeeds. + +- [ ] **Step 3: Replace parallel caches with one record.** + + Introduce: + + ```ts + interface ManifestCacheRecord { + manifest: Manifest; + resolvedUrl: string; + } + ``` + + Parse the response first, then cache `{ manifest, resolvedUrl: res.url || + manifestUrl }`. Cache hook-recovered manifests with `resolvedUrl: + manifestUrl`. Make `clearManifestCache` remove the record and + `manifestLoading[manifestUrl]`; remove the second deletion from + `RemoteHandler.removeRemote`. + +- [ ] **Step 4: Rename the SDK boundary and add its failing test.** + + Change the options shape and test it: + + ```ts + generateSnapshotFromManifest(manifest, { + version: 'https://requested.example/mf-manifest.json', + resolvedManifestUrl: 'https://redirected.example/v2/mf-manifest.json', + }); + ``` + + The expected public path is `https://redirected.example/v2/`. + +- [ ] **Step 5: Run the targeted tests green.** + + Run: `pnpm --filter @module-federation/runtime-core exec rstest run __tests__/snapshot.spec.ts` + + Run: `pnpm --filter @module-federation/sdk exec rstest run __tests__/generateSnapshotFromManifest.spec.ts` + + Expected: both pass, including redirect, recovery, and invalidation cases. + +- [ ] **Step 6: Commit the atomic cache boundary.** + + ```bash + git add packages/runtime-core packages/sdk + git commit -m "fix(runtime): make manifest URL caching atomic" + ``` + +## Task 2: Use the public Rspeedy cache-events configuration surface + +**Files:** + +- Modify: `packages/lynx/src/plugin.ts:1-183` +- Modify: `packages/lynx/src/plugin.remoteBundle.test.ts` +- Modify: `packages/lynx/src/plugin.testUtils.ts` + +**Interfaces:** + +- Consumes: bundler-chain plugin slot `lynx:cache-events` and exported + `LynxCacheEventsPlugin` / `LynxCacheEventsPluginOptions`. +- Produces: remote-bundle-only `setupListTransformer: () => []` configuration + without reading plugin instance fields. + +- [ ] **Step 1: Add a failing adapter test.** + + Extend the fake bundler chain with a recorded `plugin(name).use(Plugin, + args)` call. Assert a remote bundle config records: + + ```ts + expect(cacheEventsUse).toEqual([ + LynxCacheEventsPlugin, + [{ setupListTransformer: expect.any(Function) }], + ]); + expect(cacheEventsUse[1][0].setupListTransformer(['event'])).toEqual([]); + ``` + + Assert a non-remote host does not override the slot. + +- [ ] **Step 2: Run the adapter test red.** + + Run: `pnpm --filter @module-federation/lynx exec rstest run src/plugin.remoteBundle.test.ts` + + Expected: FAIL because the current implementation mutates `config.plugins` + after bundler-chain configuration. + +- [ ] **Step 3: Configure the public chain slot.** + + Import the exported class as a value. In `modifyBundlerChain`, after the + environment and remote-bundle checks, apply: + + ```ts + chain.plugin('lynx:cache-events').use(LynxCacheEventsPlugin, [ + { setupListTransformer: () => [] }, + ]); + ``` + + Delete `disableRemoteEntryEventCaching`, its protected-options cast, and its + call from `modifyRspackConfig`. + +- [ ] **Step 4: Run the adapter tests green.** + + Run: `pnpm --filter @module-federation/lynx exec rstest run src/plugin.remoteBundle.test.ts` + + Expected: PASS; no test reads `.options`. + +- [ ] **Step 5: Commit the public configuration boundary.** + + ```bash + git add packages/lynx/src/plugin.ts packages/lynx/src/plugin.remoteBundle.test.ts packages/lynx/src/plugin.testUtils.ts + git commit -m "refactor(lynx): configure cache events through rspeedy" + ``` + +## Task 3: Give each compilation explicit remote-bundle state + +**Files:** + +- Create: `packages/lynx/src/remoteBundleCompilationState.ts` +- Modify: `packages/lynx/src/chunkLoadingMatcher.ts` +- Modify: `packages/lynx/src/externalBundle.ts` +- Modify: `packages/lynx/src/remoteBundle.ts` +- Modify: `packages/lynx/src/chunkLoadingMatcher.test.ts` +- Modify: `packages/lynx/src/plugin.remoteBundle.test.ts` + +**Interfaces:** + +- Produces: + + ```ts + export interface RemoteBundleCompilationState { + discardedTemplateAssets: Set; + lazyBundleAssets: Set; + lazyBundleAssetByExpose: Map; + pairedBundleChunks: Set; + sourceAssets: Array<{ content: string; name: string }>; + } + export const createRemoteBundleCompilationStateStore: () => { + for(compilation: Compilation): RemoteBundleCompilationState; + }; + ``` + +- [ ] **Step 1: Add a failing fresh-compilation test.** + + Drive the matcher hooks for two distinct fake compilations. Add an asset to + the first state, then assert the second state starts with empty sets/maps and + cannot preserve the first compilation's lazy asset. + +- [ ] **Step 2: Run it red.** + + Run: `pnpm --filter @module-federation/lynx exec rstest run src/chunkLoadingMatcher.test.ts` + + Expected: FAIL because state is currently allocated in `configureRemoteBundle` + and shared through plugin options. + +- [ ] **Step 3: Create the state store and thread it through plugins.** + + Use a `WeakMap`. Clear nothing + manually at `thisCompilation`; retrieve the fresh state from the store. + Replace mutable option fields with `stateStore`. Make the external-bundle + process-assets hook assign `state.sourceAssets`, and make its emit hook read + the same compilation's state. Store paired chunks in a `Set`. + +- [ ] **Step 4: Preserve plugin responsibilities.** + + Keep matcher, paired-assets, and encoder plugins separate. `remoteBundle.ts` + creates exactly one store per configured remote bundle and passes it to all + three plugins. No plugin instance may retain compilation asset arrays. + +- [ ] **Step 5: Run the focused suite green.** + + Run: `pnpm --filter @module-federation/lynx exec rstest run src/chunkLoadingMatcher.test.ts src/externalBundle.test.ts src/plugin.remoteBundle.test.ts` + + Expected: PASS, including fresh compilation state. + +- [ ] **Step 6: Commit compilation state ownership.** + + ```bash + git add packages/lynx/src/remoteBundleCompilationState.ts packages/lynx/src/chunkLoadingMatcher.ts packages/lynx/src/externalBundle.ts packages/lynx/src/remoteBundle.ts packages/lynx/src/*.test.ts + git commit -m "refactor(lynx): isolate remote bundle compilation state" + ``` + +## Task 4: Replace lazy-chunk flag soup with a controller and focused suites + +**Files:** + +- Create: `packages/lynx/src/lazyChunkLoadController.ts` +- Create: `packages/lynx/src/runtimeChunkLoading.testUtils.ts` +- Create: `packages/lynx/src/runtimeSectionLoading.test.ts` +- Create: `packages/lynx/src/runtimeLazyBundleLoading.test.ts` +- Create: `packages/lynx/src/runtimeChunkUrl.test.ts` +- Modify: `packages/lynx/src/runtimeChunkLoading.ts` +- Delete: `packages/lynx/src/runtimeChunkLoading.test.ts` + +**Interfaces:** + +- Consumes: `LynxChunk`, `InstalledChunk`, `installChunkAfterConsumes`, and + `loadWithTimeout`. +- Produces: + + ```ts + export const createLazyChunkLoadController = (args: { + chunkKey: string; + installedChunks: Record; + timeout: number; + }) => ({ load(request: string): ChunkPromise }); + ``` + +- [ ] **Step 1: Split existing tests without changing assertions.** + + Move section-load tests to `runtimeSectionLoading.test.ts`, lazy thenable/ + consumes/retry/timeout tests to `runtimeLazyBundleLoading.test.ts`, and URL + cases to `runtimeChunkUrl.test.ts`. Move `createWebpackRequire`, registry, + and synchronous-thenable helpers into `runtimeChunkLoading.testUtils.ts`. + +- [ ] **Step 2: Add a failing controller behavior test.** + + Add a synchronous thenable test that asserts module installation and observer + callback occur before the current stack returns when no consumes are pending. + Add a stale timed-out load test that cannot delete a later retry's tuple. + +- [ ] **Step 3: Run only the new lazy suite red.** + + Run: `pnpm --filter @module-federation/lynx exec rstest run src/runtimeLazyBundleLoading.test.ts` + + Expected: FAIL because `createLazyChunkLoadController` does not exist. + +- [ ] **Step 4: Implement explicit settlement.** + + Give the controller one discriminated state and generation identity. It must + call the Lynx `PromiseLike.then` directly, install synchronous chunks before + returning, wait for consumes before completion, race only the owned tuple + against its primary load, and delete the tuple only when it still owns it. + +- [ ] **Step 5: Reduce `runtimeChunkLoading.ts` to dispatch.** + + Keep URL joining, section loading, registry lookup, and handler replacement + there. Delegate the lazy branch to the controller. Delete `active`, + `insideLoader`, `ImmediateLazyLoad`, and their scattered settlement paths. + +- [ ] **Step 6: Run all chunk suites green.** + + Run: `pnpm --filter @module-federation/lynx exec rstest run src/runtimeSectionLoading.test.ts src/runtimeLazyBundleLoading.test.ts src/runtimeChunkUrl.test.ts` + + Expected: PASS; no test file exceeds 500 lines. + +- [ ] **Step 7: Commit the lazy-load controller.** + + ```bash + git add packages/lynx/src/lazyChunkLoadController.ts packages/lynx/src/runtimeChunkLoading.ts packages/lynx/src/runtime*Loading.test.ts + git commit -m "refactor(lynx): isolate lazy chunk load settlement" + ``` + +## Task 5: Make demo loading transactional and directly testable + +**Files:** + +- Create: `apps/lynx-module-federation-demo/src/app/catalogLoadController.ts` +- Create: `apps/lynx-module-federation-demo/src/app/catalogLoadController.test.ts` +- Modify: `apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts` +- Modify: `apps/lynx-module-federation-demo/src/app/App.tsx` + +**Interfaces:** + +- Produces: + + ```ts + export type CatalogLoadResult = { + activityFeed: ComponentType; + card: ComponentType; + details: ComponentType; + sharedState: SharedStateView; + singletonShared: boolean; + }; + export const createCatalogLoadController = (dependencies) => ({ load(): Promise }); + ``` + +- [ ] **Step 1: Add failing controller tests.** + + Call `load()` twice before resolving dependencies and assert each call returns + the same promise and each remote import runs once. Reject one load after + partial imports, then resolve a retry and assert no stale result is returned. + +- [ ] **Step 2: Run them red.** + + Run: `pnpm --filter lynx-module-federation-demo exec rstest run src/app/catalogLoadController.test.ts` + + Expected: FAIL because the controller module is absent. + +- [ ] **Step 3: Implement the framework-independent transaction.** + + Inject `loadCompiledImportRemotes`, `loadRuntimeActivityFeed`, and shared + state functions. Cache one in-flight promise; clear it after settlement; + validate singleton identity once per successful controller lifetime. + +- [ ] **Step 4: Project controller results through a discriminated hook state.** + + Replace independent component/error/ready state with `idle`, `loading`, + `ready`, and `error` records. The hook retains an `inFlightRef`, clears + components on error, and maps a successful result to UI activity atomically. + Make `LoadButton` ignore taps while `loading` or `ready`. + +- [ ] **Step 5: Run tests green and build the app.** + + Run: `pnpm --filter lynx-module-federation-demo exec rstest run src/app/catalogLoadController.test.ts` + + Run: `pnpm --filter lynx-module-federation-demo run build` + + Expected: PASS and host compiles. + +- [ ] **Step 6: Commit transactional demo loading.** + + ```bash + git add apps/lynx-module-federation-demo/src/app + git commit -m "refactor(lynx-demo): serialize remote loading" + ``` + +## Task 6: Isolate artifact serving and native dev output + +**Files:** + +- Create: `apps/lynx-module-federation-demo/test/support/artifact-server.mjs` +- Create: `apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs` +- Modify: `apps/lynx-module-federation-demo/test/native-dev-server.mjs` +- Modify: `apps/lynx-module-federation-demo/test/real-web/run.mjs` +- Modify: `apps/lynx-module-federation-demo/test/ios/run.mjs` +- Modify: `apps/lynx-module-federation-demo/lynx*.config.mjs` +- Modify: `apps/lynx-module-federation-demo/test/native-artifacts.mjs` + +**Interfaces:** + +- Produces: + + ```js + export const createArtifactServer = async ({ root, routes = {} }) => ({ + origin, + requests, + waitFor(url, timeout), + close(), + }); + ``` + +- [ ] **Step 1: Add failing artifact-server tests.** + + Serve a temporary root, request an artifact, assert path traversal is denied, + request trace records the path/status, and `close()` releases the server. + +- [ ] **Step 2: Run them red.** + + Run: `node --test apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs` + + Expected: FAIL because the server module is absent. + +- [ ] **Step 3: Implement the focused server.** + + Resolve requested paths beneath `root`, reject escapes, record every request, + serve explicit dynamic routes before files, and make shutdown idempotent. + +- [ ] **Step 4: Add environment-controlled output roots.** + + Each Lynx demo config derives `output.path` from `LYNX_OUTPUT_ROOT` when set, + otherwise preserves the existing `dist/*` path. In + `native-dev-server.mjs`, create one `mkdtemp` output root and pass it to all + build/dev children. Delete only that directory in `finally`; remove all + `rename(distRoot, ...)` calls. + +- [ ] **Step 5: Replace generated-source proxy assertions.** + + Keep `native-artifacts.mjs` assertions at public boundaries: manifest schema, + expected remote/container/lazy files, bundle count, and loadability through + the server. Move compiler-source behavior assertions into `packages/lynx` + unit tests. + +- [ ] **Step 6: Migrate Web and iOS runners.** + + Use `createArtifactServer` in real-Web and iOS runners while retaining each + scenario's current assertions and diagnostics. + +- [ ] **Step 7: Run focused E2E checks green.** + + Run: `node --test apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs` + + Run: `pnpm --dir apps/lynx-module-federation-demo run test:native-dev-server` + + Run: `pnpm --dir apps/lynx-module-federation-demo run e2e:web` + + Expected: PASS; canonical `apps/lynx-module-federation-demo/dist` remains + untouched before and after native dev-server testing. + +- [ ] **Step 8: Commit isolated E2E infrastructure.** + + ```bash + git add apps/lynx-module-federation-demo/test apps/lynx-module-federation-demo/*.config.mjs + git commit -m "refactor(lynx-demo): isolate artifact test output" + ``` + +## Task 7: Decompose the native iOS resource boundary and add XCTest coverage + +**Files:** + +- Create: `apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.{h,m}` +- Create: `apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.{h,m}` +- Create: `apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.{h,m}` +- Create: `apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m` +- Modify: `apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.{h,m}` +- Modify: `apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj` +- Modify: `apps/lynx-module-federation-demo/test/ios-project.mjs` +- Modify: `apps/lynx-module-federation-demo/test/ios/run.mjs` + +**Interfaces:** + +- Produces: + + ```objc + @interface OrbitResourceURLResolver : NSObject + - (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL; + - (NSURL *)resolvedURLForString:(NSString *)urlString; + - (BOOL)isAllowedLocalURL:(NSURL *)url; + @end + ``` + + ```objc + @interface OrbitResourceStore : NSObject + - (NSString *)pathForURLString:(NSString *)urlString; + - (NSString *)storeData:(NSData *)data forURLString:(NSString *)urlString error:(NSError **)error; + @end + ``` + +- [ ] **Step 1: Create failing XCTest cases.** + + Test relative URL resolution, `../` and symlink escape rejection, approved + loopback URLs, cache replacement under the 64 MiB limit, oversize download + cancellation, and temporary-file cleanup. + +- [ ] **Step 2: Add the test target and run it red.** + + Add `OrbitControlTests` to the Xcode project and include: + + ```bash + -only-testing:OrbitControlTests + ``` + + in the existing Release `xcodebuild` invocation. + + Run: `pnpm --filter lynx-module-federation-demo run test:ios-project` + + Expected: FAIL until the source/target wiring and collaborators exist. + +- [ ] **Step 3: Extract resolver and store.** + + Move URL conversion and local containment into + `OrbitResourceURLResolver`; move cache paths, atomic persistence, and byte + accounting into `OrbitResourceStore`. Preserve the current 64 MiB limits and + errors exactly. + +- [ ] **Step 4: Extract injectable downloader.** + + Move `NSURLSessionDownloadDelegate` coordination into + `OrbitResourceDownloader`; accept an injected session configuration for + XCTest's custom `NSURLProtocol`. Cancel and delete when expected or received + bytes exceed the limit. + +- [ ] **Step 5: Reduce fetcher to Lynx adaptation.** + + `OrbitResourceFetcher` selects local vs remote paths, invokes the resolver, + store, and downloader, and completes Lynx requests. It owns no URL policy, + cache accounting, or download delegate maps. + +- [ ] **Step 6: Replace regex behavior proxies with structural checks.** + + `ios-project.mjs` checks the Xcode target, files, single Release command, + all test target selectors, and ATS policy. Remove assertions that merely + search Objective-C source for implementation strings. + +- [ ] **Step 7: Run policy and real iOS tests green.** + + Run: `pnpm --filter lynx-module-federation-demo run test:ios-project` + + Run: `pnpm run ci:local --only=e2e-lynx` + + Expected: policy test passes locally; macOS CI runs `OrbitControlTests` plus + the three existing UI tests in one Release build. + +- [ ] **Step 8: Commit the native resource boundaries.** + + ```bash + git add apps/lynx-module-federation-demo/ios apps/lynx-module-federation-demo/test/ios-project.mjs apps/lynx-module-federation-demo/test/ios/run.mjs + git commit -m "refactor(lynx-ios): isolate resource loading boundaries" + ``` + +## Task 8: Document compatibility and remove CI configuration drift + +**Files:** + +- Modify: `apps/lynx-module-federation-demo/README.md` +- Modify: `apps/lynx-module-federation-demo/package.json` +- Create: `apps/lynx-module-federation-demo/test/ci-policy.mjs` +- Modify: `.github/workflows/e2e-metro.yml` +- Modify: `.github/workflows/e2e-lynx.yml` +- Modify: `apps/lynx-module-federation-demo/test/ios-project.mjs` + +**Interfaces:** + +- Produces: one documented `rspack-canary-rspeedy.mjs` compatibility boundary; + one `ANDROID_EMULATOR_PARTITION_SIZE_MB` environment value. + +- [ ] **Step 1: Add a failing workflow policy assertion.** + + Create `test/ci-policy.mjs` and expose it as `test:ci-policy`. Require + `ANDROID_EMULATOR_PARTITION_SIZE_MB` and reject a second literal partition + value in emulator options. + +- [ ] **Step 2: Run it red.** + + Run: `pnpm --dir apps/lynx-module-federation-demo run test:ci-policy` + + Expected: the dedicated policy assertion fails until the workflow uses one + environment value. + +- [ ] **Step 3: Derive both emulator settings from one value.** + + Set `ANDROID_EMULATOR_PARTITION_SIZE_MB: 1024`; use + `${{ env.ANDROID_EMULATOR_PARTITION_SIZE_MB }}M` for `disk-size` and + `-partition-size ${{ env.ANDROID_EMULATOR_PARTITION_SIZE_MB }}` for emulator + options. + +- [ ] **Step 4: Document the wrapper.** + + Explain the canary wrapper's upstream resolution constraint, commands that + own it, and the exact removal condition: Rspeedy must support the repository + Rspack package directly. Do not expose wrapper imports to application code. + +- [ ] **Step 5: Verify formatting and policy.** + + Run: `pnpm exec prettier --check .github/workflows/e2e-metro.yml apps/lynx-module-federation-demo/README.md` + + Run: `pnpm --dir apps/lynx-module-federation-demo run test:ci-policy` + + Run: `git diff --check` + + Expected: PASS. + +- [ ] **Step 6: Commit compatibility documentation and CI consistency.** + + ```bash + git add .github/workflows/e2e-metro.yml apps/lynx-module-federation-demo/README.md apps/lynx-module-federation-demo/package.json apps/lynx-module-federation-demo/test/ci-policy.mjs + git commit -m "docs(lynx): document rspeedy compatibility boundary" + ``` + +## Task 9: Full verification, simplification, and final review + +**Files:** + +- Modify only files required by failures from prior tasks. +- Test: all touched package, demo, local CI, and GitHub CI jobs. + +- [ ] **Step 1: Run package validation.** + + ```bash + pnpm exec turbo run build --filter=@module-federation/runtime-core --filter=@module-federation/sdk --filter=@module-federation/lynx + pnpm exec turbo run test --filter=@module-federation/runtime-core --filter=@module-federation/sdk --filter=@module-federation/lynx --force + pnpm exec turbo run lint --filter=@module-federation/runtime-core --filter=@module-federation/sdk --filter=@module-federation/lynx + ``` + +- [ ] **Step 2: Run demo CI parity.** + + ```bash + TURBO_ENV_MODE=loose CHOKIDAR_USEPOLLING=true pnpm run ci:local --only=e2e-lynx + pnpm run ci:local --only=build-and-test + ``` + +- [ ] **Step 3: Run final simplification audit.** + + Check that no private `.options` access, shared compilation collections, + generated-output assertions, test skips, eager shares, or files above 1,000 + lines remain in the refactored scope. Run `git diff --check` and scoped + Prettier. + +- [ ] **Step 4: Push and monitor final GitHub CI.** + + Push the branch, confirm all latest-head checks, including `e2e-lynx-ios`, + `e2e-metro-android`, and `e2e-metro-ios`, are green, and inspect failed logs + before declaring completion. + +- [ ] **Step 5: Commit any final scoped fixes.** + + ```bash + git add + git commit -m "fix(lynx): complete architecture refactor" + ``` + +## Plan Self-Review + +- Spec coverage: Tasks 1–8 map directly to every approved architecture + section; Task 9 proves all completion criteria. +- Placeholders: no deferred or ambiguous implementation steps remain. +- Type consistency: manifest records, compilation state, lazy controller, + catalog result, artifact server, and iOS collaborators are named consistently + across producer and consumer tasks. From edd28cf66c08a227043724132c67e42f31d1c3d9 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Mon, 20 Jul 2026 23:39:16 +0000 Subject: [PATCH 27/68] fix(runtime): make manifest URL caching atomic --- .../__tests__/register-remotes.spec.ts | 51 ++++++++++++++++ .../runtime-core/__tests__/snapshot.spec.ts | 58 +++++++++++++++++++ .../src/plugins/snapshot/SnapshotHandler.ts | 32 +++++----- packages/runtime-core/src/remote/index.ts | 8 +-- .../generateSnapshotFromManifest.spec.ts | 10 ++-- packages/sdk/rstest.config.ts | 17 ++++++ .../sdk/src/generateSnapshotFromManifest.ts | 14 +++-- 7 files changed, 162 insertions(+), 28 deletions(-) create mode 100644 packages/sdk/rstest.config.ts diff --git a/packages/runtime-core/__tests__/register-remotes.spec.ts b/packages/runtime-core/__tests__/register-remotes.spec.ts index c7789536191..8082316b15c 100644 --- a/packages/runtime-core/__tests__/register-remotes.spec.ts +++ b/packages/runtime-core/__tests__/register-remotes.spec.ts @@ -209,4 +209,55 @@ describe('ModuleFederation', () => { expect(await nextAppModule()).toBe('hello world "@snapshot/remote2"'); expect(manifestFetch).toHaveBeenCalledTimes(2); }); + + it('clears manifest cache and loading when a manifest remote is force re-registered', async () => { + const manifestUrl = 'https://requested.example/mf-manifest.json'; + const response = new Response( + JSON.stringify({ + id: 'catalog', + name: 'catalog', + metaData: { + name: 'catalog', + publicPath: 'https://requested.example/', + type: 'app', + buildInfo: { buildVersion: '1.0.0' }, + remoteEntry: { + name: 'catalog.web.lynx.bundle', + path: '', + type: 'global', + }, + types: { name: '', path: '' }, + globalName: 'catalog', + }, + remotes: [], + shared: [], + exposes: [], + }), + { headers: { 'Content-Type': 'application/json' } }, + ); + const instance = new ModuleFederation({ + name: 'host', + remotes: [{ name: 'catalog', entry: manifestUrl }], + plugins: [ + { + name: 'manifest-fetch', + fetch: async () => response, + }, + ], + }); + const handler = instance.snapshotHandler; + + await handler.loadRemoteSnapshotInfo({ + moduleInfo: { name: 'catalog', entry: manifestUrl }, + }); + expect(handler.manifestCache.has(manifestUrl)).toBe(true); + expect(handler.manifestLoading[manifestUrl]).toBeDefined(); + + instance.registerRemotes([{ name: 'catalog', entry: manifestUrl }], { + force: true, + }); + + expect(handler.manifestCache.has(manifestUrl)).toBe(false); + expect(handler.manifestLoading[manifestUrl]).toBeUndefined(); + }); }); diff --git a/packages/runtime-core/__tests__/snapshot.spec.ts b/packages/runtime-core/__tests__/snapshot.spec.ts index 24c74506738..ff543a71a4c 100644 --- a/packages/runtime-core/__tests__/snapshot.spec.ts +++ b/packages/runtime-core/__tests__/snapshot.spec.ts @@ -98,4 +98,62 @@ describe('snapshot', () => { remoteEntry: 'catalog.web.lynx.bundle', }); }); + + it('uses the requested manifest URL after parse recovery', async () => { + const manifestUrl = 'https://requested.example/mf-manifest.json'; + const resolvedManifestUrl = + 'https://redirected.example/v2/mf-manifest.json'; + const recoveredManifest = { + id: 'catalog', + name: 'catalog', + metaData: { + name: 'catalog', + publicPath: 'auto', + type: 'app', + buildInfo: { buildVersion: '1.0.0' }, + remoteEntry: { + name: 'catalog.web.lynx.bundle', + path: 'https://requested.example/', + type: 'global', + }, + types: { name: '', path: '' }, + globalName: 'catalog', + }, + remotes: [], + shared: [], + exposes: [], + }; + const response = new Response('invalid manifest'); + Object.defineProperty(response, 'url', { value: resolvedManifestUrl }); + Object.defineProperty(response, 'json', { + value: async () => { + throw new Error('invalid manifest'); + }, + }); + + const instance = new ModuleFederation({ + name: 'host', + remotes: [{ name: 'catalog', entry: manifestUrl }], + plugins: [ + { + name: 'failed-manifest-fetch', + fetch: async () => response, + }, + { + name: 'manifest-recovery', + errorLoadRemote: () => recoveredManifest, + }, + ], + }); + + const { remoteSnapshot } = + await instance.snapshotHandler.loadRemoteSnapshotInfo({ + moduleInfo: { name: 'catalog', entry: manifestUrl }, + }); + + expect(remoteSnapshot).toMatchObject({ + publicPath: 'https://requested.example/', + }); + expect(remoteSnapshot?.remoteEntry).toContain('requested.example'); + }); }); diff --git a/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts b/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts index 8a5ea2d80ff..4dc3464e6cf 100644 --- a/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts +++ b/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts @@ -71,11 +71,15 @@ export function getGlobalRemoteInfo( }; } +interface ManifestCacheRecord { + manifest: Manifest; + resolvedUrl: string; +} + export class SnapshotHandler { loadingHostSnapshot: Promise | null = null; HostInstance: ModuleFederation; - manifestCache: Map = new Map(); - private manifestResolvedUrlCache: Map = new Map(); + manifestCache: Map = new Map(); hooks = new PluginSystem({ beforeLoadRemoteSnapshot: new AsyncHook< [ @@ -121,7 +125,7 @@ export class SnapshotHandler { clearManifestCache(manifestUrl: string): void { this.manifestCache.delete(manifestUrl); - this.manifestResolvedUrlCache.delete(manifestUrl); + delete this.manifestLoading[manifestUrl]; } // eslint-disable-next-line max-lines-per-function @@ -304,11 +308,12 @@ export class SnapshotHandler { ): Promise { const getManifest = async (): Promise => { const remoteInfo = getRemoteInfo(moduleInfo); - let manifestJson: Manifest | undefined = - this.manifestCache.get(manifestUrl); - if (manifestJson) { - return manifestJson; + const cachedManifest = this.manifestCache.get(manifestUrl); + if (cachedManifest) { + return cachedManifest.manifest; } + let manifestJson: Manifest | undefined; + let resolvedUrl = manifestUrl; try { let res = await this.loaderHook.lifecycle.fetch.emit( manifestUrl, @@ -325,10 +330,8 @@ export class SnapshotHandler { if (!res || !(res instanceof Response)) { res = await fetch(manifestUrl, {}); } - if (res.url) { - this.manifestResolvedUrlCache.set(manifestUrl, res.url); - } manifestJson = (await res.json()) as Manifest; + resolvedUrl = res.url || manifestUrl; } catch (err) { manifestJson = (await this.HostInstance.remoteHandler.hooks.lifecycle.errorLoadRemote.emit( @@ -392,7 +395,10 @@ export class SnapshotHandler { optionsToMFContext(this.HostInstance.options), ); } - this.manifestCache.set(manifestUrl, manifestJson); + this.manifestCache.set(manifestUrl, { + manifest: manifestJson, + resolvedUrl, + }); return manifestJson; }; @@ -417,8 +423,8 @@ export class SnapshotHandler { ); const remoteSnapshot = generateSnapshotFromManifest(manifestJson, { version: manifestUrl, - manifestUrl: - this.manifestResolvedUrlCache.get(manifestUrl) ?? manifestUrl, + resolvedManifestUrl: + this.manifestCache.get(manifestUrl)?.resolvedUrl ?? manifestUrl, }); const { remoteSnapshot: remoteSnapshotRes } = diff --git a/packages/runtime-core/src/remote/index.ts b/packages/runtime-core/src/remote/index.ts index 9b2c9e20460..a298cf58af3 100644 --- a/packages/runtime-core/src/remote/index.ts +++ b/packages/runtime-core/src/remote/index.ts @@ -6,12 +6,7 @@ import { GlobalModuleInfo, } from '@module-federation/sdk'; import { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes'; -import { - Global, - getInfoWithoutType, - globalLoading, - CurrentGlobal, -} from '../global'; +import { getInfoWithoutType, globalLoading, CurrentGlobal } from '../global'; import { Options, UserOptions, @@ -712,7 +707,6 @@ export class RemoteHandler { if ('entry' in remote) { host.snapshotHandler.clearManifestCache(remote.entry); - delete Global.__FEDERATION__.__MANIFEST_LOADING__[remote.entry]; } const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host); diff --git a/packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts b/packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts index 4de44489585..bbdbea8e562 100644 --- a/packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts +++ b/packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts @@ -53,13 +53,15 @@ describe('generateSnapshotFromManifest', () => { const remoteSnapshot = generateSnapshotFromManifest( manifestWithAutoPublicPath, { - version: '/remote-web/mf-manifest.json', - manifestUrl: 'https://example.test/remote-web/mf-manifest.json', + version: 'https://requested.example/mf-manifest.json', + resolvedManifestUrl: 'https://redirected.example/v2/mf-manifest.json', }, ); - expect(remoteSnapshot.version).toBe('/remote-web/mf-manifest.json'); - expect(remoteSnapshot.publicPath).toBe('https://example.test/remote-web/'); + expect(remoteSnapshot.version).toBe( + 'https://requested.example/mf-manifest.json', + ); + expect(remoteSnapshot.publicPath).toBe('https://redirected.example/v2/'); }); it('return basic app snapshot with only manifest params in dev with getPublicPath', () => { diff --git a/packages/sdk/rstest.config.ts b/packages/sdk/rstest.config.ts new file mode 100644 index 00000000000..8bb787e52a2 --- /dev/null +++ b/packages/sdk/rstest.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from '@rstest/core'; +import path from 'path'; + +export default defineConfig({ + source: { + define: { + __DEV__: true, + __TEST__: true, + __BROWSER__: false, + __VERSION__: '"unknown"', + }, + }, + testEnvironment: 'jsdom', + include: [path.resolve(__dirname, '__tests__/*.spec.ts')], + globals: true, + testTimeout: 10000, +}); diff --git a/packages/sdk/src/generateSnapshotFromManifest.ts b/packages/sdk/src/generateSnapshotFromManifest.ts index ec5046e83ae..7b150ff6399 100644 --- a/packages/sdk/src/generateSnapshotFromManifest.ts +++ b/packages/sdk/src/generateSnapshotFromManifest.ts @@ -13,7 +13,7 @@ interface IOptions { remotes?: Record; overrides?: Record; version?: string; - manifestUrl?: string; + resolvedManifestUrl?: string; } export const simpleJoinRemoteEntry = (rPath: string, rName: string): string => { @@ -63,7 +63,13 @@ export function generateSnapshotFromManifest( manifest: Manifest, options: IOptions = {}, ): ProviderModuleInfo { - const { remotes = {}, overrides = {}, version, manifestUrl } = options; + const { + remotes = {}, + overrides = {}, + version, + resolvedManifestUrl, + } = options; + const publicPathUrl = resolvedManifestUrl || version; let remoteSnapshot: ProviderModuleInfo; const getPublicPath = (): string => { @@ -71,10 +77,10 @@ export function generateSnapshotFromManifest( if ( (manifest.metaData.publicPath === 'auto' || manifest.metaData.publicPath === '') && - (manifestUrl || version) + publicPathUrl ) { // use same implementation as publicPath auto runtime module implements - return inferAutoPublicPath(manifestUrl || version!); + return inferAutoPublicPath(publicPathUrl); } return manifest.metaData.publicPath; } else { From 428f8bb2bc0b03dac3beeac721f91ce610a84b72 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 00:02:00 +0000 Subject: [PATCH 28/68] fix(runtime): guard stale manifest cache writes --- .../__tests__/register-remotes.spec.ts | 119 ++++++++++++++++++ .../src/plugins/snapshot/SnapshotHandler.ts | 31 ++++- packages/sdk/rstest.config.ts | 4 +- 3 files changed, 148 insertions(+), 6 deletions(-) diff --git a/packages/runtime-core/__tests__/register-remotes.spec.ts b/packages/runtime-core/__tests__/register-remotes.spec.ts index 8082316b15c..5b65a3495fd 100644 --- a/packages/runtime-core/__tests__/register-remotes.spec.ts +++ b/packages/runtime-core/__tests__/register-remotes.spec.ts @@ -260,4 +260,123 @@ describe('ModuleFederation', () => { expect(handler.manifestCache.has(manifestUrl)).toBe(false); expect(handler.manifestLoading[manifestUrl]).toBeUndefined(); }); + + it('keeps the newer manifest snapshot when a stale fetch resolves after force re-registration', async () => { + const manifestUrl = 'https://requested.example/mf-manifest.json'; + const manifests = { + first: { + id: 'catalog', + name: 'catalog', + metaData: { + name: 'catalog', + publicPath: 'https://first.example/', + type: 'app', + buildInfo: { buildVersion: 'first' }, + remoteEntry: { + name: 'catalog.web.lynx.bundle', + path: '', + type: 'global', + }, + types: { name: '', path: '' }, + globalName: 'catalog-first', + }, + remotes: [], + shared: [], + exposes: [], + }, + second: { + id: 'catalog', + name: 'catalog', + metaData: { + name: 'catalog', + publicPath: 'https://second.example/', + type: 'app', + buildInfo: { buildVersion: 'second' }, + remoteEntry: { + name: 'catalog.web.lynx.bundle', + path: '', + type: 'global', + }, + types: { name: '', path: '' }, + globalName: 'catalog-second', + }, + remotes: [], + shared: [], + exposes: [], + }, + }; + let resolveFirstResponse!: (response: Response) => void; + const firstResponse = new Promise((resolve) => { + resolveFirstResponse = resolve; + }); + let resolveSecondResponse!: (response: Response) => void; + const secondResponse = new Promise((resolve) => { + resolveSecondResponse = resolve; + }); + let resolveFirstFetchStarted!: () => void; + const firstFetchStarted = new Promise((resolve) => { + resolveFirstFetchStarted = resolve; + }); + let resolveSecondFetchStarted!: () => void; + const secondFetchStarted = new Promise((resolve) => { + resolveSecondFetchStarted = resolve; + }); + let fetchCount = 0; + const manifestFetch = rs.fn(() => { + fetchCount += 1; + if (fetchCount === 1) { + resolveFirstFetchStarted(); + return firstResponse; + } + resolveSecondFetchStarted(); + return secondResponse; + }); + const instance = new ModuleFederation({ + name: 'host', + remotes: [{ name: 'catalog', entry: manifestUrl }], + plugins: [ + { + name: 'manifest-fetch', + fetch: manifestFetch, + }, + ], + }); + const handler = instance.snapshotHandler; + + const staleSnapshot = handler.loadRemoteSnapshotInfo({ + moduleInfo: { name: 'catalog', entry: manifestUrl }, + }); + await firstFetchStarted; + + instance.registerRemotes([{ name: 'catalog', entry: manifestUrl }], { + force: true, + }); + const newerSnapshot = handler.loadRemoteSnapshotInfo({ + moduleInfo: { name: 'catalog', entry: manifestUrl }, + }); + await secondFetchStarted; + resolveSecondResponse( + new Response(JSON.stringify(manifests.second), { + headers: { 'Content-Type': 'application/json' }, + }), + ); + + expect(await newerSnapshot).toMatchObject({ + remoteSnapshot: { globalName: 'catalog-second' }, + }); + + resolveFirstResponse( + new Response(JSON.stringify(manifests.first), { + headers: { 'Content-Type': 'application/json' }, + }), + ); + + expect(await staleSnapshot).toMatchObject({ + remoteSnapshot: { globalName: 'catalog-second' }, + }); + expect( + handler.manifestCache.get(manifestUrl)?.manifest.metaData.buildInfo + .buildVersion, + ).toBe('second'); + }); }); diff --git a/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts b/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts index 4dc3464e6cf..3c2a62f7d52 100644 --- a/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts +++ b/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts @@ -80,6 +80,7 @@ export class SnapshotHandler { loadingHostSnapshot: Promise | null = null; HostInstance: ModuleFederation; manifestCache: Map = new Map(); + private manifestCacheGeneration: Map = new Map(); hooks = new PluginSystem({ beforeLoadRemoteSnapshot: new AsyncHook< [ @@ -124,6 +125,10 @@ export class SnapshotHandler { } clearManifestCache(manifestUrl: string): void { + this.manifestCacheGeneration.set( + manifestUrl, + (this.manifestCacheGeneration.get(manifestUrl) ?? 0) + 1, + ); this.manifestCache.delete(manifestUrl); delete this.manifestLoading[manifestUrl]; } @@ -301,6 +306,7 @@ export class SnapshotHandler { manifestUrl: string, moduleInfo: Remote, extraOptions: Record, + manifestCacheGeneration: number, resourceOptions?: { initiator: ResourceLoadInitiator; id: string; @@ -346,7 +352,12 @@ export class SnapshotHandler { )) as Manifest | undefined; if (!manifestJson) { - delete this.manifestLoading[manifestUrl]; + if ( + manifestCacheGeneration === + (this.manifestCacheGeneration.get(manifestUrl) ?? 0) + ) { + delete this.manifestLoading[manifestUrl]; + } error( RUNTIME_003, runtimeDescMap, @@ -395,10 +406,17 @@ export class SnapshotHandler { optionsToMFContext(this.HostInstance.options), ); } - this.manifestCache.set(manifestUrl, { - manifest: manifestJson, - resolvedUrl, - }); + if ( + manifestCacheGeneration === + (this.manifestCacheGeneration.get(manifestUrl) ?? 0) + ) { + this.manifestCache.set(manifestUrl, { + manifest: manifestJson, + resolvedUrl, + }); + } else { + return this.manifestCache.get(manifestUrl)?.manifest ?? manifestJson; + } return manifestJson; }; @@ -414,11 +432,14 @@ export class SnapshotHandler { id: string; }, ): Promise { + const manifestCacheGeneration = + this.manifestCacheGeneration.get(manifestUrl) ?? 0; const asyncLoadProcess = async () => { const manifestJson = await this.getManifestJson( manifestUrl, moduleInfo, extraOptions, + manifestCacheGeneration, resourceOptions, ); const remoteSnapshot = generateSnapshotFromManifest(manifestJson, { diff --git a/packages/sdk/rstest.config.ts b/packages/sdk/rstest.config.ts index 8bb787e52a2..70f19fb797c 100644 --- a/packages/sdk/rstest.config.ts +++ b/packages/sdk/rstest.config.ts @@ -11,7 +11,9 @@ export default defineConfig({ }, }, testEnvironment: 'jsdom', - include: [path.resolve(__dirname, '__tests__/*.spec.ts')], + include: [ + path.resolve(__dirname, '__tests__/generateSnapshotFromManifest.spec.ts'), + ], globals: true, testTimeout: 10000, }); From b656347595400cb7fd0ac7633479db8754737c4a Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 00:23:12 +0000 Subject: [PATCH 29/68] refactor(lynx): configure cache events through rspeedy --- packages/lynx/src/plugin.remoteBundle.test.ts | 37 ++++++++------ packages/lynx/src/plugin.testUtils.ts | 21 +++++++- packages/lynx/src/plugin.ts | 49 +++++-------------- 3 files changed, 52 insertions(+), 55 deletions(-) diff --git a/packages/lynx/src/plugin.remoteBundle.test.ts b/packages/lynx/src/plugin.remoteBundle.test.ts index be67d2e5b5c..b81a8a3d6b3 100644 --- a/packages/lynx/src/plugin.remoteBundle.test.ts +++ b/packages/lynx/src/plugin.remoteBundle.test.ts @@ -259,26 +259,31 @@ describe('pluginLynxModuleFederation remote bundles', () => { ); }); - it('disables app event caching in external remote entry runtimes', async () => { - const original = new LynxCacheEventsPlugin({ existing: true }); - const { modifyRspackConfig } = setupPlugin( + it('configures cache events through the public chain slot for remote bundles', async () => { + const { bundlerPluginUses, modifyBundlerChain } = setupPlugin( { name: 'catalog', exposes: { './Card': './src/Card' } }, { remoteBundle: { target: 'web' } }, ); - const config = await modifyRspackConfig({ plugins: [original] }, 'web'); - const replacement = config.plugins[0] as LynxCacheEventsPlugin & { - options: Record; - }; - expect(replacement).toBeInstanceOf(LynxCacheEventsPlugin); - expect(replacement).not.toBe(original); - expect(replacement.options.existing).toBe(true); - expect(replacement.options.setupListTransformer).toEqual( - expect.any(Function), - ); - expect( - (replacement.options.setupListTransformer as () => unknown[])(), - ).toEqual([]); + await modifyBundlerChain('web'); + + const cacheEventsUse = bundlerPluginUses.get('lynx:cache-events')!; + expect(cacheEventsUse).toEqual([ + LynxCacheEventsPlugin, + [{ setupListTransformer: expect.any(Function) }], + ]); + expect(cacheEventsUse[1][0].setupListTransformer(['event'])).toEqual([]); + }); + + it('does not override cache events for hosts', async () => { + const { bundlerPluginUses, modifyBundlerChain } = setupPlugin({ + name: 'host', + exposes: { './Card': './src/Card' }, + }); + + await modifyBundlerChain('web'); + + expect(bundlerPluginUses.has('lynx:cache-events')).toBe(false); }); it('builds a paired native remote with the official TASM encoder', async () => { diff --git a/packages/lynx/src/plugin.testUtils.ts b/packages/lynx/src/plugin.testUtils.ts index e73b9b69cbc..85d6ab9ad72 100644 --- a/packages/lynx/src/plugin.testUtils.ts +++ b/packages/lynx/src/plugin.testUtils.ts @@ -14,6 +14,12 @@ export const LAYERS = { type ModifyRspackConfig = (config: any, context: any) => any; type ModifyEnvironmentConfig = (config: any, context: any) => any; type ModifyBundlerChain = (chain: any, context: any) => any; +type BundlerChainPluginUse = [ + unknown, + Array<{ + setupListTransformer: (setupList: unknown[]) => unknown; + }>, +]; type ReactResolver = { resolve(request: string): Promise; }; @@ -27,6 +33,16 @@ export const setupPlugin = ( let modifyRspackConfig: ModifyRspackConfig | undefined; let modifyEnvironmentConfigCallback: ModifyEnvironmentConfig | undefined; let modifyBundlerChainCallback: ModifyBundlerChain | undefined; + const bundlerPluginUses = new Map(); + const chain = { + plugin(name: string) { + return { + use(Plugin: unknown, args: BundlerChainPluginUse[1]) { + bundlerPluginUses.set(name, [Plugin, args]); + }, + }; + }, + }; const modifyEnvironmentConfig = rs.fn((callback: ModifyEnvironmentConfig) => { modifyEnvironmentConfigCallback = callback; }); @@ -53,10 +69,13 @@ export const setupPlugin = ( return { modifyEnvironmentConfig, + bundlerPluginUses, applyEnvironmentConfig: (config: any, environment = 'lynx') => modifyEnvironmentConfigCallback!(config, { name: environment }), modifyBundlerChain: (environment = 'lynx') => - modifyBundlerChainCallback!({}, { environment: { name: environment } }), + modifyBundlerChainCallback!(chain, { + environment: { name: environment }, + }), modifyRspackConfig: (config: any, environment = 'lynx') => modifyRspackConfig!(config, { environment: { name: environment } }), }; diff --git a/packages/lynx/src/plugin.ts b/packages/lynx/src/plugin.ts index 1b135469c6c..7185962a982 100644 --- a/packages/lynx/src/plugin.ts +++ b/packages/lynx/src/plugin.ts @@ -1,9 +1,5 @@ import { dirname } from 'node:path'; -import type { - LynxCacheEventsPlugin as LynxCacheEventsPluginType, - LynxCacheEventsPluginOptions, -} from '@lynx-js/cache-events-webpack-plugin'; import type { Configuration } from '@rspack/core'; import type { RsbuildPlugin } from '@rsbuild/core'; @@ -32,35 +28,6 @@ import type { LynxRuntimePluginOptions } from './runtimeCore'; export const LYNX_RUNTIME_PLUGIN = '@module-federation/lynx/runtimePlugin'; -const disableRemoteEntryEventCaching = async ( - config: Configuration, -): Promise => { - const plugins = config.plugins; - if (!plugins) { - return; - } - const { LynxCacheEventsPlugin } = - await import('@lynx-js/cache-events-webpack-plugin'); - const index = plugins.findIndex( - (plugin) => - plugin !== false && - plugin !== null && - plugin !== undefined && - plugin instanceof LynxCacheEventsPlugin, - ); - if (index < 0) { - return; - } - - const current = plugins[index] as LynxCacheEventsPluginType & { - options?: LynxCacheEventsPluginOptions; - }; - plugins[index] = new LynxCacheEventsPlugin({ - ...current.options, - setupListTransformer: () => [], - }); -}; - export { normalizeLynxExposes, normalizeLynxShared }; export type { LynxModuleFederationAdapterOptions, @@ -98,11 +65,10 @@ export const pluginLynxModuleFederation = ( return config; }); - api.modifyBundlerChain(async (_chain, { environment }) => { + api.modifyBundlerChain(async (chain, { environment }) => { const remoteBundle = getRemoteBundleOptions(adapterOptions); if ( !remoteBundle || - remoteBundle.chunking === 'single' || !shouldApplyToEnvironment( adapterOptions.environment, environment.name, @@ -111,6 +77,16 @@ export const pluginLynxModuleFederation = ( return; } + const { LynxCacheEventsPlugin } = + await import('@lynx-js/cache-events-webpack-plugin'); + chain + .plugin('lynx:cache-events') + .use(LynxCacheEventsPlugin, [{ setupListTransformer: () => [] }]); + + if (remoteBundle.chunking === 'single') { + return; + } + const reactResolver = api.useExposed<{ resolve(request: string): Promise; }>(Symbol.for('@lynx-js/react/internal:resolve')); @@ -167,9 +143,6 @@ export const pluginLynxModuleFederation = ( experiments.layers ??= true; if (remoteBundle) { - await disableRemoteEntryEventCaching( - config as unknown as Configuration, - ); await configureRemoteBundle( config as unknown as Configuration, options, From 789db1c0b88bf6023f13f6962253b6dc6ce92e60 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 00:58:25 +0000 Subject: [PATCH 30/68] refactor(lynx): isolate remote bundle compilation state --- packages/lynx/src/chunkLoadingMatcher.test.ts | 199 ++++++++++++++++-- packages/lynx/src/chunkLoadingMatcher.ts | 39 ++-- packages/lynx/src/externalBundle.test.ts | 36 +++- packages/lynx/src/externalBundle.ts | 38 ++-- packages/lynx/src/plugin.remoteBundle.test.ts | 21 +- packages/lynx/src/remoteBundle.ts | 26 +-- .../lynx/src/remoteBundleCompilationState.ts | 35 +++ 7 files changed, 318 insertions(+), 76 deletions(-) create mode 100644 packages/lynx/src/remoteBundleCompilationState.ts diff --git a/packages/lynx/src/chunkLoadingMatcher.test.ts b/packages/lynx/src/chunkLoadingMatcher.test.ts index 1318e117f5c..5137c278200 100644 --- a/packages/lynx/src/chunkLoadingMatcher.test.ts +++ b/packages/lynx/src/chunkLoadingMatcher.test.ts @@ -1,8 +1,184 @@ import { describe, expect, it, rs } from '@rstest/core'; import { createLynxChunkLoadingMatcherPlugin } from './chunkLoadingMatcher'; +import { createRemoteBundleCompilationStateStore } from './remoteBundleCompilationState'; describe('Lynx chunk-loading matcher', () => { + it('keeps lazy bundle state isolated between compilations', () => { + type Compilation = { + chunks: Set; + entrypoints: Map; + hooks: { + runtimeRequirementInTree: { + for: () => { tap: () => void }; + }; + }; + }; + const stateStore = createRemoteBundleCompilationStateStore(); + let onCompilation: ((compilation: Compilation) => void) | undefined; + const beforeEmitByCompilation = new Map any>(); + class RuntimeModule { + static STAGE_TRIGGER = 20; + + constructor( + readonly name: string, + readonly stage: number, + ) {} + } + const compiler = { + webpack: { + RuntimeGlobals: { ensureChunkHandlers: 'ensureChunkHandlers' }, + RuntimeModule, + Template: { + asString: (lines: string[]) => lines.flat().join('\n'), + indent: (lines: string | string[]) => + (Array.isArray(lines) ? lines : [lines]) + .flat() + .map((line) => ` ${line}`) + .join('\n'), + }, + }, + hooks: { + thisCompilation: { + tap(_name: string, callback: (compilation: Compilation) => void) { + onCompilation = callback; + }, + }, + }, + }; + createLynxChunkLoadingMatcherPlugin( + { + getLynxTemplatePluginHooks(compilation) { + return { + asyncChunkName: { + tap() {}, + }, + beforeEmit: { + tap(_name, callback) { + beforeEmitByCompilation.set( + compilation as Compilation, + callback, + ); + }, + }, + }; + }, + }, + { + chunking: 'split', + exposeByExpectedLazyBundleChunk: new Map([ + ['catalog__background_Card', './Card'], + ]), + stateStore, + } as any, + ).apply(compiler as any); + const firstCompilation: Compilation = { + chunks: new Set(), + entrypoints: new Map(), + hooks: { runtimeRequirementInTree: { for: () => ({ tap: () => {} }) } }, + }; + const secondCompilation: Compilation = { + chunks: new Set(), + entrypoints: new Map(), + hooks: { runtimeRequirementInTree: { for: () => ({ tap: () => {} }) } }, + }; + + onCompilation!(firstCompilation); + beforeEmitByCompilation.get(firstCompilation)!({ + entryNames: ['catalog__background_Card'], + finalEncodeOptions: { sourceContent: { appType: 'DynamicComponent' } }, + outputName: 'first.bundle', + }); + onCompilation!(secondCompilation); + + expect(stateStore.for(firstCompilation as any).lazyBundleAssets).toEqual( + new Set(['first.bundle']), + ); + expect( + stateStore.for(firstCompilation as any).lazyBundleAssetByExpose, + ).toEqual(new Map([['./Card', 'first.bundle']])); + expect( + stateStore.for(secondCompilation as any).discardedTemplateAssets, + ).toEqual(new Set()); + expect(stateStore.for(secondCompilation as any).lazyBundleAssets).toEqual( + new Set(), + ); + expect( + stateStore.for(secondCompilation as any).lazyBundleAssetByExpose, + ).toEqual(new Map()); + }); + + it('creates fresh state for non-remote matcher use', () => { + let onCompilation: ((compilation: any) => void) | undefined; + const beforeEmitByCompilation = new Map any>(); + class RuntimeModule { + static STAGE_TRIGGER = 20; + + constructor() {} + } + createLynxChunkLoadingMatcherPlugin( + { + getLynxTemplatePluginHooks(compilation) { + return { + asyncChunkName: { tap() {} }, + beforeEmit: { + tap(_name, callback) { + beforeEmitByCompilation.set(compilation, callback); + }, + }, + }; + }, + }, + { + chunking: 'split', + exposeByExpectedLazyBundleChunk: new Map([ + ['catalog__background_Card', './Card'], + ]), + pairedRealmChunkSuffixes: { + background: '-react__background', + mainThread: '-react__main-thread', + }, + }, + ).apply({ + webpack: { + RuntimeGlobals: { ensureChunkHandlers: 'ensureChunkHandlers' }, + RuntimeModule, + Template: {}, + }, + hooks: { + thisCompilation: { + tap(_name: string, callback: (compilation: any) => void) { + onCompilation = callback; + }, + }, + }, + } as any); + const createCompilation = () => ({ + chunks: new Set(), + entrypoints: new Map(), + hooks: { runtimeRequirementInTree: { for: () => ({ tap: () => {} }) } }, + }); + const firstCompilation = createCompilation(); + const secondCompilation = createCompilation(); + const lazyBundleArgs = (outputName: string) => ({ + entryNames: ['catalog__background_Card'], + finalEncodeOptions: { sourceContent: { appType: 'DynamicComponent' } }, + outputName, + }); + + onCompilation!(firstCompilation); + beforeEmitByCompilation.get(firstCompilation)!( + lazyBundleArgs('first.bundle'), + ); + onCompilation!(secondCompilation); + + expect(() => + beforeEmitByCompilation.get(secondCompilation)!( + lazyBundleArgs('second.bundle'), + ), + ).not.toThrow(); + }); + it('guards chunks without JavaScript while preserving local JavaScript chunks', () => { const entryChunk = { files: new Set(['host.js']), @@ -61,9 +237,7 @@ describe('Lynx chunk-loading matcher', () => { let beforeEncode: ((args: any) => any) | undefined; let beforeEmit: ((args: any) => any) | undefined; const addRuntimeModule = rs.fn(); - const discardedTemplateAssets = new Set(['stale-template.bundle']); - const lazyBundleAssets = new Set(['stale-lazy.bundle']); - const lazyBundleAssetByExpose = new Map([['./stale', 'stale-lazy.bundle']]); + const stateStore = createRemoteBundleCompilationStateStore(); class RuntimeModule { static STAGE_TRIGGER = 20; @@ -147,14 +321,11 @@ describe('Lynx chunk-loading matcher', () => { backgroundOnlyRemote: true, chunking: 'split', discardSourceEntryBundles: true, - discardedTemplateAssets, exposeByExpectedLazyBundleChunk: new Map([ ['catalog__background_Card', './Card'], ['catalog__background_Details', './Details'], ]), includedChunkPrefixes: ['catalog__background_'], - lazyBundleAssetByExpose, - lazyBundleAssets, remoteEntryName: 'remote', pairedRealmChunkPrefixes: { background: 'catalog__background_', @@ -164,12 +335,14 @@ describe('Lynx chunk-loading matcher', () => { background: '-react__background', mainThread: '-react__main-thread', }, + stateStore, }, ).apply(compiler as any); onCompilation!(compilation); - expect(discardedTemplateAssets.size).toBe(0); - expect(lazyBundleAssets.size).toBe(0); - expect(lazyBundleAssetByExpose.size).toBe(0); + const state = stateStore.for(compilation as any); + expect(state.discardedTemplateAssets.size).toBe(0); + expect(state.lazyBundleAssets.size).toBe(0); + expect(state.lazyBundleAssetByExpose.size).toBe(0); addMatcher!(entryChunk); const cardArgs = { @@ -212,16 +385,18 @@ describe('Lynx chunk-loading matcher', () => { }, outputName: 'async/nested-feature.bundle', }); - expect(lazyBundleAssets).toEqual( + expect(state.lazyBundleAssets).toEqual( new Set([ 'async/catalog__background_Card.hash.bundle', 'async/nested-feature.bundle', ]), ); - expect(lazyBundleAssetByExpose).toEqual( + expect(state.lazyBundleAssetByExpose).toEqual( new Map([['./Card', 'async/catalog__background_Card.hash.bundle']]), ); - expect(discardedTemplateAssets).toEqual(new Set(['bootstrap.lynx.bundle'])); + expect(state.discardedTemplateAssets).toEqual( + new Set(['bootstrap.lynx.bundle']), + ); expect(addRuntimeModule).toHaveBeenCalledTimes(2); const runtimeModule = addRuntimeModule.mock.calls.find( diff --git a/packages/lynx/src/chunkLoadingMatcher.ts b/packages/lynx/src/chunkLoadingMatcher.ts index ef7d4b03d20..5dbd30bb961 100644 --- a/packages/lynx/src/chunkLoadingMatcher.ts +++ b/packages/lynx/src/chunkLoadingMatcher.ts @@ -1,4 +1,14 @@ -import type { Chunk, Compiler, WebpackPluginInstance } from '@rspack/core'; +import type { + Chunk, + Compilation, + Compiler, + WebpackPluginInstance, +} from '@rspack/core'; + +import { + createRemoteBundleCompilationStateStore, + type RemoteBundleCompilationStateStore, +} from './remoteBundleCompilationState'; interface TemplateEncodeArgs { encodeData: { @@ -40,11 +50,8 @@ interface ChunkLoadingMatcherOptions { backgroundOnlyRemote?: boolean; chunking?: 'single' | 'split'; discardSourceEntryBundles?: boolean; - discardedTemplateAssets?: Set; exposeByExpectedLazyBundleChunk?: ReadonlyMap; includedChunkPrefixes?: string[]; - lazyBundleAssetByExpose?: Map; - lazyBundleAssets?: Set; remoteEntryName?: string; pairedRealmChunkPrefixes?: { background: string; @@ -54,6 +61,7 @@ interface ChunkLoadingMatcherOptions { background: string; mainThread: string; }; + stateStore?: RemoteBundleCompilationStateStore; } interface ChunkGraph { @@ -150,17 +158,17 @@ const normalizeLazyBundleChunkName = ( }; export const createLynxChunkLoadingMatcherPlugin = ( - lynxTemplatePlugin?: LynxTemplatePluginApi, - options: ChunkLoadingMatcherOptions = {}, + lynxTemplatePlugin: LynxTemplatePluginApi | undefined, + options: ChunkLoadingMatcherOptions, ): WebpackPluginInstance => ({ apply(compiler: Compiler) { + const stateStore = + options.stateStore ?? createRemoteBundleCompilationStateStore(); const pluginName = 'LynxModuleFederationChunkLoadingMatcher'; const { RuntimeGlobals, RuntimeModule, Template } = compiler.webpack; compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { - options.lazyBundleAssets?.clear(); - options.lazyBundleAssetByExpose?.clear(); - options.discardedTemplateAssets?.clear(); + const state = stateStore.for(compilation as Compilation); let remoteChunkNames: Set | undefined; const templateHooks = lynxTemplatePlugin?.getLynxTemplatePluginHooks(compilation); @@ -223,24 +231,23 @@ export const createLynxChunkLoadingMatcherPlugin = ( ); if (isDynamicComponent && (isRemoteOutput || exposedKeys.size > 0)) { - options.lazyBundleAssets?.add(args.outputName); + state.lazyBundleAssets.add(args.outputName); for (const exposedKey of exposedKeys) { - const previousAsset = - options.lazyBundleAssetByExpose?.get(exposedKey); + const previousAsset = state.lazyBundleAssetByExpose.get(exposedKey); if (previousAsset && previousAsset !== args.outputName) { throw new Error( `@module-federation/lynx expose "${exposedKey}" emitted multiple DynamicComponent lazy bundles: "${previousAsset}" and "${args.outputName}".`, ); } - options.lazyBundleAssetByExpose?.set(exposedKey, args.outputName); + state.lazyBundleAssetByExpose.set(exposedKey, args.outputName); } if (options.chunking === 'split') { - options.discardedTemplateAssets?.delete(args.outputName); + state.discardedTemplateAssets.delete(args.outputName); } else { - options.discardedTemplateAssets?.add(args.outputName); + state.discardedTemplateAssets.add(args.outputName); } } else if (options.discardSourceEntryBundles) { - options.discardedTemplateAssets?.add(args.outputName); + state.discardedTemplateAssets.add(args.outputName); } return args; }); diff --git a/packages/lynx/src/externalBundle.test.ts b/packages/lynx/src/externalBundle.test.ts index f2ba1f530bf..d001729cee8 100644 --- a/packages/lynx/src/externalBundle.test.ts +++ b/packages/lynx/src/externalBundle.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it, rs } from '@rstest/core'; import { createLynxExternalBundlePlugin } from './externalBundle'; +import { createRemoteBundleCompilationStateStore } from './remoteBundleCompilationState'; interface TestAsset { name: string; @@ -25,6 +26,7 @@ const setupPlugin = ( ) => { const encode = rs.fn(async () => ({ buffer: Buffer.from('external') })); const discardedTemplateAssets = new Set(['bootstrap.bundle']); + const stateStore = createRemoteBundleCompilationStateStore(); if (chunking === 'single') { discardedTemplateAssets.add('async/Card.hash.bundle'); discardedTemplateAssets.add('async/Nested.hash.bundle'); @@ -32,7 +34,6 @@ const setupPlugin = ( const plugin = createLynxExternalBundlePlugin({ bundleFileName: 'catalog.lynx.bundle', chunking, - discardedTemplateAssets, encode, entryAssets: ['catalog.js'], entryName: 'catalog', @@ -42,10 +43,8 @@ const setupPlugin = ( ['catalog__background_Nested', './Nested'], ]), includedChunkPrefixes: ['catalog__background_', 'catalog__main-thread__'], - lazyBundleAssetByExpose, - lazyBundleAssets, - pairedBundleChunks: ['catalog__main-thread.js'], preservedAssets: ['mf-manifest.json', 'mf-stats.json'], + stateStore, }); let onCompilation: ((compilation: any) => void) | undefined; let onEmit: ((compilation: any) => Promise) | undefined; @@ -76,7 +75,18 @@ const setupPlugin = ( }; plugin.apply(compiler as any); - return { encode, onCompilation: () => onCompilation!, onEmit: () => onEmit! }; + return { + encode, + onCompilation: () => (compilation: any) => { + const state = stateStore.for(compilation); + state.discardedTemplateAssets = new Set(discardedTemplateAssets); + state.lazyBundleAssets = new Set(lazyBundleAssets); + state.lazyBundleAssetByExpose = new Map(lazyBundleAssetByExpose); + state.pairedBundleChunks.add('catalog__main-thread.js'); + onCompilation!(compilation); + }, + onEmit: () => onEmit!, + }; }; const createCompilation = (sourceAssets: TestAsset[]) => { @@ -187,6 +197,22 @@ describe('Lynx external bundle', () => { ]); }); + it('keeps REPORT asset snapshots with their compilation', async () => { + const { encode, onCompilation, onEmit } = setupPlugin('single'); + const first = createCompilation([createAsset('catalog.js', 'first')]); + const second = createCompilation([createAsset('catalog.js', 'second')]); + + onCompilation()(first.compilation); + first.snapshot(); + onCompilation()(second.compilation); + second.snapshot(); + + await onEmit()(first.compilation); + + const encodeOptions = encode.mock.calls[0][0] as any; + expect(encodeOptions.customSections.catalog_global.content).toBe('first'); + }); + it('rejects split builds when any expose lacks a ReactLynx lazy bundle', async () => { const { onCompilation, onEmit } = setupPlugin( 'split', diff --git a/packages/lynx/src/externalBundle.ts b/packages/lynx/src/externalBundle.ts index 96d8b4eaa43..df583ab017a 100644 --- a/packages/lynx/src/externalBundle.ts +++ b/packages/lynx/src/externalBundle.ts @@ -1,9 +1,15 @@ -import type { Chunk, Compiler, WebpackPluginInstance } from '@rspack/core'; +import type { + Chunk, + Compilation, + Compiler, + WebpackPluginInstance, +} from '@rspack/core'; + +import type { RemoteBundleCompilationStateStore } from './remoteBundleCompilationState'; interface ExternalBundleOptions { bundleFileName: string; chunking: 'split' | 'single'; - discardedTemplateAssets: Set; encode: (value: unknown) => Promise<{ buffer: Buffer }>; engineVersion?: string; entryAssets: string[]; @@ -11,10 +17,8 @@ interface ExternalBundleOptions { entrySectionNames: ReadonlyMap; exposeByExpectedLazyBundleChunk: ReadonlyMap; includedChunkPrefixes: string[]; - lazyBundleAssetByExpose: Map; - lazyBundleAssets: Set; - pairedBundleChunks: string[]; preservedAssets: string[]; + stateStore: RemoteBundleCompilationStateStore; } interface LynxExternalBundlePlugin extends WebpackPluginInstance { @@ -26,15 +30,10 @@ export const createLynxExternalBundlePlugin = ( ): LynxExternalBundlePlugin => ({ options, apply(compiler: Compiler) { - type AssetSnapshot = { - content: string; - name: string; - }; - - let sourceAssets: AssetSnapshot[] = []; compiler.hooks.thisCompilation.tap( 'LynxModuleFederationExternalBundleSources', (compilation) => { + const state = options.stateStore.for(compilation as Compilation); compilation.hooks.processAssets.tap( { name: 'LynxModuleFederationExternalBundleSources', @@ -75,7 +74,7 @@ export const createLynxExternalBundlePlugin = ( includedAssets.add(asset); } } - sourceAssets = compilation + state.sourceAssets = compilation .getAssets() .filter( ({ name }) => @@ -97,13 +96,14 @@ export const createLynxExternalBundlePlugin = ( stage: 10_000, }, async (compilation) => { + const state = options.stateStore.for(compilation); if (options.chunking === 'split') { const expectedExposes = new Set( options.exposeByExpectedLazyBundleChunk.values(), ); const missingExposes = Array.from(expectedExposes).filter( (expose) => { - const asset = options.lazyBundleAssetByExpose.get(expose); + const asset = state.lazyBundleAssetByExpose.get(expose); return !asset || !compilation.getAsset(asset); }, ); @@ -122,8 +122,8 @@ export const createLynxExternalBundlePlugin = ( } const encodedAssets = options.chunking === 'single' - ? sourceAssets - : sourceAssets.filter(({ name }) => entryAssets.has(name)); + ? state.sourceAssets + : state.sourceAssets.filter(({ name }) => entryAssets.has(name)); const customSections = encodedAssets.reduce>( (sections, asset) => { if (asset.name.endsWith('.js')) { @@ -131,7 +131,7 @@ export const createLynxExternalBundlePlugin = ( options.entrySectionNames.get(asset.name) ?? asset.name.replace(/\.js$/, ''); sections[sectionName] = { - ...(options.pairedBundleChunks.includes(asset.name) + ...(state.pairedBundleChunks.has(asset.name) ? { encoding: 'JsBytecode' } : {}), content: asset.content, @@ -163,16 +163,16 @@ export const createLynxExternalBundlePlugin = ( const { buffer } = await options.encode(encodeOptions); const preservedAssets = new Set(options.preservedAssets); if (options.chunking === 'split') { - for (const name of options.lazyBundleAssets) { + for (const name of state.lazyBundleAssets) { preservedAssets.add(name); } } - for (const { name } of sourceAssets) { + for (const { name } of state.sourceAssets) { if (!preservedAssets.has(name)) { compilation.deleteAsset(name); } } - for (const name of options.discardedTemplateAssets) { + for (const name of state.discardedTemplateAssets) { if (!preservedAssets.has(name)) { compilation.deleteAsset(name); } diff --git a/packages/lynx/src/plugin.remoteBundle.test.ts b/packages/lynx/src/plugin.remoteBundle.test.ts index b81a8a3d6b3..a69594050f9 100644 --- a/packages/lynx/src/plugin.remoteBundle.test.ts +++ b/packages/lynx/src/plugin.remoteBundle.test.ts @@ -180,7 +180,7 @@ describe('pluginLynxModuleFederation remote bundles', () => { } as any); const emitAsset = rs.fn(); const updateAsset = rs.fn(); - onCompilation!({ + const compilation = { chunks: [ { name: 'catalog', @@ -227,7 +227,8 @@ describe('pluginLynxModuleFederation remote bundles', () => { }, }, }, - }); + }; + onCompilation!(compilation); const backgroundIdentityStage = PROCESS_ASSETS_STAGE_ADDITIONS + 1; const pairedBundleChunksStage = PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + 2; processAssets.get(backgroundIdentityStage)!(); @@ -247,11 +248,15 @@ describe('pluginLynxModuleFederation remote bundles', () => { expect.any(Object), { minimized: true }, ); - expect(encoder.options.pairedBundleChunks).toEqual([ - 'catalog__main-thread.js', - 'catalog__main-thread__Card-main-thread.js', - 'catalog__background_Card.js', - ]); + expect( + encoder.options.stateStore.for(compilation).pairedBundleChunks, + ).toEqual( + new Set([ + 'catalog__main-thread.js', + 'catalog__main-thread__Card-main-thread.js', + 'catalog__background_Card.js', + ]), + ); expect(emitAsset).toHaveBeenCalledWith( 'catalog__main-thread.js', expect.any(Object), @@ -344,7 +349,7 @@ describe('pluginLynxModuleFederation remote bundles', () => { bundleFileName: 'catalog-native.lynx.bundle', engineVersion: '3.6', entryAssets: ['catalog.js'], - pairedBundleChunks: [], + stateStore: { for: expect.any(Function) }, }); expect(encoder.options.encode).toBeTypeOf('function'); const { buffer } = await encoder.options.encode({ diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index 3bfa688116d..2518a8aa6a8 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -1,4 +1,5 @@ import type { + Compilation, Compiler, Configuration, Exposes, @@ -25,6 +26,7 @@ import { type LynxRemoteBundleOptions, } from './pluginOptions'; import { createLynxRemoteManifestPlugin } from './remoteManifest'; +import { createRemoteBundleCompilationStateStore } from './remoteBundleCompilationState'; import { MAIN_THREAD_EXPOSE_SUFFIX } from './runtimeCore'; import { getLynxWebEncodeMode } from './webEncode'; @@ -257,7 +259,7 @@ const classifyRemoteChunk = ( }); const createRemoteAssetsPlugin = ( - pairedBundleChunks: string[], + stateStore: ReturnType, backgroundEntry: string, mainThreadEntry: string | undefined, backgroundChunkPrefix: string, @@ -266,6 +268,7 @@ const createRemoteAssetsPlugin = ( apply(compiler: Compiler) { const pluginName = 'LynxModuleFederationPairedBundleChunks'; compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { + const state = stateStore.for(compilation as Compilation); compilation.hooks.processAssets.tap( { name: `${pluginName}BackgroundIdentity`, @@ -314,7 +317,6 @@ const createRemoteAssetsPlugin = ( compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + 2, }, () => { - pairedBundleChunks.length = 0; if (mainThreadEntry) { const entryAsset = compilation.getAsset(backgroundEntry); if (!entryAsset) { @@ -327,7 +329,7 @@ const createRemoteAssetsPlugin = ( entryAsset.source, entryAsset.info, ); - pairedBundleChunks.push(mainThreadEntry); + state.pairedBundleChunks.add(mainThreadEntry); } for (const chunk of compilation.chunks) { @@ -344,7 +346,7 @@ const createRemoteAssetsPlugin = ( for (const filename of chunk.files) { if (filename.endsWith('.js') && filename !== backgroundEntry) { - pairedBundleChunks.push(filename); + state.pairedBundleChunks.add(filename); const asset = compilation.getAsset(filename); if (asset && containsMainThreadModule) { compilation.updateAsset( @@ -515,16 +517,13 @@ export const configureRemoteBundle = async ( `${entryGlobalName}__main-thread`, ); } - const pairedBundleChunks: string[] = []; - const lazyBundleAssets = new Set(); - const lazyBundleAssetByExpose = new Map(); const exposeByExpectedLazyBundleChunk = new Map( Array.from(chunkNamesByExpose, ([expose, chunkName]) => [ `${plan.backgroundChunkPrefix}${chunkName}`, expose, ]), ); - const discardedTemplateAssets = new Set(); + const stateStore = createRemoteBundleCompilationStateStore(); const { manifestFileName, statsFileName } = getManifestFileName( federationOptions.manifest, ); @@ -543,10 +542,7 @@ export const configureRemoteBundle = async ( chunking: plan.chunking, discardSourceEntryBundles: remoteBundle.preserveSourceEntryBundles === false, - discardedTemplateAssets, includedChunkPrefixes: plan.includedChunkPrefixes, - lazyBundleAssets, - lazyBundleAssetByExpose, exposeByExpectedLazyBundleChunk, remoteEntryName: options.name, ...(pairedPlan @@ -561,12 +557,13 @@ export const configureRemoteBundle = async ( }, } : {}), + stateStore, }), ); if (pairedPlan) { config.plugins.push( createRemoteAssetsPlugin( - pairedBundleChunks, + stateStore, plan.backgroundEntry, plan.mainThreadEntry, plan.backgroundChunkPrefix, @@ -578,18 +575,15 @@ export const configureRemoteBundle = async ( createLynxExternalBundlePlugin({ bundleFileName: plan.bundleFileName, chunking: plan.chunking, - discardedTemplateAssets, encode, engineVersion: remoteBundle.engineVersion, entryAssets: plan.entryAssets, entryName: options.name, entrySectionNames, includedChunkPrefixes: plan.includedChunkPrefixes, - lazyBundleAssets, - lazyBundleAssetByExpose, exposeByExpectedLazyBundleChunk, - pairedBundleChunks, preservedAssets: [manifestFileName, statsFileName], + stateStore, }), createLynxRemoteManifestPlugin( federationOptions.manifest, diff --git a/packages/lynx/src/remoteBundleCompilationState.ts b/packages/lynx/src/remoteBundleCompilationState.ts new file mode 100644 index 00000000000..f1ca1488245 --- /dev/null +++ b/packages/lynx/src/remoteBundleCompilationState.ts @@ -0,0 +1,35 @@ +import type { Compilation } from '@rspack/core'; + +export interface RemoteBundleCompilationState { + discardedTemplateAssets: Set; + lazyBundleAssets: Set; + lazyBundleAssetByExpose: Map; + pairedBundleChunks: Set; + sourceAssets: Array<{ content: string; name: string }>; +} + +export interface RemoteBundleCompilationStateStore { + for(compilation: Compilation): RemoteBundleCompilationState; +} + +export const createRemoteBundleCompilationStateStore = + (): RemoteBundleCompilationStateStore => { + const states = new WeakMap(); + + return { + for(compilation) { + let state = states.get(compilation); + if (!state) { + state = { + discardedTemplateAssets: new Set(), + lazyBundleAssets: new Set(), + lazyBundleAssetByExpose: new Map(), + pairedBundleChunks: new Set(), + sourceAssets: [], + }; + states.set(compilation, state); + } + return state; + }, + }; + }; From 7cca67afe24ea598ffafce524a20137be6f984d0 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 01:30:56 +0000 Subject: [PATCH 31/68] refactor(lynx): isolate lazy chunk load settlement --- packages/lynx/src/lazyChunkLoadController.ts | 178 ++++ packages/lynx/src/runtimeChunkLoading.test.ts | 901 ------------------ .../lynx/src/runtimeChunkLoading.testUtils.ts | 40 + packages/lynx/src/runtimeChunkLoading.ts | 159 +--- packages/lynx/src/runtimeChunkUrl.test.ts | 235 +++++ .../lynx/src/runtimeLazyBundleLoading.test.ts | 488 ++++++++++ .../lynx/src/runtimeSectionLoading.test.ts | 249 +++++ 7 files changed, 1211 insertions(+), 1039 deletions(-) create mode 100644 packages/lynx/src/lazyChunkLoadController.ts delete mode 100644 packages/lynx/src/runtimeChunkLoading.test.ts create mode 100644 packages/lynx/src/runtimeChunkLoading.testUtils.ts create mode 100644 packages/lynx/src/runtimeChunkUrl.test.ts create mode 100644 packages/lynx/src/runtimeLazyBundleLoading.test.ts create mode 100644 packages/lynx/src/runtimeSectionLoading.test.ts diff --git a/packages/lynx/src/lazyChunkLoadController.ts b/packages/lynx/src/lazyChunkLoadController.ts new file mode 100644 index 00000000000..cf637c9f9d8 --- /dev/null +++ b/packages/lynx/src/lazyChunkLoadController.ts @@ -0,0 +1,178 @@ +import type { + ChunkPromise, + InstalledChunk, + LynxChunk, +} from './runtimeChunkLoading'; +import { loadWithTimeout } from './runtimeTimeout'; + +export type { + ChunkPromise, + InstalledChunk, + LynxChunk, +} from './runtimeChunkLoading'; + +type LazyChunkLoadState = + | { generation: symbol; kind: 'loading'; phase: 'invoking' | 'pending' } + | { + chunk: LynxChunk; + consumes: Promise; + generation: symbol; + kind: 'waiting-consumes'; + } + | { chunk: LynxChunk; generation: symbol; kind: 'installed' } + | { error: unknown; generation: symbol; kind: 'failed' }; + +interface LazyChunkLoadControllerArgs { + chunkKey: string; + installedChunks: Record; + timeout: number; + installChunkAfterConsumes( + chunk: LynxChunk, + isCurrent: () => boolean, + ): Promise | undefined; + isChunk(value: unknown): value is LynxChunk; + loadQueryComponent(request: string): PromiseLike; +} + +const timeoutMessage = (request: string, timeout: number): string => + `Timed out loading Lynx lazy bundle "${request}" after ${timeout}ms.`; + +export const createLazyChunkLoadController = ({ + chunkKey, + installedChunks, + timeout, + installChunkAfterConsumes, + isChunk, + loadQueryComponent, +}: LazyChunkLoadControllerArgs) => { + const generation = Symbol(chunkKey); + const loading: Exclude = [undefined, undefined, undefined]; + let state: LazyChunkLoadState = { + generation, + kind: 'loading', + phase: 'invoking', + }; + + const isCurrent = (): boolean => + state.generation === generation && + state.kind !== 'failed' && + installedChunks[chunkKey] === loading; + + const fail = (error: unknown): void => { + if (state.generation !== generation || state.kind === 'failed') { + return; + } + state = { error, generation, kind: 'failed' }; + if (installedChunks[chunkKey] === loading) { + delete installedChunks[chunkKey]; + } + }; + + return { + load(request: string): ChunkPromise { + installedChunks[chunkKey] = loading; + let loaded: ChunkPromise; + try { + loaded = loadQueryComponent(request).then((value) => { + if (!isCurrent()) { + return value; + } + try { + if (!isChunk(value)) { + throw new Error( + `Lynx lazy bundle "${request}" did not export a valid webpack chunk.`, + ); + } + if (!value.ids.some((id) => String(id) === chunkKey)) { + throw new Error( + `Lynx lazy bundle "${request}" did not include requested chunk "${chunkKey}".`, + ); + } + + const invokedSynchronously = + state.kind === 'loading' && state.phase === 'invoking'; + const consumes = installChunkAfterConsumes(value, isCurrent); + if (!consumes) { + state = { chunk: value, generation, kind: 'installed' }; + return value; + } + + state = { + chunk: value, + consumes, + generation, + kind: 'waiting-consumes', + }; + return invokedSynchronously ? value : consumes.then(() => value); + } catch (error) { + fail(error); + throw error; + } + }); + } catch (error) { + fail(error); + return Promise.reject(error); + } + + if (state.kind === 'loading' && state.phase === 'invoking') { + state = { generation, kind: 'loading', phase: 'pending' }; + } + const initialState = state; + const primary = + initialState.kind === 'installed' || initialState.kind === 'failed' + ? loaded + : initialState.kind === 'waiting-consumes' + ? loadWithTimeout( + timeout, + timeoutMessage(request, timeout), + (resolve, reject) => { + initialState.consumes + .then(() => initialState.chunk) + .then(resolve, reject); + }, + ) + : loadWithTimeout( + timeout, + timeoutMessage(request, timeout), + (resolve, reject) => { + loaded.then(resolve, reject); + }, + ); + + let tracked = primary; + if ( + initialState.kind !== 'installed' && + initialState.kind !== 'failed' && + isCurrent() + ) { + const installedElsewhere = new Promise((resolve, reject) => { + loading[0] = (value) => { + if (state.kind !== 'failed') { + state = { + chunk: value as LynxChunk, + generation, + kind: 'installed', + }; + } + resolve(value); + }; + loading[1] = (error) => { + fail(error); + reject(error); + }; + }); + tracked = Promise.race([primary, installedElsewhere]); + } + + const promise = tracked.then( + (value) => value, + (error) => { + fail(error); + throw error; + }, + ); + loading[2] = promise; + return promise; + }, + }; +}; diff --git a/packages/lynx/src/runtimeChunkLoading.test.ts b/packages/lynx/src/runtimeChunkLoading.test.ts deleted file mode 100644 index 8b65c421ed5..00000000000 --- a/packages/lynx/src/runtimeChunkLoading.test.ts +++ /dev/null @@ -1,901 +0,0 @@ -import { describe, expect, it, rs } from '@rstest/core'; - -import { - LYNX_BUNDLE_REGISTRY, - patchLynxChunkLoading, - type LynxWebpackRequire, -} from './runtimePlugin'; - -const remoteRegistry = () => - new Map([ - ['remote', 'lynx-cache://catalog'], - ['remote:remote-origin', 'https://cdn.example/remotes/catalog.lynx.bundle'], - ]); - -const createWebpackRequire = ( - filename = 'chunks/feature.js?cache=1#fragment', -): LynxWebpackRequire => ({ - f: {}, - m: {}, - u: rs.fn(() => filename), -}); - -const createGlobalObject = ( - loadLazyBundle: (request: string) => PromiseLike, -) => ({ - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: remoteRegistry(), -}); - -const makeSynchronousThenable = (value: T): PromiseLike => { - const thenable = { - then(onFulfilled?: ((resolved: T) => unknown) | null) { - if (!onFulfilled) { - return makeSynchronousThenable(value); - } - try { - return makeSynchronousThenable(onFulfilled(value)); - } catch (error) { - return Promise.reject(error); - } - }, - }; - return thenable as PromiseLike; -}; - -describe('patchLynxChunkLoading', () => { - it('settles overlapping loads from the first bundle containing both chunks', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { - first: 'async/first.bundle', - second: 'async/second.bundle', - }; - const resolvers = new Map void>(); - const globalObject = createGlobalObject( - (request) => - new Promise((resolve) => { - resolvers.set(request, resolve); - }), - ); - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const first: PromiseLike[] = []; - const second: PromiseLike[] = []; - webpackRequire.f.j!('first', first); - webpackRequire.f.j!('second', second); - - const firstFactory = rs.fn(); - const firstRuntime = rs.fn(); - resolvers.get('https://cdn.example/remotes/async/first.bundle')!({ - ids: ['first', 'second'], - modules: { feature: firstFactory }, - runtime: firstRuntime, - }); - await Promise.all([first[0], second[0]]); - - expect(webpackRequire.m.feature).toBe(firstFactory); - expect(firstRuntime).toHaveBeenCalledTimes(1); - - const staleRuntime = rs.fn(); - resolvers.get('https://cdn.example/remotes/async/second.bundle')!({ - ids: ['second'], - modules: { stale: rs.fn() }, - runtime: staleRuntime, - }); - await Promise.resolve(); - expect(webpackRequire.m.stale).toBeUndefined(); - expect(staleRuntime).not.toHaveBeenCalled(); - }); - - it('preserves the official synchronous lazy-bundle thenable', () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const factory = rs.fn(); - const globalObject = createGlobalObject(() => - makeSynchronousThenable({ - ids: ['feature'], - modules: { factory }, - }), - ); - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: PromiseLike[] = []; - webpackRequire.f.j!('feature', promises); - - expect(webpackRequire.m.factory).toBe(factory); - let observed = false; - promises[0].then(() => { - observed = true; - }); - expect(observed).toBe(true); - }); - - it('evicts synchronous lazy-bundle failures so they can be retried', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const factory = rs.fn(); - let attempt = 0; - const globalObject = createGlobalObject(() => { - if (attempt++ === 0) { - throw new Error('synchronous decode failed'); - } - return makeSynchronousThenable({ - ids: ['feature'], - modules: { factory }, - }); - }); - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const failed: PromiseLike[] = []; - webpackRequire.f.j!('feature', failed); - await expect(failed[0]).rejects.toThrow('synchronous decode failed'); - - const retried: PromiseLike[] = []; - webpackRequire.f.j!('feature', retried); - await expect(retried[0]).resolves.toBeDefined(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('captures the remote origin when the container runtime is patched', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: {}, - })); - const registry = remoteRegistry(); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: registry, - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - registry.set( - 'remote:remote-origin', - 'https://other.example/remotes/catalog.lynx.bundle', - ); - const promises: PromiseLike[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).toHaveBeenCalledWith( - 'https://cdn.example/remotes/async/Card.bundle', - ); - }); - - it('waits for shared consumes from a synchronous lazy bundle', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - webpackRequire.consumesLoadingData = { - chunkMapping: { feature: ['shared-state'] }, - }; - let resolveConsume!: () => void; - const consume = new Promise((resolve) => { - resolveConsume = () => { - webpackRequire.m['shared-state'] = rs.fn(); - resolve(); - }; - }); - webpackRequire.f.consumes = (_chunkId, promises) => { - promises.push(consume); - }; - const factory = rs.fn(); - const globalObject = createGlobalObject(() => - makeSynchronousThenable({ - ids: ['feature'], - modules: { factory }, - }), - ); - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: PromiseLike[] = []; - webpackRequire.f.j!('feature', promises); - - let observed = false; - promises[0].then(() => { - observed = true; - }); - expect(observed).toBe(false); - expect(webpackRequire.m.factory).toBeUndefined(); - resolveConsume(); - await expect(promises[0]).resolves.toBeDefined(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('does not let a stale consume rejection cancel a retry', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - webpackRequire.consumesLoadingData = { - chunkMapping: { feature: ['shared-state'] }, - }; - let rejectExpired!: (error: Error) => void; - const expiredConsume = new Promise((_resolve, reject) => { - rejectExpired = reject; - }); - let resolveFresh!: () => void; - const freshConsume = new Promise((resolve) => { - resolveFresh = () => { - webpackRequire.m['shared-state'] = rs.fn(); - resolve(); - }; - }); - let consumeAttempt = 0; - webpackRequire.f.consumes = (_chunkId, promises) => { - promises.push(consumeAttempt++ === 0 ? expiredConsume : freshConsume); - }; - const factory = rs.fn(); - const globalObject = createGlobalObject(() => - makeSynchronousThenable({ - ids: ['feature'], - modules: { factory }, - }), - ); - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); - const expired: PromiseLike[] = []; - webpackRequire.f.j!('feature', expired); - await expect(expired[0]).rejects.toThrow( - 'Timed out loading Lynx lazy bundle', - ); - - const fresh: PromiseLike[] = []; - webpackRequire.f.j!('feature', fresh); - rejectExpired(new Error('stale consume failed')); - await Promise.resolve(); - resolveFresh(); - await expect(fresh[0]).resolves.toBeDefined(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('ignores a stale lazy bundle that resolves after timeout', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const resolvers: Array<(value: unknown) => void> = []; - const globalObject = createGlobalObject( - () => - new Promise((resolve) => { - resolvers.push(resolve); - }), - ); - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); - const expired: PromiseLike[] = []; - webpackRequire.f.j!('feature', expired); - await expect(expired[0]).rejects.toThrow( - 'Timed out loading Lynx lazy bundle', - ); - - const fresh: PromiseLike[] = []; - webpackRequire.f.j!('feature', fresh); - resolvers[0]({ - ids: ['feature'], - modules: { factory: rs.fn() }, - }); - await Promise.resolve(); - expect(webpackRequire.m.factory).toBeUndefined(); - - const freshFactory = rs.fn(); - resolvers[1]({ ids: ['feature'], modules: { factory: freshFactory } }); - await expect(fresh[0]).resolves.toBeDefined(); - expect(webpackRequire.m.factory).toBe(freshFactory); - }); - - it('installs and deduplicates section chunks', async () => { - const webpackRequire = createWebpackRequire(); - const factory = rs.fn(); - const runtime = rs.fn(); - const nestedPromises: Promise[] = []; - const loadScript = rs.fn(() => { - webpackRequire.f.j!('feature', nestedPromises); - return { - ids: ['feature'], - modules: { factory }, - runtime, - }; - }); - const globalObject = { - lynx: { requireModuleAsync: () => undefined, loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), - }; - - expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( - true, - ); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - - expect(loadScript).toHaveBeenCalledTimes(1); - expect(loadScript).toHaveBeenCalledWith('chunks/feature', { - bundleName: 'lynx-cache://remote', - }); - expect(nestedPromises[0]).toBe(promises[0]); - await expect(Promise.all(promises)).resolves.toBeDefined(); - expect(webpackRequire.m.factory).toBe(factory); - expect(runtime).toHaveBeenCalledWith(webpackRequire); - }); - - it('loads split remote chunks as independently fetched Lynx lazy bundles', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { - feature: 'async/catalog__background_Card.123.bundle', - }; - webpackRequire.p = '/remote-assets/'; - const factory = rs.fn(); - const loadScript = rs.fn(); - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: { factory }, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'https://cdn.example/cache/catalog.lynx.bundle'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - - await expect(Promise.all(promises)).resolves.toBeDefined(); - expect(loadLazyBundle).toHaveBeenCalledWith( - 'https://cdn.example/remote-assets/async/catalog__background_Card.123.bundle', - ); - expect(loadScript).not.toHaveBeenCalled(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('preserves protocol-relative lazy bundle and public-path URLs', async () => { - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'https://origin.example/catalog.lynx.bundle'], - ['remote:remote-origin', 'https://origin.example/catalog.lynx.bundle'], - ]), - }; - const publicPathRequire = createWebpackRequire(); - publicPathRequire.lynx_aci = { feature: 'async/Card.bundle' }; - publicPathRequire.p = '//cdn.example/assets/'; - patchLynxChunkLoading(publicPathRequire, 'remote', globalObject); - const publicPathPromises: Promise[] = []; - publicPathRequire.f.j!('feature', publicPathPromises); - await Promise.all(publicPathPromises); - - const assetRequire = createWebpackRequire(); - assetRequire.lynx_aci = { - feature: '//assets.example/chunks/Card.bundle', - }; - patchLynxChunkLoading(assetRequire, 'remote', globalObject); - const assetPromises: Promise[] = []; - assetRequire.f.j!('feature', assetPromises); - await Promise.all(assetPromises); - - expect(loadLazyBundle).toHaveBeenNthCalledWith( - 1, - '//cdn.example/assets/async/Card.bundle', - ); - expect(loadLazyBundle).toHaveBeenNthCalledWith( - 2, - '//assets.example/chunks/Card.bundle', - ); - }); - - it('restores the lazy-bundle identity while deferred module factories execute', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const observedEntries: unknown[] = []; - const factory = rs.fn(() => { - observedEntries.push(globalObject.globDynamicComponentEntry); - }); - const globalObject: any = { - globDynamicComponentEntry: '__Card__', - lynx: { - loadLazyBundle: async () => ({ - __lynx_dynamic_component_entry__: 'https://cdn.example/Card.bundle', - ids: ['feature'], - modules: { factory }, - }), - loadScript: rs.fn(), - }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - ['remote:remote-origin', 'https://cdn.example/catalog.lynx.bundle'], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - ( - webpackRequire.m.factory as ( - module: unknown, - exports: unknown, - require: unknown, - ) => unknown - )({}, {}, webpackRequire); - - expect(observedEntries).toEqual(['https://cdn.example/Card.bundle']); - expect(globalObject.globDynamicComponentEntry).toBe('__Card__'); - }); - - it('preserves CommonJS factory this while restoring bundle identity', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const observedThis: unknown[] = []; - const factory = function (this: unknown) { - observedThis.push(this); - }; - const globalObject = { - lynx: { - loadLazyBundle: async () => ({ - __lynx_dynamic_component_entry__: 'https://cdn.example/Card.bundle', - ids: ['feature'], - modules: { factory }, - }), - loadScript: rs.fn(), - }, - [LYNX_BUNDLE_REGISTRY]: remoteRegistry(), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: PromiseLike[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - const module = { exports: {} }; - ( - webpackRequire.m.factory as ( - this: unknown, - module: unknown, - exports: unknown, - runtimeRequire: LynxWebpackRequire, - ) => unknown - ).call(module.exports, module, module.exports, webpackRequire); - - expect(observedThis).toEqual([module.exports]); - }); - - it('loads atomic chunks from sections in the already-fetched container', async () => { - const webpackRequire = createWebpackRequire( - 'async/catalog__background_Card.js', - ); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - webpackRequire.lynx_chunking = 'single'; - const factory = rs.fn(); - const loadLazyBundle = rs.fn(); - const loadScript = rs.fn(() => ({ - ids: ['feature'], - modules: { factory }, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript, requireModuleAsync: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://catalog']]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).not.toHaveBeenCalled(); - expect(loadScript).toHaveBeenCalledWith('async/catalog__background_Card', { - bundleName: 'lynx-cache://catalog', - }); - }); - - it('uses the official lazy-bundle API for split chunks', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const factory = rs.fn(); - const fetchBundle = rs.fn(async () => ({ - code: 0, - url: 'lynx-cache://Card', - })); - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: { factory }, - })); - const loadScript = rs.fn(() => ({ - ids: ['feature'], - modules: { factory }, - })); - const globalObject = { - lynx: { - fetchBundle, - loadLazyBundle, - loadScript, - requireModuleAsync: rs.fn(), - }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).toHaveBeenCalledWith( - 'https://cdn.example/remotes/async/Card.bundle', - ); - expect(fetchBundle).not.toHaveBeenCalled(); - expect(loadScript).not.toHaveBeenCalled(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('times out split chunks and permits retry', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const loadLazyBundle = rs.fn(() => new Promise(() => undefined)); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); - for (let attempt = 0; attempt < 2; attempt += 1) { - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await expect(Promise.all(promises)).rejects.toThrow( - 'Timed out loading Lynx lazy bundle', - ); - } - expect(loadLazyBundle).toHaveBeenCalledTimes(2); - }); - - it('rejects split chunks when no DynamicComponent API exists', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const fetchBundle = rs.fn(async () => ({ - code: 0, - url: 'lynx-cache://Card', - })); - const loadScript = rs.fn(); - const globalObject = { - lynx: { fetchBundle, loadScript, requireModuleAsync: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await expect(Promise.all(promises)).rejects.toThrow( - 'requires QueryComponent and getDynamicComponentExports', - ); - - expect(fetchBundle).not.toHaveBeenCalled(); - expect(loadScript).not.toHaveBeenCalled(); - }); - - it('loads split chunks through QueryComponent when loadLazyBundle is unavailable', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { - feature: 'async/Card.123.bundle', - }; - const factory = rs.fn(); - const chunk = { - ids: ['feature'], - modules: { factory }, - }; - const QueryComponent = rs.fn((_source, callback) => - callback({ code: 0, detail: { schema: 'Card' } }), - ); - const loadScript = rs.fn(); - const globalObject = { - lynx: { - loadScript, - QueryComponent, - requireModuleAsync: rs.fn(), - }, - lynxCoreInject: { - tt: { getDynamicComponentExports: () => chunk }, - }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(QueryComponent).toHaveBeenCalledWith( - 'https://cdn.example/remotes/async/Card.123.bundle', - expect.any(Function), - ); - expect(loadScript).not.toHaveBeenCalled(); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it('loads main-thread split chunks through the asynchronous Web QueryComponent API', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - const factory = rs.fn(); - const chunk = { ids: ['feature'], modules: { factory } }; - const queryComponent = rs.fn((_source, callback) => { - queueMicrotask(() => - callback({ - code: 0, - data: { evalResult: chunk, url: 'https://cdn.example/Card.bundle' }, - }), - ); - return null; - }); - const globalObject = { - __QueryComponent: queryComponent, - lynx: { loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(queryComponent).toHaveBeenCalledWith( - 'https://cdn.example/remotes/async/Card.bundle', - expect.any(Function), - ); - expect(webpackRequire.m.factory).toBe(factory); - }); - - it.each([ - [ - undefined, - 'async/Card.bundle', - 'https://cdn.example/remotes/async/Card.bundle', - ], - [ - 'auto', - 'async/Card.bundle', - 'https://cdn.example/remotes/async/Card.bundle', - ], - ['/', 'async/Card.bundle', 'https://cdn.example/async/Card.bundle'], - [ - 'assets/', - 'async/Card.bundle', - 'https://cdn.example/remotes/assets/async/Card.bundle', - ], - ['/v2/', 'async/Card.bundle', 'https://cdn.example/v2/async/Card.bundle'], - [ - 'https://assets.example/v3/', - 'async/Card.bundle', - 'https://assets.example/v3/async/Card.bundle', - ], - [ - 'http://assets.example/v4/', - 'async/Card.bundle', - 'http://assets.example/v4/async/Card.bundle', - ], - [ - '/ignored/', - 'https://assets.example/Card.bundle', - 'https://assets.example/Card.bundle', - ], - [ - '/ignored/', - 'http://assets.example/Card.bundle', - 'http://assets.example/Card.bundle', - ], - ])( - 'resolves split public path %s against the manifest entry', - async (publicPath, assetPath, expected) => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: assetPath }; - webpackRequire.p = publicPath; - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle?version=1', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).toHaveBeenCalledWith(expected); - }, - ); - - it('uses the manifest entry directory when Webpack auto-detects the Lynx Web client path', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - webpackRequire.lynx_public_path_auto = true; - webpackRequire.p = - 'http://host.example/node_modules/@lynx-js/web-core/dist/client_prod/static/js/'; - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - [ - 'remote:remote-origin', - 'https://cdn.example/remotes/catalog.lynx.bundle', - ], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).toHaveBeenCalledWith( - 'https://cdn.example/remotes/async/Card.bundle', - ); - }); - - it('preserves a protocol-relative remote origin for root public paths', async () => { - const webpackRequire = createWebpackRequire(); - webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; - webpackRequire.p = '/'; - const loadLazyBundle = rs.fn(async () => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadLazyBundle, loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote', 'lynx-cache://catalog'], - ['remote:remote-origin', '//cdn.example/remotes/catalog.lynx.bundle'], - ]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await Promise.all(promises); - - expect(loadLazyBundle).toHaveBeenCalledWith( - '//cdn.example/async/Card.bundle', - ); - }); - - it('preserves the original chunk handler without a registered bundle', () => { - const originalHandler = rs.fn(); - const webpackRequire = createWebpackRequire(); - webpackRequire.f.j = originalHandler; - const globalObject = { - lynx: { loadScript: rs.fn() }, - [LYNX_BUNDLE_REGISTRY]: new Map(), - }; - - expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( - false, - ); - const promises: Promise[] = []; - webpackRequire.f.j('feature', promises); - expect(originalHandler).toHaveBeenCalledWith('feature', promises); - }); - - it('evicts failed section loads so they can be retried', async () => { - const webpackRequire = createWebpackRequire('feature.js'); - const loadScript = rs - .fn<(sectionPath: string, options: { bundleName: string }) => unknown>() - .mockImplementationOnce(() => { - throw new Error('decode failed'); - }) - .mockImplementationOnce(() => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote__main_thread', 'lynx-cache://remote'], - ]), - }; - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - - const failedPromises: Promise[] = []; - webpackRequire.f.j!('feature', failedPromises); - await expect(Promise.all(failedPromises)).rejects.toThrow('decode failed'); - - const retriedPromises: Promise[] = []; - webpackRequire.f.j!('feature', retriedPromises); - await expect(Promise.all(retriedPromises)).resolves.toBeDefined(); - expect(loadScript).toHaveBeenCalledTimes(2); - }); - - it('uses the main-thread container name without appending the realm twice', async () => { - const webpackRequire = createWebpackRequire('feature.js'); - const loadScript = rs.fn(() => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([ - ['remote__main_thread', 'lynx-cache://remote'], - ]), - }; - - expect( - patchLynxChunkLoading( - webpackRequire, - 'remote__main_thread', - globalObject, - ), - ).toBe(true); - - const promises: Promise[] = []; - webpackRequire.f.j!('feature', promises); - await expect(Promise.all(promises)).resolves.toBeDefined(); - expect(loadScript).toHaveBeenCalledWith('feature', { - bundleName: 'lynx-cache://remote', - }); - }); - - it('replaces the Lynx require chunk handler emitted by Rspeedy', async () => { - const webpackRequire = createWebpackRequire('feature.js'); - const originalHandler = rs.fn(); - webpackRequire.f.require = originalHandler; - const loadScript = rs.fn(() => ({ - ids: ['feature'], - modules: {}, - })); - const globalObject = { - lynx: { requireModuleAsync: rs.fn(), loadScript }, - [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), - }; - - patchLynxChunkLoading(webpackRequire, 'remote', globalObject); - const promises: Promise[] = []; - webpackRequire.f.require!('feature', promises); - - await expect(Promise.all(promises)).resolves.toBeDefined(); - expect(loadScript).toHaveBeenCalledWith('feature', { - bundleName: 'lynx-cache://remote', - }); - expect(originalHandler).not.toHaveBeenCalled(); - }); -}); diff --git a/packages/lynx/src/runtimeChunkLoading.testUtils.ts b/packages/lynx/src/runtimeChunkLoading.testUtils.ts new file mode 100644 index 00000000000..4ddf43e1d1b --- /dev/null +++ b/packages/lynx/src/runtimeChunkLoading.testUtils.ts @@ -0,0 +1,40 @@ +import { rs } from '@rstest/core'; + +import { LYNX_BUNDLE_REGISTRY, type LynxWebpackRequire } from './runtimePlugin'; + +export const remoteRegistry = () => + new Map([ + ['remote', 'lynx-cache://catalog'], + ['remote:remote-origin', 'https://cdn.example/remotes/catalog.lynx.bundle'], + ]); + +export const createWebpackRequire = ( + filename = 'chunks/feature.js?cache=1#fragment', +): LynxWebpackRequire => ({ + f: {}, + m: {}, + u: rs.fn(() => filename), +}); + +export const createGlobalObject = ( + loadLazyBundle: (request: string) => PromiseLike, +) => ({ + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: remoteRegistry(), +}); + +export const makeSynchronousThenable = (value: T): PromiseLike => { + const thenable = { + then(onFulfilled?: ((resolved: T) => unknown) | null) { + if (!onFulfilled) { + return makeSynchronousThenable(value); + } + try { + return makeSynchronousThenable(onFulfilled(value)); + } catch (error) { + return Promise.reject(error); + } + }, + }; + return thenable as PromiseLike; +}; diff --git a/packages/lynx/src/runtimeChunkLoading.ts b/packages/lynx/src/runtimeChunkLoading.ts index 8d4980ed93e..c42e51dc114 100644 --- a/packages/lynx/src/runtimeChunkLoading.ts +++ b/packages/lynx/src/runtimeChunkLoading.ts @@ -7,10 +7,10 @@ import { LYNX_BUNDLE_REGISTRY, type LynxGlobal, } from './runtimeCore'; -import { loadWithTimeout } from './runtimeTimeout'; +import { createLazyChunkLoadController } from './lazyChunkLoadController'; type ChunkId = string | number; -type ChunkPromise = PromiseLike; +export type ChunkPromise = PromiseLike; type ChunkHandler = (chunkId: ChunkId, promises: ChunkPromise[]) => void; export interface LynxWebpackRequire { @@ -26,14 +26,14 @@ export interface LynxWebpackRequire { u(chunkId: ChunkId): string; } -interface LynxChunk { +export interface LynxChunk { __lynx_dynamic_component_entry__?: string; ids: ChunkId[]; modules: Record; runtime?: (webpackRequire: LynxWebpackRequire) => void; } -type InstalledChunk = +export type InstalledChunk = | 0 | [ ((value?: unknown) => void) | undefined, @@ -207,19 +207,6 @@ const queryError = (request: string, result: unknown): Error => { return error; }; -const withLazyBundleTimeout = ( - request: string, - timeout: number, - load: PromiseLike, -): Promise => - loadWithTimeout( - timeout, - `Timed out loading Lynx lazy bundle "${request}" after ${timeout}ms.`, - (resolve, reject) => { - load.then(resolve, reject); - }, - ); - const loadQueryComponent = ( request: string, lynx: NonNullable>, @@ -284,116 +271,6 @@ const loadQueryComponent = ( return resolver.promise; }; -type ImmediateLazyLoad = - | { kind: 'pending' } - | { kind: 'installed' } - | { consumes: Promise; kind: 'waiting-consumes'; value: LynxChunk }; - -const loadLazyChunk = ( - request: string, - chunkKey: string, - timeout: number, - lynx: NonNullable>, - webpackRequire: LynxWebpackRequire, - installedChunks: Record, - globalObject: LynxGlobal, -): ChunkPromise => { - const loading: Exclude = [undefined, undefined, undefined]; - installedChunks[chunkKey] = loading; - let active = true; - let insideLoader = true; - const immediate: { current: ImmediateLazyLoad } = { - current: { kind: 'pending' }, - }; - let loaded: ChunkPromise; - try { - loaded = loadQueryComponent(request, lynx, globalObject).then((value) => { - if (!active) { - return value; - } - if (!isChunk(value)) { - throw new Error( - `Lynx lazy bundle "${request}" did not export a valid webpack chunk.`, - ); - } - if (!value.ids.some((id) => String(id) === chunkKey)) { - throw new Error( - `Lynx lazy bundle "${request}" did not include requested chunk "${chunkKey}".`, - ); - } - const consumes = installChunkAfterConsumes( - value, - webpackRequire, - installedChunks, - globalObject, - () => active, - ); - if (!consumes) { - if (insideLoader) { - immediate.current = { kind: 'installed' }; - } - return value; - } - if (insideLoader) { - immediate.current = { consumes, kind: 'waiting-consumes', value }; - return value; - } - return consumes.then(() => value); - }); - } catch (error) { - active = false; - if (installedChunks[chunkKey] === loading) { - delete installedChunks[chunkKey]; - } - return Promise.reject(error); - } - insideLoader = false; - const outcome = immediate.current; - - let primary: ChunkPromise; - switch (outcome.kind) { - case 'installed': - primary = loaded; - break; - case 'waiting-consumes': - primary = withLazyBundleTimeout( - request, - timeout, - outcome.consumes.then(() => outcome.value), - ); - break; - default: - primary = withLazyBundleTimeout(request, timeout, loaded); - } - - let tracked = primary; - if (outcome.kind !== 'installed') { - const installedElsewhere = new Promise((resolve, reject) => { - loading[0] = (value) => { - active = false; - resolve(value); - }; - loading[1] = (error) => { - active = false; - reject(error); - }; - }); - tracked = Promise.race([primary, installedElsewhere]); - } - const promise = tracked.then( - (value) => value, - (error) => { - active = false; - if (installedChunks[chunkKey] === loading) { - delete installedChunks[chunkKey]; - } - throw error; - }, - ); - loading[2] = promise; - return promise; -}; - export const patchLynxChunkLoading = ( webpackRequire: LynxWebpackRequire, originName: string, @@ -442,17 +319,23 @@ export const patchLynxChunkLoading = ( webpackRequire.lynx_public_path_auto ? undefined : webpackRequire.p, lazyBundlePath, ); - promises.push( - loadLazyChunk( - request, - key, - timeout, - lynx, - webpackRequire, - installedChunks, - globalObject, - ), - ); + const controller = createLazyChunkLoadController({ + chunkKey: key, + installedChunks, + timeout, + loadQueryComponent: (lazyRequest) => + loadQueryComponent(lazyRequest, lynx, globalObject), + isChunk, + installChunkAfterConsumes: (chunk, isCurrent) => + installChunkAfterConsumes( + chunk, + webpackRequire, + installedChunks, + globalObject, + isCurrent, + ), + }); + promises.push(controller.load(request)); return; } diff --git a/packages/lynx/src/runtimeChunkUrl.test.ts b/packages/lynx/src/runtimeChunkUrl.test.ts new file mode 100644 index 00000000000..ebef6a3e652 --- /dev/null +++ b/packages/lynx/src/runtimeChunkUrl.test.ts @@ -0,0 +1,235 @@ +import { describe, expect, it, rs } from '@rstest/core'; + +import { LYNX_BUNDLE_REGISTRY, patchLynxChunkLoading } from './runtimePlugin'; +import { + createWebpackRequire, + remoteRegistry, +} from './runtimeChunkLoading.testUtils'; + +describe('patchLynxChunkLoading chunk URLs', () => { + it('captures the remote origin when the container runtime is patched', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const registry = remoteRegistry(); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: registry, + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + registry.set( + 'remote:remote-origin', + 'https://other.example/remotes/catalog.lynx.bundle', + ); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + ); + }); + + it('loads split remote chunks as independently fetched Lynx lazy bundles', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + feature: 'async/catalog__background_Card.123.bundle', + }; + webpackRequire.p = '/remote-assets/'; + const factory = rs.fn(); + const loadScript = rs.fn(); + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'https://cdn.example/cache/catalog.lynx.bundle'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remote-assets/async/catalog__background_Card.123.bundle', + ); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('preserves protocol-relative lazy bundle and public-path URLs', async () => { + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'https://origin.example/catalog.lynx.bundle'], + ['remote:remote-origin', 'https://origin.example/catalog.lynx.bundle'], + ]), + }; + const publicPathRequire = createWebpackRequire(); + publicPathRequire.lynx_aci = { feature: 'async/Card.bundle' }; + publicPathRequire.p = '//cdn.example/assets/'; + patchLynxChunkLoading(publicPathRequire, 'remote', globalObject); + const publicPathPromises: PromiseLike[] = []; + publicPathRequire.f.j!('feature', publicPathPromises); + await Promise.all(publicPathPromises); + + const assetRequire = createWebpackRequire(); + assetRequire.lynx_aci = { + feature: '//assets.example/chunks/Card.bundle', + }; + patchLynxChunkLoading(assetRequire, 'remote', globalObject); + const assetPromises: PromiseLike[] = []; + assetRequire.f.j!('feature', assetPromises); + await Promise.all(assetPromises); + + expect(loadLazyBundle).toHaveBeenNthCalledWith( + 1, + '//cdn.example/assets/async/Card.bundle', + ); + expect(loadLazyBundle).toHaveBeenNthCalledWith( + 2, + '//assets.example/chunks/Card.bundle', + ); + }); + + it.each([ + [ + undefined, + 'async/Card.bundle', + 'https://cdn.example/remotes/async/Card.bundle', + ], + [ + 'auto', + 'async/Card.bundle', + 'https://cdn.example/remotes/async/Card.bundle', + ], + ['/', 'async/Card.bundle', 'https://cdn.example/async/Card.bundle'], + [ + 'assets/', + 'async/Card.bundle', + 'https://cdn.example/remotes/assets/async/Card.bundle', + ], + ['/v2/', 'async/Card.bundle', 'https://cdn.example/v2/async/Card.bundle'], + [ + 'https://assets.example/v3/', + 'async/Card.bundle', + 'https://assets.example/v3/async/Card.bundle', + ], + [ + 'http://assets.example/v4/', + 'async/Card.bundle', + 'http://assets.example/v4/async/Card.bundle', + ], + [ + '/ignored/', + 'https://assets.example/Card.bundle', + 'https://assets.example/Card.bundle', + ], + [ + '/ignored/', + 'http://assets.example/Card.bundle', + 'http://assets.example/Card.bundle', + ], + ])( + 'resolves split public path %s against the manifest entry', + async (publicPath, assetPath, expected) => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: assetPath }; + webpackRequire.p = publicPath; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle?version=1', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith(expected); + }, + ); + + it('uses the manifest entry directory when Webpack auto-detects the Lynx Web client path', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.lynx_public_path_auto = true; + webpackRequire.p = + 'http://host.example/node_modules/@lynx-js/web-core/dist/client_prod/static/js/'; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + ); + }); + + it('preserves a protocol-relative remote origin for root public paths', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.p = '/'; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + ['remote:remote-origin', '//cdn.example/remotes/catalog.lynx.bundle'], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + '//cdn.example/async/Card.bundle', + ); + }); +}); diff --git a/packages/lynx/src/runtimeLazyBundleLoading.test.ts b/packages/lynx/src/runtimeLazyBundleLoading.test.ts new file mode 100644 index 00000000000..367d5bac946 --- /dev/null +++ b/packages/lynx/src/runtimeLazyBundleLoading.test.ts @@ -0,0 +1,488 @@ +import { describe, expect, it, rs } from '@rstest/core'; + +import { + createLazyChunkLoadController, + type InstalledChunk, + type LynxChunk, +} from './lazyChunkLoadController'; +import { LYNX_BUNDLE_REGISTRY, patchLynxChunkLoading } from './runtimePlugin'; +import { + createGlobalObject, + createWebpackRequire, + makeSynchronousThenable, + remoteRegistry, +} from './runtimeChunkLoading.testUtils'; + +describe('patchLynxChunkLoading lazy bundle loading', () => { + it('settles overlapping loads from the first bundle containing both chunks', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + first: 'async/first.bundle', + second: 'async/second.bundle', + }; + const resolvers = new Map void>(); + const globalObject = createGlobalObject( + (request) => + new Promise((resolve) => { + resolvers.set(request, resolve); + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const first: PromiseLike[] = []; + const second: PromiseLike[] = []; + webpackRequire.f.j!('first', first); + webpackRequire.f.j!('second', second); + + const firstFactory = rs.fn(); + const firstRuntime = rs.fn(); + resolvers.get('https://cdn.example/remotes/async/first.bundle')!({ + ids: ['first', 'second'], + modules: { feature: firstFactory }, + runtime: firstRuntime, + }); + await Promise.all([first[0], second[0]]); + + expect(webpackRequire.m.feature).toBe(firstFactory); + expect(firstRuntime).toHaveBeenCalledTimes(1); + + const staleRuntime = rs.fn(); + resolvers.get('https://cdn.example/remotes/async/second.bundle')!({ + ids: ['second'], + modules: { stale: rs.fn() }, + runtime: staleRuntime, + }); + await Promise.resolve(); + expect(webpackRequire.m.stale).toBeUndefined(); + expect(staleRuntime).not.toHaveBeenCalled(); + }); + + it('preserves the official synchronous lazy-bundle thenable', () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + const globalObject = createGlobalObject(() => + makeSynchronousThenable({ + ids: ['feature'], + modules: { factory }, + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + + expect(webpackRequire.m.factory).toBe(factory); + let observed = false; + promises[0].then(() => { + observed = true; + }); + expect(observed).toBe(true); + }); + + it('controller installs a synchronous bundle before returning and notifies its observer synchronously', () => { + const installedChunks: Record = {}; + const modules: Record = {}; + const factory = rs.fn(); + const chunk = { + ids: ['feature'], + modules: { factory }, + } satisfies LynxChunk; + const controller = createLazyChunkLoadController({ + chunkKey: 'feature', + installedChunks, + timeout: 5, + loadQueryComponent: () => makeSynchronousThenable(chunk), + isChunk: (value): value is LynxChunk => value === chunk, + installChunkAfterConsumes: (value, isCurrent) => { + if (isCurrent()) { + Object.assign(modules, value.modules); + for (const id of value.ids) { + installedChunks[String(id)] = 0; + } + } + }, + }); + + const promise = controller.load('async/Card.bundle'); + expect(modules.factory).toBe(factory); + let observed = false; + promise.then(() => { + observed = true; + }); + expect(observed).toBe(true); + }); + + it('controller cannot delete a later retry tuple after stale timed-out consumes reject', async () => { + const installedChunks: Record = {}; + const modules: Record = {}; + const factory = rs.fn(); + const chunk = { + ids: ['feature'], + modules: { factory }, + } satisfies LynxChunk; + const controller = (consumes: Promise) => + createLazyChunkLoadController({ + chunkKey: 'feature', + installedChunks, + timeout: 5, + loadQueryComponent: () => makeSynchronousThenable(chunk), + isChunk: (value): value is LynxChunk => value === chunk, + installChunkAfterConsumes: (value, isCurrent) => + consumes.then(() => { + if (isCurrent()) { + Object.assign(modules, value.modules); + for (const id of value.ids) { + installedChunks[String(id)] = 0; + } + } + }), + }); + let rejectExpired!: (error: Error) => void; + const expiredConsumes = new Promise((_resolve, reject) => { + rejectExpired = reject; + }); + const expired = controller(expiredConsumes).load('async/Card.bundle'); + await expect(expired).rejects.toThrow('Timed out loading Lynx lazy bundle'); + + let resolveFresh!: () => void; + const freshConsumes = new Promise((resolve) => { + resolveFresh = resolve; + }); + const fresh = controller(freshConsumes).load('async/Card.bundle'); + const freshTuple = installedChunks.feature; + rejectExpired(new Error('stale consume failed')); + await Promise.resolve(); + expect(installedChunks.feature).toBe(freshTuple); + resolveFresh(); + await expect(fresh).resolves.toBeDefined(); + expect(modules.factory).toBe(factory); + }); + + it('evicts synchronous lazy-bundle failures so they can be retried', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + let attempt = 0; + const globalObject = createGlobalObject(() => { + if (attempt++ === 0) { + throw new Error('synchronous decode failed'); + } + return makeSynchronousThenable({ + ids: ['feature'], + modules: { factory }, + }); + }); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const failed: PromiseLike[] = []; + webpackRequire.f.j!('feature', failed); + await expect(failed[0]).rejects.toThrow('synchronous decode failed'); + + const retried: PromiseLike[] = []; + webpackRequire.f.j!('feature', retried); + await expect(retried[0]).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('waits for shared consumes from a synchronous lazy bundle', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.consumesLoadingData = { + chunkMapping: { feature: ['shared-state'] }, + }; + let resolveConsume!: () => void; + const consume = new Promise((resolve) => { + resolveConsume = () => { + webpackRequire.m['shared-state'] = rs.fn(); + resolve(); + }; + }); + webpackRequire.f.consumes = (_chunkId, promises) => { + promises.push(consume); + }; + const factory = rs.fn(); + const globalObject = createGlobalObject(() => + makeSynchronousThenable({ + ids: ['feature'], + modules: { factory }, + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + + let observed = false; + promises[0].then(() => { + observed = true; + }); + expect(observed).toBe(false); + expect(webpackRequire.m.factory).toBeUndefined(); + resolveConsume(); + await expect(promises[0]).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('does not let a stale consume rejection cancel a retry', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.consumesLoadingData = { + chunkMapping: { feature: ['shared-state'] }, + }; + let rejectExpired!: (error: Error) => void; + const expiredConsume = new Promise((_resolve, reject) => { + rejectExpired = reject; + }); + let resolveFresh!: () => void; + const freshConsume = new Promise((resolve) => { + resolveFresh = () => { + webpackRequire.m['shared-state'] = rs.fn(); + resolve(); + }; + }); + let consumeAttempt = 0; + webpackRequire.f.consumes = (_chunkId, promises) => { + promises.push(consumeAttempt++ === 0 ? expiredConsume : freshConsume); + }; + const factory = rs.fn(); + const globalObject = createGlobalObject(() => + makeSynchronousThenable({ + ids: ['feature'], + modules: { factory }, + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); + const expired: PromiseLike[] = []; + webpackRequire.f.j!('feature', expired); + await expect(expired[0]).rejects.toThrow( + 'Timed out loading Lynx lazy bundle', + ); + + const fresh: PromiseLike[] = []; + webpackRequire.f.j!('feature', fresh); + rejectExpired(new Error('stale consume failed')); + await Promise.resolve(); + resolveFresh(); + await expect(fresh[0]).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('ignores a stale lazy bundle that resolves after timeout', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const resolvers: Array<(value: unknown) => void> = []; + const globalObject = createGlobalObject( + () => + new Promise((resolve) => { + resolvers.push(resolve); + }), + ); + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); + const expired: PromiseLike[] = []; + webpackRequire.f.j!('feature', expired); + await expect(expired[0]).rejects.toThrow( + 'Timed out loading Lynx lazy bundle', + ); + + const fresh: PromiseLike[] = []; + webpackRequire.f.j!('feature', fresh); + resolvers[0]({ + ids: ['feature'], + modules: { factory: rs.fn() }, + }); + await Promise.resolve(); + expect(webpackRequire.m.factory).toBeUndefined(); + + const freshFactory = rs.fn(); + resolvers[1]({ ids: ['feature'], modules: { factory: freshFactory } }); + await expect(fresh[0]).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(freshFactory); + }); + + it('uses the official lazy-bundle API for split chunks', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + const fetchBundle = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://Card', + })); + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: { factory }, + })); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { + fetchBundle, + loadLazyBundle, + loadScript, + requireModuleAsync: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + ); + expect(fetchBundle).not.toHaveBeenCalled(); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('times out split chunks and permits retry', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const loadLazyBundle = rs.fn(() => new Promise(() => undefined)); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject, 5); + for (let attempt = 0; attempt < 2; attempt += 1) { + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).rejects.toThrow( + 'Timed out loading Lynx lazy bundle', + ); + } + expect(loadLazyBundle).toHaveBeenCalledTimes(2); + }); + + it('rejects split chunks when no DynamicComponent API exists', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const fetchBundle = rs.fn(async () => ({ + code: 0, + url: 'lynx-cache://Card', + })); + const loadScript = rs.fn(); + const globalObject = { + lynx: { fetchBundle, loadScript, requireModuleAsync: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).rejects.toThrow( + 'requires QueryComponent and getDynamicComponentExports', + ); + + expect(fetchBundle).not.toHaveBeenCalled(); + expect(loadScript).not.toHaveBeenCalled(); + }); + + it('loads split chunks through QueryComponent when loadLazyBundle is unavailable', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + feature: 'async/Card.123.bundle', + }; + const factory = rs.fn(); + const chunk = { + ids: ['feature'], + modules: { factory }, + }; + const QueryComponent = rs.fn((_source, callback) => + callback({ code: 0, detail: { schema: 'Card' } }), + ); + const loadScript = rs.fn(); + const globalObject = { + lynx: { + loadScript, + QueryComponent, + requireModuleAsync: rs.fn(), + }, + lynxCoreInject: { + tt: { getDynamicComponentExports: () => chunk }, + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(QueryComponent).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.123.bundle', + expect.any(Function), + ); + expect(loadScript).not.toHaveBeenCalled(); + expect(webpackRequire.m.factory).toBe(factory); + }); + + it('loads main-thread split chunks through the asynchronous Web QueryComponent API', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const factory = rs.fn(); + const chunk = { ids: ['feature'], modules: { factory } }; + const queryComponent = rs.fn((_source, callback) => { + queueMicrotask(() => + callback({ + code: 0, + data: { evalResult: chunk, url: 'https://cdn.example/Card.bundle' }, + }), + ); + return null; + }); + const globalObject = { + __QueryComponent: queryComponent, + lynx: { loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(queryComponent).toHaveBeenCalledWith( + 'https://cdn.example/remotes/async/Card.bundle', + expect.any(Function), + ); + expect(webpackRequire.m.factory).toBe(factory); + }); +}); diff --git a/packages/lynx/src/runtimeSectionLoading.test.ts b/packages/lynx/src/runtimeSectionLoading.test.ts new file mode 100644 index 00000000000..022f4ebb5cd --- /dev/null +++ b/packages/lynx/src/runtimeSectionLoading.test.ts @@ -0,0 +1,249 @@ +import { describe, expect, it, rs } from '@rstest/core'; + +import { + LYNX_BUNDLE_REGISTRY, + patchLynxChunkLoading, + type LynxWebpackRequire, +} from './runtimePlugin'; +import { createWebpackRequire } from './runtimeChunkLoading.testUtils'; + +describe('patchLynxChunkLoading section loading', () => { + it('installs and deduplicates section chunks', async () => { + const webpackRequire = createWebpackRequire(); + const factory = rs.fn(); + const runtime = rs.fn(); + const nestedPromises: Promise[] = []; + const loadScript = rs.fn(() => { + webpackRequire.f.j!('feature', nestedPromises); + return { + ids: ['feature'], + modules: { factory }, + runtime, + }; + }); + const globalObject = { + lynx: { requireModuleAsync: () => undefined, loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), + }; + + expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( + true, + ); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + + expect(loadScript).toHaveBeenCalledTimes(1); + expect(loadScript).toHaveBeenCalledWith('chunks/feature', { + bundleName: 'lynx-cache://remote', + }); + expect(nestedPromises[0]).toBe(promises[0]); + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(webpackRequire.m.factory).toBe(factory); + expect(runtime).toHaveBeenCalledWith(webpackRequire); + }); + + it('loads atomic chunks from sections in the already-fetched container', async () => { + const webpackRequire = createWebpackRequire( + 'async/catalog__background_Card.js', + ); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + webpackRequire.lynx_chunking = 'single'; + const factory = rs.fn(); + const loadLazyBundle = rs.fn(); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript, requireModuleAsync: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://catalog']]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).not.toHaveBeenCalled(); + expect(loadScript).toHaveBeenCalledWith('async/catalog__background_Card', { + bundleName: 'lynx-cache://catalog', + }); + }); + + it('restores the lazy-bundle identity while deferred module factories execute', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const observedEntries: unknown[] = []; + const factory = rs.fn(() => { + observedEntries.push(globalObject.globDynamicComponentEntry); + }); + const globalObject: any = { + globDynamicComponentEntry: '__Card__', + lynx: { + loadLazyBundle: async () => ({ + __lynx_dynamic_component_entry__: 'https://cdn.example/Card.bundle', + ids: ['feature'], + modules: { factory }, + }), + loadScript: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + ['remote:remote-origin', 'https://cdn.example/catalog.lynx.bundle'], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + ( + webpackRequire.m.factory as ( + module: unknown, + exports: unknown, + require: unknown, + ) => unknown + )({}, {}, webpackRequire); + + expect(observedEntries).toEqual(['https://cdn.example/Card.bundle']); + expect(globalObject.globDynamicComponentEntry).toBe('__Card__'); + }); + + it('preserves CommonJS factory this while restoring bundle identity', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; + const observedThis: unknown[] = []; + const factory = function (this: unknown) { + observedThis.push(this); + }; + const globalObject = { + lynx: { + loadLazyBundle: async () => ({ + __lynx_dynamic_component_entry__: 'https://cdn.example/Card.bundle', + ids: ['feature'], + modules: { factory }, + }), + loadScript: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + ['remote:remote-origin', 'https://cdn.example/catalog.lynx.bundle'], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + const module = { exports: {} }; + ( + webpackRequire.m.factory as ( + this: unknown, + module: unknown, + exports: unknown, + runtimeRequire: LynxWebpackRequire, + ) => unknown + ).call(module.exports, module, module.exports, webpackRequire); + + expect(observedThis).toEqual([module.exports]); + }); + + it('preserves the original chunk handler without a registered bundle', () => { + const originalHandler = rs.fn(); + const webpackRequire = createWebpackRequire(); + webpackRequire.f.j = originalHandler; + const globalObject = { + lynx: { loadScript: rs.fn() }, + [LYNX_BUNDLE_REGISTRY]: new Map(), + }; + + expect(patchLynxChunkLoading(webpackRequire, 'remote', globalObject)).toBe( + false, + ); + const promises: Promise[] = []; + webpackRequire.f.j('feature', promises); + expect(originalHandler).toHaveBeenCalledWith('feature', promises); + }); + + it('evicts failed section loads so they can be retried', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const loadScript = rs + .fn<(sectionPath: string, options: { bundleName: string }) => unknown>() + .mockImplementationOnce(() => { + throw new Error('decode failed'); + }) + .mockImplementationOnce(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote__main_thread', 'lynx-cache://remote'], + ]), + }; + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + + const failedPromises: Promise[] = []; + webpackRequire.f.j!('feature', failedPromises); + await expect(Promise.all(failedPromises)).rejects.toThrow('decode failed'); + + const retriedPromises: Promise[] = []; + webpackRequire.f.j!('feature', retriedPromises); + await expect(Promise.all(retriedPromises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledTimes(2); + }); + + it('uses the main-thread container name without appending the realm twice', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote__main_thread', 'lynx-cache://remote'], + ]), + }; + + expect( + patchLynxChunkLoading( + webpackRequire, + 'remote__main_thread', + globalObject, + ), + ).toBe(true); + + const promises: Promise[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledWith('feature', { + bundleName: 'lynx-cache://remote', + }); + }); + + it('replaces the Lynx require chunk handler emitted by Rspeedy', async () => { + const webpackRequire = createWebpackRequire('feature.js'); + const originalHandler = rs.fn(); + webpackRequire.f.require = originalHandler; + const loadScript = rs.fn(() => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { requireModuleAsync: rs.fn(), loadScript }, + [LYNX_BUNDLE_REGISTRY]: new Map([['remote', 'lynx-cache://remote']]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: Promise[] = []; + webpackRequire.f.require!('feature', promises); + + await expect(Promise.all(promises)).resolves.toBeDefined(); + expect(loadScript).toHaveBeenCalledWith('feature', { + bundleName: 'lynx-cache://remote', + }); + expect(originalHandler).not.toHaveBeenCalled(); + }); +}); From ca0409d1f5528f20c1bd52ff7b1d817139a47f73 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 01:50:19 +0000 Subject: [PATCH 32/68] refactor(lynx): simplify lazy load state --- packages/lynx/src/lazyChunkLoadController.ts | 94 ++++++++++---------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/packages/lynx/src/lazyChunkLoadController.ts b/packages/lynx/src/lazyChunkLoadController.ts index cf637c9f9d8..308b328a02a 100644 --- a/packages/lynx/src/lazyChunkLoadController.ts +++ b/packages/lynx/src/lazyChunkLoadController.ts @@ -12,15 +12,14 @@ export type { } from './runtimeChunkLoading'; type LazyChunkLoadState = - | { generation: symbol; kind: 'loading'; phase: 'invoking' | 'pending' } + | { kind: 'loading'; phase: 'invoking' | 'pending' } | { chunk: LynxChunk; consumes: Promise; - generation: symbol; kind: 'waiting-consumes'; } - | { chunk: LynxChunk; generation: symbol; kind: 'installed' } - | { error: unknown; generation: symbol; kind: 'failed' }; + | { chunk: LynxChunk; kind: 'installed' } + | { kind: 'failed' }; interface LazyChunkLoadControllerArgs { chunkKey: string; @@ -45,32 +44,32 @@ export const createLazyChunkLoadController = ({ isChunk, loadQueryComponent, }: LazyChunkLoadControllerArgs) => { - const generation = Symbol(chunkKey); - const loading: Exclude = [undefined, undefined, undefined]; + const loadTuple: Exclude = [ + undefined, + undefined, + undefined, + ]; let state: LazyChunkLoadState = { - generation, kind: 'loading', phase: 'invoking', }; const isCurrent = (): boolean => - state.generation === generation && - state.kind !== 'failed' && - installedChunks[chunkKey] === loading; + state.kind !== 'failed' && installedChunks[chunkKey] === loadTuple; - const fail = (error: unknown): void => { - if (state.generation !== generation || state.kind === 'failed') { + const fail = (): void => { + if (state.kind === 'failed') { return; } - state = { error, generation, kind: 'failed' }; - if (installedChunks[chunkKey] === loading) { + state = { kind: 'failed' }; + if (installedChunks[chunkKey] === loadTuple) { delete installedChunks[chunkKey]; } }; return { load(request: string): ChunkPromise { - installedChunks[chunkKey] = loading; + installedChunks[chunkKey] = loadTuple; let loaded: ChunkPromise; try { loaded = loadQueryComponent(request).then((value) => { @@ -93,51 +92,55 @@ export const createLazyChunkLoadController = ({ state.kind === 'loading' && state.phase === 'invoking'; const consumes = installChunkAfterConsumes(value, isCurrent); if (!consumes) { - state = { chunk: value, generation, kind: 'installed' }; + state = { chunk: value, kind: 'installed' }; return value; } state = { chunk: value, consumes, - generation, kind: 'waiting-consumes', }; return invokedSynchronously ? value : consumes.then(() => value); } catch (error) { - fail(error); + fail(); throw error; } }); } catch (error) { - fail(error); + fail(); return Promise.reject(error); } if (state.kind === 'loading' && state.phase === 'invoking') { - state = { generation, kind: 'loading', phase: 'pending' }; + state = { kind: 'loading', phase: 'pending' }; } const initialState = state; - const primary = - initialState.kind === 'installed' || initialState.kind === 'failed' - ? loaded - : initialState.kind === 'waiting-consumes' - ? loadWithTimeout( - timeout, - timeoutMessage(request, timeout), - (resolve, reject) => { - initialState.consumes - .then(() => initialState.chunk) - .then(resolve, reject); - }, - ) - : loadWithTimeout( - timeout, - timeoutMessage(request, timeout), - (resolve, reject) => { - loaded.then(resolve, reject); - }, - ); + let primary: ChunkPromise; + if (initialState.kind === 'waiting-consumes') { + primary = loadWithTimeout( + timeout, + timeoutMessage(request, timeout), + (resolve, reject) => { + initialState.consumes + .then(() => initialState.chunk) + .then(resolve, reject); + }, + ); + } else if ( + initialState.kind === 'installed' || + initialState.kind === 'failed' + ) { + primary = loaded; + } else { + primary = loadWithTimeout( + timeout, + timeoutMessage(request, timeout), + (resolve, reject) => { + loaded.then(resolve, reject); + }, + ); + } let tracked = primary; if ( @@ -146,18 +149,17 @@ export const createLazyChunkLoadController = ({ isCurrent() ) { const installedElsewhere = new Promise((resolve, reject) => { - loading[0] = (value) => { + loadTuple[0] = (value) => { if (state.kind !== 'failed') { state = { chunk: value as LynxChunk, - generation, kind: 'installed', }; } resolve(value); }; - loading[1] = (error) => { - fail(error); + loadTuple[1] = (error) => { + fail(); reject(error); }; }); @@ -167,11 +169,11 @@ export const createLazyChunkLoadController = ({ const promise = tracked.then( (value) => value, (error) => { - fail(error); + fail(); throw error; }, ); - loading[2] = promise; + loadTuple[2] = promise; return promise; }, }; From 8fbc9bad8bf5ff2ae314880c74a4a9a9ce1dcf12 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 01:57:02 +0000 Subject: [PATCH 33/68] refactor(lynx-demo): serialize remote loading --- .../src/app/App.tsx | 3 +- .../src/app/catalogLoadController.test.ts | 161 +++++++++++++ .../src/app/catalogLoadController.ts | 113 +++++++++ .../src/app/federation.ts | 5 +- .../src/app/useFederatedCatalog.ts | 224 +++++++++--------- 5 files changed, 397 insertions(+), 109 deletions(-) create mode 100644 apps/lynx-module-federation-demo/src/app/catalogLoadController.test.ts create mode 100644 apps/lynx-module-federation-demo/src/app/catalogLoadController.ts diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index d3fa879a86c..4a3a2d6a9dc 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -20,6 +20,7 @@ const MODULES = [ ]; function LoadButton({ state, onTap }: { state: LoadState; onTap: () => void }) { + const disabled = state === 'loading' || state === 'ready'; const label = state === 'loading' ? 'Loading catalog…' @@ -43,7 +44,7 @@ function LoadButton({ state, onTap }: { state: LoadState; onTap: () => void }) { accessibility-label={label} accessibility-traits="button" className={stateClass} - bindtap={onTap} + bindtap={disabled ? undefined : onTap} data-testid="load-remotes" > {label} diff --git a/apps/lynx-module-federation-demo/src/app/catalogLoadController.test.ts b/apps/lynx-module-federation-demo/src/app/catalogLoadController.test.ts new file mode 100644 index 00000000000..3b741e54396 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/catalogLoadController.test.ts @@ -0,0 +1,161 @@ +import type { ComponentType } from '@lynx-js/react'; +import { describe, expect, it, rs } from '@rstest/core'; + +import type { + ActivityFeedProps, + RemoteCardProps, + RemoteDetailsProps, + SharedStateView, +} from '../remote-ui/contracts'; +import type { + ActivityFeedRemoteModule, + CardRemoteModule, + DetailsRemoteModule, +} from './federation'; +import { createCatalogLoadController } from './catalogLoadController'; + +const component = (): ComponentType => + (() => null) as ComponentType; + +const deferred = () => { + let resolve!: (value: Value) => void; + let reject!: (error: unknown) => void; + const promise = new Promise((resolvePromise, rejectPromise) => { + resolve = resolvePromise; + reject = rejectPromise; + }); + return { promise, reject, resolve }; +}; + +const sharedState: SharedStateView = { + count: 3, + instanceId: 'shared-instance', + lastSource: 'catalog/Details', + revision: 2, +}; + +const createModules = (sharedToken: object) => { + const observer = { + sharedInstance: () => sharedState.instanceId, + sharedSnapshot: () => sharedState, + sharedToken: () => sharedToken, + }; + const card: CardRemoteModule = { + ...observer, + default: component(), + touchSharedState: () => sharedState, + }; + const details: DetailsRemoteModule = { + ...observer, + default: component(), + touchSharedState: () => sharedState, + }; + const activityFeed: ActivityFeedRemoteModule = { + ...observer, + default: component(), + }; + return { activityFeed, card, details }; +}; + +describe('catalog load controller', () => { + it('shares one in-flight transaction across repeated calls', async () => { + const sharedToken = {}; + const modules = createModules(sharedToken); + const compiled = deferred<{ + card: CardRemoteModule; + details: DetailsRemoteModule; + }>(); + const runtime = deferred(); + const loadCompiledImportRemotes = rs.fn(() => compiled.promise); + const loadRuntimeActivityFeed = rs.fn(() => runtime.promise); + const controller = createCatalogLoadController({ + instanceId: sharedState.instanceId, + loadCompiledImportRemotes, + loadRuntimeActivityFeed, + snapshot: () => sharedState, + token: sharedToken, + }); + + const first = controller.load(); + const second = controller.load(); + + expect(second).toBe(first); + expect(loadCompiledImportRemotes).toHaveBeenCalledTimes(1); + expect(loadRuntimeActivityFeed).toHaveBeenCalledTimes(1); + + compiled.resolve({ card: modules.card, details: modules.details }); + runtime.resolve(modules.activityFeed); + await expect(first).resolves.toMatchObject({ + activityFeed: modules.activityFeed.default, + card: modules.card.default, + details: modules.details.default, + sharedState, + singletonShared: true, + }); + }); + + it('discards partial results and retries with fresh modules', async () => { + const sharedToken = {}; + const firstModules = createModules(sharedToken); + const retryModules = createModules(sharedToken); + const firstRuntime = deferred(); + const failure = new Error('activity feed unavailable'); + const loadCompiledImportRemotes = rs + .fn() + .mockResolvedValueOnce({ + card: firstModules.card, + details: firstModules.details, + }) + .mockResolvedValueOnce({ + card: retryModules.card, + details: retryModules.details, + }); + const loadRuntimeActivityFeed = rs + .fn<() => Promise>() + .mockImplementationOnce(() => firstRuntime.promise) + .mockResolvedValueOnce(retryModules.activityFeed); + const controller = createCatalogLoadController({ + instanceId: sharedState.instanceId, + loadCompiledImportRemotes, + loadRuntimeActivityFeed, + snapshot: () => sharedState, + token: sharedToken, + }); + + const first = controller.load(); + firstRuntime.reject(failure); + await expect(first).rejects.toBe(failure); + + const retry = await controller.load(); + expect(retry.card).toBe(retryModules.card.default); + expect(retry.details).toBe(retryModules.details.default); + expect(retry.activityFeed).toBe(retryModules.activityFeed.default); + expect(loadCompiledImportRemotes).toHaveBeenCalledTimes(2); + expect(loadRuntimeActivityFeed).toHaveBeenCalledTimes(2); + }); + + it('validates singleton identity only on the first successful load', async () => { + const sharedToken = {}; + const modules = createModules(sharedToken); + const touchCard = rs.fn(() => sharedState); + const touchDetails = rs.fn(() => sharedState); + modules.card.touchSharedState = touchCard; + modules.details.touchSharedState = touchDetails; + const controller = createCatalogLoadController({ + instanceId: sharedState.instanceId, + loadCompiledImportRemotes: async () => ({ + card: modules.card, + details: modules.details, + }), + loadRuntimeActivityFeed: async () => modules.activityFeed, + snapshot: () => sharedState, + token: sharedToken, + }); + + await controller.load(); + await controller.load(); + + expect(touchCard).toHaveBeenCalledTimes(1); + expect(touchDetails).toHaveBeenCalledTimes(1); + }); +}); diff --git a/apps/lynx-module-federation-demo/src/app/catalogLoadController.ts b/apps/lynx-module-federation-demo/src/app/catalogLoadController.ts new file mode 100644 index 00000000000..016d6e21d64 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/catalogLoadController.ts @@ -0,0 +1,113 @@ +import type { ComponentType } from '@lynx-js/react'; + +import type { + ActivityFeedProps, + RemoteCardProps, + RemoteDetailsProps, + SharedStateView, +} from '../remote-ui/contracts'; +import type { + ActivityFeedRemoteModule, + CardRemoteModule, + DetailsRemoteModule, +} from './federation'; + +export interface CatalogLoadResult { + activityFeed: ComponentType; + card: ComponentType; + details: ComponentType; + sharedState: SharedStateView; + singletonShared: boolean; +} + +interface CatalogLoadControllerDependencies { + instanceId: string; + loadCompiledImportRemotes(): Promise<{ + card: CardRemoteModule; + details: DetailsRemoteModule; + }>; + loadRuntimeActivityFeed(): Promise; + snapshot(): SharedStateView; + token: object; +} + +const sharesSingleton = ( + modules: { + activityFeed: ActivityFeedRemoteModule; + card: CardRemoteModule; + details: DetailsRemoteModule; + }, + sharedState: SharedStateView, + instanceId: string, + token: object, +): boolean => + modules.card.sharedToken() === token && + modules.details.sharedToken() === token && + modules.activityFeed.sharedToken() === token && + modules.card.sharedInstance() === instanceId && + modules.details.sharedInstance() === instanceId && + modules.activityFeed.sharedInstance() === instanceId && + [ + modules.card.sharedSnapshot(), + modules.details.sharedSnapshot(), + modules.activityFeed.sharedSnapshot(), + ].every( + (remoteState) => + remoteState.count === sharedState.count && + remoteState.instanceId === sharedState.instanceId, + ); + +export const createCatalogLoadController = ({ + instanceId, + loadCompiledImportRemotes, + loadRuntimeActivityFeed, + snapshot, + token, +}: CatalogLoadControllerDependencies) => { + let inFlight: Promise | undefined; + let validatedSingleton: boolean | undefined; + + const runTransaction = async (): Promise => { + const [compiled, activityFeed] = await Promise.all([ + loadCompiledImportRemotes(), + loadRuntimeActivityFeed(), + ]); + + let sharedState = snapshot(); + if (validatedSingleton === undefined) { + compiled.card.touchSharedState(); + sharedState = compiled.details.touchSharedState(); + validatedSingleton = sharesSingleton( + { activityFeed, ...compiled }, + sharedState, + instanceId, + token, + ); + } + + return { + activityFeed: activityFeed.default, + card: compiled.card.default, + details: compiled.details.default, + sharedState, + singletonShared: validatedSingleton, + }; + }; + + return { + load(): Promise { + if (inFlight) { + return inFlight; + } + + const transaction = runTransaction(); + const tracked = transaction.finally(() => { + if (inFlight === tracked) { + inFlight = undefined; + } + }); + inFlight = tracked; + return tracked; + }, + }; +}; diff --git a/apps/lynx-module-federation-demo/src/app/federation.ts b/apps/lynx-module-federation-demo/src/app/federation.ts index 78524686f7d..2f53fefc9d5 100644 --- a/apps/lynx-module-federation-demo/src/app/federation.ts +++ b/apps/lynx-module-federation-demo/src/app/federation.ts @@ -5,16 +5,17 @@ import type { ActivityFeedProps, RemoteCardProps, RemoteDetailsProps, + SharedStateView, } from '../remote-ui/contracts'; export interface SharedObserverExports { sharedInstance: () => string; - sharedSnapshot: () => { count: number; instanceId: string }; + sharedSnapshot: () => SharedStateView; sharedToken: () => object; } export interface SharedRemoteExports extends SharedObserverExports { - touchSharedState: () => { count: number; instanceId: string }; + touchSharedState: () => SharedStateView; } export interface CardRemoteModule extends SharedRemoteExports { diff --git a/apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts b/apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts index b0b58e687d6..e36054023c4 100644 --- a/apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts +++ b/apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts @@ -1,9 +1,4 @@ -import { - type ComponentType, - useCallback, - useRef, - useState, -} from '@lynx-js/react'; +import { useCallback, useRef, useState } from '@lynx-js/react'; import { increment, @@ -14,12 +9,13 @@ import { } from 'orbit-shared-state'; import type { ActivityEntry, - ActivityFeedProps, ActivityFilter, - RemoteCardProps, - RemoteDetailsProps, SharedStateView, } from '../remote-ui/contracts'; +import { + type CatalogLoadResult, + createCatalogLoadController, +} from './catalogLoadController'; import { loadCompiledImportRemotes, loadRuntimeActivityFeed, @@ -27,6 +23,18 @@ import { export type LoadState = 'idle' | 'loading' | 'ready' | 'error'; +type CatalogState = + | { + status: 'idle' | 'loading'; + sharedState: SharedStateView; + } + | { + error: string; + sharedState: SharedStateView; + status: 'error'; + } + | (CatalogLoadResult & { status: 'ready' }); + const INITIAL_ACTIVITY: ActivityEntry[] = [ { id: 'boot-host', @@ -38,108 +46,103 @@ const INITIAL_ACTIVITY: ActivityEntry[] = [ ]; export function useFederatedCatalog() { - const [loadState, setLoadState] = useState('idle'); - const [loadError, setLoadError] = useState(''); - const [sharedState, setSharedState] = useState(snapshot()); - const [singletonShared, setSingletonShared] = useState(false); + const [catalogState, setCatalogState] = useState({ + sharedState: snapshot(), + status: 'idle', + }); const [activity, setActivity] = useState(INITIAL_ACTIVITY); const [filter, setFilter] = useState('all'); - const [CardComponent, setCardComponent] = - useState | null>(null); - const [DetailsComponent, setDetailsComponent] = - useState | null>(null); - const [ActivityFeedComponent, setActivityFeedComponent] = - useState | null>(null); - const validatedRef = useRef(false); + const controllerRef = useRef( + createCatalogLoadController({ + instanceId, + loadCompiledImportRemotes, + loadRuntimeActivityFeed, + snapshot, + token, + }), + ); + const inFlightRef = useRef | null>(null); - const loadFederatedSurface = useCallback(async () => { + const loadFederatedSurface = useCallback(() => { 'background-only'; - if (loadState === 'loading') { + if (inFlightRef.current) { + return inFlightRef.current; + } + if (catalogState.status === 'ready') { return; } - setLoadState('loading'); - setLoadError(''); - - try { - const [compiled, runtime] = await Promise.all([ - loadCompiledImportRemotes(), - loadRuntimeActivityFeed(), - ]); - - setCardComponent(() => compiled.card.default); - setDetailsComponent(() => compiled.details.default); - setActivityFeedComponent(() => runtime.default); - - let nextSnapshot = snapshot(); - if (!validatedRef.current) { - compiled.card.touchSharedState(); - nextSnapshot = compiled.details.touchSharedState(); - validatedRef.current = true; - } - - const identityShared = - compiled.card.sharedToken() === token && - compiled.details.sharedToken() === token && - runtime.sharedToken() === token && - compiled.card.sharedInstance() === instanceId && - compiled.details.sharedInstance() === instanceId && - runtime.sharedInstance() === instanceId && - [ - compiled.card.sharedSnapshot(), - compiled.details.sharedSnapshot(), - runtime.sharedSnapshot(), - ].every( - (remoteState) => - remoteState.count === nextSnapshot.count && - remoteState.instanceId === nextSnapshot.instanceId, - ); - - setSharedState(nextSnapshot); - setSingletonShared(identityShared); - setLoadState('ready'); - setActivity((entries) => [ - { - id: `state-${nextSnapshot.revision}`, - category: 'state', - detail: `Host, Card, and Details share instance ${instanceId}.`, - time: 'NOW', - title: 'Shared counter updated', + setCatalogState((current) => ({ + sharedState: current.sharedState, + status: 'loading', + })); + const transaction = controllerRef.current.load(); + inFlightRef.current = transaction; + + void transaction + .then( + (result) => { + setCatalogState({ ...result, status: 'ready' }); + const nextSnapshot = result.sharedState; + setActivity((entries) => [ + { + id: `state-${nextSnapshot.revision}`, + category: 'state', + detail: `Host, Card, and Details share instance ${instanceId}.`, + time: 'NOW', + title: 'Shared counter updated', + }, + { + id: 'runtime-feed', + category: 'runtime', + detail: + "Runtime API resolved loadRemote('catalog/ActivityFeed').", + time: 'NOW', + title: 'Activity feed mounted', + }, + { + id: 'compiled-imports', + category: 'runtime', + detail: + 'Compiled imports resolved catalog/Card and catalog/Details.', + time: 'NOW', + title: 'Catalog modules mounted', + }, + { + id: 'manifest-resolved', + category: 'runtime', + detail: + 'mf-manifest.json resolved the remote Lynx bundle over HTTP.', + time: 'NOW', + title: 'Manifest resolved', + }, + ...entries.filter((entry) => entry.id === 'boot-host'), + ]); }, - { - id: 'runtime-feed', - category: 'runtime', - detail: "Runtime API resolved loadRemote('catalog/ActivityFeed').", - time: 'NOW', - title: 'Activity feed mounted', + (error) => { + setCatalogState((current) => ({ + error: error instanceof Error ? error.message : String(error), + sharedState: current.sharedState, + status: 'error', + })); }, - { - id: 'compiled-imports', - category: 'runtime', - detail: 'Compiled imports resolved catalog/Card and catalog/Details.', - time: 'NOW', - title: 'Catalog modules mounted', - }, - { - id: 'manifest-resolved', - category: 'runtime', - detail: 'mf-manifest.json resolved the remote Lynx bundle over HTTP.', - time: 'NOW', - title: 'Manifest resolved', - }, - ...entries.filter((entry) => entry.id === 'boot-host'), - ]); - } catch (error) { - setLoadError(error instanceof Error ? error.message : String(error)); - setLoadState('error'); - } - }, [loadState]); + ) + .finally(() => { + if (inFlightRef.current === transaction) { + inFlightRef.current = null; + } + }); + return transaction; + }, [catalogState.status]); const handleHostIncrement = useCallback(() => { 'background-only'; increment('host/action'); const nextSnapshot = snapshot(); - setSharedState(nextSnapshot); + setCatalogState((current) => ({ + ...current, + sharedState: nextSnapshot, + })); setActivity((entries) => [ { id: `increment-${nextSnapshot.revision}`, @@ -155,7 +158,10 @@ export function useFederatedCatalog() { const handleRemoteStateChange = useCallback( (nextSnapshot: SharedStateView) => { 'background-only'; - setSharedState(nextSnapshot); + setCatalogState((current) => ({ + ...current, + sharedState: nextSnapshot, + })); setActivity((entries) => [ { id: `increment-${nextSnapshot.revision}`, @@ -173,7 +179,10 @@ export function useFederatedCatalog() { const handleReset = useCallback(() => { 'background-only'; const nextSnapshot = reset(); - setSharedState(nextSnapshot); + setCatalogState((current) => ({ + ...current, + sharedState: nextSnapshot, + })); setFilter('all'); setActivity([ { @@ -194,19 +203,22 @@ export function useFederatedCatalog() { }, []); return { - ActivityFeedComponent, - CardComponent, - DetailsComponent, + ActivityFeedComponent: + catalogState.status === 'ready' ? catalogState.activityFeed : null, + CardComponent: catalogState.status === 'ready' ? catalogState.card : null, + DetailsComponent: + catalogState.status === 'ready' ? catalogState.details : null, activity, filter, handleHostIncrement, handleRemoteStateChange, handleReset, - loadError, + loadError: catalogState.status === 'error' ? catalogState.error : '', loadFederatedSurface, - loadState, + loadState: catalogState.status, selectFilter, - sharedState, - singletonShared, + sharedState: catalogState.sharedState, + singletonShared: + catalogState.status === 'ready' && catalogState.singletonShared, }; } From fcc61db3262e3038e1a8055f0ff3123734b026fa Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 02:04:37 +0000 Subject: [PATCH 34/68] refactor(lynx-demo): isolate artifact test output --- .../federation.config.mjs | 5 + .../lynx.catalog.native.config.mjs | 4 +- .../lynx.catalog.web.config.mjs | 4 +- .../lynx.config.mjs | 5 +- .../lynx.remote.native.config.mjs | 3 +- .../lynx.remote.web.config.mjs | 3 +- .../lynx.web.config.mjs | 3 +- .../test/ios/run.mjs | 56 ++---- .../test/native-artifacts.mjs | 107 +++-------- .../test/native-dev-server.mjs | 19 +- .../test/real-web/run.mjs | 119 +++--------- .../test/support/artifact-server.mjs | 172 ++++++++++++++++++ .../test/support/artifact-server.test.mjs | 54 ++++++ 13 files changed, 310 insertions(+), 244 deletions(-) create mode 100644 apps/lynx-module-federation-demo/test/support/artifact-server.mjs create mode 100644 apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs diff --git a/apps/lynx-module-federation-demo/federation.config.mjs b/apps/lynx-module-federation-demo/federation.config.mjs index 32321c89bdc..46fd18ec9ba 100644 --- a/apps/lynx-module-federation-demo/federation.config.mjs +++ b/apps/lynx-module-federation-demo/federation.config.mjs @@ -10,6 +10,11 @@ const implementation = require.resolve('@module-federation/runtime-tools'); export const sharedStateRequest = 'orbit-shared-state'; +export const resolveOutputRoot = (name) => + process.env.LYNX_OUTPUT_ROOT + ? path.resolve(process.env.LYNX_OUTPUT_ROOT, name) + : `dist/${name}`; + export const resolveAliases = { [sharedStateRequest]: path.resolve( appRoot, diff --git a/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs b/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs index c6a72063526..ccc0c12aa58 100644 --- a/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs @@ -2,7 +2,7 @@ import { pluginQRCode } from '@lynx-js/qrcode-rsbuild-plugin'; import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; import { defineConfig } from '@lynx-js/rspeedy'; -import { resolveAliases } from './federation.config.mjs'; +import { resolveAliases, resolveOutputRoot } from './federation.config.mjs'; const catalogDevHost = process.env.CATALOG_DEV_HOST ?? '127.0.0.1'; const catalogDevPort = Number(process.env.CATALOG_DEV_PORT ?? 3001); @@ -23,7 +23,7 @@ export default defineConfig({ output: { cleanDistPath: false, distPath: { - root: 'dist/catalog-native', + root: resolveOutputRoot('catalog-native'), }, minify: true, }, diff --git a/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs b/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs index 03f46622edf..d090a6f562a 100644 --- a/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs @@ -1,7 +1,7 @@ import { pluginReactLynx } from '@lynx-js/react-rsbuild-plugin'; import { defineConfig } from '@lynx-js/rspeedy'; -import { resolveAliases } from './federation.config.mjs'; +import { resolveAliases, resolveOutputRoot } from './federation.config.mjs'; export default defineConfig({ plugins: [pluginReactLynx({ defaultDisplayLinear: false })], @@ -16,7 +16,7 @@ export default defineConfig({ output: { cleanDistPath: false, distPath: { - root: 'dist/catalog-web', + root: resolveOutputRoot('catalog-web'), }, minify: false, }, diff --git a/apps/lynx-module-federation-demo/lynx.config.mjs b/apps/lynx-module-federation-demo/lynx.config.mjs index 50f90ebf667..2dac284b63f 100644 --- a/apps/lynx-module-federation-demo/lynx.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.config.mjs @@ -5,6 +5,7 @@ import { defineConfig } from '@lynx-js/rspeedy'; import { createNativeHostFederationPlugin, resolveAliases, + resolveOutputRoot, } from './federation.config.mjs'; const nativeRemoteOrigin = @@ -23,7 +24,7 @@ const pluginNativeRemoteAssets = { server: { publicDir: { copyOnBuild: false, - name: 'dist', + name: process.env.LYNX_OUTPUT_ROOT ?? 'dist', watch: false, }, }, @@ -50,7 +51,7 @@ export default defineConfig({ output: { cleanDistPath: false, distPath: { - root: 'dist/host-native', + root: resolveOutputRoot('host-native'), }, minify: true, }, diff --git a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs index d3abac05964..44420e789c6 100644 --- a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs @@ -4,6 +4,7 @@ import { defineConfig } from '@lynx-js/rspeedy'; import { createNativeRemoteFederationPlugin, resolveAliases, + resolveOutputRoot, } from './federation.config.mjs'; const nativeRemoteOrigin = @@ -30,7 +31,7 @@ export default defineConfig({ assetPrefix: `${nativeRemoteOrigin}/remote-native/`, cleanDistPath: false, distPath: { - root: 'dist/remote-native', + root: resolveOutputRoot('remote-native'), }, minify: true, }, diff --git a/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs index 4c56a6623de..d649a87e49a 100644 --- a/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs @@ -4,6 +4,7 @@ import { defineConfig } from '@lynx-js/rspeedy'; import { createWebRemoteFederationPlugin, resolveAliases, + resolveOutputRoot, } from './federation.config.mjs'; export default defineConfig({ @@ -26,7 +27,7 @@ export default defineConfig({ assetPrefix: 'auto', cleanDistPath: false, distPath: { - root: 'dist/remote-web', + root: resolveOutputRoot('remote-web'), }, minify: false, }, diff --git a/apps/lynx-module-federation-demo/lynx.web.config.mjs b/apps/lynx-module-federation-demo/lynx.web.config.mjs index fee9e502d94..792b6ebd89e 100644 --- a/apps/lynx-module-federation-demo/lynx.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.web.config.mjs @@ -4,6 +4,7 @@ import { defineConfig } from '@lynx-js/rspeedy'; import { createWebHostFederationPlugin, resolveAliases, + resolveOutputRoot, } from './federation.config.mjs'; const manifestUrl = @@ -25,7 +26,7 @@ export default defineConfig({ output: { cleanDistPath: false, distPath: { - root: 'dist/host-web', + root: resolveOutputRoot('host-web'), }, minify: false, }, diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index 31725939886..debd3fa0899 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -1,6 +1,5 @@ import assert from 'node:assert/strict'; import { spawn, spawnSync } from 'node:child_process'; -import { createReadStream } from 'node:fs'; import { mkdir, readFile, @@ -9,10 +8,11 @@ import { stat, writeFile, } from 'node:fs/promises'; -import { createServer } from 'node:http'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { createArtifactServer } from '../support/artifact-server.mjs'; + const appRoot = path.resolve( path.dirname(fileURLToPath(import.meta.url)), '../..', @@ -26,7 +26,6 @@ const resultBundlePath = path.join( artifactsRoot, 'OrbitControl-Release.xcresult', ); -const requestedPaths = []; await mkdir(artifactsRoot, { recursive: true }); await rm(resultBundlePath, { force: true, recursive: true }); @@ -51,39 +50,6 @@ assert.ok( ); const serverPort = Number(serverURL.port || 80); -const contentTypes = new Map([ - ['.bundle', 'application/octet-stream'], - ['.json', 'application/json; charset=utf-8'], - ['.js', 'text/javascript; charset=utf-8'], -]); -const server = createServer(async (request, response) => { - try { - const pathname = decodeURIComponent( - new URL(request.url, 'http://localhost').pathname, - ); - requestedPaths.push(pathname); - const artifactRoot = pathname.startsWith('/static/') - ? path.join(distRoot, 'host-native') - : distRoot; - const filePath = path.resolve(artifactRoot, `.${pathname}`); - if (!filePath.startsWith(`${artifactRoot}${path.sep}`)) { - response.writeHead(403).end('Forbidden'); - return; - } - const fileStat = await stat(filePath); - if (!fileStat.isFile()) throw new Error('Not a file'); - response.writeHead(200, { - 'Access-Control-Allow-Origin': '*', - 'Content-Length': fileStat.size, - 'Content-Type': - contentTypes.get(path.extname(filePath)) ?? 'application/octet-stream', - }); - createReadStream(filePath).pipe(response); - } catch { - response.writeHead(404).end('Not found'); - } -}); - const run = (command, args, options = {}) => new Promise((resolve, reject) => { const child = spawn(command, args, { @@ -119,10 +85,16 @@ assert.ok( `Simulator ${templateDevice.name} did not report a device type.`, ); -await new Promise((resolve, reject) => { - server.once('error', reject); - server.listen(serverPort, '127.0.0.1', resolve); +const artifactServer = await createArtifactServer({ + port: serverPort, + root: distRoot, + routes: { + '/static/': path.join(distRoot, 'host-native/static'), + }, }); +const { requests } = artifactServer; +const requestedPaths = () => + requests.map(({ path: requestPath }) => requestPath); let deviceUDID; try { @@ -196,7 +168,7 @@ try { expected.push(...lazyFiles); for (const pathname of expected) { assert.ok( - requestedPaths.includes(pathname), + requestedPaths().includes(pathname), `iOS app did not request ${pathname}`, ); } @@ -204,7 +176,7 @@ try { `Native iOS app launched Orbit and standalone Catalog, then loaded async startup, the manifest, container, and ${lazyFiles.length} lazy bundles.\n`, ); } finally { - await writeFile(requestLogPath, JSON.stringify(requestedPaths, null, 2)); + await writeFile(requestLogPath, JSON.stringify(requests, null, 2)); if (deviceUDID) { spawnSync( 'xcrun', @@ -220,5 +192,5 @@ try { encoding: 'utf8', }); } - await new Promise((resolve) => server.close(resolve)); + await artifactServer.close(); } diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index e70e9170585..53b44cec17f 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -4,6 +4,8 @@ import { createRequire } from 'node:module'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { createArtifactServer } from './support/artifact-server.mjs'; + const appRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url))); const requireFromAdapter = createRequire( path.join(appRoot, '../../packages/lynx/package.json'), @@ -58,20 +60,6 @@ assert.ok(!remoteFiles.includes('main.lynx.bundle')); assert.equal(lazyFiles.filter((name) => name.endsWith('.bundle')).length, 3); const startupScripts = startupFiles.filter((name) => name.endsWith('.js')); assert.ok(startupScripts.length > 0); -const startupSources = await Promise.all( - startupScripts.map((name) => - readFile( - path.join(appRoot, 'dist/host-native/static/js/async', name), - 'utf8', - ), - ), -); -assert.ok( - startupSources.some( - (source) => /orbit-.*Date\.now/.test(source) && /increment/.test(source), - ), - 'async startup assets do not contain the host shared-state provider', -); const [hostBundleSource, standaloneSource, remoteBundleSource] = await Promise.all([ @@ -79,7 +67,7 @@ const [hostBundleSource, standaloneSource, remoteBundleSource] = readFile(standaloneBundlePath), readFile(remoteBundlePath), ]); -const hostTemplate = decodeTemplate(hostBundleSource); +decodeTemplate(hostBundleSource); const standaloneTemplate = decodeTemplate(standaloneSource); const remoteTemplate = decodeTemplate(remoteBundleSource); assert.equal(standaloneTemplate['app-type'], 'card'); @@ -87,49 +75,6 @@ assert.ok(standaloneSource.includes(Buffer.from('catalog-standalone-app'))); assert.equal(remoteTemplate['app-type'], 'DynamicComponent'); assert.equal(remoteTemplate['engine-version'], '3.7'); assert.deepEqual(Object.keys(remoteTemplate['custom-sections']), ['catalog']); -const containerSource = remoteTemplate['custom-sections'].catalog; -assert.match(containerSource, /lynx_chunking/); -assert.match(containerSource, /lynx_public_path_auto/); -assert.match(containerSource, /split/); -for (const implementationText of [ - 'Increment from remote', - 'Federated activity', - 'Realm status', -]) { - assert.ok( - !containerSource.includes(implementationText), - `split container includes exposed implementation: ${implementationText}`, - ); -} - -const hostSource = JSON.stringify(hostTemplate); -const hostBackgroundSource = hostTemplate['background-thread-script'] - .map(({ content }) => content ?? '') - .join('\n'); -assert.match( - hostSource, - /http:\/\/127\.0\.0\.1:3000\/remote-native\/mf-manifest\.json/, -); -assert.match(hostSource, /lynx-federation-runtime-plugin/); -assert.ok( - hostBackgroundSource.includes( - 'scopeToSharingDataMapping:{"default:react:background":', - ) && hostBackgroundSource.includes('name:"orbit-shared-state"'), - 'native host does not provide orbit-shared-state in the background realm share scope', -); -assert.ok( - !hostBackgroundSource.includes('"default:react:main-thread"'), - 'background-only native host initializes the main-thread share scope', -); -assert.match(hostBackgroundSource, /mfAsyncStartup/); -assert.match(hostBackgroundSource, /static\/js\/async\//); -for (const request of [ - 'catalog/ActivityFeed', - 'catalog/Card', - 'catalog/Details', -]) { - assert.ok(hostSource.includes(request), `host omits ${request}`); -} const manifest = JSON.parse(manifestSource); const stats = JSON.parse(statsSource); @@ -176,34 +121,6 @@ for (const exposed of manifest.exposes) { lazyTemplate['main-thread-script']?.lepus_code_len > 100, `${lazyName} has no main-thread snapshot bytecode`, ); - const mainThreadBytecode = Buffer.from( - lazyTemplate['main-thread-script'].lepus_code, - ); - assert.ok( - mainThreadBytecode.includes(Buffer.from('react__main-thread')), - `${lazyName} does not use the ReactLynx main-thread chunk contract`, - ); - for (const backgroundWrapperMarker of [ - 'bundleSupportLoadScript', - '__bundle__holder', - ]) { - assert.ok( - !mainThreadBytecode.includes(Buffer.from(backgroundWrapperMarker)), - `${lazyName} main-thread bytecode contains the background runtime wrapper marker ${backgroundWrapperMarker}`, - ); - } - const entryScript = lazyTemplate['background-thread-script'].find( - ({ content }) => content?.includes('__lynx_dynamic_component_entry__'), - ); - assert.ok( - entryScript, - `${lazyName} does not preserve its DynamicComponent entry identity`, - ); - assert.ok( - entryScript.content.lastIndexOf('__lynx_dynamic_component_entry__') < - entryScript.content.lastIndexOf('.require('), - `${lazyName} writes its DynamicComponent entry identity outside the Lynx module wrapper`, - ); assert.ok( !JSON.stringify(exposed).includes('__main_thread'), `${exposed.name} contains a main-thread alias`, @@ -234,6 +151,24 @@ assert.ok( 'no expose records its shared-state dependency', ); +const server = await createArtifactServer({ root: path.join(appRoot, 'dist') }); +try { + await Promise.all([ + server.waitFor('/host-native/main.lynx.bundle'), + server.waitFor('/catalog-native/main.lynx.bundle'), + server.waitFor('/remote-native/mf-manifest.json'), + server.waitFor('/remote-native/catalog.native.lynx.bundle'), + ...startupScripts.map((name) => + server.waitFor(`/host-native/static/js/async/${name}`), + ), + ...lazyFiles + .filter((name) => name.endsWith('.bundle')) + .map((name) => server.waitFor(`/remote-native/async/${name}`)), + ]); +} finally { + await server.close(); +} + console.log( 'Native Lynx host, standalone Catalog, and federation artifacts verified.', ); diff --git a/apps/lynx-module-federation-demo/test/native-dev-server.mjs b/apps/lynx-module-federation-demo/test/native-dev-server.mjs index 405a888d063..77ea51376ba 100644 --- a/apps/lynx-module-federation-demo/test/native-dev-server.mjs +++ b/apps/lynx-module-federation-demo/test/native-dev-server.mjs @@ -1,7 +1,8 @@ import assert from 'node:assert/strict'; -import { mkdtemp, readdir, rename, rm } from 'node:fs/promises'; +import { mkdtemp, readdir, rm } from 'node:fs/promises'; import { createServer } from 'node:net'; import { spawn, spawnSync } from 'node:child_process'; +import os from 'node:os'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -23,17 +24,15 @@ const reservePort = () => const port = await reservePort(); const origin = `http://127.0.0.1:${port}`; +const outputRoot = await mkdtemp(path.join(os.tmpdir(), 'lynx-e2e-')); const devEnvironment = { ...process.env, LYNX_DEV_HOST: '127.0.0.1', LYNX_DEV_PORT: String(port), + LYNX_OUTPUT_ROOT: outputRoot, LYNX_REMOTE_ORIGIN: origin, }; const output = []; -const distRoot = path.join(appRoot, 'dist'); -const backupRoot = await mkdtemp(path.join(appRoot, '.lynx-e2e-')); -const preservedDist = path.join(backupRoot, 'dist'); -await rename(distRoot, preservedDist); let child; const fetchReady = async (url, timeout = 30_000) => { @@ -85,7 +84,7 @@ try { await fetchReady(`${origin}/main.lynx.bundle`); await fetchReady(`${origin}/catalog-native/main.lynx.bundle`); const startupFiles = ( - await readdir(path.join(appRoot, 'dist/host-native/static/js/async')) + await readdir(path.join(outputRoot, 'host-native/static/js/async')) ).filter((name) => name.endsWith('.js')); assert.ok(startupFiles.length > 0); await Promise.all( @@ -105,9 +104,7 @@ try { new URL(`${remoteEntry.path}${remoteEntry.name}`, remoteBase), ); - const lazyFiles = await readdir( - path.join(appRoot, 'dist/remote-native/async'), - ); + const lazyFiles = await readdir(path.join(outputRoot, 'remote-native/async')); const lazyBundles = lazyFiles.filter((name) => name.endsWith('.bundle')); assert.equal(lazyBundles.length, 3); await Promise.all( @@ -127,7 +124,5 @@ try { ]); if (child.exitCode === null) child.kill('SIGKILL'); } - await rm(distRoot, { force: true, recursive: true }); - await rename(preservedDist, distRoot); - await rm(backupRoot, { force: true, recursive: true }); + await rm(outputRoot, { force: true, recursive: true }); } diff --git a/apps/lynx-module-federation-demo/test/real-web/run.mjs b/apps/lynx-module-federation-demo/test/real-web/run.mjs index 2833b97017b..c194a961c20 100644 --- a/apps/lynx-module-federation-demo/test/real-web/run.mjs +++ b/apps/lynx-module-federation-demo/test/real-web/run.mjs @@ -1,10 +1,11 @@ import assert from 'node:assert/strict'; -import { access, mkdir, readFile, readdir, stat } from 'node:fs/promises'; -import { createServer } from 'node:http'; +import { access, mkdir, readdir } from 'node:fs/promises'; import { createRequire } from 'node:module'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; +import { createArtifactServer } from '../support/artifact-server.mjs'; + const testRoot = path.dirname(fileURLToPath(import.meta.url)); const appRoot = path.resolve(testRoot, '../..'); const repoRoot = path.resolve(appRoot, '../..'); @@ -62,89 +63,22 @@ for (const [name, file] of requiredArtifacts) { ); } -const contentTypes = new Map([ - ['.bundle', 'application/octet-stream'], - ['.css', 'text/css; charset=utf-8'], - ['.html', 'text/html; charset=utf-8'], - ['.js', 'text/javascript; charset=utf-8'], - ['.json', 'application/json; charset=utf-8'], - ['.map', 'application/json; charset=utf-8'], - ['.wasm', 'application/wasm'], -]); - -const inside = (root, pathname) => { - const relative = decodeURIComponent(pathname).replace(/^\/+/, ''); - const file = path.resolve(root, relative); - const back = path.relative(root, file); - return back === '' || (!back.startsWith('..') && !path.isAbsolute(back)) - ? file - : undefined; -}; - -const routes = [ - ['/static/', path.join(hostOutputRoot, 'static')], - ['/dist/host-web/', hostOutputRoot], - ['/dist/catalog-web/', standaloneOutputRoot], - ['/dist/remote-web/', remoteOutputRoot], - ['/remote-web/', remoteOutputRoot], - ['/node_modules/@lynx-js/web-core/', webCoreRoot], - ['/node_modules/@lynx-js/web-elements/', webElementsRoot], - ['/test/real-web/', testRoot], -]; - -const requests = []; -let baseUrl; - -const resolveAsset = (pathname) => { - if (pathname === '/') return path.join(testRoot, 'index.html'); - for (const [prefix, root] of routes) { - if (pathname.startsWith(prefix)) { - return inside(root, pathname.slice(prefix.length)); - } - } - return undefined; -}; - -const server = createServer(async (request, response) => { - const pathname = new URL(request.url ?? '/', 'http://127.0.0.1').pathname; - requests.push(pathname); - try { - const file = resolveAsset(pathname); - if (!file || !(await stat(file)).isFile()) { - response.writeHead(404).end('Not found'); - return; - } - - const body = await readFile(file); - - response.writeHead(200, { - 'access-control-allow-origin': '*', - 'cache-control': 'no-store', - 'content-length': body.byteLength, - 'content-type': - contentTypes.get(path.extname(file)) ?? 'application/octet-stream', - 'cross-origin-embedder-policy': 'require-corp', - 'cross-origin-opener-policy': 'same-origin', - }); - if (request.method === 'HEAD') response.end(); - else response.end(body); - } catch (error) { - if (error?.code === 'ENOENT' || error?.code === 'ENOTDIR') { - response.writeHead(404).end('Not found'); - return; - } - response.writeHead(500).end(String(error)); - } +const artifactServer = await createArtifactServer({ + root: testRoot, + routes: { + '/dist/catalog-web/': standaloneOutputRoot, + '/dist/host-web/': hostOutputRoot, + '/dist/remote-web/': remoteOutputRoot, + '/node_modules/@lynx-js/web-core/': webCoreRoot, + '/node_modules/@lynx-js/web-elements/': webElementsRoot, + '/remote-web/': remoteOutputRoot, + '/static/': path.join(hostOutputRoot, 'static'), + '/test/real-web/': testRoot, + }, }); - -await new Promise((resolve, reject) => { - server.once('error', reject); - server.listen(0, '127.0.0.1', resolve); -}); - -const address = server.address(); -assert.ok(address && typeof address === 'object'); -baseUrl = `http://127.0.0.1:${address.port}`; +const { origin: baseUrl, requests } = artifactServer; +const requestedPaths = () => + requests.map(({ path: requestPath }) => requestPath); const playwrightEntry = requireFromRepo.resolve('@playwright/test'); const playwrightModule = await import(pathToFileURL(playwrightEntry)); @@ -152,14 +86,9 @@ const { chromium } = playwrightModule.default ?? playwrightModule; let browser; let failurePage; -const closeServer = () => - new Promise((resolve, reject) => { - server.close((error) => (error ? reject(error) : resolve())); - }); - const close = async () => { await browser?.close(); - await closeServer(); + await artifactServer.close(); }; const onSignal = () => { @@ -343,19 +272,19 @@ try { ); await poll( - () => Promise.resolve(requests), + () => Promise.resolve(requestedPaths()), (values) => values.includes('/dist/remote-web/mf-manifest.json') || values.includes('/remote-web/mf-manifest.json'), 'manifest HTTP request', ); assert.ok( - requests.some((value) => + requestedPaths().some((value) => value.endsWith(`/${path.basename(remoteBundlePath)}`), ), `Remote bundle was not requested: ${JSON.stringify(requests)}`, ); - const lazyBundleRequests = requests.filter( + const lazyBundleRequests = requestedPaths().filter( (value) => value.includes('/async/') && value.endsWith('.bundle'), ); assert.equal( @@ -377,7 +306,7 @@ try { ); for (const file of hostStartupFiles) { assert.ok( - requests.includes(`/static/js/async/${file}`), + requestedPaths().includes(`/static/js/async/${file}`), `async host startup chunk was not requested: ${file}`, ); } @@ -441,7 +370,7 @@ try { 'standalone Catalog mutation source', ); - const standaloneRequests = requests.slice(standaloneRequestStart); + const standaloneRequests = requestedPaths().slice(standaloneRequestStart); assert.ok( standaloneRequests.includes('/dist/catalog-web/main.web.bundle'), `standalone Catalog entry was not requested: ${JSON.stringify(standaloneRequests)}`, diff --git a/apps/lynx-module-federation-demo/test/support/artifact-server.mjs b/apps/lynx-module-federation-demo/test/support/artifact-server.mjs new file mode 100644 index 00000000000..6282925dcc6 --- /dev/null +++ b/apps/lynx-module-federation-demo/test/support/artifact-server.mjs @@ -0,0 +1,172 @@ +import { readFile, realpath, stat } from 'node:fs/promises'; +import { createServer } from 'node:http'; +import path from 'node:path'; + +const contentTypes = new Map([ + ['.bundle', 'application/octet-stream'], + ['.css', 'text/css; charset=utf-8'], + ['.html', 'text/html; charset=utf-8'], + ['.js', 'text/javascript; charset=utf-8'], + ['.json', 'application/json; charset=utf-8'], + ['.map', 'application/json; charset=utf-8'], + ['.wasm', 'application/wasm'], +]); + +const isInside = (root, file) => { + const relative = path.relative(root, file); + return ( + relative === '' || + (relative !== '..' && + !relative.startsWith(`..${path.sep}`) && + !path.isAbsolute(relative)) + ); +}; + +const resolveFile = async (root, relativePath) => { + const candidate = path.resolve(root, relativePath); + if (!isInside(root, candidate)) return { status: 403 }; + + try { + const resolved = await realpath(candidate); + if (!isInside(root, resolved)) return { status: 403 }; + const fileStat = await stat(resolved); + return fileStat.isFile() + ? { file: resolved, status: 200 } + : { status: 404 }; + } catch (error) { + if (error?.code === 'ENOENT' || error?.code === 'ENOTDIR') { + return { status: 404 }; + } + throw error; + } +}; + +const delay = (duration) => + new Promise((resolve) => setTimeout(resolve, duration)); + +export const createArtifactServer = async ({ port = 0, root, routes = {} }) => { + const artifactRoot = await realpath(path.resolve(root)); + const routeEntries = await Promise.all( + Object.entries(routes).map(async ([route, target]) => [ + route, + typeof target === 'string' + ? await realpath(path.resolve(target)) + : target, + ]), + ); + routeEntries.sort(([left], [right]) => right.length - left.length); + const requests = []; + + const server = createServer(async (request, response) => { + let pathname = '/'; + const trace = { + method: request.method ?? 'GET', + path: pathname, + status: undefined, + }; + requests.push(trace); + response.once('finish', () => { + trace.status = response.statusCode; + }); + + try { + const rawPath = (request.url ?? '/').split(/[?#]/, 1)[0]; + pathname = decodeURIComponent(rawPath); + trace.path = pathname; + if (pathname.split(/[\\/]/).includes('..')) { + response.writeHead(403).end('Forbidden'); + return; + } + + for (const [route, target] of routeEntries) { + if (typeof target === 'function' && pathname === route) { + await target(request, response); + return; + } + if (typeof target !== 'string') continue; + + const matchesPrefix = route.endsWith('/') && pathname.startsWith(route); + if (matchesPrefix) { + const resolved = await resolveFile( + target, + pathname.slice(route.length), + ); + await serveFile(request, response, resolved); + return; + } + } + + const resolved = await resolveFile( + artifactRoot, + pathname === '/' ? 'index.html' : pathname.replace(/^\/+/, ''), + ); + await serveFile(request, response, resolved); + } catch (error) { + if (!response.headersSent) response.writeHead(500); + response.end(String(error)); + } + }); + + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(port, '127.0.0.1', resolve); + }); + const address = server.address(); + if (!address || typeof address === 'string') { + throw new Error('Artifact server did not expose a TCP address.'); + } + const origin = `http://127.0.0.1:${address.port}`; + let closePromise; + + return { + origin, + requests, + async waitFor(url, timeout = 30_000) { + const target = new URL(url, origin); + const deadline = Date.now() + timeout; + let lastError; + while (Date.now() < deadline) { + try { + const response = await fetch(target); + if (response.ok) return response; + lastError = new Error(`${response.status} ${response.statusText}`); + await response.body?.cancel(); + } catch (error) { + lastError = error; + } + await delay(100); + } + throw new Error( + `Artifact did not become available at ${target}: ${lastError}`, + ); + }, + close() { + closePromise ??= new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); + return closePromise; + }, + }; +}; + +const serveFile = async (request, response, resolved) => { + if (!resolved.file) { + response + .writeHead(resolved.status) + .end(resolved.status === 403 ? 'Forbidden' : 'Not found'); + return; + } + + const body = await readFile(resolved.file); + response.writeHead(200, { + 'access-control-allow-origin': '*', + 'cache-control': 'no-store', + 'content-length': body.byteLength, + 'content-type': + contentTypes.get(path.extname(resolved.file)) ?? + 'application/octet-stream', + 'cross-origin-embedder-policy': 'require-corp', + 'cross-origin-opener-policy': 'same-origin', + }); + response.end(request.method === 'HEAD' ? undefined : body); +}; diff --git a/apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs b/apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs new file mode 100644 index 00000000000..b947919857f --- /dev/null +++ b/apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs @@ -0,0 +1,54 @@ +import assert from 'node:assert/strict'; +import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; + +import { createArtifactServer } from './artifact-server.mjs'; + +test('serves rooted artifacts, dynamic routes, and request traces', async () => { + const parent = await mkdtemp(path.join(os.tmpdir(), 'lynx-artifacts-')); + const root = path.join(parent, 'public'); + await mkdir(root); + await writeFile(path.join(root, 'artifact.json'), '{"ready":true}'); + await writeFile(path.join(parent, 'secret.txt'), 'secret'); + + const server = await createArtifactServer({ + root, + routes: { + '/health': (_request, response) => { + response.writeHead(200, { 'content-type': 'text/plain' }); + response.end('ready'); + }, + }, + }); + + try { + const artifact = await server.waitFor('/artifact.json', 1_000); + assert.deepEqual(await artifact.json(), { ready: true }); + assert.equal( + await (await fetch(`${server.origin}/health`)).text(), + 'ready', + ); + + const traversal = await fetch(`${server.origin}/%2e%2e%2fsecret.txt`); + assert.equal(traversal.status, 403); + assert.deepEqual( + server.requests.map(({ path: requestPath, status }) => ({ + path: requestPath, + status, + })), + [ + { path: '/artifact.json', status: 200 }, + { path: '/health', status: 200 }, + { path: '/../secret.txt', status: 403 }, + ], + ); + } finally { + await server.close(); + await server.close(); + await rm(parent, { force: true, recursive: true }); + } + + await assert.rejects(fetch(`${server.origin}/artifact.json`)); +}); From 41b4d37109eb760c6830894f3385292d9e623c22 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 02:17:32 +0000 Subject: [PATCH 35/68] refactor(lynx-ios): isolate resource loading boundaries --- .../OrbitControl.xcodeproj/project.pbxproj | 129 ++++++ .../xcschemes/OrbitControl.xcscheme | 6 + .../OrbitControl/OrbitResourceDownloader.h | 21 + .../OrbitControl/OrbitResourceDownloader.m | 166 ++++++++ .../ios/OrbitControl/OrbitResourceFetcher.m | 381 +++--------------- .../ios/OrbitControl/OrbitResourceStore.h | 21 + .../ios/OrbitControl/OrbitResourceStore.m | 106 +++++ .../OrbitControl/OrbitResourceURLResolver.h | 17 + .../OrbitControl/OrbitResourceURLResolver.m | 94 +++++ .../OrbitControlTests/OrbitResourceTests.m | 150 +++++++ .../test/ios-project.mjs | 45 ++- .../test/ios/run.mjs | 1 + 12 files changed, 798 insertions(+), 339 deletions(-) create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.h create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.m create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.h create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.m create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.h create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.m create mode 100644 apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj index 6c8730da798..2731b02e4e4 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj +++ b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj @@ -16,6 +16,14 @@ 100000000000000000000006 /* OrbitControlUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001A /* OrbitControlUITests.swift */; }; 100000000000000000000007 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001C /* Assets.xcassets */; }; 100000000000000000000008 /* static in Resources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001D /* static */; }; + 200000000000000000000001 /* OrbitResourceURLResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000002 /* OrbitResourceURLResolver.m */; }; + 200000000000000000000002 /* OrbitResourceStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000004 /* OrbitResourceStore.m */; }; + 200000000000000000000003 /* OrbitResourceDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000006 /* OrbitResourceDownloader.m */; }; + 200000000000000000000004 /* OrbitResourceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000007 /* OrbitResourceTests.m */; }; + 200000000000000000000005 /* OrbitResourceURLResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000002 /* OrbitResourceURLResolver.m */; }; + 200000000000000000000006 /* OrbitResourceStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000004 /* OrbitResourceStore.m */; }; + 200000000000000000000007 /* OrbitResourceDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000006 /* OrbitResourceDownloader.m */; }; + 200000000000000000000008 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 210000000000000000000009 /* XCTest.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -43,6 +51,15 @@ 10000000000000000000001B /* OrbitControlUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OrbitControlUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 10000000000000000000001C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 10000000000000000000001D /* static */ = {isa = PBXFileReference; lastKnownFileType = folder; path = static; sourceTree = ""; }; + 210000000000000000000001 /* OrbitResourceURLResolver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OrbitResourceURLResolver.h; sourceTree = ""; }; + 210000000000000000000002 /* OrbitResourceURLResolver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OrbitResourceURLResolver.m; sourceTree = ""; }; + 210000000000000000000003 /* OrbitResourceStore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OrbitResourceStore.h; sourceTree = ""; }; + 210000000000000000000004 /* OrbitResourceStore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OrbitResourceStore.m; sourceTree = ""; }; + 210000000000000000000005 /* OrbitResourceDownloader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OrbitResourceDownloader.h; sourceTree = ""; }; + 210000000000000000000006 /* OrbitResourceDownloader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OrbitResourceDownloader.m; sourceTree = ""; }; + 210000000000000000000007 /* OrbitResourceTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OrbitResourceTests.m; sourceTree = ""; }; + 210000000000000000000008 /* OrbitControlTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OrbitControlTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 210000000000000000000009 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = System/Library/Frameworks/XCTest.framework; sourceTree = SDKROOT; }; 2A53B1B55000D34C4A561687 /* libPods-OrbitControl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OrbitControl.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 4CA6D515EC78DF0FF9866EA0 /* Pods-OrbitControl.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OrbitControl.debug.xcconfig"; path = "Target Support Files/Pods-OrbitControl/Pods-OrbitControl.debug.xcconfig"; sourceTree = ""; }; 89120448DFA86FDA0491C6AB /* Pods-OrbitControl.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OrbitControl.release.xcconfig"; path = "Target Support Files/Pods-OrbitControl/Pods-OrbitControl.release.xcconfig"; sourceTree = ""; }; @@ -64,6 +81,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 250000000000000000000002 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 200000000000000000000008 /* XCTest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -73,6 +98,7 @@ 100000000000000000000061 /* OrbitControl */, 100000000000000000000062 /* Resources */, 100000000000000000000063 /* OrbitControlUITests */, + 260000000000000000000005 /* OrbitControlTests */, 100000000000000000000064 /* Products */, E38B361A9360FB49B8107C77 /* Pods */, 637A738AE6E27E006103F4CC /* Frameworks */, @@ -86,6 +112,12 @@ 100000000000000000000012 /* ViewController.swift */, 100000000000000000000013 /* OrbitResourceFetcher.h */, 100000000000000000000014 /* OrbitResourceFetcher.m */, + 210000000000000000000001 /* OrbitResourceURLResolver.h */, + 210000000000000000000002 /* OrbitResourceURLResolver.m */, + 210000000000000000000003 /* OrbitResourceStore.h */, + 210000000000000000000004 /* OrbitResourceStore.m */, + 210000000000000000000005 /* OrbitResourceDownloader.h */, + 210000000000000000000006 /* OrbitResourceDownloader.m */, 100000000000000000000015 /* OrbitControl-Bridging-Header.h */, 100000000000000000000016 /* Info.plist */, 100000000000000000000017 /* Info.Debug.plist */, @@ -117,13 +149,23 @@ children = ( 100000000000000000000010 /* OrbitControl.app */, 10000000000000000000001B /* OrbitControlUITests.xctest */, + 210000000000000000000008 /* OrbitControlTests.xctest */, ); name = Products; sourceTree = ""; }; + 260000000000000000000005 /* OrbitControlTests */ = { + isa = PBXGroup; + children = ( + 210000000000000000000007 /* OrbitResourceTests.m */, + ); + path = OrbitControlTests; + sourceTree = ""; + }; 637A738AE6E27E006103F4CC /* Frameworks */ = { isa = PBXGroup; children = ( + 210000000000000000000009 /* XCTest.framework */, 2A53B1B55000D34C4A561687 /* libPods-OrbitControl.a */, ); name = Frameworks; @@ -179,6 +221,23 @@ productReference = 10000000000000000000001B /* OrbitControlUITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; + 240000000000000000000002 /* OrbitControlTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 270000000000000000000003 /* Build configuration list for PBXNativeTarget "OrbitControlTests" */; + buildPhases = ( + 280000000000000000000004 /* Sources */, + 250000000000000000000002 /* Frameworks */, + 280000000000000000000005 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OrbitControlTests; + productName = OrbitControlTests; + productReference = 210000000000000000000008 /* OrbitControlTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -196,6 +255,9 @@ CreatedOnToolsVersion = 16.4; TestTargetID = 100000000000000000000040; }; + 240000000000000000000002 = { + CreatedOnToolsVersion = 16.4; + }; }; }; buildConfigurationList = 100000000000000000000072 /* Build configuration list for PBXProject "OrbitControl" */; @@ -213,6 +275,7 @@ targets = ( 100000000000000000000040 /* OrbitControl */, 100000000000000000000041 /* OrbitControlUITests */, + 240000000000000000000002 /* OrbitControlTests */, ); }; /* End PBXProject section */ @@ -236,6 +299,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 280000000000000000000005 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -288,6 +358,9 @@ 100000000000000000000001 /* AppDelegate.swift in Sources */, 100000000000000000000002 /* ViewController.swift in Sources */, 100000000000000000000003 /* OrbitResourceFetcher.m in Sources */, + 200000000000000000000001 /* OrbitResourceURLResolver.m in Sources */, + 200000000000000000000002 /* OrbitResourceStore.m in Sources */, + 200000000000000000000003 /* OrbitResourceDownloader.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -299,6 +372,17 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 280000000000000000000004 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 200000000000000000000004 /* OrbitResourceTests.m in Sources */, + 200000000000000000000005 /* OrbitResourceURLResolver.m in Sources */, + 200000000000000000000006 /* OrbitResourceStore.m in Sources */, + 200000000000000000000007 /* OrbitResourceDownloader.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -450,6 +534,42 @@ }; name = Release; }; + 2200000000000000000000A6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.modulefederation.lynx.demo.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 2200000000000000000000A7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.modulefederation.lynx.demo.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -480,6 +600,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 270000000000000000000003 /* Build configuration list for PBXNativeTarget "OrbitControlTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2200000000000000000000A6 /* Debug */, + 2200000000000000000000A7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 100000000000000000000030 /* Project object */; diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme index 89de9fd1c94..371cf4755af 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme +++ b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme @@ -8,6 +8,9 @@ + + + @@ -15,6 +18,9 @@ + + + diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.h b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.h new file mode 100644 index 00000000000..812f2fdda6c --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.h @@ -0,0 +1,21 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSUInteger const OrbitResourceDownloadByteLimit; + +typedef void (^OrbitResourceDownloadCompletion)(NSData *_Nullable, + NSURLResponse *_Nullable, + NSError *_Nullable); + +@interface OrbitResourceDownloader : NSObject + +- (instancetype)init; +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration + NS_DESIGNATED_INITIALIZER; +- (dispatch_block_t)downloadURL:(NSURL *)url + completion:(OrbitResourceDownloadCompletion)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.m new file mode 100644 index 00000000000..53a5b4f3d62 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.m @@ -0,0 +1,166 @@ +#import "OrbitResourceDownloader.h" + +NSUInteger const OrbitResourceDownloadByteLimit = 64 * 1024 * 1024; + +static NSString *const OrbitResourceDownloadErrorDomain = + @"org.modulefederation.lynx.resources"; + +@interface OrbitResourceDownloader () + +@property(nonatomic, strong) NSMutableDictionary *completions; +@property(nonatomic, strong) NSMutableSet *oversizedTasks; +@property(nonatomic, strong) NSURLSession *session; + +@end + +@implementation OrbitResourceDownloader + +- (instancetype)init { + NSURLSessionConfiguration *configuration = + NSURLSessionConfiguration.ephemeralSessionConfiguration; + configuration.timeoutIntervalForRequest = 30; + configuration.timeoutIntervalForResource = 60; + configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; + return [self initWithSessionConfiguration:configuration]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { + self = [super init]; + if (self) { + _completions = [NSMutableDictionary dictionary]; + _oversizedTasks = [NSMutableSet set]; + _session = [NSURLSession sessionWithConfiguration:configuration + delegate:self + delegateQueue:nil]; + } + return self; +} + +- (void)dealloc { + [self.session invalidateAndCancel]; +} + +- (dispatch_block_t)downloadURL:(NSURL *)url + completion:(OrbitResourceDownloadCompletion)completion { + NSURLSessionDownloadTask *task = [self.session downloadTaskWithURL:url]; + @synchronized(self) { + self.completions[@(task.taskIdentifier)] = [completion copy]; + } + [task resume]; + return ^{ [task cancel]; }; +} + +- (OrbitResourceDownloadCompletion)takeCompletionForTask:(NSURLSessionTask *)task { + @synchronized(self) { + NSNumber *key = @(task.taskIdentifier); + OrbitResourceDownloadCompletion completion = self.completions[key]; + [self.completions removeObjectForKey:key]; + return completion; + } +} + +- (NSError *)errorForURL:(NSURL *)url prefix:(NSString *)prefix { + return [NSError errorWithDomain:OrbitResourceDownloadErrorDomain + code:1 + userInfo:@{ + NSLocalizedDescriptionKey: + [NSString stringWithFormat:@"%@: %@", + prefix, + url.absoluteString] + }]; +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { + (void)session; + (void)bytesWritten; + if (totalBytesWritten > (int64_t)OrbitResourceDownloadByteLimit || + totalBytesExpectedToWrite > (int64_t)OrbitResourceDownloadByteLimit) { + @synchronized(self) { + [self.oversizedTasks addObject:@(downloadTask.taskIdentifier)]; + } + [downloadTask cancel]; + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location { + (void)session; + OrbitResourceDownloadCompletion completion = + [self takeCompletionForTask:downloadTask]; + if (!completion) { + [NSFileManager.defaultManager removeItemAtURL:location error:nil]; + return; + } + + NSError *resultError = nil; + NSData *data = nil; + NSURLResponse *response = downloadTask.response; + if ([response isKindOfClass:NSHTTPURLResponse.class]) { + NSInteger statusCode = ((NSHTTPURLResponse *)response).statusCode; + if (statusCode < 200 || statusCode >= 300) { + resultError = [NSError errorWithDomain:OrbitResourceDownloadErrorDomain + code:1 + userInfo:@{ + NSLocalizedDescriptionKey: + [NSString stringWithFormat: + @"Lynx resource request failed with HTTP %ld: %@", + (long)statusCode, + downloadTask.originalRequest.URL.absoluteString] + }]; + } + } + + NSNumber *fileSize = nil; + if (!resultError && + ![location getResourceValue:&fileSize + forKey:NSURLFileSizeKey + error:&resultError]) { + fileSize = nil; + } + if (!resultError && + (response.expectedContentLength > (long long)OrbitResourceDownloadByteLimit || + fileSize.unsignedLongLongValue > OrbitResourceDownloadByteLimit)) { + resultError = [self errorForURL:downloadTask.originalRequest.URL + prefix:@"Lynx resource exceeds 64 MiB"]; + } + if (!resultError) { + data = [NSData dataWithContentsOfURL:location + options:NSDataReadingMappedIfSafe + error:&resultError]; + if (!data && !resultError) { + resultError = [self errorForURL:downloadTask.originalRequest.URL + prefix:@"Lynx resource request returned no data"]; + } + } + [NSFileManager.defaultManager removeItemAtURL:location error:nil]; + completion(data, response, resultError); +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error { + (void)session; + if (!error) return; + + BOOL oversized; + @synchronized(self) { + NSNumber *key = @(task.taskIdentifier); + oversized = [self.oversizedTasks containsObject:key]; + [self.oversizedTasks removeObject:key]; + } + OrbitResourceDownloadCompletion completion = [self takeCompletionForTask:task]; + if (!completion) return; + completion(nil, + task.response, + oversized + ? [self errorForURL:task.originalRequest.URL + prefix:@"Lynx resource exceeds 64 MiB"] + : error); +} + +@end diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m index fcd9d4c2cb9..04b99f3b6b2 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.m @@ -2,150 +2,68 @@ #import "OrbitResourceFetcher.h" +#import "OrbitResourceDownloader.h" +#import "OrbitResourceStore.h" +#import "OrbitResourceURLResolver.h" + #import #import #import -static NSString *const OrbitResourceErrorDomain = @"org.modulefederation.lynx.resources"; -static NSUInteger const OrbitResourcePathCacheByteLimit = 64 * 1024 * 1024; -static NSUInteger const OrbitResourceResponseByteLimit = 64 * 1024 * 1024; - -typedef void (^OrbitResourceDownloadCompletion)(NSURL *_Nullable, - NSURLResponse *_Nullable, - NSError *_Nullable); +static NSString *const OrbitResourceErrorDomain = + @"org.modulefederation.lynx.resources"; -@interface OrbitResourceSessionDelegate : NSObject - -@property(nonatomic, strong) NSMutableDictionary *completions; +@interface OrbitResourceFetcher () -- (NSURLSessionDownloadTask *)downloadURL:(NSURL *)url - session:(NSURLSession *)session - completion:(OrbitResourceDownloadCompletion)completion; +@property(nonatomic, strong) OrbitResourceDownloader *downloader; +@property(nonatomic, strong) OrbitResourceURLResolver *resolver; +@property(nonatomic, strong) OrbitResourceStore *store; @end -@implementation OrbitResourceSessionDelegate -- (instancetype)init { +@implementation OrbitResourceFetcher + +- (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL { self = [super init]; if (self) { - _completions = [NSMutableDictionary dictionary]; + _downloader = [[OrbitResourceDownloader alloc] init]; + _resolver = [[OrbitResourceURLResolver alloc] + initWithRootBundleURL:rootBundleURL]; + _store = [[OrbitResourceStore alloc] init]; } return self; } -- (NSURLSessionDownloadTask *)downloadURL:(NSURL *)url - session:(NSURLSession *)session - completion:(OrbitResourceDownloadCompletion)completion { - NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url]; - @synchronized(self) { - self.completions[@(task.taskIdentifier)] = [completion copy]; - } - [task resume]; - return task; -} - -- (OrbitResourceDownloadCompletion)takeCompletionForTask:(NSURLSessionTask *)task { - @synchronized(self) { - NSNumber *key = @(task.taskIdentifier); - OrbitResourceDownloadCompletion completion = self.completions[key]; - [self.completions removeObjectForKey:key]; - return completion; - } -} - -- (void)URLSession:(NSURLSession *)session - downloadTask:(NSURLSessionDownloadTask *)downloadTask - didWriteData:(int64_t)bytesWritten - totalBytesWritten:(int64_t)totalBytesWritten -totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { - (void)session; - (void)bytesWritten; - if (totalBytesWritten > (int64_t)OrbitResourceResponseByteLimit || - totalBytesExpectedToWrite > (int64_t)OrbitResourceResponseByteLimit) { - [downloadTask cancel]; - } -} - -- (void)URLSession:(NSURLSession *)session - downloadTask:(NSURLSessionDownloadTask *)downloadTask -didFinishDownloadingToURL:(NSURL *)location { - OrbitResourceDownloadCompletion completion = - [self takeCompletionForTask:downloadTask]; - if (completion) { - completion(location, downloadTask.response, nil); - } -} - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task -didCompleteWithError:(NSError *)error { - (void)session; - if (!error) return; - OrbitResourceDownloadCompletion completion = [self takeCompletionForTask:task]; - if (completion) { - completion(nil, task.response, error); - } +- (NSError *)errorWithMessage:(NSString *)message { + return [NSError errorWithDomain:OrbitResourceErrorDomain + code:1 + userInfo:@{NSLocalizedDescriptionKey: message}]; } -@end - -@interface OrbitResourceFetcher () - -@property(nonatomic, strong) NSMutableDictionary *resourcePathCache; -@property(nonatomic, strong) NSURL *resourceCacheDirectory; -@property(nonatomic, assign) NSUInteger resourcePathCacheBytes; -@property(nonatomic, strong, nullable) NSURL *rootBundleURL; -@property(nonatomic, strong) NSURLSession *session; -@property(nonatomic, strong) OrbitResourceSessionDelegate *sessionDelegate; - - (dispatch_block_t)loadDataForURLString:(NSString *)urlString completion:(void (^)(NSData *_Nullable, - NSError *_Nullable))completion; -- (NSURL *_Nullable)localURLForString:(NSString *)urlString; -- (NSString *)resolvedURLString:(NSString *)urlString; -- (BOOL)isAllowedLocalURL:(NSURL *)url; -- (NSString *_Nullable)cachedResourcePathForURLString:(NSString *)urlString; -- (NSString *_Nullable)storeResourceData:(NSData *)data - forURLString:(NSString *)urlString - error:(NSError **)error; -- (NSError *)errorWithMessage:(NSString *)message; - -@end - -@implementation OrbitResourceFetcher + NSError *_Nullable))completion { + NSURL *url = [self.resolver resolvedURLForString:urlString]; + if (!url) { + completion(nil, [self errorWithMessage:[NSString stringWithFormat: + @"Unsupported Lynx resource URL: %@", urlString]]); + return ^{}; + } -- (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL { - self = [super init]; - if (self) { - NSURL *rootURL = [NSURL URLWithString:rootBundleURL]; - if ([rootURL.scheme isEqualToString:@"http"] || - [rootURL.scheme isEqualToString:@"https"]) { - _rootBundleURL = rootURL; - } - _resourcePathCache = [NSMutableDictionary dictionary]; - NSURLSessionConfiguration *sessionConfiguration = - [NSURLSessionConfiguration ephemeralSessionConfiguration]; - sessionConfiguration.timeoutIntervalForRequest = 30; - sessionConfiguration.timeoutIntervalForResource = 60; - sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; - _sessionDelegate = [[OrbitResourceSessionDelegate alloc] init]; - _session = [NSURLSession sessionWithConfiguration:sessionConfiguration - delegate:_sessionDelegate - delegateQueue:nil]; - _resourceCacheDirectory = [[[NSURL fileURLWithPath:NSTemporaryDirectory() - isDirectory:YES] - URLByAppendingPathComponent:@"OrbitResources" - isDirectory:YES] - URLByAppendingPathComponent:NSUUID.UUID.UUIDString - isDirectory:YES]; + if (url.isFileURL) { + NSError *error = nil; + NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error]; + completion(data, error); + return ^{}; } - return self; -} -- (void)dealloc { - [self.session invalidateAndCancel]; - [[NSFileManager defaultManager] removeItemAtURL:self.resourceCacheDirectory error:nil]; + return [self.downloader + downloadURL:url + completion:^(NSData *data, NSURLResponse *response, NSError *error) { + (void)response; + completion(data, error); + }]; } - (void)configureBuilder:(LynxViewBuilder *)builder { @@ -166,7 +84,9 @@ - (void)fetchTemplate:(LynxResourceRequest *)request onComplete:(LynxTemplateResourceCompletionBlock)callback { [self loadDataForURLString:request.url completion:^(NSData *data, NSError *error) { - callback(data ? [[LynxTemplateResource alloc] initWithNSData:data] : nil, + callback(data + ? [[LynxTemplateResource alloc] initWithNSData:data] + : nil, error); }]; } @@ -183,214 +103,39 @@ - (dispatch_block_t)fetchResource:(LynxResourceRequest *)request - (dispatch_block_t)fetchResourcePath:(LynxResourceRequest *)request onComplete:(LynxGenericResourcePathCompletionBlock)callback { - NSString *urlString = [self resolvedURLString:request.url]; - NSURL *localURL = [self localURLForString:urlString]; - if (localURL) { - callback(localURL.path, nil); + NSURL *url = [self.resolver resolvedURLForString:request.url]; + if (!url) { + callback(nil, [self errorWithMessage:[NSString stringWithFormat: + @"Unsupported Lynx resource URL: %@", request.url]]); return ^{}; } - - NSString *cachedPath = [self cachedResourcePathForURLString:urlString]; - if (cachedPath) { - callback(cachedPath, nil); - return ^{}; - } - - return [self loadDataForURLString:urlString - completion:^(NSData *data, NSError *error) { - if (!data) { - callback(nil, error); - return; - } - - NSError *writeError = nil; - NSString *path = [self storeResourceData:data - forURLString:urlString - error:&writeError]; - callback(path, writeError); - }]; -} - -- (NSString *_Nullable)cachedResourcePathForURLString:(NSString *)urlString { - @synchronized(self) { - return self.resourcePathCache[urlString]; - } -} - -- (NSString *_Nullable)storeResourceData:(NSData *)data - forURLString:(NSString *)urlString - error:(NSError **)error { - @synchronized(self) { - NSString *existingPath = self.resourcePathCache[urlString]; - if (existingPath) return existingPath; - if (data.length > - OrbitResourcePathCacheByteLimit - self.resourcePathCacheBytes) { - *error = [self errorWithMessage:@"Lynx resource path cache exceeded 64 MiB"]; - return nil; - } - - [[NSFileManager defaultManager] createDirectoryAtURL:self.resourceCacheDirectory - withIntermediateDirectories:YES - attributes:nil - error:error]; - if (*error) return nil; - - NSString *extension = [NSURL URLWithString:urlString].pathExtension; - NSString *filename = NSUUID.UUID.UUIDString; - if (extension.length > 0) { - filename = [filename stringByAppendingPathExtension:extension]; - } - NSURL *fileURL = [self.resourceCacheDirectory URLByAppendingPathComponent:filename]; - if (![data writeToURL:fileURL options:NSDataWritingAtomic error:error]) return nil; - - self.resourcePathCache[urlString] = fileURL.path; - self.resourcePathCacheBytes += data.length; - return fileURL.path; - } -} - -- (dispatch_block_t)loadDataForURLString:(NSString *)urlString - completion:(void (^)(NSData *_Nullable, - NSError *_Nullable))completion { - urlString = [self resolvedURLString:urlString]; - NSURL *localURL = [self localURLForString:urlString]; - if (localURL) { - NSError *error = nil; - NSData *data = [NSData dataWithContentsOfURL:localURL options:0 error:&error]; - completion(data, error); + if (url.isFileURL) { + callback(url.path, nil); return ^{}; } - NSURL *url = [NSURL URLWithString:urlString]; - if (!url || !([url.scheme isEqualToString:@"http"] || - [url.scheme isEqualToString:@"https"])) { - completion(nil, [self errorWithMessage:[NSString stringWithFormat: - @"Unsupported Lynx resource URL: %@", urlString]]); + NSString *urlString = url.absoluteString; + NSString *cachedPath = [self.store pathForURLString:urlString]; + if (cachedPath) { + callback(cachedPath, nil); return ^{}; } - NSURLSessionDownloadTask *task = [self.sessionDelegate + return [self.downloader downloadURL:url - session:self.session - completion:^(NSURL *location, NSURLResponse *response, NSError *error) { - if (error) { - completion(nil, error); - return; - } - - if ([response isKindOfClass:[NSHTTPURLResponse class]]) { - NSInteger statusCode = ((NSHTTPURLResponse *)response).statusCode; - if (statusCode < 200 || statusCode >= 300) { - completion(nil, [self errorWithMessage:[NSString stringWithFormat: - @"Lynx resource request failed with HTTP %ld: %@", - (long)statusCode, urlString]]); + completion:^(NSData *data, NSURLResponse *response, NSError *error) { + (void)response; + if (!data) { + callback(nil, error); return; } - } - - long long expectedLength = response.expectedContentLength; - if (expectedLength > (long long)OrbitResourceResponseByteLimit) { - completion(nil, [self errorWithMessage:[NSString stringWithFormat: - @"Lynx resource exceeds 64 MiB: %@", urlString]]); - return; - } - - if (!location) { - completion(nil, [self errorWithMessage:[NSString stringWithFormat: - @"Lynx resource request returned no data: %@", urlString]]); - return; - } - - NSError *readError = nil; - NSNumber *fileSize = nil; - if (![location getResourceValue:&fileSize - forKey:NSURLFileSizeKey - error:&readError]) { - completion(nil, readError); - return; - } - if (fileSize.unsignedLongLongValue > OrbitResourceResponseByteLimit) { - completion(nil, [self errorWithMessage:[NSString stringWithFormat: - @"Lynx resource exceeds 64 MiB: %@", urlString]]); - return; - } - - NSData *data = [NSData dataWithContentsOfURL:location - options:NSDataReadingMappedIfSafe - error:&readError]; - if (!data) { - completion(nil, readError ?: [self errorWithMessage:[NSString stringWithFormat: - @"Lynx resource request returned no data: %@", urlString]]); - return; - } - completion(data, nil); - }]; - return ^{ [task cancel]; }; -} - -- (NSString *)resolvedURLString:(NSString *)urlString { - if (!self.rootBundleURL || ![urlString hasPrefix:@"/static/"]) { - return urlString; - } - return [NSURL URLWithString:urlString - relativeToURL:self.rootBundleURL].absoluteURL.absoluteString - ?: urlString; -} - -- (NSURL *_Nullable)localURLForString:(NSString *)urlString { - NSURL *url = [NSURL URLWithString:urlString]; - if ([url.scheme isEqualToString:@"file"]) { - return [self isAllowedLocalURL:url] ? url : nil; - } - if ([url.scheme isEqualToString:@"http"] || - [url.scheme isEqualToString:@"https"]) { - return nil; - } - NSString *relativePath; - if ([urlString isAbsolutePath]) { - NSURL *fileURL = [NSURL fileURLWithPath:urlString]; - if ([self isAllowedLocalURL:fileURL]) return fileURL; - if (![urlString hasPrefix:@"/static/"]) return nil; - relativePath = [urlString substringFromIndex:1]; - } else { - relativePath = url.path.length > 0 ? url.path : urlString; - } - - relativePath = relativePath.stringByStandardizingPath; - if (relativePath.length == 0 || [relativePath isEqualToString:@"."] || - [relativePath isEqualToString:@".."] || - [relativePath hasPrefix:@"../"]) { - return nil; - } - NSString *filename = relativePath.lastPathComponent; - NSString *subdirectory = relativePath.stringByDeletingLastPathComponent; - NSString *extension = filename.pathExtension; - NSString *name = extension.length > 0 - ? [filename stringByDeletingPathExtension] - : filename; - return [[NSBundle mainBundle] URLForResource:name - withExtension:extension.length > 0 ? extension : nil - subdirectory:[subdirectory isEqualToString:@"."] - ? nil - : subdirectory]; -} - -- (BOOL)isAllowedLocalURL:(NSURL *)url { - NSString *path = url.URLByStandardizingPath.URLByResolvingSymlinksInPath.path; - for (NSURL *directory in @[[NSBundle mainBundle].bundleURL, - self.resourceCacheDirectory]) { - NSString *directoryPath = - directory.URLByStandardizingPath.URLByResolvingSymlinksInPath.path; - NSString *prefix = [directoryPath stringByAppendingString:@"/"]; - if ([path hasPrefix:prefix]) return YES; - } - return NO; -} -- (NSError *)errorWithMessage:(NSString *)message { - return [NSError errorWithDomain:OrbitResourceErrorDomain - code:1 - userInfo:@{NSLocalizedDescriptionKey: message}]; + NSError *writeError = nil; + NSString *path = [self.store storeData:data + forURLString:urlString + error:&writeError]; + callback(path, writeError); + }]; } @end diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.h b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.h new file mode 100644 index 00000000000..9ad54740fdd --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.h @@ -0,0 +1,21 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSUInteger const OrbitResourceStoreByteLimit; + +@interface OrbitResourceStore : NSObject + +@property(nonatomic, strong, readonly) NSURL *cacheDirectoryURL; + +- (instancetype)init; +- (instancetype)initWithCacheDirectoryURL:(NSURL *)cacheDirectoryURL + NS_DESIGNATED_INITIALIZER; +- (nullable NSString *)pathForURLString:(NSString *)urlString; +- (nullable NSString *)storeData:(NSData *)data + forURLString:(NSString *)urlString + error:(NSError **)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.m new file mode 100644 index 00000000000..f60c5bb6f3a --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.m @@ -0,0 +1,106 @@ +#import "OrbitResourceStore.h" + +NSUInteger const OrbitResourceStoreByteLimit = 64 * 1024 * 1024; + +static NSString *const OrbitResourceStoreErrorDomain = + @"org.modulefederation.lynx.resources"; + +@interface OrbitResourceStore () + +@property(nonatomic, strong, readwrite) NSURL *cacheDirectoryURL; +@property(nonatomic, strong) NSMutableDictionary *paths; +@property(nonatomic, strong) NSMutableDictionary *sizes; +@property(nonatomic, assign) NSUInteger storedBytes; + +@end + +@implementation OrbitResourceStore + +- (instancetype)init { + NSURL *directory = [[[NSURL fileURLWithPath:NSTemporaryDirectory() + isDirectory:YES] + URLByAppendingPathComponent:@"OrbitResources" + isDirectory:YES] + URLByAppendingPathComponent:NSUUID.UUID.UUIDString + isDirectory:YES]; + return [self initWithCacheDirectoryURL:directory]; +} + +- (instancetype)initWithCacheDirectoryURL:(NSURL *)cacheDirectoryURL { + self = [super init]; + if (self) { + _cacheDirectoryURL = cacheDirectoryURL; + _paths = [NSMutableDictionary dictionary]; + _sizes = [NSMutableDictionary dictionary]; + } + return self; +} + +- (void)dealloc { + [NSFileManager.defaultManager removeItemAtURL:self.cacheDirectoryURL error:nil]; +} + +- (nullable NSString *)pathForURLString:(NSString *)urlString { + @synchronized(self) { + return self.paths[urlString]; + } +} + +- (nullable NSString *)storeData:(NSData *)data + forURLString:(NSString *)urlString + error:(NSError **)error { + @synchronized(self) { + NSUInteger previousSize = self.sizes[urlString].unsignedIntegerValue; + NSUInteger nextSize = self.storedBytes - previousSize + data.length; + if (nextSize > OrbitResourceStoreByteLimit) { + if (error) { + *error = [NSError errorWithDomain:OrbitResourceStoreErrorDomain + code:1 + userInfo:@{ + NSLocalizedDescriptionKey: + @"Lynx resource path cache exceeded 64 MiB" + }]; + } + return nil; + } + + NSError *writeError = nil; + [NSFileManager.defaultManager + createDirectoryAtURL:self.cacheDirectoryURL + withIntermediateDirectories:YES + attributes:nil + error:&writeError]; + if (writeError) { + if (error) *error = writeError; + return nil; + } + + NSString *extension = [NSURL URLWithString:urlString].pathExtension; + NSString *filename = NSUUID.UUID.UUIDString; + if (extension.length > 0) { + filename = [filename stringByAppendingPathExtension:extension]; + } + NSURL *fileURL = [self.cacheDirectoryURL + URLByAppendingPathComponent:filename]; + if (![data writeToURL:fileURL options:NSDataWritingAtomic error:&writeError]) { + if (error) *error = writeError; + return nil; + } + + NSString *previousPath = self.paths[urlString]; + if (previousPath && + ![NSFileManager.defaultManager removeItemAtPath:previousPath + error:&writeError]) { + [NSFileManager.defaultManager removeItemAtURL:fileURL error:nil]; + if (error) *error = writeError; + return nil; + } + + self.paths[urlString] = fileURL.path; + self.sizes[urlString] = @(data.length); + self.storedBytes = nextSize; + return fileURL.path; + } +} + +@end diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.h b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.h new file mode 100644 index 00000000000..71d05dd3bca --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.h @@ -0,0 +1,17 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface OrbitResourceURLResolver : NSObject + +- (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL; +- (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL + allowedLocalDirectories:(NSArray *)directories + NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; +- (nullable NSURL *)resolvedURLForString:(NSString *)urlString; +- (BOOL)isAllowedLocalURL:(NSURL *)url; + +@end + +NS_ASSUME_NONNULL_END diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.m new file mode 100644 index 00000000000..85a90804d45 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.m @@ -0,0 +1,94 @@ +#import "OrbitResourceURLResolver.h" + +@interface OrbitResourceURLResolver () + +@property(nonatomic, copy) NSArray *allowedLocalDirectories; +@property(nonatomic, strong, nullable) NSURL *rootBundleURL; + +@end + + +@implementation OrbitResourceURLResolver + +- (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL { + return [self initWithRootBundleURL:rootBundleURL + allowedLocalDirectories:@[NSBundle.mainBundle.bundleURL]]; +} + +- (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL + allowedLocalDirectories:(NSArray *)directories { + self = [super init]; + if (self) { + NSURL *rootURL = [NSURL URLWithString:rootBundleURL]; + if ([rootURL.scheme isEqualToString:@"http"] || + [rootURL.scheme isEqualToString:@"https"]) { + _rootBundleURL = rootURL; + } + _allowedLocalDirectories = [directories copy]; + } + return self; +} + +- (nullable NSURL *)resolvedURLForString:(NSString *)urlString { + NSURL *url = [NSURL URLWithString:urlString]; + NSString *unresolvedPath = url.path.length > 0 ? url.path : urlString; + if ([unresolvedPath.pathComponents containsObject:@".."]) return nil; + + if (self.rootBundleURL && [urlString hasPrefix:@"/static/"]) { + return [NSURL URLWithString:urlString relativeToURL:self.rootBundleURL].absoluteURL; + } + + if ([url.scheme isEqualToString:@"http"] || + [url.scheme isEqualToString:@"https"]) { + return url; + } + if ([url.scheme isEqualToString:@"file"]) { + return [self isAllowedLocalURL:url] ? url : nil; + } + + NSString *relativePath; + if (urlString.isAbsolutePath) { + NSURL *fileURL = [NSURL fileURLWithPath:urlString]; + if ([self isAllowedLocalURL:fileURL]) return fileURL; + if (![urlString hasPrefix:@"/static/"]) return nil; + relativePath = [urlString substringFromIndex:1]; + } else { + relativePath = unresolvedPath; + } + + relativePath = relativePath.stringByStandardizingPath; + if (relativePath.length == 0 || [relativePath isEqualToString:@"."] || + [relativePath isEqualToString:@".."] || + [relativePath hasPrefix:@"../"]) { + return nil; + } + + NSString *filename = relativePath.lastPathComponent; + NSString *subdirectory = relativePath.stringByDeletingLastPathComponent; + NSString *extension = filename.pathExtension; + NSString *name = extension.length > 0 + ? filename.stringByDeletingPathExtension + : filename; + return [NSBundle.mainBundle URLForResource:name + withExtension:extension.length > 0 ? extension : nil + subdirectory:[subdirectory isEqualToString:@"."] + ? nil + : subdirectory]; +} + +- (BOOL)isAllowedLocalURL:(NSURL *)url { + if (!url.isFileURL) return NO; + NSString *resolvedPath = + url.URLByStandardizingPath.URLByResolvingSymlinksInPath.path; + for (NSURL *directory in self.allowedLocalDirectories) { + NSString *directoryPath = + directory.URLByStandardizingPath.URLByResolvingSymlinksInPath.path; + if ([resolvedPath isEqualToString:directoryPath] || + [resolvedPath hasPrefix:[directoryPath stringByAppendingString:@"/"]]) { + return YES; + } + } + return NO; +} + +@end diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m b/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m new file mode 100644 index 00000000000..ced8baef433 --- /dev/null +++ b/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m @@ -0,0 +1,150 @@ +#import + +#import "../OrbitControl/OrbitResourceDownloader.h" +#import "../OrbitControl/OrbitResourceStore.h" +#import "../OrbitControl/OrbitResourceURLResolver.h" + +static BOOL OrbitOversizeProtocolStopped = NO; + +@interface OrbitOversizeProtocol : NSURLProtocol +@end + +@implementation OrbitOversizeProtocol + ++ (BOOL)canInitWithRequest:(NSURLRequest *)request { + return [request.URL.host isEqualToString:@"oversize.test"]; +} + ++ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { + return request; +} + +- (void)startLoading { + NSDictionary *headers = @{ + @"Content-Length": [NSString stringWithFormat:@"%llu", + (unsigned long long)OrbitResourceDownloadByteLimit + 1] + }; + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] + initWithURL:self.request.URL + statusCode:200 + HTTPVersion:@"HTTP/1.1" + headerFields:headers]; + [self.client URLProtocol:self + didReceiveResponse:response + cacheStoragePolicy:NSURLCacheStorageNotAllowed]; + [self.client URLProtocol:self didLoadData:[@"x" dataUsingEncoding:NSUTF8StringEncoding]]; +} + +- (void)stopLoading { + OrbitOversizeProtocolStopped = YES; +} + +@end + +@interface OrbitResourceTests : XCTestCase +@end + +@implementation OrbitResourceTests + +- (void)testResolvesRootRelativeLoopbackURLs { + OrbitResourceURLResolver *resolver = [[OrbitResourceURLResolver alloc] + initWithRootBundleURL:@"http://127.0.0.1:3000/host-native/main.lynx.bundle"]; + + NSURL *resolved = [resolver resolvedURLForString:@"/static/js/async/shared.js"]; + + XCTAssertEqualObjects(resolved.absoluteString, + @"http://127.0.0.1:3000/static/js/async/shared.js"); +} + +- (void)testRejectsTraversalAndSymlinkEscapes { + NSFileManager *files = NSFileManager.defaultManager; + NSURL *parent = [[NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES] + URLByAppendingPathComponent:NSUUID.UUID.UUIDString + isDirectory:YES]; + NSURL *root = [parent URLByAppendingPathComponent:@"root" isDirectory:YES]; + NSURL *outside = [parent URLByAppendingPathComponent:@"outside" isDirectory:YES]; + XCTAssertTrue([files createDirectoryAtURL:root + withIntermediateDirectories:YES + attributes:nil + error:nil]); + XCTAssertTrue([files createDirectoryAtURL:outside + withIntermediateDirectories:YES + attributes:nil + error:nil]); + NSURL *insideFile = [root URLByAppendingPathComponent:@"inside.bundle"]; + XCTAssertTrue([[@"inside" dataUsingEncoding:NSUTF8StringEncoding] + writeToURL:insideFile + atomically:YES]); + NSURL *escape = [root URLByAppendingPathComponent:@"escape"]; + XCTAssertTrue([files createSymbolicLinkAtURL:escape + withDestinationURL:outside + error:nil]); + OrbitResourceURLResolver *resolver = [[OrbitResourceURLResolver alloc] + initWithRootBundleURL:@"" + allowedLocalDirectories:@[root]]; + + XCTAssertTrue([resolver isAllowedLocalURL:insideFile]); + XCTAssertFalse([resolver isAllowedLocalURL: + [escape URLByAppendingPathComponent:@"secret.bundle"]]); + XCTAssertNil([resolver resolvedURLForString:@"../secret.bundle"]); + XCTAssertNil([resolver resolvedURLForString:@"/static/../secret.bundle"]); + [files removeItemAtURL:parent error:nil]; +} + +- (void)testReplacesCachedDataWithinLimitAndCleansUp { + NSFileManager *files = NSFileManager.defaultManager; + NSURL *directory = [[NSURL fileURLWithPath:NSTemporaryDirectory() + isDirectory:YES] + URLByAppendingPathComponent:NSUUID.UUID.UUIDString + isDirectory:YES]; + @autoreleasepool { + OrbitResourceStore *store = [[OrbitResourceStore alloc] + initWithCacheDirectoryURL:directory]; + NSError *error = nil; + NSString *first = [store storeData:[@"first" dataUsingEncoding:NSUTF8StringEncoding] + forURLString:@"https://example.test/chunk.bundle" + error:&error]; + XCTAssertNotNil(first); + XCTAssertNil(error); + + NSString *replacement = [store + storeData:[@"replacement" dataUsingEncoding:NSUTF8StringEncoding] + forURLString:@"https://example.test/chunk.bundle" + error:&error]; + XCTAssertNotEqualObjects(first, replacement); + XCTAssertFalse([files fileExistsAtPath:first]); + XCTAssertEqualObjects([NSData dataWithContentsOfFile:replacement], + [@"replacement" dataUsingEncoding:NSUTF8StringEncoding]); + + NSData *oversized = [NSMutableData dataWithLength:OrbitResourceStoreByteLimit + 1]; + XCTAssertNil([store storeData:oversized + forURLString:@"https://example.test/too-large.bundle" + error:&error]); + XCTAssertEqualObjects(error.localizedDescription, + @"Lynx resource path cache exceeded 64 MiB"); + } + XCTAssertFalse([files fileExistsAtPath:directory.path]); +} + +- (void)testCancelsOversizedDownloads { + OrbitOversizeProtocolStopped = NO; + NSURLSessionConfiguration *configuration = + NSURLSessionConfiguration.ephemeralSessionConfiguration; + configuration.protocolClasses = @[[OrbitOversizeProtocol class]]; + OrbitResourceDownloader *downloader = [[OrbitResourceDownloader alloc] + initWithSessionConfiguration:configuration]; + XCTestExpectation *completed = [self expectationWithDescription:@"download completed"]; + + [downloader downloadURL:[NSURL URLWithString:@"https://oversize.test/chunk.bundle"] + completion:^(NSData *data, NSURLResponse *response, NSError *error) { + (void)response; + XCTAssertNil(data); + XCTAssertTrue([error.localizedDescription containsString:@"exceeds 64 MiB"]); + [completed fulfill]; + }]; + + [self waitForExpectationsWithTimeout:2 handler:nil]; + XCTAssertTrue(OrbitOversizeProtocolStopped); +} + +@end diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index 38e0cb1d100..f14d3ea9ea6 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -17,14 +17,21 @@ await Promise.all([ access( path.join(appRoot, 'ios/OrbitControlUITests/OrbitControlUITests.swift'), ), + ...[ + 'OrbitResourceDownloader.h', + 'OrbitResourceDownloader.m', + 'OrbitResourceStore.h', + 'OrbitResourceStore.m', + 'OrbitResourceURLResolver.h', + 'OrbitResourceURLResolver.m', + ].map((file) => access(path.join(appRoot, 'ios/OrbitControl', file))), + access(path.join(appRoot, 'ios/OrbitControlTests/OrbitResourceTests.m')), ]); const [ podfile, podfileLock, provenance, - fetcher, - fetcherHeader, viewController, releaseInfo, debugInfo, @@ -35,12 +42,11 @@ const [ deviceServer, syncScript, iosRunner, + scheme, ] = await Promise.all([ read('ios/Podfile'), read('ios/Podfile.lock'), read('ios/UPSTREAM.md'), - read('ios/OrbitControl/OrbitResourceFetcher.m'), - read('ios/OrbitControl/OrbitResourceFetcher.h'), read('ios/OrbitControl/ViewController.swift'), read('ios/OrbitControl/Info.plist'), read('ios/OrbitControl/Info.Debug.plist'), @@ -51,6 +57,9 @@ const [ read('scripts/dev-ios-device.mjs'), read('scripts/sync-ios-bundle.mjs'), read('test/ios/run.mjs'), + read( + 'ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme', + ), ]); for (const pod of ['Lynx', 'LynxService', 'XElement']) { @@ -61,22 +70,6 @@ assert.match(podfileLock, /Lynx \(3\.9\.0\)/); assert.match(podfileLock, /PrimJS\/quickjs \(3\.8\.0-alpha\.6\)/); assert.match(provenance, /integrating-lynx-demo-projects/); assert.match(provenance, /f8230ca6aa1c9e629e30272971d0c03450b13e8e/); -assert.match(fetcher, /LynxBooleanOptionTrue/); -assert.match(fetcher, /builder\.templateResourceFetcher = self/); -assert.match(fetcher, /builder\.genericResourceFetcher = self/); -assert.match(fetcher, /isAllowedLocalURL/); -assert.match(fetcher, /resourcePathCache/); -assert.match(fetcher, /OrbitResourcePathCacheByteLimit/); -assert.match(fetcher, /OrbitResourceResponseByteLimit/); -assert.match(fetcher, /downloadTaskWithURL/); -assert.match(fetcher, /totalBytesWritten > .*OrbitResourceResponseByteLimit/); -assert.match(fetcher, /\[downloadTask cancel\]/); -assert.match(fetcher, /timeoutIntervalForResource = 60/); -assert.match(fetcher, /URLByResolvingSymlinksInPath/); -assert.match(fetcher, /resolvedURLString/); -assert.match(fetcher, /relativeToURL:self\.rootBundleURL/); -assert.match(fetcher, /hasPrefix:@"\/static\/"/); -assert.match(fetcher, /relativePath = \[urlString substringFromIndex:1\]/); assert.doesNotMatch(releaseInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(releaseInfo, /NSExceptionAllowsInsecureHTTPLoads/); assert.match(releaseInfo, /NSAllowsLocalNetworking/); @@ -86,10 +79,19 @@ assert.match(debugInfo, /localhost<\/key>/); assert.doesNotMatch(debugInfo, /NSAllowsArbitraryLoads/); assert.doesNotMatch(project, /DEVELOPMENT_TEAM/); assert.match(project, /OrbitControlUITests/); +assert.match(project, /OrbitControlTests\.xctest/); +for (const file of [ + 'OrbitResourceDownloader.m', + 'OrbitResourceStore.m', + 'OrbitResourceURLResolver.m', + 'OrbitResourceTests.m', +]) { + assert.match(project, new RegExp(`${file.replace('.', '\\.')} in Sources`)); +} +assert.match(scheme, /BlueprintName="OrbitControlTests"/); assert.match(project, /static in Resources/); assert.match(uiTest, /matching\(identifier: "federation-ready"\)/); assert.match(appSource, /accessibilityId: 'federation-ready'/); -assert.match(fetcherHeader, /initWithRootBundleURL/); assert.match( viewController, /OrbitResourceFetcher\(\s*rootBundleURL: rootBundleURL\s*\)/, @@ -108,6 +110,7 @@ assert.match(syncScript, /cp\(sourceStatic, destinationStatic/); assert.equal(iosRunner.match(/await run\(\s*'xcodebuild'/g)?.length, 1); assert.match(iosRunner, /'-configuration',\s*'Release'/); assert.match(iosRunner, /build\/OrbitControl-Release\.xcresult/); +assert.match(iosRunner, /-only-testing:OrbitControlTests/); for (const testName of [ 'testFederatedImportsRuntimeLoadingAndSingleton', 'testStandaloneCatalogRemoteBuildLaunches', diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index debd3fa0899..155b4c4a030 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -140,6 +140,7 @@ try { 'COMPILER_INDEX_STORE_ENABLE=NO', '-parallel-testing-enabled', 'NO', + '-only-testing:OrbitControlTests', '-only-testing:OrbitControlUITests/OrbitControlUITests/testFederatedImportsRuntimeLoadingAndSingleton', '-only-testing:OrbitControlUITests/OrbitControlUITests/testStandaloneCatalogRemoteBuildLaunches', '-only-testing:OrbitControlUITests/OrbitControlUITests/testEmbeddedReleaseHostLaunches', From 853906225216b8cf8f565b78c34c1484ff95d3de Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 02:24:09 +0000 Subject: [PATCH 36/68] docs(lynx): document rspeedy compatibility boundary --- .github/workflows/e2e-lynx.yml | 3 ++ .github/workflows/e2e-metro.yml | 6 +-- apps/lynx-module-federation-demo/README.md | 24 +++++++-- apps/lynx-module-federation-demo/package.json | 1 + .../test/ci-policy.mjs | 49 +++++++++++++++++++ 5 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 apps/lynx-module-federation-demo/test/ci-policy.mjs diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 75c6ddc1c92..24fb3dc42a9 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -30,6 +30,9 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + - name: Validate Lynx and Android CI policy + run: pnpm --filter lynx-module-federation-demo run test:ci-policy + - name: Restore Turborepo cache uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index 7f984697114..b0b5e9dd951 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -23,7 +23,7 @@ jobs: ANDROID_EMULATOR_API_LEVEL: 28 ANDROID_EMULATOR_TARGET: default ANDROID_EMULATOR_ARCH: x86_64 - ANDROID_EMULATOR_DISK_SPACE: 1024M + ANDROID_EMULATOR_PARTITION_SIZE_MB: 1024 ANDROID_EMULATOR_RAM_SIZE: 256M ANDROID_EMULATOR_HEAP_SIZE: 256M ANDROID_EMULATOR_BOOT_TIMEOUT: 2700 @@ -110,12 +110,12 @@ jobs: arch: ${{ env.ANDROID_EMULATOR_ARCH }} ram-size: ${{ env.ANDROID_EMULATOR_RAM_SIZE }} heap-size: ${{ env.ANDROID_EMULATOR_HEAP_SIZE }} - disk-size: ${{ env.ANDROID_EMULATOR_DISK_SPACE }} + disk-size: ${{ env.ANDROID_EMULATOR_PARTITION_SIZE_MB }}M emulator-boot-timeout: ${{ env.ANDROID_EMULATOR_BOOT_TIMEOUT }} force-avd-creation: false disable-animations: true # Emulator 36.6 can ignore the AVD disk-size config unless this is explicit. - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -partition-size 1024 + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -partition-size ${{ env.ANDROID_EMULATOR_PARTITION_SIZE_MB }} script: | node tools/scripts/run-metro-e2e.mjs --platform=android --appName=${{ env.METRO_APP_NAME }} --skip-rock-cache-auth diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index 8a32e5b9b1f..f07fe4cb8ce 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -39,6 +39,21 @@ split assets from the fetched manifest URL instead of Lynx Web's internal `document.currentScript`. The native remote uses the absolute `LYNX_REMOTE_ORIGIN` required by Rspeedy/Lynx's native lazy-bundle loader. +## Rspeedy compatibility boundary + +Rspeedy 0.15 resolves its own `@rspack/core`, while this repository needs +`@rspack-canary/core` 2.1.5-canary-54a0d8f3-20260715194831 for the Lynx layer +and chunk behavior under test. `rspack-canary-rspeedy.mjs` is the single +compatibility boundary: it starts Rspeedy with Node resolution hooks that map +`@rspack/core` to the pinned canary and `@rsbuild/core` to the workspace's +matching package. + +Every demo build, development, and preview script in `package.json` invokes +that wrapper. Application and federation source import neither the wrapper nor +the canary package. Remove the wrapper when Rspeedy supports the repository's +Rspack package directly; then point those package scripts back to the public +Rspeedy CLI and remove the canary alias together. + ## Run the standalone Catalog product The Catalog directly renders `Card`, `Details`, and `ActivityFeed` from the @@ -154,11 +169,9 @@ Set `CATALOG_NATIVE_MANIFEST_URL` when the remote manifest is hosted elsewhere. `e2e:native` is artifact and transport validation. It compiles the real Rspeedy host, Catalog app, and remote, verifies the regular standalone root bundle, the separately transported async-startup singleton, the background container, -and paired main-thread -snapshot bytecode in every lazy UI bundle, checks the manifest's public -background expose/share metadata, then fetches the host, manifest, container, -and every lazy bundle over HTTP. The macOS CI job adds a real iOS Simulator -runtime test of those artifacts. +and three independently loadable lazy UI bundles, checks the manifest's public +background expose/share metadata, then fetches every artifact over HTTP. The +macOS CI job adds a real iOS Simulator runtime test of those artifacts. ## Run the real Lynx Web E2E @@ -197,6 +210,7 @@ paths with `LYNX_HOST_WEB_BUNDLE`, `LYNX_REMOTE_MANIFEST`, | `pnpm e2e:ios` | iOS Catalog launch plus Orbit federation/runtime E2E | | `pnpm e2e:web` | Standalone Catalog and federated Orbit in official `` | | `pnpm test:ios-project` | Cross-platform iOS project, provenance, pod, and ATS policy gate | +| `pnpm test:ci-policy` | Wrapper ownership and Android emulator partition policy | | `pnpm test` | Cross-platform native artifact and Lynx Web checks | The web remote enables `mainThread: true`, so each exposure has background and diff --git a/apps/lynx-module-federation-demo/package.json b/apps/lynx-module-federation-demo/package.json index 6a0216bca43..fbe53c07c6a 100644 --- a/apps/lynx-module-federation-demo/package.json +++ b/apps/lynx-module-federation-demo/package.json @@ -32,6 +32,7 @@ "preview:catalog:web": "node rspack-canary-rspeedy.mjs preview -c lynx.catalog.web.config.mjs", "preview:web": "node rspack-canary-rspeedy.mjs preview -c lynx.web.config.mjs", "test": "pnpm run test:ios-project && pnpm run e2e:native && pnpm run e2e:web", + "test:ci-policy": "node test/ci-policy.mjs", "test:ios-project": "node test/ios-project.mjs", "test:native-artifacts": "node test/native-artifacts.mjs", "test:native-dev-server": "node test/native-dev-server.mjs" diff --git a/apps/lynx-module-federation-demo/test/ci-policy.mjs b/apps/lynx-module-federation-demo/test/ci-policy.mjs new file mode 100644 index 00000000000..ea4fc3ed59a --- /dev/null +++ b/apps/lynx-module-federation-demo/test/ci-policy.mjs @@ -0,0 +1,49 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const appRoot = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '..', +); +const repoRoot = path.resolve(appRoot, '../..'); +const readRepo = (file) => readFile(path.join(repoRoot, file), 'utf8'); + +const [metroWorkflow, lynxWorkflow, readme, packageSource] = await Promise.all([ + readRepo('.github/workflows/e2e-metro.yml'), + readRepo('.github/workflows/e2e-lynx.yml'), + readFile(path.join(appRoot, 'README.md'), 'utf8'), + readFile(path.join(appRoot, 'package.json'), 'utf8'), +]); + +assert.match(metroWorkflow, /ANDROID_EMULATOR_PARTITION_SIZE_MB: 1024/); +assert.match( + metroWorkflow, + /disk-size: \$\{\{ env\.ANDROID_EMULATOR_PARTITION_SIZE_MB \}\}M/, +); +assert.match( + metroWorkflow, + /-partition-size \$\{\{ env\.ANDROID_EMULATOR_PARTITION_SIZE_MB \}\}/, +); +assert.doesNotMatch(metroWorkflow, /ANDROID_EMULATOR_DISK_SPACE/); +assert.doesNotMatch(metroWorkflow, /-partition-size\s+\d+/); +assert.match(lynxWorkflow, /run test:ci-policy/); + +assert.match(readme, /rspack-canary-rspeedy\.mjs/); +assert.match(readme, /@rspack-canary\/core/); +assert.match( + readme, + /remove.*Rspeedy supports the repository's\s+Rspack package directly/is, +); + +const { scripts } = JSON.parse(packageSource); +const rspeedyCommands = Object.entries(scripts).filter(([, command]) => + command.includes('rspeedy'), +); +assert.ok(rspeedyCommands.length > 0); +for (const [name, command] of rspeedyCommands) { + assert.match(command, /node rspack-canary-rspeedy\.mjs/, name); +} + +process.stdout.write('Lynx and Android CI policy validated.\n'); From 8402fdf874cbf129275d54d442cc9ce76cae2a68 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 02:29:41 +0000 Subject: [PATCH 37/68] test(lynx): simplify bundle error coverage --- packages/lynx/src/runtimePlugin.test.ts | 55 ++++++++++--------------- 1 file changed, 22 insertions(+), 33 deletions(-) diff --git a/packages/lynx/src/runtimePlugin.test.ts b/packages/lynx/src/runtimePlugin.test.ts index 7033a0732a0..3a4c159f5f8 100644 --- a/packages/lynx/src/runtimePlugin.test.ts +++ b/packages/lynx/src/runtimePlugin.test.ts @@ -201,39 +201,28 @@ describe('lynxRuntimePlugin entry loading', () => { ).toBe('lynx-cache://remote'); }); - it('reports unsuccessful bundle fetches', async () => { - const loadScript = rs.fn(); - setLynx({ - fetchBundle: async () => ({ - code: -1, - url: 'https://example.test/remote.lynx.bundle', - errorMsg: 'not found', - }), - loadScript, - }); - - await expect( - loadEntry(lynxRuntimePlugin(), bundleRemoteInfo), - ).rejects.toThrow('code -1: not found'); - expect(loadScript).not.toHaveBeenCalled(); - }); - - it('reports native snake-case bundle errors', async () => { - const loadScript = rs.fn(); - setLynx({ - fetchBundle: async () => ({ - code: -2, - url: 'https://example.test/remote.lynx.bundle', - error_msg: 'decode failed', - }), - loadScript, - }); - - await expect( - loadEntry(lynxRuntimePlugin(), bundleRemoteInfo), - ).rejects.toThrow('code -2: decode failed'); - expect(loadScript).not.toHaveBeenCalled(); - }); + it.each([ + ['camel-case', { errorMsg: 'not found' }, -1, 'not found'], + ['native snake-case', { error_msg: 'decode failed' }, -2, 'decode failed'], + ] as const)( + 'reports %s bundle errors', + async (_name, error, code, message) => { + const loadScript = rs.fn(); + setLynx({ + fetchBundle: async () => ({ + code, + url: 'https://example.test/remote.lynx.bundle', + ...error, + }), + loadScript, + }); + + await expect( + loadEntry(lynxRuntimePlugin(), bundleRemoteInfo), + ).rejects.toThrow(`code ${code}: ${message}`); + expect(loadScript).not.toHaveBeenCalled(); + }, + ); it('rolls back bundle registry mappings after evaluation fails', async () => { const registry = new Map([ From 10e90408f96c1bbce67cb28825be07a04911b33f Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 02:42:39 +0000 Subject: [PATCH 38/68] fix(lynx): harden artifact server paths --- .../test/support/artifact-server.mjs | 94 ++++++++++--------- .../test/support/artifact-server.test.mjs | 13 ++- 2 files changed, 64 insertions(+), 43 deletions(-) diff --git a/apps/lynx-module-federation-demo/test/support/artifact-server.mjs b/apps/lynx-module-federation-demo/test/support/artifact-server.mjs index 6282925dcc6..7eeb88d5896 100644 --- a/apps/lynx-module-federation-demo/test/support/artifact-server.mjs +++ b/apps/lynx-module-federation-demo/test/support/artifact-server.mjs @@ -1,4 +1,4 @@ -import { readFile, realpath, stat } from 'node:fs/promises'; +import { readFile, readdir, realpath, stat } from 'node:fs/promises'; import { createServer } from 'node:http'; import path from 'node:path'; @@ -22,36 +22,52 @@ const isInside = (root, file) => { ); }; -const resolveFile = async (root, relativePath) => { - const candidate = path.resolve(root, relativePath); - if (!isInside(root, candidate)) return { status: 403 }; - - try { - const resolved = await realpath(candidate); - if (!isInside(root, resolved)) return { status: 403 }; - const fileStat = await stat(resolved); - return fileStat.isFile() - ? { file: resolved, status: 200 } - : { status: 404 }; - } catch (error) { - if (error?.code === 'ENOENT' || error?.code === 'ENOTDIR') { - return { status: 404 }; +const indexFiles = async (root) => { + const resolvedRoot = await realpath(path.resolve(root)); + const files = new Map(); + const visited = new Set(); + + const visit = async (directory) => { + const resolvedDirectory = await realpath(directory); + if ( + visited.has(resolvedDirectory) || + !isInside(resolvedRoot, resolvedDirectory) + ) { + return; } - throw error; - } + visited.add(resolvedDirectory); + + for (const entry of await readdir(resolvedDirectory, { + withFileTypes: true, + })) { + const resolved = await realpath(path.join(resolvedDirectory, entry.name)); + if (!isInside(resolvedRoot, resolved)) continue; + + const fileStat = await stat(resolved); + if (fileStat.isDirectory()) { + await visit(resolved); + } else if (fileStat.isFile()) { + const relative = path.relative(resolvedRoot, resolved); + files.set(`/${relative.split(path.sep).join('/')}`, resolved); + } + } + }; + + await visit(resolvedRoot); + return files; }; const delay = (duration) => new Promise((resolve) => setTimeout(resolve, duration)); export const createArtifactServer = async ({ port = 0, root, routes = {} }) => { - const artifactRoot = await realpath(path.resolve(root)); + const artifactFiles = await indexFiles(root); const routeEntries = await Promise.all( Object.entries(routes).map(async ([route, target]) => [ route, typeof target === 'string' - ? await realpath(path.resolve(target)) - : target, + ? { files: await indexFiles(target) } + : { handler: target }, ]), ); routeEntries.sort(([left], [right]) => right.length - left.length); @@ -79,31 +95,28 @@ export const createArtifactServer = async ({ port = 0, root, routes = {} }) => { } for (const [route, target] of routeEntries) { - if (typeof target === 'function' && pathname === route) { - await target(request, response); + if (target.handler && pathname === route) { + await target.handler(request, response); return; } - if (typeof target !== 'string') continue; + if (!target.files) continue; const matchesPrefix = route.endsWith('/') && pathname.startsWith(route); if (matchesPrefix) { - const resolved = await resolveFile( - target, - pathname.slice(route.length), - ); - await serveFile(request, response, resolved); + const relativePath = `/${pathname.slice(route.length)}`; + await serveFile(request, response, target.files.get(relativePath)); return; } } - const resolved = await resolveFile( - artifactRoot, - pathname === '/' ? 'index.html' : pathname.replace(/^\/+/, ''), + await serveFile( + request, + response, + artifactFiles.get(pathname === '/' ? '/index.html' : pathname), ); - await serveFile(request, response, resolved); - } catch (error) { + } catch { if (!response.headersSent) response.writeHead(500); - response.end(String(error)); + response.end('Internal server error'); } }); @@ -149,22 +162,19 @@ export const createArtifactServer = async ({ port = 0, root, routes = {} }) => { }; }; -const serveFile = async (request, response, resolved) => { - if (!resolved.file) { - response - .writeHead(resolved.status) - .end(resolved.status === 403 ? 'Forbidden' : 'Not found'); +const serveFile = async (request, response, file) => { + if (!file) { + response.writeHead(404).end('Not found'); return; } - const body = await readFile(resolved.file); + const body = await readFile(file); response.writeHead(200, { 'access-control-allow-origin': '*', 'cache-control': 'no-store', 'content-length': body.byteLength, 'content-type': - contentTypes.get(path.extname(resolved.file)) ?? - 'application/octet-stream', + contentTypes.get(path.extname(file)) ?? 'application/octet-stream', 'cross-origin-embedder-policy': 'require-corp', 'cross-origin-opener-policy': 'same-origin', }); diff --git a/apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs b/apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs index b947919857f..2122a372245 100644 --- a/apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs +++ b/apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'; +import { mkdir, mkdtemp, rm, symlink, writeFile } from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; import test from 'node:test'; @@ -12,10 +12,14 @@ test('serves rooted artifacts, dynamic routes, and request traces', async () => await mkdir(root); await writeFile(path.join(root, 'artifact.json'), '{"ready":true}'); await writeFile(path.join(parent, 'secret.txt'), 'secret'); + await symlink(path.join(parent, 'secret.txt'), path.join(root, 'leak.txt')); const server = await createArtifactServer({ root, routes: { + '/failure': () => { + throw new Error('private stack marker'); + }, '/health': (_request, response) => { response.writeHead(200, { 'content-type': 'text/plain' }); response.end('ready'); @@ -30,9 +34,14 @@ test('serves rooted artifacts, dynamic routes, and request traces', async () => await (await fetch(`${server.origin}/health`)).text(), 'ready', ); + const failure = await fetch(`${server.origin}/failure`); + assert.equal(failure.status, 500); + assert.equal(await failure.text(), 'Internal server error'); const traversal = await fetch(`${server.origin}/%2e%2e%2fsecret.txt`); assert.equal(traversal.status, 403); + const symlinkEscape = await fetch(`${server.origin}/leak.txt`); + assert.equal(symlinkEscape.status, 404); assert.deepEqual( server.requests.map(({ path: requestPath, status }) => ({ path: requestPath, @@ -41,7 +50,9 @@ test('serves rooted artifacts, dynamic routes, and request traces', async () => [ { path: '/artifact.json', status: 200 }, { path: '/health', status: 200 }, + { path: '/failure', status: 500 }, { path: '/../secret.txt', status: 403 }, + { path: '/leak.txt', status: 404 }, ], ); } finally { From 3b2b052fe36414afa88142a1224f47a408c8072f Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 02:45:15 +0000 Subject: [PATCH 39/68] docs(lynx): describe artifact server boundary --- apps/lynx-module-federation-demo/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index f07fe4cb8ce..f4506741922 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -186,7 +186,9 @@ The test builds the official Rspeedy web host, Catalog app, and remote; starts an ephemeral HTTP server; and mounts both `dist/host-web/main.web.bundle` and `dist/catalog-web/main.web.bundle` through `@lynx-js/web-core`'s public ``. Playwright uses a mobile viewport -and touch input. It verifies: +and touch input. The server indexes realpath-contained artifacts before it +listens, so URL input never becomes a filesystem path and internal errors are +not returned to clients. The test verifies: - manifest, container, and lazy expose requests over HTTP; - async-startup share initialization over its independent JS request; From f6b691f3025ecf89bf1bb5ccfe9356f3fed7b709 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 03:26:22 +0000 Subject: [PATCH 40/68] test(lynx-ios): make resource boundaries deterministic --- .../OrbitControlTests/OrbitResourceTests.m | 77 ++++++------------- 1 file changed, 24 insertions(+), 53 deletions(-) diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m b/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m index ced8baef433..1c88767318d 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m @@ -4,41 +4,12 @@ #import "../OrbitControl/OrbitResourceStore.h" #import "../OrbitControl/OrbitResourceURLResolver.h" -static BOOL OrbitOversizeProtocolStopped = NO; - -@interface OrbitOversizeProtocol : NSURLProtocol -@end - -@implementation OrbitOversizeProtocol - -+ (BOOL)canInitWithRequest:(NSURLRequest *)request { - return [request.URL.host isEqualToString:@"oversize.test"]; -} - -+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { - return request; -} - -- (void)startLoading { - NSDictionary *headers = @{ - @"Content-Length": [NSString stringWithFormat:@"%llu", - (unsigned long long)OrbitResourceDownloadByteLimit + 1] - }; - NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] - initWithURL:self.request.URL - statusCode:200 - HTTPVersion:@"HTTP/1.1" - headerFields:headers]; - [self.client URLProtocol:self - didReceiveResponse:response - cacheStoragePolicy:NSURLCacheStorageNotAllowed]; - [self.client URLProtocol:self didLoadData:[@"x" dataUsingEncoding:NSUTF8StringEncoding]]; -} - -- (void)stopLoading { - OrbitOversizeProtocolStopped = YES; -} - +@interface OrbitResourceDownloader (Testing) +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite; @end @interface OrbitResourceTests : XCTestCase @@ -79,6 +50,10 @@ - (void)testRejectsTraversalAndSymlinkEscapes { XCTAssertTrue([files createSymbolicLinkAtURL:escape withDestinationURL:outside error:nil]); + NSURL *outsideFile = [outside URLByAppendingPathComponent:@"secret.bundle"]; + XCTAssertTrue([[@"secret" dataUsingEncoding:NSUTF8StringEncoding] + writeToURL:outsideFile + atomically:YES]); OrbitResourceURLResolver *resolver = [[OrbitResourceURLResolver alloc] initWithRootBundleURL:@"" allowedLocalDirectories:@[root]]; @@ -127,24 +102,20 @@ - (void)testReplacesCachedDataWithinLimitAndCleansUp { } - (void)testCancelsOversizedDownloads { - OrbitOversizeProtocolStopped = NO; - NSURLSessionConfiguration *configuration = - NSURLSessionConfiguration.ephemeralSessionConfiguration; - configuration.protocolClasses = @[[OrbitOversizeProtocol class]]; - OrbitResourceDownloader *downloader = [[OrbitResourceDownloader alloc] - initWithSessionConfiguration:configuration]; - XCTestExpectation *completed = [self expectationWithDescription:@"download completed"]; - - [downloader downloadURL:[NSURL URLWithString:@"https://oversize.test/chunk.bundle"] - completion:^(NSData *data, NSURLResponse *response, NSError *error) { - (void)response; - XCTAssertNil(data); - XCTAssertTrue([error.localizedDescription containsString:@"exceeds 64 MiB"]); - [completed fulfill]; - }]; - - [self waitForExpectationsWithTimeout:2 handler:nil]; - XCTAssertTrue(OrbitOversizeProtocolStopped); + OrbitResourceDownloader *downloader = [[OrbitResourceDownloader alloc] init]; + NSURLSession *session = [NSURLSession sessionWithConfiguration: + NSURLSessionConfiguration.ephemeralSessionConfiguration]; + NSURLSessionDownloadTask *task = [session + downloadTaskWithURL:[NSURL URLWithString:@"https://oversize.test/chunk.bundle"]]; + + [downloader URLSession:session + downloadTask:task + didWriteData:1 + totalBytesWritten:1 + totalBytesExpectedToWrite:(int64_t)OrbitResourceDownloadByteLimit + 1]; + + XCTAssertEqual(task.state, NSURLSessionTaskStateCanceling); + [session invalidateAndCancel]; } @end From 5d956d1f0ae63b4813fe08952dff634cfc64687e Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 04:57:06 +0000 Subject: [PATCH 41/68] refactor(lynx): close resource lifecycle gaps --- .../OrbitControl/OrbitResourceDownloader.m | 23 ++++--- .../ios/OrbitControl/OrbitResourceStore.m | 18 +----- .../OrbitControlTests/OrbitResourceTests.m | 6 +- .../test/native-artifacts.mjs | 1 - packages/lynx/package.json | 2 +- .../runtime-core/__tests__/snapshot.spec.ts | 61 +++++++++++++++++++ .../src/plugins/snapshot/SnapshotHandler.ts | 43 +++++++------ pnpm-lock.yaml | 6 +- 8 files changed, 112 insertions(+), 48 deletions(-) diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.m index 53a5b4f3d62..a892e914d27 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.m @@ -70,6 +70,15 @@ - (NSError *)errorForURL:(NSURL *)url prefix:(NSString *)prefix { }]; } +- (BOOL)takeOversizedFlagForTask:(NSURLSessionTask *)task { + @synchronized(self) { + NSNumber *key = @(task.taskIdentifier); + BOOL oversized = [self.oversizedTasks containsObject:key]; + [self.oversizedTasks removeObject:key]; + return oversized; + } +} + - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten @@ -90,6 +99,7 @@ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { (void)session; + BOOL oversized = [self takeOversizedFlagForTask:downloadTask]; OrbitResourceDownloadCompletion completion = [self takeCompletionForTask:downloadTask]; if (!completion) { @@ -100,7 +110,11 @@ - (void)URLSession:(NSURLSession *)session NSError *resultError = nil; NSData *data = nil; NSURLResponse *response = downloadTask.response; - if ([response isKindOfClass:NSHTTPURLResponse.class]) { + if (oversized) { + resultError = [self errorForURL:downloadTask.originalRequest.URL + prefix:@"Lynx resource exceeds 64 MiB"]; + } + if (!resultError && [response isKindOfClass:NSHTTPURLResponse.class]) { NSInteger statusCode = ((NSHTTPURLResponse *)response).statusCode; if (statusCode < 200 || statusCode >= 300) { resultError = [NSError errorWithDomain:OrbitResourceDownloadErrorDomain @@ -147,12 +161,7 @@ - (void)URLSession:(NSURLSession *)session (void)session; if (!error) return; - BOOL oversized; - @synchronized(self) { - NSNumber *key = @(task.taskIdentifier); - oversized = [self.oversizedTasks containsObject:key]; - [self.oversizedTasks removeObject:key]; - } + BOOL oversized = [self takeOversizedFlagForTask:task]; OrbitResourceDownloadCompletion completion = [self takeCompletionForTask:task]; if (!completion) return; completion(nil, diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.m index f60c5bb6f3a..4f9613ec48a 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.m @@ -9,7 +9,6 @@ @interface OrbitResourceStore () @property(nonatomic, strong, readwrite) NSURL *cacheDirectoryURL; @property(nonatomic, strong) NSMutableDictionary *paths; -@property(nonatomic, strong) NSMutableDictionary *sizes; @property(nonatomic, assign) NSUInteger storedBytes; @end @@ -31,7 +30,6 @@ - (instancetype)initWithCacheDirectoryURL:(NSURL *)cacheDirectoryURL { if (self) { _cacheDirectoryURL = cacheDirectoryURL; _paths = [NSMutableDictionary dictionary]; - _sizes = [NSMutableDictionary dictionary]; } return self; } @@ -50,9 +48,7 @@ - (nullable NSString *)storeData:(NSData *)data forURLString:(NSString *)urlString error:(NSError **)error { @synchronized(self) { - NSUInteger previousSize = self.sizes[urlString].unsignedIntegerValue; - NSUInteger nextSize = self.storedBytes - previousSize + data.length; - if (nextSize > OrbitResourceStoreByteLimit) { + if (data.length > OrbitResourceStoreByteLimit - self.storedBytes) { if (error) { *error = [NSError errorWithDomain:OrbitResourceStoreErrorDomain code:1 @@ -63,6 +59,7 @@ - (nullable NSString *)storeData:(NSData *)data } return nil; } + NSUInteger nextSize = self.storedBytes + data.length; NSError *writeError = nil; [NSFileManager.defaultManager @@ -87,17 +84,8 @@ - (nullable NSString *)storeData:(NSData *)data return nil; } - NSString *previousPath = self.paths[urlString]; - if (previousPath && - ![NSFileManager.defaultManager removeItemAtPath:previousPath - error:&writeError]) { - [NSFileManager.defaultManager removeItemAtURL:fileURL error:nil]; - if (error) *error = writeError; - return nil; - } - + // Lynx may still be reading an earlier path for this URL. self.paths[urlString] = fileURL.path; - self.sizes[urlString] = @(data.length); self.storedBytes = nextSize; return fileURL.path; } diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m b/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m index 1c88767318d..b2debb2e5ed 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m @@ -66,7 +66,7 @@ - (void)testRejectsTraversalAndSymlinkEscapes { [files removeItemAtURL:parent error:nil]; } -- (void)testReplacesCachedDataWithinLimitAndCleansUp { +- (void)testRetainsReplacedCachedPathsUntilCleanup { NSFileManager *files = NSFileManager.defaultManager; NSURL *directory = [[NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES] @@ -87,7 +87,9 @@ - (void)testReplacesCachedDataWithinLimitAndCleansUp { forURLString:@"https://example.test/chunk.bundle" error:&error]; XCTAssertNotEqualObjects(first, replacement); - XCTAssertFalse([files fileExistsAtPath:first]); + XCTAssertTrue([files fileExistsAtPath:first]); + XCTAssertEqualObjects([NSData dataWithContentsOfFile:first], + [@"first" dataUsingEncoding:NSUTF8StringEncoding]); XCTAssertEqualObjects([NSData dataWithContentsOfFile:replacement], [@"replacement" dataUsingEncoding:NSUTF8StringEncoding]); diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index 53b44cec17f..9847b439979 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -71,7 +71,6 @@ decodeTemplate(hostBundleSource); const standaloneTemplate = decodeTemplate(standaloneSource); const remoteTemplate = decodeTemplate(remoteBundleSource); assert.equal(standaloneTemplate['app-type'], 'card'); -assert.ok(standaloneSource.includes(Buffer.from('catalog-standalone-app'))); assert.equal(remoteTemplate['app-type'], 'DynamicComponent'); assert.equal(remoteTemplate['engine-version'], '3.7'); assert.deepEqual(Object.keys(remoteTemplate['custom-sections']), ['catalog']); diff --git a/packages/lynx/package.json b/packages/lynx/package.json index 59d4adf96e6..e80427641fa 100644 --- a/packages/lynx/package.json +++ b/packages/lynx/package.json @@ -63,7 +63,6 @@ }, "dependencies": { "@module-federation/runtime-core": "workspace:*", - "@module-federation/runtime-tools": "workspace:*", "@module-federation/sdk": "workspace:*" }, "peerDependencies": { @@ -88,6 +87,7 @@ "@lynx-js/chunk-loading-webpack-plugin": "0.4.0", "@lynx-js/tasm": "0.0.39", "@lynx-js/web-core": "0.22.1", + "@module-federation/runtime-tools": "workspace:*", "@rsbuild/core": "2.1.4", "@rspack/core": "npm:@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831", "@rstest/core": "^0.10.6", diff --git a/packages/runtime-core/__tests__/snapshot.spec.ts b/packages/runtime-core/__tests__/snapshot.spec.ts index ff543a71a4c..f1ed44dcb07 100644 --- a/packages/runtime-core/__tests__/snapshot.spec.ts +++ b/packages/runtime-core/__tests__/snapshot.spec.ts @@ -156,4 +156,65 @@ describe('snapshot', () => { }); expect(remoteSnapshot?.remoteEntry).toContain('requested.example'); }); + + it('retries a manifest after a failed load', async () => { + const manifestUrl = 'https://retry.example/mf-manifest.json'; + const manifest = { + id: 'catalog', + name: 'catalog', + metaData: { + name: 'catalog', + publicPath: 'https://retry.example/', + type: 'app', + buildInfo: { buildVersion: '1.0.0' }, + remoteEntry: { + name: 'catalog.web.lynx.bundle', + path: '', + type: 'global', + }, + types: { name: '', path: '' }, + globalName: 'catalog', + }, + remotes: [], + shared: [], + exposes: [], + }; + let fetchCount = 0; + const instance = new ModuleFederation({ + name: 'host', + remotes: [{ name: 'catalog', entry: manifestUrl }], + plugins: [ + { + name: 'manifest-fetch', + fetch: async () => { + fetchCount += 1; + if (fetchCount === 1) { + throw new Error('temporary failure'); + } + return new Response(JSON.stringify(manifest), { + headers: { 'Content-Type': 'application/json' }, + }); + }, + }, + ], + }); + + await expect( + instance.snapshotHandler.loadRemoteSnapshotInfo({ + moduleInfo: { name: 'catalog', entry: manifestUrl }, + }), + ).rejects.toThrow('temporary failure'); + expect( + instance.snapshotHandler.manifestLoading[manifestUrl], + ).toBeUndefined(); + + await expect( + instance.snapshotHandler.loadRemoteSnapshotInfo({ + moduleInfo: { name: 'catalog', entry: manifestUrl }, + }), + ).resolves.toMatchObject({ + remoteSnapshot: { globalName: 'catalog' }, + }); + expect(fetchCount).toBe(2); + }); }); diff --git a/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts b/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts index 3c2a62f7d52..15c19bab7bb 100644 --- a/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts +++ b/packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts @@ -80,7 +80,7 @@ export class SnapshotHandler { loadingHostSnapshot: Promise | null = null; HostInstance: ModuleFederation; manifestCache: Map = new Map(); - private manifestCacheGeneration: Map = new Map(); + private manifestCacheRequests: Map = new Map(); hooks = new PluginSystem({ beforeLoadRemoteSnapshot: new AsyncHook< [ @@ -125,14 +125,21 @@ export class SnapshotHandler { } clearManifestCache(manifestUrl: string): void { - this.manifestCacheGeneration.set( - manifestUrl, - (this.manifestCacheGeneration.get(manifestUrl) ?? 0) + 1, - ); + this.manifestCacheRequests.delete(manifestUrl); this.manifestCache.delete(manifestUrl); delete this.manifestLoading[manifestUrl]; } + private clearManifestRequest( + manifestUrl: string, + manifestCacheRequest: object, + ): void { + if (this.manifestCacheRequests.get(manifestUrl) === manifestCacheRequest) { + this.manifestCacheRequests.delete(manifestUrl); + delete this.manifestLoading[manifestUrl]; + } + } + // eslint-disable-next-line max-lines-per-function async loadRemoteSnapshotInfo({ moduleInfo, @@ -306,7 +313,7 @@ export class SnapshotHandler { manifestUrl: string, moduleInfo: Remote, extraOptions: Record, - manifestCacheGeneration: number, + manifestCacheRequest: object, resourceOptions?: { initiator: ResourceLoadInitiator; id: string; @@ -352,12 +359,6 @@ export class SnapshotHandler { )) as Manifest | undefined; if (!manifestJson) { - if ( - manifestCacheGeneration === - (this.manifestCacheGeneration.get(manifestUrl) ?? 0) - ) { - delete this.manifestLoading[manifestUrl]; - } error( RUNTIME_003, runtimeDescMap, @@ -407,8 +408,7 @@ export class SnapshotHandler { ); } if ( - manifestCacheGeneration === - (this.manifestCacheGeneration.get(manifestUrl) ?? 0) + manifestCacheRequest === this.manifestCacheRequests.get(manifestUrl) ) { this.manifestCache.set(manifestUrl, { manifest: manifestJson, @@ -432,14 +432,12 @@ export class SnapshotHandler { id: string; }, ): Promise { - const manifestCacheGeneration = - this.manifestCacheGeneration.get(manifestUrl) ?? 0; - const asyncLoadProcess = async () => { + const asyncLoadProcess = async (manifestCacheRequest: object) => { const manifestJson = await this.getManifestJson( manifestUrl, moduleInfo, extraOptions, - manifestCacheGeneration, + manifestCacheRequest, resourceOptions, ); const remoteSnapshot = generateSnapshotFromManifest(manifestJson, { @@ -461,7 +459,14 @@ export class SnapshotHandler { }; if (!this.manifestLoading[manifestUrl]) { - this.manifestLoading[manifestUrl] = asyncLoadProcess().then((res) => res); + const manifestCacheRequest = {}; + this.manifestCacheRequests.set(manifestUrl, manifestCacheRequest); + this.manifestLoading[manifestUrl] = asyncLoadProcess( + manifestCacheRequest, + ).catch((loadError) => { + this.clearManifestRequest(manifestUrl, manifestCacheRequest); + throw loadError; + }); } return this.manifestLoading[manifestUrl]; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4071c77d474..0793be51a7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3453,9 +3453,6 @@ importers: '@module-federation/runtime-core': specifier: workspace:* version: link:../runtime-core - '@module-federation/runtime-tools': - specifier: workspace:* - version: link:../runtime-tools '@module-federation/sdk': specifier: workspace:* version: link:../sdk @@ -3475,6 +3472,9 @@ importers: '@lynx-js/web-core': specifier: 0.22.1 version: 0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) + '@module-federation/runtime-tools': + specifier: workspace:* + version: link:../runtime-tools '@rsbuild/core': specifier: 2.1.4 version: 2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) From ac671adedaaa667bc73898159f023a3c1f332491 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Tue, 21 Jul 2026 19:58:29 +0000 Subject: [PATCH 42/68] chore(lynx): finalize package boundaries --- .../design/architecture-refactor-plan.md | 683 ------------------ packages/lynx/package.json | 6 + 2 files changed, 6 insertions(+), 683 deletions(-) delete mode 100644 apps/lynx-module-federation-demo/design/architecture-refactor-plan.md diff --git a/apps/lynx-module-federation-demo/design/architecture-refactor-plan.md b/apps/lynx-module-federation-demo/design/architecture-refactor-plan.md deleted file mode 100644 index b29be711b5f..00000000000 --- a/apps/lynx-module-federation-demo/design/architecture-refactor-plan.md +++ /dev/null @@ -1,683 +0,0 @@ -# Lynx Federation Architecture Refactor Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use -> `superpowers:executing-plans` to implement this plan task-by-task. Steps use -> checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Remove every thermonuclear architecture finding from the Lynx Module -Federation implementation while preserving native, iOS, Web, Node, and CI -behavior. - -**Architecture:** Replace private or implicit state with public, typed -boundaries: Rspeedy chain configuration for cache events, atomic manifest cache -records, per-compilation bundle state, and an explicit lazy-load controller. -Move demo and iOS behavior behind directly testable collaborators, then prove -the assembled product with existing real E2E paths. - -**Tech Stack:** TypeScript, Rspack/Rspeedy, Module Federation runtime-core, -Rstest, Node ESM test runners, Objective-C/XCTest, GitHub Actions, pnpm/Turbo. - -## Global Constraints - -- Node.js `24`, pnpm `10.28.0`, and Turbo are required by repository CI. -- Preserve `asyncStartup`, no eager shares, and existing emitted bundle names. -- Web may use `publicPath: 'auto'`; native requires explicit - `LYNX_REMOTE_ORIGIN`-derived origins. -- Preserve synchronous Lynx `PromiseLike` lazy-bundle behavior. -- Do not add dependencies, broad ATS exceptions, or private Lynx plugin field - access. -- Every production behavior change starts with a test that fails for the - intended reason. -- Keep all new production files below 1,000 lines and split the existing - 901-line runtime chunk test by responsibility. - ---- - -## File Ownership - -| File | Responsibility after refactor | -| --- | --- | -| `packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts` | Atomic requested-URL → manifest/resolved-URL cache records. | -| `packages/sdk/src/generateSnapshotFromManifest.ts` | Typed public-path base URL option. | -| `packages/lynx/src/plugin.ts` | Public Rspeedy chain configuration and adapter orchestration only. | -| `packages/lynx/src/remoteBundleCompilationState.ts` | Fresh, typed state per Rspack `Compilation`. | -| `packages/lynx/src/chunkLoadingMatcher.ts` | Template hooks and runtime matcher generation. | -| `packages/lynx/src/externalBundle.ts` | Asset snapshot/encode/delete phase using compilation state. | -| `packages/lynx/src/remoteBundle.ts` | Remote plan validation and plugin composition. | -| `packages/lynx/src/lazyChunkLoadController.ts` | Synchronous-thenable-safe lazy chunk settlement state machine. | -| `packages/lynx/src/runtimeChunkLoading.ts` | Container patch and section-vs-lazy dispatch. | -| `apps/.../src/app/catalogLoadController.ts` | Framework-independent remote-load transaction. | -| `apps/.../src/app/useFederatedCatalog.ts` | React state projection and one in-flight transaction reference. | -| `apps/.../test/support/artifact-server.mjs` | Shared static artifact serving, request tracing, and shutdown. | -| `apps/.../ios/OrbitControl/OrbitResource*.{h,m}` | Resolver, store, downloader, and Lynx protocol adapter boundaries. | - -## Task 1: Make manifest URL caching atomic - -**Files:** - -- Modify: `packages/runtime-core/src/plugins/snapshot/SnapshotHandler.ts:75-435` -- Modify: `packages/runtime-core/src/remote/index.ts:697-716` -- Modify: `packages/runtime-core/__tests__/snapshot.spec.ts` -- Modify: `packages/sdk/src/generateSnapshotFromManifest.ts:12-82` -- Modify: `packages/sdk/__tests__/generateSnapshotFromManifest.spec.ts` - -**Interfaces:** - -- Consumes: requested `manifestUrl`, `Response.url`, and `errorLoadRemote`. -- Produces: `clearManifestCache(manifestUrl): void` clearing manifest record and - in-flight work; `resolvedManifestUrl?: string` SDK option. - -- [ ] **Step 1: Add failing runtime-core regressions.** - - Add tests that make the first response expose a redirect URL and fail JSON - parsing, then recover through `errorLoadRemote` and assert the snapshot uses - the requested URL rather than the stale redirect. Add a second test that - removes/re-registers the remote and verifies both cache data and loading - promise are absent. - - ```ts - expect(snapshot.remoteEntry).toContain('requested.example'); - expect(handler.manifestCache.has(manifestUrl)).toBe(false); - ``` - -- [ ] **Step 2: Run the regression tests red.** - - Run: `pnpm --filter @module-federation/runtime-core exec rstest run __tests__/snapshot.spec.ts` - - Expected: FAIL because `manifestResolvedUrlCache` is written before - `Response.json()` succeeds. - -- [ ] **Step 3: Replace parallel caches with one record.** - - Introduce: - - ```ts - interface ManifestCacheRecord { - manifest: Manifest; - resolvedUrl: string; - } - ``` - - Parse the response first, then cache `{ manifest, resolvedUrl: res.url || - manifestUrl }`. Cache hook-recovered manifests with `resolvedUrl: - manifestUrl`. Make `clearManifestCache` remove the record and - `manifestLoading[manifestUrl]`; remove the second deletion from - `RemoteHandler.removeRemote`. - -- [ ] **Step 4: Rename the SDK boundary and add its failing test.** - - Change the options shape and test it: - - ```ts - generateSnapshotFromManifest(manifest, { - version: 'https://requested.example/mf-manifest.json', - resolvedManifestUrl: 'https://redirected.example/v2/mf-manifest.json', - }); - ``` - - The expected public path is `https://redirected.example/v2/`. - -- [ ] **Step 5: Run the targeted tests green.** - - Run: `pnpm --filter @module-federation/runtime-core exec rstest run __tests__/snapshot.spec.ts` - - Run: `pnpm --filter @module-federation/sdk exec rstest run __tests__/generateSnapshotFromManifest.spec.ts` - - Expected: both pass, including redirect, recovery, and invalidation cases. - -- [ ] **Step 6: Commit the atomic cache boundary.** - - ```bash - git add packages/runtime-core packages/sdk - git commit -m "fix(runtime): make manifest URL caching atomic" - ``` - -## Task 2: Use the public Rspeedy cache-events configuration surface - -**Files:** - -- Modify: `packages/lynx/src/plugin.ts:1-183` -- Modify: `packages/lynx/src/plugin.remoteBundle.test.ts` -- Modify: `packages/lynx/src/plugin.testUtils.ts` - -**Interfaces:** - -- Consumes: bundler-chain plugin slot `lynx:cache-events` and exported - `LynxCacheEventsPlugin` / `LynxCacheEventsPluginOptions`. -- Produces: remote-bundle-only `setupListTransformer: () => []` configuration - without reading plugin instance fields. - -- [ ] **Step 1: Add a failing adapter test.** - - Extend the fake bundler chain with a recorded `plugin(name).use(Plugin, - args)` call. Assert a remote bundle config records: - - ```ts - expect(cacheEventsUse).toEqual([ - LynxCacheEventsPlugin, - [{ setupListTransformer: expect.any(Function) }], - ]); - expect(cacheEventsUse[1][0].setupListTransformer(['event'])).toEqual([]); - ``` - - Assert a non-remote host does not override the slot. - -- [ ] **Step 2: Run the adapter test red.** - - Run: `pnpm --filter @module-federation/lynx exec rstest run src/plugin.remoteBundle.test.ts` - - Expected: FAIL because the current implementation mutates `config.plugins` - after bundler-chain configuration. - -- [ ] **Step 3: Configure the public chain slot.** - - Import the exported class as a value. In `modifyBundlerChain`, after the - environment and remote-bundle checks, apply: - - ```ts - chain.plugin('lynx:cache-events').use(LynxCacheEventsPlugin, [ - { setupListTransformer: () => [] }, - ]); - ``` - - Delete `disableRemoteEntryEventCaching`, its protected-options cast, and its - call from `modifyRspackConfig`. - -- [ ] **Step 4: Run the adapter tests green.** - - Run: `pnpm --filter @module-federation/lynx exec rstest run src/plugin.remoteBundle.test.ts` - - Expected: PASS; no test reads `.options`. - -- [ ] **Step 5: Commit the public configuration boundary.** - - ```bash - git add packages/lynx/src/plugin.ts packages/lynx/src/plugin.remoteBundle.test.ts packages/lynx/src/plugin.testUtils.ts - git commit -m "refactor(lynx): configure cache events through rspeedy" - ``` - -## Task 3: Give each compilation explicit remote-bundle state - -**Files:** - -- Create: `packages/lynx/src/remoteBundleCompilationState.ts` -- Modify: `packages/lynx/src/chunkLoadingMatcher.ts` -- Modify: `packages/lynx/src/externalBundle.ts` -- Modify: `packages/lynx/src/remoteBundle.ts` -- Modify: `packages/lynx/src/chunkLoadingMatcher.test.ts` -- Modify: `packages/lynx/src/plugin.remoteBundle.test.ts` - -**Interfaces:** - -- Produces: - - ```ts - export interface RemoteBundleCompilationState { - discardedTemplateAssets: Set; - lazyBundleAssets: Set; - lazyBundleAssetByExpose: Map; - pairedBundleChunks: Set; - sourceAssets: Array<{ content: string; name: string }>; - } - export const createRemoteBundleCompilationStateStore: () => { - for(compilation: Compilation): RemoteBundleCompilationState; - }; - ``` - -- [ ] **Step 1: Add a failing fresh-compilation test.** - - Drive the matcher hooks for two distinct fake compilations. Add an asset to - the first state, then assert the second state starts with empty sets/maps and - cannot preserve the first compilation's lazy asset. - -- [ ] **Step 2: Run it red.** - - Run: `pnpm --filter @module-federation/lynx exec rstest run src/chunkLoadingMatcher.test.ts` - - Expected: FAIL because state is currently allocated in `configureRemoteBundle` - and shared through plugin options. - -- [ ] **Step 3: Create the state store and thread it through plugins.** - - Use a `WeakMap`. Clear nothing - manually at `thisCompilation`; retrieve the fresh state from the store. - Replace mutable option fields with `stateStore`. Make the external-bundle - process-assets hook assign `state.sourceAssets`, and make its emit hook read - the same compilation's state. Store paired chunks in a `Set`. - -- [ ] **Step 4: Preserve plugin responsibilities.** - - Keep matcher, paired-assets, and encoder plugins separate. `remoteBundle.ts` - creates exactly one store per configured remote bundle and passes it to all - three plugins. No plugin instance may retain compilation asset arrays. - -- [ ] **Step 5: Run the focused suite green.** - - Run: `pnpm --filter @module-federation/lynx exec rstest run src/chunkLoadingMatcher.test.ts src/externalBundle.test.ts src/plugin.remoteBundle.test.ts` - - Expected: PASS, including fresh compilation state. - -- [ ] **Step 6: Commit compilation state ownership.** - - ```bash - git add packages/lynx/src/remoteBundleCompilationState.ts packages/lynx/src/chunkLoadingMatcher.ts packages/lynx/src/externalBundle.ts packages/lynx/src/remoteBundle.ts packages/lynx/src/*.test.ts - git commit -m "refactor(lynx): isolate remote bundle compilation state" - ``` - -## Task 4: Replace lazy-chunk flag soup with a controller and focused suites - -**Files:** - -- Create: `packages/lynx/src/lazyChunkLoadController.ts` -- Create: `packages/lynx/src/runtimeChunkLoading.testUtils.ts` -- Create: `packages/lynx/src/runtimeSectionLoading.test.ts` -- Create: `packages/lynx/src/runtimeLazyBundleLoading.test.ts` -- Create: `packages/lynx/src/runtimeChunkUrl.test.ts` -- Modify: `packages/lynx/src/runtimeChunkLoading.ts` -- Delete: `packages/lynx/src/runtimeChunkLoading.test.ts` - -**Interfaces:** - -- Consumes: `LynxChunk`, `InstalledChunk`, `installChunkAfterConsumes`, and - `loadWithTimeout`. -- Produces: - - ```ts - export const createLazyChunkLoadController = (args: { - chunkKey: string; - installedChunks: Record; - timeout: number; - }) => ({ load(request: string): ChunkPromise }); - ``` - -- [ ] **Step 1: Split existing tests without changing assertions.** - - Move section-load tests to `runtimeSectionLoading.test.ts`, lazy thenable/ - consumes/retry/timeout tests to `runtimeLazyBundleLoading.test.ts`, and URL - cases to `runtimeChunkUrl.test.ts`. Move `createWebpackRequire`, registry, - and synchronous-thenable helpers into `runtimeChunkLoading.testUtils.ts`. - -- [ ] **Step 2: Add a failing controller behavior test.** - - Add a synchronous thenable test that asserts module installation and observer - callback occur before the current stack returns when no consumes are pending. - Add a stale timed-out load test that cannot delete a later retry's tuple. - -- [ ] **Step 3: Run only the new lazy suite red.** - - Run: `pnpm --filter @module-federation/lynx exec rstest run src/runtimeLazyBundleLoading.test.ts` - - Expected: FAIL because `createLazyChunkLoadController` does not exist. - -- [ ] **Step 4: Implement explicit settlement.** - - Give the controller one discriminated state and generation identity. It must - call the Lynx `PromiseLike.then` directly, install synchronous chunks before - returning, wait for consumes before completion, race only the owned tuple - against its primary load, and delete the tuple only when it still owns it. - -- [ ] **Step 5: Reduce `runtimeChunkLoading.ts` to dispatch.** - - Keep URL joining, section loading, registry lookup, and handler replacement - there. Delegate the lazy branch to the controller. Delete `active`, - `insideLoader`, `ImmediateLazyLoad`, and their scattered settlement paths. - -- [ ] **Step 6: Run all chunk suites green.** - - Run: `pnpm --filter @module-federation/lynx exec rstest run src/runtimeSectionLoading.test.ts src/runtimeLazyBundleLoading.test.ts src/runtimeChunkUrl.test.ts` - - Expected: PASS; no test file exceeds 500 lines. - -- [ ] **Step 7: Commit the lazy-load controller.** - - ```bash - git add packages/lynx/src/lazyChunkLoadController.ts packages/lynx/src/runtimeChunkLoading.ts packages/lynx/src/runtime*Loading.test.ts - git commit -m "refactor(lynx): isolate lazy chunk load settlement" - ``` - -## Task 5: Make demo loading transactional and directly testable - -**Files:** - -- Create: `apps/lynx-module-federation-demo/src/app/catalogLoadController.ts` -- Create: `apps/lynx-module-federation-demo/src/app/catalogLoadController.test.ts` -- Modify: `apps/lynx-module-federation-demo/src/app/useFederatedCatalog.ts` -- Modify: `apps/lynx-module-federation-demo/src/app/App.tsx` - -**Interfaces:** - -- Produces: - - ```ts - export type CatalogLoadResult = { - activityFeed: ComponentType; - card: ComponentType; - details: ComponentType; - sharedState: SharedStateView; - singletonShared: boolean; - }; - export const createCatalogLoadController = (dependencies) => ({ load(): Promise }); - ``` - -- [ ] **Step 1: Add failing controller tests.** - - Call `load()` twice before resolving dependencies and assert each call returns - the same promise and each remote import runs once. Reject one load after - partial imports, then resolve a retry and assert no stale result is returned. - -- [ ] **Step 2: Run them red.** - - Run: `pnpm --filter lynx-module-federation-demo exec rstest run src/app/catalogLoadController.test.ts` - - Expected: FAIL because the controller module is absent. - -- [ ] **Step 3: Implement the framework-independent transaction.** - - Inject `loadCompiledImportRemotes`, `loadRuntimeActivityFeed`, and shared - state functions. Cache one in-flight promise; clear it after settlement; - validate singleton identity once per successful controller lifetime. - -- [ ] **Step 4: Project controller results through a discriminated hook state.** - - Replace independent component/error/ready state with `idle`, `loading`, - `ready`, and `error` records. The hook retains an `inFlightRef`, clears - components on error, and maps a successful result to UI activity atomically. - Make `LoadButton` ignore taps while `loading` or `ready`. - -- [ ] **Step 5: Run tests green and build the app.** - - Run: `pnpm --filter lynx-module-federation-demo exec rstest run src/app/catalogLoadController.test.ts` - - Run: `pnpm --filter lynx-module-federation-demo run build` - - Expected: PASS and host compiles. - -- [ ] **Step 6: Commit transactional demo loading.** - - ```bash - git add apps/lynx-module-federation-demo/src/app - git commit -m "refactor(lynx-demo): serialize remote loading" - ``` - -## Task 6: Isolate artifact serving and native dev output - -**Files:** - -- Create: `apps/lynx-module-federation-demo/test/support/artifact-server.mjs` -- Create: `apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs` -- Modify: `apps/lynx-module-federation-demo/test/native-dev-server.mjs` -- Modify: `apps/lynx-module-federation-demo/test/real-web/run.mjs` -- Modify: `apps/lynx-module-federation-demo/test/ios/run.mjs` -- Modify: `apps/lynx-module-federation-demo/lynx*.config.mjs` -- Modify: `apps/lynx-module-federation-demo/test/native-artifacts.mjs` - -**Interfaces:** - -- Produces: - - ```js - export const createArtifactServer = async ({ root, routes = {} }) => ({ - origin, - requests, - waitFor(url, timeout), - close(), - }); - ``` - -- [ ] **Step 1: Add failing artifact-server tests.** - - Serve a temporary root, request an artifact, assert path traversal is denied, - request trace records the path/status, and `close()` releases the server. - -- [ ] **Step 2: Run them red.** - - Run: `node --test apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs` - - Expected: FAIL because the server module is absent. - -- [ ] **Step 3: Implement the focused server.** - - Resolve requested paths beneath `root`, reject escapes, record every request, - serve explicit dynamic routes before files, and make shutdown idempotent. - -- [ ] **Step 4: Add environment-controlled output roots.** - - Each Lynx demo config derives `output.path` from `LYNX_OUTPUT_ROOT` when set, - otherwise preserves the existing `dist/*` path. In - `native-dev-server.mjs`, create one `mkdtemp` output root and pass it to all - build/dev children. Delete only that directory in `finally`; remove all - `rename(distRoot, ...)` calls. - -- [ ] **Step 5: Replace generated-source proxy assertions.** - - Keep `native-artifacts.mjs` assertions at public boundaries: manifest schema, - expected remote/container/lazy files, bundle count, and loadability through - the server. Move compiler-source behavior assertions into `packages/lynx` - unit tests. - -- [ ] **Step 6: Migrate Web and iOS runners.** - - Use `createArtifactServer` in real-Web and iOS runners while retaining each - scenario's current assertions and diagnostics. - -- [ ] **Step 7: Run focused E2E checks green.** - - Run: `node --test apps/lynx-module-federation-demo/test/support/artifact-server.test.mjs` - - Run: `pnpm --dir apps/lynx-module-federation-demo run test:native-dev-server` - - Run: `pnpm --dir apps/lynx-module-federation-demo run e2e:web` - - Expected: PASS; canonical `apps/lynx-module-federation-demo/dist` remains - untouched before and after native dev-server testing. - -- [ ] **Step 8: Commit isolated E2E infrastructure.** - - ```bash - git add apps/lynx-module-federation-demo/test apps/lynx-module-federation-demo/*.config.mjs - git commit -m "refactor(lynx-demo): isolate artifact test output" - ``` - -## Task 7: Decompose the native iOS resource boundary and add XCTest coverage - -**Files:** - -- Create: `apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.{h,m}` -- Create: `apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceStore.{h,m}` -- Create: `apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceDownloader.{h,m}` -- Create: `apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m` -- Modify: `apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceFetcher.{h,m}` -- Modify: `apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj` -- Modify: `apps/lynx-module-federation-demo/test/ios-project.mjs` -- Modify: `apps/lynx-module-federation-demo/test/ios/run.mjs` - -**Interfaces:** - -- Produces: - - ```objc - @interface OrbitResourceURLResolver : NSObject - - (instancetype)initWithRootBundleURL:(NSString *)rootBundleURL; - - (NSURL *)resolvedURLForString:(NSString *)urlString; - - (BOOL)isAllowedLocalURL:(NSURL *)url; - @end - ``` - - ```objc - @interface OrbitResourceStore : NSObject - - (NSString *)pathForURLString:(NSString *)urlString; - - (NSString *)storeData:(NSData *)data forURLString:(NSString *)urlString error:(NSError **)error; - @end - ``` - -- [ ] **Step 1: Create failing XCTest cases.** - - Test relative URL resolution, `../` and symlink escape rejection, approved - loopback URLs, cache replacement under the 64 MiB limit, oversize download - cancellation, and temporary-file cleanup. - -- [ ] **Step 2: Add the test target and run it red.** - - Add `OrbitControlTests` to the Xcode project and include: - - ```bash - -only-testing:OrbitControlTests - ``` - - in the existing Release `xcodebuild` invocation. - - Run: `pnpm --filter lynx-module-federation-demo run test:ios-project` - - Expected: FAIL until the source/target wiring and collaborators exist. - -- [ ] **Step 3: Extract resolver and store.** - - Move URL conversion and local containment into - `OrbitResourceURLResolver`; move cache paths, atomic persistence, and byte - accounting into `OrbitResourceStore`. Preserve the current 64 MiB limits and - errors exactly. - -- [ ] **Step 4: Extract injectable downloader.** - - Move `NSURLSessionDownloadDelegate` coordination into - `OrbitResourceDownloader`; accept an injected session configuration for - XCTest's custom `NSURLProtocol`. Cancel and delete when expected or received - bytes exceed the limit. - -- [ ] **Step 5: Reduce fetcher to Lynx adaptation.** - - `OrbitResourceFetcher` selects local vs remote paths, invokes the resolver, - store, and downloader, and completes Lynx requests. It owns no URL policy, - cache accounting, or download delegate maps. - -- [ ] **Step 6: Replace regex behavior proxies with structural checks.** - - `ios-project.mjs` checks the Xcode target, files, single Release command, - all test target selectors, and ATS policy. Remove assertions that merely - search Objective-C source for implementation strings. - -- [ ] **Step 7: Run policy and real iOS tests green.** - - Run: `pnpm --filter lynx-module-federation-demo run test:ios-project` - - Run: `pnpm run ci:local --only=e2e-lynx` - - Expected: policy test passes locally; macOS CI runs `OrbitControlTests` plus - the three existing UI tests in one Release build. - -- [ ] **Step 8: Commit the native resource boundaries.** - - ```bash - git add apps/lynx-module-federation-demo/ios apps/lynx-module-federation-demo/test/ios-project.mjs apps/lynx-module-federation-demo/test/ios/run.mjs - git commit -m "refactor(lynx-ios): isolate resource loading boundaries" - ``` - -## Task 8: Document compatibility and remove CI configuration drift - -**Files:** - -- Modify: `apps/lynx-module-federation-demo/README.md` -- Modify: `apps/lynx-module-federation-demo/package.json` -- Create: `apps/lynx-module-federation-demo/test/ci-policy.mjs` -- Modify: `.github/workflows/e2e-metro.yml` -- Modify: `.github/workflows/e2e-lynx.yml` -- Modify: `apps/lynx-module-federation-demo/test/ios-project.mjs` - -**Interfaces:** - -- Produces: one documented `rspack-canary-rspeedy.mjs` compatibility boundary; - one `ANDROID_EMULATOR_PARTITION_SIZE_MB` environment value. - -- [ ] **Step 1: Add a failing workflow policy assertion.** - - Create `test/ci-policy.mjs` and expose it as `test:ci-policy`. Require - `ANDROID_EMULATOR_PARTITION_SIZE_MB` and reject a second literal partition - value in emulator options. - -- [ ] **Step 2: Run it red.** - - Run: `pnpm --dir apps/lynx-module-federation-demo run test:ci-policy` - - Expected: the dedicated policy assertion fails until the workflow uses one - environment value. - -- [ ] **Step 3: Derive both emulator settings from one value.** - - Set `ANDROID_EMULATOR_PARTITION_SIZE_MB: 1024`; use - `${{ env.ANDROID_EMULATOR_PARTITION_SIZE_MB }}M` for `disk-size` and - `-partition-size ${{ env.ANDROID_EMULATOR_PARTITION_SIZE_MB }}` for emulator - options. - -- [ ] **Step 4: Document the wrapper.** - - Explain the canary wrapper's upstream resolution constraint, commands that - own it, and the exact removal condition: Rspeedy must support the repository - Rspack package directly. Do not expose wrapper imports to application code. - -- [ ] **Step 5: Verify formatting and policy.** - - Run: `pnpm exec prettier --check .github/workflows/e2e-metro.yml apps/lynx-module-federation-demo/README.md` - - Run: `pnpm --dir apps/lynx-module-federation-demo run test:ci-policy` - - Run: `git diff --check` - - Expected: PASS. - -- [ ] **Step 6: Commit compatibility documentation and CI consistency.** - - ```bash - git add .github/workflows/e2e-metro.yml apps/lynx-module-federation-demo/README.md apps/lynx-module-federation-demo/package.json apps/lynx-module-federation-demo/test/ci-policy.mjs - git commit -m "docs(lynx): document rspeedy compatibility boundary" - ``` - -## Task 9: Full verification, simplification, and final review - -**Files:** - -- Modify only files required by failures from prior tasks. -- Test: all touched package, demo, local CI, and GitHub CI jobs. - -- [ ] **Step 1: Run package validation.** - - ```bash - pnpm exec turbo run build --filter=@module-federation/runtime-core --filter=@module-federation/sdk --filter=@module-federation/lynx - pnpm exec turbo run test --filter=@module-federation/runtime-core --filter=@module-federation/sdk --filter=@module-federation/lynx --force - pnpm exec turbo run lint --filter=@module-federation/runtime-core --filter=@module-federation/sdk --filter=@module-federation/lynx - ``` - -- [ ] **Step 2: Run demo CI parity.** - - ```bash - TURBO_ENV_MODE=loose CHOKIDAR_USEPOLLING=true pnpm run ci:local --only=e2e-lynx - pnpm run ci:local --only=build-and-test - ``` - -- [ ] **Step 3: Run final simplification audit.** - - Check that no private `.options` access, shared compilation collections, - generated-output assertions, test skips, eager shares, or files above 1,000 - lines remain in the refactored scope. Run `git diff --check` and scoped - Prettier. - -- [ ] **Step 4: Push and monitor final GitHub CI.** - - Push the branch, confirm all latest-head checks, including `e2e-lynx-ios`, - `e2e-metro-android`, and `e2e-metro-ios`, are green, and inspect failed logs - before declaring completion. - -- [ ] **Step 5: Commit any final scoped fixes.** - - ```bash - git add - git commit -m "fix(lynx): complete architecture refactor" - ``` - -## Plan Self-Review - -- Spec coverage: Tasks 1–8 map directly to every approved architecture - section; Task 9 proves all completion criteria. -- Placeholders: no deferred or ambiguous implementation steps remain. -- Type consistency: manifest records, compilation state, lazy controller, - catalog result, artifact server, and iOS collaborators are named consistently - across producer and consumer tasks. diff --git a/packages/lynx/package.json b/packages/lynx/package.json index e80427641fa..e2ac06f5aeb 100644 --- a/packages/lynx/package.json +++ b/packages/lynx/package.json @@ -74,6 +74,12 @@ "@rspack/core": ">=2.1.5-canary-54a0d8f3-20260715194831 <3" }, "peerDependenciesMeta": { + "@lynx-js/cache-events-webpack-plugin": { + "optional": true + }, + "@lynx-js/css-serializer": { + "optional": true + }, "@lynx-js/tasm": { "optional": true }, From 298d32655d11227e73ab0a6e2d6e1f66588f7244 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Wed, 22 Jul 2026 21:01:00 +0000 Subject: [PATCH 43/68] feat(lynx): complete lazy federation integration --- .changeset/tiny-lynxes-federate.md | 6 + .github/workflows/e2e-lynx.yml | 68 +++- apps/lynx-module-federation-demo/.gitignore | 1 + apps/lynx-module-federation-demo/README.md | 62 ++-- .../OrbitControl.xcodeproj/project.pbxproj | 8 +- .../OrbitControl/OrbitResourceURLResolver.m | 8 +- .../OrbitControlTests/OrbitResourceTests.m | 20 +- .../OrbitControlUITests.swift | 12 + .../lynx.catalog.native.config.mjs | 1 + .../lynx.catalog.web.config.mjs | 1 + .../lynx.config.mjs | 4 + .../lynx.web.config.mjs | 1 + apps/lynx-module-federation-demo/package.json | 18 +- .../scripts/sync-ios-bundle.mjs | 20 +- .../src/app/App.tsx | 4 +- .../src/app/federation.ts | 5 +- .../src/app/staticCard.ts | 4 + .../src/remote-ui/ActivityFeed.tsx | 34 +- .../src/remote-ui/activityMetadata.ts | 3 + .../test/ci-policy.mjs | 18 +- .../test/ios-project.mjs | 10 +- .../test/ios/run.mjs | 36 +- .../test/native-artifacts.mjs | 74 +++- .../test/native-dev-server.mjs | 39 +- .../test/real-web/run.mjs | 75 +++- package.json | 1 + packages/lynx/README.md | 6 + packages/lynx/package.json | 10 +- packages/lynx/src/chunkLoadingMatcher.test.ts | 10 +- packages/lynx/src/chunkLoadingMatcher.ts | 13 +- packages/lynx/src/plugin.remoteBundle.test.ts | 22 ++ packages/lynx/src/remoteBundle.ts | 41 ++- packages/lynx/src/runtimeChunkLoading.ts | 62 +++- packages/lynx/src/runtimeChunkUrl.test.ts | 42 +++ packages/lynx/src/runtimeCore.ts | 11 +- .../lynx/src/runtimeLazyBundleLoading.test.ts | 85 ++++- pnpm-lock.yaml | 341 +++++++++++------- tools/scripts/ci-local.mjs | 40 +- 38 files changed, 917 insertions(+), 299 deletions(-) create mode 100644 apps/lynx-module-federation-demo/src/app/staticCard.ts create mode 100644 apps/lynx-module-federation-demo/src/remote-ui/activityMetadata.ts diff --git a/.changeset/tiny-lynxes-federate.md b/.changeset/tiny-lynxes-federate.md index 1035529ab9e..c4d3916c69d 100644 --- a/.changeset/tiny-lynxes-federate.md +++ b/.changeset/tiny-lynxes-federate.md @@ -10,5 +10,11 @@ whose remote entry resolves to one HTTP-loadable external `.lynx.bundle`. Compiled federated `import()` calls skip Lynx's local loader for remote-only chunk IDs while preserving normal local JavaScript chunk loading. +Load non-eager host, remote-exposure, and descendant chunks through Lynx's +public lazy-bundle API. Split federation requires the Lynx Web Core and template +plugin releases that preserve automatic public paths, expose retryable lazy +loading, and omit assetless remote-only chunk groups. +Accept the cache-events plugin 0.2 line used by Rspeedy 0.16. + Resolve manifest `publicPath: 'auto'` from the fetched response URL so root-relative manifest entries remain portable in browser-like runtimes. diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 24fb3dc42a9..56defb13c08 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -5,7 +5,7 @@ on: workflow_call: jobs: - e2e-lynx: + e2e-lynx-native: runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -45,14 +45,11 @@ jobs: - name: Build shared packages run: pnpm run build:packages - - name: Install Playwright Chromium - run: pnpm --filter lynx-module-federation-demo exec playwright install --with-deps chromium - - name: Test Lynx federation compiler and transport run: pnpm --filter @module-federation/lynx test - name: Build and validate native Lynx artifacts - run: pnpm --filter lynx-module-federation-demo run e2e:native + run: pnpm --filter lynx-module-federation-demo run e2e:native:ci - name: Validate standalone iOS project policy run: pnpm --filter lynx-module-federation-demo run test:ios-project @@ -68,27 +65,76 @@ jobs: if-no-files-found: error retention-days: 1 + - name: Upload native failure artifacts + if: failure() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: lynx-native-e2e-failure + path: | + apps/lynx-module-federation-demo/dist/catalog-native/ + apps/lynx-module-federation-demo/dist/host-native/ + apps/lynx-module-federation-demo/dist/remote-native/ + if-no-files-found: ignore + retention-days: 7 + + e2e-lynx-web: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout Repository + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + fetch-depth: 0 + + - name: Setup pnpm + uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4 + + - name: Setup Node.js 24 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 + with: + node-version: '24' + cache: 'pnpm' + cache-dependency-path: '**/pnpm-lock.yaml' + + - name: Export SKIP_DEVTOOLS_POSTINSTALL + run: echo "SKIP_DEVTOOLS_POSTINSTALL=true" >> "$GITHUB_ENV" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Restore Turborepo cache + uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 + with: + path: .turbo/cache + key: ${{ runner.os }}-turbo-${{ github.ref_name }}-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-turbo-${{ github.ref_name }}- + ${{ runner.os }}-turbo- + + - name: Build shared packages + run: pnpm run build:packages + + - name: Install Playwright Chromium + run: pnpm --filter lynx-module-federation-demo exec playwright install --with-deps chromium + - name: Run real Lynx for Web E2E - run: pnpm --filter lynx-module-federation-demo run e2e:web + run: pnpm --filter lynx-module-federation-demo run e2e:web:ci - - name: Upload Lynx E2E failure artifacts + - name: Upload Web E2E failure artifacts if: failure() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: lynx-module-federation-e2e-failure path: | apps/lynx-module-federation-demo/test/real-web/artifacts/ - apps/lynx-module-federation-demo/dist/catalog-native/ apps/lynx-module-federation-demo/dist/catalog-web/ - apps/lynx-module-federation-demo/dist/host-native/ - apps/lynx-module-federation-demo/dist/remote-native/ apps/lynx-module-federation-demo/dist/host-web/ apps/lynx-module-federation-demo/dist/remote-web/ if-no-files-found: ignore retention-days: 7 e2e-lynx-ios: - needs: e2e-lynx + needs: e2e-lynx-native runs-on: macos-15 timeout-minutes: 120 env: diff --git a/apps/lynx-module-federation-demo/.gitignore b/apps/lynx-module-federation-demo/.gitignore index ccd3c66e605..61246030974 100644 --- a/apps/lynx-module-federation-demo/.gitignore +++ b/apps/lynx-module-federation-demo/.gitignore @@ -6,6 +6,7 @@ ios/.bundle/ ios/Pods/ ios/OrbitControl.xcworkspace/ ios/Resources/main.lynx.bundle +ios/Resources/host-native/ ios/Resources/static/ ios/build/ ios/vendor/bundle/ diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index f4506741922..3fe4b397cda 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -9,8 +9,10 @@ simulation. It includes: - a native background host with paired ReactLynx remote UI built as `.lynx.bundle` artifacts; - a Lynx for Web host mounted in the official `` custom element; -- ordinary `import('catalog/Card')` and runtime `loadRemote()` consumers; -- three lazy remote screens loaded over HTTP from `mf-manifest.json`; +- compile-time `import ... from 'catalog/Card'`, dynamic + `import('catalog/Details')`, and runtime `loadRemote()` consumers; +- three lazy remote screens plus a nested remote chunk loaded over HTTP from + `mf-manifest.json`; - host, Card, Details, and ActivityFeed consumers of one shared singleton; - independent background and main-thread layer scopes. @@ -23,10 +25,11 @@ flowchart LR A -->|"direct imports"| X["Card + Details + ActivityFeed"] E --> X H["Orbit Control host"] -->|"GET"| M["mf-manifest.json"] - H -->|"asyncStartup"| T["shared-state startup .js"] + H -->|"asyncStartup"| T["host startup lazy .bundle"] M -->|"remoteEntry"| C["catalog.*.lynx.bundle"] C --> R["container only"] R -->|"on demand"| F["ActivityFeed .bundle"] + F -->|"dynamic import"| N["activity-metadata .bundle"] R -->|"on demand"| G["Card .bundle"] R -->|"on demand"| D["Details .bundle"] ``` @@ -36,12 +39,14 @@ styles resolve the manifest, whose `metaData.remoteEntry` names the public `.lynx.bundle` container. Lazy expose bundles are fetched separately. The Web remote uses `publicPath: 'auto'`; Module Federation resolves its container and split assets from the fetched manifest URL instead of Lynx Web's internal -`document.currentScript`. The native remote uses the absolute -`LYNX_REMOTE_ORIGIN` required by Rspeedy/Lynx's native lazy-bundle loader. +`document.currentScript`. Native remotes use the explicit +`LYNX_REMOTE_ORIGIN` because they have no browser script URL. Native host assets +default to `/host-native/`, which works for a root deployment and the bundled +iOS resource provider; set `LYNX_HOST_ORIGIN` when they live elsewhere. ## Rspeedy compatibility boundary -Rspeedy 0.15 resolves its own `@rspack/core`, while this repository needs +Rspeedy 0.16 resolves its own `@rspack/core`, while this repository needs `@rspack-canary/core` 2.1.5-canary-54a0d8f3-20260715194831 for the Lynx layer and chunk behavior under test. `rspack-canary-rspeedy.mjs` is the single compatibility boundary: it starts Rspeedy with Node resolution hooks that map @@ -72,19 +77,26 @@ builds emit regular root apps at `dist/catalog-native/main.lynx.bundle` and Catalog app and federation transport are separate Rspeedy builds by design. ReactLynx's `experimental_isLazyBundle` mode applies to the whole compilation and emits `DynamicComponent` bundles, so the provider build contains only the -manifest, container, and three lazy exposes. The regular Catalog build bundles +manifest, container, three lazy expose roots, and ActivityFeed's nested lazy +chunk. The regular Catalog build bundles its local shared-state implementation; the provider marks that implementation `import: false`, so Orbit supplies the negotiated singleton and does not download Catalog's standalone app or duplicate shared state. The federation configs explicitly enable `experiments.asyncStartup`. Shared modules do not use `eager: true`: the host waits for share-scope initialization -and loads its singleton provider from `static/js/async/*.js` before application -startup. The remote's `import: false` consumer then reuses that initialized -background-realm singleton. +and loads its singleton provider from a host `lazy-bundle/*.bundle` before +application startup. The remote's `import: false` consumer then reuses that +initialized background-realm singleton. -On iOS, root-relative startup paths resolve against an HTTP root bundle's -origin in Debug and against the signed app bundle for an embedded Release root. +`src/app/staticCard.ts` is the standard asynchronous bootstrap boundary. It +contains a module-scope static `import * as card from 'catalog/Card'`; importing +that local boundary asynchronously delays evaluation without replacing the +federated import with a runtime loader. + +On iOS, root-relative host and standalone Catalog lazy-bundle paths resolve +against an HTTP root bundle's origin. Embedded Release host assets resolve +against the signed app bundle. ## Run the standalone iOS app @@ -136,9 +148,9 @@ LYNX_REMOTE_ORIGIN=https://cdn.example.com/catalog/ pnpm build:native pnpm ios:sync ``` -The host bundle and its non-eager async-startup JS are embedded. The manifest, -container, and lazy expose bundles remain separately deployable HTTP(S) -artifacts. One Release simulator build runs all three UI scenarios: it +The root host bundle and its non-eager async-startup lazy bundles are embedded. +The manifest, container, and lazy expose bundles remain separately deployable +HTTP(S) artifacts. One Release simulator build runs all three UI scenarios: it launches the app, taps **Load remote catalog**, verifies compiled imports, runtime `loadRemote()`, and shared singleton identity, then checks every native bundle request observed by the test server; launches Catalog as a standalone @@ -167,11 +179,12 @@ Explorer on the device and scan it. The phone must be able to reach Set `CATALOG_NATIVE_MANIFEST_URL` when the remote manifest is hosted elsewhere. `e2e:native` is artifact and transport validation. It compiles the real Rspeedy -host, Catalog app, and remote, verifies the regular standalone root bundle, -the separately transported async-startup singleton, the background container, -and three independently loadable lazy UI bundles, checks the manifest's public -background expose/share metadata, then fetches every artifact over HTTP. The -macOS CI job adds a real iOS Simulator runtime test of those artifacts. +host, Catalog app, and remote, verifies the regular standalone root bundle, two +separately transported host lazy bundles (including the async-startup +singleton), the background container, three independently loadable remote UI +roots, and ActivityFeed's nested dynamic-import bundle; checks the manifest's +public background expose/share metadata; then fetches every artifact over HTTP. +The macOS CI job adds a real iOS Simulator runtime test of those artifacts. ## Run the real Lynx Web E2E @@ -190,10 +203,11 @@ and touch input. The server indexes realpath-contained artifacts before it listens, so URL input never becomes a filesystem path and internal errors are not returned to clients. The test verifies: -- manifest, container, and lazy expose requests over HTTP; -- async-startup share initialization over its independent JS request; -- compiled `import()` and runtime `loadRemote()` results; -- rendering and navigation through the ReactLynx UI; +- manifest, container, lazy expose, and nested remote chunk requests over HTTP; +- async-startup share initialization over its host lazy-bundle request; +- static import, dynamic `import()`, and runtime `loadRemote()` results; +- rendering and navigation through the ReactLynx UI, including output from the + nested dynamic import; - shared-state identity and mutations across host and remote consumers; - direct local composition and shared state in the standalone Catalog; - no federation requests while Catalog runs through direct imports; diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj index 2731b02e4e4..b190a03edbd 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj +++ b/apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj @@ -15,7 +15,7 @@ 100000000000000000000005 /* main.lynx.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 100000000000000000000019 /* main.lynx.bundle */; }; 100000000000000000000006 /* OrbitControlUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001A /* OrbitControlUITests.swift */; }; 100000000000000000000007 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001C /* Assets.xcassets */; }; - 100000000000000000000008 /* static in Resources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001D /* static */; }; + 100000000000000000000008 /* host-native in Resources */ = {isa = PBXBuildFile; fileRef = 10000000000000000000001D /* host-native */; }; 200000000000000000000001 /* OrbitResourceURLResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000002 /* OrbitResourceURLResolver.m */; }; 200000000000000000000002 /* OrbitResourceStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000004 /* OrbitResourceStore.m */; }; 200000000000000000000003 /* OrbitResourceDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 210000000000000000000006 /* OrbitResourceDownloader.m */; }; @@ -50,7 +50,7 @@ 10000000000000000000001A /* OrbitControlUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrbitControlUITests.swift; sourceTree = ""; }; 10000000000000000000001B /* OrbitControlUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OrbitControlUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 10000000000000000000001C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 10000000000000000000001D /* static */ = {isa = PBXFileReference; lastKnownFileType = folder; path = static; sourceTree = ""; }; + 10000000000000000000001D /* host-native */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "host-native"; sourceTree = ""; }; 210000000000000000000001 /* OrbitResourceURLResolver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OrbitResourceURLResolver.h; sourceTree = ""; }; 210000000000000000000002 /* OrbitResourceURLResolver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OrbitResourceURLResolver.m; sourceTree = ""; }; 210000000000000000000003 /* OrbitResourceStore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OrbitResourceStore.h; sourceTree = ""; }; @@ -131,7 +131,7 @@ isa = PBXGroup; children = ( 100000000000000000000019 /* main.lynx.bundle */, - 10000000000000000000001D /* static */, + 10000000000000000000001D /* host-native */, ); path = Resources; sourceTree = ""; @@ -288,7 +288,7 @@ 100000000000000000000004 /* LaunchScreen.storyboard in Resources */, 100000000000000000000005 /* main.lynx.bundle in Resources */, 100000000000000000000007 /* Assets.xcassets in Resources */, - 100000000000000000000008 /* static in Resources */, + 100000000000000000000008 /* host-native in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.m b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.m index 85a90804d45..da89c966021 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControl/OrbitResourceURLResolver.m @@ -7,6 +7,10 @@ @interface OrbitResourceURLResolver () @end +static BOOL IsNetworkBundleAssetPath(NSString *urlString) { + return [urlString hasPrefix:@"/host-native/"] || + [urlString hasPrefix:@"/catalog-native/"]; +} @implementation OrbitResourceURLResolver @@ -34,7 +38,7 @@ - (nullable NSURL *)resolvedURLForString:(NSString *)urlString { NSString *unresolvedPath = url.path.length > 0 ? url.path : urlString; if ([unresolvedPath.pathComponents containsObject:@".."]) return nil; - if (self.rootBundleURL && [urlString hasPrefix:@"/static/"]) { + if (self.rootBundleURL && IsNetworkBundleAssetPath(urlString)) { return [NSURL URLWithString:urlString relativeToURL:self.rootBundleURL].absoluteURL; } @@ -50,7 +54,7 @@ - (nullable NSURL *)resolvedURLForString:(NSString *)urlString { if (urlString.isAbsolutePath) { NSURL *fileURL = [NSURL fileURLWithPath:urlString]; if ([self isAllowedLocalURL:fileURL]) return fileURL; - if (![urlString hasPrefix:@"/static/"]) return nil; + if (![urlString hasPrefix:@"/host-native/"]) return nil; relativePath = [urlString substringFromIndex:1]; } else { relativePath = unresolvedPath; diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m b/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m index b2debb2e5ed..4b785331472 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m +++ b/apps/lynx-module-federation-demo/ios/OrbitControlTests/OrbitResourceTests.m @@ -21,10 +21,23 @@ - (void)testResolvesRootRelativeLoopbackURLs { OrbitResourceURLResolver *resolver = [[OrbitResourceURLResolver alloc] initWithRootBundleURL:@"http://127.0.0.1:3000/host-native/main.lynx.bundle"]; - NSURL *resolved = [resolver resolvedURLForString:@"/static/js/async/shared.js"]; + NSURL *resolved = [resolver + resolvedURLForString:@"/host-native/lazy-bundle/shared.bundle"]; XCTAssertEqualObjects(resolved.absoluteString, - @"http://127.0.0.1:3000/static/js/async/shared.js"); + @"http://127.0.0.1:3000/host-native/lazy-bundle/shared.bundle"); +} + +- (void)testResolvesStandaloneCatalogRootRelativeURLs { + OrbitResourceURLResolver *resolver = [[OrbitResourceURLResolver alloc] + initWithRootBundleURL:@"http://127.0.0.1:3000/catalog-native/main.lynx.bundle"]; + + NSURL *resolved = [resolver + resolvedURLForString:@"/catalog-native/lazy-bundle/activity-metadata.bundle"]; + + XCTAssertEqualObjects( + resolved.absoluteString, + @"http://127.0.0.1:3000/catalog-native/lazy-bundle/activity-metadata.bundle"); } - (void)testRejectsTraversalAndSymlinkEscapes { @@ -62,7 +75,8 @@ - (void)testRejectsTraversalAndSymlinkEscapes { XCTAssertFalse([resolver isAllowedLocalURL: [escape URLByAppendingPathComponent:@"secret.bundle"]]); XCTAssertNil([resolver resolvedURLForString:@"../secret.bundle"]); - XCTAssertNil([resolver resolvedURLForString:@"/static/../secret.bundle"]); + XCTAssertNil( + [resolver resolvedURLForString:@"/host-native/../secret.bundle"]); [files removeItemAtURL:parent error:nil]; } diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift index 06b89be0e06..cf11d15ba9e 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift @@ -59,6 +59,12 @@ final class OrbitControlUITests: XCTestCase { let failure = error.exists ? error.label : "No federation error was rendered." XCTAssertTrue(isReady, failure) + let metadata = app.descendants(matching: .any) + .matching(identifier: "activity-metadata") + .firstMatch + XCTAssertTrue(metadata.waitForExistence(timeout: 30)) + XCTAssertEqual(metadata.label, "Nested federated module ready") + attachScreenshot(named: "Orbit Control federation loaded") } @@ -80,6 +86,12 @@ final class OrbitControlUITests: XCTestCase { XCTAssertTrue(component.waitForExistence(timeout: 30), "Missing \(label)") } + let metadata = app.descendants(matching: .any) + .matching(identifier: "activity-metadata") + .firstMatch + XCTAssertTrue(metadata.waitForExistence(timeout: 30)) + XCTAssertEqual(metadata.label, "Nested federated module ready") + let count = app.descendants(matching: .any) .matching(identifier: "shared-card-count") .firstMatch diff --git a/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs b/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs index ccc0c12aa58..600a95d4a1e 100644 --- a/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs @@ -21,6 +21,7 @@ export default defineConfig({ lynx: {}, }, output: { + assetPrefix: '/catalog-native/', cleanDistPath: false, distPath: { root: resolveOutputRoot('catalog-native'), diff --git a/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs b/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs index d090a6f562a..ee42e79225e 100644 --- a/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs @@ -14,6 +14,7 @@ export default defineConfig({ web: {}, }, output: { + assetPrefix: 'auto', cleanDistPath: false, distPath: { root: resolveOutputRoot('catalog-web'), diff --git a/apps/lynx-module-federation-demo/lynx.config.mjs b/apps/lynx-module-federation-demo/lynx.config.mjs index 2dac284b63f..9297abb2202 100644 --- a/apps/lynx-module-federation-demo/lynx.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.config.mjs @@ -11,6 +11,7 @@ import { const nativeRemoteOrigin = process.env.LYNX_REMOTE_ORIGIN?.replace(/\/+$/, '') ?? 'http://127.0.0.1:3000'; +const nativeHostOrigin = process.env.LYNX_HOST_ORIGIN?.replace(/\/+$/, ''); const devHost = process.env.LYNX_DEV_HOST ?? '127.0.0.1'; const devPort = Number(process.env.LYNX_DEV_PORT ?? 3000); const nativeManifestUrl = @@ -49,6 +50,9 @@ export default defineConfig({ lynx: {}, }, output: { + assetPrefix: nativeHostOrigin + ? `${nativeHostOrigin}/host-native/` + : '/host-native/', cleanDistPath: false, distPath: { root: resolveOutputRoot('host-native'), diff --git a/apps/lynx-module-federation-demo/lynx.web.config.mjs b/apps/lynx-module-federation-demo/lynx.web.config.mjs index 792b6ebd89e..ba8fab01097 100644 --- a/apps/lynx-module-federation-demo/lynx.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.web.config.mjs @@ -24,6 +24,7 @@ export default defineConfig({ web: {}, }, output: { + assetPrefix: 'auto', cleanDistPath: false, distPath: { root: resolveOutputRoot('host-web'), diff --git a/apps/lynx-module-federation-demo/package.json b/apps/lynx-module-federation-demo/package.json index fbe53c07c6a..81938f6e223 100644 --- a/apps/lynx-module-federation-demo/package.json +++ b/apps/lynx-module-federation-demo/package.json @@ -13,15 +13,19 @@ "build:remote:web": "node rspack-canary-rspeedy.mjs build -c lynx.remote.web.config.mjs", "clean:dist": "node --eval \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"", "build:native": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:catalog:native && pnpm run build:remote:native && pnpm run build:host:native", + "build:native:ci": "pnpm run clean:dist && pnpm run build:catalog:native && pnpm run build:remote:native && pnpm run build:host:native", "build:web": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:catalog:web && pnpm run build:remote:web && pnpm run build:host:web", + "build:web:ci": "pnpm run clean:dist && pnpm run build:catalog:web && pnpm run build:remote:web && pnpm run build:host:web", "build": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:catalog:native && pnpm run build:catalog:web && pnpm run build:remote:native && pnpm run build:remote:web && pnpm run build:host:native && pnpm run build:host:web", "dev": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:native && node rspack-canary-rspeedy.mjs dev -c lynx.config.mjs", "dev:catalog:native": "pnpm run clean:dist && pnpm run build:adapter && node rspack-canary-rspeedy.mjs dev -c lynx.catalog.native.config.mjs", "dev:catalog:web": "pnpm run clean:dist && pnpm run build:adapter && node rspack-canary-rspeedy.mjs dev -c lynx.catalog.web.config.mjs", "dev:web": "pnpm run clean:dist && pnpm run build:adapter && pnpm run build:remote:web && node rspack-canary-rspeedy.mjs dev -c lynx.web.config.mjs", "e2e:native": "pnpm run build:native && pnpm run test:native-artifacts && pnpm run test:native-dev-server", + "e2e:native:ci": "pnpm run build:native:ci && pnpm run test:native-artifacts && pnpm run test:native-dev-server", "e2e:ios": "node test/ios/run.mjs", "e2e:web": "pnpm run build:web && node test/real-web/run.mjs", + "e2e:web:ci": "pnpm run build:web:ci && node test/real-web/run.mjs", "ios:open": "open ios/OrbitControl.xcworkspace", "ios:pods": "cd ios && bundle install && bundle exec pod install --deployment --repo-update", "ios:device": "node scripts/dev-ios-device.mjs", @@ -38,17 +42,17 @@ "test:native-dev-server": "node test/native-dev-server.mjs" }, "dependencies": { - "@lynx-js/react": "0.122.1", + "@lynx-js/react": "0.123.0", "@module-federation/runtime": "workspace:*" }, "devDependencies": { - "@lynx-js/lynx-bundle-rslib-config": "0.5.1", - "@lynx-js/qrcode-rsbuild-plugin": "0.5.0", - "@lynx-js/react-rsbuild-plugin": "0.17.2", - "@lynx-js/rspeedy": "0.15.0", + "@lynx-js/lynx-bundle-rslib-config": "0.6.0", + "@lynx-js/qrcode-rsbuild-plugin": "0.6.0", + "@lynx-js/react-rsbuild-plugin": "0.18.0", + "@lynx-js/rspeedy": "0.16.0", "@lynx-js/types": "4.0.0", - "@lynx-js/web-core": "0.22.1", - "@lynx-js/web-elements": "0.12.5", + "@lynx-js/web-core": "https://pkg.pr.new/@lynx-js/web-core@4cc0608b488a9bf35093936fd9d0e6589a1c161c", + "@lynx-js/web-elements": "0.12.6", "@module-federation/lynx": "workspace:*", "@module-federation/runtime-tools": "workspace:*", "@playwright/test": "1.57.0", diff --git a/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs b/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs index 73a7e5a72ec..90d041171ab 100644 --- a/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs +++ b/apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs @@ -12,24 +12,26 @@ const source = path.resolve( process.env.LYNX_IOS_HOST_BUNDLE ?? 'dist/host-native/main.lynx.bundle', ); const destination = path.join(appRoot, 'ios/Resources/main.lynx.bundle'); -const sourceStatic = path.join(path.dirname(source), 'static'); -const destinationStatic = path.join(appRoot, 'ios/Resources/static'); +const sourceLazyBundles = path.join(path.dirname(source), 'lazy-bundle'); +const destinationHost = path.join(appRoot, 'ios/Resources/host-native'); +const destinationLazyBundles = path.join(destinationHost, 'lazy-bundle'); -const [sourceStat, sourceStaticStat] = await Promise.all([ +const [sourceStat, sourceLazyBundlesStat] = await Promise.all([ stat(source), - stat(sourceStatic), + stat(sourceLazyBundles), ]); assert.ok(sourceStat.size > 0, `Native host bundle is empty: ${source}`); assert.ok( - sourceStaticStat.isDirectory(), - `Native host startup assets are missing: ${sourceStatic}`, + sourceLazyBundlesStat.isDirectory(), + `Native host lazy bundles are missing: ${sourceLazyBundles}`, ); await mkdir(path.dirname(destination), { recursive: true }); -await rm(destinationStatic, { force: true, recursive: true }); +await rm(destinationHost, { force: true, recursive: true }); +await mkdir(destinationHost, { recursive: true }); await Promise.all([ copyFile(source, destination), - cp(sourceStatic, destinationStatic, { recursive: true }), + cp(sourceLazyBundles, destinationLazyBundles, { recursive: true }), ]); process.stdout.write( - `Copied ${source} and ${sourceStatic} to iOS Resources.\n`, + `Copied ${source} and ${sourceLazyBundles} to iOS Resources.\n`, ); diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index 4a3a2d6a9dc..761f03ca1c3 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -14,7 +14,7 @@ const NAVIGATION: Array<{ id: Screen; label: string }> = [ ]; const MODULES = [ - { name: 'Card', path: "import('catalog/Card')" }, + { name: 'Card', path: "import * as card from 'catalog/Card'" }, { name: 'Details', path: "import('catalog/Details')" }, { name: 'ActivityFeed', path: "loadRemote('catalog/ActivityFeed')" }, ]; @@ -270,7 +270,7 @@ export function App() { {CardComponent ? ( ) : ( diff --git a/apps/lynx-module-federation-demo/src/app/federation.ts b/apps/lynx-module-federation-demo/src/app/federation.ts index 2f53fefc9d5..6c63eaea59e 100644 --- a/apps/lynx-module-federation-demo/src/app/federation.ts +++ b/apps/lynx-module-federation-demo/src/app/federation.ts @@ -31,8 +31,9 @@ export interface ActivityFeedRemoteModule extends SharedObserverExports { } export async function loadCompiledImportRemotes() { - const [card, details] = await Promise.all([ - import('catalog/Card'), + 'background-only'; + const [{ card }, details] = await Promise.all([ + import('./staticCard'), import('catalog/Details'), ]); diff --git a/apps/lynx-module-federation-demo/src/app/staticCard.ts b/apps/lynx-module-federation-demo/src/app/staticCard.ts new file mode 100644 index 00000000000..44aba54d297 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/app/staticCard.ts @@ -0,0 +1,4 @@ +import 'background-only'; +import * as card from 'catalog/Card'; + +export { card }; diff --git a/apps/lynx-module-federation-demo/src/remote-ui/ActivityFeed.tsx b/apps/lynx-module-federation-demo/src/remote-ui/ActivityFeed.tsx index fb5b2a485e4..d51faae6d8a 100644 --- a/apps/lynx-module-federation-demo/src/remote-ui/ActivityFeed.tsx +++ b/apps/lynx-module-federation-demo/src/remote-ui/ActivityFeed.tsx @@ -1,4 +1,4 @@ -import { useCallback } from '@lynx-js/react'; +import { useCallback, useEffect, useState } from '@lynx-js/react'; import { instanceId, snapshot, token } from 'orbit-shared-state'; import type { ActivityFeedProps, ActivityFilter } from './contracts'; @@ -10,12 +10,20 @@ const FILTERS: Array<{ id: ActivityFilter; label: string }> = [ { id: 'state', label: 'Shared state' }, ]; +const loadActivityMetadata = () => { + 'background-only'; + return import( + /* webpackChunkName: 'activity-metadata' */ './activityMetadata' + ); +}; + export function ActivityFeed({ entries, filter, onFilterChange, }: ActivityFeedProps) { const sharedState = snapshot(); + const [metadata, setMetadata] = useState('Loading nested module'); const selectFilter = useCallback( (nextFilter: ActivityFilter) => { 'background-only'; @@ -23,6 +31,21 @@ export function ActivityFeed({ }, [onFilterChange], ); + useEffect(() => { + 'background-only'; + let mounted = true; + void loadActivityMetadata().then( + (module) => { + if (mounted) setMetadata(module.activityMetadata); + }, + () => { + if (mounted) setMetadata('Nested federated module failed'); + }, + ); + return () => { + mounted = false; + }; + }, []); const visibleEntries = filter === 'all' @@ -36,6 +59,15 @@ export function ActivityFeed({ SHARED COUNT {sharedState.count} + + {metadata} + {FILTERS.map((item) => ( diff --git a/apps/lynx-module-federation-demo/src/remote-ui/activityMetadata.ts b/apps/lynx-module-federation-demo/src/remote-ui/activityMetadata.ts new file mode 100644 index 00000000000..a4e154d8bd7 --- /dev/null +++ b/apps/lynx-module-federation-demo/src/remote-ui/activityMetadata.ts @@ -0,0 +1,3 @@ +import 'background-only'; + +export const activityMetadata = 'Nested federated module ready'; diff --git a/apps/lynx-module-federation-demo/test/ci-policy.mjs b/apps/lynx-module-federation-demo/test/ci-policy.mjs index ea4fc3ed59a..894939b81c7 100644 --- a/apps/lynx-module-federation-demo/test/ci-policy.mjs +++ b/apps/lynx-module-federation-demo/test/ci-policy.mjs @@ -10,12 +10,14 @@ const appRoot = path.resolve( const repoRoot = path.resolve(appRoot, '../..'); const readRepo = (file) => readFile(path.join(repoRoot, file), 'utf8'); -const [metroWorkflow, lynxWorkflow, readme, packageSource] = await Promise.all([ - readRepo('.github/workflows/e2e-metro.yml'), - readRepo('.github/workflows/e2e-lynx.yml'), - readFile(path.join(appRoot, 'README.md'), 'utf8'), - readFile(path.join(appRoot, 'package.json'), 'utf8'), -]); +const [metroWorkflow, lynxWorkflow, localCi, readme, packageSource] = + await Promise.all([ + readRepo('.github/workflows/e2e-metro.yml'), + readRepo('.github/workflows/e2e-lynx.yml'), + readRepo('tools/scripts/ci-local.mjs'), + readFile(path.join(appRoot, 'README.md'), 'utf8'), + readFile(path.join(appRoot, 'package.json'), 'utf8'), + ]); assert.match(metroWorkflow, /ANDROID_EMULATOR_PARTITION_SIZE_MB: 1024/); assert.match( @@ -29,6 +31,10 @@ assert.match( assert.doesNotMatch(metroWorkflow, /ANDROID_EMULATOR_DISK_SPACE/); assert.doesNotMatch(metroWorkflow, /-partition-size\s+\d+/); assert.match(lynxWorkflow, /run test:ci-policy/); +for (const script of ['e2e:native:ci', 'e2e:web:ci']) { + assert.match(lynxWorkflow, new RegExp(`run ${script}`)); + assert.match(localCi, new RegExp(`'${script}'`)); +} assert.match(readme, /rspack-canary-rspeedy\.mjs/); assert.match(readme, /@rspack-canary\/core/); diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index f14d3ea9ea6..57995126c48 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -43,6 +43,7 @@ const [ syncScript, iosRunner, scheme, + urlResolver, ] = await Promise.all([ read('ios/Podfile'), read('ios/Podfile.lock'), @@ -60,6 +61,7 @@ const [ read( 'ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme', ), + read('ios/OrbitControl/OrbitResourceURLResolver.m'), ]); for (const pod of ['Lynx', 'LynxService', 'XElement']) { @@ -89,7 +91,7 @@ for (const file of [ assert.match(project, new RegExp(`${file.replace('.', '\\.')} in Sources`)); } assert.match(scheme, /BlueprintName="OrbitControlTests"/); -assert.match(project, /static in Resources/); +assert.match(project, /host-native in Resources/); assert.match(uiTest, /matching\(identifier: "federation-ready"\)/); assert.match(appSource, /accessibilityId: 'federation-ready'/); assert.match( @@ -105,8 +107,10 @@ assert.match(packageJson, /"ios:device": "node scripts\/dev-ios-device\.mjs"/); assert.match(deviceServer, /LYNX_DEV_HOST: '0\.0\.0\.0'/); assert.match(deviceServer, /not a loopback or unspecified address/); assert.match(syncScript, /dist\/host-native\/main\.lynx\.bundle/); -assert.match(syncScript, /sourceStatic/); -assert.match(syncScript, /cp\(sourceStatic, destinationStatic/); +assert.match(syncScript, /sourceLazyBundles/); +assert.match(syncScript, /cp\(sourceLazyBundles, destinationLazyBundles/); +assert.match(urlResolver, /hasPrefix:@"\/host-native\/"/); +assert.match(urlResolver, /hasPrefix:@"\/catalog-native\/"/); assert.equal(iosRunner.match(/await run\(\s*'xcodebuild'/g)?.length, 1); assert.match(iosRunner, /'-configuration',\s*'Release'/); assert.match(iosRunner, /build\/OrbitControl-Release\.xcresult/); diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index 155b4c4a030..e5f68cbcb82 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -32,10 +32,21 @@ await rm(resultBundlePath, { force: true, recursive: true }); await stat(path.join(distRoot, 'host-native/main.lynx.bundle')); await stat(path.join(distRoot, 'catalog-native/main.lynx.bundle')); await stat(path.join(distRoot, 'remote-native/mf-manifest.json')); -const startupFiles = ( - await readdir(path.join(distRoot, 'host-native/static/js/async')) -).filter((file) => file.endsWith('.js')); -assert.ok(startupFiles.length > 0); +const hostLazyFiles = ( + await readdir(path.join(distRoot, 'host-native/lazy-bundle'), { + recursive: true, + }) +) + .filter((file) => file.endsWith('.bundle')) + .map((file) => file.split(path.sep).join('/')); +assert.equal(hostLazyFiles.length, 2); +const catalogLazyFiles = ( + await readdir(path.join(distRoot, 'catalog-native/lazy-bundle')) +) + .filter((file) => file.endsWith('.bundle')) + .map((file) => `/catalog-native/lazy-bundle/${file}`); +assert.equal(catalogLazyFiles.length, 1); +assert.ok(catalogLazyFiles[0].includes('activity-metadata')); const manifest = JSON.parse( await readFile(path.join(distRoot, 'remote-native/mf-manifest.json'), 'utf8'), ); @@ -88,9 +99,6 @@ assert.ok( const artifactServer = await createArtifactServer({ port: serverPort, root: distRoot, - routes: { - '/static/': path.join(distRoot, 'host-native/static'), - }, }); const { requests } = artifactServer; const requestedPaths = () => @@ -158,14 +166,18 @@ try { const expected = [ '/host-native/main.lynx.bundle', '/catalog-native/main.lynx.bundle', - ...startupFiles.map((file) => `/static/js/async/${file}`), + ...catalogLazyFiles, + ...hostLazyFiles.map((file) => `/host-native/lazy-bundle/${file}`), '/remote-native/mf-manifest.json', new URL(`${remoteEntry.path}${remoteEntry.name}`, serverURL).pathname, ]; - const lazyFiles = (await readdir(path.join(distRoot, 'remote-native/async'))) + const lazyFiles = ( + await readdir(path.join(distRoot, 'remote-native/lazy-bundle')) + ) .filter((file) => file.endsWith('.bundle')) - .map((file) => `/remote-native/async/${file}`); - assert.equal(lazyFiles.length, 3); + .map((file) => `/remote-native/lazy-bundle/${file}`); + assert.equal(lazyFiles.length, 4); + assert.ok(lazyFiles.some((file) => file.includes('activity-metadata'))); expected.push(...lazyFiles); for (const pathname of expected) { assert.ok( @@ -174,7 +186,7 @@ try { ); } process.stdout.write( - `Native iOS app launched Orbit and standalone Catalog, then loaded async startup, the manifest, container, and ${lazyFiles.length} lazy bundles.\n`, + `Native iOS app launched Orbit and standalone Catalog, then loaded ${hostLazyFiles.length} host lazy bundles, the manifest, container, and ${lazyFiles.length} remote lazy bundles.\n`, ); } finally { await writeFile(requestLogPath, JSON.stringify(requests, null, 2)); diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index 9847b439979..bbf2d58a4aa 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -13,6 +13,10 @@ const requireFromAdapter = createRequire( const nativeRemoteOrigin = process.env.LYNX_REMOTE_ORIGIN?.replace(/\/+$/, '') ?? 'http://127.0.0.1:3000'; +const nativeHostOrigin = process.env.LYNX_HOST_ORIGIN?.replace(/\/+$/, ''); +const nativeHostAssetPrefix = nativeHostOrigin + ? `${nativeHostOrigin}/host-native/` + : '/host-native/'; const { decode_napi: decodeTemplate } = requireFromAdapter('@lynx-js/tasm'); const hostBundlePath = path.join(appRoot, 'dist/host-native/main.lynx.bundle'); const standaloneBundlePath = path.join( @@ -37,7 +41,8 @@ const [ statsSource, remoteFiles, lazyFiles, - startupFiles, + catalogLazyFiles, + hostLazyFiles, ] = await Promise.all([ stat(hostBundlePath), stat(standaloneBundlePath), @@ -45,8 +50,11 @@ const [ readFile(remoteManifestPath, 'utf8'), readFile(remoteStatsPath, 'utf8'), readdir(path.join(appRoot, 'dist/remote-native')), - readdir(path.join(appRoot, 'dist/remote-native/async')), - readdir(path.join(appRoot, 'dist/host-native/static/js/async')), + readdir(path.join(appRoot, 'dist/remote-native/lazy-bundle')), + readdir(path.join(appRoot, 'dist/catalog-native/lazy-bundle')), + readdir(path.join(appRoot, 'dist/host-native/lazy-bundle'), { + recursive: true, + }), ]); assert.ok(hostBundle.isFile() && hostBundle.size > 1_000, hostBundlePath); @@ -57,9 +65,20 @@ assert.ok( assert.ok(remoteBundle.isFile() && remoteBundle.size > 1_000, remoteBundlePath); assert.ok(!remoteFiles.includes('bootstrap.lynx.bundle')); assert.ok(!remoteFiles.includes('main.lynx.bundle')); -assert.equal(lazyFiles.filter((name) => name.endsWith('.bundle')).length, 3); -const startupScripts = startupFiles.filter((name) => name.endsWith('.js')); -assert.ok(startupScripts.length > 0); +assert.equal(catalogLazyFiles.length, 1); +assert.ok(catalogLazyFiles[0].includes('activity-metadata')); +const remoteLazyBundles = lazyFiles.filter((name) => name.endsWith('.bundle')); +assert.equal(remoteLazyBundles.length, 4); +const nestedLazyBundle = remoteLazyBundles.find((name) => + name.includes('activity-metadata'), +); +assert.ok(nestedLazyBundle, 'nested activity lazy bundle is missing'); +const hostLazyBundles = hostLazyFiles + .filter((name) => name.endsWith('.bundle')) + .map((name) => name.split(path.sep).join('/')); +assert.equal(hostLazyBundles.length, 2); +assert.ok(hostLazyBundles.some((name) => name.includes('staticCard.ts.'))); +assert.ok(hostLazyBundles.some((name) => name.includes('federationState.ts.'))); const [hostBundleSource, standaloneSource, remoteBundleSource] = await Promise.all([ @@ -67,13 +86,27 @@ const [hostBundleSource, standaloneSource, remoteBundleSource] = readFile(standaloneBundlePath), readFile(remoteBundlePath), ]); -decodeTemplate(hostBundleSource); +const hostTemplate = decodeTemplate(hostBundleSource); const standaloneTemplate = decodeTemplate(standaloneSource); const remoteTemplate = decodeTemplate(remoteBundleSource); assert.equal(standaloneTemplate['app-type'], 'card'); assert.equal(remoteTemplate['app-type'], 'DynamicComponent'); assert.equal(remoteTemplate['engine-version'], '3.7'); assert.deepEqual(Object.keys(remoteTemplate['custom-sections']), ['catalog']); +const hostBackgroundSource = hostTemplate['background-thread-script'] + .map(({ content }) => content) + .join('\n'); +assert.ok(hostBackgroundSource.includes('mfAsyncStartup')); +assert.ok(hostBackgroundSource.includes('lynx_aci')); +assert.ok(hostBackgroundSource.includes(nativeHostAssetPrefix)); + +for (const name of hostLazyBundles) { + const lazyTemplate = decodeTemplate( + await readFile(path.join(appRoot, 'dist/host-native/lazy-bundle', name)), + ); + assert.equal(lazyTemplate['app-type'], 'DynamicComponent', name); + assert.ok(lazyTemplate['background-thread-script']?.length > 0, name); +} const manifest = JSON.parse(manifestSource); const stats = JSON.parse(statsSource); @@ -107,7 +140,11 @@ for (const exposed of manifest.exposes) { name.startsWith(`catalog__background_${exposed.name}.`), ); assert.ok(lazyName, `${exposed.name} lazy bundle is missing`); - const lazyPath = path.join(appRoot, 'dist/remote-native/async', lazyName); + const lazyPath = path.join( + appRoot, + 'dist/remote-native/lazy-bundle', + lazyName, + ); const lazyStat = await stat(lazyPath); assert.ok(lazyStat.isFile() && lazyStat.size > 1_000, lazyPath); const lazyTemplate = decodeTemplate(await readFile(lazyPath)); @@ -126,6 +163,20 @@ for (const exposed of manifest.exposes) { ); } +const nestedTemplate = decodeTemplate( + await readFile( + path.join(appRoot, 'dist/remote-native/lazy-bundle', nestedLazyBundle), + ), +); +assert.equal(nestedTemplate['app-type'], 'DynamicComponent'); +assert.ok( + nestedTemplate['background-thread-script'] + ?.map(({ content }) => content) + .join('\n') + .includes('Nested federated module ready'), + `${nestedLazyBundle} does not contain the nested module`, +); + assert.ok(Array.isArray(manifest.shared)); assert.deepEqual( manifest.shared.map(({ name }) => name), @@ -155,14 +206,15 @@ try { await Promise.all([ server.waitFor('/host-native/main.lynx.bundle'), server.waitFor('/catalog-native/main.lynx.bundle'), + server.waitFor(`/catalog-native/lazy-bundle/${catalogLazyFiles[0]}`), server.waitFor('/remote-native/mf-manifest.json'), server.waitFor('/remote-native/catalog.native.lynx.bundle'), - ...startupScripts.map((name) => - server.waitFor(`/host-native/static/js/async/${name}`), + ...hostLazyBundles.map((name) => + server.waitFor(`/host-native/lazy-bundle/${name}`), ), ...lazyFiles .filter((name) => name.endsWith('.bundle')) - .map((name) => server.waitFor(`/remote-native/async/${name}`)), + .map((name) => server.waitFor(`/remote-native/lazy-bundle/${name}`)), ]); } finally { await server.close(); diff --git a/apps/lynx-module-federation-demo/test/native-dev-server.mjs b/apps/lynx-module-federation-demo/test/native-dev-server.mjs index 77ea51376ba..2b6209ceb56 100644 --- a/apps/lynx-module-federation-demo/test/native-dev-server.mjs +++ b/apps/lynx-module-federation-demo/test/native-dev-server.mjs @@ -83,12 +83,30 @@ try { await fetchReady(`${origin}/main.lynx.bundle`); await fetchReady(`${origin}/catalog-native/main.lynx.bundle`); - const startupFiles = ( - await readdir(path.join(outputRoot, 'host-native/static/js/async')) - ).filter((name) => name.endsWith('.js')); - assert.ok(startupFiles.length > 0); + const catalogLazyBundles = await readdir( + path.join(outputRoot, 'catalog-native/lazy-bundle'), + ); + assert.equal(catalogLazyBundles.length, 1); + assert.ok(catalogLazyBundles[0].includes('activity-metadata')); + await fetchReady( + `${origin}/catalog-native/lazy-bundle/${catalogLazyBundles[0]}`, + ); + const hostLazyBundles = ( + await readdir(path.join(outputRoot, 'host-native/lazy-bundle'), { + recursive: true, + }) + ) + .filter((name) => name.endsWith('.bundle')) + .map((name) => name.split(path.sep).join('/')); + assert.ok(hostLazyBundles.length >= 2, JSON.stringify(hostLazyBundles)); + assert.ok(hostLazyBundles.some((name) => name.includes('staticCard.ts.'))); + assert.ok( + hostLazyBundles.some((name) => name.includes('federationState.ts.')), + ); await Promise.all( - startupFiles.map((name) => fetchReady(`${origin}/static/js/async/${name}`)), + hostLazyBundles.map((name) => + fetchReady(`${origin}/host-native/lazy-bundle/${name}`), + ), ); const manifestResponse = await fetchReady( `${origin}/remote-native/mf-manifest.json`, @@ -104,16 +122,19 @@ try { new URL(`${remoteEntry.path}${remoteEntry.name}`, remoteBase), ); - const lazyFiles = await readdir(path.join(outputRoot, 'remote-native/async')); + const lazyFiles = await readdir( + path.join(outputRoot, 'remote-native/lazy-bundle'), + ); const lazyBundles = lazyFiles.filter((name) => name.endsWith('.bundle')); - assert.equal(lazyBundles.length, 3); + assert.equal(lazyBundles.length, 4); + assert.ok(lazyBundles.some((name) => name.includes('activity-metadata'))); await Promise.all( lazyBundles.map((name) => - fetchReady(`${origin}/remote-native/async/${name}`), + fetchReady(`${origin}/remote-native/lazy-bundle/${name}`), ), ); process.stdout.write( - `Native Rspeedy dev server served host, async startup, standalone Catalog, manifest, container, and ${lazyBundles.length} lazy bundles.\n`, + `Native Rspeedy dev server served host, ${hostLazyBundles.length} host lazy bundles, standalone Catalog with its nested bundle, manifest, container, and ${lazyBundles.length} remote lazy bundles.\n`, ); } finally { if (child) { diff --git a/apps/lynx-module-federation-demo/test/real-web/run.mjs b/apps/lynx-module-federation-demo/test/real-web/run.mjs index c194a961c20..0814fdefb2b 100644 --- a/apps/lynx-module-federation-demo/test/real-web/run.mjs +++ b/apps/lynx-module-federation-demo/test/real-web/run.mjs @@ -43,7 +43,6 @@ const remoteBundlePath = fromAppRoot( const hostOutputRoot = path.dirname(hostBundlePath); const remoteOutputRoot = path.dirname(remoteManifestPath); const standaloneOutputRoot = path.dirname(standaloneBundlePath); -const hostStartupRoot = path.join(hostOutputRoot, 'static/js/async'); const screenshotPath = fromAppRoot( process.env.LYNX_WEB_E2E_SCREENSHOT, 'test/real-web/artifacts/failure.png', @@ -72,7 +71,6 @@ const artifactServer = await createArtifactServer({ '/node_modules/@lynx-js/web-core/': webCoreRoot, '/node_modules/@lynx-js/web-elements/': webElementsRoot, '/remote-web/': remoteOutputRoot, - '/static/': path.join(hostOutputRoot, 'static'), '/test/real-web/': testRoot, }, }); @@ -133,9 +131,22 @@ const tap = async (locator) => { const pageErrors = []; const consoleErrors = []; +const describePageError = (error) => { + const details = { + name: error?.name, + message: error?.message, + stack: error?.stack, + cause: error?.cause, + }; + return JSON.stringify(details, (_key, value) => + value instanceof Error + ? { name: value.name, message: value.message, stack: value.stack } + : value, + ); +}; const observePage = (candidate, label) => { candidate.on('pageerror', (error) => - pageErrors.push(`${label}: ${error.stack ?? error.message}`), + pageErrors.push(`${label}: ${describePageError(error)}`), ); candidate.on('console', (message) => { if (message.type() === 'error') { @@ -176,6 +187,16 @@ try { await app.waitFor({ state: 'visible', timeout: readinessTimeout }); assert.equal(await app.count(), 1, 'the app must render exactly once'); + const initialRemoteLazyBundleRequests = requestedPaths().filter( + (value) => + value.includes('/remote-web/lazy-bundle/') && value.endsWith('.bundle'), + ); + assert.deepEqual( + initialRemoteLazyBundleRequests, + [], + `remote UI loaded before Lynx initialized its DynamicComponent runtime: ${JSON.stringify(initialRemoteLazyBundleRequests)}`, + ); + await tap(activePage.getByTestId('load-remotes')); const ready = /ready|loaded|passed|success/i; for (const testId of ['import-status', 'runtime-status']) { @@ -211,6 +232,11 @@ try { 'rgb(23, 33, 43)', 'Details must retain its dark remote style', ); + await poll( + () => text(activePage.getByTestId('activity-metadata')), + (value) => value?.trim() === 'Nested federated module ready', + 'nested federated module render', + ); assert.equal( await app.evaluate((element) => getComputedStyle(element).backgroundColor), 'rgb(244, 247, 248)', @@ -285,29 +311,36 @@ try { `Remote bundle was not requested: ${JSON.stringify(requests)}`, ); const lazyBundleRequests = requestedPaths().filter( - (value) => value.includes('/async/') && value.endsWith('.bundle'), + (value) => + value.includes('/remote-web/lazy-bundle/') && value.endsWith('.bundle'), ); assert.equal( lazyBundleRequests.length, - 3, - `each lazy exposure should be fetched once: ${JSON.stringify(lazyBundleRequests)}`, + 4, + `each lazy exposure and its nested chunk should be fetched once: ${JSON.stringify(lazyBundleRequests)}`, ); assert.equal( new Set(lazyBundleRequests).size, - 3, - `split mode must fetch one lazy bundle per expose: ${JSON.stringify(lazyBundleRequests)}`, - ); - const hostStartupFiles = (await readdir(hostStartupRoot)).filter((file) => - file.endsWith('.js'), + 4, + `split mode must fetch each exposure and nested chunk once: ${JSON.stringify(lazyBundleRequests)}`, ); assert.ok( - hostStartupFiles.length > 0, - 'non-eager sharing did not emit async host startup chunks', + lazyBundleRequests.some((value) => value.includes('activity-metadata')), + `nested activity bundle was not requested: ${JSON.stringify(lazyBundleRequests)}`, + ); + const hostLazyBundleRequests = requestedPaths().filter( + (value) => + value.includes('/dist/host-web/lazy-bundle/') && + value.endsWith('.bundle'), ); - for (const file of hostStartupFiles) { - assert.ok( - requestedPaths().includes(`/static/js/async/${file}`), - `async host startup chunk was not requested: ${file}`, + for (const moduleName of ['federationState', 'staticCard']) { + const moduleRequests = hostLazyBundleRequests.filter((value) => + value.includes(moduleName), + ); + assert.equal( + moduleRequests.length, + 1, + `${moduleName} lazy bundle must be requested exactly once: ${JSON.stringify(hostLazyBundleRequests)}`, ); } @@ -346,6 +379,11 @@ try { .getByTestId(testId) .waitFor({ state: 'visible', timeout: readinessTimeout }); } + await poll( + () => text(catalogPage.getByTestId('activity-metadata')), + (value) => value?.trim() === 'Nested federated module ready', + 'standalone nested module render', + ); const catalogCounts = [ catalogPage.getByTestId('catalog-local-count'), @@ -379,8 +417,7 @@ try { !standaloneRequests.some( (value) => value.includes('mf-manifest.json') || - value.includes('/dist/remote-web/async/') || - value.includes('/remote-web/async/') || + value.includes('/remote-web/lazy-bundle/') || value.endsWith(`/${path.basename(remoteBundlePath)}`), ), `standalone direct imports unexpectedly used federation transport: ${JSON.stringify(standaloneRequests)}`, diff --git a/package.json b/package.json index fdf78f5249c..8888d5f1efd 100644 --- a/package.json +++ b/package.json @@ -143,6 +143,7 @@ }, "overrides": { "@changesets/assemble-release-plan": "workspace:*", + "@lynx-js/template-webpack-plugin": "https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c", "ajv": "8.18.0", "eslint>ajv": "6.14.0", "@eslint/eslintrc>ajv": "6.14.0", diff --git a/packages/lynx/README.md b/packages/lynx/README.md index 046b47d2d06..a2f34aefd6a 100644 --- a/packages/lynx/README.md +++ b/packages/lynx/README.md @@ -10,6 +10,11 @@ repository is `2.1.5-canary-54a0d8f3-20260715194831`. The bundle transport uses `lynx.loadScript`, available in Lynx SDK 3.7 and later; `remoteBundle.engineVersion` therefore defaults to `3.7`. +Split federation also requires `@lynx-js/web-core >= 0.22.3` and +`@lynx-js/template-webpack-plugin >= 0.13.1`. Those releases provide the public +lazy-bundle loader, bundle-relative Web execution URLs, valid empty +main-thread chunks, and assetless remote-chunk filtering used by this adapter. + ## Host Register the adapter after the Lynx DSL plugin so it can use the official @@ -155,6 +160,7 @@ flowchart LR M --> C["container.lynx.bundle"] C --> R["Module Federation container"] R --> A["ActivityFeed lazy .bundle"] + A --> N["nested lazy .bundle"] R --> D["Details lazy .bundle"] R --> S["host-provided shared modules"] ``` diff --git a/packages/lynx/package.json b/packages/lynx/package.json index e2ac06f5aeb..910da223177 100644 --- a/packages/lynx/package.json +++ b/packages/lynx/package.json @@ -66,10 +66,11 @@ "@module-federation/sdk": "workspace:*" }, "peerDependencies": { - "@lynx-js/cache-events-webpack-plugin": "^0.1.0", + "@lynx-js/cache-events-webpack-plugin": "^0.1.0 || ^0.2.0", "@lynx-js/css-serializer": "^0.1.6", "@lynx-js/tasm": "^0.0.39", - "@lynx-js/web-core": "^0.22.1", + "@lynx-js/template-webpack-plugin": "^0.13.1", + "@lynx-js/web-core": "^0.22.3", "@rsbuild/core": "^2.0.0", "@rspack/core": ">=2.1.5-canary-54a0d8f3-20260715194831 <3" }, @@ -83,12 +84,15 @@ "@lynx-js/tasm": { "optional": true }, + "@lynx-js/template-webpack-plugin": { + "optional": true + }, "@lynx-js/web-core": { "optional": true } }, "devDependencies": { - "@lynx-js/cache-events-webpack-plugin": "0.1.0", + "@lynx-js/cache-events-webpack-plugin": "0.2.0", "@lynx-js/css-serializer": "0.1.6", "@lynx-js/chunk-loading-webpack-plugin": "0.4.0", "@lynx-js/tasm": "0.0.39", diff --git a/packages/lynx/src/chunkLoadingMatcher.test.ts b/packages/lynx/src/chunkLoadingMatcher.test.ts index 5137c278200..f3f8458e6be 100644 --- a/packages/lynx/src/chunkLoadingMatcher.test.ts +++ b/packages/lynx/src/chunkLoadingMatcher.test.ts @@ -366,20 +366,20 @@ describe('Lynx chunk-loading matcher', () => { finalEncodeOptions: { sourceContent: { appType: 'DynamicComponent' }, }, - entryNames: [ - 'catalog__background_Card-react__background', - 'catalog__main-thread__Card-react__main-thread', + chunkGroups: [ + { name: 'catalog__background_Card-react__background' }, + { name: 'catalog__main-thread__Card-react__main-thread' }, ], outputName: 'async/catalog__background_Card.hash.bundle', }; expect(beforeEmit!(lazyArgs)).toBe(lazyArgs); beforeEmit!({ - entryNames: ['remote-react__background'], + chunkGroups: [{ name: 'remote-react__background' }], finalEncodeOptions: { sourceContent: { appType: 'card' } }, outputName: 'bootstrap.lynx.bundle', }); beforeEmit!({ - entryNames: ['nested-feature'], + chunkGroups: [{ name: 'nested-feature' }], finalEncodeOptions: { sourceContent: { appType: 'DynamicComponent' }, }, diff --git a/packages/lynx/src/chunkLoadingMatcher.ts b/packages/lynx/src/chunkLoadingMatcher.ts index 5dbd30bb961..362b9869b26 100644 --- a/packages/lynx/src/chunkLoadingMatcher.ts +++ b/packages/lynx/src/chunkLoadingMatcher.ts @@ -22,7 +22,8 @@ interface TemplateEncodeArgs { } interface TemplateEmitArgs { - entryNames: string[]; + chunkGroups?: Array<{ name?: string | null }>; + entryNames?: string[]; finalEncodeOptions: { sourceContent: { appType: string; @@ -218,11 +219,17 @@ export const createLynxChunkLoadingMatcherPlugin = ( } const isDynamicComponent = args.finalEncodeOptions.sourceContent.appType === 'DynamicComponent'; - const isRemoteOutput = args.entryNames.some((name) => + const templateChunkNames = [ + ...(args.entryNames ?? []), + ...(args.chunkGroups ?? []).flatMap(({ name }) => + typeof name === 'string' ? [name] : [], + ), + ]; + const isRemoteOutput = templateChunkNames.some((name) => chunkNames.has(name), ); const exposedKeys = new Set( - args.entryNames.flatMap((name) => { + templateChunkNames.flatMap((name) => { const exposedKey = options.exposeByExpectedLazyBundleChunk?.get( normalizeLazyBundleChunkName(name, options), ); diff --git a/packages/lynx/src/plugin.remoteBundle.test.ts b/packages/lynx/src/plugin.remoteBundle.test.ts index a69594050f9..2889c767fc6 100644 --- a/packages/lynx/src/plugin.remoteBundle.test.ts +++ b/packages/lynx/src/plugin.remoteBundle.test.ts @@ -180,12 +180,19 @@ describe('pluginLynxModuleFederation remote bundles', () => { } as any); const emitAsset = rs.fn(); const updateAsset = rs.fn(); + const nestedBackgroundChunk = { + name: 'nested-activity-metadata', + files: new Set(['nested-activity-metadata.js']), + layers: [LAYERS.BACKGROUND], + getAllAsyncChunks: () => new Set(), + }; const compilation = { chunks: [ { name: 'catalog', files: new Set(['catalog.js']), layers: [LAYERS.BACKGROUND, LAYERS.MAIN_THREAD], + getAllAsyncChunks: () => new Set(), }, { name: 'catalog__main-thread__Card', @@ -194,12 +201,15 @@ describe('pluginLynxModuleFederation remote bundles', () => { 'styles.css', ]), layers: [LAYERS.MAIN_THREAD], + getAllAsyncChunks: () => new Set(), }, { name: 'catalog__background_Card', files: new Set(['catalog__background_Card.js']), layers: [LAYERS.BACKGROUND], + getAllAsyncChunks: () => new Set([nestedBackgroundChunk]), }, + nestedBackgroundChunk, ], chunkGraph: { getChunkModulesIterable(chunk: { layers: string[] }) { @@ -218,6 +228,12 @@ describe('pluginLynxModuleFederation remote bundles', () => { info: { minimized: true }, }; } + if (name === 'nested-activity-metadata.js') { + return { + source: { source: () => 'exports.ids = ["metadata"];' }, + info: { minimized: true }, + }; + } return undefined; }, hooks: { @@ -248,6 +264,11 @@ describe('pluginLynxModuleFederation remote bundles', () => { expect.any(Object), { minimized: true }, ); + expect(updateAsset).toHaveBeenCalledWith( + 'nested-activity-metadata.js', + expect.any(Object), + { minimized: true }, + ); expect( encoder.options.stateStore.for(compilation).pairedBundleChunks, ).toEqual( @@ -255,6 +276,7 @@ describe('pluginLynxModuleFederation remote bundles', () => { 'catalog__main-thread.js', 'catalog__main-thread__Card-main-thread.js', 'catalog__background_Card.js', + 'nested-activity-metadata.js', ]), ); expect(emitAsset).toHaveBeenCalledWith( diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index 2518a8aa6a8..838c65a73df 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -1,4 +1,5 @@ import type { + Chunk, Compilation, Compiler, Configuration, @@ -247,17 +248,35 @@ const isModuleInLayer = (module: unknown, layer: string): boolean => { const classifyRemoteChunk = ( modules: Iterable, - name: string | undefined, - backgroundChunkPrefix: string, + containsBackgroundExpose: boolean, mainThreadLayer: string, ) => ({ - containsBackgroundExpose: - typeof name === 'string' && name.startsWith(backgroundChunkPrefix), + containsBackgroundExpose, containsMainThreadModule: Array.from(modules).some((module) => isModuleInLayer(module, mainThreadLayer), ), }); +const getBackgroundRemoteChunks = ( + chunks: Iterable, + backgroundChunkPrefix: string, +): ReadonlySet => { + const included = new Set(); + for (const chunk of chunks) { + if ( + typeof chunk.name !== 'string' || + !chunk.name.startsWith(backgroundChunkPrefix) + ) { + continue; + } + included.add(chunk); + for (const asyncChunk of chunk.getAllAsyncChunks()) { + included.add(asyncChunk); + } + } + return included; +}; + const createRemoteAssetsPlugin = ( stateStore: ReturnType, backgroundEntry: string, @@ -278,12 +297,15 @@ const createRemoteAssetsPlugin = ( compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS + 1, }, () => { + const backgroundRemoteChunks = getBackgroundRemoteChunks( + compilation.chunks, + backgroundChunkPrefix, + ); for (const chunk of compilation.chunks) { const { containsBackgroundExpose, containsMainThreadModule } = classifyRemoteChunk( compilation.chunkGraph.getChunkModulesIterable(chunk), - chunk.name, - backgroundChunkPrefix, + backgroundRemoteChunks.has(chunk), mainThreadLayer, ); if (!containsBackgroundExpose || containsMainThreadModule) { @@ -332,12 +354,15 @@ const createRemoteAssetsPlugin = ( state.pairedBundleChunks.add(mainThreadEntry); } + const backgroundRemoteChunks = getBackgroundRemoteChunks( + compilation.chunks, + backgroundChunkPrefix, + ); for (const chunk of compilation.chunks) { const { containsBackgroundExpose, containsMainThreadModule } = classifyRemoteChunk( compilation.chunkGraph.getChunkModulesIterable(chunk), - chunk.name, - backgroundChunkPrefix, + backgroundRemoteChunks.has(chunk), mainThreadLayer, ); if (!containsMainThreadModule && !containsBackgroundExpose) { diff --git a/packages/lynx/src/runtimeChunkLoading.ts b/packages/lynx/src/runtimeChunkLoading.ts index c42e51dc114..6730027ed51 100644 --- a/packages/lynx/src/runtimeChunkLoading.ts +++ b/packages/lynx/src/runtimeChunkLoading.ts @@ -212,9 +212,13 @@ const loadQueryComponent = ( lynx: NonNullable>, globalObject: LynxGlobal, ): PromiseLike => { - if (lynx.loadLazyBundle) { + if (typeof lynx.loadLazyBundle === 'function') { return lynx.loadLazyBundle(request); } + const nativeLynx = lynx.getNativeLynx?.(); + if (typeof nativeLynx?.loadLazyBundle === 'function') { + return nativeLynx.loadLazyBundle(request); + } if (getLynxRealm(lynx) === 'main-thread') { const queryComponent = globalObject.__QueryComponent; @@ -245,23 +249,33 @@ const loadQueryComponent = ( return resolver.promise; } - const queryComponent = - lynx.QueryComponent ?? lynx.getNativeLynx?.().QueryComponent; + const queryComponent = lynx.QueryComponent ?? nativeLynx?.QueryComponent; const getExports = globalObject.lynxCoreInject?.tt?.getDynamicComponentExports; - if (!queryComponent || !getExports) { + if (!queryComponent) { return Promise.reject( - new Error( - 'Lynx background split chunk loading requires QueryComponent and getDynamicComponentExports.', - ), + new Error('Lynx background split chunk loading requires QueryComponent.'), ); } const resolver = createQueryResolver(); queryComponent(request, (result) => { - const schema = result.detail?.schema; + const schema = + isRecord(result) && isRecord(result.detail) + ? result.detail.schema + : undefined; + if (typeof schema === 'string' && !getExports) { + resolver.reject( + new Error( + 'Lynx background split chunk loading requires getDynamicComponentExports.', + ), + ); + return; + } const exports = - result.code === 0 && schema ? getExports(schema) : undefined; + isRecord(result) && result.code === 0 && typeof schema === 'string' + ? getExports!(schema) + : undefined; if (exports !== undefined) { resolver.resolve(exports); return; @@ -284,15 +298,20 @@ export const patchLynxChunkLoading = ( const { loadScript } = lynx; const registry = globalObject[LYNX_BUNDLE_REGISTRY]; - const bundleName = + const registeredBundleName = registry?.get(originName) ?? registry?.get(getRegistryKey(originName, getLynxRealm(lynx))); - if (!bundleName) { + if (!registeredBundleName && !webpackRequire.lynx_aci) { return false; } const baseName = originName.replace(/__main_thread$/, ''); - const remoteOrigin = - registry?.get(getRemoteOriginKey(baseName)) ?? bundleName; + const registeredRemoteOrigin = registry?.get(getRemoteOriginKey(baseName)); + const getBundleName = (): string | undefined => + registeredBundleName ?? + globalObject[LYNX_BUNDLE_REGISTRY]?.get(originName) ?? + globalObject[LYNX_BUNDLE_REGISTRY]?.get( + getRegistryKey(originName, getLynxRealm(lynx)), + ); const installedChunks: Record = {}; @@ -314,6 +333,13 @@ export const patchLynxChunkLoading = ( ? undefined : webpackRequire.lynx_aci?.[key]; if (lazyBundlePath) { + const currentRegistry = globalObject[LYNX_BUNDLE_REGISTRY]; + const remoteOrigin = + registeredRemoteOrigin ?? + currentRegistry?.get(getRemoteOriginKey(baseName)) ?? + getBundleName() ?? + webpackRequire.p ?? + ''; const request = joinRemoteUrl( remoteOrigin, webpackRequire.lynx_public_path_auto ? undefined : webpackRequire.p, @@ -339,6 +365,10 @@ export const patchLynxChunkLoading = ( return; } + if (webpackRequire.lynx_aci && !getBundleName()) { + return; + } + let resolveChunk!: (value?: unknown) => void; let rejectChunk!: (error: unknown) => void; const promise = new Promise((resolve, reject) => { @@ -349,6 +379,12 @@ export const patchLynxChunkLoading = ( promises.push(promise); try { + const bundleName = getBundleName(); + if (!bundleName) { + throw new Error( + `Lynx section loading requires a registered bundle for "${originName}".`, + ); + } const sectionPath = getChunkSectionPath(webpackRequire.u(chunkId)); const value = loadScript(sectionPath, { bundleName }); if (!isChunk(value)) { diff --git a/packages/lynx/src/runtimeChunkUrl.test.ts b/packages/lynx/src/runtimeChunkUrl.test.ts index ebef6a3e652..6b56b2b3198 100644 --- a/packages/lynx/src/runtimeChunkUrl.test.ts +++ b/packages/lynx/src/runtimeChunkUrl.test.ts @@ -7,6 +7,48 @@ import { } from './runtimeChunkLoading.testUtils'; describe('patchLynxChunkLoading chunk URLs', () => { + it('loads host lazy bundles before a bundle registry exists', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'lazy-bundle/Feature.bundle' }; + webpackRequire.p = 'https://app.example/dist/host-web/'; + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: {}, + })); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + }; + + expect(patchLynxChunkLoading(webpackRequire, 'host', globalObject)).toBe( + true, + ); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://app.example/dist/host-web/lazy-bundle/Feature.bundle', + ); + }); + + it('leaves assetless host chunks to other webpack handlers', () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + local: 'lazy-bundle/Local.bundle', + }; + const loadLazyBundle = rs.fn(); + const globalObject = { + lynx: { loadLazyBundle, loadScript: rs.fn() }, + }; + + patchLynxChunkLoading(webpackRequire, 'host', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('remote-only', promises); + + expect(promises).toEqual([]); + expect(loadLazyBundle).not.toHaveBeenCalled(); + }); + it('captures the remote origin when the container runtime is patched', async () => { const webpackRequire = createWebpackRequire(); webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; diff --git a/packages/lynx/src/runtimeCore.ts b/packages/lynx/src/runtimeCore.ts index 85b30231116..2c299a4560a 100644 --- a/packages/lynx/src/runtimeCore.ts +++ b/packages/lynx/src/runtimeCore.ts @@ -15,19 +15,12 @@ export interface LynxRuntimePluginOptions { } export interface LynxRuntime { - QueryComponent?( - source: string, - callback: (result: { - code: number; - data?: { evalResult?: unknown; url?: string }; - detail?: { schema?: string }; - }) => void, - ): void; + QueryComponent?(source: string, callback: (result: unknown) => void): void; fetchBundle?(bundleUrl: string): PromiseLike; loadScript?(sectionPath: string, options: { bundleName: string }): unknown; loadLazyBundle?(bundleUrl: string): PromiseLike; getNativeApp?(): unknown; - getNativeLynx?(): Pick; + getNativeLynx?(): Pick; requireModuleAsync?( moduleUrl: string, callback: (error: unknown, value: unknown) => void, diff --git a/packages/lynx/src/runtimeLazyBundleLoading.test.ts b/packages/lynx/src/runtimeLazyBundleLoading.test.ts index 367d5bac946..494a3cbfc8f 100644 --- a/packages/lynx/src/runtimeLazyBundleLoading.test.ts +++ b/packages/lynx/src/runtimeLazyBundleLoading.test.ts @@ -347,6 +347,40 @@ describe('patchLynxChunkLoading lazy bundle loading', () => { expect(webpackRequire.m.factory).toBe(factory); }); + it('uses the Web native Lynx lazy-bundle API before React starts', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { feature: 'lazy-bundle/Feature.bundle' }; + const factory = rs.fn(); + const loadLazyBundle = rs.fn(async () => ({ + ids: ['feature'], + modules: { factory }, + })); + const globalObject = { + lynx: { + getNativeLynx: () => ({ loadLazyBundle }), + loadScript: rs.fn(), + requireModuleAsync: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await Promise.all(promises); + + expect(loadLazyBundle).toHaveBeenCalledWith( + 'https://cdn.example/remotes/lazy-bundle/Feature.bundle', + ); + expect(webpackRequire.m.factory).toBe(factory); + }); + it('times out split chunks and permits retry', async () => { const webpackRequire = createWebpackRequire(); webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; @@ -396,14 +430,14 @@ describe('patchLynxChunkLoading lazy bundle loading', () => { const promises: PromiseLike[] = []; webpackRequire.f.j!('feature', promises); await expect(Promise.all(promises)).rejects.toThrow( - 'requires QueryComponent and getDynamicComponentExports', + 'requires QueryComponent', ); expect(fetchBundle).not.toHaveBeenCalled(); expect(loadScript).not.toHaveBeenCalled(); }); - it('loads split chunks through QueryComponent when loadLazyBundle is unavailable', async () => { + it('loads split chunks through QueryComponent when loadLazyBundle is not callable', async () => { const webpackRequire = createWebpackRequire(); webpackRequire.lynx_aci = { feature: 'async/Card.123.bundle', @@ -418,14 +452,15 @@ describe('patchLynxChunkLoading lazy bundle loading', () => { ); const loadScript = rs.fn(); const globalObject = { + lynxCoreInject: { + tt: { getDynamicComponentExports: () => chunk }, + }, lynx: { loadScript, + loadLazyBundle: true as never, QueryComponent, requireModuleAsync: rs.fn(), }, - lynxCoreInject: { - tt: { getDynamicComponentExports: () => chunk }, - }, [LYNX_BUNDLE_REGISTRY]: new Map([ ['remote', 'lynx-cache://catalog'], [ @@ -448,6 +483,46 @@ describe('patchLynxChunkLoading lazy bundle loading', () => { expect(webpackRequire.m.factory).toBe(factory); }); + it('rejects direct chunk exports from background QueryComponent', async () => { + const webpackRequire = createWebpackRequire(); + webpackRequire.lynx_aci = { + feature: 'lazy-bundle/Feature.bundle', + }; + const factory = rs.fn(); + const chunk = { + ids: ['feature'], + modules: { factory }, + }; + const QueryComponent = rs.fn((_source, callback) => callback(chunk)); + const globalObject = { + lynx: { + loadScript: rs.fn(), + QueryComponent, + requireModuleAsync: rs.fn(), + }, + [LYNX_BUNDLE_REGISTRY]: new Map([ + ['remote', 'lynx-cache://catalog'], + [ + 'remote:remote-origin', + 'https://cdn.example/remotes/catalog.lynx.bundle', + ], + ]), + }; + + patchLynxChunkLoading(webpackRequire, 'remote', globalObject); + const promises: PromiseLike[] = []; + webpackRequire.f.j!('feature', promises); + await expect(Promise.all(promises)).rejects.toThrow( + 'Failed to load Lynx lazy bundle', + ); + + expect(QueryComponent).toHaveBeenCalledWith( + 'https://cdn.example/remotes/lazy-bundle/Feature.bundle', + expect.any(Function), + ); + expect(webpackRequire.m.factory).toBeUndefined(); + }); + it('loads main-thread split chunks through the asynchronous Web QueryComponent API', async () => { const webpackRequire = createWebpackRequire(); webpackRequire.lynx_aci = { feature: 'async/Card.bundle' }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0793be51a7b..179154031eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,7 @@ settings: overrides: '@changesets/assemble-release-plan': workspace:* + '@lynx-js/template-webpack-plugin': https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c ajv: 8.18.0 eslint>ajv: 6.14.0 '@eslint/eslintrc>ajv': 6.14.0 @@ -635,33 +636,33 @@ importers: apps/lynx-module-federation-demo: dependencies: '@lynx-js/react': - specifier: 0.122.1 - version: 0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28) + specifier: 0.123.0 + version: 0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28) '@module-federation/runtime': specifier: workspace:* version: link:../../packages/runtime devDependencies: '@lynx-js/lynx-bundle-rslib-config': - specifier: 0.5.1 - version: 0.5.1(tslib@2.8.1) + specifier: 0.6.0 + version: 0.6.0(tslib@2.8.1) '@lynx-js/qrcode-rsbuild-plugin': - specifier: 0.5.0 - version: 0.5.0(@lynx-js/rspeedy@0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))) + specifier: 0.6.0 + version: 0.6.0(@lynx-js/rspeedy@0.16.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))) '@lynx-js/react-rsbuild-plugin': - specifier: 0.17.2 - version: 0.17.2(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(tslib@2.8.1) + specifier: 0.18.0 + version: 0.18.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28))(tslib@2.8.1) '@lynx-js/rspeedy': - specifier: 0.15.0 - version: 0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + specifier: 0.16.0 + version: 0.16.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@lynx-js/types': specifier: 4.0.0 version: 4.0.0 '@lynx-js/web-core': - specifier: 0.22.1 - version: 0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) + specifier: https://pkg.pr.new/@lynx-js/web-core@4cc0608b488a9bf35093936fd9d0e6589a1c161c + version: https://pkg.pr.new/@lynx-js/web-core@4cc0608b488a9bf35093936fd9d0e6589a1c161c(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) '@lynx-js/web-elements': - specifier: 0.12.5 - version: 0.12.5(tslib@2.8.1) + specifier: 0.12.6 + version: 0.12.6(tslib@2.8.1) '@module-federation/lynx': specifier: workspace:* version: link:../../packages/lynx @@ -3450,6 +3451,9 @@ importers: packages/lynx: dependencies: + '@lynx-js/template-webpack-plugin': + specifier: https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c + version: https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1) '@module-federation/runtime-core': specifier: workspace:* version: link:../runtime-core @@ -3458,8 +3462,8 @@ importers: version: link:../sdk devDependencies: '@lynx-js/cache-events-webpack-plugin': - specifier: 0.1.0 - version: 0.1.0 + specifier: 0.2.0 + version: 0.2.0 '@lynx-js/chunk-loading-webpack-plugin': specifier: 0.4.0 version: 0.4.0 @@ -7925,25 +7929,30 @@ packages: '@loadable/component': ^5.0.1 react: ^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@lynx-js/cache-events-webpack-plugin@0.1.0': - resolution: {integrity: sha512-VVPbWkmRegTGFoR/0b9A6hoiyUVy0O54PrKhc87cpV104krJiIfdO3KRuvGO2B1iBZu9ewWIuBGiSG52hSIqwA==} + '@lynx-js/cache-events-webpack-plugin@0.2.0': + resolution: {integrity: sha512-f903x00MMmWB9yIyvACAoe4im0T58JHpKnypV/ccI2gp477RJoCgXPne2x8Obgo3fTOIMHpmNMdnxFW1ej9olQ==} engines: {node: '>=18'} '@lynx-js/chunk-loading-webpack-plugin@0.4.0': resolution: {integrity: sha512-ud56B1ZzX+ejthk8v7MjpTAOQpr7jC9ea//tgW3hrx36jGzZAmI9EIPoCqkLvUIoFqMXr2lsanh0WYMZ8LUBnw==} engines: {node: '>=18'} - '@lynx-js/css-extract-webpack-plugin@0.8.0': - resolution: {integrity: sha512-BXvd5OZfLEp6ekprCxp252ix9imiRAdDeRoZYV3g6TqnYUP9Rj6lj6SNuL/IQNElzzDaCY8o2E3tWjIaTdYULA==} + '@lynx-js/chunk-loading-webpack-plugin@0.4.1': + resolution: {integrity: sha512-vZb2HiZdkVdexs2OhRVZE3FkSUPYRvdnaAKG8y47WW2NlVFj6PHzqEhkqfO1L3dm5CIEsPgOMwzgSs3BHZZ8ig==} + engines: {node: '>=18'} + + '@lynx-js/css-extract-webpack-plugin@0.9.0': + resolution: {integrity: sha512-bWNaFeCBCa091BTZuFuAxQaqr/u/bE6xAiY5T6O8FBr5mIglBbLePQOftp/vsB92D30INjp8EwqB184PC+IXzg==} + version: 0.9.0 engines: {node: '>=18'} peerDependencies: - '@lynx-js/template-webpack-plugin': ^0.11.0 || ^0.12.0 + '@lynx-js/template-webpack-plugin': ^0.13.0 '@lynx-js/css-serializer@0.1.6': resolution: {integrity: sha512-AgYrhsNljp+xBqO2UUGFTfHR+zPBiH9XE8eD13PDkcTDXWA9uKE/cZ6glZUE3Ze0lUDEtp0cSPCOVlHTMEyKIg==} - '@lynx-js/debug-metadata-rsbuild-plugin@0.1.2': - resolution: {integrity: sha512-IjVcenwGQNAfR0a95jCFO11vsilaCyOFA4QlRuqgdFd998JAwhvrc1EU1ju2aBfW2cgYy4482ZlaFD1QrK08KA==} + '@lynx-js/debug-metadata-rsbuild-plugin@0.2.0': + resolution: {integrity: sha512-Lz/O04rpevr44sVd38Ue4YauUWgA+QwLB3RDL9V873zi1SrTq/fquD/9zIZOtY/+8qKtkdsVQPUBSsW3Vr5QwQ==} engines: {node: '>=18'} '@lynx-js/debug-metadata@0.1.0': @@ -7954,47 +7963,49 @@ packages: '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c': resolution: {integrity: sha512-h2pRrt5oLK9LT1NkjyprtzJij/AdZGvv3CN6B5edL4chixqvITbxoCSdYy667Hl6+uKOBuxmCNZoDddgRfcLnw==} - '@lynx-js/lynx-bundle-rslib-config@0.5.1': - resolution: {integrity: sha512-zVxyV0fvA11eHKo7uFrk+GEFze0QmgWn2na5TePUurUpPJqXF9FYKIRn2IVAWRTjkEbOsdcoNvtOztbkkl9duw==} + '@lynx-js/lynx-bundle-rslib-config@0.6.0': + resolution: {integrity: sha512-6tU/UzffyaUya2kCgokLUVOhcbnUoZPXhp8LNUZaShe2xVTCXrzNMrDsg/eZjfQB8U4xk9FLHMK2vYlXSi/dCw==} engines: {node: ^20.19.0 || >=22.12.0} - '@lynx-js/qrcode-rsbuild-plugin@0.5.0': - resolution: {integrity: sha512-+cc2gsv02Cqa7+5Ard7Kow20N/KZC5BKZmEI/TEVTBV21jMyN+g0h4cNp344GwIzkSRG2G1J0YmxML3F/ArKRw==} + '@lynx-js/qrcode-rsbuild-plugin@0.6.0': + resolution: {integrity: sha512-AjRhjQH5xEJKo5VUIIsjdk6zc6qXMf4QsGvKTDuwBjuGr01sDkLLpAt+wbu9GCJvDlGA7ygNTEsxaPJPYHPmIw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - '@lynx-js/rspeedy': ^0.15.0 + '@lynx-js/rspeedy': ^0.16.0 - '@lynx-js/react-alias-rsbuild-plugin@0.17.2': - resolution: {integrity: sha512-qiGwnrcq34g0WnRLrXGjAXy3WTo5I5fPK9ICQPKsAgww3+Impy6xnC/rK7kCV7cnzVDob+dXDNntc8Q8p+XR/g==} + '@lynx-js/react-alias-rsbuild-plugin@0.18.0': + resolution: {integrity: sha512-eqRmy8tusHc4h5sEr/I2HOHw3RIRSfSHUmqn3whYKGEQvKKm53Zr2I6E9vRjElud+ugOXC/g69UIlBlhxBRN9g==} engines: {node: '>=18'} - '@lynx-js/react-refresh-webpack-plugin@0.4.0': - resolution: {integrity: sha512-HWkqou1JzmnTWhVQdRYn7KPfT23Rys8/H5x3gAoSEZcbuHi0INpCabuZNdEddk6PRe6NiUFjkW19Xm0/+qDMEw==} + '@lynx-js/react-refresh-webpack-plugin@0.4.1': + resolution: {integrity: sha512-L03dbY40PTR/+O4M5Orshn5q+59CdAqVPJOD9mKK4CMg0Vt+2jAOjow29x9tJZ8rjWQTJY2JdhOjIDBYpGXD5w==} + version: 0.4.1 engines: {node: '>=18'} peerDependencies: - '@lynx-js/react-webpack-plugin': ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0 || ^0.9.0 + '@lynx-js/react-webpack-plugin': ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 - '@lynx-js/react-rsbuild-plugin@0.17.2': - resolution: {integrity: sha512-PbKHo62rwNvnPW4o3kw6ug1SoOqicUixGYQMSHbzoJykh5Q7Gk5Jb2+umJrtjcdQNuOApBrdVyKXPybkRfuB5g==} + '@lynx-js/react-rsbuild-plugin@0.18.0': + resolution: {integrity: sha512-xqytte0KVtCceDJR0jJwWf0rP1ASCzaXAXikUOnX7/QX8mBSXns6CD4QCiiNnR3p1zjgiY3SVT0p10nJ1q+7Gg==} engines: {node: '>=18'} peerDependencies: - '@lynx-js/react': ^0.103.0 || ^0.104.0 || ^0.105.0 || ^0.106.0 || ^0.107.0 || ^0.108.0 || ^0.109.0 || ^0.110.0 || ^0.111.0 || ^0.112.0 || ^0.113.0 || ^0.114.0 || ^0.115.0 || ^0.116.0 || ^0.117.0 || ^0.118.0 || ^0.119.0 || ^0.120.0 || ^0.121.0 || ^0.122.0 + '@lynx-js/react': ^0.123.0 peerDependenciesMeta: '@lynx-js/react': optional: true - '@lynx-js/react-webpack-plugin@0.9.5': - resolution: {integrity: sha512-O1L6xFudztsPM5K3y5dM8F5WmyLKZO/SeELZfc6pMVwX5PqC+/nsBJmrKE8+z8IrORpeTcpZoVDgn+FMiILZ0Q==} + '@lynx-js/react-webpack-plugin@0.10.0': + resolution: {integrity: sha512-gyGsqbMyCoIfL94/vcc5OOSGNP7OJyVzfaOywmMqWX/1reUa8USawtEKMHJzvGb7AJ4UrAaW9NYFQNyIdW7kIg==} + version: 0.10.0 engines: {node: '>=18'} peerDependencies: '@lynx-js/react': '*' - '@lynx-js/template-webpack-plugin': ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 + '@lynx-js/template-webpack-plugin': ^0.13.0 peerDependenciesMeta: '@lynx-js/react': optional: true - '@lynx-js/react@0.122.1': - resolution: {integrity: sha512-uXeG2cfROJJdijimkU6FKfNQezEDb0an/9mv6IylD+zo/YtK8r22cMgppogmFNZZrEUM5UXUrAdMoivydGd43g==} + '@lynx-js/react@0.123.0': + resolution: {integrity: sha512-w/yX20jmGMdpfuNb2w7eyXN3JktSka43QdJwICvteNBZJPkZUzauvUvQ2EOqT09RHPHzMkcnk0AlpHOh7g+VoQ==} peerDependencies: '@lynx-js/types': '*' '@types/react': ^18 @@ -8002,8 +8013,8 @@ packages: '@lynx-js/types': optional: true - '@lynx-js/rspeedy@0.15.0': - resolution: {integrity: sha512-kapJuvpelodGjVGCMPxPZ6jf9DRWuWZZBKlPG3ML1FfDZmo38NXRWmIuS6FMzDze6YtKbiYmXHKZ1bhILtJhFw==} + '@lynx-js/rspeedy@0.16.0': + resolution: {integrity: sha512-j9a25T3we1rtkCQtpKwjVD5Gn7E6YlILWu6xTyR0cHoG01Rmln1i2BK9SoTjtt9SKnUVB7i+eHOVRimXMpVwuw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -8012,16 +8023,17 @@ packages: typescript: optional: true - '@lynx-js/runtime-wrapper-webpack-plugin@0.2.1': - resolution: {integrity: sha512-Igx1LIx1Tlk8ioNLmOawJoPrEPGiUHeDAYqnzwlOViXXeKqLBTB23VVPyDrYQdMzZg53SLUZDBVhYqWzD4u++Q==} + '@lynx-js/runtime-wrapper-webpack-plugin@0.2.2': + resolution: {integrity: sha512-q/T89kpxkZIQgSk2yhTXFYlH1XqE2UzPr/vKhWOk4PBZ8v9gyUco80xCvn4YyA6iSYrd7bO65MBK73gkqIlsng==} engines: {node: '>=18'} '@lynx-js/tasm@0.0.39': resolution: {integrity: sha512-FNIV6Cc2K0wCKOHVMfpr3M6kpIZqHHNI02GpVl+h0ClyyK44jxEO+lf58gLFD5E3o0hJ1cp3H2OBIxSUJGkPDw==} hasBin: true - '@lynx-js/template-webpack-plugin@0.12.2': - resolution: {integrity: sha512-rIcVbM4gOXEoih4NTz/LuO3/ItLnEb74NXsdA4GzJTo7vWuIpoakjPB65fU4TX99lp8MNf9tOwWyb2Wd4DhzRg==} + '@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c': + resolution: {integrity: sha512-QJUJkR+M1IALDS1g1rbd3w+NObfvkNtM95cu3X9QRj/lVij7iCCFsXEMZfuQYy3/v+gqwn/ZxIVEs4thCKwsUw==, tarball: https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c} + version: 0.13.0 engines: {node: ^18.14 || >=19.4} '@lynx-js/types@4.0.0': @@ -8046,17 +8058,73 @@ packages: tslib: optional: true + '@lynx-js/web-core@0.22.2': + resolution: {integrity: sha512-pJY0/h/7GcP6O2NYAwpTXe8ZT5tAq91aECSvRcAyvS/7YCW/3JMYuOtZLgOfF+Nan45PjSMVLn5NmLx9cSRj7Q==} + peerDependencies: + '@lynx-js/css-serializer': 0.1.6 + '@lynx-js/lynx-core': 0.1.4 + tslib: ^2.5.0 + peerDependenciesMeta: + '@lynx-js/css-serializer': + optional: true + '@lynx-js/lynx-core': + optional: true + tslib: + optional: true + + '@lynx-js/web-core@https://pkg.pr.new/@lynx-js/web-core@4cc0608b488a9bf35093936fd9d0e6589a1c161c': + resolution: {integrity: sha512-BsLzwunboH17eLLbSS5Va+UtDL2RjBNF+9JaQX7E9JtfTdKb+d3AlWQH339lyaNoWRwxWEy4b7YUiP35scTJQA==, tarball: https://pkg.pr.new/@lynx-js/web-core@4cc0608b488a9bf35093936fd9d0e6589a1c161c} + version: 0.22.2 + peerDependencies: + '@lynx-js/css-serializer': 0.1.6 + '@lynx-js/lynx-core': 0.1.4 + tslib: ^2.5.0 + peerDependenciesMeta: + '@lynx-js/css-serializer': + optional: true + '@lynx-js/lynx-core': + optional: true + tslib: + optional: true + + '@lynx-js/web-core@https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-core@4cc0608': + resolution: {integrity: sha512-BsLzwunboH17eLLbSS5Va+UtDL2RjBNF+9JaQX7E9JtfTdKb+d3AlWQH339lyaNoWRwxWEy4b7YUiP35scTJQA==, tarball: https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-core@4cc0608} + version: 0.22.2 + peerDependencies: + '@lynx-js/css-serializer': 0.1.6 + '@lynx-js/lynx-core': 0.1.4 + tslib: ^2.5.0 + peerDependenciesMeta: + '@lynx-js/css-serializer': + optional: true + '@lynx-js/lynx-core': + optional: true + tslib: + optional: true + '@lynx-js/web-elements@0.12.5': resolution: {integrity: sha512-plNOkiI/AvdSqTmsN8jDBtll3SOqfrnLUuqicn3DrMUT7tizUhX6569dLNae8dk9KQqnS1pukUK9d/P/Nw9edg==} peerDependencies: tslib: ^2.5.0 - '@lynx-js/web-rsbuild-server-middleware@0.21.1': - resolution: {integrity: sha512-U9wiYo50HLQhQZfgA1PNQrxYLdsh7H7PqT6E9vI//G6fpO+dBh31XnzHIGt54ewVDS9cADZXFILOmHn+DboTiw==} + '@lynx-js/web-elements@0.12.6': + resolution: {integrity: sha512-JcavrTn9SeapEEGS9uqsCrFZK1hJDgeblT6kewG+LijWu5r4YkZw7yGCvInLH9qhFAablJQ+EZHpwa91GAT2dw==} + peerDependencies: + tslib: ^2.5.0 + + '@lynx-js/web-rsbuild-server-middleware@0.22.2': + resolution: {integrity: sha512-E7PzfLK+id5sL68RDxCPn7+WS5wK8+Vwm/YSm0EqqmidLB8QCIRVQe5V7oBTwvanWgz7zTEud3c8QRoYFo6yrA==} '@lynx-js/web-worker-rpc@0.22.1': resolution: {integrity: sha512-nvC0axgTFJbpc8QcXbMVEG4EQcF3GCfdoDTmSAIE0J6bOOfvx2hK1ztG6MpRERU5dzMSfaHn425QpbPrume9QQ==} + '@lynx-js/web-worker-rpc@0.22.2': + resolution: {integrity: sha512-YQmh+RarVbpfrNTJT2NN1VamFFLKvoVmXCqO1STsMIdubO2MS9T1eBAbXTxkEWe6SSdYKFMcdJZIzkd0bEoWCA==} + + '@lynx-js/web-worker-rpc@https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-worker-rpc@4cc0608': + resolution: {integrity: sha512-YQmh+RarVbpfrNTJT2NN1VamFFLKvoVmXCqO1STsMIdubO2MS9T1eBAbXTxkEWe6SSdYKFMcdJZIzkd0bEoWCA==, tarball: https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-worker-rpc@4cc0608} + version: 0.22.2 + '@lynx-js/webpack-dev-transport@0.3.0': resolution: {integrity: sha512-vpa0X/eqb50DhNhXEEfCi6gEd/ti32bFJtkt9zkPv6dTTsd2HJkYnCiKSUWpHpqPbnRbVLf/UacAY6h1uTtZeA==} engines: {node: '>=18'} @@ -8065,6 +8133,10 @@ packages: resolution: {integrity: sha512-VzpJc/w7v38/SHaZ+f3WBVBrsgXOG13YX9mRRxRrCgJQa+wZ6waRz7OIjntuTYJk2p7rQ0wKRGzsMgMfRBs/3g==} engines: {node: '>=18'} + '@lynx-js/webpack-runtime-globals@0.0.7': + resolution: {integrity: sha512-HGWCIX8FMeoeCfUZpijrZO20UVp8wVHj7f+aEiMbx94H2iqIVxLzrCLZudBfvo4+WZ3kdgM8CqhU1EERKhLi0w==} + engines: {node: '>=18'} + '@lynx-js/websocket@0.0.4': resolution: {integrity: sha512-yXuMiTALLNvkDz8hG+0KdkBodnyJDvyfr8bdIq6zMP9X8JAoBC/czc1HIhUgYEJ3Zee5F/vGKjNxcoSx2t1E6w==} engines: {node: '>=18'} @@ -11836,16 +11908,6 @@ packages: core-js: optional: true - '@rsbuild/core@2.0.11': - resolution: {integrity: sha512-Mpp/viUSkVdSWJkFipdZxM2nUztrBwSnMm6Q86bPzLHtHnXqQ3VFpSMlA4wWRyySNddP6s6efKiVpx0ZOCf7Gg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - core-js: '>= 3.0.0' - peerDependenciesMeta: - core-js: - optional: true - '@rsbuild/core@2.0.15': resolution: {integrity: sha512-O8vmMhZu1YImO6jOqt/K/vlJSvkq7UtSq5YM1DIlcEd9LW8Gf6/dkQ1B2KPI6F+hSMFBnTTTumdcIowSLCw97g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -32920,23 +32982,27 @@ snapshots: lodash: 4.18.1 react: 18.3.1 - '@lynx-js/cache-events-webpack-plugin@0.1.0': + '@lynx-js/cache-events-webpack-plugin@0.2.0': dependencies: - '@lynx-js/webpack-runtime-globals': 0.0.6 + '@lynx-js/webpack-runtime-globals': 0.0.7 '@lynx-js/chunk-loading-webpack-plugin@0.4.0': dependencies: '@lynx-js/webpack-runtime-globals': 0.0.6 - '@lynx-js/css-extract-webpack-plugin@0.8.0(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1))': + '@lynx-js/chunk-loading-webpack-plugin@0.4.1': + dependencies: + '@lynx-js/webpack-runtime-globals': 0.0.7 + + '@lynx-js/css-extract-webpack-plugin@0.9.0(@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1))': dependencies: - '@lynx-js/template-webpack-plugin': 0.12.2(tslib@2.8.1) + '@lynx-js/template-webpack-plugin': https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1) '@lynx-js/css-serializer@0.1.6': dependencies: css-tree: 3.2.1 - '@lynx-js/debug-metadata-rsbuild-plugin@0.1.2': + '@lynx-js/debug-metadata-rsbuild-plugin@0.2.0': dependencies: '@lynx-js/debug-metadata': 0.1.0 @@ -32944,70 +33010,70 @@ snapshots: '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c': {} - '@lynx-js/lynx-bundle-rslib-config@0.5.1(tslib@2.8.1)': + '@lynx-js/lynx-bundle-rslib-config@0.6.0(tslib@2.8.1)': dependencies: '@lynx-js/css-serializer': 0.1.6 - '@lynx-js/runtime-wrapper-webpack-plugin': 0.2.1 + '@lynx-js/runtime-wrapper-webpack-plugin': 0.2.2 '@lynx-js/tasm': 0.0.39 - '@lynx-js/web-core': 0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) + '@lynx-js/web-core': 0.22.2(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) transitivePeerDependencies: - '@lynx-js/lynx-core' - tslib - '@lynx-js/qrcode-rsbuild-plugin@0.5.0(@lynx-js/rspeedy@0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)))': + '@lynx-js/qrcode-rsbuild-plugin@0.6.0(@lynx-js/rspeedy@0.16.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)))': dependencies: - '@lynx-js/rspeedy': 0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@lynx-js/rspeedy': 0.16.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) - '@lynx-js/react-alias-rsbuild-plugin@0.17.2': {} + '@lynx-js/react-alias-rsbuild-plugin@0.18.0': {} - '@lynx-js/react-refresh-webpack-plugin@0.4.0(@lynx-js/react-webpack-plugin@0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)))': + '@lynx-js/react-refresh-webpack-plugin@0.4.1(@lynx-js/react-webpack-plugin@0.10.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1)))': dependencies: - '@lynx-js/react-webpack-plugin': 0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)) + '@lynx-js/react-webpack-plugin': 0.10.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1)) - '@lynx-js/react-rsbuild-plugin@0.17.2(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(tslib@2.8.1)': + '@lynx-js/react-rsbuild-plugin@0.18.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28))(tslib@2.8.1)': dependencies: - '@lynx-js/css-extract-webpack-plugin': 0.8.0(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)) - '@lynx-js/react-alias-rsbuild-plugin': 0.17.2 - '@lynx-js/react-refresh-webpack-plugin': 0.4.0(@lynx-js/react-webpack-plugin@0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1))) - '@lynx-js/react-webpack-plugin': 0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)) - '@lynx-js/runtime-wrapper-webpack-plugin': 0.2.1 - '@lynx-js/template-webpack-plugin': 0.12.2(tslib@2.8.1) - '@lynx-js/use-sync-external-store': 1.5.0(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28)) + '@lynx-js/css-extract-webpack-plugin': 0.9.0(@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1)) + '@lynx-js/react-alias-rsbuild-plugin': 0.18.0 + '@lynx-js/react-refresh-webpack-plugin': 0.4.1(@lynx-js/react-webpack-plugin@0.10.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1))) + '@lynx-js/react-webpack-plugin': 0.10.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1)) + '@lynx-js/runtime-wrapper-webpack-plugin': 0.2.2 + '@lynx-js/template-webpack-plugin': https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1) + '@lynx-js/use-sync-external-store': 1.5.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28)) background-only: 0.0.1 tiny-invariant: 1.3.3 optionalDependencies: - '@lynx-js/react': 0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28) + '@lynx-js/react': 0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28) transitivePeerDependencies: - '@lynx-js/lynx-core' - tslib - '@lynx-js/react-webpack-plugin@0.9.5(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1))': + '@lynx-js/react-webpack-plugin@0.10.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28))(@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1))': dependencies: '@lynx-js/debug-metadata': 0.1.0 - '@lynx-js/template-webpack-plugin': 0.12.2(tslib@2.8.1) - '@lynx-js/webpack-runtime-globals': 0.0.6 + '@lynx-js/template-webpack-plugin': https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1) + '@lynx-js/webpack-runtime-globals': 0.0.7 tiny-invariant: 1.3.3 optionalDependencies: - '@lynx-js/react': 0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28) + '@lynx-js/react': 0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28) - '@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28)': + '@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28)': dependencies: '@types/react': 18.3.28 preact: '@lynx-js/internal-preact@10.29.1-20260519060144-e6da44c' optionalDependencies: '@lynx-js/types': 4.0.0 - '@lynx-js/rspeedy@0.15.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@lynx-js/rspeedy@0.16.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@module-federation/runtime-tools@packages+runtime-tools)(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(core-js@3.49.0)(esbuild@0.28.1)(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: - '@lynx-js/cache-events-webpack-plugin': 0.1.0 - '@lynx-js/chunk-loading-webpack-plugin': 0.4.0 - '@lynx-js/debug-metadata-rsbuild-plugin': 0.1.2 - '@lynx-js/web-rsbuild-server-middleware': 0.21.1 + '@lynx-js/cache-events-webpack-plugin': 0.2.0 + '@lynx-js/chunk-loading-webpack-plugin': 0.4.1 + '@lynx-js/debug-metadata-rsbuild-plugin': 0.2.0 + '@lynx-js/web-rsbuild-server-middleware': 0.22.2 '@lynx-js/webpack-dev-transport': 0.3.0 '@lynx-js/websocket': 0.0.4 - '@rsbuild/core': 2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) - '@rsbuild/plugin-css-minimizer': 2.0.0(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) - '@rsdoctor/rspack-plugin': 1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) + '@rsbuild/plugin-css-minimizer': 2.0.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/rspack-plugin': 1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -33027,19 +33093,19 @@ snapshots: - utf-8-validate - webpack - '@lynx-js/runtime-wrapper-webpack-plugin@0.2.1': + '@lynx-js/runtime-wrapper-webpack-plugin@0.2.2': dependencies: - '@lynx-js/webpack-runtime-globals': 0.0.6 + '@lynx-js/webpack-runtime-globals': 0.0.7 '@lynx-js/tasm@0.0.39': {} - '@lynx-js/template-webpack-plugin@0.12.2(tslib@2.8.1)': + '@lynx-js/template-webpack-plugin@https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c(tslib@2.8.1)': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@lynx-js/css-serializer': 0.1.6 '@lynx-js/tasm': 0.0.39 - '@lynx-js/web-core': 0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) - '@lynx-js/webpack-runtime-globals': 0.0.6 + '@lynx-js/web-core': https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-core@4cc0608(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1) + '@lynx-js/webpack-runtime-globals': 0.0.7 '@rspack/lite-tapable': 1.1.0 css-tree: 3.2.1 object.groupby: 1.0.3 @@ -33052,9 +33118,9 @@ snapshots: dependencies: csstype: 3.1.3 - '@lynx-js/use-sync-external-store@1.5.0(@lynx-js/react@0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28))': + '@lynx-js/use-sync-external-store@1.5.0(@lynx-js/react@0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28))': dependencies: - '@lynx-js/react': 0.122.1(@lynx-js/types@4.0.0)(@types/react@18.3.28) + '@lynx-js/react': 0.123.0(@lynx-js/types@4.0.0)(@types/react@18.3.28) '@lynx-js/web-core@0.22.1(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1)': dependencies: @@ -33065,20 +33131,59 @@ snapshots: '@lynx-js/css-serializer': 0.1.6 tslib: 2.8.1 + '@lynx-js/web-core@0.22.2(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1)': + dependencies: + '@lynx-js/web-elements': 0.12.6(tslib@2.8.1) + '@lynx-js/web-worker-rpc': 0.22.2 + wasm-feature-detect: 1.8.0 + optionalDependencies: + '@lynx-js/css-serializer': 0.1.6 + tslib: 2.8.1 + + '@lynx-js/web-core@https://pkg.pr.new/@lynx-js/web-core@4cc0608b488a9bf35093936fd9d0e6589a1c161c(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1)': + dependencies: + '@lynx-js/web-elements': 0.12.6(tslib@2.8.1) + '@lynx-js/web-worker-rpc': https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-worker-rpc@4cc0608 + wasm-feature-detect: 1.8.0 + optionalDependencies: + '@lynx-js/css-serializer': 0.1.6 + tslib: 2.8.1 + + '@lynx-js/web-core@https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-core@4cc0608(@lynx-js/css-serializer@0.1.6)(tslib@2.8.1)': + dependencies: + '@lynx-js/web-elements': 0.12.6(tslib@2.8.1) + '@lynx-js/web-worker-rpc': https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-worker-rpc@4cc0608 + wasm-feature-detect: 1.8.0 + optionalDependencies: + '@lynx-js/css-serializer': 0.1.6 + tslib: 2.8.1 + '@lynx-js/web-elements@0.12.5(tslib@2.8.1)': dependencies: dompurify: 3.4.11 markdown-it: 14.1.1 tslib: 2.8.1 - '@lynx-js/web-rsbuild-server-middleware@0.21.1': {} + '@lynx-js/web-elements@0.12.6(tslib@2.8.1)': + dependencies: + dompurify: 3.4.11 + markdown-it: 14.1.1 + tslib: 2.8.1 + + '@lynx-js/web-rsbuild-server-middleware@0.22.2': {} '@lynx-js/web-worker-rpc@0.22.1': {} + '@lynx-js/web-worker-rpc@0.22.2': {} + + '@lynx-js/web-worker-rpc@https://pkg.pr.new/lynx-family/lynx-stack/@lynx-js/web-worker-rpc@4cc0608': {} + '@lynx-js/webpack-dev-transport@0.3.0': {} '@lynx-js/webpack-runtime-globals@0.0.6': {} + '@lynx-js/webpack-runtime-globals@0.0.7': {} + '@lynx-js/websocket@0.0.4': dependencies: eventemitter3: 5.0.4 @@ -39459,15 +39564,6 @@ snapshots: transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)': - dependencies: - '@rspack/core': 2.0.6(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23) - '@swc/helpers': 0.5.23 - optionalDependencies: - core-js: 3.49.0 - transitivePeerDependencies: - - '@module-federation/runtime-tools' - '@rsbuild/core@2.0.15(@module-federation/runtime-tools@2.8.0)(core-js@3.36.1)': dependencies: '@rspack/core': 2.0.8(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23) @@ -39629,7 +39725,7 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.7.3 - '@rsbuild/plugin-check-syntax@1.6.1(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))': + '@rsbuild/plugin-check-syntax@1.6.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))': dependencies: acorn: 8.17.0 browserslist-to-es-version: 1.4.1 @@ -39637,7 +39733,7 @@ snapshots: picocolors: 1.1.1 source-map: 0.7.6 optionalDependencies: - '@rsbuild/core': 2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) '@rsbuild/plugin-check-syntax@2.0.0(@rsbuild/core@2.1.0(@module-federation/runtime-tools@2.8.0)(core-js@3.49.0))': dependencies: @@ -39694,12 +39790,12 @@ snapshots: - lightningcss - webpack - '@rsbuild/plugin-css-minimizer@2.0.0(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@rsbuild/plugin-css-minimizer@2.0.0(@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: css-minimizer-webpack-plugin: 8.0.0(esbuild@0.28.1)(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) reduce-configs: 1.1.2 optionalDependencies: - '@rsbuild/core': 2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) + '@rsbuild/core': 2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0) transitivePeerDependencies: - '@parcel/css' - '@swc/css' @@ -40208,9 +40304,9 @@ snapshots: '@rsdoctor/client@1.5.18': {} - '@rsdoctor/core@1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@rsdoctor/core@1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: - '@rsbuild/plugin-check-syntax': 1.6.1(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)) + '@rsbuild/plugin-check-syntax': 1.6.1(@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0)) '@rsdoctor/graph': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@rsdoctor/sdk': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@rsdoctor/types': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) @@ -40243,9 +40339,9 @@ snapshots: - '@rspack/core' - webpack - '@rsdoctor/rspack-plugin@1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': + '@rsdoctor/rspack-plugin@1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4))': dependencies: - '@rsdoctor/core': 1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.0.11(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) + '@rsdoctor/core': 1.5.18(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@rsbuild/core@2.1.4(@module-federation/runtime-tools@packages+runtime-tools)(core-js@3.49.0))(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@rsdoctor/graph': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@rsdoctor/sdk': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) '@rsdoctor/types': 1.5.18(@rspack-canary/core@2.1.5-canary-54a0d8f3-20260715194831(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23))(webpack@5.104.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.28.1)(webpack-cli@5.1.4)) @@ -41157,13 +41253,6 @@ snapshots: '@module-federation/runtime-tools': 2.8.0 '@swc/helpers': 0.5.17 - '@rspack/core@2.0.6(@module-federation/runtime-tools@packages+runtime-tools)(@swc/helpers@0.5.23)': - dependencies: - '@rspack/binding': 2.0.6 - optionalDependencies: - '@module-federation/runtime-tools': link:packages/runtime-tools - '@swc/helpers': 0.5.23 - '@rspack/core@2.0.8(@module-federation/runtime-tools@2.8.0)(@swc/helpers@0.5.23)': dependencies: '@rspack/binding': 2.0.8 diff --git a/tools/scripts/ci-local.mjs b/tools/scripts/ci-local.mjs index 1ae9deee7f1..aa25b73cc44 100644 --- a/tools/scripts/ci-local.mjs +++ b/tools/scripts/ci-local.mjs @@ -224,9 +224,45 @@ const jobs = [ env: SKIP_DEVTOOLS_POSTINSTALL_ENV, steps: [ ...e2eSetupSteps('lynx', { cypress: false }), - step('E2E Test for Lynx Module Federation Demo', (ctx) => + step('Test Lynx federation compiler and transport', (ctx) => runWhenAffected(ctx, () => - runCommand('pnpm', ['run', 'e2e:lynx'], ctx), + runCommand( + 'pnpm', + ['--filter', '@module-federation/lynx', 'test'], + ctx, + ), + ), + ), + step('Build and validate native Lynx artifacts', (ctx) => + runWhenAffected(ctx, () => + runCommand( + 'pnpm', + ['--filter', 'lynx-module-federation-demo', 'run', 'e2e:native:ci'], + ctx, + ), + ), + ), + step('Validate standalone iOS project policy', (ctx) => + runWhenAffected(ctx, () => + runCommand( + 'pnpm', + [ + '--filter', + 'lynx-module-federation-demo', + 'run', + 'test:ios-project', + ], + ctx, + ), + ), + ), + step('Run real Lynx for Web E2E', (ctx) => + runWhenAffected(ctx, () => + runCommand( + 'pnpm', + ['--filter', 'lynx-module-federation-demo', 'run', 'e2e:web:ci'], + ctx, + ), ), ), ], From be794362dae0b526745eaa9ad8cf02f7f384725a Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Wed, 22 Jul 2026 22:11:08 +0000 Subject: [PATCH 44/68] ci(lynx): speed up iOS federation validation --- .github/workflows/e2e-lynx.yml | 14 +++++++++++++- .../OrbitControlUITests.swift | 17 ++++++++++++++++- .../test/ios/run.mjs | 1 + 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 56defb13c08..9b1c979f651 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -145,7 +145,8 @@ jobs: - name: Checkout Repository uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: - fetch-depth: 0 + fetch-depth: 1 + sparse-checkout: apps/lynx-module-federation-demo - name: Setup Node.js 24 uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 @@ -169,6 +170,17 @@ jobs: restore-keys: | ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-ruby-${{ env.RUBY_VERSION }}- + - name: Cache iOS build products + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 + with: + path: | + apps/lynx-module-federation-demo/ios/build/DerivedData/Build + apps/lynx-module-federation-demo/ios/build/DerivedData/ModuleCache.noindex + apps/lynx-module-federation-demo/ios/build/DerivedData/SDKStatCaches.noindex + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-derived-data-xcode-16.4-${{ hashFiles('apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} + restore-keys: | + ${{ runner.os }}-${{ runner.arch }}-lynx-ios-derived-data-xcode-16.4-${{ hashFiles('apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}- + - name: Download native artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: diff --git a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift index cf11d15ba9e..087e18ead40 100644 --- a/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift +++ b/apps/lynx-module-federation-demo/ios/OrbitControlUITests/OrbitControlUITests.swift @@ -26,6 +26,21 @@ final class OrbitControlUITests: XCTestCase { add(attachment) } + private func tapUntilStateChanges(_ button: XCUIElement) -> Bool { + for _ in 0..<2 { + button.tap() + let stateChanged = XCTNSPredicateExpectation( + predicate: NSPredicate(format: "exists == false"), + object: button + ) + if XCTWaiter.wait(for: [stateChanged], timeout: 2) == .completed { + return true + } + } + XCTFail("The load gesture did not leave the idle state.") + return false + } + func testEmbeddedReleaseHostLaunches() { let app = XCUIApplication() app.launchEnvironment["LYNX_BUNDLE_URL"] = "" @@ -47,7 +62,7 @@ final class OrbitControlUITests: XCTestCase { .matching(NSPredicate(format: "label == %@", "Load remote catalog")) .firstMatch XCTAssertTrue(loadButton.waitForExistence(timeout: 30)) - loadButton.tap() + guard tapUntilStateChanges(loadButton) else { return } let readiness = app.descendants(matching: .any) .matching(identifier: "federation-ready") diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index e5f68cbcb82..ba4ae50d7b0 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -146,6 +146,7 @@ try { '-resultBundlePath', 'build/OrbitControl-Release.xcresult', 'COMPILER_INDEX_STORE_ENABLE=NO', + '-showBuildTimingSummary', '-parallel-testing-enabled', 'NO', '-only-testing:OrbitControlTests', From b2238447ad8ef3548a91292d9155f7878c5800d0 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Wed, 22 Jul 2026 22:44:27 +0000 Subject: [PATCH 45/68] ci(lynx): harden iOS cache seeding --- .github/workflows/e2e-lynx.yml | 16 +++++++++++++++- .../test/ios-project.mjs | 2 ++ .../lynx-module-federation-demo/test/ios/run.mjs | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 9b1c979f651..1d8f807d4d3 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -171,7 +171,8 @@ jobs: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-ruby-${{ env.RUBY_VERSION }}- - name: Cache iOS build products - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 + id: ios-build-cache + uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: | apps/lynx-module-federation-demo/ios/build/DerivedData/Build @@ -200,6 +201,19 @@ jobs: - name: Run standalone iOS federation E2E run: node apps/lynx-module-federation-demo/test/ios/run.mjs + - name: Save iOS build products + if: >- + always() && + steps.ios-build-cache.outputs.cache-hit != 'true' && + hashFiles('apps/lynx-module-federation-demo/ios/build/DerivedData/Build/Products/Release-iphonesimulator/OrbitControl.app/OrbitControl') != '' + uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 + with: + path: | + apps/lynx-module-federation-demo/ios/build/DerivedData/Build + apps/lynx-module-federation-demo/ios/build/DerivedData/ModuleCache.noindex + apps/lynx-module-federation-demo/ios/build/DerivedData/SDKStatCaches.noindex + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-derived-data-xcode-16.4-${{ hashFiles('apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} + - name: Upload iOS E2E evidence if: success() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index 57995126c48..cdf8c0f048c 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -114,6 +114,8 @@ assert.match(urlResolver, /hasPrefix:@"\/catalog-native\/"/); assert.equal(iosRunner.match(/await run\(\s*'xcodebuild'/g)?.length, 1); assert.match(iosRunner, /'-configuration',\s*'Release'/); assert.match(iosRunner, /build\/OrbitControl-Release\.xcresult/); +assert.match(iosRunner, /'-test-iterations',\s*'2'/); +assert.match(iosRunner, /'-retry-tests-on-failure'/); assert.match(iosRunner, /-only-testing:OrbitControlTests/); for (const testName of [ 'testFederatedImportsRuntimeLoadingAndSingleton', diff --git a/apps/lynx-module-federation-demo/test/ios/run.mjs b/apps/lynx-module-federation-demo/test/ios/run.mjs index ba4ae50d7b0..ecda286b24f 100644 --- a/apps/lynx-module-federation-demo/test/ios/run.mjs +++ b/apps/lynx-module-federation-demo/test/ios/run.mjs @@ -149,6 +149,9 @@ try { '-showBuildTimingSummary', '-parallel-testing-enabled', 'NO', + '-test-iterations', + '2', + '-retry-tests-on-failure', '-only-testing:OrbitControlTests', '-only-testing:OrbitControlUITests/OrbitControlUITests/testFederatedImportsRuntimeLoadingAndSingleton', '-only-testing:OrbitControlUITests/OrbitControlUITests/testStandaloneCatalogRemoteBuildLaunches', From 0f1ae1e29d46a480e4c491ff53d35fcadb1448b4 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Wed, 22 Jul 2026 23:31:16 +0000 Subject: [PATCH 46/68] fix(lynx): gate UI on background startup --- .../src/app/App.tsx | 33 +++++++++++++++---- .../test/ios-project.mjs | 9 +++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index 761f03ca1c3..e1c88e09a8d 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -1,4 +1,4 @@ -import { useCallback, useState } from '@lynx-js/react'; +import { useCallback, useEffect, useState } from '@lynx-js/react'; import type { SharedStateView } from '../remote-ui/contracts'; import { type LoadState, useFederatedCatalog } from './useFederatedCatalog'; @@ -19,10 +19,19 @@ const MODULES = [ { name: 'ActivityFeed', path: "loadRemote('catalog/ActivityFeed')" }, ]; -function LoadButton({ state, onTap }: { state: LoadState; onTap: () => void }) { - const disabled = state === 'loading' || state === 'ready'; - const label = - state === 'loading' +function LoadButton({ + interactive, + state, + onTap, +}: { + interactive: boolean; + state: LoadState; + onTap: () => void; +}) { + const disabled = !interactive || state === 'loading' || state === 'ready'; + const label = !interactive + ? 'Starting host…' + : state === 'loading' ? 'Loading catalog…' : state === 'ready' ? 'Catalog connected' @@ -30,7 +39,7 @@ function LoadButton({ state, onTap }: { state: LoadState; onTap: () => void }) { ? 'Retry catalog' : 'Load remote catalog'; const stateClass = - state === 'loading' + !interactive || state === 'loading' ? 'PrimaryAction PrimaryActionLoading' : state === 'ready' ? 'PrimaryAction PrimaryActionReady' @@ -164,6 +173,7 @@ function SingletonProof({ export function App() { const [screen, setScreen] = useState('overview'); + const [backgroundReady, setBackgroundReady] = useState(false); const { ActivityFeedComponent, CardComponent, @@ -181,6 +191,11 @@ export function App() { singletonShared, } = useFederatedCatalog(); + useEffect(() => { + 'background-only'; + setBackgroundReady(true); + }, []); + const selectScreen = useCallback((nextScreen: Screen) => { 'background-only'; setScreen(nextScreen); @@ -227,7 +242,11 @@ export function App() { - + \{\s*'background-only';\s*setBackgroundReady\(true\);/, +); +assert.match(appSource, /interactive=\{backgroundReady\}/); assert.match( viewController, /OrbitResourceFetcher\(\s*rootBundleURL: rootBundleURL\s*\)/, From 65be39196663a1d291a1eed38ac3ae757e8f0200 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Wed, 22 Jul 2026 23:56:22 +0000 Subject: [PATCH 47/68] ci(lynx): persist iOS dependencies before tests --- .github/workflows/e2e-lynx.yml | 16 ++++++++++++++-- .../test/ci-policy.mjs | 8 ++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 1d8f807d4d3..4d4db822228 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -158,8 +158,9 @@ jobs: with: ruby-version: ${{ env.RUBY_VERSION }} - - name: Cache iOS dependencies - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 + - name: Restore iOS dependencies + id: ios-dependency-cache + uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: | ~/.cocoapods/repos/trunk @@ -198,6 +199,17 @@ jobs: bundle install --jobs 4 --retry 3 bundle exec pod install --deployment + - name: Save iOS dependencies + if: steps.ios-dependency-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 + with: + path: | + ~/.cocoapods/repos/trunk + ~/Library/Caches/CocoaPods + apps/lynx-module-federation-demo/ios/Pods + apps/lynx-module-federation-demo/ios/vendor/bundle + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }} + - name: Run standalone iOS federation E2E run: node apps/lynx-module-federation-demo/test/ios/run.mjs diff --git a/apps/lynx-module-federation-demo/test/ci-policy.mjs b/apps/lynx-module-federation-demo/test/ci-policy.mjs index 894939b81c7..766db771bf6 100644 --- a/apps/lynx-module-federation-demo/test/ci-policy.mjs +++ b/apps/lynx-module-federation-demo/test/ci-policy.mjs @@ -31,6 +31,14 @@ assert.match( assert.doesNotMatch(metroWorkflow, /ANDROID_EMULATOR_DISK_SPACE/); assert.doesNotMatch(metroWorkflow, /-partition-size\s+\d+/); assert.match(lynxWorkflow, /run test:ci-policy/); +assert.match( + lynxWorkflow, + /name: Restore iOS dependencies\s+id: ios-dependency-cache\s+uses: actions\/cache\/restore@/, +); +assert.match( + lynxWorkflow, + /name: Save iOS dependencies\s+if: steps\.ios-dependency-cache\.outputs\.cache-hit != 'true'\s+uses: actions\/cache\/save@/, +); for (const script of ['e2e:native:ci', 'e2e:web:ci']) { assert.match(lynxWorkflow, new RegExp(`run ${script}`)); assert.match(localCi, new RegExp(`'${script}'`)); From 29c9275df867d535eb0cc52714e74526a410c499 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 23 Jul 2026 00:14:41 +0000 Subject: [PATCH 48/68] fix(lynx): synchronize first-screen handoff --- apps/lynx-module-federation-demo/lynx.config.mjs | 5 ++++- .../lynx.web.config.mjs | 5 ++++- apps/lynx-module-federation-demo/src/app/App.tsx | 14 +++++++++++++- .../test/ios-project.mjs | 12 ++++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apps/lynx-module-federation-demo/lynx.config.mjs b/apps/lynx-module-federation-demo/lynx.config.mjs index 9297abb2202..8c70cbf8283 100644 --- a/apps/lynx-module-federation-demo/lynx.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.config.mjs @@ -36,7 +36,10 @@ const pluginNativeRemoteAssets = { export default defineConfig({ plugins: [ - pluginReactLynx({ defaultDisplayLinear: false }), + pluginReactLynx({ + defaultDisplayLinear: false, + firstScreenSyncTiming: 'manual', + }), createNativeHostFederationPlugin(nativeManifestUrl), pluginNativeRemoteAssets, pluginQRCode({ fullscreen: true }), diff --git a/apps/lynx-module-federation-demo/lynx.web.config.mjs b/apps/lynx-module-federation-demo/lynx.web.config.mjs index ba8fab01097..b3a003e57bc 100644 --- a/apps/lynx-module-federation-demo/lynx.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.web.config.mjs @@ -12,7 +12,10 @@ const manifestUrl = export default defineConfig({ plugins: [ - pluginReactLynx({ defaultDisplayLinear: false }), + pluginReactLynx({ + defaultDisplayLinear: false, + firstScreenSyncTiming: 'manual', + }), createWebHostFederationPlugin(manifestUrl), ], source: { diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index e1c88e09a8d..1db39a05da2 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -1,4 +1,9 @@ -import { useCallback, useEffect, useState } from '@lynx-js/react'; +import { + markFirstScreenSyncReady, + useCallback, + useEffect, + useState, +} from '@lynx-js/react'; import type { SharedStateView } from '../remote-ui/contracts'; import { type LoadState, useFederatedCatalog } from './useFederatedCatalog'; @@ -196,6 +201,13 @@ export function App() { setBackgroundReady(true); }, []); + useEffect(() => { + 'background-only'; + if (backgroundReady) { + markFirstScreenSyncReady(); + } + }, [backgroundReady]); + const selectScreen = useCallback((nextScreen: Screen) => { 'background-only'; setScreen(nextScreen); diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index 2f66835b671..d982c18f120 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -44,6 +44,8 @@ const [ iosRunner, scheme, urlResolver, + nativeHostConfig, + webHostConfig, ] = await Promise.all([ read('ios/Podfile'), read('ios/Podfile.lock'), @@ -62,6 +64,8 @@ const [ 'ios/OrbitControl.xcodeproj/xcshareddata/xcschemes/OrbitControl.xcscheme', ), read('ios/OrbitControl/OrbitResourceURLResolver.m'), + read('lynx.config.mjs'), + read('lynx.web.config.mjs'), ]); for (const pod of ['Lynx', 'LynxService', 'XElement']) { @@ -102,6 +106,14 @@ assert.match( appSource, /useEffect\(\(\) => \{\s*'background-only';\s*setBackgroundReady\(true\);/, ); +assert.match( + appSource, + /useEffect\(\(\) => \{\s*'background-only';\s*if \(backgroundReady\) \{\s*markFirstScreenSyncReady\(\);\s*\}\s*\}, \[backgroundReady\]\);/, +); +assert.doesNotMatch(appSource, /setTimeout|queueMicrotask/); +for (const hostConfig of [nativeHostConfig, webHostConfig]) { + assert.match(hostConfig, /firstScreenSyncTiming: 'manual'/); +} assert.match(appSource, /interactive=\{backgroundReady\}/); assert.match( viewController, From d441951b9d020c26b04e4d33964fa919a616b044 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 23 Jul 2026 00:29:59 +0000 Subject: [PATCH 49/68] ci(lynx): cache iOS build atomically --- .github/workflows/e2e-lynx.yml | 43 ++++++++----------- .../test/ci-policy.mjs | 20 +++++++-- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index 4d4db822228..b799ddd9593 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -158,8 +158,8 @@ jobs: with: ruby-version: ${{ env.RUBY_VERSION }} - - name: Restore iOS dependencies - id: ios-dependency-cache + - name: Restore iOS build cache + id: ios-build-cache uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: | @@ -167,21 +167,10 @@ jobs: ~/Library/Caches/CocoaPods apps/lynx-module-federation-demo/ios/Pods apps/lynx-module-federation-demo/ios/vendor/bundle - key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }} - restore-keys: | - ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-ruby-${{ env.RUBY_VERSION }}- - - - name: Cache iOS build products - id: ios-build-cache - uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 - with: - path: | apps/lynx-module-federation-demo/ios/build/DerivedData/Build apps/lynx-module-federation-demo/ios/build/DerivedData/ModuleCache.noindex apps/lynx-module-federation-demo/ios/build/DerivedData/SDKStatCaches.noindex - key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-derived-data-xcode-16.4-${{ hashFiles('apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} - restore-keys: | - ${{ runner.os }}-${{ runner.arch }}-lynx-ios-derived-data-xcode-16.4-${{ hashFiles('apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}- + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-build-v2-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} - name: Download native artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 @@ -193,27 +182,25 @@ jobs: run: node apps/lynx-module-federation-demo/scripts/sync-ios-bundle.mjs - name: Install iOS dependencies + if: steps.ios-build-cache.outputs.cache-hit != 'true' working-directory: apps/lynx-module-federation-demo/ios run: | bundle config set path vendor/bundle bundle install --jobs 4 --retry 3 bundle exec pod install --deployment - - name: Save iOS dependencies - if: steps.ios-dependency-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 - with: - path: | - ~/.cocoapods/repos/trunk - ~/Library/Caches/CocoaPods - apps/lynx-module-federation-demo/ios/Pods - apps/lynx-module-federation-demo/ios/vendor/bundle - key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }} + - name: Validate cached iOS dependencies + if: steps.ios-build-cache.outputs.cache-hit == 'true' + working-directory: apps/lynx-module-federation-demo/ios + run: | + bundle config set path vendor/bundle + bundle check + cmp Podfile.lock Pods/Manifest.lock - name: Run standalone iOS federation E2E run: node apps/lynx-module-federation-demo/test/ios/run.mjs - - name: Save iOS build products + - name: Save iOS build cache if: >- always() && steps.ios-build-cache.outputs.cache-hit != 'true' && @@ -221,10 +208,14 @@ jobs: uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5 with: path: | + ~/.cocoapods/repos/trunk + ~/Library/Caches/CocoaPods + apps/lynx-module-federation-demo/ios/Pods + apps/lynx-module-federation-demo/ios/vendor/bundle apps/lynx-module-federation-demo/ios/build/DerivedData/Build apps/lynx-module-federation-demo/ios/build/DerivedData/ModuleCache.noindex apps/lynx-module-federation-demo/ios/build/DerivedData/SDKStatCaches.noindex - key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-derived-data-xcode-16.4-${{ hashFiles('apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-build-v2-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} - name: Upload iOS E2E evidence if: success() diff --git a/apps/lynx-module-federation-demo/test/ci-policy.mjs b/apps/lynx-module-federation-demo/test/ci-policy.mjs index 766db771bf6..1ac9cbe42c9 100644 --- a/apps/lynx-module-federation-demo/test/ci-policy.mjs +++ b/apps/lynx-module-federation-demo/test/ci-policy.mjs @@ -31,14 +31,26 @@ assert.match( assert.doesNotMatch(metroWorkflow, /ANDROID_EMULATOR_DISK_SPACE/); assert.doesNotMatch(metroWorkflow, /-partition-size\s+\d+/); assert.match(lynxWorkflow, /run test:ci-policy/); +const lynxIosJob = lynxWorkflow.slice(lynxWorkflow.indexOf(' e2e-lynx-ios:')); assert.match( - lynxWorkflow, - /name: Restore iOS dependencies\s+id: ios-dependency-cache\s+uses: actions\/cache\/restore@/, + lynxIosJob, + /name: Restore iOS build cache\s+id: ios-build-cache\s+uses: actions\/cache\/restore@/, ); assert.match( - lynxWorkflow, - /name: Save iOS dependencies\s+if: steps\.ios-dependency-cache\.outputs\.cache-hit != 'true'\s+uses: actions\/cache\/save@/, + lynxIosJob, + /name: Install iOS dependencies\s+if: steps\.ios-build-cache\.outputs\.cache-hit != 'true'/, ); +assert.match( + lynxIosJob, + /name: Validate cached iOS dependencies\s+if: steps\.ios-build-cache\.outputs\.cache-hit == 'true'/, +); +assert.match( + lynxIosJob, + /name: Save iOS build cache[\s\S]*?uses: actions\/cache\/save@/, +); +assert.match(lynxIosJob, /lynx-ios-build-v2-/); +assert.match(lynxIosJob, /ios\/Pods[\s\S]*?ios\/build\/DerivedData\/Build/); +assert.doesNotMatch(lynxIosJob, /restore-keys:/); for (const script of ['e2e:native:ci', 'e2e:web:ci']) { assert.match(lynxWorkflow, new RegExp(`run ${script}`)); assert.match(localCi, new RegExp(`'${script}'`)); From 682af3016690a42d51031c04a4da2657d782e06d Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 23 Jul 2026 01:07:13 +0000 Subject: [PATCH 50/68] fix(lynx): release manual first-screen handoff --- apps/lynx-module-federation-demo/src/app/App.tsx | 8 +------- apps/lynx-module-federation-demo/test/ios-project.mjs | 3 ++- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index 1db39a05da2..e182f45675f 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -199,15 +199,9 @@ export function App() { useEffect(() => { 'background-only'; setBackgroundReady(true); + markFirstScreenSyncReady(); }, []); - useEffect(() => { - 'background-only'; - if (backgroundReady) { - markFirstScreenSyncReady(); - } - }, [backgroundReady]); - const selectScreen = useCallback((nextScreen: Screen) => { 'background-only'; setScreen(nextScreen); diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index d982c18f120..b870d008a77 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -108,8 +108,9 @@ assert.match( ); assert.match( appSource, - /useEffect\(\(\) => \{\s*'background-only';\s*if \(backgroundReady\) \{\s*markFirstScreenSyncReady\(\);\s*\}\s*\}, \[backgroundReady\]\);/, + /useEffect\(\(\) => \{\s*'background-only';\s*setBackgroundReady\(true\);\s*markFirstScreenSyncReady\(\);\s*\}, \[\]\);/, ); +assert.doesNotMatch(appSource, /\}, \[backgroundReady\]\);/); assert.doesNotMatch(appSource, /setTimeout|queueMicrotask/); for (const hostConfig of [nativeHostConfig, webHostConfig]) { assert.match(hostConfig, /firstScreenSyncTiming: 'manual'/); From 52e07ad31ad5fde7545c845a7130141e31c564ab Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 23 Jul 2026 01:19:32 +0000 Subject: [PATCH 51/68] fix(lynx-ci): cache generated iOS workspace --- .github/workflows/e2e-lynx.yml | 7 +++++-- .../test/ci-policy.mjs | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-lynx.yml b/.github/workflows/e2e-lynx.yml index b799ddd9593..cb5eae8e8ad 100644 --- a/.github/workflows/e2e-lynx.yml +++ b/.github/workflows/e2e-lynx.yml @@ -166,11 +166,12 @@ jobs: ~/.cocoapods/repos/trunk ~/Library/Caches/CocoaPods apps/lynx-module-federation-demo/ios/Pods + apps/lynx-module-federation-demo/ios/OrbitControl.xcworkspace apps/lynx-module-federation-demo/ios/vendor/bundle apps/lynx-module-federation-demo/ios/build/DerivedData/Build apps/lynx-module-federation-demo/ios/build/DerivedData/ModuleCache.noindex apps/lynx-module-federation-demo/ios/build/DerivedData/SDKStatCaches.noindex - key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-build-v2-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-build-v3-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} - name: Download native artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 @@ -196,6 +197,7 @@ jobs: bundle config set path vendor/bundle bundle check cmp Podfile.lock Pods/Manifest.lock + test -f OrbitControl.xcworkspace/contents.xcworkspacedata - name: Run standalone iOS federation E2E run: node apps/lynx-module-federation-demo/test/ios/run.mjs @@ -211,11 +213,12 @@ jobs: ~/.cocoapods/repos/trunk ~/Library/Caches/CocoaPods apps/lynx-module-federation-demo/ios/Pods + apps/lynx-module-federation-demo/ios/OrbitControl.xcworkspace apps/lynx-module-federation-demo/ios/vendor/bundle apps/lynx-module-federation-demo/ios/build/DerivedData/Build apps/lynx-module-federation-demo/ios/build/DerivedData/ModuleCache.noindex apps/lynx-module-federation-demo/ios/build/DerivedData/SDKStatCaches.noindex - key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-build-v2-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} + key: ${{ runner.os }}-${{ runner.arch }}-lynx-ios-build-v3-xcode-16.4-ruby-${{ env.RUBY_VERSION }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/Gemfile', 'apps/lynx-module-federation-demo/ios/Gemfile.lock', 'apps/lynx-module-federation-demo/ios/Podfile', 'apps/lynx-module-federation-demo/ios/Podfile.lock') }}-${{ hashFiles('apps/lynx-module-federation-demo/ios/OrbitControl.xcodeproj/project.pbxproj') }} - name: Upload iOS E2E evidence if: success() diff --git a/apps/lynx-module-federation-demo/test/ci-policy.mjs b/apps/lynx-module-federation-demo/test/ci-policy.mjs index 1ac9cbe42c9..840fd5bbcae 100644 --- a/apps/lynx-module-federation-demo/test/ci-policy.mjs +++ b/apps/lynx-module-federation-demo/test/ci-policy.mjs @@ -48,8 +48,19 @@ assert.match( lynxIosJob, /name: Save iOS build cache[\s\S]*?uses: actions\/cache\/save@/, ); -assert.match(lynxIosJob, /lynx-ios-build-v2-/); -assert.match(lynxIosJob, /ios\/Pods[\s\S]*?ios\/build\/DerivedData\/Build/); +assert.match(lynxIosJob, /lynx-ios-build-v3-/); +for (const action of ['Restore', 'Save']) { + assert.match( + lynxIosJob, + new RegExp( + `name: ${action} iOS build cache[\\s\\S]*?path: \\|[\\s\\S]*?ios/Pods[\\s\\S]*?ios/OrbitControl\\.xcworkspace[\\s\\S]*?ios/build/DerivedData/Build`, + ), + ); +} +assert.match( + lynxIosJob, + /cmp Podfile\.lock Pods\/Manifest\.lock\s+test -f OrbitControl\.xcworkspace\/contents\.xcworkspacedata/, +); assert.doesNotMatch(lynxIosJob, /restore-keys:/); for (const script of ['e2e:native:ci', 'e2e:web:ci']) { assert.match(lynxWorkflow, new RegExp(`run ${script}`)); From a38efd0c7d043cf70571c3ffa017b3431c704bea Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 23 Jul 2026 02:09:24 +0000 Subject: [PATCH 52/68] fix(lynx): use built-in js-ready handoff --- apps/lynx-module-federation-demo/lynx.config.mjs | 2 +- apps/lynx-module-federation-demo/lynx.web.config.mjs | 2 +- apps/lynx-module-federation-demo/src/app/App.tsx | 8 +------- apps/lynx-module-federation-demo/test/ios-project.mjs | 10 ++++++---- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/apps/lynx-module-federation-demo/lynx.config.mjs b/apps/lynx-module-federation-demo/lynx.config.mjs index 8c70cbf8283..c4af26fa792 100644 --- a/apps/lynx-module-federation-demo/lynx.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.config.mjs @@ -38,7 +38,7 @@ export default defineConfig({ plugins: [ pluginReactLynx({ defaultDisplayLinear: false, - firstScreenSyncTiming: 'manual', + firstScreenSyncTiming: 'jsReady', }), createNativeHostFederationPlugin(nativeManifestUrl), pluginNativeRemoteAssets, diff --git a/apps/lynx-module-federation-demo/lynx.web.config.mjs b/apps/lynx-module-federation-demo/lynx.web.config.mjs index b3a003e57bc..8e3e37ef7d9 100644 --- a/apps/lynx-module-federation-demo/lynx.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.web.config.mjs @@ -14,7 +14,7 @@ export default defineConfig({ plugins: [ pluginReactLynx({ defaultDisplayLinear: false, - firstScreenSyncTiming: 'manual', + firstScreenSyncTiming: 'jsReady', }), createWebHostFederationPlugin(manifestUrl), ], diff --git a/apps/lynx-module-federation-demo/src/app/App.tsx b/apps/lynx-module-federation-demo/src/app/App.tsx index e182f45675f..e1c88e09a8d 100644 --- a/apps/lynx-module-federation-demo/src/app/App.tsx +++ b/apps/lynx-module-federation-demo/src/app/App.tsx @@ -1,9 +1,4 @@ -import { - markFirstScreenSyncReady, - useCallback, - useEffect, - useState, -} from '@lynx-js/react'; +import { useCallback, useEffect, useState } from '@lynx-js/react'; import type { SharedStateView } from '../remote-ui/contracts'; import { type LoadState, useFederatedCatalog } from './useFederatedCatalog'; @@ -199,7 +194,6 @@ export function App() { useEffect(() => { 'background-only'; setBackgroundReady(true); - markFirstScreenSyncReady(); }, []); const selectScreen = useCallback((nextScreen: Screen) => { diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index b870d008a77..b7be69bbe8c 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -108,12 +108,14 @@ assert.match( ); assert.match( appSource, - /useEffect\(\(\) => \{\s*'background-only';\s*setBackgroundReady\(true\);\s*markFirstScreenSyncReady\(\);\s*\}, \[\]\);/, + /useEffect\(\(\) => \{\s*'background-only';\s*setBackgroundReady\(true\);\s*\}, \[\]\);/, +); +assert.doesNotMatch( + appSource, + /markFirstScreenSyncReady|setTimeout|queueMicrotask/, ); -assert.doesNotMatch(appSource, /\}, \[backgroundReady\]\);/); -assert.doesNotMatch(appSource, /setTimeout|queueMicrotask/); for (const hostConfig of [nativeHostConfig, webHostConfig]) { - assert.match(hostConfig, /firstScreenSyncTiming: 'manual'/); + assert.match(hostConfig, /firstScreenSyncTiming: 'jsReady'/); } assert.match(appSource, /interactive=\{backgroundReady\}/); assert.match( From 9081f2d71c45b1c441941ac7a559ed792dfd3406 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Thu, 23 Jul 2026 05:06:37 +0000 Subject: [PATCH 53/68] fix(lynx): complete public lazy bundle transport --- apps/lynx-module-federation-demo/README.md | 14 + .../federation.config.mjs | 1 + .../lynx.catalog.native.config.mjs | 5 +- .../lynx.catalog.web.config.mjs | 7 +- .../lynx.config.mjs | 1 + .../lynx.remote.native.config.mjs | 1 + .../lynx.remote.web.config.mjs | 1 + .../lynx.web.config.mjs | 1 + apps/lynx-module-federation-demo/package.json | 2 +- .../test/ios-project.mjs | 18 + .../test/native-artifacts.mjs | 30 +- .../test/real-web/run.mjs | 23 + package.json | 9 +- packages/lynx/src/plugin.remoteBundle.test.ts | 23 + packages/lynx/src/plugin.ts | 9 + packages/lynx/src/remoteBundle.ts | 18 +- packages/lynx/src/runtimeChunkLoading.ts | 25 +- packages/lynx/src/runtimeChunkUrl.test.ts | 19 +- packages/lynx/src/runtimeCore.ts | 6 +- packages/lynx/src/runtimeEntryLoader.ts | 89 ++- .../lynx/src/runtimeLazyBundleLoading.test.ts | 4 + packages/lynx/src/runtimePlugin.test.ts | 83 ++- packages/lynx/src/runtimePlugin.ts | 33 + patches/@lynx-js__react@0.123.0.patch | 84 +++ ...x-js__template-webpack-plugin@0.13.0.patch | 230 ++++++ patches/@lynx-js__web-core@0.22.2.patch | 699 ++++++++++++++++++ pnpm-lock.yaml | 133 ++-- 27 files changed, 1441 insertions(+), 127 deletions(-) create mode 100644 patches/@lynx-js__react@0.123.0.patch create mode 100644 patches/@lynx-js__template-webpack-plugin@0.13.0.patch create mode 100644 patches/@lynx-js__web-core@0.22.2.patch diff --git a/apps/lynx-module-federation-demo/README.md b/apps/lynx-module-federation-demo/README.md index 3fe4b397cda..bed047b20cc 100644 --- a/apps/lynx-module-federation-demo/README.md +++ b/apps/lynx-module-federation-demo/README.md @@ -59,6 +59,14 @@ the canary package. Remove the wrapper when Rspeedy supports the repository's Rspack package directly; then point those package scripts back to the public Rspeedy CLI and remove the canary alias together. +The repository also applies version-scoped pnpm patches to the published +ReactLynx, template plugin, and Web Core packages. They contain the fixes from +[lynx-family/lynx-stack#3043](https://github.com/lynx-family/lynx-stack/pull/3043) +needed by the public `FetchBundle` transport. The Web Core patch is built from +the matching `0.22.2` source baseline, so its JavaScript keeps the WASM asset +names shipped by that package. Remove all three patches together after those +upstream fixes are released. + ## Run the standalone Catalog product The Catalog directly renders `Card`, `Details`, and `ActivityFeed` from the @@ -89,6 +97,12 @@ and loads its singleton provider from a host `lazy-bundle/*.bundle` before application startup. The remote's `import: false` consumer then reuses that initialized background-realm singleton. +Every ReactLynx build targets engine 3.9. That selects ReactLynx's public +`FetchBundle` and `loadScript` lazy-bundle transport, which can resolve the +host's non-eager startup share before the first render. Both host builds use +the built-in `jsReady` first-screen handoff; no private or manual readiness API +is involved. + `src/app/staticCard.ts` is the standard asynchronous bootstrap boundary. It contains a module-scope static `import * as card from 'catalog/Card'`; importing that local boundary asynchronously delays evaluation without replacing the diff --git a/apps/lynx-module-federation-demo/federation.config.mjs b/apps/lynx-module-federation-demo/federation.config.mjs index 46fd18ec9ba..b48cd81cc22 100644 --- a/apps/lynx-module-federation-demo/federation.config.mjs +++ b/apps/lynx-module-federation-demo/federation.config.mjs @@ -97,6 +97,7 @@ export const createNativeRemoteFederationPlugin = () => pluginLynxModuleFederation(createRemoteOptions(), { environment: 'lynx', remoteBundle: { + engineVersion: '3.9', target: 'lynx', filename: 'catalog.native.lynx.bundle', preserveSourceEntryBundles: false, diff --git a/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs b/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs index 600a95d4a1e..e97860e26ef 100644 --- a/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.catalog.native.config.mjs @@ -9,7 +9,10 @@ const catalogDevPort = Number(process.env.CATALOG_DEV_PORT ?? 3001); export default defineConfig({ plugins: [ - pluginReactLynx({ defaultDisplayLinear: false }), + pluginReactLynx({ + defaultDisplayLinear: false, + engineVersion: '3.9', + }), pluginQRCode({ fullscreen: true }), ], source: { diff --git a/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs b/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs index ee42e79225e..c9f49654450 100644 --- a/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.catalog.web.config.mjs @@ -4,7 +4,12 @@ import { defineConfig } from '@lynx-js/rspeedy'; import { resolveAliases, resolveOutputRoot } from './federation.config.mjs'; export default defineConfig({ - plugins: [pluginReactLynx({ defaultDisplayLinear: false })], + plugins: [ + pluginReactLynx({ + defaultDisplayLinear: false, + engineVersion: '3.9', + }), + ], source: { entry: { main: './src/catalog-app/index.tsx', diff --git a/apps/lynx-module-federation-demo/lynx.config.mjs b/apps/lynx-module-federation-demo/lynx.config.mjs index c4af26fa792..016760cd2fc 100644 --- a/apps/lynx-module-federation-demo/lynx.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.config.mjs @@ -38,6 +38,7 @@ export default defineConfig({ plugins: [ pluginReactLynx({ defaultDisplayLinear: false, + engineVersion: '3.9', firstScreenSyncTiming: 'jsReady', }), createNativeHostFederationPlugin(nativeManifestUrl), diff --git a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs index 44420e789c6..600fa2ecfd8 100644 --- a/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.remote.native.config.mjs @@ -15,6 +15,7 @@ export default defineConfig({ plugins: [ pluginReactLynx({ defaultDisplayLinear: false, + engineVersion: '3.9', experimental_isLazyBundle: true, }), createNativeRemoteFederationPlugin(), diff --git a/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs b/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs index d649a87e49a..52362ffda44 100644 --- a/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.remote.web.config.mjs @@ -11,6 +11,7 @@ export default defineConfig({ plugins: [ pluginReactLynx({ defaultDisplayLinear: false, + engineVersion: '3.9', experimental_isLazyBundle: true, }), createWebRemoteFederationPlugin(), diff --git a/apps/lynx-module-federation-demo/lynx.web.config.mjs b/apps/lynx-module-federation-demo/lynx.web.config.mjs index 8e3e37ef7d9..75c6795a4f4 100644 --- a/apps/lynx-module-federation-demo/lynx.web.config.mjs +++ b/apps/lynx-module-federation-demo/lynx.web.config.mjs @@ -14,6 +14,7 @@ export default defineConfig({ plugins: [ pluginReactLynx({ defaultDisplayLinear: false, + engineVersion: '3.9', firstScreenSyncTiming: 'jsReady', }), createWebHostFederationPlugin(manifestUrl), diff --git a/apps/lynx-module-federation-demo/package.json b/apps/lynx-module-federation-demo/package.json index 81938f6e223..a1176211c39 100644 --- a/apps/lynx-module-federation-demo/package.json +++ b/apps/lynx-module-federation-demo/package.json @@ -51,7 +51,7 @@ "@lynx-js/react-rsbuild-plugin": "0.18.0", "@lynx-js/rspeedy": "0.16.0", "@lynx-js/types": "4.0.0", - "@lynx-js/web-core": "https://pkg.pr.new/@lynx-js/web-core@4cc0608b488a9bf35093936fd9d0e6589a1c161c", + "@lynx-js/web-core": "0.22.2", "@lynx-js/web-elements": "0.12.6", "@module-federation/lynx": "workspace:*", "@module-federation/runtime-tools": "workspace:*", diff --git a/apps/lynx-module-federation-demo/test/ios-project.mjs b/apps/lynx-module-federation-demo/test/ios-project.mjs index b7be69bbe8c..28a8873c692 100644 --- a/apps/lynx-module-federation-demo/test/ios-project.mjs +++ b/apps/lynx-module-federation-demo/test/ios-project.mjs @@ -46,6 +46,10 @@ const [ urlResolver, nativeHostConfig, webHostConfig, + nativeCatalogConfig, + webCatalogConfig, + nativeRemoteConfig, + webRemoteConfig, ] = await Promise.all([ read('ios/Podfile'), read('ios/Podfile.lock'), @@ -66,6 +70,10 @@ const [ read('ios/OrbitControl/OrbitResourceURLResolver.m'), read('lynx.config.mjs'), read('lynx.web.config.mjs'), + read('lynx.catalog.native.config.mjs'), + read('lynx.catalog.web.config.mjs'), + read('lynx.remote.native.config.mjs'), + read('lynx.remote.web.config.mjs'), ]); for (const pod of ['Lynx', 'LynxService', 'XElement']) { @@ -117,6 +125,16 @@ assert.doesNotMatch( for (const hostConfig of [nativeHostConfig, webHostConfig]) { assert.match(hostConfig, /firstScreenSyncTiming: 'jsReady'/); } +for (const config of [ + nativeHostConfig, + webHostConfig, + nativeCatalogConfig, + webCatalogConfig, + nativeRemoteConfig, + webRemoteConfig, +]) { + assert.match(config, /engineVersion: '3\.9'/); +} assert.match(appSource, /interactive=\{backgroundReady\}/); assert.match( viewController, diff --git a/apps/lynx-module-federation-demo/test/native-artifacts.mjs b/apps/lynx-module-federation-demo/test/native-artifacts.mjs index bbf2d58a4aa..65b852482a0 100644 --- a/apps/lynx-module-federation-demo/test/native-artifacts.mjs +++ b/apps/lynx-module-federation-demo/test/native-artifacts.mjs @@ -89,15 +89,18 @@ const [hostBundleSource, standaloneSource, remoteBundleSource] = const hostTemplate = decodeTemplate(hostBundleSource); const standaloneTemplate = decodeTemplate(standaloneSource); const remoteTemplate = decodeTemplate(remoteBundleSource); +assert.equal(hostTemplate['engine-version'], '3.9'); assert.equal(standaloneTemplate['app-type'], 'card'); +assert.equal(standaloneTemplate['engine-version'], '3.9'); assert.equal(remoteTemplate['app-type'], 'DynamicComponent'); -assert.equal(remoteTemplate['engine-version'], '3.7'); +assert.equal(remoteTemplate['engine-version'], '3.9'); assert.deepEqual(Object.keys(remoteTemplate['custom-sections']), ['catalog']); const hostBackgroundSource = hostTemplate['background-thread-script'] .map(({ content }) => content) .join('\n'); assert.ok(hostBackgroundSource.includes('mfAsyncStartup')); assert.ok(hostBackgroundSource.includes('lynx_aci')); +assert.ok(hostBackgroundSource.includes('fetchBundle')); assert.ok(hostBackgroundSource.includes(nativeHostAssetPrefix)); for (const name of hostLazyBundles) { @@ -105,7 +108,11 @@ for (const name of hostLazyBundles) { await readFile(path.join(appRoot, 'dist/host-native/lazy-bundle', name)), ); assert.equal(lazyTemplate['app-type'], 'DynamicComponent', name); - assert.ok(lazyTemplate['background-thread-script']?.length > 0, name); + assert.equal( + typeof lazyTemplate['custom-sections']?.background, + 'string', + name, + ); } const manifest = JSON.parse(manifestSource); @@ -149,13 +156,14 @@ for (const exposed of manifest.exposes) { assert.ok(lazyStat.isFile() && lazyStat.size > 1_000, lazyPath); const lazyTemplate = decodeTemplate(await readFile(lazyPath)); assert.equal(lazyTemplate['app-type'], 'DynamicComponent', lazyName); - assert.ok( - lazyTemplate['background-thread-script']?.length > 0, - `${lazyName} has no background script`, + assert.equal( + typeof lazyTemplate['custom-sections']?.background, + 'string', + `${lazyName} has no background section`, ); assert.ok( - lazyTemplate['main-thread-script']?.lepus_code_len > 100, - `${lazyName} has no main-thread snapshot bytecode`, + lazyTemplate['custom-sections']?.['main-thread']?.length > 100, + `${lazyName} has no main-thread snapshot section`, ); assert.ok( !JSON.stringify(exposed).includes('__main_thread'), @@ -169,11 +177,11 @@ const nestedTemplate = decodeTemplate( ), ); assert.equal(nestedTemplate['app-type'], 'DynamicComponent'); +const nestedBackgroundSource = nestedTemplate['background-thread-script'] + .map(({ content }) => content) + .join('\n'); assert.ok( - nestedTemplate['background-thread-script'] - ?.map(({ content }) => content) - .join('\n') - .includes('Nested federated module ready'), + nestedBackgroundSource.includes('Nested federated module ready'), `${nestedLazyBundle} does not contain the nested module`, ); diff --git a/apps/lynx-module-federation-demo/test/real-web/run.mjs b/apps/lynx-module-federation-demo/test/real-web/run.mjs index 0814fdefb2b..2efebb343ce 100644 --- a/apps/lynx-module-federation-demo/test/real-web/run.mjs +++ b/apps/lynx-module-federation-demo/test/real-web/run.mjs @@ -443,6 +443,28 @@ try { `Real Lynx Web E2E passed for Orbit and standalone Catalog at ${baseUrl} (${requests.length} requests)\n`, ); } catch (error) { + const frameDiagnostics = failurePage + ? await Promise.all( + failurePage.frames().map(async (frame) => { + try { + return await frame.evaluate(() => ({ + processEvalResultHosts: Object.keys( + globalThis.processEvalResultByHost ?? {}, + ), + url: location.href, + })); + } catch (frameError) { + return { + error: + frameError instanceof Error + ? frameError.message + : String(frameError), + url: frame.url(), + }; + } + }), + ) + : []; if (failurePage) { await mkdir(path.dirname(screenshotPath), { recursive: true }); await failurePage.screenshot({ path: screenshotPath, fullPage: true }); @@ -453,6 +475,7 @@ try { `Failure screenshot: ${screenshotPath}`, `Page errors: ${JSON.stringify(pageErrors)}`, `Console errors: ${JSON.stringify(consoleErrors)}`, + `Frame diagnostics: ${JSON.stringify(frameDiagnostics)}`, `Requests: ${JSON.stringify(requests)}`, ].join('\n'), { cause: error }, diff --git a/package.json b/package.json index 8888d5f1efd..a0985823d82 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ }, "overrides": { "@changesets/assemble-release-plan": "workspace:*", - "@lynx-js/template-webpack-plugin": "https://pkg.pr.new/@lynx-js/template-webpack-plugin@4cc0608b488a9bf35093936fd9d0e6589a1c161c", + "@lynx-js/template-webpack-plugin": "0.13.0", "ajv": "8.18.0", "eslint>ajv": "6.14.0", "@eslint/eslintrc>ajv": "6.14.0", @@ -164,7 +164,12 @@ "msw", "sharp", "unrs-resolver" - ] + ], + "patchedDependencies": { + "@lynx-js/react@0.123.0": "patches/@lynx-js__react@0.123.0.patch", + "@lynx-js/template-webpack-plugin@0.13.0": "patches/@lynx-js__template-webpack-plugin@0.13.0.patch", + "@lynx-js/web-core@0.22.2": "patches/@lynx-js__web-core@0.22.2.patch" + } }, "dependencies": { "adm-zip": "0.6.0", diff --git a/packages/lynx/src/plugin.remoteBundle.test.ts b/packages/lynx/src/plugin.remoteBundle.test.ts index 2889c767fc6..5661d59c0de 100644 --- a/packages/lynx/src/plugin.remoteBundle.test.ts +++ b/packages/lynx/src/plugin.remoteBundle.test.ts @@ -284,6 +284,11 @@ describe('pluginLynxModuleFederation remote bundles', () => { expect.any(Object), {}, ); + const mainThreadContainerSource = emitAsset.mock.calls[0][1].source(); + expect(mainThreadContainerSource).toContain( + 'globalThis.processEvalResultByHost', + ); + expect(mainThreadContainerSource).toContain('__webpack_require__.C(chunk)'); }); it('configures cache events through the public chain slot for remote bundles', async () => { @@ -302,6 +307,24 @@ describe('pluginLynxModuleFederation remote bundles', () => { expect(cacheEventsUse[1][0].setupListTransformer(['event'])).toEqual([]); }); + it('replaces the late Rspeedy cache-events plugin for remote bundles', async () => { + const { modifyRspackConfig } = setupPlugin( + { name: 'catalog', exposes: { './Card': './src/Card' } }, + { remoteBundle: { target: 'web' } }, + ); + const original = new LynxCacheEventsPlugin(); + + const config = await modifyRspackConfig({ plugins: [original] }, 'web'); + const configured = config.plugins.find( + (plugin: unknown) => plugin instanceof LynxCacheEventsPlugin, + ) as unknown as { + options: { setupListTransformer(setups: string[]): string[] }; + }; + + expect(configured).not.toBe(original); + expect(configured.options.setupListTransformer(['event'])).toEqual([]); + }); + it('does not override cache events for hosts', async () => { const { bundlerPluginUses, modifyBundlerChain } = setupPlugin({ name: 'host', diff --git a/packages/lynx/src/plugin.ts b/packages/lynx/src/plugin.ts index 7185962a982..09456e7ab30 100644 --- a/packages/lynx/src/plugin.ts +++ b/packages/lynx/src/plugin.ts @@ -143,6 +143,15 @@ export const pluginLynxModuleFederation = ( experiments.layers ??= true; if (remoteBundle) { + const { LynxCacheEventsPlugin } = + await import('@lynx-js/cache-events-webpack-plugin'); + config.plugins = config.plugins?.map((plugin) => + plugin && + typeof plugin === 'object' && + plugin.constructor.name === LynxCacheEventsPlugin.name + ? new LynxCacheEventsPlugin({ setupListTransformer: () => [] }) + : plugin, + ); await configureRemoteBundle( config as unknown as Configuration, options, diff --git a/packages/lynx/src/remoteBundle.ts b/packages/lynx/src/remoteBundle.ts index 838c65a73df..0d9fae5d313 100644 --- a/packages/lynx/src/remoteBundle.ts +++ b/packages/lynx/src/remoteBundle.ts @@ -277,6 +277,19 @@ const getBackgroundRemoteChunks = ( return included; }; +const mainThreadChunkInstaller = ` +globalThis.processEvalResult = (globalThis.processEvalResultByHost || (globalThis.processEvalResultByHost = {}))[globDynamicComponentEntry] = function (result, schema) { + var chunk = result && result(schema); + if (chunk && chunk.ids && chunk.modules) { + __webpack_require__.C(chunk); + for (var moduleId in chunk.modules) { + __webpack_require__(moduleId); + } + } + return chunk; +}; +`; + const createRemoteAssetsPlugin = ( stateStore: ReturnType, backgroundEntry: string, @@ -348,7 +361,10 @@ const createRemoteAssetsPlugin = ( } compilation.emitAsset( mainThreadEntry, - entryAsset.source, + new compiler.webpack.sources.ConcatSource( + entryAsset.source, + mainThreadChunkInstaller, + ), entryAsset.info, ); state.pairedBundleChunks.add(mainThreadEntry); diff --git a/packages/lynx/src/runtimeChunkLoading.ts b/packages/lynx/src/runtimeChunkLoading.ts index 6730027ed51..05edfc723c1 100644 --- a/packages/lynx/src/runtimeChunkLoading.ts +++ b/packages/lynx/src/runtimeChunkLoading.ts @@ -211,13 +211,23 @@ const loadQueryComponent = ( request: string, lynx: NonNullable>, globalObject: LynxGlobal, + hostOverride?: string, ): PromiseLike => { + const host = + hostOverride ?? + (typeof globalObject.globDynamicComponentEntry === 'string' + ? globalObject.globDynamicComponentEntry + : undefined); if (typeof lynx.loadLazyBundle === 'function') { - return lynx.loadLazyBundle(request); + return host === undefined + ? lynx.loadLazyBundle(request) + : lynx.loadLazyBundle(request, undefined, host); } const nativeLynx = lynx.getNativeLynx?.(); if (typeof nativeLynx?.loadLazyBundle === 'function') { - return nativeLynx.loadLazyBundle(request); + return host === undefined + ? nativeLynx.loadLazyBundle(request) + : nativeLynx.loadLazyBundle(request, undefined, host); } if (getLynxRealm(lynx) === 'main-thread') { @@ -334,12 +344,11 @@ export const patchLynxChunkLoading = ( : webpackRequire.lynx_aci?.[key]; if (lazyBundlePath) { const currentRegistry = globalObject[LYNX_BUNDLE_REGISTRY]; - const remoteOrigin = + const loadingHost = registeredRemoteOrigin ?? - currentRegistry?.get(getRemoteOriginKey(baseName)) ?? - getBundleName() ?? - webpackRequire.p ?? - ''; + currentRegistry?.get(getRemoteOriginKey(baseName)); + const remoteOrigin = + loadingHost ?? getBundleName() ?? webpackRequire.p ?? ''; const request = joinRemoteUrl( remoteOrigin, webpackRequire.lynx_public_path_auto ? undefined : webpackRequire.p, @@ -350,7 +359,7 @@ export const patchLynxChunkLoading = ( installedChunks, timeout, loadQueryComponent: (lazyRequest) => - loadQueryComponent(lazyRequest, lynx, globalObject), + loadQueryComponent(lazyRequest, lynx, globalObject, loadingHost), isChunk, installChunkAfterConsumes: (chunk, isCurrent) => installChunkAfterConsumes( diff --git a/packages/lynx/src/runtimeChunkUrl.test.ts b/packages/lynx/src/runtimeChunkUrl.test.ts index 6b56b2b3198..976d880974d 100644 --- a/packages/lynx/src/runtimeChunkUrl.test.ts +++ b/packages/lynx/src/runtimeChunkUrl.test.ts @@ -58,6 +58,7 @@ describe('patchLynxChunkLoading chunk URLs', () => { })); const registry = remoteRegistry(); const globalObject = { + globDynamicComponentEntry: '__Card__', lynx: { loadLazyBundle, loadScript: rs.fn() }, [LYNX_BUNDLE_REGISTRY]: registry, }; @@ -73,6 +74,8 @@ describe('patchLynxChunkLoading chunk URLs', () => { expect(loadLazyBundle).toHaveBeenCalledWith( 'https://cdn.example/remotes/async/Card.bundle', + undefined, + 'https://cdn.example/remotes/catalog.lynx.bundle', ); }); @@ -89,6 +92,8 @@ describe('patchLynxChunkLoading chunk URLs', () => { modules: { factory }, })); const globalObject = { + globDynamicComponentEntry: + 'https://cdn.example/remotes/catalog.lynx.bundle', lynx: { loadLazyBundle, loadScript }, [LYNX_BUNDLE_REGISTRY]: new Map([ ['remote', 'https://cdn.example/cache/catalog.lynx.bundle'], @@ -106,6 +111,8 @@ describe('patchLynxChunkLoading chunk URLs', () => { await expect(Promise.all(promises)).resolves.toBeDefined(); expect(loadLazyBundle).toHaveBeenCalledWith( 'https://cdn.example/remote-assets/async/catalog__background_Card.123.bundle', + undefined, + 'https://cdn.example/remotes/catalog.lynx.bundle', ); expect(loadScript).not.toHaveBeenCalled(); expect(webpackRequire.m.factory).toBe(factory); @@ -140,12 +147,10 @@ describe('patchLynxChunkLoading chunk URLs', () => { assetRequire.f.j!('feature', assetPromises); await Promise.all(assetPromises); - expect(loadLazyBundle).toHaveBeenNthCalledWith( - 1, + expect(loadLazyBundle.mock.calls[0]?.[0]).toBe( '//cdn.example/assets/async/Card.bundle', ); - expect(loadLazyBundle).toHaveBeenNthCalledWith( - 2, + expect(loadLazyBundle.mock.calls[1]?.[0]).toBe( '//assets.example/chunks/Card.bundle', ); }); @@ -214,7 +219,7 @@ describe('patchLynxChunkLoading chunk URLs', () => { webpackRequire.f.j!('feature', promises); await Promise.all(promises); - expect(loadLazyBundle).toHaveBeenCalledWith(expected); + expect(loadLazyBundle.mock.calls[0]?.[0]).toBe(expected); }, ); @@ -244,7 +249,7 @@ describe('patchLynxChunkLoading chunk URLs', () => { webpackRequire.f.j!('feature', promises); await Promise.all(promises); - expect(loadLazyBundle).toHaveBeenCalledWith( + expect(loadLazyBundle.mock.calls[0]?.[0]).toBe( 'https://cdn.example/remotes/async/Card.bundle', ); }); @@ -270,7 +275,7 @@ describe('patchLynxChunkLoading chunk URLs', () => { webpackRequire.f.j!('feature', promises); await Promise.all(promises); - expect(loadLazyBundle).toHaveBeenCalledWith( + expect(loadLazyBundle.mock.calls[0]?.[0]).toBe( '//cdn.example/async/Card.bundle', ); }); diff --git a/packages/lynx/src/runtimeCore.ts b/packages/lynx/src/runtimeCore.ts index 2c299a4560a..ae2d97db1f7 100644 --- a/packages/lynx/src/runtimeCore.ts +++ b/packages/lynx/src/runtimeCore.ts @@ -18,7 +18,11 @@ export interface LynxRuntime { QueryComponent?(source: string, callback: (result: unknown) => void): void; fetchBundle?(bundleUrl: string): PromiseLike; loadScript?(sectionPath: string, options: { bundleName: string }): unknown; - loadLazyBundle?(bundleUrl: string): PromiseLike; + loadLazyBundle?( + bundleUrl: string, + mode?: 'sync' | 'async', + host?: string, + ): PromiseLike; getNativeApp?(): unknown; getNativeLynx?(): Pick; requireModuleAsync?( diff --git a/packages/lynx/src/runtimeEntryLoader.ts b/packages/lynx/src/runtimeEntryLoader.ts index 10905349c24..d7864fbdf9e 100644 --- a/packages/lynx/src/runtimeEntryLoader.ts +++ b/packages/lynx/src/runtimeEntryLoader.ts @@ -19,6 +19,65 @@ import { import { loadWithTimeout } from './runtimeTimeout'; const DEFAULT_TIMEOUT = 30_000; +export const PREPARE_REMOTE_ENTRY_MTS = + 'rModuleFederationPrepareRemoteEntryMTS'; + +export const loadScriptForEntry = ( + lynx: LynxRuntime, + sectionPath: string, + bundleName: string, + entry: string, + globalObject: LynxGlobal, +): unknown => { + const hadEntry = Object.prototype.hasOwnProperty.call( + globalObject, + 'globDynamicComponentEntry', + ); + const previousEntry = globalObject.globDynamicComponentEntry; + globalObject.globDynamicComponentEntry = entry; + try { + return lynx.loadScript!(sectionPath, { bundleName }); + } finally { + if (hadEntry) { + globalObject.globDynamicComponentEntry = previousEntry; + } else { + delete globalObject.globDynamicComponentEntry; + } + } +}; + +const preparePairedMainThreadEntry = ( + lynx: LynxRuntime, + entry: string, + entryGlobalName: string, + bundleName: string, +): Promise => { + const nativeApp = lynx.getNativeApp?.(); + if (!isRecord(nativeApp)) { + return Promise.resolve(); + } + const callLepusMethod = nativeApp.callLepusMethod; + if (typeof callLepusMethod !== 'function') { + return Promise.resolve(); + } + + return new Promise((resolve, reject) => { + try { + callLepusMethod.call( + nativeApp, + PREPARE_REMOTE_ENTRY_MTS, + { + bundleName, + entry, + sectionPath: `${entryGlobalName}__main-thread`, + }, + () => resolve(), + ); + } catch (error) { + reject(error); + } + }); +}; interface LynxBundleResponse { code: number; @@ -246,9 +305,15 @@ export const loadBundleEntry = ( ); try { - const value = loadScript(sectionPath, { bundleName: response.url }); + const value = loadScriptForEntry( + lynx, + sectionPath, + response.url, + entry, + globalObject, + ); Promise.resolve(value).then( - (loadedValue) => { + async (loadedValue) => { if (isSettled()) { return; } @@ -267,6 +332,26 @@ export const loadBundleEntry = ( ); return; } + try { + if (realm === 'background') { + await preparePairedMainThreadEntry( + lynx, + entry, + entryGlobalName, + response.url, + ); + } + } catch (error) { + reject( + new Error( + `Failed to prepare Lynx remote bundle "${entryGlobalName}" from "${entry}" on the main thread: ${toErrorMessage(error)}`, + ), + ); + return; + } + if (isSettled()) { + return; + } rollbackRegistry = undefined; resolve(adaptContainerToRealm(exports, realm, realmLayer)); }, diff --git a/packages/lynx/src/runtimeLazyBundleLoading.test.ts b/packages/lynx/src/runtimeLazyBundleLoading.test.ts index 494a3cbfc8f..1d576a32d49 100644 --- a/packages/lynx/src/runtimeLazyBundleLoading.test.ts +++ b/packages/lynx/src/runtimeLazyBundleLoading.test.ts @@ -341,6 +341,8 @@ describe('patchLynxChunkLoading lazy bundle loading', () => { expect(loadLazyBundle).toHaveBeenCalledWith( 'https://cdn.example/remotes/async/Card.bundle', + undefined, + 'https://cdn.example/remotes/catalog.lynx.bundle', ); expect(fetchBundle).not.toHaveBeenCalled(); expect(loadScript).not.toHaveBeenCalled(); @@ -377,6 +379,8 @@ describe('patchLynxChunkLoading lazy bundle loading', () => { expect(loadLazyBundle).toHaveBeenCalledWith( 'https://cdn.example/remotes/lazy-bundle/Feature.bundle', + undefined, + 'https://cdn.example/remotes/catalog.lynx.bundle', ); expect(webpackRequire.m.factory).toBe(factory); }); diff --git a/packages/lynx/src/runtimePlugin.test.ts b/packages/lynx/src/runtimePlugin.test.ts index 3a4c159f5f8..58d6c1f85f9 100644 --- a/packages/lynx/src/runtimePlugin.test.ts +++ b/packages/lynx/src/runtimePlugin.test.ts @@ -13,6 +13,8 @@ interface TestLynx { requireModuleAsync?(entry: string, callback: NativeCallback): void; } +const PREPARE_REMOTE_ENTRY_MTS = 'rModuleFederationPrepareRemoteEntryMTS'; + type LoadEntryArgs = Parameters< NonNullable >[0]; @@ -49,6 +51,8 @@ afterEach(() => { const globalRecord = globalThis as unknown as Record; delete globalRecord.lynx; delete globalRecord.remote; + delete globalRecord.globDynamicComponentEntry; + delete globalRecord[PREPARE_REMOTE_ENTRY_MTS]; delete globalRecord[LYNX_BUNDLE_REGISTRY]; const globalLoading = globalRecord.__GLOBAL_LOADING_REMOTE_ENTRY__ as | Record | undefined> @@ -133,6 +137,9 @@ describe('lynxRuntimePlugin entry loading', () => { it('loads bundle entries from the background section', async () => { const container = createContainer(); + const callLepusMethod = rs.fn( + (_name: string, _payload: unknown, callback: () => void) => callback(), + ); const fetchBundle = rs.fn(async () => ({ code: 0, url: 'lynx-cache://remote', @@ -140,7 +147,7 @@ describe('lynxRuntimePlugin entry loading', () => { const loadScript = rs.fn(async () => container); setLynx({ fetchBundle, - getNativeApp: () => ({}), + getNativeApp: () => ({ callLepusMethod }), loadScript, }); @@ -155,6 +162,15 @@ describe('lynxRuntimePlugin entry loading', () => { expect(loadScript).toHaveBeenCalledWith('remote', { bundleName: 'lynx-cache://remote', }); + expect(callLepusMethod).toHaveBeenCalledWith( + PREPARE_REMOTE_ENTRY_MTS, + { + bundleName: 'lynx-cache://remote', + entry: bundleRemoteInfo.entry, + sectionPath: 'remote__main-thread', + }, + expect.any(Function), + ); expect( ( globalThis as unknown as Record< @@ -165,9 +181,71 @@ describe('lynxRuntimePlugin entry loading', () => { ).toBe('lynx-cache://remote'); }); + it('prepares paired remote containers in the main-thread realm', () => { + const container = createContainer(); + const globalRecord = globalThis as unknown as Record; + globalRecord.globDynamicComponentEntry = '__Card__'; + const loadScript = rs.fn(() => { + expect(globalRecord.globDynamicComponentEntry).toBe( + bundleRemoteInfo.entry, + ); + return container; + }); + setLynx({ loadScript }); + + lynxRuntimePlugin(); + const prepare = globalRecord[PREPARE_REMOTE_ENTRY_MTS] as ( + payload: Record, + ) => unknown; + + expect(prepare).toBeTypeOf('function'); + expect( + prepare({ + bundleName: 'lynx-cache://remote', + entry: bundleRemoteInfo.entry, + sectionPath: 'remote__main-thread', + }), + ).toBe(true); + expect(loadScript).toHaveBeenCalledWith('remote__main-thread', { + bundleName: 'lynx-cache://remote', + }); + expect(globalRecord.globDynamicComponentEntry).toBe('__Card__'); + }); + + it('reports paired main-thread preparation failures immediately', async () => { + const registry = new Map(); + ( + globalThis as unknown as Record< + PropertyKey, + Map | undefined + > + )[LYNX_BUNDLE_REGISTRY] = registry; + setLynx({ + fetchBundle: async () => ({ code: 0, url: 'lynx-cache://remote' }), + getNativeApp: () => ({ + callLepusMethod: () => { + throw new Error('main-thread preparation failed'); + }, + }), + loadScript: () => createContainer(), + }); + + await expect( + loadEntry(lynxRuntimePlugin(), bundleRemoteInfo), + ).rejects.toThrow('main-thread preparation failed'); + expect(registry.size).toBe(0); + }); + it('loads bundle entries from the main-thread section', async () => { const container = createContainer(); - const loadScript = rs.fn(() => ({ default: container })); + const globalRecord = globalThis as unknown as Record; + globalRecord.globDynamicComponentEntry = '__Card__'; + const loadScript = rs.fn(() => { + expect(globalRecord.globDynamicComponentEntry).toBe( + bundleRemoteInfo.entry, + ); + return { default: container }; + }); setLynx({ fetchBundle: async () => ({ code: 0, url: 'lynx-cache://remote' }), loadScript, @@ -183,6 +261,7 @@ describe('lynxRuntimePlugin entry loading', () => { expect(loadScript).toHaveBeenCalledWith('remote__main-thread', { bundleName: 'lynx-cache://remote', }); + expect(globalRecord.globDynamicComponentEntry).toBe('__Card__'); expect( ( globalThis as unknown as Record< diff --git a/packages/lynx/src/runtimePlugin.ts b/packages/lynx/src/runtimePlugin.ts index 69558739ba7..845537e1029 100644 --- a/packages/lynx/src/runtimePlugin.ts +++ b/packages/lynx/src/runtimePlugin.ts @@ -9,10 +9,13 @@ import { getTimeout, loadBundleEntry, loadJavaScriptEntry, + loadScriptForEntry, + PREPARE_REMOTE_ENTRY_MTS, } from './runtimeEntryLoader'; import { getLynxRealm, getLynxRuntime, + isRecord, LYNX_BUNDLE_REGISTRY, type LynxGlobal, type LynxRuntimePluginOptions, @@ -42,6 +45,36 @@ export default function lynxRuntimePlugin( background: 'background', 'main-thread': 'main-thread', }; + const globalObject = globalThis as LynxGlobal; + const lynx = getLynxRuntime(globalObject); + if ( + lynx?.loadScript && + getLynxRealm(lynx) === 'main-thread' && + typeof globalObject[PREPARE_REMOTE_ENTRY_MTS] !== 'function' + ) { + globalObject[PREPARE_REMOTE_ENTRY_MTS] = (payload: unknown): boolean => { + if ( + !isRecord(payload) || + typeof payload.bundleName !== 'string' || + typeof payload.entry !== 'string' || + typeof payload.sectionPath !== 'string' + ) { + return false; + } + try { + loadScriptForEntry( + lynx, + payload.sectionPath, + payload.bundleName, + payload.entry, + globalObject, + ); + return true; + } catch { + return false; + } + }; + } return { name: 'lynx-federation-runtime-plugin', diff --git a/patches/@lynx-js__react@0.123.0.patch b/patches/@lynx-js__react@0.123.0.patch new file mode 100644 index 00000000000..dabf3355717 --- /dev/null +++ b/patches/@lynx-js__react@0.123.0.patch @@ -0,0 +1,84 @@ +diff --git a/runtime/lib/core/lynx/lazy-bundle.js b/runtime/lib/core/lynx/lazy-bundle.js +index e21f90611d27e086440ed8b1be6b9e0b458a1f99..f084dbd77e6acdb582b54babd6859282828524bf 100644 +--- a/runtime/lib/core/lynx/lazy-bundle.js ++++ b/runtime/lib/core/lynx/lazy-bundle.js +@@ -174,14 +174,14 @@ export const loadLazyBundle = /*#__PURE__*/ (() => { + // and warms the native bundle cache; the background `async` path then + // waits less. The main thread renders nothing here. + try { +- lynx.fetchBundle(source, {}); ++ lynx.fetchBundle(source, { isLazyBundle: true }); + } + catch { } + return new Promise(() => { }); + } + let response; + try { +- response = lynx.fetchBundle(source, {}).wait(LYNX_LAZY_SYNC_TIMEOUT_SECONDS); ++ response = lynx.fetchBundle(source, { isLazyBundle: true }).wait(LYNX_LAZY_SYNC_TIMEOUT_SECONDS); + } + catch { + return new Promise(() => { }); +@@ -194,9 +194,12 @@ export const loadLazyBundle = /*#__PURE__*/ (() => { + result = lynx.loadScript(SECTION_MAIN_THREAD, { + bundleName: response.url, + })(source); +- const styleSheet = __LoadStyleSheet(SECTION_CSS, response.url); +- if (styleSheet !== null) { +- __AdoptStyleSheet(styleSheet); ++ if (typeof __LoadStyleSheet === 'function' ++ && typeof __AdoptStyleSheet === 'function') { ++ const styleSheet = __LoadStyleSheet(SECTION_CSS, response.url); ++ if (styleSheet !== null) { ++ __AdoptStyleSheet(styleSheet); ++ } + } + } + catch { +@@ -216,7 +219,7 @@ export const loadLazyBundle = /*#__PURE__*/ (() => { + if (mode === 'sync') { + let response; + try { +- response = lynx.fetchBundle(source, {}).wait(LYNX_LAZY_SYNC_TIMEOUT_SECONDS); ++ response = lynx.fetchBundle(source, { isLazyBundle: true }).wait(LYNX_LAZY_SYNC_TIMEOUT_SECONDS); + } + catch (e) { + return Promise.reject(e instanceof Error ? e : new Error(String(e))); +@@ -255,7 +258,7 @@ export const loadLazyBundle = /*#__PURE__*/ (() => { + return new Promise((resolve, reject) => { + let handler; + try { +- handler = lynx.fetchBundle(source, {}); ++ handler = lynx.fetchBundle(source, { isLazyBundle: true }); + } + catch (e) { + reject(e instanceof Error ? e : new Error(String(e))); +diff --git a/runtime/lib/snapshot/lynx/prepareLazyBundleMTS.js b/runtime/lib/snapshot/lynx/prepareLazyBundleMTS.js +index 151971e1f4257f121a5ae6ef659446ceb840ff52..134c55b2eabfcaf35de54ecc6ef4c1fb1e368229 100644 +--- a/runtime/lib/snapshot/lynx/prepareLazyBundleMTS.js ++++ b/runtime/lib/snapshot/lynx/prepareLazyBundleMTS.js +@@ -10,7 +10,7 @@ function prepareLazyBundleMTS(payload) { + return; + let handler; + try { +- handler = lynx.fetchBundle(url, {}); ++ handler = lynx.fetchBundle(url, { isLazyBundle: true }); + } + catch { + // fetchBundle threw — the bundle never loaded. Leave `url` out of the +@@ -46,9 +46,12 @@ function prepareLazyBundleMTS(payload) { + if (typeof processEvalResult === 'function') { + processEvalResult(() => loaded, url); + } +- const styleSheet = __LoadStyleSheet(SECTION_CSS, response.url); +- if (styleSheet !== null) +- __AdoptStyleSheet(styleSheet); ++ if (typeof __LoadStyleSheet === 'function' ++ && typeof __AdoptStyleSheet === 'function') { ++ const styleSheet = __LoadStyleSheet(SECTION_CSS, response.url); ++ if (styleSheet !== null) ++ __AdoptStyleSheet(styleSheet); ++ } + }); + } + /** @internal */ diff --git a/patches/@lynx-js__template-webpack-plugin@0.13.0.patch b/patches/@lynx-js__template-webpack-plugin@0.13.0.patch new file mode 100644 index 00000000000..4a3c446f920 --- /dev/null +++ b/patches/@lynx-js__template-webpack-plugin@0.13.0.patch @@ -0,0 +1,230 @@ +diff --git a/lib/LynxTemplatePlugin.d.ts b/lib/LynxTemplatePlugin.d.ts +index 95834845d0fb6414f4e1fb091c12488414e855ca..e1751e8a49a0585a6ac91fe2ad3f37a75c1829d9 100644 +--- a/lib/LynxTemplatePlugin.d.ts ++++ b/lib/LynxTemplatePlugin.d.ts +@@ -137,7 +137,7 @@ export interface LynxTemplatePluginOptions { + /** + * The filename of the lazy bundle. + * +- * @defaultValue `'async/[name].[fullhash].bundle'` ++ * @defaultValue `'lazy-bundle/[name].[fullhash].bundle'` + */ + lazyBundleFilename?: string; + /** +diff --git a/lib/LynxTemplatePlugin.js b/lib/LynxTemplatePlugin.js +index 0b6c07d7971129a5e0147e3f924dcb273d8dccd5..54654a6d9c52902596caf81eff48c9b7e34bba68 100644 +--- a/lib/LynxTemplatePlugin.js ++++ b/lib/LynxTemplatePlugin.js +@@ -79,7 +79,7 @@ export class LynxTemplatePlugin { + static defaultOptions = Object + .freeze({ + filename: '[name].bundle', +- lazyBundleFilename: 'async/[name].[fullhash].bundle', ++ lazyBundleFilename: 'lazy-bundle/[name].[fullhash].bundle', + intermediate: '.rspeedy', + chunks: 'all', + excludeChunks: [], +@@ -153,7 +153,7 @@ class LynxTemplatePluginImpl { + static #asyncLayoutInstalled = new WeakSet(); + /** + * Route a lazy bundle's intermediate JS chunk to +- * `/async//.js`, co-located with the bundle's ++ * `/lazy-bundle//.js`, co-located with the bundle's + * other intermediate outputs (mirroring `/main/`). + * Non-lazy chunks keep the default `output.chunkFilename`. Installed once + * per compiler — the plugin is instantiated once per entry. +@@ -177,7 +177,7 @@ class LynxTemplatePluginImpl { + if (compilation !== undefined && id !== undefined && id !== null) { + const layoutName = _a.getAsyncChunkLayoutName(compilation, id); + if (layoutName !== undefined) { +- return `${prefix}async/${layoutName}.js`; ++ return `${prefix}lazy-bundle/${layoutName}.js`; + } + } + return typeof original === 'function' +@@ -238,11 +238,15 @@ class LynxTemplatePluginImpl { + // TODO: only add `getFullHash` when using fullhash + set.add(compiler.webpack.RuntimeGlobals.getFullHash); + compilation.addRuntimeModule(chunk, new LynxAsyncChunksRuntimeModule((asyncChunk) => { +- const filename = _a.#getLazyBundleNameByChunkId(compilation) +- .get(asyncChunk.id) +- ?? (asyncChunk.name !== null && asyncChunk.name !== undefined +- ? hooks.asyncChunkName.call(asyncChunk.name) +- : undefined); ++ const mappedFilename = _a ++ .#getLazyBundleNameByChunkId(compilation) ++ .get(asyncChunk.id); ++ const filename = mappedFilename === '' ++ ? undefined ++ : mappedFilename ++ ?? (asyncChunk.name !== null && asyncChunk.name !== undefined ++ ? hooks.asyncChunkName.call(asyncChunk.name) ++ : undefined); + if (filename === undefined || filename === '') { + return undefined; + } +@@ -317,6 +321,24 @@ class LynxTemplatePluginImpl { + /** isAsync */ this.#options.experimental_isLazyBundle); + } + static #asyncChunkGroups = new WeakMap(); ++ static #getChunkGroupFiles(compilation, chunkGroups) { ++ // Merged chunk groups may share chunks, so dedupe the files. ++ return Array.from(new Set(chunkGroups.flatMap(cg => cg.getFiles()))) ++ .filter(chunkFile => predicateNonHotModuleReplacementAsset(chunkFile, compilation)); ++ } ++ static #chunkGroupCanEmitJavaScript(compilation, chunkGroup) { ++ return chunkGroup.chunks.some(chunk => { ++ if (compilation.chunkGraph.getNumberOfEntryModules(chunk) > 0) { ++ return true; ++ } ++ const modules = compilation.chunkGraph ++ .getChunkModulesIterableBySourceType(chunk, 'javascript'); ++ // Rspack exposes Module Federation remote placeholders as JavaScript ++ // modules even though they are fulfilled by the remotes runtime and do ++ // not emit a chunk asset. ++ return Array.from(modules ?? []).some(module => module.type !== 'remote-module'); ++ }); ++ } + static #getAsyncChunkGroups(compilation) { + let asyncChunkGroups = _a.#asyncChunkGroups.get(compilation); + if (asyncChunkGroups) { +@@ -352,9 +374,16 @@ class LynxTemplatePluginImpl { + } + lazyBundleNames = new Map(); + for (const [filename, chunkGroups] of Object.entries(_a.#getAsyncChunkGroups(compilation))) { +- for (const chunk of chunkGroups.flatMap(cg => cg.chunks)) { +- if (chunk.id !== null && chunk.id !== undefined) { +- lazyBundleNames.set(chunk.id, filename); ++ for (const chunkGroup of chunkGroups) { ++ const mappedFilename = _a.#chunkGroupCanEmitJavaScript(compilation, chunkGroup) ++ ? filename ++ // Keep a tombstone for known assetless chunks so the named-chunk ++ // fallback does not invent a lazy-bundle URL for them. ++ : ''; ++ for (const chunk of chunkGroup.chunks) { ++ if (chunk.id !== null && chunk.id !== undefined) { ++ lazyBundleNames.set(chunk.id, mappedFilename); ++ } + } + } + } +@@ -416,17 +445,18 @@ class LynxTemplatePluginImpl { + if (!filename) { + return Promise.resolve(); + } ++ const chunkFiles = _a.#getChunkGroupFiles(compilation, chunkGroups); ++ if (chunkFiles.length === 0) { ++ return Promise.resolve(); ++ } + const filenameTemplate = this.#getAsyncFilenameTemplate(filename); + // Ignore the encoded templates + if (encodedTemplate.has(filenameTemplate)) { + return Promise.resolve(); + } + encodedTemplate.add(filenameTemplate); +- const asyncAssetsInfoByGroups = this.#getAssetsInformationByFilenames(compilation, +- // Merged chunk groups may share chunks, so dedupe the files. +- Array.from(new Set(chunkGroups.flatMap(cg => cg.getFiles()))) +- .filter(chunkFile => predicateNonHotModuleReplacementAsset(chunkFile, compilation))); +- return this.#encodeByAssetsInformation(compilation, asyncAssetsInfoByGroups, chunkGroups, filenameTemplate, path.join(intermediateRoot, 'async', filename), ++ const asyncAssetsInfoByGroups = this.#getAssetsInformationByFilenames(compilation, chunkFiles); ++ return this.#encodeByAssetsInformation(compilation, asyncAssetsInfoByGroups, chunkGroups, filenameTemplate, path.join(intermediateRoot, 'lazy-bundle', filename), + /** isAsync */ true); + })); + } +@@ -465,6 +495,9 @@ class LynxTemplatePluginImpl { + useNewSwiper: true, + enableNewIntersectionObserver: true, + enableNativeList: true, ++ enableNewSticky: true, ++ flexBasisZeroPercent: true, ++ enableGridPlacementShorthands: true, + syncXElementRegistry: true, + enableA11y, + enableAccessibilityElement, +@@ -608,9 +641,6 @@ class LynxTemplatePluginImpl { + const remainingManifest = {}; + let entryChunk; + for (const [name, content] of Object.entries(manifest)) { +- if (name === '/app-service.js') { +- continue; +- } + if (!entryChunk) { + entryChunk = [name, content]; + continue; +@@ -751,7 +781,7 @@ function collectChunkGroupResources(compilation) { + /** + * Derive a lazy bundle name from the resolved module paths. The name is + * relative to the compiler context with `..` segments replaced, so the +- * bundle never escapes the `async/` output directory. ++ * bundle never escapes the `lazy-bundle/` output directory. + */ + function resourcesToLazyBundleName(resources, context) { + return resources +diff --git a/lib/WebEncodePlugin.js b/lib/WebEncodePlugin.js +index a9094ec16c1f7de56dee4844db296089d5eb7134..225b5b44ceda3a0e3792e9684a636387f025c120 100644 +--- a/lib/WebEncodePlugin.js ++++ b/lib/WebEncodePlugin.js +@@ -62,20 +62,52 @@ export class WebEncodePlugin { + name: WebEncodePlugin.name, + stage: WebEncodePlugin.ENCODE_HOOK_STAGE, + }, async ({ encodeOptions }) => { ++ const styleInfo = { ++ ...encodeOptions['css'].cssMap, ++ }; ++ const manifest = { ++ ...encodeOptions.manifest, ++ }; ++ const lepusCode = encodeOptions.lepusCode ++ ? { ++ ...encodeOptions.lepusCode.lepusChunk, ++ root: encodeOptions.lepusCode.root, ++ } ++ : {}; ++ const customSections = { ++ ...(encodeOptions.customSections ?? {}), ++ }; ++ const background = customSections['background']; ++ if (typeof background?.content === 'string') { ++ manifest['/background'] = background.content; ++ delete customSections['background']; ++ } ++ const mainThread = customSections['main-thread']; ++ if (typeof mainThread?.content === 'string') { ++ lepusCode['main-thread'] = mainThread.content; ++ delete customSections['main-thread']; ++ } ++ const css = customSections['CSS']; ++ const cssContent = typeof css?.content === 'object' ++ && css.content !== null ++ ? css.content ++ : undefined; ++ if (css?.encoding === 'CSS' ++ && Array.isArray(cssContent?.['ruleList'])) { ++ let cssId = 0; ++ while (String(cssId) in styleInfo) ++ cssId++; ++ styleInfo[String(cssId)] = cssContent['ruleList']; ++ delete customSections['CSS']; ++ } + const tasmJSONInfo = { +- styleInfo: encodeOptions['css'].cssMap, +- manifest: encodeOptions.manifest, ++ styleInfo, ++ manifest, + cardType: encodeOptions['cardType'], + appType: encodeOptions['appType'], + pageConfig: encodeOptions['pageConfig'], +- lepusCode: encodeOptions.lepusCode +- ? { +- // flatten the lepusCode to a single object +- ...encodeOptions.lepusCode.lepusChunk, +- root: encodeOptions.lepusCode.root, +- } +- : {}, +- customSections: encodeOptions.customSections ?? {}, ++ lepusCode, ++ customSections, + }; + if (encodeOptions.elementTemplate !== undefined) { + tasmJSONInfo['elementTemplate'] = encodeOptions.elementTemplate; diff --git a/patches/@lynx-js__web-core@0.22.2.patch b/patches/@lynx-js__web-core@0.22.2.patch new file mode 100644 index 00000000000..c1e6882126d --- /dev/null +++ b/patches/@lynx-js__web-core@0.22.2.patch @@ -0,0 +1,699 @@ +diff --git a/dist/client/background/background-apis/createBackgroundLynx.d.ts b/dist/client/background/background-apis/createBackgroundLynx.d.ts +index f641390a867820bad9d8116711580d9ec5b39ce5..efca3618e0fd89b302a841d2aa609a0601c1661b 100644 +--- a/dist/client/background/background-apis/createBackgroundLynx.d.ts ++++ b/dist/client/background/background-apis/createBackgroundLynx.d.ts +@@ -1,11 +1,12 @@ + import type { Rpc } from '@lynx-js/web-worker-rpc'; +-import type { Cloneable, NativeApp } from '../../../types/index.js'; ++import type { Cloneable, FetchBundleOptions, NativeApp } from '../../../types/index.js'; + import { LynxCrossThreadContext } from '../../LynxCrossThreadContext.js'; + export declare function createBackgroundLynx(globalProps: Cloneable, customSections: Record, nativeApp: NativeApp, mainThreadRpc: Rpc): { + __globalProps: Cloneable; + getJSModule(_moduleName: string): any; + getNativeApp(): NativeApp; + getCoreContext(): LynxCrossThreadContext; ++ getDevtool(): LynxCrossThreadContext; + getCustomSectionSync(key: string): Cloneable; + getCustomSection: (key: string, callback: (object: Cloneable) => void) => void; + queueMicrotask: (callback: () => void) => void; +@@ -22,7 +23,8 @@ export declare function createBackgroundLynx(globalProps: Cloneable, customSecti + }; + }) => void) => void; + reload: () => void; +- fetchBundle(url: string): Promise; ++ fetchBundle(url: string, options?: FetchBundleOptions): Promise; ++ loadLazyBundle: (source: string, _mode?: "sync" | "async", host?: string) => Promise; + loadScript(sectionPath: string, options: { + bundleName: string; + }): import("../../../types/NativeApp.js").BundleInitReturnObj; +diff --git a/dist/client/background/background-apis/createBackgroundLynx.js b/dist/client/background/background-apis/createBackgroundLynx.js +index 0ac42ceb4d84e88f042bb852675d6d7775b44dfa..69de9a6db3f65a46ea065aaba6b8bd3f00d019cf 100644 +--- a/dist/client/background/background-apis/createBackgroundLynx.js ++++ b/dist/client/background/background-apis/createBackgroundLynx.js +@@ -1,17 +1,70 @@ + // Copyright 2023 The Lynx Authors. All rights reserved. + // Licensed under the Apache License Version 2.0 that can be found in the + // LICENSE file in the root directory of this source tree. +-import { dispatchCoreContextOnBackgroundEndpoint, dispatchJSContextOnMainThreadEndpoint, fetchExternalBundleEndpoint, reloadEndpoint, } from '../../endpoints.js'; ++import { dispatchCoreContextOnBackgroundEndpoint, dispatchDevtoolEventOnBackgroundEndpoint, dispatchDevtoolEventOnMainThreadEndpoint, dispatchJSContextOnMainThreadEndpoint, fetchExternalBundleEndpoint, reloadEndpoint, } from '../../endpoints.js'; + import { createGetCustomSection } from './crossThreadHandlers/createGetCustomSection.js'; + import { createElement } from './createElement.js'; + import { LynxCrossThreadContext } from '../../LynxCrossThreadContext.js'; ++const PREPARE_LAZY_BUNDLE_MTS = 'rLynxPrepareLazyBundleMTS'; + export function createBackgroundLynx(globalProps, customSections, nativeApp, mainThreadRpc) { + const coreContext = new LynxCrossThreadContext({ + rpc: mainThreadRpc, + receiveEventEndpoint: dispatchCoreContextOnBackgroundEndpoint, + sendEventEndpoint: dispatchJSContextOnMainThreadEndpoint, + }); ++ const devtoolContext = new LynxCrossThreadContext({ ++ rpc: mainThreadRpc, ++ receiveEventEndpoint: dispatchDevtoolEventOnBackgroundEndpoint, ++ sendEventEndpoint: dispatchDevtoolEventOnMainThreadEndpoint, ++ }); + const fetchExternalBundle = mainThreadRpc.createCall(fetchExternalBundleEndpoint); ++ const lazyBundleLoads = new Map(); ++ const loadLazyBundle = (source, _mode, host) => { ++ const cached = lazyBundleLoads.get(source); ++ if (cached) { ++ return cached; ++ } ++ const pending = Promise.resolve(fetchExternalBundle(source, { isLazyBundle: true })).then(response => { ++ if (response.code !== 0) { ++ const error = new Error(`Lazy bundle load failed, schema: ${source}`); ++ error.cause = response.errorMsg; ++ throw error; ++ } ++ const runtimeLynx = nativeApp.tt?.lynx; ++ if (!runtimeLynx?.loadScript) { ++ throw new Error('lynx.loadScript is unavailable'); ++ } ++ const runtimeGlobal = globalThis; ++ const previousEntry = runtimeGlobal.globDynamicComponentEntry; ++ runtimeGlobal.globDynamicComponentEntry = source; ++ let exports; ++ try { ++ exports = runtimeLynx.loadScript('background', { ++ bundleName: response.url, ++ }); ++ } ++ finally { ++ runtimeGlobal.globDynamicComponentEntry = previousEntry; ++ } ++ return new Promise((resolve, reject) => { ++ try { ++ const payload = host === undefined ++ ? { url: source } ++ : { url: source, host }; ++ nativeApp.callLepusMethod(PREPARE_LAZY_BUNDLE_MTS, payload, () => resolve(exports)); ++ } ++ catch (error) { ++ reject(error); ++ } ++ }); ++ }); ++ const retryable = pending.catch(error => { ++ lazyBundleLoads.delete(source); ++ throw error; ++ }); ++ lazyBundleLoads.set(source, retryable); ++ return retryable; ++ }; + return { + __globalProps: globalProps, + getJSModule(_moduleName) { +@@ -22,6 +75,9 @@ export function createBackgroundLynx(globalProps, customSections, nativeApp, mai + getCoreContext() { + return coreContext; + }, ++ getDevtool() { ++ return devtoolContext; ++ }, + getCustomSectionSync(key) { + return customSections[key]; + }, +@@ -37,9 +93,10 @@ export function createBackgroundLynx(globalProps, customSections, nativeApp, mai + reload: () => { + mainThreadRpc.invoke(reloadEndpoint, []); + }, +- fetchBundle(url) { +- return fetchExternalBundle(url); ++ fetchBundle(url, options) { ++ return fetchExternalBundle(url, options); + }, ++ loadLazyBundle, + loadScript(sectionPath, options) { + // `fetchBundle` registered the bundle's raw sections with the worker as + // bts chunks (updateBTSChunk -> templateCache); hand the section's init +diff --git a/dist/client/background/background-apis/startBackgroundThread.js b/dist/client/background/background-apis/startBackgroundThread.js +index 7d4856e6cf399cf4484eab94a300ba6b943b2e6e..83770a674bd3641af947a1abad843238d9c770ab 100644 +--- a/dist/client/background/background-apis/startBackgroundThread.js ++++ b/dist/client/background/background-apis/startBackgroundThread.js +@@ -22,8 +22,8 @@ export function startBackgroundThread(startMessage) { + Promise.all([lynxCore, nativeApp, napiLoader]).then(([lynxCore, nativeApp, napiLoader]) => { + timingSystem.markTimingInternal('load_core_end'); + globalThis['napiLoaderOnRT' + nativeApp.id] = napiLoader; +- const nativeLynx = createBackgroundLynx(globalProps, customSections, nativeApp, mainThreadRpc); + const { loadCard, destroyCard, callDestroyLifetimeFun, nativeGlobal, loadDynamicComponent, } = lynxCore; ++ const nativeLynx = createBackgroundLynx(globalProps, customSections, nativeApp, mainThreadRpc); + // @lynx-js/lynx-core >= 0.1.3 will export nativeGlobal and loadDynamicComponent + if (nativeGlobal && loadDynamicComponent) { + nativeGlobal.loadDynamicComponent = loadDynamicComponent; +diff --git a/dist/client/decodeWorker/decode.worker.js b/dist/client/decodeWorker/decode.worker.js +index 06fef1025bf0c5e3753c8ce33a1cd0c67be48ff3..78ea24b8dda021270cb90f5a06a27ef1223b1702 100644 +--- a/dist/client/decodeWorker/decode.worker.js ++++ b/dist/client/decodeWorker/decode.worker.js +@@ -5,6 +5,8 @@ const wasmModuleLoadedPromise = new Promise((resolve) => { + wasmModuleLoadedResolve = resolve; + }); + import { loadStyleFromJSON } from './cssLoader.js'; ++import { createLepusCodeBlob } from './createLepusCodeBlob.js'; ++import { getCSSScopeEntry } from './getCSSScopeEntry.js'; + import { decodeBinaryMap } from '../../common/decodeUtils.js'; + const HEARTBREAK_INTERVAL_MS = 1000; + let heartbreakTimer; +@@ -178,7 +180,7 @@ async function handleStream(url, reader, transformVW, transformVH, transformREM, + } + case TemplateSectionLabel.StyleInfo: { + await wasmModuleLoadedPromise; +- const buffer = wasmInstance.decode_style_info(content, config['isLazy'] === 'true' ? url : undefined, config['enableCSSSelector'] === 'true', transformVW, transformVH, transformREM); ++ const buffer = wasmInstance.decode_style_info(content, getCSSScopeEntry(config, url), config['enableCSSSelector'] === 'true', transformVW, transformVH, transformREM); + postMessage({ + type: 'section', + label, +@@ -193,29 +195,10 @@ async function handleStream(url, reader, transformVW, transformVH, transformREM, + case TemplateSectionLabel.LepusCode: { + const codeMap = decodeBinaryMap(content); + const isLazy = config['isLazy'] === 'true'; +- // An external bundle's mts chunk is CommonJS-style (it writes to +- // `exports`), so give it a `module.exports`/`exports` env. A card's own +- // lepus chunk is either side-effecting (non-lazy) or an expression +- // assigned to `module.exports` (lazy component root). +- const prefix = config['isExternalBundle'] === 'true' +- ? 'var exports=(module.exports={}); ' +- : isLazy +- ? 'module.exports=' +- : ''; ++ const isExternalBundle = config['isExternalBundle'] === 'true'; + const blobMap = {}; + for (const [key, code] of Object.entries(codeMap)) { +- const blob = new Blob([ +- '//# allFunctionsCalledOnLoad\n(function(){ "use strict"; const navigator=void 0,postMessage=void 0,window=void 0; ', +- prefix, +- code, +- ' \n })()\n//# sourceURL=', +- url, +- '/', +- key, +- '\n', +- ], { +- type: 'text/javascript; charset=utf-8', +- }); ++ const blob = createLepusCodeBlob(code, `${url}/${key}`, isLazy, isExternalBundle); + blobMap[key] = URL.createObjectURL(blob); + } + postMessage({ type: 'section', label, url, data: blobMap, config }); +@@ -246,7 +229,7 @@ async function handleStream(url, reader, transformVW, transformVH, transformREM, + }); + blobMap[key] = URL.createObjectURL(blob); + } +- postMessage({ type: 'section', label, url, data: blobMap }); ++ postMessage({ type: 'section', label, url, data: blobMap, config }); + break; + } + default: +@@ -282,7 +265,7 @@ async function handleJSON(json, url, transformVW, transformVH, transformREM, ove + // StyleInfo + if (json.styleInfo) { + await wasmModuleLoadedPromise; +- const buffer = loadStyleFromJSON(json.styleInfo, config['enableCSSSelector'] === 'true', transformVW, transformVH, transformREM, config['isLazy'] === 'true' ? url : undefined); ++ const buffer = loadStyleFromJSON(json.styleInfo, config['enableCSSSelector'] === 'true', transformVW, transformVH, transformREM, getCSSScopeEntry(config, url)); + postMessage({ + type: 'section', + label: TemplateSectionLabel.StyleInfo, +@@ -301,11 +284,7 @@ async function handleJSON(json, url, transformVW, transformVH, transformREM, ove + for (const [key, code] of Object.entries(json.lepusCode)) { + if (typeof code !== 'string') + continue; +- const prefix = `//# allFunctionsCalledOnLoad\n(function(){ "use strict"; const navigator=void 0,postMessage=void 0,window=void 0; ${isLazy ? 'module.exports=' : ''} `; +- const suffix = ` \n })()\n//# sourceURL=${url}/${key}\n`; +- const blob = new Blob([prefix, code, suffix], { +- type: 'text/javascript; charset=utf-8', +- }); ++ const blob = createLepusCodeBlob(code, `${url}/${key}`, isLazy, config['isExternalBundle'] === 'true'); + blobMap[key] = URL.createObjectURL(blob); + } + postMessage({ +@@ -332,6 +311,7 @@ async function handleJSON(json, url, transformVW, transformVH, transformREM, ove + label: TemplateSectionLabel.Manifest, + url, + data: blobMap, ++ config, + }); + } + // CustomSections +diff --git a/dist/client/decodeWorker/getCSSScopeEntry.d.ts b/dist/client/decodeWorker/getCSSScopeEntry.d.ts +new file mode 100644 +index 0000000000000000000000000000000000000000..397e5db5901f479a5ba5b514dfa0d1ebb2f409fa +--- /dev/null ++++ b/dist/client/decodeWorker/getCSSScopeEntry.d.ts +@@ -0,0 +1,2 @@ ++import type { PageConfig } from '../../types/index.js'; ++export declare function getCSSScopeEntry(config: Partial, url: string): string | undefined; +diff --git a/dist/client/decodeWorker/getCSSScopeEntry.js b/dist/client/decodeWorker/getCSSScopeEntry.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c89659b36ab0d7fbb5eb026149b312d533ee8e52 +--- /dev/null ++++ b/dist/client/decodeWorker/getCSSScopeEntry.js +@@ -0,0 +1,9 @@ ++// Copyright 2026 The Lynx Authors. All rights reserved. ++// Licensed under the Apache License Version 2.0 that can be found in the ++// LICENSE file in the root directory of this source tree. ++export function getCSSScopeEntry(config, url) { ++ return config.isLazy === 'true' && config.enableRemoveCSSScope !== 'true' ++ ? url ++ : undefined; ++} ++//# sourceMappingURL=getCSSScopeEntry.js.map +\ No newline at end of file +diff --git a/dist/client/endpoints.d.ts b/dist/client/endpoints.d.ts +index 31c5ced1a4d52b06b943ba2f904b70886c4dcadb..4fbd93ae37bdb46a9657fbd0c307ff35d4c15c84 100644 +--- a/dist/client/endpoints.d.ts ++++ b/dist/client/endpoints.d.ts +@@ -1,4 +1,4 @@ +-import type { Cloneable, CloneableObject, LynxCrossThreadEvent, InvokeCallbackRes, ElementAnimationOptions, ExternalBundleResponse, UpdateDataOptions, TimingEntry } from '../types/index.js'; ++import type { Cloneable, CloneableObject, LynxCrossThreadEvent, InvokeCallbackRes, ElementAnimationOptions, ExternalBundleResponse, FetchBundleOptions, ContextCrossThreadEvent, UpdateDataOptions, TimingEntry } from '../types/index.js'; + import type { IdentifierType } from '../constants.js'; + export declare const publicComponentEventEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsyncVoid<[componentId: string, hname: string, LynxCrossThreadEvent<{ + [key: string]: string | number | null | undefined; +@@ -15,7 +15,7 @@ export declare const BackgroundThreadStartEndpoint: import("@lynx-js/web-worker- + * Error message, info + */ + export declare const reportErrorEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsyncVoid<[Error, unknown, string]>; +-export declare const callLepusMethodEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[name: string, data: unknown], void>; ++export declare const callLepusMethodEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[name: string, data: unknown], unknown>; + export declare const invokeUIMethodEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[type: IdentifierType, identifier: string, component_id: string, method: string, params: object, root_unique_id: number | undefined], InvokeCallbackRes>; + export declare const setNativePropsEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[type: IdentifierType, identifier: string, component_id: string, first_only: boolean, native_props: object, root_unique_id: number | undefined], void>; + export declare const getPathInfoEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[type: IdentifierType, identifier: string, component_id: string, first_only: boolean, root_unique_id?: number | undefined], InvokeCallbackRes>; +@@ -40,6 +40,8 @@ export declare const dispatchJSContextOnMainThreadEndpoint: import("@lynx-js/web + type: string; + data: Cloneable; + }]>; ++export declare const dispatchDevtoolEventOnBackgroundEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsyncVoid<[ContextCrossThreadEvent]>; ++export declare const dispatchDevtoolEventOnMainThreadEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsyncVoid<[ContextCrossThreadEvent]>; + export declare const triggerElementMethodEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsyncVoid<[method: string, id: string, options: ElementAnimationOptions]>; + export declare const updateGlobalPropsEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsyncVoid<[Cloneable]>; + export declare const updateI18nResourcesEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsyncVoid<[Cloneable]>; +@@ -56,6 +58,6 @@ export declare const queryComponentEndpoint: import("@lynx-js/web-worker-rpc").R + * bundle's raw JS sections with the worker (via {@link updateBTSChunkEndpoint}) + * so the bts `lynx.loadScript` can load them through the shared chunk loader. + */ +-export declare const fetchExternalBundleEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[url: string], ExternalBundleResponse>; +-export declare const updateBTSChunkEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[string, Record], void>; ++export declare const fetchExternalBundleEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[url: string, options?: FetchBundleOptions | undefined], ExternalBundleResponse>; ++export declare const updateBTSChunkEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsync<[string, Record, isExternalBundle: boolean], void>; + export declare const reloadEndpoint: import("@lynx-js/web-worker-rpc").RpcEndpointAsyncVoid<[]>; +diff --git a/dist/client/mainthread/Background.js b/dist/client/mainthread/Background.js +index a07683f5040d0fc059283e0610464437603e991d..c77698855670ade6612a138a7aea6f485d3c4655 100644 +--- a/dist/client/mainthread/Background.js ++++ b/dist/client/mainthread/Background.js +@@ -4,7 +4,7 @@ + * LICENSE file in the root directory of this source tree. + */ + import { Rpc } from '@lynx-js/web-worker-rpc'; +-import { dispatchCoreContextOnBackgroundEndpoint, dispatchJSContextOnMainThreadEndpoint, disposeEndpoint, markTimingEndpoint, postTimingFlagsEndpoint, publicComponentEventEndpoint, publishEventEndpoint, sendGlobalEventEndpoint, dispatchI18nResourceEndpoint, updateDataEndpoint, updateGlobalPropsEndpoint, BackgroundThreadStartEndpoint, callLepusMethodEndpoint, switchExposureServiceEndpoint, reportErrorEndpoint, dispatchLynxViewEventEndpoint, updateBTSChunkEndpoint, queryComponentEndpoint, fetchExternalBundleEndpoint, } from '../endpoints.js'; ++import { dispatchCoreContextOnBackgroundEndpoint, dispatchDevtoolEventOnBackgroundEndpoint, dispatchDevtoolEventOnMainThreadEndpoint, dispatchJSContextOnMainThreadEndpoint, disposeEndpoint, markTimingEndpoint, postTimingFlagsEndpoint, publicComponentEventEndpoint, publishEventEndpoint, sendGlobalEventEndpoint, dispatchI18nResourceEndpoint, updateDataEndpoint, updateGlobalPropsEndpoint, BackgroundThreadStartEndpoint, callLepusMethodEndpoint, switchExposureServiceEndpoint, reportErrorEndpoint, dispatchLynxViewEventEndpoint, updateBTSChunkEndpoint, queryComponentEndpoint, fetchExternalBundleEndpoint, } from '../endpoints.js'; + import { LynxCrossThreadContext } from '../LynxCrossThreadContext.js'; + import { registerInvokeUIMethodHandler } from './crossThreadHandlers/registerInvokeUIMethodHandler.js'; + import { registerNativePropsHandler } from './crossThreadHandlers/registerSetNativePropsHandler.js'; +@@ -37,6 +37,7 @@ export class BackgroundThread { + #messagePort; + postTimingFlags; + sendGlobalEvent; ++ sendDevtoolEvent; + publicComponentEvent; + publishEvent; + dispatchI18nResource; +@@ -64,6 +65,7 @@ export class BackgroundThread { + this.#batchSendTimingInfo = this.#rpc.createCall(markTimingEndpoint); + this.postTimingFlags = this.#rpc.createCall(postTimingFlagsEndpoint); + this.sendGlobalEvent = this.#rpc.createCall(sendGlobalEventEndpoint); ++ this.sendDevtoolEvent = this.#rpc.createCall(dispatchDevtoolEventOnBackgroundEndpoint); + this.publicComponentEvent = this.#rpc.createCall(publicComponentEventEndpoint); + this.publishEvent = this.#rpc.createCall(publishEventEndpoint); + this.dispatchI18nResource = this.#rpc.createCall(dispatchI18nResourceEndpoint); +@@ -114,7 +116,7 @@ export class BackgroundThread { + this.#rpc.registerHandler(callLepusMethodEndpoint, (methodName, data) => { + const method = this.#lynxViewInstance.mainThreadGlobalThis[methodName]; + if (typeof method === 'function') { +- method.call(this.#lynxViewInstance.mainThreadGlobalThis, data); ++ return method.call(this.#lynxViewInstance.mainThreadGlobalThis, data); + } + else { + console.error(`Method ${methodName} not found on mainThreadGlobalThis`); +@@ -132,6 +134,14 @@ export class BackgroundThread { + composed: true, + })); + }); ++ this.#rpc.registerHandler(dispatchDevtoolEventOnMainThreadEndpoint, (event) => { ++ this.#lynxViewInstance.parentDom.dispatchEvent(new CustomEvent('devtoolMessage', { ++ detail: event, ++ bubbles: true, ++ cancelable: true, ++ composed: true, ++ })); ++ }); + this.#rpc.registerHandler(queryComponentEndpoint, (url) => { + return this.#lynxViewInstance.queryComponent(url).then(() => { + this.jsContext.dispatchEvent({ +@@ -146,13 +156,13 @@ export class BackgroundThread { + }; + }); + }); +- this.#rpc.registerHandler(fetchExternalBundleEndpoint, (url) => { ++ this.#rpc.registerHandler(fetchExternalBundleEndpoint, (url, options) => { + // `loadExternalBundle` decodes the bundle through the shared decode + // worker; its `Manifest` section registers the bts chunks with the + // worker (updateBTSChunk -> templateCache) and its `LepusCode` section + // registers the mts chunks under `lepusCodeUrls`, so `lynx.loadScript` + // can load either realm afterwards. +- return this.#lynxViewInstance.loadExternalBundle(url); ++ return this.#lynxViewInstance.loadExternalBundle(url, options); + }); + registerReloadHandler(this.#rpc, this.#lynxViewInstance); + registerGetPathInfoHandler(this.#rpc, this.#lynxViewInstance); +diff --git a/dist/client/mainthread/LynxViewInstance.d.ts b/dist/client/mainthread/LynxViewInstance.d.ts +index f0a67ca0dab3ff93865e9ec4ada23de090c6268a..e1c2dd8f2676c86228bbe8051aafc9259a3c4093 100644 +--- a/dist/client/mainthread/LynxViewInstance.d.ts ++++ b/dist/client/mainthread/LynxViewInstance.d.ts +@@ -1,4 +1,4 @@ +-import type { Cloneable, ExternalBundleResponse, InitI18nResources, InvokeUIMethodPAPI, JSRealm, MainThreadGlobalThis, NapiModulesMap, NativeModulesMap, PageConfig } from '../../types/index.js'; ++import type { Cloneable, ExternalBundleResponse, FetchBundleOptions, InitI18nResources, InvokeUIMethodPAPI, JSRealm, MainThreadGlobalThis, NapiModulesMap, NativeModulesMap, PageConfig } from '../../types/index.js'; + import { BackgroundThread } from './Background.js'; + import { BoundingClientRectService } from './BoundingClientRectService.js'; + import { I18nManager } from './I18n.js'; +@@ -35,18 +35,18 @@ export declare class LynxViewInstance implements AsyncDisposable { + onStyleInfoReady(currentUrl: string): void; + onMTSScriptsLoaded(currentUrl: string, isLazy: boolean): Promise; + onMTSScriptsExecuted(): void; +- onBTSScriptsLoaded(url: string): Promise; ++ onBTSScriptsLoaded(url: string, isExternalBundle?: boolean): Promise; + loadUnknownElement(tagName: string): void; + queryComponent(url: string): Promise; + /** + * Fetch + decode + cache an external `.lynx.bundle` for `lynx.fetchBundle`. + * Reuses the same machinery as {@link queryComponent} — the shared decode +- * worker, the bundle cache, and `onStyleInfoReady`, which applies the bundle's ++ * worker and `onStyleInfoReady`, which applies the bundle's + * pre-processed style section via the wasm style engine — but does not load a + * lepus root chunk. Resolves to a response object (never rejects) so the + * externals plugin can branch on `code`. + */ +- loadExternalBundle(url: string): Promise; ++ loadExternalBundle(url: string, options?: FetchBundleOptions): Promise; + updateData(data: Cloneable, processorName?: string): Promise; + updateGlobalProps(data: Cloneable): Promise; + reportError(error: Error, release: string, fileName: string): void; +diff --git a/dist/client/mainthread/LynxViewInstance.js b/dist/client/mainthread/LynxViewInstance.js +index 45b53f8a69607fd53cdb3b21aa0c1ad0405ae641..7bec3e2afded24289b72e57983bcb26e155fbd4a 100644 +--- a/dist/client/mainthread/LynxViewInstance.js ++++ b/dist/client/mainthread/LynxViewInstance.js +@@ -1,4 +1,5 @@ + import { loadUnknownElementEventName, systemInfoBase, } from '../../constants.js'; ++import { getExecutionSourceURL } from '../executionSourceURL.js'; + import { BackgroundThread } from './Background.js'; + import { BoundingClientRectService } from './BoundingClientRectService.js'; + import { I18nManager } from './I18n.js'; +@@ -52,10 +53,9 @@ export class LynxViewInstance { + i18nManager; + exposureServices; + webElementsLoadingPromises = []; +- // A `.web.bundle` url is only ever loaded one way — as a lazy component +- // (`queryComponent`) or as an external bundle (`loadExternalBundle`), never +- // both — so both share a single per-url promise cache. +- #bundleLoadCache = new Map(); ++ #lazyBundleLoadCache = new Map(); ++ #externalBundleLoadCache = new Map(); ++ #bundleDecodeQueue = new Map(); + #pageConfig; + #nativeModulesMap; + #napiModulesMap; +@@ -123,7 +123,7 @@ export class LynxViewInstance { + // load them on demand) but have no `root` chunk to auto-execute, so the + // `urlMap['root']` guard skips the page render for them. + if (!isLazy && urlMap && urlMap['root']) { +- await this.mtsRealm.loadScript(urlMap['root']); ++ await this.mtsRealm.loadScript(urlMap['root'], getExecutionSourceURL(currentUrl, 'root')); + this.onMTSScriptsExecuted(); + } + } +@@ -143,10 +143,10 @@ export class LynxViewInstance { + this.mainThreadGlobalThis.renderPage?.(processedData); + this.mainThreadGlobalThis.__FlushElementTree(); + } +- async onBTSScriptsLoaded(url) { ++ async onBTSScriptsLoaded(url, isExternalBundle = false) { + const btsUrls = templateManager.getBundle(url) + ?.backgroundCode; +- await this.backgroundThread.updateBTSChunk(url, btsUrls); ++ await this.backgroundThread.updateBTSChunk(url, btsUrls, isExternalBundle); + this.backgroundThread.startBTS(); + } + loadUnknownElement(tagName) { +@@ -160,10 +160,11 @@ export class LynxViewInstance { + } + } + queryComponent(url) { +- if (this.#bundleLoadCache.has(url)) { +- return this.#bundleLoadCache.get(url); ++ const cached = this.#lazyBundleLoadCache.get(url); ++ if (cached) { ++ return cached; + } +- const promise = templateManager.fetchBundle(url, Promise.resolve(this), this.transformVW, this.transformVH, this.transformREM, { ++ const promise = this.#decodeBundle(url, { + enableCSSSelector: this.#pageConfig['enableCSSSelector'], + }) + .then(async () => { +@@ -172,42 +173,66 @@ export class LynxViewInstance { + if (!rootUrl) { + throw new Error(`[lynx-web] Missing root URL for component: ${url}`); + } +- let lepusRootChunkExport = await this.mtsRealm.loadScript(rootUrl); ++ let lepusRootChunkExport = await this.mtsRealm.loadScript(rootUrl, getExecutionSourceURL(url, 'root')); + lepusRootChunkExport = this.mainThreadGlobalThis.processEvalResult?.(lepusRootChunkExport, url) ?? lepusRootChunkExport; + return lepusRootChunkExport; + }); +- this.#bundleLoadCache.set(url, promise); +- return promise; ++ const retryable = promise.catch(error => { ++ if (this.#lazyBundleLoadCache.get(url) === retryable) { ++ this.#lazyBundleLoadCache.delete(url); ++ } ++ throw error; ++ }); ++ this.#lazyBundleLoadCache.set(url, retryable); ++ return retryable; + } + /** + * Fetch + decode + cache an external `.lynx.bundle` for `lynx.fetchBundle`. + * Reuses the same machinery as {@link queryComponent} — the shared decode +- * worker, the bundle cache, and `onStyleInfoReady`, which applies the bundle's ++ * worker and `onStyleInfoReady`, which applies the bundle's + * pre-processed style section via the wasm style engine — but does not load a + * lepus root chunk. Resolves to a response object (never rejects) so the + * externals plugin can branch on `code`. + */ +- loadExternalBundle(url) { +- if (this.#bundleLoadCache.has(url)) { +- return this.#bundleLoadCache.get(url); ++ loadExternalBundle(url, options) { ++ const isLazyBundle = options?.isLazyBundle === true; ++ const cacheKey = `${isLazyBundle ? 'lazy' : 'external'}:${url}`; ++ const cached = this.#externalBundleLoadCache.get(cacheKey); ++ if (cached) { ++ return cached; + } +- const promise = templateManager.fetchBundle(url, Promise.resolve(this), this.transformVW, this.transformVH, this.transformREM, { ++ const promise = this.#decodeBundle(url, { + enableCSSSelector: this.#pageConfig['enableCSSSelector'], +- // An external bundle ships global styles (they apply to the consumer's +- // elements), so decode its StyleInfo unscoped rather than scoping it to +- // the bundle url the way a lazy component's styles are scoped. +- isLazy: 'false', ++ // External containers ship global styles; lazy components retain their ++ // URL scope and callable main-thread wrapper. ++ isLazy: isLazyBundle ? 'true' : 'false', + // Mark the bundle external so the decode worker wraps its mts + // (`lepusCode`) chunks with a CommonJS `module`/`exports` env. +- isExternalBundle: 'true', +- }).then(() => ({ url, code: 0, errorMsg: '' }), (error) => ({ +- url, +- code: -1, +- errorMsg: error?.message ?? String(error), +- })); +- this.#bundleLoadCache.set(url, promise); ++ isExternalBundle: isLazyBundle ? 'false' : 'true', ++ }).then(() => ({ url, code: 0, errorMsg: '' }), (error) => { ++ this.#externalBundleLoadCache.delete(cacheKey); ++ return { ++ url, ++ code: -1, ++ errorMsg: error?.message ?? String(error), ++ }; ++ }); ++ this.#externalBundleLoadCache.set(cacheKey, promise); + return promise; + } ++ #decodeBundle(url, overrideConfig) { ++ const previous = this.#bundleDecodeQueue.get(url); ++ const promise = (previous?.catch(() => undefined) ?? Promise.resolve()) ++ .then(() => templateManager.fetchBundle(url, Promise.resolve(this), this.transformVW, this.transformVH, this.transformREM, overrideConfig)); ++ this.#bundleDecodeQueue.set(url, promise); ++ void promise.then(() => this.#removeBundleDecode(url, promise), () => this.#removeBundleDecode(url, promise)); ++ return promise; ++ } ++ #removeBundleDecode(url, promise) { ++ if (this.#bundleDecodeQueue.get(url) === promise) { ++ this.#bundleDecodeQueue.delete(url); ++ } ++ } + async updateData(data, processorName) { + const processedData = this.#pageConfig['enableJSDataProcessor'] !== 'true' + && this.mainThreadGlobalThis.processData +diff --git a/dist/client/mainthread/createMainThreadGlobalAPIs.js b/dist/client/mainthread/createMainThreadGlobalAPIs.js +index 8116bff253fb9aab80d64ec78890812c1c97e3bd..1cc07f892fcefc82e3ba3655fee1481f5426ae7c 100644 +--- a/dist/client/mainthread/createMainThreadGlobalAPIs.js ++++ b/dist/client/mainthread/createMainThreadGlobalAPIs.js +@@ -3,6 +3,7 @@ + * Licensed under the Apache License Version 2.0 that can be found in the + * LICENSE file in the root directory of this source tree. + */ ++import { getExecutionSourceURL } from '../executionSourceURL.js'; + import { templateManager } from './TemplateManager.js'; + import { createMainThreadLynxPerformance } from './createMainThreadLynxPerformance.js'; + function createMainThreadLynx(lynxViewInstance) { +@@ -34,8 +35,11 @@ function createMainThreadLynx(lynxViewInstance) { + clearTimeout: clearTimeoutBrowserImpl, + setInterval: setIntervalBrowserImpl, + clearInterval: clearIntervalBrowserImpl, +- fetchBundle(url) { +- return lynxViewInstance.loadExternalBundle(url); ++ fetchBundle(url, options) { ++ return lynxViewInstance.loadExternalBundle(url, options); ++ }, ++ loadLazyBundle(source) { ++ return lynxViewInstance.queryComponent(source); + }, + loadScript(sectionPath, options) { + // An external bundle's mts chunk rides the `lepusCode` section: the decode +@@ -46,7 +50,7 @@ function createMainThreadLynx(lynxViewInstance) { + if (blobUrl === undefined) { + throw new Error(`lynx.loadScript: section "${sectionPath}" not found in bundle ${options.bundleName}`); + } +- return lynxViewInstance.mtsRealm.loadScriptSync(blobUrl); ++ return lynxViewInstance.mtsRealm.loadScriptSync(blobUrl, options.bundleName); + }, + }; + } +@@ -68,8 +72,13 @@ export function createMainThreadGlobalAPIs(lynxViewInstance) { + if (!entryUrl || entryUrl === '__Card__') { + entryUrl = lynxViewInstance.templateUrl; + } +- path = lynxViewInstance.lepusCodeUrls.get(entryUrl)?.[path] ?? path; +- lynxViewInstance.mtsRealm.loadScriptSync(path); ++ const chunkURL = lynxViewInstance.lepusCodeUrls.get(entryUrl)?.[path]; ++ if (chunkURL === undefined) { ++ lynxViewInstance.mtsRealm.loadScriptSync(path); ++ } ++ else { ++ lynxViewInstance.mtsRealm.loadScriptSync(chunkURL, getExecutionSourceURL(entryUrl, path)); ++ } + return true; + } + catch (e) { +diff --git a/dist/client_prod/static/js/async/web-core-main-chunk.js b/dist/client_prod/static/js/async/web-core-main-chunk.js +index e0ef64c95bd10596f128992acb8ccb93f257aed6..00c3588e200879744b446bfaf39354e429e1a207 100644 +--- a/dist/client_prod/static/js/async/web-core-main-chunk.js ++++ b/dist/client_prod/static/js/async/web-core-main-chunk.js +@@ -1,2 +1,2 @@ +-export const __rspack_esm_id=894;export const __rspack_esm_ids=[894];export const __webpack_modules__={1199(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l),a=t(8544),A=o()(r());A.i(a.A),A.push([e.id,"[lynx-default-display-linear=false] *{--lynx-display:flex;--lynx-display-toggle:var(--lynx-display-flex)}[lynx-default-overflow-visible=true] x-view{overflow:visible}","",{version:3,sources:["webpack://./css/in_shadow.css"],names:[],mappings:"AAEA,sCAAA,mBAAA,CAAA,8CAAA,CAKA,4CAAA,gBAAA",sourcesContent:['@import url("@lynx-js/web-elements/index.css");\n\n[lynx-default-display-linear="false"] * {\n --lynx-display: flex;\n --lynx-display-toggle: var(--lynx-display-flex);\n}\n\n[lynx-default-overflow-visible="true"] x-view {\n overflow: visible;\n}\n'],sourceRoot:""}]),n.A=A.toString()},8544(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l),a=t(1815),A=t(8918),s=t(3951),c=t(2605),p=t(2483),x=t(8762),d=t(7524),h=t(3351),m=t(3291),g=t(4651),u=t(3503),w=t(8157),f=t(8944),v=t(8152),y=t(1707),b=t(9395),C=t(7787),B=t(9003),k=o()(r());k.i(a.A),k.i(A.A),k.i(s.A),k.i(c.A),k.i(p.A),k.i(x.A),k.i(d.A),k.i(h.A),k.i(m.A),k.i(g.A),k.i(u.A),k.i(w.A),k.i(f.A),k.i(v.A),k.i(y.A),k.i(b.A),k.i(C.A),k.i(B.A),k.push([e.id,"","",{version:3,sources:[],names:[],mappings:"",sourceRoot:""}]),n.A=k.toString()},1815(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"@supports not ((content-visibility:auto) and (transition-behavior:allow-discrete) and (-webkit-box-reflect:above)){*{--lynx-display:linear;--lynx-linear-weight-sum:1;--lynx-linear-weight:0;--justify-content-column:flex-start;--justify-content-column-reverse:flex-start;--justify-content-row:flex-start;--justify-content-row-reverse:flex-start;--align-self-row:auto;--align-self-column:auto;--lynx-linear-weight-basis:auto;--lynx-linear-orientation:vertical;--flex-direction:row;--flex-grow:0;--flex-shrink:1;--flex-basis:auto;--justify-content:flex-start;--flex-wrap:nowrap;--align-self:auto}[lynx-computed-display=linear]{flex-direction:column;justify-content:flex-start;flex-wrap:nowrap!important}[lynx-computed-display=flex]{flex-direction:var(--flex-direction);justify-content:var(--justify-content);flex-wrap:var(--flex-wrap)}[lynx-computed-display=flex]>*,[lynx-computed-display=flex]>lynx-wrapper>*{flex:var(--flex,var(--flex-grow) var(--flex-shrink) var(--flex-basis))}[lynx-computed-display=linear]>*,[lynx-computed-display=linear]>lynx-wrapper>*{flex-shrink:0!important;flex-grow:calc(var(--lynx-linear-weight) / calc(var(--lynx-linear-weight-sum) + ( 1 - clamp(0, var(--lynx-linear-weight-sum) * 999999, 1) )))!important;flex-basis:var(--lynx-linear-weight-basis)!important}[lynx-computed-display=linear][lynx-linear-orientation=vertical]{justify-content:var(--justify-content-column);flex-direction:column!important}[lynx-computed-display=linear][lynx-linear-orientation=horizontal]{justify-content:var(--justify-content-row);flex-direction:row!important}[lynx-computed-display=linear][lynx-linear-orientation=vertical-reverse]{justify-content:var(--justify-content-column-reverse);flex-direction:column-reverse!important}[lynx-computed-display=linear][lynx-linear-orientation=horizontal-reverse]{justify-content:var(--justify-content-row-reverse);flex-direction:row-reverse!important}[lynx-computed-display=linear][lynx-linear-orientation=vertical]>*,[lynx-computed-display=linear][lynx-linear-orientation=vertical-reverse],[lynx-computed-display=linear][lynx-linear-orientation=vertical]>lynx-wrapper>*,[lynx-computed-display=linear][lynx-linear-orientation=vertical-reverse]>lynx-wrapper>*{align-self:var(--align-self-column)}[lynx-computed-display=linear][lynx-linear-orientation=horizontal]>*,[lynx-computed-display=linear][lynx-linear-orientation=horizontal-reverse],[lynx-computed-display=linear][lynx-linear-orientation=horizontal]>lynx-wrapper>*,[lynx-computed-display=linear][lynx-linear-orientation=horizontal-reverse]>lynx-wrapper>*{align-self:var(--align-self-row)}}","",{version:3,sources:["webpack://./../web-elements/src/compat/LinearContainer/linear-compat.css"],names:[],mappings:"AA0BA,mHAGE,EAAA,qBAAA,CAAA,0BAAA,CAAA,sBAAA,CAAA,mCAAA,CAAA,2CAAA,CAAA,gCAAA,CAAA,wCAAA,CAAA,qBAAA,CAAA,wBAAA,CAAA,+BAAA,CAAA,kCAAA,CAAA,oBAAA,CAAA,aAAA,CAAA,eAAA,CAAA,iBAAA,CAAA,4BAAA,CAAA,kBAAA,CAAA,iBAAA,CAqBA,+BAAA,qBAAA,CAAA,0BAAA,CAAA,0BAAA,CAMA,6BAAA,oCAAA,CAAA,sCAAA,CAAA,0BAAA,CAMA,2EAAA,sEAAA,CAKA,+EAAA,uBAAA,CAAA,uJAAA,CAAA,oDAAA,CAeA,iEAAA,6CAAA,CAAA,+BAAA,CAKA,mEAAA,0CAAA,CAAA,4BAAA,CAKA,yEAAA,qDAAA,CAAA,uCAAA,CAKA,2EAAA,kDAAA,CAAA,oCAAA,CAKA,oTAAA,mCAAA,CAWA,4TAAA,gCAAA,CAAA",sourcesContent:['/** For @property\n chrome 85, edge 85, firefox 128, safari 16.4\n https://developer.chrome.com/blog/new-in-chrome-85\n\n * content-visibility:auto \n chrome 85, firefox 125, safari 18\n (https://developer.mozilla.org/en-US/docs/Web/CSS/content-visibility)\n \n * contain-intrinsic-size:auto \n chrome 83, firefox 107, safari 17\n (https://developer.mozilla.org/en-US/docs/Web/CSS/contain-intrinsic-size)\n\n * relative-color and display:ruby-base\n display: ruby-base firefox-only\n background-color: rgb(from red 200 g b) firefox 127\n https://caniuse.com/?search=relative%20color#google_vignette\n https://developer.mozilla.org/en-US/docs/Web/CSS/display#browser_compatibility\n \n rules for: chrome 85, firefox 127, safari 18\n \n References:\n https://chromestatus.com/features#milestone%3D85\n https://www.mozilla.org/en-US/firefox/128.0/releasenotes/\n https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes\n https://caniuse.com/?search=relative%20colors\n */\n@supports not\n ((content-visibility: auto) and (transition-behavior: allow-discrete) and\n (-webkit-box-reflect: above)) {\n * {\n --lynx-display: linear;\n --lynx-linear-weight-sum: 1;\n --lynx-linear-weight: 0;\n --justify-content-column: flex-start;\n --justify-content-column-reverse: flex-start;\n --justify-content-row: flex-start;\n --justify-content-row-reverse: flex-start;\n --align-self-row: auto;\n --align-self-column: auto;\n --lynx-linear-weight-basis: auto;\n --lynx-linear-orientation: vertical;\n --flex-direction: row;\n --flex-grow: 0;\n --flex-shrink: 1;\n --flex-basis: auto;\n --justify-content: flex-start;\n --flex-wrap: nowrap;\n --align-self: auto;\n }\n\n [lynx-computed-display="linear"] {\n flex-wrap: nowrap !important;\n flex-direction: column;\n justify-content: flex-start;\n }\n\n [lynx-computed-display="flex"] {\n flex-direction: var(--flex-direction);\n justify-content: var(--justify-content);\n flex-wrap: var(--flex-wrap);\n }\n\n [lynx-computed-display="flex"] > *,\n [lynx-computed-display="flex"] > lynx-wrapper > * {\n flex: var(--flex, var(--flex-grow) var(--flex-shrink) var(--flex-basis));\n }\n\n [lynx-computed-display="linear"] > *,\n [lynx-computed-display="linear"] > lynx-wrapper > * {\n flex-shrink: 0 !important;\n flex-grow: calc(\n var(--lynx-linear-weight) /\n calc(\n var(--lynx-linear-weight-sum) +\n (\n 1 - clamp(0, var(--lynx-linear-weight-sum) * 999999, 1)\n )\n )\n ) !important;\n flex-basis: var(--lynx-linear-weight-basis) !important;\n }\n\n [lynx-computed-display="linear"][lynx-linear-orientation="vertical"] {\n flex-direction: column !important;\n justify-content: var(--justify-content-column);\n }\n\n [lynx-computed-display="linear"][lynx-linear-orientation="horizontal"] {\n flex-direction: row !important;\n justify-content: var(--justify-content-row);\n }\n\n [lynx-computed-display="linear"][lynx-linear-orientation="vertical-reverse"] {\n flex-direction: column-reverse !important;\n justify-content: var(--justify-content-column-reverse);\n }\n\n [lynx-computed-display="linear"][lynx-linear-orientation="horizontal-reverse"] {\n flex-direction: row-reverse !important;\n justify-content: var(--justify-content-row-reverse);\n }\n\n [lynx-computed-display="linear"][lynx-linear-orientation="vertical"] > *,\n [lynx-computed-display="linear"][lynx-linear-orientation="vertical-reverse"],\n [lynx-computed-display="linear"][lynx-linear-orientation="vertical"]\n > lynx-wrapper\n > *,\n [lynx-computed-display="linear"][lynx-linear-orientation="vertical-reverse"]\n > lynx-wrapper\n > * {\n align-self: var(--align-self-column);\n }\n\n [lynx-computed-display="linear"][lynx-linear-orientation="horizontal"] > *,\n [lynx-computed-display="linear"][lynx-linear-orientation="horizontal-reverse"],\n [lynx-computed-display="linear"][lynx-linear-orientation="horizontal"]\n > lynx-wrapper\n > *,\n [lynx-computed-display="linear"][lynx-linear-orientation="horizontal-reverse"]\n > lynx-wrapper\n > * {\n align-self: var(--align-self-row);\n }\n}\n'],sourceRoot:""}]),n.A=o.toString()},3951(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"lynx-wrapper{--lynx-display:inherit;--lynx-display-toggle:inherit;--lynx-linear-orientation:inherit;--lynx-linear-orientation-toggle:inherit;display:contents!important}","",{version:3,sources:["webpack://./../web-elements/src/elements/LynxWrapper/lynx-wrapper.css"],names:[],mappings:"AAKA,aAAA,sBAAA,CAAA,6BAAA,CAAA,iCAAA,CAAA,wCAAA,CAAA,0BAAA",sourcesContent:["/**\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nlynx-wrapper {\n display: contents !important;\n --lynx-display: inherit;\n --lynx-display-toggle: inherit;\n --lynx-linear-orientation: inherit;\n --lynx-linear-orientation-toggle: inherit;\n}\n"],sourceRoot:""}]),n.A=o.toString()},2483(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"scroll-view{--lynx-display-toggle:var(--lynx-display-linear);flex-wrap:nowrap;flex-direction:var(--linear-flex-direction);justify-content:var(--linear-justify-content);scroll-timeline:--scroll-view-timeline;--lynx-display:linear!important;display:flex!important}scroll-view>*,scroll-view>lynx-wrapper>*{flex-shrink:0;flex-grow:calc(var(--lynx-linear-weight) / var(--lynx-linear-weight-sum));flex-basis:var(--lynx-linear-weight-basis);align-self:var(--align-self-column)}scroll-view,scroll-view{scrollbar-width:none}scroll-view::-webkit-scrollbar{display:none}scroll-view::-webkit-scrollbar{display:none}scroll-view[enable-scrollbar],scroll-view[scroll-bar-enable]{scrollbar-width:initial}scroll-view[enable-scrollbar]::-webkit-scrollbar{display:initial}scroll-view[scroll-bar-enable]::-webkit-scrollbar{display:initial}scroll-view,scroll-view[scroll-y],scroll-view[scroll-orientation=vertical]{--lynx-linear-orientation-toggle:var(--lynx-linear-orientation-vertical);--lynx-linear-orientation:vertical!important;flex-direction:column!important;overflow:clip scroll!important}scroll-view[scroll-x],scroll-view[scroll-orientation=horizontal]{--lynx-linear-orientation-toggle:var(--lynx-linear-orientation-horizontal);--lynx-linear-orientation:horizontal!important;flex-direction:row!important;overflow:scroll clip!important}scroll-view[scroll-orientation=both]{overflow:scroll!important}@supports not (overflow:clip){scroll-view[scroll-y],scroll-view[scroll-orientation=vertical]{overflow-x:hidden}scroll-view[scroll-x],scroll-view[scroll-orientation=horizontal]{overflow-y:hidden}}scroll-view[scroll-y][enable-scroll=false],scroll-view[scroll-orientation=vertical][enable-scroll=false]{overflow-y:hidden!important}scroll-view[scroll-x][enable-scroll=false],scroll-view[scroll-orientation=horizontal][enable-scroll=false]{overflow-x:hidden!important}@supports (animation-timeline:--scroll-view-timeline){@keyframes scrollViewTopFading{0%{box-shadow:0 0 #0000}5%{box-shadow:var(--scroll-view-bg-color) 0px 0px var(--scroll-view-fading-edge-length) var(--scroll-view-fading-edge-length)}to{box-shadow:var(--scroll-view-bg-color) 0px 0px var(--scroll-view-fading-edge-length) var(--scroll-view-fading-edge-length)}}@keyframes scrollViewBotFading{0%{box-shadow:var(--scroll-view-bg-color) 0px 0px var(--scroll-view-fading-edge-length) var(--scroll-view-fading-edge-length)}95%{box-shadow:var(--scroll-view-bg-color) 0px 0px var(--scroll-view-fading-edge-length) var(--scroll-view-fading-edge-length)}to{box-shadow:0 0 #0000}}scroll-view[fading-edge-length]::part(top-fade-mask){animation-name:scrollViewTopFading;top:0}scroll-view[fading-edge-length]::part(bot-fade-mask){animation-name:scrollViewBotFading;bottom:0}scroll-view[fading-edge-length]::part(top-fade-mask),scroll-view[fading-edge-length]::part(bot-fade-mask){flex:none;animation-duration:1ms;animation-timeline:--scroll-view-timeline;display:flex;left:0}}scroll-view[x-enable-scrolltolower-event]::part(lower-threshold-observer),scroll-view[x-enable-scrolltoupper-event]::part(upper-threshold-observer){display:flex}scroll-view[scroll-y][x-enable-scrolltolower-event]::part(lower-threshold-observer),scroll-view[scroll-orientation=vertical][x-enable-scrolltolower-event]::part(lower-threshold-observer){flex-direction:column-reverse!important}scroll-view[scroll-x][x-enable-scrolltolower-event]::part(lower-threshold-observer),scroll-view[scroll-orientation=horizontal][x-enable-scrolltolower-event]::part(lower-threshold-observer){flex-direction:row-reverse!important}","",{version:3,sources:["webpack://./../web-elements/src/elements/ScrollView/scroll-view.css"],names:[],mappings:"AAKA,YAAA,gDAAA,CAAA,gBAAA,CAAA,2CAAA,CAAA,6CAAA,CAAA,sCAAA,CAAA,+BAAA,CAAA,sBAAA,CAcA,yCAAA,aAAA,CAAA,yEAAA,CAAA,0CAAA,CAAA,mCAAA,CAOA,wBAAA,oBAAA,CAIA,+BAAA,YAAA,CAAA,+BAAA,YAAA,CAIA,6DAAA,uBAAA,CAIA,iDAAA,eAAA,CAAA,kDAAA,eAAA,CAKA,2EAAA,wEAAA,CAAA,4CAAA,CAAA,+BAAA,CAAA,8BAAA,CAQA,iEAAA,0EAAA,CAAA,8CAAA,CAAA,4BAAA,CAAA,8BAAA,CAQA,qCAAA,yBAAA,CAIA,8BACE,+DAAA,iBAAA,CAIA,iEAAA,iBAAA,CAAA,CAKF,yGAAA,2BAAA,CAKA,2GAAA,2BAAA,CAKA,sDAKE,+BAAA,GAAA,oBAAA,CAAA,GAAA,0HAAA,CAAA,GAAA,0HAAA,CAAA,CAeA,+BAAA,GAAA,0HAAA,CAAA,IAAA,0HAAA,CAAA,GAAA,oBAAA,CAAA,CAeA,qDAAA,kCAAA,CAAA,KAAA,CAIA,qDAAA,kCAAA,CAAA,QAAA,CAIA,0GAAA,SAAA,CAAA,sBAAA,CAAA,yCAAA,CAAA,YAAA,CAAA,MAAA,CAAA,CAUF,oJAAA,YAAA,CAKA,2LAAA,uCAAA,CAKA,6LAAA,oCAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nscroll-view {\n display: flex !important;\n --lynx-display: linear !important;\n --lynx-display-toggle: var(--lynx-display-linear);\n flex-wrap: nowrap;\n flex-direction: var(--linear-flex-direction);\n justify-content: var(--linear-justify-content);\n scroll-timeline: --scroll-view-timeline;\n}\n\n/**\n * The scroll-view would always be a linear container\n * see linear.css\n */\nscroll-view > *, scroll-view > lynx-wrapper > * {\n flex-shrink: 0;\n flex-grow: calc(var(--lynx-linear-weight) / var(--lynx-linear-weight-sum));\n flex-basis: var(--lynx-linear-weight-basis);\n align-self: var(--align-self-column);\n}\n\nscroll-view, scroll-view {\n scrollbar-width: none;\n}\n\nscroll-view::-webkit-scrollbar, scroll-view::-webkit-scrollbar {\n display: none;\n}\n\nscroll-view[enable-scrollbar], scroll-view[scroll-bar-enable] {\n scrollbar-width: initial;\n}\n\nscroll-view[enable-scrollbar]::-webkit-scrollbar,\nscroll-view[scroll-bar-enable]::-webkit-scrollbar {\n display: initial;\n}\n\nscroll-view, scroll-view[scroll-y], scroll-view[scroll-orientation="vertical"] {\n overflow-y: scroll !important;\n overflow-x: clip !important;\n flex-direction: column !important;\n --lynx-linear-orientation: vertical !important;\n --lynx-linear-orientation-toggle: var(--lynx-linear-orientation-vertical);\n}\n\nscroll-view[scroll-x], scroll-view[scroll-orientation="horizontal"] {\n overflow-y: clip !important;\n overflow-x: scroll !important;\n flex-direction: row !important;\n --lynx-linear-orientation: horizontal !important;\n --lynx-linear-orientation-toggle: var(--lynx-linear-orientation-horizontal);\n}\n\nscroll-view[scroll-orientation="both"] {\n overflow: scroll !important;\n}\n\n@supports not (overflow: clip) {\n scroll-view[scroll-y], scroll-view[scroll-orientation="vertical"] {\n overflow-x: hidden;\n }\n\n scroll-view[scroll-x], scroll-view[scroll-orientation="horizontal"] {\n overflow-y: hidden;\n }\n}\n\nscroll-view[scroll-y][enable-scroll="false"],\nscroll-view[scroll-orientation="vertical"][enable-scroll="false"] {\n overflow-y: hidden !important;\n}\n\nscroll-view[scroll-x][enable-scroll="false"],\nscroll-view[scroll-orientation="horizontal"][enable-scroll="false"] {\n overflow-x: hidden !important;\n}\n\n@supports (animation-timeline: --scroll-view-timeline) {\n /* \n https://chromestatus.com/feature/6752840701706240 It notes that this feature is actively implementing in webkit and gecko.\n chrome 115, firefox no, safari no\n */\n @keyframes scrollViewTopFading {\n 0% {\n box-shadow: transparent 0px 0px 0px 0px;\n }\n 5% {\n box-shadow: var(--scroll-view-bg-color) 0px 0px\n var(--scroll-view-fading-edge-length)\n var(--scroll-view-fading-edge-length);\n }\n 100% {\n box-shadow: var(--scroll-view-bg-color) 0px 0px\n var(--scroll-view-fading-edge-length)\n var(--scroll-view-fading-edge-length);\n }\n }\n @keyframes scrollViewBotFading {\n 0% {\n box-shadow: var(--scroll-view-bg-color) 0px 0px\n var(--scroll-view-fading-edge-length)\n var(--scroll-view-fading-edge-length);\n }\n 95% {\n box-shadow: var(--scroll-view-bg-color) 0px 0px\n var(--scroll-view-fading-edge-length)\n var(--scroll-view-fading-edge-length);\n }\n 100% {\n box-shadow: transparent 0px 0px 0px 0px;\n }\n }\n scroll-view[fading-edge-length]::part(top-fade-mask) {\n top: 0;\n animation-name: scrollViewTopFading;\n }\n scroll-view[fading-edge-length]::part(bot-fade-mask) {\n bottom: 0;\n animation-name: scrollViewBotFading;\n }\n scroll-view[fading-edge-length]::part(top-fade-mask),\n scroll-view[fading-edge-length]::part(bot-fade-mask) {\n left: 0;\n display: flex;\n flex: 0 0 auto;\n animation-duration: 1ms;\n animation-timeline: --scroll-view-timeline;\n }\n}\n\nscroll-view[x-enable-scrolltolower-event]::part(lower-threshold-observer),\nscroll-view[x-enable-scrolltoupper-event]::part(upper-threshold-observer) {\n display: flex;\n}\n\nscroll-view[scroll-y][x-enable-scrolltolower-event]::part(lower-threshold-observer),\nscroll-view[scroll-orientation="vertical"][x-enable-scrolltolower-event]::part(lower-threshold-observer) {\n flex-direction: column-reverse !important;\n}\n\nscroll-view[scroll-x][x-enable-scrolltolower-event]::part(lower-threshold-observer),\nscroll-view[scroll-orientation="horizontal"][x-enable-scrolltolower-event]::part(lower-threshold-observer) {\n flex-direction: row-reverse !important;\n}\n'],sourceRoot:""}]),n.A=o.toString()},3351(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-canvas{contain:strict;flex-direction:column}x-canvas>*{display:none!important}x-canvas::part(canvas){width:100%;height:100%}","",{version:3,sources:["webpack://./../web-elements/src/elements/XCanvas/x-canvas.css"],names:[],mappings:"AAKA,SAAA,cAAA,CAAA,qBAAA,CAIA,WAAA,sBAAA,CAGA,uBAAA,UAAA,CAAA,WAAA",sourcesContent:["/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-canvas {\n contain: strict;\n flex-direction: column;\n}\nx-canvas > * {\n display: none !important;\n}\nx-canvas::part(canvas) {\n height: 100%;\n width: 100%;\n}\n"],sourceRoot:""}]),n.A=o.toString()},8762(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-foldview-ng{overscroll-behavior:contain;--foldview-header-height:0px;scrollbar-width:none;display:flex;overflow-x:hidden;overflow-y:scroll!important}x-foldview-ng::-webkit-scrollbar{display:none}x-foldview-ng[scroll-bar-enable]{scrollbar-width:initial}x-foldview-ng[scroll-bar-enable]::-webkit-scrollbar{display:initial}x-foldview-ng:not([scroll-bar-enable],[scroll-bar-enable=true])::-webkit-scrollbar{display:none}x-foldview-ng[scroll-enable=false]{overflow-y:hidden}x-foldview-ng>*,x-foldview-header-ng,x-foldview-slot-ng,x-foldview-toolbar-ng{display:none}x-foldview-ng>x-foldview-header-ng,x-foldview-ng>x-foldview-slot-ng,x-foldview-ng>x-foldview-toolbar-ng,x-foldview-ng>lynx-wrapper>x-foldview-header-ng,x-foldview-ng>lynx-wrapper>x-foldview-slot-ng,x-foldview-ng>lynx-wrapper>x-foldview-toolbar-ng{display:flex}x-foldview-toolbar-ng{z-index:1;order:1;position:sticky;top:0}x-foldview-header-ng{flex:none;order:2;position:absolute}x-foldview-ng[header-over-slot]>x-foldview-slot-ng,x-foldview-ng[header-over-slot]>lynx-wrapper>x-foldview-slot-ng{z-index:1}x-foldview-slot-ng{contain:strict;order:3}x-foldview-slot-ng scroll-view{overscroll-behavior-y:none}","",{version:3,sources:["webpack://./../web-elements/src/elements/XFoldViewNg/x-foldview-ng.css"],names:[],mappings:"AAKA,cAAA,2BAAA,CAAA,4BAAA,CAAA,oBAAA,CAAA,YAAA,CAAA,iBAAA,CAAA,2BAAA,CAUA,iCAAA,YAAA,CAIA,iCAAA,uBAAA,CAIA,oDAAA,eAAA,CAIA,mFAAA,YAAA,CAIA,mCAAA,iBAAA,CAIA,8EAAA,YAAA,CAOA,uPAAA,YAAA,CAQA,sBAAA,SAAA,CAAA,OAAA,CAAA,eAAA,CAAA,KAAA,CAOA,qBAAA,SAAA,CAAA,OAAA,CAAA,iBAAA,CAMA,mHAAA,SAAA,CAKA,mBAAA,cAAA,CAAA,OAAA,CAIA,+BAAA,0BAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-foldview-ng {\n display: flex;\n overflow-y: scroll !important;\n overflow-x: clip;\n overflow-x: hidden;\n overscroll-behavior: contain;\n --foldview-header-height: 0px;\n scrollbar-width: none;\n}\n\nx-foldview-ng::-webkit-scrollbar {\n display: none;\n}\n\nx-foldview-ng[scroll-bar-enable] {\n scrollbar-width: initial;\n}\n\nx-foldview-ng[scroll-bar-enable]::-webkit-scrollbar {\n display: initial;\n}\n\nx-foldview-ng:not([scroll-bar-enable], [scroll-bar-enable="true"])::-webkit-scrollbar {\n display: none;\n}\n\nx-foldview-ng[scroll-enable="false"] {\n overflow-y: hidden;\n}\n\nx-foldview-ng > *,\nx-foldview-header-ng,\nx-foldview-slot-ng,\nx-foldview-toolbar-ng {\n display: none;\n}\n\nx-foldview-ng > x-foldview-header-ng,\nx-foldview-ng > x-foldview-slot-ng,\nx-foldview-ng > x-foldview-toolbar-ng,\nx-foldview-ng > lynx-wrapper > x-foldview-header-ng,\nx-foldview-ng > lynx-wrapper > x-foldview-slot-ng,\nx-foldview-ng > lynx-wrapper > x-foldview-toolbar-ng {\n display: flex;\n}\nx-foldview-toolbar-ng {\n order: 1;\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\nx-foldview-header-ng {\n order: 2;\n flex: 0 0 auto;\n position: absolute;\n}\n\nx-foldview-ng[header-over-slot] > x-foldview-slot-ng,\nx-foldview-ng[header-over-slot] > lynx-wrapper > x-foldview-slot-ng {\n z-index: 1;\n}\n\nx-foldview-slot-ng {\n contain: strict;\n order: 3;\n}\nx-foldview-slot-ng scroll-view {\n /* avoiding default bounce on ios safari */\n overscroll-behavior-y: none;\n}\n'],sourceRoot:""}]),n.A=o.toString()},4651(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-image,filter-image{--justify-content:center;contain:strict;object-fit:fill;justify-content:center;align-items:center;flex-direction:row!important}x-image>*,filter-image>*{display:none}x-image[blur-radius]::part(img){--blur-radius:0;filter:blur(var(--blur-radius))}filter-image[blur-radius]::part(img),filter-image[drop-shadow]::part(img){--blur-radius:0;--drop-shadow:0px 0px;filter:blur(var(--blur-radius)) drop-shadow(var(--drop-shadow))}x-image:not([auto-size])::part(img),filter-image::part(img){object-fit:inherit;flex:0 0 100%;align-self:stretch;width:100%}x-image[mode=aspectFit],filter-image[mode=aspectFit]{object-fit:contain}x-image[mode=aspectFill],filter-image[mode=aspectFill]{object-fit:cover}x-image[mode=center]:not([auto-size])::part(img),filter-image[mode=center]::part(img){width:unset;flex:unset;align-self:unset;margin:auto;position:absolute}x-image[auto-size]{display:contents}x-image[auto-size]::part(img){margin:inherit;padding:inherit;width:inherit;height:inherit;box-sizing:inherit;flex:inherit;min-width:inherit;min-height:inherit;border:inherit;border-radius:inherit;max-width:100%;max-height:100%;position:inherit;top:inherit;left:inherit;right:inherit;bottom:inherit;transform:inherit;opacity:inherit;z-index:inherit;filter:inherit}","",{version:3,sources:["webpack://./../web-elements/src/elements/XImage/x-image.css"],names:[],mappings:"AAKA,qBAAA,wBAAA,CAAA,cAAA,CAAA,eAAA,CAAA,sBAAA,CAAA,kBAAA,CAAA,4BAAA,CASA,yBAAA,YAAA,CAKA,gCAAA,eAAA,CAAA,+BAAA,CAKA,0EAAA,eAAA,CAAA,qBAAA,CAAA,+DAAA,CAMA,4DAAA,kBAAA,CAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAOA,qDAAA,kBAAA,CAIA,uDAAA,gBAAA,CAIA,sFAAA,WAAA,CAAA,UAAA,CAAA,gBAAA,CAAA,WAAA,CAAA,iBAAA,CASA,mBAAA,gBAAA,CAIA,8BAAA,cAAA,CAAA,eAAA,CAAA,aAAA,CAAA,cAAA,CAAA,kBAAA,CAAA,YAAA,CAAA,iBAAA,CAAA,kBAAA,CAAA,cAAA,CAAA,qBAAA,CAAA,cAAA,CAAA,eAAA,CAAA,gBAAA,CAAA,WAAA,CAAA,YAAA,CAAA,aAAA,CAAA,cAAA,CAAA,iBAAA,CAAA,eAAA,CAAA,eAAA,CAAA,cAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-image, filter-image {\n align-items: center;\n justify-content: center;\n --justify-content: center;\n flex-direction: row !important;\n contain: strict;\n object-fit: fill;\n}\n\nx-image > *,\nfilter-image > * {\n display: none;\n}\n\nx-image[blur-radius]::part(img) {\n --blur-radius: 0;\n filter: blur(var(--blur-radius));\n}\n\nfilter-image[blur-radius]::part(img), filter-image[drop-shadow]::part(img) {\n --blur-radius: 0;\n --drop-shadow: 0px 0px;\n filter: blur(var(--blur-radius)) drop-shadow(var(--drop-shadow));\n}\n\nx-image:not([auto-size])::part(img), filter-image::part(img) {\n width: 100%;\n flex: 0 0 100%;\n align-self: stretch;\n object-fit: inherit;\n}\n\nx-image[mode="aspectFit"], filter-image[mode="aspectFit"] {\n object-fit: contain;\n}\n\nx-image[mode="aspectFill"], filter-image[mode="aspectFill"] {\n object-fit: cover;\n}\n\nx-image[mode="center"]:not([auto-size])::part(img),\nfilter-image[mode="center"]::part(img) {\n position: absolute;\n margin: auto;\n width: unset;\n flex: unset;\n align-self: unset;\n}\n\nx-image[auto-size] {\n display: contents;\n}\n\nx-image[auto-size]::part(img) {\n margin: inherit;\n padding: inherit;\n width: inherit;\n height: inherit;\n box-sizing: inherit;\n flex: inherit;\n min-width: inherit;\n min-height: inherit;\n border: inherit;\n border-radius: inherit;\n max-width: 100%;\n max-height: 100%;\n position: inherit;\n top: inherit;\n left: inherit;\n right: inherit;\n bottom: inherit;\n transform: inherit;\n opacity: inherit;\n z-index: inherit;\n filter: inherit;\n}\n'],sourceRoot:""}]),n.A=o.toString()},3503(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-input{font-size:14px;display:contents!important}x-input::part(form){display:contents}x-input::part(input),x-input::part(form){box-sizing:inherit;width:inherit;height:inherit;border:inherit;border-radius:inherit;align-self:inherit;justify-self:inherit;text-align:inherit;direction:inherit;caret-color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;letter-spacing:inherit;flex:inherit;background-color:inherit;z-index:inherit;margin:inherit;padding:inherit;color:inherit}x-input::part(input){--placeholder-color:grey;--placeholder-font-weight:normal}x-input::part(input)::placeholder{color:var(--placeholder-color);font-family:var(--placeholder-font-family);font-size:var(--placeholder-font-size,inherit);font-weight:var(--placeholder-font-weight)}","",{version:3,sources:["webpack://./../web-elements/src/elements/XInput/x-input.css"],names:[],mappings:"AAKA,QAAA,cAAA,CAAA,0BAAA,CAKA,oBAAA,gBAAA,CAGA,yCAAA,kBAAA,CAAA,aAAA,CAAA,cAAA,CAAA,cAAA,CAAA,qBAAA,CAAA,kBAAA,CAAA,oBAAA,CAAA,kBAAA,CAAA,iBAAA,CAAA,mBAAA,CAAA,mBAAA,CAAA,iBAAA,CAAA,mBAAA,CAAA,sBAAA,CAAA,YAAA,CAAA,wBAAA,CAAA,eAAA,CAAA,cAAA,CAAA,eAAA,CAAA,aAAA,CAuBA,qBAAA,wBAAA,CAAA,gCAAA,CAKA,kCAAA,8BAAA,CAAA,0CAAA,CAAA,8CAAA,CAAA,0CAAA",sourcesContent:["/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-input {\n display: contents !important;\n font-size: 14px;\n}\n\nx-input::part(form) {\n display: contents;\n}\nx-input::part(input), x-input::part(form) {\n box-sizing: inherit;\n width: inherit;\n height: inherit;\n border: inherit;\n border-radius: inherit;\n align-self: inherit;\n justify-self: inherit;\n text-align: inherit;\n direction: inherit;\n caret-color: inherit;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n letter-spacing: inherit;\n flex: inherit;\n background-color: inherit;\n z-index: inherit;\n margin: inherit;\n padding: inherit;\n color: inherit;\n}\n\nx-input::part(input) {\n --placeholder-color: grey;\n --placeholder-font-weight: normal;\n}\n\nx-input::part(input)::placeholder {\n color: var(--placeholder-color);\n font-family: var(--placeholder-font-family);\n font-size: var(--placeholder-font-size, inherit);\n font-weight: var(--placeholder-font-weight);\n}\n"],sourceRoot:""}]),n.A=o.toString()},7787(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-list{contain:layout;scrollbar-width:none;--list-item-sticky-offset:0;--list-item-span-count:0;--list-main-axis-gap:0px;--list-cross-axis-gap:0px;container-type:size}x-list>:not(list-item){display:none}x-list::part(content),x-list[list-type=waterfall]::part(waterfall-content){justify-content:inherit;background-color:inherit;flex-wrap:nowrap;flex:none;flex-direction:inherit;scrollbar-width:inherit;scroll-snap-type:inherit;scroll-snap-align:start;width:100%;height:100%;overflow:inherit;content-visibility:auto;row-gap:inherit;column-gap:inherit;display:flex;position:relative}x-list::part(content),x-list::part(slot){--lynx-display:inherit}x-list,x-list::part(content){scrollbar-width:none}x-list::-webkit-scrollbar{display:none}x-list::part(content)::-webkit-scrollbar{display:none}x-list[scrollbar-enable]::part(content){scrollbar-width:initial}x-list[scrollbar-enable]::part(content)::-webkit-scrollbar{display:initial}list-item{content-visibility:auto;contain:layout paint;contain-intrinsic-size:none auto var(--estimated-main-axis-size-px,100cqh);display:none;position:static;flex:none!important}list-item[recyclable=false]{content-visibility:visible;contain:initial}x-list[scroll-orientation=horizontal] list-item{contain-intrinsic-size:auto var(--estimated-main-axis-size-px,100cqw) none}x-list>list-item,x-list>lynx-wrapper>list-item{display:flex}x-list{overflow:clip scroll!important}x-list[scroll-orientation=horizontal]{overflow:scroll clip!important}x-list[enable-scroll=false]{overflow-y:hidden!important}x-list[scroll-orientation=horizontal][enable-scroll=false]{overflow-x:hidden!important}x-list[sticky=true] list-item[sticky-top],x-list[sticky=true] list-item[sticky-bottom]{z-index:1;position:sticky}x-list[sticky=true]>list-item[sticky-top],x-list[sticky=true]>lynx-wrapper>list-item[sticky-top]{top:var(--list-item-sticky-offset)}x-list[sticky=true]>list-item[sticky-bottom],x-list[sticky=true]>lynx-wrapper>list-item[sticky-bottom]{bottom:var(--list-item-sticky-offset)}x-list[sticky=true][scroll-orientation=horizontal]>list-item[sticky-top],x-list[sticky=true][scroll-orientation=horizontal]>lynx-wrapper>list-item[sticky-top]{top:unset;left:var(--list-item-sticky-offset)}x-list[sticky=true][scroll-orientation=horizontal]>list-item[sticky-bottom],x-list[sticky=true][scroll-orientation=horizontal]>lynx-wrapper>list-item[sticky-bottom]{bottom:unset;right:var(--list-item-sticky-offset)}x-list[item-snap],x-list[paging-enabled]{scroll-snap-type:y mandatory;scroll-snap-stop:always}x-list[item-snap][scroll-orientation=horizontal],x-list[paging-enabled][scroll-orientation=horizontal]{scroll-snap-type:x mandatory}x-list[item-snap]>list-item,x-list[item-snap]>lynx-wrapper>list-item{scroll-snap-align:start}x-list[x-enable-scrolltoupper-event]::part(upper-threshold-observer),x-list[x-enable-scrolltoupperedge-event]::part(upper-threshold-observer),x-list[x-enable-scrolltolower-event]::part(lower-threshold-observer),x-list[x-enable-scrolltoloweredge-event]::part(lower-threshold-observer){display:flex}x-list[x-enable-scrolltoupper-event]::part(upper-threshold-sentinel),x-list[x-enable-scrolltoupperedge-event]::part(upper-threshold-sentinel),x-list[x-enable-scrolltolower-event]::part(lower-threshold-sentinel),x-list[x-enable-scrolltoloweredge-event]::part(lower-threshold-sentinel){flex:0 0 1px}x-list[x-enable-scrolltoupper-event]::part(upper-threshold-sentinel),x-list[x-enable-scrolltoupperedge-event]::part(upper-threshold-sentinel){margin-bottom:-1px}x-list[x-enable-scrolltolower-event]::part(lower-threshold-sentinel),x-list[x-enable-scrolltoloweredge-event]::part(lower-threshold-sentinel){margin-top:-1px;transform:translateY(1px)}x-list[scroll-orientation=horizontal][x-enable-scrolltoupper-event]::part(upper-threshold-sentinel),x-list[scroll-orientation=horizontal][x-enable-scrolltoupperedge-event]::part(upper-threshold-sentinel){margin-bottom:0;margin-right:-1px}x-list[scroll-orientation=horizontal][x-enable-scrolltolower-event]::part(lower-threshold-sentinel),x-list[scroll-orientation=horizontal][x-enable-scrolltoloweredge-event]::part(lower-threshold-sentinel){margin-top:0;margin-left:-1px;transform:translate(1px)}x-list::part(lower-threshold-observer){flex-direction:column-reverse}x-list[vertical-orientation=false]::part(lower-threshold-observer){flex-direction:row-reverse}x-list{align-items:stretch;row-gap:var(--list-main-axis-gap);column-gap:var(--list-cross-axis-gap);flex-direction:column;display:flex}x-list[scroll-orientation=horizontal]{row-gap:var(--list-cross-axis-gap);column-gap:var(--list-main-axis-gap);flex-direction:row}x-list[list-type=flow]::part(content){grid-template-columns:repeat(var(--list-item-span-count), 1fr);grid-row-gap:var(--list-main-axis-gap);grid-column-gap:var(--list-cross-axis-gap);grid-auto-rows:min-content;place-items:start stretch;display:grid}x-list[list-type=flow][scroll-orientation=horizontal]::part(content){grid-template-rows:repeat(var(--list-item-span-count), 1fr);grid-row-gap:var(--list-cross-axis-gap);grid-column-gap:var(--list-main-axis-gap);grid-auto-columns:min-content;grid-auto-flow:column;place-items:stretch start}x-list[list-type=flow] list-item[full-span]:not([full-span=false]){grid-column-start:1;grid-column-end:calc(var(--list-item-span-count) + 1)}x-list[list-type=flow][scroll-orientation=horizontal] list-item[full-span]:not([full-span=false]){grid-row-start:1;grid-row-end:calc(var(--list-item-span-count) + 1)}x-list[list-type=flow][x-enable-scrolltoupper-event]::part(upper-threshold-observer),x-list[list-type=flow][x-enable-scrolltoupperedge-event]::part(upper-threshold-observer),x-list[list-type=flow][x-enable-scrolltolower-event]::part(lower-threshold-observer),x-list[list-type=flow][x-enable-scrolltoloweredge-event]::part(lower-threshold-observer){grid-column:1 / calc(var(--list-item-span-count) + 1)}x-list[list-type=flow][scroll-orientation=horizontal][x-enable-scrolltoupper-event]::part(upper-threshold-observer),x-list[list-type=flow][scroll-orientation=horizontal][x-enable-scrolltoupperedge-event]::part(upper-threshold-observer),x-list[list-type=flow][scroll-orientation=horizontal][x-enable-scrolltolower-event]::part(lower-threshold-observer),x-list[list-type=flow][scroll-orientation=horizontal][x-enable-scrolltoloweredge-event]::part(lower-threshold-observer){grid-row:1 / calc(var(--list-item-span-count) + 1)}x-list[list-type=waterfall]{flex-direction:column;display:flex}x-list[list-type=waterfall][scroll-orientation=horizontal]{flex-direction:row}x-list[list-type=waterfall]::part(slot){visibility:hidden}x-list[list-type=waterfall] list-item{width:calc(( 100% - var(--list-cross-axis-gap) * (var(--list-item-span-count) - 1) ) / var(--list-item-span-count));height:fit-content;position:absolute}x-list[list-type=waterfall][scroll-orientation=horizontal] list-item{width:fit-content;height:calc(( 100% - var(--list-cross-axis-gap) * (var(--list-item-span-count) - 1) ) / var(--list-item-span-count))}x-list[list-type=waterfall] list-item[full-span]:not([full-span=false]){width:100%;height:fit-content}x-list[list-type=waterfall][scroll-orientation=horizontal] list-item[full-span]:not([full-span=false]){width:fit-content;height:100%}x-list[list-type=waterfall]::part(upper-threshold-observer),x-list[list-type=waterfall]::part(lower-threshold-observer){position:absolute}x-list[list-type=waterfall]::part(lower-threshold-observer){bottom:-999px}x-list[list-type=waterfall][scroll-orientation=horizontal]::part(lower-threshold-observer){bottom:unset;right:-999px}","",{version:3,sources:["webpack://./../web-elements/src/elements/XList/x-list.css"],names:[],mappings:"AAKA,OAAA,cAAA,CAAA,oBAAA,CAAA,2BAAA,CAAA,wBAAA,CAAA,wBAAA,CAAA,yBAAA,CAAA,mBAAA,CAUA,uBAAA,YAAA,CAIA,2EAAA,uBAAA,CAAA,wBAAA,CAAA,gBAAA,CAAA,SAAA,CAAA,sBAAA,CAAA,uBAAA,CAAA,wBAAA,CAAA,uBAAA,CAAA,UAAA,CAAA,WAAA,CAAA,gBAAA,CAAA,uBAAA,CAAA,eAAA,CAAA,kBAAA,CAAA,YAAA,CAAA,iBAAA,CAoBA,yCAAA,sBAAA,CAKA,6BAAA,oBAAA,CAKA,0BAAA,YAAA,CAAA,yCAAA,YAAA,CAKA,wCAAA,uBAAA,CAIA,2DAAA,eAAA,CAIA,UAAA,uBAAA,CAAA,oBAAA,CAAA,0EAAA,CAAA,YAAA,CAAA,eAAA,CAAA,mBAAA,CASA,4BAAA,0BAAA,CAAA,eAAA,CAKA,gDAAA,0EAAA,CAIA,+CAAA,YAAA,CAKA,OAAA,8BAAA,CAKA,sCAAA,8BAAA,CAKA,4BAAA,2BAAA,CAIA,2DAAA,2BAAA,CAIA,uFAAA,SAAA,CAAA,eAAA,CAMA,iGAAA,kCAAA,CAKA,uGAAA,qCAAA,CAKA,+JAAA,SAAA,CAAA,mCAAA,CAQA,qKAAA,YAAA,CAAA,oCAAA,CASA,yCAAA,4BAAA,CAAA,uBAAA,CAMA,uGAAA,4BAAA,CAKA,qEAAA,uBAAA,CAKA,4RAAA,YAAA,CAOA,4RAAA,YAAA,CAOA,8IAAA,kBAAA,CAKA,8IAAA,eAAA,CAAA,yBAAA,CAMA,4MAAA,eAAA,CAAA,iBAAA,CAMA,4MAAA,YAAA,CAAA,gBAAA,CAAA,wBAAA,CAOA,uCAAA,6BAAA,CAIA,mEAAA,0BAAA,CAKA,OAAA,mBAAA,CAAA,iCAAA,CAAA,qCAAA,CAAA,qBAAA,CAAA,YAAA,CAQA,sCAAA,kCAAA,CAAA,oCAAA,CAAA,kBAAA,CAOA,sCAAA,8DAAA,CAAA,sCAAA,CAAA,0CAAA,CAAA,0BAAA,CAAA,yBAAA,CAAA,YAAA,CAUA,qEAAA,2DAAA,CAAA,uCAAA,CAAA,yCAAA,CAAA,6BAAA,CAAA,qBAAA,CAAA,yBAAA,CAUA,mEAAA,mBAAA,CAAA,qDAAA,CAKA,kGAAA,gBAAA,CAAA,kDAAA,CAMA,4VAAA,qDAAA,CAOA,wdAAA,kDAAA,CAQA,4BAAA,qBAAA,CAAA,YAAA,CAKA,2DAAA,kBAAA,CAIA,wCAAA,iBAAA,CAIA,sCAAA,mHAAA,CAAA,kBAAA,CAAA,iBAAA,CAcA,qEAAA,iBAAA,CAAA,oHAAA,CAUA,wEAAA,UAAA,CAAA,kBAAA,CAKA,uGAAA,iBAAA,CAAA,WAAA,CAMA,wHAAA,iBAAA,CAKA,4DAAA,aAAA,CAIA,2FAAA,YAAA,CAAA,YAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-list {\n contain: layout;\n scrollbar-width: none;\n container-type: size;\n --list-item-sticky-offset: 0;\n --list-item-span-count: 0;\n --list-main-axis-gap: 0px;\n --list-cross-axis-gap: 0px;\n}\n\nx-list > *:not(list-item) {\n display: none;\n}\n\nx-list::part(content),\nx-list[list-type="waterfall"]::part(waterfall-content) {\n display: flex;\n flex: 0 0 auto;\n flex-wrap: nowrap;\n width: 100%;\n height: 100%;\n justify-content: inherit;\n background-color: inherit;\n flex-direction: inherit;\n scrollbar-width: inherit;\n scroll-snap-type: inherit;\n scroll-snap-align: start;\n overflow: inherit;\n position: relative;\n content-visibility: auto;\n row-gap: inherit;\n column-gap: inherit;\n}\n\nx-list::part(content),\nx-list::part(slot) {\n --lynx-display: inherit;\n}\n\nx-list,\nx-list::part(content) {\n scrollbar-width: none;\n}\n\nx-list::-webkit-scrollbar,\nx-list::part(content)::-webkit-scrollbar {\n display: none;\n}\n\nx-list[scrollbar-enable]::part(content) {\n scrollbar-width: initial;\n}\n\nx-list[scrollbar-enable]::part(content)::-webkit-scrollbar {\n display: initial;\n}\n\nlist-item {\n display: none;\n content-visibility: auto;\n flex: 0 0 auto !important;\n position: static;\n contain: layout paint;\n contain-intrinsic-size: none auto var(--estimated-main-axis-size-px, 100cqh);\n}\n\nlist-item[recyclable="false"] {\n content-visibility: visible;\n contain: initial;\n}\n\nx-list[scroll-orientation="horizontal"] list-item {\n contain-intrinsic-size: auto var(--estimated-main-axis-size-px, 100cqw) none;\n}\n\nx-list > list-item,\nx-list > lynx-wrapper > list-item {\n display: flex;\n}\n\nx-list {\n overflow-y: scroll !important;\n overflow-x: clip !important;\n}\n\nx-list[scroll-orientation="horizontal"] {\n overflow-x: scroll !important;\n overflow-y: clip !important;\n}\n\nx-list[enable-scroll="false"] {\n overflow-y: hidden !important;\n}\n\nx-list[scroll-orientation="horizontal"][enable-scroll="false"] {\n overflow-x: hidden !important;\n}\n\nx-list[sticky="true"] list-item[sticky-top],\nx-list[sticky="true"] list-item[sticky-bottom] {\n position: sticky;\n z-index: 1;\n}\n\nx-list[sticky="true"] > list-item[sticky-top],\nx-list[sticky="true"] > lynx-wrapper > list-item[sticky-top] {\n top: var(--list-item-sticky-offset);\n}\n\nx-list[sticky="true"] > list-item[sticky-bottom],\nx-list[sticky="true"] > lynx-wrapper > list-item[sticky-bottom] {\n bottom: var(--list-item-sticky-offset);\n}\n\nx-list[sticky="true"][scroll-orientation="horizontal"] > list-item[sticky-top],\nx-list[sticky="true"][scroll-orientation="horizontal"]\n > lynx-wrapper\n > list-item[sticky-top] {\n top: unset;\n left: var(--list-item-sticky-offset);\n}\n\nx-list[sticky="true"][scroll-orientation="horizontal"]\n > list-item[sticky-bottom],\nx-list[sticky="true"][scroll-orientation="horizontal"]\n > lynx-wrapper\n > list-item[sticky-bottom] {\n bottom: unset;\n right: var(--list-item-sticky-offset);\n}\n\nx-list[item-snap],\nx-list[paging-enabled] {\n scroll-snap-type: y mandatory;\n scroll-snap-stop: always;\n}\n\nx-list[item-snap][scroll-orientation="horizontal"],\nx-list[paging-enabled][scroll-orientation="horizontal"] {\n scroll-snap-type: x mandatory;\n}\n\nx-list[item-snap] > list-item,\nx-list[item-snap] > lynx-wrapper > list-item {\n scroll-snap-align: start;\n}\n\nx-list[x-enable-scrolltoupper-event]::part(upper-threshold-observer),\nx-list[x-enable-scrolltoupperedge-event]::part(upper-threshold-observer),\nx-list[x-enable-scrolltolower-event]::part(lower-threshold-observer),\nx-list[x-enable-scrolltoloweredge-event]::part(lower-threshold-observer) {\n display: flex;\n}\n\nx-list[x-enable-scrolltoupper-event]::part(upper-threshold-sentinel),\nx-list[x-enable-scrolltoupperedge-event]::part(upper-threshold-sentinel),\nx-list[x-enable-scrolltolower-event]::part(lower-threshold-sentinel),\nx-list[x-enable-scrolltoloweredge-event]::part(lower-threshold-sentinel) {\n flex: 0 0 1px;\n}\n\nx-list[x-enable-scrolltoupper-event]::part(upper-threshold-sentinel),\nx-list[x-enable-scrolltoupperedge-event]::part(upper-threshold-sentinel) {\n margin-bottom: -1px;\n}\n\nx-list[x-enable-scrolltolower-event]::part(lower-threshold-sentinel),\nx-list[x-enable-scrolltoloweredge-event]::part(lower-threshold-sentinel) {\n margin-top: -1px;\n transform: translateY(1px);\n}\n\nx-list[scroll-orientation="horizontal"][x-enable-scrolltoupper-event]::part(upper-threshold-sentinel),\nx-list[scroll-orientation="horizontal"][x-enable-scrolltoupperedge-event]::part(upper-threshold-sentinel) {\n margin-bottom: 0;\n margin-right: -1px;\n}\n\nx-list[scroll-orientation="horizontal"][x-enable-scrolltolower-event]::part(lower-threshold-sentinel),\nx-list[scroll-orientation="horizontal"][x-enable-scrolltoloweredge-event]::part(lower-threshold-sentinel) {\n margin-top: 0;\n margin-left: -1px;\n transform: translateX(1px);\n}\n\nx-list::part(lower-threshold-observer) {\n flex-direction: column-reverse;\n}\n\nx-list[vertical-orientation="false"]::part(lower-threshold-observer) {\n flex-direction: row-reverse;\n}\n\n/* list-type single */\nx-list {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n row-gap: var(--list-main-axis-gap);\n column-gap: var(--list-cross-axis-gap);\n}\n\nx-list[scroll-orientation="horizontal"] {\n flex-direction: row;\n row-gap: var(--list-cross-axis-gap);\n column-gap: var(--list-main-axis-gap);\n}\n\n/* list-type flow */\nx-list[list-type="flow"]::part(content) {\n display: grid;\n grid-template-columns: repeat(var(--list-item-span-count), 1fr);\n grid-auto-rows: min-content;\n justify-items: stretch;\n align-items: start;\n grid-row-gap: var(--list-main-axis-gap);\n grid-column-gap: var(--list-cross-axis-gap);\n}\n\nx-list[list-type="flow"][scroll-orientation="horizontal"]::part(content) {\n grid-template-rows: repeat(var(--list-item-span-count), 1fr);\n grid-auto-flow: column;\n grid-auto-columns: min-content;\n justify-items: start;\n align-items: stretch;\n grid-row-gap: var(--list-cross-axis-gap);\n grid-column-gap: var(--list-main-axis-gap);\n}\n\nx-list[list-type="flow"] list-item[full-span]:not([full-span="false"]) {\n grid-column-start: 1;\n grid-column-end: calc(var(--list-item-span-count) + 1);\n}\n\nx-list[list-type="flow"][scroll-orientation="horizontal"]\n list-item[full-span]:not([full-span="false"]) {\n grid-row-start: 1;\n grid-row-end: calc(var(--list-item-span-count) + 1);\n}\n\nx-list[list-type="flow"][x-enable-scrolltoupper-event]::part(upper-threshold-observer),\nx-list[list-type="flow"][x-enable-scrolltoupperedge-event]::part(upper-threshold-observer),\nx-list[list-type="flow"][x-enable-scrolltolower-event]::part(lower-threshold-observer),\nx-list[list-type="flow"][x-enable-scrolltoloweredge-event]::part(lower-threshold-observer) {\n grid-column: 1 / calc(var(--list-item-span-count) + 1);\n}\n\nx-list[list-type="flow"][scroll-orientation="horizontal"][x-enable-scrolltoupper-event]::part(upper-threshold-observer),\nx-list[list-type="flow"][scroll-orientation="horizontal"][x-enable-scrolltoupperedge-event]::part(upper-threshold-observer),\nx-list[list-type="flow"][scroll-orientation="horizontal"][x-enable-scrolltolower-event]::part(lower-threshold-observer),\nx-list[list-type="flow"][scroll-orientation="horizontal"][x-enable-scrolltoloweredge-event]::part(lower-threshold-observer) {\n grid-row: 1 / calc(var(--list-item-span-count) + 1);\n}\n\n/* list-type waterfall */\nx-list[list-type="waterfall"] {\n display: flex;\n flex-direction: column;\n}\n\nx-list[list-type="waterfall"][scroll-orientation="horizontal"] {\n flex-direction: row;\n}\n\nx-list[list-type="waterfall"]::part(slot) {\n visibility: hidden;\n}\n\nx-list[list-type="waterfall"] list-item {\n position: absolute;\n}\n\nx-list[list-type="waterfall"] list-item {\n width: calc(\n (\n 100% - var(--list-cross-axis-gap) * (var(--list-item-span-count) - 1)\n ) /\n var(--list-item-span-count)\n );\n height: fit-content;\n}\n\nx-list[list-type="waterfall"][scroll-orientation="horizontal"] list-item {\n width: fit-content;\n height: calc(\n (\n 100% - var(--list-cross-axis-gap) * (var(--list-item-span-count) - 1)\n ) /\n var(--list-item-span-count)\n );\n}\n\nx-list[list-type="waterfall"] list-item[full-span]:not([full-span="false"]) {\n width: 100%;\n height: fit-content;\n}\n\nx-list[list-type="waterfall"][scroll-orientation="horizontal"]\n list-item[full-span]:not([full-span="false"]) {\n width: fit-content;\n height: 100%;\n}\n\nx-list[list-type="waterfall"]::part(upper-threshold-observer),\nx-list[list-type="waterfall"]::part(lower-threshold-observer) {\n position: absolute;\n}\n\nx-list[list-type="waterfall"]::part(lower-threshold-observer) {\n bottom: -999px;\n}\n\nx-list[list-type="waterfall"][scroll-orientation="horizontal"]::part(lower-threshold-observer) {\n bottom: unset;\n right: -999px;\n}\n'],sourceRoot:""}]),n.A=o.toString()},8157(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-markdown{color:inherit;flex-direction:column;align-items:stretch;display:flex}x-markdown::part(root){width:100%}","",{version:3,sources:["webpack://./../web-elements/src/elements/XMarkdown/x-markdown.css"],names:[],mappings:"AAKA,WAAA,aAAA,CAAA,qBAAA,CAAA,mBAAA,CAAA,YAAA,CAOA,uBAAA,UAAA",sourcesContent:["/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-markdown {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n color: inherit;\n}\n\nx-markdown::part(root) {\n width: 100%;\n}\n"],sourceRoot:""}]),n.A=o.toString()},8944(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,'x-overlay-ng::part(dialog){background:0 0;border:0;outline:none;width:100%;max-width:100%;height:100%;max-height:100%;margin:0;padding:0}x-overlay-ng{contain:strict;width:0;max-width:0;max-height:0;display:contents;position:fixed;top:0;overflow:visible}x-overlay-ng>:not(:first-child){display:none!important}x-overlay-ng>:first-child,x-overlay-ng>lynx-wrapper>:first-child{display:flex;position:absolute;top:0;left:0}x-overlay-ng [event-through]{pointer-events:none}x-overlay-ng:not([level]),x-overlay-ng[level="1"]{z-index:4}x-overlay-ng[level="2"]{z-index:3}x-overlay-ng[level="3"]{z-index:2}x-overlay-ng[level="4"]{z-index:1}',"",{version:3,sources:["webpack://./../web-elements/src/elements/XOverlayNg/x-overlay-ng.css"],names:[],mappings:"AAKA,2BAAA,cAAA,CAAA,QAAA,CAAA,YAAA,CAAA,UAAA,CAAA,cAAA,CAAA,WAAA,CAAA,eAAA,CAAA,QAAA,CAAA,SAAA,CAWA,aAAA,cAAA,CAAA,OAAA,CAAA,WAAA,CAAA,YAAA,CAAA,gBAAA,CAAA,cAAA,CAAA,KAAA,CAAA,gBAAA,CAUA,gCAAA,sBAAA,CAIA,iEAAA,YAAA,CAAA,iBAAA,CAAA,KAAA,CAAA,MAAA,CAOA,6BAAA,mBAAA,CAIA,kDAAA,SAAA,CAGA,wBAAA,SAAA,CAGA,wBAAA,SAAA,CAGA,wBAAA,SAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-overlay-ng::part(dialog) {\n padding: 0;\n border: 0;\n margin: 0;\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n background: transparent;\n outline: none;\n}\nx-overlay-ng {\n overflow: visible;\n position: fixed;\n display: contents;\n top: 0;\n width: 0;\n contain: strict;\n max-height: 0;\n max-width: 0;\n}\nx-overlay-ng > *:not(:first-child) {\n display: none !important;\n}\n\nx-overlay-ng > *:first-child, x-overlay-ng > lynx-wrapper > *:first-child {\n display: flex;\n top: 0;\n left: 0;\n position: absolute;\n}\n\nx-overlay-ng [event-through] {\n pointer-events: none;\n}\n\nx-overlay-ng:not([level]), x-overlay-ng[level="1"] {\n z-index: 4;\n}\nx-overlay-ng[level="2"] {\n z-index: 3;\n}\nx-overlay-ng[level="3"] {\n z-index: 2;\n}\nx-overlay-ng[level="4"] {\n z-index: 1;\n}\n'],sourceRoot:""}]),n.A=o.toString()},8152(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-refresh-header,x-refresh-footer{display:none}x-refresh-view{box-sizing:border-box;border-style:solid;border-width:0;flex-direction:column;flex-grow:0;flex-shrink:1;min-width:0;min-height:0;display:flex;position:relative}x-refresh-view::part(container),x-refresh-view::part(content),x-refresh-view::part(slot){--lynx-display:inherit}x-refresh-view:not([enable-refresh=false])>x-refresh-header:first-of-type{scroll-snap-align:none;flex-shrink:0;display:flex;position:relative!important}x-refresh-view[enable-refresh=false]::part(placeholder-top){display:none}x-refresh-view>x-refresh-header[x-magnet-enable]:first-of-type{scroll-snap-align:start!important}x-refresh-view>x-refresh-footer[x-magnet-enable]:first-of-type{scroll-snap-align:end!important}x-refresh-view:not([enable-loadmore=false])>x-refresh-footer:first-of-type{scroll-snap-align:none;flex-shrink:0;margin-top:auto;display:flex;position:relative!important}x-refresh-view[enable-loadmore=false]::part(placeholder-bot){display:none}","",{version:3,sources:["webpack://./../web-elements/src/elements/XRefreshView/x-refresh-view.css"],names:[],mappings:"AAKA,kCAAA,YAAA,CAGA,eAAA,qBAAA,CAAA,kBAAA,CAAA,cAAA,CAAA,qBAAA,CAAA,WAAA,CAAA,aAAA,CAAA,WAAA,CAAA,YAAA,CAAA,YAAA,CAAA,iBAAA,CAaA,yFAAA,sBAAA,CAOA,0EAAA,sBAAA,CAAA,aAAA,CAAA,YAAA,CAAA,2BAAA,CAOA,4DAAA,YAAA,CAIA,+DAAA,iCAAA,CAGA,+DAAA,+BAAA,CAKA,2EAAA,sBAAA,CAAA,aAAA,CAAA,eAAA,CAAA,YAAA,CAAA,2BAAA,CAQA,6DAAA,YAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-refresh-header, x-refresh-footer {\n display: none;\n}\nx-refresh-view {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n border-width: 0px;\n position: relative;\n flex-grow: 0;\n flex-shrink: 1;\n min-width: 0;\n min-height: 0;\n border-style: solid;\n}\n\nx-refresh-view::part(container),\nx-refresh-view::part(content),\nx-refresh-view::part(slot) {\n --lynx-display: inherit;\n}\n\n/* header */\nx-refresh-view:not([enable-refresh="false"]) > x-refresh-header:first-of-type {\n display: flex;\n position: relative !important;\n scroll-snap-align: none;\n flex-shrink: 0;\n}\n/* ::part chrome 73, firefox 72, safari 13.4 */\nx-refresh-view[enable-refresh="false"]::part(placeholder-top) {\n display: none;\n}\n\nx-refresh-view > x-refresh-header[x-magnet-enable]:first-of-type {\n scroll-snap-align: start !important;\n}\nx-refresh-view > x-refresh-footer[x-magnet-enable]:first-of-type {\n scroll-snap-align: end !important;\n}\n\n/* footer */\nx-refresh-view:not([enable-loadmore="false"]) > x-refresh-footer:first-of-type {\n display: flex;\n position: relative !important;\n scroll-snap-align: none;\n margin-top: auto;\n flex-shrink: 0;\n}\n\nx-refresh-view[enable-loadmore="false"]::part(placeholder-bot) {\n display: none;\n}\n'],sourceRoot:""}]),n.A=o.toString()},3291(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-svg{contain:content;display:flex}x-svg::part(img){width:inherit;height:inherit;flex:inherit;min-width:inherit;min-height:inherit;border:inherit;border-radius:inherit;max-width:100%;max-height:100%;filter:inherit}","",{version:3,sources:["webpack://./../web-elements/src/elements/XSvg/x-svg.css"],names:[],mappings:"AAKA,MAAA,eAAA,CAAA,YAAA,CAKA,iBAAA,aAAA,CAAA,cAAA,CAAA,YAAA,CAAA,iBAAA,CAAA,kBAAA,CAAA,cAAA,CAAA,qBAAA,CAAA,cAAA,CAAA,eAAA,CAAA,cAAA",sourcesContent:["/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-svg {\n contain: content;\n display: flex;\n}\n\nx-svg::part(img) {\n width: inherit;\n height: inherit;\n flex: inherit;\n min-width: inherit;\n min-height: inherit;\n border: inherit;\n border-radius: inherit;\n max-width: 100%;\n max-height: 100%;\n filter: inherit;\n}\n"],sourceRoot:""}]),n.A=o.toString()},1707(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,'x-swiper{scroll-snap-type:x mandatory;scrollbar-width:none;contain:content;timeline-scope:--x-swiper-item-0, --x-swiper-item-1, --x-swiper-item-2, --x-swiper-item-3, --x-swiper-item-4;flex-direction:row;justify-content:flex-start;display:flex;overflow:scroll clip;flex-wrap:nowrap!important}x-swiper::part(content){--page-margin:0px;--next-margin:0px;--previous-margin:0px}x-swiper,x-swiper::part(content),x-swiper::part(slot),x-swiper::part(slot-start),x-swiper::part(slot-end){--lynx-display:linear;--lynx-display-toggle:var(--lynx-display-linear)}x-swiper>*,x-swiper>lynx-wrapper>*{flex-shrink:0;flex-grow:calc(var(--lynx-linear-weight) / var(--lynx-linear-weight-sum));flex-basis:var(--lynx-linear-weight-basis);align-self:var(--align-self-column)}x-swiper::-webkit-scrollbar{display:none}x-swiper[vertical]{scroll-snap-type:y mandatory;--lynx-linear-orientation:vertical;--lynx-linear-orientation-toggle:var(--lynx-linear-orientation-vertical);overflow:clip scroll;flex-direction:column!important}x-swiper[bounces]:not([circular])::part(bounce-padding){display:initial}x-swiper-item{scroll-snap-align:start;animation-duration:10ms;flex-shrink:0!important;flex-grow:calc(var(--lynx-linear-weight) / var(--lynx-linear-weight-sum))!important;flex-basis:var(--lynx-linear-weight-basis)!important}x-swiper-item:nth-child(n+20){contain:strict;content-visibility:auto}x-swiper-item:first-child{view-timeline-name:--x-swiper-item-0}x-swiper-item:nth-child(2){view-timeline-name:--x-swiper-item-1}x-swiper-item:nth-child(3){view-timeline-name:--x-swiper-item-2}x-swiper-item:nth-child(4){view-timeline-name:--x-swiper-item-3}x-swiper-item:nth-child(5){view-timeline-name:--x-swiper-item-4}x-swiper>:not(x-swiper-item){display:none}x-swiper>x-swiper-item{view-timeline-axis:inline;height:100%;animation-timeline:view(inline);width:calc(100% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin))!important}x-swiper[vertical]>x-swiper-item{view-timeline-axis:block;width:100%;animation-timeline:view();height:calc(100% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin))!important}x-swiper[circular]{scroll-snap-type:none;overflow:hidden clip}x-swiper[circular][vertical]{overflow:clip hidden}x-swiper[indicator-dots]::part(indicator-container){display:none}x-swiper::part(indicator-container){--indicator-size:.6rem;--indicator-container-margin:.5rem;z-index:100;width:100%;height:var(--indicator-size);contain:strict;margin-bottom:var(--indicator-container-margin);--indicator-color:#ffffff4d;--indicator-active-color:white;flex-direction:row;justify-content:center;align-items:stretch;display:flex;position:absolute;bottom:0;left:0;overflow:clip}x-swiper[vertical]::part(indicator-container){left:unset;height:100%;width:var(--indicator-size);margin-bottom:0;margin-right:var(--indicator-container-margin);flex-direction:column;top:0;right:0}x-swiper::part(indicator-item){background-color:var(--indicator-color);flex:0 0 var(--indicator-size);margin:0 calc(var(--indicator-size) / 5) 0 calc(var(--indicator-size) / 5);border-radius:100%}x-swiper[vertical]::part(indicator-item){margin:calc(var(--indicator-size) / 5) 0 calc(var(--indicator-size) / 5) 0}x-swiper[mode=carousel]:not([vertical])>x-swiper-item{width:calc(80% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin))!important}x-swiper[mode=carousel][vertical]>x-swiper-item{height:calc(80% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin))!important}x-swiper[mode=carousel]:not([circular])>x-swiper-item:last-child{margin-right:20%}@media screen and (-webkit-min-device-pixel-ratio:0){x-swiper[mode=carousel]::part(content):after{content:"";padding-right:20%}}x-swiper[mode=coverflow]::part(content){perspective:200px}x-swiper[mode=coverflow]>x-swiper-item{scroll-snap-align:center;transform-style:preserve-3d;z-index:0;animation-name:x-swiper-coverflow}x-swiper[mode=coverflow]:not([vertical])>x-swiper-item{animation-name:x-swiper-coverflow-horizontal;width:calc(60% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin))!important}x-swiper[mode=coverflow][vertical]>x-swiper-item{animation-name:x-swiper-coverflow-vertical;height:calc(60% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin))!important}x-swiper[mode=coverflow]:not([circular]):not([vertical])>x-swiper-item:first-child{margin-left:20%}x-swiper[mode=coverflow]:not([circular]):not([vertical])>x-swiper-item:last-child{margin-right:20%}x-swiper[mode=coverflow][vertical]:not([circular])>x-swiper-item:first-child{margin-top:20%}x-swiper[mode=coverflow][vertical]:not([circular])>x-swiper-item:last-child{margin-bottom:20%}@keyframes x-swiper-coverflow-horizontal{25%{transform:rotateY(-50deg)scale(.8)}45%,55%{z-index:1;transform:rotateY(0)scale(1)}to{transform:rotateY(40deg)scale(.8)}}@keyframes x-swiper-coverflow-vertical{25%{transform:rotateX(-50deg)scale(.8)}45%,55%{z-index:1;transform:rotateX(0)scale(1)}to{transform:rotateX(40deg)scale(.8)}}x-swiper[mode=flat-coverflow]>x-swiper-item{scroll-snap-align:center}x-swiper[mode=flat-coverflow]:not([vertical])>x-swiper-item{width:60%!important}x-swiper[mode=flat-coverflow]:not([circular]):not([vertical])>x-swiper-item:first-child{margin-left:20%}x-swiper[mode=flat-coverflow]:not([circular]):not([vertical])>x-swiper-item:last-child{margin-right:20%}x-swiper[mode=flat-coverflow][vertical]>x-swiper-item{height:60%!important}x-swiper[mode=flat-coverflow][vertical]:not([circular])>x-swiper-item:first-child{margin-top:20%}x-swiper[mode=flat-coverflow][vertical]:not([circular])>x-swiper-item:last-child{margin-bottom:20%}x-swiper[mode=carry]>x-swiper-item{scroll-snap-align:center;animation-name:x-swiper-carry;width:100%!important}@keyframes x-swiper-carry{0%{transform:scale(.6)}45%,55%{z-index:1;transform:scale(1)}to{transform:scale(.6)}}',"",{version:3,sources:["webpack://./../web-elements/src/elements/XSwiper/x-swiper.css"],names:[],mappings:"AAKA,SAAA,4BAAA,CAAA,oBAAA,CAAA,eAAA,CAAA,4GAAA,CAAA,kBAAA,CAAA,0BAAA,CAAA,YAAA,CAAA,oBAAA,CAAA,0BAAA,CAmBA,wBAAA,iBAAA,CAAA,iBAAA,CAAA,qBAAA,CAMA,0GAAA,qBAAA,CAAA,gDAAA,CAaA,mCAAA,aAAA,CAAA,yEAAA,CAAA,0CAAA,CAAA,mCAAA,CAOA,4BAAA,YAAA,CAIA,mBAAA,4BAAA,CAAA,kCAAA,CAAA,wEAAA,CAAA,oBAAA,CAAA,+BAAA,CASA,wDAAA,eAAA,CAIA,cAAA,uBAAA,CAAA,uBAAA,CAAA,uBAAA,CAAA,mFAAA,CAAA,oDAAA,CASA,8BAAA,cAAA,CAAA,uBAAA,CAKA,0BAAA,oCAAA,CAGA,2BAAA,oCAAA,CAGA,2BAAA,oCAAA,CAGA,2BAAA,oCAAA,CAGA,2BAAA,oCAAA,CAIA,6BAAA,YAAA,CAIA,uBAAA,yBAAA,CAAA,WAAA,CAAA,+BAAA,CAAA,iGAAA,CASA,iCAAA,wBAAA,CAAA,UAAA,CAAA,yBAAA,CAAA,kGAAA,CAWA,mBAAA,qBAAA,CAAA,oBAAA,CAMA,6BAAA,oBAAA,CAKA,oDAAA,YAAA,CAIA,oCAAA,sBAAA,CAAA,kCAAA,CAAA,WAAA,CAAA,UAAA,CAAA,4BAAA,CAAA,cAAA,CAAA,+CAAA,CAAA,2BAAA,CAAA,8BAAA,CAAA,kBAAA,CAAA,sBAAA,CAAA,mBAAA,CAAA,YAAA,CAAA,iBAAA,CAAA,QAAA,CAAA,MAAA,CAAA,aAAA,CAoBA,8CAAA,UAAA,CAAA,WAAA,CAAA,2BAAA,CAAA,eAAA,CAAA,8CAAA,CAAA,qBAAA,CAAA,KAAA,CAAA,OAAA,CAYA,+BAAA,uCAAA,CAAA,8BAAA,CAAA,0EAAA,CAAA,kBAAA,CAOA,yCAAA,0EAAA,CAKA,sDAAA,gGAAA,CAMA,gDAAA,iGAAA,CAMA,iEAAA,gBAAA,CAIA,qDAEE,6CAAA,UAAA,CAAA,iBAAA,CAAA,CAOF,wCAAA,iBAAA,CAGA,uCAAA,wBAAA,CAAA,2BAAA,CAAA,SAAA,CAAA,iCAAA,CAMA,uDAAA,4CAAA,CAAA,gGAAA,CAMA,iDAAA,0CAAA,CAAA,iGAAA,CAMA,mFAAA,eAAA,CAIA,kFAAA,gBAAA,CAIA,6EAAA,cAAA,CAIA,4EAAA,iBAAA,CAKA,yCAAA,IAAA,kCAAA,CAAA,QAAA,SAAA,CAAA,4BAAA,CAAA,GAAA,iCAAA,CAAA,CAYA,uCAAA,IAAA,kCAAA,CAAA,QAAA,SAAA,CAAA,4BAAA,CAAA,GAAA,iCAAA,CAAA,CAeA,4CAAA,wBAAA,CAIA,4DAAA,mBAAA,CAGA,wFAAA,eAAA,CAIA,uFAAA,gBAAA,CAKA,sDAAA,oBAAA,CAGA,kFAAA,cAAA,CAIA,iFAAA,iBAAA,CAMA,mCAAA,wBAAA,CAAA,6BAAA,CAAA,oBAAA,CAMA,0BAAA,GAAA,mBAAA,CAAA,QAAA,SAAA,CAAA,kBAAA,CAAA,GAAA,mBAAA,CAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-swiper {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap !important;\n overflow: hidden;\n overflow-x: scroll;\n overflow-y: clip;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n contain: content;\n justify-content: flex-start;\n timeline-scope:\n --x-swiper-item-0,\n --x-swiper-item-1,\n --x-swiper-item-2,\n --x-swiper-item-3,\n --x-swiper-item-4;\n}\n\nx-swiper::part(content) {\n --page-margin: 0px;\n --next-margin: 0px;\n --previous-margin: 0px;\n}\n\nx-swiper,\nx-swiper::part(content),\nx-swiper::part(slot),\nx-swiper::part(slot-start),\nx-swiper::part(slot-end) {\n --lynx-display: linear;\n --lynx-display-toggle: var(--lynx-display-linear);\n}\n\n/**\n * The scroll-view would always be a linear container\n * see linear.css\n */\nx-swiper > *, x-swiper > lynx-wrapper > * {\n flex-shrink: 0;\n flex-grow: calc(var(--lynx-linear-weight) / var(--lynx-linear-weight-sum));\n flex-basis: var(--lynx-linear-weight-basis);\n align-self: var(--align-self-column);\n}\n\nx-swiper::-webkit-scrollbar {\n display: none;\n}\n\nx-swiper[vertical] {\n overflow-x: clip;\n overflow-y: scroll;\n scroll-snap-type: y mandatory;\n flex-direction: column !important;\n --lynx-linear-orientation: vertical;\n --lynx-linear-orientation-toggle: var(--lynx-linear-orientation-vertical);\n}\n\nx-swiper[bounces]:not([circular])::part(bounce-padding) {\n display: initial;\n}\n\nx-swiper-item {\n scroll-snap-align: start;\n animation-duration: 10ms;\n flex-shrink: 0 !important;\n flex-grow: calc(var(--lynx-linear-weight) / var(--lynx-linear-weight-sum))\n !important;\n flex-basis: var(--lynx-linear-weight-basis) !important;\n}\n\nx-swiper-item:nth-child(n+20) {\n contain: strict;\n content-visibility: auto;\n}\n\nx-swiper-item:nth-child(1) {\n view-timeline-name: --x-swiper-item-0;\n}\nx-swiper-item:nth-child(2) {\n view-timeline-name: --x-swiper-item-1;\n}\nx-swiper-item:nth-child(3) {\n view-timeline-name: --x-swiper-item-2;\n}\nx-swiper-item:nth-child(4) {\n view-timeline-name: --x-swiper-item-3;\n}\nx-swiper-item:nth-child(5) {\n view-timeline-name: --x-swiper-item-4;\n}\n\nx-swiper > *:not(x-swiper-item) {\n display: none;\n}\n\nx-swiper > x-swiper-item {\n width: calc(\n 100% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin)\n ) !important;\n height: 100%;\n view-timeline-axis: inline;\n animation-timeline: view(inline);\n}\n\nx-swiper[vertical] > x-swiper-item {\n width: 100%;\n height: calc(\n 100% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin)\n ) !important;\n view-timeline-axis: block;\n animation-timeline: view(block);\n}\n\n/* circular */\n\nx-swiper[circular] {\n overflow-y: clip;\n overflow-x: hidden;\n scroll-snap-type: none;\n}\n\nx-swiper[circular][vertical] {\n overflow-y: hidden;\n overflow-x: clip;\n}\n/* indicator */\nx-swiper[indicator-dots]::part(indicator-container) {\n display: none;\n}\n\nx-swiper::part(indicator-container) {\n --indicator-size: 0.6rem;\n --indicator-container-margin: 0.5rem;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: stretch;\n overflow: clip;\n position: absolute;\n left: 0;\n bottom: 0;\n z-index: 100;\n width: 100%;\n height: var(--indicator-size);\n contain: strict;\n margin-bottom: var(--indicator-container-margin);\n --indicator-color: #ffffff4d;\n --indicator-active-color: white;\n}\n\nx-swiper[vertical]::part(indicator-container) {\n flex-direction: column;\n left: unset;\n top: 0;\n right: 0;\n height: 100%;\n width: var(--indicator-size);\n margin-bottom: 0;\n margin-right: var(--indicator-container-margin);\n}\n\n/* scroll driven animation, chromium 115, firefox positive, safari positive */\nx-swiper::part(indicator-item) {\n background-color: var(--indicator-color);\n flex: 0 0 var(--indicator-size);\n margin: 0 calc(var(--indicator-size) / 5) 0 calc(var(--indicator-size) / 5);\n border-radius: 100%;\n}\n\nx-swiper[vertical]::part(indicator-item) {\n margin: calc(var(--indicator-size) / 5) 0 calc(var(--indicator-size) / 5) 0;\n}\n\n/* mode carousel */\nx-swiper[mode="carousel"]:not([vertical]) > x-swiper-item {\n width: calc(\n 80% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin)\n ) !important;\n}\n\nx-swiper[mode="carousel"][vertical] > x-swiper-item {\n height: calc(\n 80% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin)\n ) !important;\n}\n\nx-swiper[mode="carousel"]:not([circular]) > x-swiper-item:last-child {\n margin-right: 20%;\n}\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n /* webkit bug */\n x-swiper[mode="carousel"]::part(content)::after {\n content: "";\n padding-right: 20%;\n }\n}\n\n/* mode coverflow */\nx-swiper[mode="coverflow"]::part(content) {\n perspective: 200px;\n}\nx-swiper[mode="coverflow"] > x-swiper-item {\n scroll-snap-align: center;\n animation-name: x-swiper-coverflow;\n transform-style: preserve-3d;\n z-index: 0;\n}\nx-swiper[mode="coverflow"]:not([vertical]) > x-swiper-item {\n animation-name: x-swiper-coverflow-horizontal;\n width: calc(\n 60% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin)\n ) !important;\n}\nx-swiper[mode="coverflow"][vertical] > x-swiper-item {\n animation-name: x-swiper-coverflow-vertical;\n height: calc(\n 60% - 2 * var(--page-margin) - var(--previous-margin) - var(--next-margin)\n ) !important;\n}\nx-swiper[mode="coverflow"]:not([circular]):not([vertical])\n > x-swiper-item:first-child {\n margin-left: 20%;\n}\nx-swiper[mode="coverflow"]:not([circular]):not([vertical])\n > x-swiper-item:last-child {\n margin-right: 20%;\n}\nx-swiper[mode="coverflow"][vertical]:not([circular])\n > x-swiper-item:first-child {\n margin-top: 20%;\n}\nx-swiper[mode="coverflow"][vertical]:not([circular])\n > x-swiper-item:last-child {\n margin-bottom: 20%;\n}\n\n@keyframes x-swiper-coverflow-horizontal {\n 25% {\n transform: rotateY(-50deg) scale(0.8);\n }\n 45%, 55% {\n transform: rotateY(0deg) scale(1);\n z-index: 1;\n }\n 100% {\n transform: rotateY(40deg) scale(0.8);\n }\n}\n@keyframes x-swiper-coverflow-vertical {\n 25% {\n transform: rotateX(-50deg) scale(0.8);\n }\n 45%, 55% {\n transform: rotateX(0deg) scale(1);\n z-index: 1;\n }\n 100% {\n transform: rotateX(40deg) scale(0.8);\n }\n}\n\n/* mode flat-coverflow */\n\nx-swiper[mode="flat-coverflow"] > x-swiper-item {\n scroll-snap-align: center;\n}\n\nx-swiper[mode="flat-coverflow"]:not([vertical]) > x-swiper-item {\n width: 60% !important;\n}\nx-swiper[mode="flat-coverflow"]:not([circular]):not([vertical])\n > x-swiper-item:first-child {\n margin-left: 20%;\n}\nx-swiper[mode="flat-coverflow"]:not([circular]):not([vertical])\n > x-swiper-item:last-child {\n margin-right: 20%;\n}\n\nx-swiper[mode="flat-coverflow"][vertical] > x-swiper-item {\n height: 60% !important;\n}\nx-swiper[mode="flat-coverflow"][vertical]:not([circular])\n > x-swiper-item:first-child {\n margin-top: 20%;\n}\nx-swiper[mode="flat-coverflow"][vertical]:not([circular])\n > x-swiper-item:last-child {\n margin-bottom: 20%;\n}\n\n/* mode carry */\nx-swiper[mode="carry"] > x-swiper-item {\n scroll-snap-align: center;\n width: 100% !important;\n animation-name: x-swiper-carry;\n}\n\n@keyframes x-swiper-carry {\n 0% {\n transform: scale(0.6);\n }\n 45%, 55% {\n transform: scale(1);\n z-index: 1;\n }\n 100% {\n transform: scale(0.6);\n }\n}\n'],sourceRoot:""}]),n.A=o.toString()},2605(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,'x-text{overflow-wrap:break-word;background-image:var(--lynx-text-bg-color);color:initial;align-items:stretch;display:flex}x-text>x-text,x-text>lynx-wrapper>x-text{color:inherit}x-text:not(x-text>x-text):not(x-text>lynx-wrapper>x-text){--lynx-text-bg-color:initial}x-text>*{display:none}x-text::part(inner-box){text-overflow:inherit;--lynx-text-bg-color:inherit}x-text>x-text::part(inner-box),x-text>lynx-wrapper>x-text::part(inner-box){display:contents!important}x-text::part(inner-box),inline-text,x-text::part(slot){background-clip:inherit;-webkit-background-clip:inherit}inline-text,inline-image,inline-truncation{display:none}x-text>x-text,x-text>inline-text,inline-text>inline-text,inline-truncation>inline-text,inline-truncation>x-text,x-text>lynx-wrapper>x-text,x-text>lynx-wrapper>inline-text,x-text>lynx-wrapper>x-text,inline-text>lynx-wrapper>inline-text,x-text>lynx-wrapper>*,inline-truncation>lynx-wrapper>inline-text,inline-truncation>lynx-wrapper>x-text{background-clip:inherit;-webkit-background-clip:inherit;display:inline}x-text>inline-image,x-text>x-image,inline-truncation>inline-image,inline-truncation>x-image,inline-text>inline-image,inline-text>x-image,x-text>lynx-wrapper>inline-image,x-text>lynx-wrapper>x-image,inline-truncation>lynx-wrapper>inline-image,inline-truncation>lynx-wrapper>x-image,inline-text>lynx-wrapper>inline-image,inline-text>lynx-wrapper>x-image{display:contents!important}x-text>x-view,x-text>lynx-wrapper>x-view{display:inline-flex!important}x-text>x-view,x-text[x-show-inline-truncation]>inline-truncation,x-text>lynx-wrapper>x-view,x-text[x-show-inline-truncation]>lynx-wrapper>inline-truncation{display:inline-flex}x-text>inline-truncation:first-child,x-text>lynx-wrapper>inline-truncation:first-child{max-width:100%}inline-truncation~inline-truncation{display:none}inline-truncation[x-text-clipped]{flex-direction:row}inline-image::part(img){height:inherit;width:inherit;border:inherit;border-radius:inherit;background-color:inherit;vertical-align:inherit;margin:inherit;display:inline-block}x-text>x-image::part(img),x-text>lynx-wrapper>x-image::part(img),inline-truncation>x-image::part(img),inline-truncation>lynx-wrapper>x-image::part(img){border:inherit;border-radius:inherit;background-color:inherit;vertical-align:inherit;margin:inherit;object-fit:inherit;display:inline-block;height:inherit!important;width:inherit!important;flex:inherit!important;align-self:inherit!important}x-text,inline-text,inline-image,inline-truncation{-webkit-user-select:none;user-select:none}x-text::part(inner-box){width:100%;height:100%;overflow:inherit}x-text[text-maxline]{overflow:hidden}x-text[text-selection],x-text[text-selection]>inline-text,x-text[text-selection]>x-text,x-text[text-selection]>inline-image,x-text[text-selection]>x-image,x-text[text-selection]>inline-truncation,x-text[text-selection]>lynx-wrapper>inline-text,x-text[text-selection]>lynx-wrapper>x-text,x-text[text-selection]>lynx-wrapper>inline-image,x-text[text-selection]>lynx-wrapper>x-image,x-text[text-selection]>lynx-wrapper>inline-truncation{-webkit-user-select:auto;user-select:auto}x-text[x-text-clipped]>[x-text-clipped]:not(inline-truncation),x-text[x-text-clipped]>lynx-wrapper>[x-text-clipped]:not(inline-truncation){display:none!important}x-text[x-text-clipped]:not([tail-color-convert=false])::part(inner-box):after,x-text[x-text-clipped]:not([tail-color-convert=false])::part(inner-box):after{content:"..."}x-text[x-text-clipped][x-text-custom-overflow]::part(inner-box):after,x-text[x-text-clipped][x-text-custom-overflow]::part(inner-box):after{content:""!important}x-text[x-text-clipped]:has(>inline-truncation)::part(inner-box):after{content:""!important}x-text[x-text-clipped]:has(>inline-truncation)::part(inner-box):after{content:""!important}x-text[text-maxline]::part(inner-box){-webkit-box-orient:vertical;display:-webkit-box}x-text[text-maxline="0"]{display:none}@supports not selector(:has(> inline-truncation)){x-text[text-maxline="1"]:not([tail-color-convert=false]):not([x-text-custom-overflow])::part(inner-box){white-space:nowrap;text-overflow:ellipsis}}@supports selector(:has(> inline-truncation)){x-text[text-maxline="1"]:not([tail-color-convert=false],:has(>inline-truncation))::part(inner-box){text-wrap:nowrap;white-space:nowrap;text-overflow:ellipsis}}x-text[text-maxline="1"]{max-width:-moz-available;max-width:-webkit-fill-available}x-text[text-maxline="1"]:not([tail-color-convert=false])::part(inner-box){display:block}x-text[text-maxline][x-text-custom-overflow]::part(inner-box),x-text[text-maxline][tail-color-convert=false]::part(inner-box){display:block!important}x-text[text-maxline]:has(>inline-truncation)::part(inner-box){display:block!important}raw-text{white-space-collapse:preserve-breaks;display:none}x-text>raw-text,inline-text>raw-text,x-text>lynx-wrapper>raw-text,inline-text>lynx-wrapper>raw-text{display:contents!important}raw-text:not(:defined):before{content:attr(text);display:contents}x-text:not(:has(x-text,raw-text)):not(:defined):before{content:attr(text);display:contents}',"",{version:3,sources:["webpack://./../web-elements/src/elements/XText/x-text.css"],names:[],mappings:"AAMA,OAAA,wBAAA,CAAA,0CAAA,CAAA,aAAA,CAAA,mBAAA,CAAA,YAAA,CAQA,yCAAA,aAAA,CAKA,0DAAA,4BAAA,CAIA,SAAA,YAAA,CAIA,wBAAA,qBAAA,CAAA,4BAAA,CAKA,2EAAA,0BAAA,CAKA,uDAAA,uBAAA,CAAA,+BAAA,CAOA,2CAAA,YAAA,CAOA,kVAAA,uBAAA,CAAA,+BAAA,CAAA,cAAA,CAiBA,gWAAA,0BAAA,CAeA,yCAAA,6BAAA,CAKA,4JAAA,mBAAA,CAOA,uFAAA,cAAA,CAKA,oCAAA,YAAA,CAIA,kCAAA,kBAAA,CAIA,wBAAA,cAAA,CAAA,aAAA,CAAA,cAAA,CAAA,qBAAA,CAAA,wBAAA,CAAA,sBAAA,CAAA,cAAA,CAAA,oBAAA,CAWA,wJAAA,cAAA,CAAA,qBAAA,CAAA,wBAAA,CAAA,sBAAA,CAAA,cAAA,CAAA,kBAAA,CAAA,oBAAA,CAAA,wBAAA,CAAA,uBAAA,CAAA,sBAAA,CAAA,4BAAA,CAmBA,kDAAA,wBAAA,CAAA,gBAAA,CAQA,wBAAA,UAAA,CAAA,WAAA,CAAA,gBAAA,CAMA,qBAAA,eAAA,CAIA,kbAAA,wBAAA,CAAA,gBAAA,CAeA,2IAAA,sBAAA,CAOA,4JAAA,aAAA,CAKA,4IAAA,oBAAA,CAAA,sEAAA,oBAAA,CAAA,sEAAA,oBAAA,CAuBA,sCAAA,2BAAA,CAAA,mBAAA,CAKA,yBAAA,YAAA,CAIA,kDACE,wGAAA,kBAAA,CAAA,sBAAA,CAAA,CAMF,8CAEE,mGAAA,gBAAA,CAAA,kBAAA,CAAA,sBAAA,CAAA,CAOF,yBAAA,wBAAA,CAAA,gCAAA,CAOA,0EAAA,aAAA,CAIA,8HAAA,uBAAA,CAAA,8DAAA,uBAAA,CAMA,SAAA,oCAAA,CAAA,YAAA,CAMA,oGAAA,0BAAA,CAOA,8BAAA,kBAAA,CAAA,gBAAA,CAAA,uDAAA,kBAAA,CAAA,gBAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\n/* :defined chrome 54,firefox 63, safari 10 */\nx-text {\n display: flex;\n overflow-wrap: break-word;\n align-items: stretch;\n background-image: var(--lynx-text-bg-color);\n color: initial;\n}\n\nx-text > x-text,\nx-text > lynx-wrapper > x-text {\n color: inherit;\n}\n\nx-text:not(x-text > x-text):not(x-text > lynx-wrapper > x-text) {\n --lynx-text-bg-color: initial;\n}\n\nx-text > * {\n display: none;\n}\n\nx-text::part(inner-box) {\n text-overflow: inherit;\n --lynx-text-bg-color: inherit;\n}\n\nx-text > x-text::part(inner-box),\nx-text > lynx-wrapper > x-text::part(inner-box) {\n display: contents !important;\n}\n\nx-text::part(inner-box),\ninline-text,\nx-text::part(slot) {\n background-clip: inherit;\n -webkit-background-clip: inherit;\n}\n\ninline-text,\ninline-image,\ninline-truncation {\n display: none;\n}\n\n/* nested components */\nx-text > x-text,\nx-text > inline-text,\ninline-text > inline-text,\ninline-truncation > inline-text,\ninline-truncation > x-text,\nx-text > lynx-wrapper > x-text,\nx-text > lynx-wrapper > inline-text,\nx-text > lynx-wrapper > x-text,\ninline-text > lynx-wrapper > inline-text,\nx-text > lynx-wrapper > *,\ninline-truncation > lynx-wrapper > inline-text,\ninline-truncation > lynx-wrapper > x-text {\n display: inline;\n background-clip: inherit;\n -webkit-background-clip: inherit;\n}\n\nx-text > inline-image,\nx-text > x-image,\ninline-truncation > inline-image,\ninline-truncation > x-image,\ninline-text > inline-image,\ninline-text > x-image,\nx-text > lynx-wrapper > inline-image,\nx-text > lynx-wrapper > x-image,\ninline-truncation > lynx-wrapper > inline-image,\ninline-truncation > lynx-wrapper > x-image,\ninline-text > lynx-wrapper > inline-image,\ninline-text > lynx-wrapper > x-image {\n display: contents !important;\n}\n\nx-text > x-view,\nx-text > lynx-wrapper > x-view {\n display: inline-flex !important;\n}\n\nx-text > x-view,\nx-text[x-show-inline-truncation] > inline-truncation,\nx-text > lynx-wrapper > x-view,\nx-text[x-show-inline-truncation] > lynx-wrapper > inline-truncation {\n display: inline-flex;\n}\n\nx-text > inline-truncation:first-child,\nx-text > lynx-wrapper > inline-truncation:first-child {\n max-width: 100%;\n}\n\ninline-truncation ~ inline-truncation {\n display: none;\n}\n\ninline-truncation[x-text-clipped] {\n flex-direction: row;\n}\n\ninline-image::part(img) {\n display: inline-block;\n height: inherit;\n width: inherit;\n border: inherit;\n border-radius: inherit;\n background-color: inherit;\n vertical-align: inherit;\n margin: inherit;\n}\n\nx-text > x-image::part(img),\nx-text > lynx-wrapper > x-image::part(img),\ninline-truncation > x-image::part(img),\ninline-truncation > lynx-wrapper > x-image::part(img) {\n display: inline-block;\n height: inherit !important;\n width: inherit !important;\n border: inherit;\n border-radius: inherit;\n background-color: inherit;\n vertical-align: inherit;\n margin: inherit;\n flex: inherit !important;\n object-fit: inherit;\n align-self: inherit !important;\n}\n\n/* attribute text-selection */\n\nx-text,\ninline-text,\ninline-image,\ninline-truncation {\n -webkit-user-select: none;\n user-select: none;\n}\n\nx-text::part(inner-box) {\n height: 100%;\n width: 100%;\n overflow: inherit;\n}\n\nx-text[text-maxline] {\n overflow: hidden;\n}\n\nx-text[text-selection],\nx-text[text-selection] > inline-text,\nx-text[text-selection] > x-text,\nx-text[text-selection] > inline-image,\nx-text[text-selection] > x-image,\nx-text[text-selection] > inline-truncation,\nx-text[text-selection] > lynx-wrapper > inline-text,\nx-text[text-selection] > lynx-wrapper > x-text,\nx-text[text-selection] > lynx-wrapper > inline-image,\nx-text[text-selection] > lynx-wrapper > x-image,\nx-text[text-selection] > lynx-wrapper > inline-truncation {\n -webkit-user-select: auto;\n user-select: auto;\n}\n\nx-text[x-text-clipped] > [x-text-clipped]:not(inline-truncation),\nx-text[x-text-clipped]\n > lynx-wrapper\n > [x-text-clipped]:not(inline-truncation) {\n display: none !important;\n}\n\nx-text[x-text-clipped]:not([tail-color-convert="false"])::part(inner-box):after,\nx-text[x-text-clipped]:not([tail-color-convert="false"])::part(inner-box)::after {\n content: "...";\n}\n\nx-text[x-text-clipped]:has(> inline-truncation)::part(inner-box):after,\nx-text[x-text-clipped][x-text-custom-overflow]::part(inner-box):after,\nx-text[x-text-clipped]:has(> inline-truncation)::part(inner-box)::after,\nx-text[x-text-clipped][x-text-custom-overflow]::part(inner-box)::after {\n content: "" !important;\n}\n\n/* attribute text-maxline */\n/* In most cases, we do not need to analyze the text layout in Javascript\n * On the following situations, we don\'t need to do line-clamp\n * 1. no text-maxline setting\n * 2. text-maxline is 0(display:none);\n * \n * On the following situations, we just use the -webkit-line-clamp to implement\n * 1. without customized inline-truncation\n * 2. users do not force we apply styles on the ellipsis\n *\n * Overall, we do calculate the layout of texts with (display:block) for\n * 1. analyze the truncation length for a customized inline-truncation (attribute x-text-custom-overflow, selector :has())\n * 2. users explicit declare that we have to put the ellipsis in place. (with attribute tail-color-convert=\'false\')\n */\n/* ::part chrome 73, firefox 72, safari 13.4 */\n/* :has() chrome 105, firefox 121, safari 15.1 */\nx-text[text-maxline]::part(inner-box) {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n}\n\nx-text[text-maxline="0"] {\n display: none;\n}\n\n@supports not selector(:has(> inline-truncation)) {\n x-text[text-maxline="1"]:not([tail-color-convert="false"]):not([x-text-custom-overflow])::part(inner-box) {\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n}\n\n@supports selector(:has(> inline-truncation)) {\n /* text-wrap chrome 114, firefox 121, safari 17.4*/\n x-text[text-maxline="1"]:not([tail-color-convert="false"], :has(> inline-truncation))::part(inner-box) {\n text-wrap: nowrap;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n}\n\nx-text[text-maxline="1"] {\n /* This is the stretch size */\n /* https://developer.mozilla.org/en-US/docs/Web/CSS/max-width */\n max-width: -moz-available;\n max-width: -webkit-fill-available;\n}\n\nx-text[text-maxline="1"]:not([tail-color-convert="false"])::part(inner-box) {\n display: block;\n}\n\nx-text[text-maxline][x-text-custom-overflow]::part(inner-box),\nx-text[text-maxline]:has(> inline-truncation)::part(inner-box),\nx-text[text-maxline][tail-color-convert="false"]::part(inner-box) {\n display: block !important;\n}\n\nraw-text {\n display: none;\n /* raw-text only works in x-text */\n white-space-collapse: preserve-breaks;\n}\n\nx-text > raw-text,\ninline-text > raw-text,\nx-text > lynx-wrapper > raw-text,\ninline-text > lynx-wrapper > raw-text {\n display: contents !important;\n}\n\nraw-text:not(:defined)::before,\nx-text:not(:has(x-text, raw-text)):not(:defined)::before {\n content: attr(text);\n display: contents;\n}\n'],sourceRoot:""}]),n.A=o.toString()},9395(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-textarea{font-size:14px;display:contents}x-textarea::part(form){display:contents}x-textarea::part(textarea),x-textarea::part(form){width:inherit;height:inherit;font-family:inherit;font-size:inherit;line-height:inherit;flex:inherit;border:inherit;padding:inherit;margin:inherit;caret-color:inherit;direction:inherit;font:inherit;letter-spacing:inherit;text-align:inherit;outline:inherit;background-color:inherit;color:inherit}x-textarea::part(textarea){--placeholder-color:grey;--placeholder-font-weight:normal;--placeholder-font-family:inherit;resize:none}x-textarea::part(textarea)::placeholder{color:var(--placeholder-color);font-size:var(--placeholder-font-size,inherit);font-weight:var(--placeholder-font-weight);font-family:var(--placeholder-font-family)}","",{version:3,sources:["webpack://./../web-elements/src/elements/XTextarea/x-textarea.css"],names:[],mappings:"AAKA,WAAA,cAAA,CAAA,gBAAA,CAKA,uBAAA,gBAAA,CAIA,kDAAA,aAAA,CAAA,cAAA,CAAA,mBAAA,CAAA,iBAAA,CAAA,mBAAA,CAAA,YAAA,CAAA,cAAA,CAAA,eAAA,CAAA,cAAA,CAAA,mBAAA,CAAA,iBAAA,CAAA,YAAA,CAAA,sBAAA,CAAA,kBAAA,CAAA,eAAA,CAAA,wBAAA,CAAA,aAAA,CAmBA,2BAAA,wBAAA,CAAA,gCAAA,CAAA,iCAAA,CAAA,WAAA,CAOA,wCAAA,8BAAA,CAAA,8CAAA,CAAA,0CAAA,CAAA,0CAAA",sourcesContent:["/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-textarea {\n display: contents;\n font-size: 14px;\n}\n\nx-textarea::part(form) {\n display: contents;\n}\n\nx-textarea::part(textarea), x-textarea::part(form) {\n width: inherit;\n height: inherit;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n flex: inherit;\n border: inherit;\n padding: inherit;\n margin: inherit;\n caret-color: inherit;\n direction: inherit;\n font: inherit;\n letter-spacing: inherit;\n text-align: inherit;\n outline: inherit;\n background-color: inherit;\n color: inherit;\n}\nx-textarea::part(textarea) {\n --placeholder-color: grey;\n --placeholder-font-weight: normal;\n --placeholder-font-family: inherit;\n resize: none;\n}\n\nx-textarea::part(textarea)::placeholder {\n color: var(--placeholder-color);\n font-size: var(--placeholder-font-size, inherit);\n font-weight: var(--placeholder-font-weight);\n font-family: var(--placeholder-font-family);\n}\n"],sourceRoot:""}]),n.A=o.toString()},7524(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-viewpager-ng,x-viewpager-item-ng{display:none}x-viewpager-ng,x-viewpager-ng>x-viewpager-item-ng,x-viewpager-ng>lynx-wrapper>x-viewpager-item-ng{display:flex}x-viewpager-ng{contain:content;scrollbar-width:0;--lynx-linear-orientation:horizontal;scroll-snap-type:x mandatory;scroll-snap-stop:always;flex-direction:row;width:100%;height:100%;overflow:scroll clip}x-viewpager-ng[allow-horizontal-gesture=false],x-viewpager-ng[enable-scroll=false]{overflow-x:hidden}x-viewpager-ng::-webkit-scrollbar{display:none}x-viewpager-ng::part(content){scroll-snap-align:start}x-viewpager-ng[bounces]::part(bounce-padding){display:flex}@supports not (overflow:clip){x-viewpager-ng{overflow-y:hidden}}x-viewpager-item-ng{contain:content;--flex-grow:0;--flex-shrink:0;--flex-basis:auto;scroll-snap-align:start;scroll-snap-stop:always;flex:none;width:100%;height:100%;position:relative!important}x-viewpager-item-ng:nth-child(n+5){contain:strict}","",{version:3,sources:["webpack://./../web-elements/src/elements/XViewpagerNg/x-viewpager-ng.css"],names:[],mappings:"AAKA,mCAAA,YAAA,CAIA,kGAAA,YAAA,CAMA,eAAA,eAAA,CAAA,iBAAA,CAAA,oCAAA,CAAA,4BAAA,CAAA,uBAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,WAAA,CAAA,oBAAA,CAcA,mFAAA,iBAAA,CAKA,kCAAA,YAAA,CAIA,8BAAA,uBAAA,CAIA,8CAAA,YAAA,CAIA,8BACE,eAAA,iBAAA,CAAA,CAKF,oBAAA,eAAA,CAAA,aAAA,CAAA,eAAA,CAAA,iBAAA,CAAA,uBAAA,CAAA,uBAAA,CAAA,SAAA,CAAA,UAAA,CAAA,WAAA,CAAA,2BAAA,CAaA,mCAAA,cAAA",sourcesContent:['/*\n// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n*/\nx-viewpager-ng, x-viewpager-item-ng {\n display: none;\n}\n\nx-viewpager-ng,\nx-viewpager-ng > x-viewpager-item-ng,\nx-viewpager-ng > lynx-wrapper > x-viewpager-item-ng {\n display: flex;\n}\n\nx-viewpager-ng {\n flex-direction: row;\n contain: content;\n width: 100%;\n height: 100%;\n overflow-x: scroll;\n overflow-y: clip;\n scrollbar-width: 0;\n flex-direction: row;\n --lynx-linear-orientation: horizontal;\n scroll-snap-type: x mandatory;\n scroll-snap-stop: always;\n}\n\nx-viewpager-ng[allow-horizontal-gesture="false"],\nx-viewpager-ng[enable-scroll="false"] {\n overflow-x: hidden;\n}\n\nx-viewpager-ng::-webkit-scrollbar {\n display: none;\n}\n\nx-viewpager-ng::part(content) {\n scroll-snap-align: start;\n}\n\nx-viewpager-ng[bounces]::part(bounce-padding) {\n display: flex;\n}\n\n@supports not (overflow: clip) {\n x-viewpager-ng {\n overflow-y: hidden;\n }\n}\n\nx-viewpager-item-ng {\n width: 100%;\n height: 100%;\n contain: content;\n flex: 0 0 auto;\n --flex-grow: 0;\n --flex-shrink: 0;\n --flex-basis: auto;\n scroll-snap-align: start;\n scroll-snap-stop: always;\n position: relative !important;\n}\n\nx-viewpager-item-ng:nth-child(n+5) {\n contain: strict;\n}\n'],sourceRoot:""}]),n.A=o.toString()},9003(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,"x-webview{flex-direction:column;display:flex;overflow:hidden}","",{version:3,sources:["webpack://./../web-elements/src/elements/XWebView/x-webview.css"],names:[],mappings:"AAAA,UAAA,qBAAA,CAAA,YAAA,CAAA,eAAA",sourcesContent:["x-webview {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n"],sourceRoot:""}]),n.A=o.toString()},8918(e,n,t){var i=t(6317),r=t.n(i),l=t(4475),o=t.n(l)()(r());o.push([e.id,'@property --lynx-display{syntax:"linear|flex";inherits:false;initial-value:linear}@property --lynx-linear-weight-sum{syntax:"";inherits:false;initial-value:1}@property --lynx-linear-weight{syntax:"";inherits:false;initial-value:0}@property --justify-content-column{syntax:"flex-start|flex-end|center|space-between|space-around";inherits:false;initial-value:flex-start}@property --justify-content-column-reverse{syntax:"flex-start|flex-end|center|space-between|space-around";inherits:false;initial-value:flex-start}@property --justify-content-row{syntax:"flex-start|flex-end|center|space-between|space-around";inherits:false;initial-value:flex-start}@property --justify-content-row-reverse{syntax:"flex-start|flex-end|center|space-between|space-around";inherits:false;initial-value:flex-start}@property --align-self-row{syntax:"start|end|center|stretch|auto";inherits:false;initial-value:auto}@property --align-self-column{syntax:"start|end|center|stretch|auto";inherits:false;initial-value:auto}@property --lynx-linear-weight-basis{syntax:"auto||";inherits:false;initial-value:auto}@property --lynx-linear-orientation{syntax:"";inherits:false;initial-value:vertical}@property --flex-direction{syntax:"*";inherits:false}@property --flex-wrap{syntax:"*";inherits:false}@property --flex-grow{syntax:"";inherits:false;initial-value:0}@property --flex-shrink{syntax:"";inherits:false;initial-value:1}@property --flex-basis{syntax:"*";inherits:false;initial-value:auto}@property --flex-value{syntax:"*";inherits:false}@property --flex{syntax:"*";inherits:false}@property --linear-justify-content{syntax:"flex-start|flex-end|center|space-between|space-around";inherits:false;initial-value:flex-start}x-view,x-blur-view,scroll-view,x-foldview-ng,x-foldview-slot-ng,x-foldview-header-ng,x-foldview-toolbar-ng,x-foldview-drag-ng,x-text,inline-text,inline-image,inline-truncation,x-viewpager-ng,x-viewpager-item-ng,x-canvas,x-svg,x-image,filter-image,x-input,x-swiper,x-swiper-item,x-textarea,x-list,list-item{box-sizing:border-box;scrollbar-width:none;border-style:solid;border-width:0;min-width:0;min-height:0;display:flex;position:relative;overflow:clip}x-view::--webkit-scrollbar{display:none}x-view,scroll-view,x-foldview-header-ng,x-foldview-ng,x-foldview-slot-drag-ng,x-foldview-slot-ng,x-foldview-toolbar-ng,x-refresh-footer,x-refresh-header,x-refresh-view,x-swiper-item,x-viewpager-item-ng,x-viewpager-ng,list-item{--lynx-display-toggle:var(--lynx-display-linear);--lynx-display-linear:var(--lynx-display-toggle,);--lynx-display-flex:var(--lynx-display-toggle,);--lynx-linear-orientation-toggle:var(--lynx-linear-orientation-vertical);--lynx-linear-orientation-horizontal:var(--lynx-linear-orientation-toggle,);--lynx-linear-orientation-vertical:var(--lynx-linear-orientation-toggle,);--lynx-linear-orientation-horizontal-reverse:var(--lynx-linear-orientation-toggle, );--lynx-linear-orientation-vertical-reverse:var(--lynx-linear-orientation-toggle, );--linear-flex-direction:var(--lynx-linear-orientation-horizontal,row) var(--lynx-linear-orientation-vertical,column) var(--lynx-linear-orientation-horizontal-reverse,row-reverse) var(--lynx-linear-orientation-vertical-reverse,column-reverse);--linear-justify-content:var(--lynx-linear-orientation-horizontal,var(--justify-content-row)) var(--lynx-linear-orientation-vertical,var(--justify-content-column)) var(--lynx-linear-orientation-horizontal-reverse,var(--justify-content-row-reverse)) var(--lynx-linear-orientation-vertical-reverse,var(--justify-content-column-reverse))}x-view,x-foldview-header-ng,x-foldview-ng,x-foldview-slot-drag-ng,x-foldview-slot-ng,x-foldview-toolbar-ng,x-refresh-footer,x-refresh-header,x-refresh-view,x-swiper-item,x-viewpager-item-ng,x-viewpager-ng,list-item{flex-wrap:var(--lynx-display-linear,nowrap) var(--lynx-display-flex,var(--flex-wrap));flex-direction:var(--lynx-display-linear,var(--linear-flex-direction)) var(--lynx-display-flex,var(--flex-direction));justify-content:var(--lynx-display-linear,var(--linear-justify-content))}@supports (content-visibility:auto) and (transition-behavior:allow-discrete) and (-webkit-box-reflect:above){@container style(--lynx-display:linear){x-view,x-blur-view,scroll-view,x-foldview-ng,x-foldview-slot-ng,x-foldview-header-ng,x-foldview-toolbar-ng,x-foldview-drag-ng,x-text,inline-text,inline-image,inline-truncation,x-viewpager-ng,x-viewpager-item-ng,x-canvas,x-svg,x-image,filter-image,x-input,x-swiper,x-swiper-item,x-textarea,x-list,list-item{flex-shrink:0;flex-grow:calc(var(--lynx-linear-weight) / calc(var(--lynx-linear-weight-sum) + ( 1 - clamp(0, var(--lynx-linear-weight-sum) * 999999, 1) )));flex-basis:var(--lynx-linear-weight-basis)}}@container not style(--lynx-display:linear){x-view,x-blur-view,scroll-view,x-foldview-ng,x-foldview-slot-ng,x-foldview-header-ng,x-foldview-toolbar-ng,x-foldview-drag-ng,x-text,inline-text,inline-image,inline-truncation,x-viewpager-ng,x-viewpager-item-ng,x-canvas,x-svg,x-image,filter-image,x-input,x-swiper,x-swiper-item,x-textarea,x-list,list-item{flex:var(--flex,var(--flex-grow) var(--flex-shrink) var(--flex-basis))}}@container style(--lynx-display:linear) and (style(--lynx-linear-orientation:vertical) or style(--lynx-linear-orientation:vertical-reverse)){x-view,x-blur-view,scroll-view,x-foldview-ng,x-foldview-slot-ng,x-foldview-header-ng,x-foldview-toolbar-ng,x-foldview-drag-ng,x-text,inline-text,inline-image,inline-truncation,x-viewpager-ng,x-viewpager-item-ng,x-canvas,x-svg,x-image,filter-image,x-input,x-swiper,x-swiper-item,x-textarea,x-list,list-item{align-self:var(--align-self-column)}}@container style(--lynx-display:linear) and (style(--lynx-linear-orientation:horizontal) or style(--lynx-linear-orientation:horizontal-reverse)){x-view,x-blur-view,scroll-view,x-foldview-ng,x-foldview-slot-ng,x-foldview-header-ng,x-foldview-toolbar-ng,x-foldview-drag-ng,x-text,inline-text,inline-image,inline-truncation,x-viewpager-ng,x-viewpager-item-ng,x-canvas,x-svg,x-image,filter-image,x-input,x-swiper,x-swiper-item,x-textarea,x-list,list-item{align-self:var(--align-self-row)}}}',"",{version:3,sources:["webpack://./../web-elements/src/elements/common-css/linear.css"],names:[],mappings:"AAIA,yBAAA,oBAAA,CAAA,cAAA,CAAA,oBAAA,CAMA,mCAAA,iBAAA,CAAA,cAAA,CAAA,eAAA,CAMA,+BAAA,iBAAA,CAAA,cAAA,CAAA,eAAA,CAMA,mCAAA,8DAAA,CAAA,cAAA,CAAA,wBAAA,CAMA,2CAAA,8DAAA,CAAA,cAAA,CAAA,wBAAA,CAMA,gCAAA,8DAAA,CAAA,cAAA,CAAA,wBAAA,CAMA,wCAAA,8DAAA,CAAA,cAAA,CAAA,wBAAA,CAMA,2BAAA,sCAAA,CAAA,cAAA,CAAA,kBAAA,CAMA,8BAAA,sCAAA,CAAA,cAAA,CAAA,kBAAA,CAMA,qCAAA,+BAAA,CAAA,cAAA,CAAA,kBAAA,CAMA,oCAAA,uBAAA,CAAA,cAAA,CAAA,sBAAA,CAMA,2BAAA,UAAA,CAAA,cAAA,CAKA,sBAAA,UAAA,CAAA,cAAA,CAKA,sBAAA,iBAAA,CAAA,cAAA,CAAA,eAAA,CAMA,wBAAA,iBAAA,CAAA,cAAA,CAAA,eAAA,CAMA,uBAAA,UAAA,CAAA,cAAA,CAAA,kBAAA,CAMA,uBAAA,UAAA,CAAA,cAAA,CAKA,iBAAA,UAAA,CAAA,cAAA,CAKA,mCAAA,8DAAA,CAAA,cAAA,CAAA,wBAAA,CAMA,kTAAA,qBAAA,CAAA,oBAAA,CAAA,kBAAA,CAAA,cAAA,CAAA,WAAA,CAAA,YAAA,CAAA,YAAA,CAAA,iBAAA,CAAA,aAAA,CAmCA,2BAAA,YAAA,CAOA,mOAAA,gDAAA,CAAA,iDAAA,CAAA,+CAAA,CAAA,wEAAA,CAAA,2EAAA,CAAA,yEAAA,CAAA,oFAAA,CAAA,kFAAA,CAAA,iPAAA,CAAA,8UAAA,CAoDA,uNAAA,qFAAA,CAAA,qHAAA,CAAA,wEAAA,CAgEA,6GAEE,wCACE,kTAAA,aAAA,CAAA,6IAAA,CAAA,0CAAA,CAAA,CA8CF,4CACE,kTAAA,sEAAA,CAAA,CA4BF,6IAGE,kTAAA,mCAAA,CAAA,CA4BF,iJAGE,kTAAA,gCAAA,CAAA,CAAA",sourcesContent:['/* Copyright 2024 The Lynx Authors. All rights reserved.\n Licensed under the Apache License Version 2.0 that can be found in the\n LICENSE file in the root directory of this source tree. \n */\n@property --lynx-display {\n syntax: "linear | flex";\n inherits: false;\n initial-value: linear;\n}\n\n@property --lynx-linear-weight-sum {\n syntax: "";\n inherits: false;\n initial-value: 1;\n}\n\n@property --lynx-linear-weight {\n syntax: "";\n inherits: false;\n initial-value: 0;\n}\n\n@property --justify-content-column {\n syntax: "flex-start|flex-end|center|space-between|space-around";\n inherits: false;\n initial-value: flex-start;\n}\n\n@property --justify-content-column-reverse {\n syntax: "flex-start|flex-end|center|space-between|space-around";\n inherits: false;\n initial-value: flex-start;\n}\n\n@property --justify-content-row {\n syntax: "flex-start|flex-end|center|space-between|space-around";\n inherits: false;\n initial-value: flex-start;\n}\n\n@property --justify-content-row-reverse {\n syntax: "flex-start|flex-end|center|space-between|space-around";\n inherits: false;\n initial-value: flex-start;\n}\n\n@property --align-self-row {\n syntax: "start|end|center|stretch|auto";\n inherits: false;\n initial-value: auto;\n}\n\n@property --align-self-column {\n syntax: "start|end|center|stretch|auto";\n inherits: false;\n initial-value: auto;\n}\n\n@property --lynx-linear-weight-basis {\n syntax: "auto||";\n inherits: false;\n initial-value: auto;\n}\n\n@property --lynx-linear-orientation {\n syntax: "";\n inherits: false;\n initial-value: vertical;\n}\n\n@property --flex-direction {\n syntax: "*";\n inherits: false;\n}\n\n@property --flex-wrap {\n syntax: "*";\n inherits: false;\n}\n\n@property --flex-grow {\n syntax: "";\n inherits: false;\n initial-value: 0;\n}\n\n@property --flex-shrink {\n syntax: "";\n inherits: false;\n initial-value: 1;\n}\n\n@property --flex-basis {\n syntax: "*";\n inherits: false;\n initial-value: auto;\n}\n\n@property --flex-value {\n syntax: "*";\n inherits: false;\n}\n\n@property --flex {\n syntax: "*";\n inherits: false;\n}\n\n@property --linear-justify-content {\n syntax: "flex-start|flex-end|center|space-between|space-around";\n inherits: false;\n initial-value: flex-start;\n}\n\nx-view,\nx-blur-view,\nscroll-view,\nx-foldview-ng,\nx-foldview-slot-ng,\nx-foldview-header-ng,\nx-foldview-toolbar-ng,\nx-foldview-drag-ng,\nx-text,\ninline-text,\ninline-image,\ninline-truncation,\nx-viewpager-ng,\nx-viewpager-item-ng,\nx-canvas,\nx-svg,\nx-image,\nfilter-image,\nx-input,\nx-swiper,\nx-swiper-item,\nx-textarea,\nx-list,\nlist-item {\n display: flex;\n box-sizing: border-box;\n border-width: 0px;\n position: relative;\n overflow: clip;\n min-width: 0;\n min-height: 0;\n border-style: solid;\n scrollbar-width: none;\n}\n\nx-view::--webkit-scrollbar {\n display: none;\n}\n\n/**\n * only enable this toggle logic for those container elements\n */\nx-view,\nscroll-view,\nx-foldview-header-ng,\nx-foldview-ng,\nx-foldview-slot-drag-ng,\nx-foldview-slot-ng,\nx-foldview-toolbar-ng,\nx-refresh-footer,\nx-refresh-header,\nx-refresh-view,\nx-swiper-item,\nx-viewpager-item-ng,\nx-viewpager-ng,\nlist-item {\n /*\n --lynx-display-toggle is compile-time generated.\n */\n --lynx-display-toggle: var(--lynx-display-linear);\n --lynx-display-linear: var(--lynx-display-toggle,);\n --lynx-display-flex: var(--lynx-display-toggle,);\n /*\n --lynx-linear-orientation-toggle is compile-time generated.\n */\n --lynx-linear-orientation-toggle: var(--lynx-linear-orientation-vertical);\n --lynx-linear-orientation-horizontal: var(--lynx-linear-orientation-toggle,);\n --lynx-linear-orientation-vertical: var(--lynx-linear-orientation-toggle,);\n --lynx-linear-orientation-horizontal-reverse: var(\n --lynx-linear-orientation-toggle,\n );\n --lynx-linear-orientation-vertical-reverse: var(\n --lynx-linear-orientation-toggle,\n );\n\n --linear-flex-direction: var(--lynx-linear-orientation-horizontal, row) var(\n --lynx-linear-orientation-vertical,\n column\n ) var(--lynx-linear-orientation-horizontal-reverse, row-reverse) var(\n --lynx-linear-orientation-vertical-reverse,\n column-reverse\n );\n --linear-justify-content: var(\n --lynx-linear-orientation-horizontal,\n var(--justify-content-row)\n ) var(--lynx-linear-orientation-vertical, var(--justify-content-column)) var(\n --lynx-linear-orientation-horizontal-reverse,\n var(--justify-content-row-reverse)\n ) var(\n --lynx-linear-orientation-vertical-reverse,\n var(--justify-content-column-reverse)\n );\n}\n\nx-view,\nx-foldview-header-ng,\nx-foldview-ng,\nx-foldview-slot-drag-ng,\nx-foldview-slot-ng,\nx-foldview-toolbar-ng,\nx-refresh-footer,\nx-refresh-header,\nx-refresh-view,\nx-swiper-item,\nx-viewpager-item-ng,\nx-viewpager-ng,\nlist-item {\n flex-wrap: var(--lynx-display-linear, nowrap)\n var(--lynx-display-flex, var(--flex-wrap));\n flex-direction: var(--lynx-display-linear, var(--linear-flex-direction))\n var(--lynx-display-flex, var(--flex-direction));\n justify-content: var(--lynx-display-linear, var(--linear-justify-content));\n}\n\n/** For @container\n *\n * when the chromuim version is less than 116.0.5806.0, the following code will crash:\n * ```\n * \n
\n
\n
\n