@bleedingdev/modern-js-app-tools 3.8.2-ultramodern.9 → 3.8.3-ultramodern.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/modern-bundle-docs.js +11 -0
- package/bin/modern.js +11 -0
- package/dist/cjs/builder/generator/getBuilderEnvironments.js +13 -241
- package/dist/cjs/builder/generator/index.js +0 -1
- package/dist/cjs/builder/shared/builderPlugins/adapterSSR.js +37 -9
- package/dist/cjs/builder/shared/builderPlugins/index.js +6 -13
- package/dist/cjs/builder/shared/bundlerPlugins/index.js +6 -13
- package/dist/cjs/builder/shared/lazyCompilation.js +9 -9
- package/dist/cjs/bundleDocs.js +1 -1
- package/dist/cjs/index.js +59 -60
- package/dist/cjs/plugins/analyze/getServerRoutes.js +1 -1
- package/dist/cjs/plugins/analyze/isDefaultExportFunction.js +1 -9
- package/dist/cjs/plugins/backend-federation/codegen.js +2 -1
- package/dist/cjs/plugins/backend-federation/config.js +2 -2
- package/dist/cjs/plugins/backend-federation/emit.js +6 -4
- package/dist/cjs/plugins/deploy/index.js +4 -4
- package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/index.js +23 -149
- package/dist/cjs/plugins/deploy/platforms/templates/netlify-entry.cjs +41 -62
- package/dist/cjs/plugins/deploy/platforms/templates/netlify-entry.mjs +41 -63
- package/dist/cjs/plugins/deploy/platforms/templates/node-entry.cjs +35 -52
- package/dist/cjs/plugins/deploy/platforms/templates/node-entry.mjs +35 -53
- package/dist/cjs/plugins/deploy/platforms/templates/vercel-entry.cjs +41 -61
- package/dist/cjs/plugins/deploy/platforms/templates/vercel-entry.mjs +40 -61
- package/dist/cjs/plugins/ultramodernReleaseEnvelope.js +3 -59
- package/dist/cjs/presetUltramodern.js +15 -8
- package/dist/cjs/run/index.js +9 -9
- package/dist/cjs/utils/env.js +1 -1
- package/dist/cjs/utils/register.js +6 -3
- package/dist/esm/builder/generator/getBuilderEnvironments.mjs +12 -231
- package/dist/esm/builder/generator/index.mjs +1 -2
- package/dist/esm/builder/shared/builderPlugins/adapterSSR.mjs +34 -9
- package/dist/esm/builder/shared/builderPlugins/index.mjs +0 -1
- package/dist/esm/builder/shared/bundlerPlugins/index.mjs +0 -1
- package/dist/esm/builder/shared/lazyCompilation.mjs +4 -4
- package/dist/esm/bundleDocs.mjs +1 -1
- package/dist/esm/index.mjs +3 -3
- package/dist/esm/plugins/analyze/getServerRoutes.mjs +1 -1
- package/dist/esm/plugins/analyze/isDefaultExportFunction.mjs +1 -9
- package/dist/esm/plugins/backend-federation/codegen.mjs +2 -1
- package/dist/esm/plugins/backend-federation/config.mjs +1 -1
- package/dist/esm/plugins/backend-federation/emit.mjs +5 -3
- package/dist/esm/plugins/deploy/index.mjs +1 -1
- package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/index.mjs +1 -133
- package/dist/esm/plugins/deploy/platforms/templates/netlify-entry.cjs +41 -62
- package/dist/esm/plugins/deploy/platforms/templates/netlify-entry.mjs +41 -63
- package/dist/esm/plugins/deploy/platforms/templates/node-entry.cjs +35 -52
- package/dist/esm/plugins/deploy/platforms/templates/node-entry.mjs +35 -53
- package/dist/esm/plugins/deploy/platforms/templates/vercel-entry.cjs +41 -61
- package/dist/esm/plugins/deploy/platforms/templates/vercel-entry.mjs +40 -61
- package/dist/esm/plugins/ultramodernReleaseEnvelope.mjs +3 -49
- package/dist/esm/presetUltramodern.mjs +8 -5
- package/dist/esm/run/index.mjs +9 -9
- package/dist/esm/utils/env.mjs +1 -1
- package/dist/esm/utils/register.mjs +6 -3
- package/dist/esm-node/builder/generator/getBuilderEnvironments.mjs +12 -234
- package/dist/esm-node/builder/generator/index.mjs +1 -2
- package/dist/esm-node/builder/shared/builderPlugins/adapterSSR.mjs +34 -9
- package/dist/esm-node/builder/shared/builderPlugins/index.mjs +0 -1
- package/dist/esm-node/builder/shared/bundlerPlugins/index.mjs +0 -1
- package/dist/esm-node/builder/shared/lazyCompilation.mjs +4 -4
- package/dist/esm-node/bundleDocs.mjs +1 -1
- package/dist/esm-node/index.mjs +3 -3
- package/dist/esm-node/plugins/analyze/getServerRoutes.mjs +1 -1
- package/dist/esm-node/plugins/analyze/isDefaultExportFunction.mjs +1 -9
- package/dist/esm-node/plugins/backend-federation/codegen.mjs +2 -1
- package/dist/esm-node/plugins/backend-federation/config.mjs +1 -1
- package/dist/esm-node/plugins/backend-federation/emit.mjs +5 -3
- package/dist/esm-node/plugins/deploy/index.mjs +1 -1
- package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/index.mjs +1 -133
- package/dist/esm-node/plugins/deploy/platforms/templates/netlify-entry.cjs +41 -62
- package/dist/esm-node/plugins/deploy/platforms/templates/netlify-entry.mjs +41 -63
- package/dist/esm-node/plugins/deploy/platforms/templates/node-entry.cjs +35 -52
- package/dist/esm-node/plugins/deploy/platforms/templates/node-entry.mjs +35 -53
- package/dist/esm-node/plugins/deploy/platforms/templates/vercel-entry.cjs +41 -61
- package/dist/esm-node/plugins/deploy/platforms/templates/vercel-entry.mjs +40 -61
- package/dist/esm-node/plugins/ultramodernReleaseEnvelope.mjs +3 -49
- package/dist/esm-node/presetUltramodern.mjs +8 -5
- package/dist/esm-node/run/index.mjs +9 -9
- package/dist/esm-node/utils/env.mjs +1 -1
- package/dist/esm-node/utils/register.mjs +6 -3
- package/dist/types/builder/generator/getBuilderEnvironments.d.ts +0 -29
- package/dist/types/builder/shared/builderPlugins/adapterSSR.d.ts +11 -0
- package/dist/types/builder/shared/builderPlugins/index.d.ts +0 -1
- package/dist/types/builder/shared/bundlerPlugins/index.d.ts +0 -1
- package/dist/types/builder/shared/lazyCompilation.d.ts +7 -7
- package/dist/types/plugins/analyze/getServerRoutes.d.ts +1 -1
- package/dist/types/plugins/backend-federation/codegen.d.ts +4 -1
- package/dist/types/plugins/deploy/platforms/cloudflare-output-verifier/index.d.ts +1 -18
- package/dist/types/presetUltramodern.d.ts +23 -2
- package/dist/types/types/config/deploy.d.ts +2 -2
- package/docs/community/showcase.md +3 -5
- package/docs/configure/app/bff/effect.md +7 -7
- package/docs/guides/advanced-features/bff/frameworks.md +1 -1
- package/docs/guides/basic-features/deploy.md +2 -2
- package/docs/guides/get-started/quick-start.md +10 -9
- package/docs/guides/get-started/tech-stack.md +1 -1
- package/docs/guides/get-started/ultramodern.md +123 -38
- package/docs/guides/troubleshooting/cli.md +1 -1
- package/docs/llms.txt +2 -2
- package/docs/tutorials/examples/csr-auth.md +1 -1
- package/package.json +16 -28
- package/rslib.config.mts +4 -7
- package/dist/cjs/builder/shared/builderPlugins/adapterLazyCompilation.js +0 -74
- package/dist/cjs/builder/shared/bundlerPlugins/CssExtractRuntimePlugin.js +0 -72
- package/dist/cjs/plugins/deploy/platforms/cloudflare/artifacts.js +0 -127
- package/dist/cjs/plugins/deploy/platforms/cloudflare/constants.js +0 -141
- package/dist/cjs/plugins/deploy/platforms/cloudflare/delivery-unit.js +0 -139
- package/dist/cjs/plugins/deploy/platforms/cloudflare/i18n-worker.js +0 -135
- package/dist/cjs/plugins/deploy/platforms/cloudflare/index.js +0 -150
- package/dist/cjs/plugins/deploy/platforms/cloudflare/security-policies.js +0 -205
- package/dist/cjs/plugins/deploy/platforms/cloudflare/types.js +0 -18
- package/dist/cjs/plugins/deploy/platforms/cloudflare/utils.js +0 -66
- package/dist/cjs/plugins/deploy/platforms/cloudflare/worker-manifest.js +0 -208
- package/dist/cjs/plugins/deploy/platforms/cloudflare/wrangler-config.js +0 -204
- package/dist/cjs/plugins/deploy/platforms/cloudflare-output-contract.js +0 -108
- package/dist/cjs/plugins/deploy/platforms/cloudflare-output-plan.js +0 -93
- package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/identity.js +0 -83
- package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/issues.js +0 -54
- package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/manifest.js +0 -89
- package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/mutation-policy.js +0 -151
- package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.js +0 -378
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +0 -251
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.002-assets-routes.mjs +0 -191
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.003-i18n-locales.mjs +0 -514
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.004-rendering-css.mjs +0 -1012
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.005-worker-dispatch.mjs +0 -363
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.006-fetch-handler.mjs +0 -93
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/cjs/types/config/cloudflareDeploy.js +0 -18
- package/dist/cjs/ultramodern-release-envelope/canonical.js +0 -68
- package/dist/cjs/ultramodern-release-envelope/framework-output.js +0 -649
- package/dist/cjs/ultramodern-release-envelope/index.js +0 -399
- package/dist/cjs/ultramodern-release-envelope/types.js +0 -51
- package/dist/cjs/ultramodern-release-identity.js +0 -110
- package/dist/esm/builder/shared/builderPlugins/adapterLazyCompilation.mjs +0 -36
- package/dist/esm/builder/shared/bundlerPlugins/CssExtractRuntimePlugin.mjs +0 -30
- package/dist/esm/plugins/deploy/platforms/cloudflare/artifacts.mjs +0 -64
- package/dist/esm/plugins/deploy/platforms/cloudflare/constants.mjs +0 -34
- package/dist/esm/plugins/deploy/platforms/cloudflare/delivery-unit.mjs +0 -88
- package/dist/esm/plugins/deploy/platforms/cloudflare/i18n-worker.mjs +0 -97
- package/dist/esm/plugins/deploy/platforms/cloudflare/index.mjs +0 -102
- package/dist/esm/plugins/deploy/platforms/cloudflare/security-policies.mjs +0 -167
- package/dist/esm/plugins/deploy/platforms/cloudflare/types.mjs +0 -0
- package/dist/esm/plugins/deploy/platforms/cloudflare/utils.mjs +0 -12
- package/dist/esm/plugins/deploy/platforms/cloudflare/worker-manifest.mjs +0 -148
- package/dist/esm/plugins/deploy/platforms/cloudflare/wrangler-config.mjs +0 -150
- package/dist/esm/plugins/deploy/platforms/cloudflare-output-contract.mjs +0 -31
- package/dist/esm/plugins/deploy/platforms/cloudflare-output-plan.mjs +0 -45
- package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/identity.mjs +0 -45
- package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/issues.mjs +0 -10
- package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/manifest.mjs +0 -51
- package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/mutation-policy.mjs +0 -99
- package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.mjs +0 -313
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +0 -251
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.002-assets-routes.mjs +0 -191
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.003-i18n-locales.mjs +0 -514
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.004-rendering-css.mjs +0 -1012
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.005-worker-dispatch.mjs +0 -363
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.006-fetch-handler.mjs +0 -93
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/esm/types/config/cloudflareDeploy.mjs +0 -0
- package/dist/esm/ultramodern-release-envelope/canonical.mjs +0 -21
- package/dist/esm/ultramodern-release-envelope/framework-output.mjs +0 -573
- package/dist/esm/ultramodern-release-envelope/index.mjs +0 -335
- package/dist/esm/ultramodern-release-envelope/types.mjs +0 -7
- package/dist/esm/ultramodern-release-identity.mjs +0 -66
- package/dist/esm-node/builder/shared/builderPlugins/adapterLazyCompilation.mjs +0 -37
- package/dist/esm-node/builder/shared/bundlerPlugins/CssExtractRuntimePlugin.mjs +0 -31
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/artifacts.mjs +0 -65
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/constants.mjs +0 -35
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/delivery-unit.mjs +0 -89
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/i18n-worker.mjs +0 -98
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/index.mjs +0 -103
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/security-policies.mjs +0 -168
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/types.mjs +0 -1
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/utils.mjs +0 -13
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/worker-manifest.mjs +0 -149
- package/dist/esm-node/plugins/deploy/platforms/cloudflare/wrangler-config.mjs +0 -151
- package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-contract.mjs +0 -32
- package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-plan.mjs +0 -46
- package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/identity.mjs +0 -46
- package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/issues.mjs +0 -11
- package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/manifest.mjs +0 -52
- package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/mutation-policy.mjs +0 -100
- package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.mjs +0 -314
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +0 -251
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.002-assets-routes.mjs +0 -191
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.003-i18n-locales.mjs +0 -514
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.004-rendering-css.mjs +0 -1012
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.005-worker-dispatch.mjs +0 -363
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.006-fetch-handler.mjs +0 -93
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/esm-node/types/config/cloudflareDeploy.mjs +0 -1
- package/dist/esm-node/ultramodern-release-envelope/canonical.mjs +0 -22
- package/dist/esm-node/ultramodern-release-envelope/framework-output.mjs +0 -574
- package/dist/esm-node/ultramodern-release-envelope/index.mjs +0 -336
- package/dist/esm-node/ultramodern-release-envelope/types.mjs +0 -8
- package/dist/esm-node/ultramodern-release-identity.mjs +0 -67
- package/dist/types/builder/shared/builderPlugins/adapterLazyCompilation.d.ts +0 -3
- package/dist/types/builder/shared/bundlerPlugins/CssExtractRuntimePlugin.d.ts +0 -6
- package/dist/types/plugins/deploy/platforms/cloudflare/artifacts.d.ts +0 -15
- package/dist/types/plugins/deploy/platforms/cloudflare/constants.d.ts +0 -24
- package/dist/types/plugins/deploy/platforms/cloudflare/delivery-unit.d.ts +0 -23
- package/dist/types/plugins/deploy/platforms/cloudflare/i18n-worker.d.ts +0 -22
- package/dist/types/plugins/deploy/platforms/cloudflare/index.d.ts +0 -2
- package/dist/types/plugins/deploy/platforms/cloudflare/security-policies.d.ts +0 -51
- package/dist/types/plugins/deploy/platforms/cloudflare/types.d.ts +0 -5
- package/dist/types/plugins/deploy/platforms/cloudflare/utils.d.ts +0 -6
- package/dist/types/plugins/deploy/platforms/cloudflare/worker-manifest.d.ts +0 -122
- package/dist/types/plugins/deploy/platforms/cloudflare/wrangler-config.d.ts +0 -46
- package/dist/types/plugins/deploy/platforms/cloudflare-output-contract.d.ts +0 -14
- package/dist/types/plugins/deploy/platforms/cloudflare-output-plan.d.ts +0 -34
- package/dist/types/plugins/deploy/platforms/cloudflare-output-verifier/identity.d.ts +0 -4
- package/dist/types/plugins/deploy/platforms/cloudflare-output-verifier/issues.d.ts +0 -14
- package/dist/types/plugins/deploy/platforms/cloudflare-output-verifier/manifest.d.ts +0 -2
- package/dist/types/plugins/deploy/platforms/cloudflare-output-verifier/mutation-policy.d.ts +0 -14
- package/dist/types/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.d.ts +0 -20
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.d.mts +0 -1
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.002-assets-routes.d.mts +0 -1
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.003-i18n-locales.d.mts +0 -1
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.004-rendering-css.d.mts +0 -1
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.005-worker-dispatch.d.mts +0 -1
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.006-fetch-handler.d.mts +0 -4
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.d.mts +0 -5
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.d.mts +0 -48
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +0 -13
- package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-path.d.mts +0 -21
- package/dist/types/types/config/cloudflareDeploy.d.ts +0 -161
- package/dist/types/ultramodern-release-envelope/canonical.d.ts +0 -5
- package/dist/types/ultramodern-release-envelope/framework-output.d.ts +0 -32
- package/dist/types/ultramodern-release-envelope/index.d.ts +0 -6
- package/dist/types/ultramodern-release-envelope/types.d.ts +0 -62
- package/dist/types/ultramodern-release-identity.d.ts +0 -16
|
@@ -50,7 +50,7 @@ would give your app a second Effect identity. Before setting
|
|
|
50
50
|
`/effect-server`, `/effect-edge` or `/effect-client`, install the exact cohort:
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
pnpm add effect@4.0.0-
|
|
53
|
+
pnpm add effect@4.0.0-rc.112 @effect/opentelemetry@4.0.0-rc.112
|
|
54
54
|
```
|
|
55
55
|
|
|
56
56
|
The pin is exact because UltraModern ships Effect as one lockstep cohort. Apps
|
|
@@ -215,17 +215,17 @@ generated apps use:
|
|
|
215
215
|
|
|
216
216
|
```yaml
|
|
217
217
|
trustPolicyExclude:
|
|
218
|
-
- 'effect@4.0.0-
|
|
219
|
-
- '@effect/opentelemetry@4.0.0-
|
|
218
|
+
- 'effect@4.0.0-rc.112'
|
|
219
|
+
- '@effect/opentelemetry@4.0.0-rc.112'
|
|
220
220
|
|
|
221
221
|
overrides:
|
|
222
|
-
'@effect/opentelemetry': 4.0.0-
|
|
223
|
-
'@effect/vitest': 4.0.0-
|
|
224
|
-
effect: 4.0.0-
|
|
222
|
+
'@effect/opentelemetry': 4.0.0-rc.112
|
|
223
|
+
'@effect/vitest': 4.0.0-rc.112
|
|
224
|
+
effect: 4.0.0-rc.112
|
|
225
225
|
```
|
|
226
226
|
|
|
227
227
|
Do not add a different direct `effect` version in an app package. A mismatched
|
|
228
|
-
Effect
|
|
228
|
+
Effect prerelease can fail while building layers or HTTP middleware because runtime
|
|
229
229
|
services come from different package instances. The strict 24-hour release-age
|
|
230
230
|
gate applies to installed packages; the current cohort has no Effect age
|
|
231
231
|
exemption, and override-only `@effect/vitest` is not an installed approval
|
|
@@ -117,7 +117,7 @@ const response = await api.client.hello.ping({});
|
|
|
117
117
|
|
|
118
118
|
The `api.client.*` surface is materialized by the BFF loader for `@api/index` imports. Do not import `api/index` directly and expect `client` to run in server code, scripts, or tests; direct entry imports expose the server runtime definition, and `client` is only a typed placeholder there.
|
|
119
119
|
|
|
120
|
-
For UltraModern, Effect `HttpApi` plus Effect BFF is the single blessed authored HTTP path. Use `HttpApi` endpoints with `query`, `params`, `payload`, `success`, and declared errors such as `HttpApiSchema.status(...)`; implement them with `HttpApiBuilder.group(...).handle(...)` and `HttpApiBuilder.layer(...).pipe(Layer.provide(...))`, then default-export the entry as `defineEffectBff({ api, layer })`. See `packages/
|
|
120
|
+
For UltraModern, Effect `HttpApi` plus Effect BFF is the single blessed authored HTTP path. Use `HttpApi` endpoints with `query`, `params`, `payload`, `success`, and declared errors such as `HttpApiSchema.status(...)`; implement them with `HttpApiBuilder.group(...).handle(...)` and `HttpApiBuilder.layer(...).pipe(Layer.provide(...))`, then default-export the entry as `defineEffectBff({ api, layer })`. See `packages/server/bff-effect/tests/effect-edge-runtime.test.ts` for the live runtime shape.
|
|
121
121
|
|
|
122
122
|
Hono and `api/lambda/**` are internal compatibility only and feature-frozen.
|
|
123
123
|
|
|
@@ -260,11 +260,11 @@ Assuming the directory structure of the Monorepo repository is as follows:
|
|
|
260
260
|
First, you need to configure the **Root Directory** as `packages/app` on the Vercel platform:
|
|
261
261
|
|
|
262
262
|

|
|
263
|
-
Specify Node.js runtime as `
|
|
263
|
+
Specify Node.js runtime as `26.7.0` or newer:
|
|
264
264
|
|
|
265
265
|
```json title="package.json"
|
|
266
266
|
"engines": {
|
|
267
|
-
"node": "
|
|
267
|
+
"node": ">=26.7.0"
|
|
268
268
|
}
|
|
269
269
|
```
|
|
270
270
|
|
|
@@ -38,7 +38,7 @@ Additionally, after installing nvm or fnm, when there is a `.nvmrc` file contain
|
|
|
38
38
|
It is recommended to use [pnpm](https://pnpm.io/installation) to manage dependencies:
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
mise use pnpm@11.
|
|
41
|
+
mise use pnpm@11.24.0
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
:::note
|
|
@@ -55,26 +55,27 @@ workspaces. It does not require global installation and can be run on-demand
|
|
|
55
55
|
using `pnpm dlx`.
|
|
56
56
|
|
|
57
57
|
The supported pnpm command is the scoped package specifier:
|
|
58
|
-
`pnpm dlx @bleedingdev/modern-js-create <target>`. Do not shorten it
|
|
59
|
-
`pnpm dlx modern-js-create`; there is no unscoped package by
|
|
58
|
+
`pnpm dlx @bleedingdev/modern-js-ultramodern-create <target>`. Do not shorten it
|
|
59
|
+
to `pnpm dlx modern-js-ultramodern-create`; there is no unscoped package by
|
|
60
|
+
that name.
|
|
60
61
|
|
|
61
62
|
You can initialize the empty directory you are already in:
|
|
62
63
|
|
|
63
64
|
```bash
|
|
64
65
|
mkdir myapp && cd myapp
|
|
65
|
-
pnpm dlx @bleedingdev/modern-js-create .
|
|
66
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create .
|
|
66
67
|
```
|
|
67
68
|
|
|
68
69
|
You can also create a project directly in a new directory:
|
|
69
70
|
|
|
70
71
|
```bash
|
|
71
|
-
pnpm dlx @bleedingdev/modern-js-create my-super-app
|
|
72
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create my-super-app
|
|
72
73
|
```
|
|
73
74
|
|
|
74
75
|
To initialize with workspace protocol dependencies (for local monorepo testing of unreleased Modern.js packages):
|
|
75
76
|
|
|
76
77
|
```bash
|
|
77
|
-
pnpm dlx @bleedingdev/modern-js-create my-super-app --workspace
|
|
78
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create my-super-app --workspace
|
|
78
79
|
```
|
|
79
80
|
|
|
80
81
|
The BleedingDev create package will directly create the application without providing an interactive Q & A interface:
|
|
@@ -125,13 +126,13 @@ The default workspace starts shell-only and installs the published BleedingDev
|
|
|
125
126
|
package aliases:
|
|
126
127
|
|
|
127
128
|
```bash
|
|
128
|
-
pnpm dlx @bleedingdev/modern-js-create my-super-app
|
|
129
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create my-super-app
|
|
129
130
|
```
|
|
130
131
|
|
|
131
132
|
From a generated SuperApp workspace, add a business MicroVertical in place:
|
|
132
133
|
|
|
133
134
|
```bash
|
|
134
|
-
pnpm dlx @bleedingdev/modern-js-create transportation --vertical
|
|
135
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create transportation --vertical
|
|
135
136
|
```
|
|
136
137
|
|
|
137
138
|
The `--vertical` command mutates the current workspace: it adds the vertical
|
|
@@ -164,7 +165,7 @@ Open `http://localhost:8080/` in your browser to see the page content.
|
|
|
164
165
|
|
|
165
166
|
## Configuration
|
|
166
167
|
|
|
167
|
-
In an UltraModern.js project created using `@bleedingdev/modern-js-create`, a `modern.config.ts` file is generated by default.
|
|
168
|
+
In an UltraModern.js project created using `@bleedingdev/modern-js-ultramodern-create`, a `modern.config.ts` file is generated by default.
|
|
168
169
|
|
|
169
170
|
You can modify the configuration through this file to override the default behavior of Modern.js. For example, to enable SSR, add the following configuration:
|
|
170
171
|
|
|
@@ -20,7 +20,7 @@ Modern.js provides two first-party routing frameworks:
|
|
|
20
20
|
When creating an UltraModern project, TanStack Router is included by default:
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
pnpm dlx @bleedingdev/modern-js-create myapp
|
|
23
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create myapp
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
Modern.js supports conventional routing, self-controlled routing, or other routing schemes. Please refer to ["Routing"](/guides/basic-features/routes/routes.md) to make your choice.
|
|
@@ -64,9 +64,9 @@ For an older generated workspace, migrate by treating the published cohort as
|
|
|
64
64
|
the source of truth:
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
|
-
pnpm dlx @bleedingdev/modern-js-create@latest --help
|
|
68
|
-
pnpm dlx @bleedingdev/modern-js-create@latest catalog --vertical --dry-run
|
|
69
|
-
pnpm dlx @bleedingdev/modern-js-create@latest catalog --vertical
|
|
67
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create@latest --help
|
|
68
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create@latest catalog --vertical --dry-run
|
|
69
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create@latest catalog --vertical
|
|
70
70
|
mise install
|
|
71
71
|
mise exec -- pnpm install
|
|
72
72
|
mise exec -- pnpm check
|
|
@@ -86,8 +86,8 @@ package cohort together. Resolve the current cohort version first, then run
|
|
|
86
86
|
the matching migration:
|
|
87
87
|
|
|
88
88
|
```bash
|
|
89
|
-
COHORT="$(npm view @bleedingdev/modern-js-create version)"
|
|
90
|
-
pnpm dlx "@bleedingdev/modern-js-create@$COHORT" ultramodern \
|
|
89
|
+
COHORT="$(npm view @bleedingdev/modern-js-ultramodern-create version)"
|
|
90
|
+
pnpm dlx "@bleedingdev/modern-js-ultramodern-create@$COHORT" ultramodern \
|
|
91
91
|
migrate-strict-effect --version "$COHORT"
|
|
92
92
|
pnpm install
|
|
93
93
|
pnpm check
|
|
@@ -125,8 +125,8 @@ Before hand-editing package aliases or generated metadata, run the framework
|
|
|
125
125
|
migration command from the target workspace:
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
|
-
COHORT="$(npm view @bleedingdev/modern-js-create version)"
|
|
129
|
-
pnpm dlx "@bleedingdev/modern-js-create@$COHORT" ultramodern \
|
|
128
|
+
COHORT="$(npm view @bleedingdev/modern-js-ultramodern-create version)"
|
|
129
|
+
pnpm dlx "@bleedingdev/modern-js-ultramodern-create@$COHORT" ultramodern \
|
|
130
130
|
migrate-strict-effect --version "$COHORT"
|
|
131
131
|
pnpm api:check
|
|
132
132
|
pnpm contract:check
|
|
@@ -141,8 +141,8 @@ migration work: move code to `shared/api.ts`, `api/index.ts`, and
|
|
|
141
141
|
and `src/effect`.
|
|
142
142
|
|
|
143
143
|
Generated strict Effect workspaces pin the compatible Effect cohort with pnpm
|
|
144
|
-
overrides: `effect@4.0.0-
|
|
145
|
-
and `@effect/vitest@4.0.0-
|
|
144
|
+
overrides: `effect@4.0.0-rc.112`, `@effect/opentelemetry@4.0.0-rc.112`,
|
|
145
|
+
and `@effect/vitest@4.0.0-rc.112`. Do not add app-local direct Effect
|
|
146
146
|
versions that disagree with those overrides. The strict 24-hour release-age
|
|
147
147
|
gate applies to installed packages; this cohort carries no Effect age
|
|
148
148
|
exemption, and override-only `@effect/vitest` is not an installed approval
|
|
@@ -154,12 +154,21 @@ metadata transition; they are not release-age approvals.
|
|
|
154
154
|
|
|
155
155
|
| Surface | Pin |
|
|
156
156
|
| ------------------------------ | --------------------------------------------------------------------------------------------------- |
|
|
157
|
-
| Effect runtime and test cohort | `effect`, `@effect/opentelemetry`, and `@effect/vitest`: `4.0.0-
|
|
158
|
-
| Effect compiler | `@effect/tsgo@0.
|
|
159
|
-
|
|
|
160
|
-
|
|
|
161
|
-
|
|
|
162
|
-
|
|
|
157
|
+
| Effect runtime and test cohort | `effect`, `@effect/opentelemetry`, and `@effect/vitest`: `4.0.0-rc.112` |
|
|
158
|
+
| Effect compiler | `@effect/tsgo@0.37.0` |
|
|
159
|
+
| Oxc and Ultracite | `oxlint@1.80.0`, `oxfmt@0.65.0`, `ultracite@7.10.6` |
|
|
160
|
+
| TanStack Router | `@tanstack/react-router@1.170.32`, `@tanstack/router-core@1.171.27`, `@tanstack/history@1.162.1` |
|
|
161
|
+
| Module Federation | `bridge-react`, `manifest`, `modern-js-v3`, and `rspack`: `2.9.0`; `@module-federation/node@2.7.50` |
|
|
162
|
+
| Tailwind CSS | `tailwindcss@4.3.3` |
|
|
163
|
+
| Node and package tooling | Node `26.7.0`, `@types/node@^26.2.0`, pnpm `11.24.0` |
|
|
164
|
+
|
|
165
|
+
Generated workspaces default to Module Federation bridge-react's router-free
|
|
166
|
+
base entry (`bridge.enableBridgeRouter: false`), with TanStack Router as the
|
|
167
|
+
application router. Declaring `react-router` (or `react-router-dom`) as a
|
|
168
|
+
direct dependency of an app marks it a React Router consumer: the
|
|
169
|
+
generator/migration then emit `enableBridgeRouter: true` for that app's
|
|
170
|
+
federation config, the workspace validator accepts it, and the UltraModern
|
|
171
|
+
preset aliases `react-router`'s entrypoints for the app's own routing.
|
|
163
172
|
|
|
164
173
|
Gradual migration means old, unmigrated Modern.js apps can keep their existing
|
|
165
174
|
runtime until they are converted. Once a surface is generated or migrated as
|
|
@@ -243,6 +252,94 @@ directories, and caches are isolated per app, build target, and Rspack
|
|
|
243
252
|
environment so local `build`, `cloudflare:build`, and multi-environment
|
|
244
253
|
compilers do not share mutable build state.
|
|
245
254
|
|
|
255
|
+
## Configure the public preset
|
|
256
|
+
|
|
257
|
+
Use `presetUltramodern(appConfig, presetOptions)` inside the normal Modern.js
|
|
258
|
+
`defineConfig` call:
|
|
259
|
+
|
|
260
|
+
```ts title="modern.config.ts"
|
|
261
|
+
import { defineConfig, presetUltramodern } from '@modern-js/app-tools';
|
|
262
|
+
|
|
263
|
+
export default defineConfig(
|
|
264
|
+
presetUltramodern(
|
|
265
|
+
{
|
|
266
|
+
output: {
|
|
267
|
+
precompress: false,
|
|
268
|
+
},
|
|
269
|
+
server: {
|
|
270
|
+
telemetry: {
|
|
271
|
+
failLoudStartup: true,
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
appId: 'catalog',
|
|
277
|
+
enableModuleFederationSSR: false,
|
|
278
|
+
enableTelemetryExporters: false,
|
|
279
|
+
},
|
|
280
|
+
),
|
|
281
|
+
);
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
The first argument is ordinary `AppUserConfig`. It contains app-owned config
|
|
285
|
+
and wins where it supplies an override. The second argument controls the
|
|
286
|
+
preset itself. Use its typed options, such as `enableBffRequestId: false`,
|
|
287
|
+
`enableTelemetry: false`, `enableTelemetryExporters: false`, and
|
|
288
|
+
`enableModuleFederationSSR: false`, to turn preset features off.
|
|
289
|
+
|
|
290
|
+
Composition follows the Modern.js config merge rules:
|
|
291
|
+
|
|
292
|
+
- Nested records merge, so changing one nested field keeps its preset
|
|
293
|
+
siblings.
|
|
294
|
+
- Scalars and `false` supplied by the app override preset values. Omitting a
|
|
295
|
+
field, or leaving it `undefined`, keeps the preset value.
|
|
296
|
+
- Arrays and config hooks compose in preset-first order. Non-function array
|
|
297
|
+
entries are deduplicated by deep equality, while function entries are all
|
|
298
|
+
retained. An empty array or empty record does not clear values already
|
|
299
|
+
supplied by the preset.
|
|
300
|
+
|
|
301
|
+
There is no generic reset sentinel. Use a typed preset option for preset-owned
|
|
302
|
+
behavior and a normal app config override for app-owned behavior.
|
|
303
|
+
|
|
304
|
+
`createPresetUltramodernConfig(options)` is an advanced API for inspecting or
|
|
305
|
+
materializing a fresh preset config. Do not spread its result into another
|
|
306
|
+
config object. Object spread is shallow, so replacing `server`, `output`, or
|
|
307
|
+
another nested record can silently discard preset siblings. Use
|
|
308
|
+
`presetUltramodern(...)` for authoring `modern.config.ts`.
|
|
309
|
+
|
|
310
|
+
### Bare preset and generated workspace policy
|
|
311
|
+
|
|
312
|
+
The preset and the workspace generator own different parts of the config:
|
|
313
|
+
|
|
314
|
+
| Source | Identity | Remaining config |
|
|
315
|
+
| --------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- |
|
|
316
|
+
| Bare `createPresetUltramodernConfig()` result | Uses `appId: 'app'` and has no `deliveryUnit` | Uses the preset defaults. Telemetry stays enabled, but no exporter is configured until its endpoint is set. |
|
|
317
|
+
| Generated app | Supplies the app-specific `appId` and stamped `deliveryUnit` | Inherits the other strict defaults from `presetUltramodern(...)`. |
|
|
318
|
+
| Application | Supplies the first `appConfig` argument | Overrides app-owned fields through the normal Modern.js merge. |
|
|
319
|
+
|
|
320
|
+
Keep the generated `appId` and `deliveryUnit` options intact. To change
|
|
321
|
+
preset-owned behavior, use typed options such as
|
|
322
|
+
`enableTelemetryExporters: false`,
|
|
323
|
+
`enableTelemetry: false`, `enableBffRequestId: false`, or
|
|
324
|
+
`enableModuleFederationSSR: false`. To change an app-owned field, put the
|
|
325
|
+
override in the first argument, as in the example above.
|
|
326
|
+
|
|
327
|
+
Telemetry exporter endpoints are unset by default:
|
|
328
|
+
|
|
329
|
+
- `MODERN_TELEMETRY_OTLP_ENDPOINT` enables only the OTLP exporter.
|
|
330
|
+
- `MODERN_TELEMETRY_VICTORIA_ENDPOINT` enables only the VictoriaMetrics
|
|
331
|
+
exporter.
|
|
332
|
+
- Setting both enables both. Leaving both unset keeps the telemetry pipeline
|
|
333
|
+
enabled without configuring an exporter.
|
|
334
|
+
|
|
335
|
+
The typed `otlpEndpoint` and `victoriaMetricsEndpoint` preset options provide
|
|
336
|
+
the same per-exporter behavior without environment variables.
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
MODERN_TELEMETRY_OTLP_ENDPOINT=https://otel.example.com/v1/logs \
|
|
340
|
+
mise exec -- pnpm dev
|
|
341
|
+
```
|
|
342
|
+
|
|
246
343
|
## Human Workflow
|
|
247
344
|
|
|
248
345
|
The public BleedingDev create package has one supported generated product. The
|
|
@@ -252,7 +349,7 @@ BFF, Module Federation topology, generated quality gates, and Cloudflare deploy
|
|
|
252
349
|
basics:
|
|
253
350
|
|
|
254
351
|
```bash
|
|
255
|
-
pnpm dlx @bleedingdev/modern-js-create myapp
|
|
352
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create myapp
|
|
256
353
|
cd myapp
|
|
257
354
|
mise install
|
|
258
355
|
mise exec -- pnpm install
|
|
@@ -264,10 +361,10 @@ generate a demo domain by default. Add real business MicroVerticals when they
|
|
|
264
361
|
become real ownership boundaries:
|
|
265
362
|
|
|
266
363
|
```bash
|
|
267
|
-
pnpm dlx @bleedingdev/modern-js-create transportation --vertical
|
|
268
|
-
pnpm dlx @bleedingdev/modern-js-create food-delivery --vertical
|
|
269
|
-
pnpm dlx @bleedingdev/modern-js-create payments --vertical
|
|
270
|
-
pnpm dlx @bleedingdev/modern-js-create maps --vertical
|
|
364
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create transportation --vertical
|
|
365
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create food-delivery --vertical
|
|
366
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create payments --vertical
|
|
367
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create maps --vertical
|
|
271
368
|
mise exec -- pnpm check
|
|
272
369
|
```
|
|
273
370
|
|
|
@@ -283,10 +380,10 @@ Automation can use explicit MicroVertical syntax instead of relying on the
|
|
|
283
380
|
positional form:
|
|
284
381
|
|
|
285
382
|
```bash
|
|
286
|
-
pnpm dlx @bleedingdev/modern-js-create --vertical=transportation
|
|
287
|
-
pnpm dlx @bleedingdev/modern-js-create --vertical-name transportation
|
|
288
|
-
pnpm dlx @bleedingdev/modern-js-create transportation --vertical --dry-run
|
|
289
|
-
pnpm dlx @bleedingdev/modern-js-create transportation --vertical \
|
|
383
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create --vertical=transportation
|
|
384
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create --vertical-name transportation
|
|
385
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create transportation --vertical --dry-run
|
|
386
|
+
pnpm dlx @bleedingdev/modern-js-ultramodern-create transportation --vertical \
|
|
290
387
|
--codesmith-overlay ./generators/vertical-overlay
|
|
291
388
|
```
|
|
292
389
|
|
|
@@ -305,7 +402,7 @@ import {
|
|
|
305
402
|
addUltramodernVertical,
|
|
306
403
|
generateUltramodernWorkspace,
|
|
307
404
|
planUltramodernVertical,
|
|
308
|
-
} from '@modern-js/create/ultramodern-workspace';
|
|
405
|
+
} from '@modern-js/ultramodern-create/ultramodern-workspace';
|
|
309
406
|
|
|
310
407
|
const workspace = generateUltramodernWorkspace({
|
|
311
408
|
targetDir: '/tmp/my-workspace',
|
|
@@ -337,7 +434,7 @@ returns the same shape plus `dryRun`, `selectedPort`, `moduleFederationRemote`,
|
|
|
337
434
|
CodeSmith consumers can use the adapter subpath:
|
|
338
435
|
|
|
339
436
|
```ts
|
|
340
|
-
import ultramodernCodeSmith from '@modern-js/create/ultramodern-workspace/codesmith';
|
|
437
|
+
import ultramodernCodeSmith from '@modern-js/ultramodern-create/ultramodern-workspace/codesmith';
|
|
341
438
|
|
|
342
439
|
await ultramodernCodeSmith({
|
|
343
440
|
config: {
|
|
@@ -421,18 +518,6 @@ BleedingDev packages are published through GitHub Actions trusted publishing.
|
|
|
421
518
|
The public workflow is tokenless; do not publish packages manually from a
|
|
422
519
|
developer machine.
|
|
423
520
|
|
|
424
|
-
## Baseline Switches (Opt-out)
|
|
425
|
-
|
|
426
|
-
The generated `presetUltramodern(...)` starter enables strict platform contracts. Use these env switches to opt out per app or per environment:
|
|
427
|
-
|
|
428
|
-
- `MODERN_BASELINE_ENABLE_MF_SSR` (default: `true`): Enables app-level MF SSR baseline contract (`server.ssr.mode: 'stream'` + `moduleFederationAppSSR`). Disable when the app does not use app-level MF SSR, or when you need plain SSR/CSR behavior first.
|
|
429
|
-
- `MODERN_BASELINE_ENABLE_BFF_REQUEST_ID` (default: `true`): Enables default BFF producer identity contract (`bff.requestId`). Disable when the app does not need cross-project producer isolation.
|
|
430
|
-
- `MODERN_BASELINE_ENABLE_TELEMETRY_EXPORTERS` (default: `true`): Enables telemetry exporters in baseline config. Disable when the environment has no telemetry backend yet.
|
|
431
|
-
- `MODERN_BASELINE_APP_ID` (default: `basename(process.cwd())`): Overrides baseline `bff.requestId` identity. Set this when you need a fixed platform-wide producer ID convention.
|
|
432
|
-
- `MODERN_TELEMETRY_OTLP_ENDPOINT` (default: `http://127.0.0.1:4318/v1/logs`): OTLP exporter endpoint. Override when you route telemetry through a different collector endpoint.
|
|
433
|
-
- `MODERN_TELEMETRY_VICTORIA_ENDPOINT` (default: `http://127.0.0.1:8428/api/v1/import/prometheus`): VictoriaMetrics exporter endpoint. Override when you use a different VM ingress endpoint.
|
|
434
|
-
- `MODERN_TELEMETRY_FAIL_LOUD_STARTUP` (default: `true`): Fails startup if configured exporters fail startup health checks. Disable in local/dev environments where temporary telemetry outage should not block boot.
|
|
435
|
-
|
|
436
521
|
## Related Docs
|
|
437
522
|
|
|
438
523
|
- [BFF Runtime Frameworks](/guides/advanced-features/bff/frameworks.md)
|
|
@@ -31,5 +31,5 @@ pnpm run command --options
|
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
:::tip
|
|
34
|
-
|
|
34
|
+
UltraModern.js requires Node.js >= 26.7.0 and pnpm >= 11. Use the repository's pinned mise toolchain so the CLI and native TypeScript runtime stay aligned.
|
|
35
35
|
:::
|
package/docs/llms.txt
CHANGED
|
@@ -274,12 +274,12 @@
|
|
|
274
274
|
|
|
275
275
|
## Examples
|
|
276
276
|
|
|
277
|
-
- [Route Authorization](/tutorials/examples/csr-auth.md):
|
|
277
|
+
- [Route Authorization](/tutorials/examples/csr-auth.md): UltraModern.js uses convention-based routing backed by TanStack Router. For more details, please refer to Routing. In a web application, if there are multiple routes, we may need to authorize access to some of them before accessing them. For example, in the following scenario: Access to the / route does not require authorization and can be accessed directly.Access to the /protected route requires authorization. If there is no authorization, it will automatically redirect to the /login route. After successful login, it returns to /protected. <Sandpack template="web-app" files={{ ...ultramodernSandpackFiles, '/src/routes/page.tsx': srcRoutesPageText, '/src/routes/layout.tsx': srcRoutesLayoutText, '/src/routes/Auth.tsx': srcRoutesAuthText, '/src/routes/fakeAuth.ts': srcRoutesFakeAuthText, '/src/routes/protected/page.tsx': srcRoutesProtectedPageText, '/src/routes/login/page.tsx': srcRoutesLoginPageText, }}>
|
|
278
278
|
- [Introduction](/tutorials/foundations/introduction.md): Welcome to Modern.js Example Library! Here you'll find practical code examples to help you get started with Modern.js quickly. If you're new to Modern.js, we recommend reading the Modern.js Introduction first.
|
|
279
279
|
|
|
280
280
|
## Community
|
|
281
281
|
|
|
282
|
-
- [
|
|
282
|
+
- [Ecosystem](/community/showcase.md): UltraModern.js builds on a focused ecosystem of frameworks and tools. These projects provide the Effect, TanStack Router, build, documentation, and Module Federation foundations used by the fork.
|
|
283
283
|
- [Meet the Team](/community/team.md): The development of Modern.js is driven by ByteDance's Modern.js team and community contributors.
|
|
284
284
|
- [Releases](/community/releases.md)
|
|
285
285
|
- [Contributing Guide](/community/contributing-guide.md): Thanks for that you are interested in contributing to Modern.js. Before starting your contribution, please take a moment to read the following guidelines.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Route Authorization
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
UltraModern.js uses convention-based routing backed by TanStack Router. For more details, please refer to [Routing](/guides/basic-features/routes/routes.md#routing).
|
|
4
4
|
|
|
5
5
|
In a web application, if there are multiple routes, we may need to authorize access to some of them before accessing them. For example, in the following scenario:
|
|
6
6
|
|
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.3-ultramodern.2",
|
|
21
21
|
"types": "./dist/types/index.d.ts",
|
|
22
22
|
"main": "./dist/cjs/index.js",
|
|
23
23
|
"exports": {
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
}
|
|
76
76
|
},
|
|
77
77
|
"engines": {
|
|
78
|
-
"node": ">=
|
|
78
|
+
"node": ">=26.7.0"
|
|
79
79
|
},
|
|
80
80
|
"typesVersions": {
|
|
81
81
|
"*": {
|
|
@@ -134,17 +134,19 @@
|
|
|
134
134
|
"@babel/traverse": "^8.0.0",
|
|
135
135
|
"@babel/types": "^8.0.0",
|
|
136
136
|
"@loadable/component": "5.16.7",
|
|
137
|
-
"@modern-js/
|
|
138
|
-
"@modern-js/
|
|
139
|
-
"@modern-js/
|
|
140
|
-
"@modern-js/plugin
|
|
141
|
-
"@modern-js/
|
|
142
|
-
"@modern-js/server": "npm:@bleedingdev/modern-js-server@3.8.
|
|
143
|
-
"@modern-js/server
|
|
144
|
-
"@modern-js/server-
|
|
145
|
-
"@modern-js/
|
|
146
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.8.
|
|
147
|
-
"@
|
|
137
|
+
"@modern-js/app-tools-extensions": "npm:@bleedingdev/modern-js-app-tools-extensions@3.8.3-ultramodern.2",
|
|
138
|
+
"@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.8.3-ultramodern.2",
|
|
139
|
+
"@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.8.3-ultramodern.2",
|
|
140
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.8.3-ultramodern.2",
|
|
141
|
+
"@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.8.3-ultramodern.2",
|
|
142
|
+
"@modern-js/prod-server": "npm:@bleedingdev/modern-js-prod-server@3.8.3-ultramodern.2",
|
|
143
|
+
"@modern-js/server": "npm:@bleedingdev/modern-js-server@3.8.3-ultramodern.2",
|
|
144
|
+
"@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.8.3-ultramodern.2",
|
|
145
|
+
"@modern-js/server-runtime-extensions": "npm:@bleedingdev/modern-js-server-runtime-extensions@3.8.3-ultramodern.2",
|
|
146
|
+
"@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.8.3-ultramodern.2",
|
|
147
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.8.3-ultramodern.2",
|
|
148
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.8.3-ultramodern.2",
|
|
149
|
+
"@rsbuild/core": "2.2.0",
|
|
148
150
|
"@swc/core": "1.15.43",
|
|
149
151
|
"@swc/helpers": "^0.5.23",
|
|
150
152
|
"compression-webpack-plugin": "^12.0.0",
|
|
@@ -163,29 +165,15 @@
|
|
|
163
165
|
"@types/babel__traverse": "7.28.0",
|
|
164
166
|
"@types/node": "^26.2.0",
|
|
165
167
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
166
|
-
"ts-node": "^10.9.2",
|
|
167
|
-
"tsconfig-paths": "^4.2.0",
|
|
168
168
|
"typescript": "^7.0.2"
|
|
169
169
|
},
|
|
170
|
-
"peerDependencies": {
|
|
171
|
-
"ts-node": "^10.9.2",
|
|
172
|
-
"tsconfig-paths": "^4.2.0"
|
|
173
|
-
},
|
|
174
|
-
"peerDependenciesMeta": {
|
|
175
|
-
"ts-node": {
|
|
176
|
-
"optional": true
|
|
177
|
-
},
|
|
178
|
-
"tsconfig-paths": {
|
|
179
|
-
"optional": true
|
|
180
|
-
}
|
|
181
|
-
},
|
|
182
170
|
"sideEffects": false,
|
|
183
171
|
"publishConfig": {
|
|
184
172
|
"access": "public"
|
|
185
173
|
},
|
|
186
174
|
"scripts": {
|
|
187
175
|
"dev": "rslib build --watch",
|
|
188
|
-
"build": "rslib build && pnpm
|
|
176
|
+
"build": "rslib build && pnpm run verify:public-surface && node ./bin/modern-bundle-docs.js",
|
|
189
177
|
"verify:public-surface": "node ./tests/config/verify-public-surface.mjs",
|
|
190
178
|
"test": "rstest"
|
|
191
179
|
}
|
package/rslib.config.mts
CHANGED
|
@@ -14,7 +14,6 @@ export default defineConfig({
|
|
|
14
14
|
source: {
|
|
15
15
|
...libConfig.source,
|
|
16
16
|
entry: {
|
|
17
|
-
// Deploy templates are copy-only; `src/esm` still needs compiled CJS.
|
|
18
17
|
index: APP_TOOLS_CODE_ENTRY_GLOBS,
|
|
19
18
|
},
|
|
20
19
|
},
|
|
@@ -28,6 +27,10 @@ export default defineConfig({
|
|
|
28
27
|
// `.js`, so there the copy is the only thing providing the `.mjs`
|
|
29
28
|
// loaders that `register()` resolves by name; keep it for that alone.
|
|
30
29
|
copy: [
|
|
30
|
+
{
|
|
31
|
+
from: './src/plugins/deploy/platforms/templates',
|
|
32
|
+
to: './plugins/deploy/platforms/templates',
|
|
33
|
+
},
|
|
31
34
|
...(libConfig.format === 'esm'
|
|
32
35
|
? []
|
|
33
36
|
: [
|
|
@@ -36,12 +39,6 @@ export default defineConfig({
|
|
|
36
39
|
to: './esm',
|
|
37
40
|
},
|
|
38
41
|
]),
|
|
39
|
-
{
|
|
40
|
-
from: './src/plugins/deploy/platforms/templates',
|
|
41
|
-
to: './plugins/deploy/platforms/templates',
|
|
42
|
-
// These JavaScript-named assets must bypass Rspack's minimizer.
|
|
43
|
-
info: { minimized: true },
|
|
44
|
-
},
|
|
45
42
|
],
|
|
46
43
|
},
|
|
47
44
|
};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __webpack_require__ = {};
|
|
3
|
-
(()=>{
|
|
4
|
-
__webpack_require__.d = (exports1, getters, values)=>{
|
|
5
|
-
var define = (defs, kind)=>{
|
|
6
|
-
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
[kind]: defs[key]
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
define(getters, "get");
|
|
12
|
-
define(values, "value");
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
|
-
(()=>{
|
|
16
|
-
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
-
})();
|
|
18
|
-
(()=>{
|
|
19
|
-
__webpack_require__.r = (exports1)=>{
|
|
20
|
-
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
|
-
value: 'Module'
|
|
22
|
-
});
|
|
23
|
-
Object.defineProperty(exports1, '__esModule', {
|
|
24
|
-
value: true
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
})();
|
|
28
|
-
var __webpack_exports__ = {};
|
|
29
|
-
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
-
builderPluginAdapterLazyCompilation: ()=>builderPluginAdapterLazyCompilation
|
|
32
|
-
});
|
|
33
|
-
const utils_namespaceObject = require("@modern-js/utils");
|
|
34
|
-
const external_lazyCompilation_js_namespaceObject = require("../lazyCompilation.js");
|
|
35
|
-
const builderPluginAdapterLazyCompilation = (options)=>({
|
|
36
|
-
name: 'builder-plugin-adapter-modern-lazy-compilation',
|
|
37
|
-
setup (api) {
|
|
38
|
-
api.modifyRsbuildConfig((config)=>{
|
|
39
|
-
const lazyCompilation = getRouteEagerLazyCompilation(options, config);
|
|
40
|
-
if (void 0 === lazyCompilation) return config;
|
|
41
|
-
return {
|
|
42
|
-
...config,
|
|
43
|
-
dev: {
|
|
44
|
-
...config.dev,
|
|
45
|
-
lazyCompilation
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
function getRouteEagerLazyCompilation(options, config) {
|
|
52
|
-
const current = config.dev?.lazyCompilation;
|
|
53
|
-
if (!current || (0, utils_namespaceObject.isUseRsc)(options.normalizedConfig)) return;
|
|
54
|
-
const plan = (0, external_lazyCompilation_js_namespaceObject.planRouteEagerLazyCompilation)(current, (0, external_lazyCompilation_js_namespaceObject.aggregateEagerRouteComponentFiles)(options.eagerRouteComponentFilesByEntry));
|
|
55
|
-
if (!plan.apply) {
|
|
56
|
-
if (plan.unresolvedByEntry) warnUnresolvedRouteComponents(options.appContext.appDirectory, plan.unresolvedByEntry);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
return plan.lazyCompilation;
|
|
60
|
-
}
|
|
61
|
-
const warnedLazyApps = new Set();
|
|
62
|
-
function warnUnresolvedRouteComponents(appDirectory, unresolvedByEntry) {
|
|
63
|
-
if (warnedLazyApps.has(appDirectory)) return;
|
|
64
|
-
warnedLazyApps.add(appDirectory);
|
|
65
|
-
const detail = Array.from(unresolvedByEntry).map(([entry, components])=>`${entry}: ${components.join(', ')}`).join('; ');
|
|
66
|
-
utils_namespaceObject.logger.warn(`[lazyCompilation] Skipped route-eager optimization because some route components could not be resolved to a file (${detail}). Lazy compilation may delay route rendering for these routes.`);
|
|
67
|
-
}
|
|
68
|
-
exports.builderPluginAdapterLazyCompilation = __webpack_exports__.builderPluginAdapterLazyCompilation;
|
|
69
|
-
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
70
|
-
"builderPluginAdapterLazyCompilation"
|
|
71
|
-
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
72
|
-
Object.defineProperty(exports, '__esModule', {
|
|
73
|
-
value: true
|
|
74
|
-
});
|