@bleedingdev/modern-js-app-tools 3.8.1-ultramodern.5 → 3.8.2-ultramodern.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
Configure React Server Components (RSC).
|
|
7
7
|
|
|
8
8
|
:::warning UltraModern availability
|
|
9
|
-
RSC is not shipped
|
|
9
|
+
RSC is experimental, default-off, and unsupported for external consumers; it is not shipped in the current UltraModern company distribution. Release-cohort and clean-room release-acceptance tests verify that RSC runtimes are absent and cannot resolve, and the release cohort has no maintained `@bleedingdev/*` RSC runtime package; when enabled, the framework intentionally fails closed unless an application supplies the complete optional toolchain.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
The root-only `react-server-dom-rspack@0.0.3` patch backports Flight decoder security fixes for this repository's RSC tests; it is never copied into generated workspaces or published to consumers, so an app installing the upstream package receives unpatched bytes. [SyMind/react#1](https://github.com/SyMind/react/pull/1) merged on 2026-08-11; [BleedingDev/react#1](https://github.com/BleedingDev/react/pull/1) and [rspack#15144](https://github.com/web-infra-dev/rspack/issues/15144) remain open. npm still reports `react-server-dom-rspack` `latest` as `0.0.3`, with no patched consumer release, so the root-only patch remains necessary for this repository's RSC tests. This boundary is pending final owner ratification.
|
|
12
12
|
:::
|
|
13
13
|
|
|
14
14
|
```ts title="modern.config.ts"
|
|
@@ -18,9 +18,9 @@ Before starting, we recommend reading React's official [Server Components docume
|
|
|
18
18
|
## Quick Start
|
|
19
19
|
|
|
20
20
|
:::warning UltraModern availability
|
|
21
|
-
RSC is not shipped
|
|
21
|
+
RSC is experimental, default-off, and unsupported for external consumers; it is not shipped in the current UltraModern company distribution. Release-cohort and clean-room release-acceptance tests verify that RSC runtimes are absent and cannot resolve, and the release cohort has no maintained `@bleedingdev/*` RSC runtime package; when enabled, the framework intentionally fails closed unless an application supplies the complete optional toolchain.
|
|
22
22
|
|
|
23
|
-
The
|
|
23
|
+
The root-only `react-server-dom-rspack@0.0.3` patch backports Flight decoder security fixes for this repository's RSC tests; it is never copied into generated workspaces or published to consumers, so an app installing the upstream package receives unpatched bytes. [SyMind/react#1](https://github.com/SyMind/react/pull/1) merged on 2026-08-11; [BleedingDev/react#1](https://github.com/BleedingDev/react/pull/1) and [rspack#15144](https://github.com/web-infra-dev/rspack/issues/15144) remain open. npm still reports `react-server-dom-rspack` `latest` as `0.0.3`, with no patched consumer release, so the root-only patch remains necessary for this repository's RSC tests. This boundary is pending final owner ratification.
|
|
24
24
|
:::
|
|
25
25
|
|
|
26
26
|
Keep [`server.rsc`](/configure/app/server/rsc.md) set to `false`:
|
|
@@ -73,20 +73,22 @@ mise exec -- pnpm check
|
|
|
73
73
|
mise exec -- pnpm build
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
### Migrating
|
|
76
|
+
### Migrating localized Cloudflare SSR workspaces
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
Current cohorts localize Cloudflare SSR workspaces.
|
|
79
|
+
The framework moves bare locale-root redirects into the framework-owned
|
|
80
80
|
Cloudflare Worker entry and the i18n server runtime. A request for `/` is
|
|
81
81
|
redirected server-side with `302` to the negotiated locale path, for example
|
|
82
82
|
`/cs` for `Accept-Language: cs-CZ` or `/en` for English and fallback traffic.
|
|
83
83
|
|
|
84
84
|
Existing generated workspaces should upgrade the whole BleedingDev Modern
|
|
85
|
-
package cohort together
|
|
85
|
+
package cohort together. Resolve the current cohort version first, then run
|
|
86
|
+
the matching migration:
|
|
86
87
|
|
|
87
88
|
```bash
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
COHORT="$(npm view @bleedingdev/modern-js-create version)"
|
|
90
|
+
pnpm dlx "@bleedingdev/modern-js-create@$COHORT" ultramodern \
|
|
91
|
+
migrate-strict-effect --version "$COHORT"
|
|
90
92
|
pnpm install
|
|
91
93
|
pnpm check
|
|
92
94
|
pnpm build
|
|
@@ -109,22 +111,23 @@ Do not fix older root `404` responses by adding app-owned root route files,
|
|
|
109
111
|
client-side redirects, custom navigation wrappers, Cloudflare Worker
|
|
110
112
|
postprocessing, generated output edits, or local redirect shims. If `/` still
|
|
111
113
|
returns `404` after upgrading, confirm the production build log shows
|
|
112
|
-
`Modern.js Framework
|
|
114
|
+
`Modern.js Framework v<cohort-version>` for the cohort you migrated to and
|
|
115
|
+
redeploy the Worker.
|
|
113
116
|
|
|
114
|
-
Strict generated API migration
|
|
115
|
-
`
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
newer with `--ultramodern-package-version`.
|
|
117
|
+
Strict generated API migration is part of every current cohort: the direct
|
|
118
|
+
`api/index.ts` generator, generated `.mts` checks, the strict Oxlint boundary
|
|
119
|
+
rule set, Effect cohort overrides, and the strict Effect migration command.
|
|
120
|
+
Agents that cannot install the BleedingDev cohort yet should use the local
|
|
121
|
+
Modern.js workspace for migration validation; otherwise pin the target cohort
|
|
122
|
+
with `--ultramodern-package-version`.
|
|
121
123
|
|
|
122
124
|
Before hand-editing package aliases or generated metadata, run the framework
|
|
123
125
|
migration command from the target workspace:
|
|
124
126
|
|
|
125
127
|
```bash
|
|
126
|
-
|
|
127
|
-
|
|
128
|
+
COHORT="$(npm view @bleedingdev/modern-js-create version)"
|
|
129
|
+
pnpm dlx "@bleedingdev/modern-js-create@$COHORT" ultramodern \
|
|
130
|
+
migrate-strict-effect --version "$COHORT"
|
|
128
131
|
pnpm api:check
|
|
129
132
|
pnpm contract:check
|
|
130
133
|
```
|
|
@@ -155,9 +158,16 @@ metadata transition; they are not release-age approvals.
|
|
|
155
158
|
| Effect compiler | `@effect/tsgo@0.36.2` |
|
|
156
159
|
| TanStack Router | `@tanstack/react-router@1.170.25`, `@tanstack/router-core@1.171.21`, `@tanstack/history@1.162.1` |
|
|
157
160
|
| Module Federation | `bridge-react`, `manifest`, `modern-js-v3`, and `rspack`: `2.8.2`; `@module-federation/node@2.7.49` |
|
|
158
|
-
| React Router | `react-router@7.18.2` |
|
|
159
161
|
| Node and package tooling | Node `26.7.0`, `@types/node@^26.2.0`, pnpm `11.21.0` |
|
|
160
162
|
|
|
163
|
+
Generated workspaces default to Module Federation bridge-react's router-free
|
|
164
|
+
base entry (`bridge.enableBridgeRouter: false`), with TanStack Router as the
|
|
165
|
+
application router. Declaring `react-router` (or `react-router-dom`) as a
|
|
166
|
+
direct dependency of an app marks it a React Router consumer: the
|
|
167
|
+
generator/migration then emit `enableBridgeRouter: true` for that app's
|
|
168
|
+
federation config, the workspace validator accepts it, and the UltraModern
|
|
169
|
+
preset aliases `react-router`'s entrypoints for the app's own routing.
|
|
170
|
+
|
|
161
171
|
Gradual migration means old, unmigrated Modern.js apps can keep their existing
|
|
162
172
|
runtime until they are converted. Once a surface is generated or migrated as
|
|
163
173
|
UltraModern HTTP API, it uses Effect HttpApi only; do not keep Hono, lambda
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"modern",
|
|
18
18
|
"modern.js"
|
|
19
19
|
],
|
|
20
|
-
"version": "3.8.
|
|
20
|
+
"version": "3.8.2-ultramodern.10",
|
|
21
21
|
"types": "./dist/types/index.d.ts",
|
|
22
22
|
"main": "./dist/cjs/index.js",
|
|
23
23
|
"exports": {
|
|
@@ -134,23 +134,23 @@
|
|
|
134
134
|
"@babel/traverse": "^8.0.0",
|
|
135
135
|
"@babel/types": "^8.0.0",
|
|
136
136
|
"@loadable/component": "5.16.7",
|
|
137
|
-
"@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.8.
|
|
138
|
-
"@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.8.
|
|
139
|
-
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.8.
|
|
140
|
-
"@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.8.
|
|
141
|
-
"@modern-js/prod-server": "npm:@bleedingdev/modern-js-prod-server@3.8.
|
|
142
|
-
"@modern-js/server": "npm:@bleedingdev/modern-js-server@3.8.
|
|
143
|
-
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.8.
|
|
144
|
-
"@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.8.
|
|
145
|
-
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.8.
|
|
146
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.8.
|
|
147
|
-
"@rsbuild/core": "2.
|
|
137
|
+
"@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.8.2-ultramodern.10",
|
|
138
|
+
"@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.8.2-ultramodern.10",
|
|
139
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.8.2-ultramodern.10",
|
|
140
|
+
"@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.8.2-ultramodern.10",
|
|
141
|
+
"@modern-js/prod-server": "npm:@bleedingdev/modern-js-prod-server@3.8.2-ultramodern.10",
|
|
142
|
+
"@modern-js/server": "npm:@bleedingdev/modern-js-server@3.8.2-ultramodern.10",
|
|
143
|
+
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.8.2-ultramodern.10",
|
|
144
|
+
"@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.8.2-ultramodern.10",
|
|
145
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.8.2-ultramodern.10",
|
|
146
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.8.2-ultramodern.10",
|
|
147
|
+
"@rsbuild/core": "2.2.0-rc.0",
|
|
148
148
|
"@swc/core": "1.15.43",
|
|
149
149
|
"@swc/helpers": "^0.5.23",
|
|
150
150
|
"compression-webpack-plugin": "^12.0.0",
|
|
151
151
|
"es-module-lexer": "^2.3.0",
|
|
152
152
|
"esbuild": "^0.28.1",
|
|
153
|
-
"flatted": "^3.4.
|
|
153
|
+
"flatted": "^3.4.4",
|
|
154
154
|
"import-meta-resolve": "^4.2.0",
|
|
155
155
|
"mlly": "^1.8.2",
|
|
156
156
|
"ndepe": "^0.1.13",
|
package/rslib.config.mts
CHANGED
|
@@ -20,11 +20,22 @@ export default defineConfig({
|
|
|
20
20
|
},
|
|
21
21
|
output: {
|
|
22
22
|
...libConfig.output,
|
|
23
|
+
// `src/esm` is also matched by the `./src/**` entry, so the bundler
|
|
24
|
+
// emits these files itself. The ESM outputs keep the `.mjs` extension,
|
|
25
|
+
// which means bundle and copy write the very same paths — two writers
|
|
26
|
+
// for one file, occasionally leaving it truncated and unparsable, which
|
|
27
|
+
// takes down every `"type": "module"` project. The CJS output emits
|
|
28
|
+
// `.js`, so there the copy is the only thing providing the `.mjs`
|
|
29
|
+
// loaders that `register()` resolves by name; keep it for that alone.
|
|
23
30
|
copy: [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
...(libConfig.format === 'esm'
|
|
32
|
+
? []
|
|
33
|
+
: [
|
|
34
|
+
{
|
|
35
|
+
from: './src/esm',
|
|
36
|
+
to: './esm',
|
|
37
|
+
},
|
|
38
|
+
]),
|
|
28
39
|
{
|
|
29
40
|
from: './src/plugins/deploy/platforms/templates',
|
|
30
41
|
to: './plugins/deploy/platforms/templates',
|