@bleedingdev/modern-js-create 3.2.0-ultramodern.12 → 3.2.0-ultramodern.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -72
- package/bin/run.js +0 -0
- package/dist/cjs/create-package-root.cjs +63 -0
- package/dist/cjs/index.cjs +528 -0
- package/dist/cjs/locale/en.cjs +93 -0
- package/dist/cjs/locale/index.cjs +50 -0
- package/dist/cjs/locale/zh.cjs +93 -0
- package/dist/cjs/ultramodern-package-source.cjs +135 -0
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +337 -0
- package/dist/cjs/ultramodern-workspace/app-files.cjs +223 -0
- package/dist/cjs/ultramodern-workspace/contracts.cjs +836 -0
- package/dist/cjs/ultramodern-workspace/demo-components.cjs +422 -0
- package/dist/cjs/ultramodern-workspace/descriptors.cjs +222 -0
- package/dist/cjs/ultramodern-workspace/effect-api.cjs +952 -0
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +191 -0
- package/dist/cjs/ultramodern-workspace/index.cjs +48 -0
- package/dist/cjs/ultramodern-workspace/locales.cjs +173 -0
- package/dist/cjs/ultramodern-workspace/module-federation.cjs +487 -0
- package/dist/cjs/ultramodern-workspace/naming.cjs +161 -0
- package/dist/cjs/ultramodern-workspace/package-json.cjs +406 -0
- package/dist/cjs/ultramodern-workspace/package-source.cjs +59 -0
- package/dist/cjs/ultramodern-workspace/policy.cjs +248 -0
- package/dist/cjs/ultramodern-workspace/public-surface.cjs +268 -0
- package/dist/cjs/ultramodern-workspace/routes.cjs +375 -0
- package/dist/cjs/ultramodern-workspace/types.cjs +61 -0
- package/dist/cjs/ultramodern-workspace/versions.cjs +153 -0
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +153 -0
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +175 -0
- package/dist/esm/create-package-root.js +14 -0
- package/dist/esm/index.js +491 -0
- package/dist/esm/locale/en.js +55 -0
- package/dist/esm/locale/index.js +9 -0
- package/dist/esm/locale/zh.js +55 -0
- package/dist/esm/ultramodern-package-source.js +63 -0
- package/dist/esm/ultramodern-workspace/add-vertical.js +252 -0
- package/dist/esm/ultramodern-workspace/app-files.js +149 -0
- package/dist/esm/ultramodern-workspace/contracts.js +741 -0
- package/dist/esm/ultramodern-workspace/demo-components.js +363 -0
- package/dist/esm/ultramodern-workspace/descriptors.js +133 -0
- package/dist/esm/ultramodern-workspace/effect-api.js +854 -0
- package/dist/esm/ultramodern-workspace/fs-io.js +90 -0
- package/dist/esm/ultramodern-workspace/index.js +3 -0
- package/dist/esm/ultramodern-workspace/locales.js +122 -0
- package/dist/esm/ultramodern-workspace/module-federation.js +415 -0
- package/dist/esm/ultramodern-workspace/naming.js +71 -0
- package/dist/esm/ultramodern-workspace/package-json.js +338 -0
- package/dist/esm/ultramodern-workspace/package-source.js +21 -0
- package/dist/esm/ultramodern-workspace/policy.js +183 -0
- package/dist/esm/ultramodern-workspace/public-surface.js +183 -0
- package/dist/esm/ultramodern-workspace/routes.js +280 -0
- package/dist/esm/ultramodern-workspace/types.js +16 -0
- package/dist/esm/ultramodern-workspace/versions.js +34 -0
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +91 -0
- package/dist/esm/ultramodern-workspace/write-workspace.js +121 -0
- package/dist/esm-node/create-package-root.js +15 -0
- package/dist/esm-node/index.js +492 -0
- package/dist/esm-node/locale/en.js +56 -0
- package/dist/esm-node/locale/index.js +10 -0
- package/dist/esm-node/locale/zh.js +56 -0
- package/dist/esm-node/ultramodern-package-source.js +64 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +253 -0
- package/dist/esm-node/ultramodern-workspace/app-files.js +150 -0
- package/dist/esm-node/ultramodern-workspace/contracts.js +742 -0
- package/dist/esm-node/ultramodern-workspace/demo-components.js +364 -0
- package/dist/esm-node/ultramodern-workspace/descriptors.js +134 -0
- package/dist/esm-node/ultramodern-workspace/effect-api.js +855 -0
- package/dist/esm-node/ultramodern-workspace/fs-io.js +91 -0
- package/dist/esm-node/ultramodern-workspace/index.js +4 -0
- package/dist/esm-node/ultramodern-workspace/locales.js +123 -0
- package/dist/esm-node/ultramodern-workspace/module-federation.js +416 -0
- package/dist/esm-node/ultramodern-workspace/naming.js +72 -0
- package/dist/esm-node/ultramodern-workspace/package-json.js +339 -0
- package/dist/esm-node/ultramodern-workspace/package-source.js +22 -0
- package/dist/esm-node/ultramodern-workspace/policy.js +184 -0
- package/dist/esm-node/ultramodern-workspace/public-surface.js +184 -0
- package/dist/esm-node/ultramodern-workspace/routes.js +281 -0
- package/dist/esm-node/ultramodern-workspace/types.js +17 -0
- package/dist/esm-node/ultramodern-workspace/versions.js +35 -0
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +92 -0
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +122 -0
- package/dist/types/create-package-root.d.ts +1 -0
- package/dist/types/locale/en.d.ts +8 -9
- package/dist/types/locale/index.d.ts +109 -2
- package/dist/types/locale/zh.d.ts +8 -9
- package/dist/types/ultramodern-package-source.d.ts +28 -0
- package/dist/types/ultramodern-workspace/add-vertical.d.ts +19 -0
- package/dist/types/ultramodern-workspace/app-files.d.ts +14 -0
- package/dist/types/ultramodern-workspace/contracts.d.ts +21 -0
- package/dist/types/ultramodern-workspace/demo-components.d.ts +9 -0
- package/dist/types/ultramodern-workspace/descriptors.d.ts +39 -0
- package/dist/types/ultramodern-workspace/effect-api.d.ts +73 -0
- package/dist/types/ultramodern-workspace/fs-io.d.ts +18 -0
- package/dist/types/ultramodern-workspace/index.d.ts +4 -0
- package/dist/types/ultramodern-workspace/locales.d.ts +183 -0
- package/dist/types/ultramodern-workspace/module-federation.d.ts +16 -0
- package/dist/types/ultramodern-workspace/naming.d.ts +16 -0
- package/dist/types/ultramodern-workspace/package-json.d.ts +12 -0
- package/dist/types/ultramodern-workspace/package-source.d.ts +2 -0
- package/dist/types/ultramodern-workspace/policy.d.ts +60 -0
- package/dist/types/ultramodern-workspace/public-surface.d.ts +37 -0
- package/dist/types/ultramodern-workspace/routes.d.ts +25 -0
- package/dist/types/ultramodern-workspace/types.d.ts +95 -0
- package/dist/types/ultramodern-workspace/versions.d.ts +38 -0
- package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +10 -0
- package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -0
- package/package.json +34 -15
- package/template-workspace/.agents/agent-reference-repos.json +24 -0
- package/template-workspace/.agents/skills-lock.json +19 -0
- package/template-workspace/.codex/hooks.json +16 -0
- package/template-workspace/.github/renovate.json +29 -0
- package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +67 -0
- package/template-workspace/.gitignore.handlebars +5 -0
- package/template-workspace/.mise.toml.handlebars +3 -0
- package/template-workspace/AGENTS.md.handlebars +87 -0
- package/template-workspace/README.md.handlebars +132 -11
- package/template-workspace/lefthook.yml +24 -0
- package/template-workspace/oxfmt.config.ts +1 -0
- package/template-workspace/oxlint.config.ts +1 -0
- package/template-workspace/pnpm-workspace.yaml.handlebars +40 -0
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +184 -21
- package/template-workspace/scripts/setup-agent-reference-repos.mjs +370 -0
- package/templates/app/shell-frame.tsx +49 -0
- package/templates/app/ultramodern-route-head.tsx.handlebars +142 -0
- package/templates/packages/shared-contracts-index.ts +466 -0
- package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +69 -0
- package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mjs +9 -0
- package/templates/workspace-scripts/generate-public-surface-assets.mjs +529 -0
- package/templates/workspace-scripts/proof-cloudflare-version.mjs +125 -0
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +851 -0
- package/templates/workspace-scripts/ultramodern-performance-readiness.config.mjs +7 -0
- package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +223 -0
- package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +593 -0
- package/dist/index.js +0 -2626
- package/dist/types/ultramodern-workspace.d.ts +0 -20
- package/template/.agents/skills-lock.json +0 -34
- package/template/.browserslistrc +0 -4
- package/template/.github/workflows/ultramodern-gates.yml.handlebars +0 -30
- package/template/.gitignore.handlebars +0 -30
- package/template/.nvmrc +0 -2
- package/template/AGENTS.md +0 -25
- package/template/README.md +0 -79
- package/template/api/effect/index.ts.handlebars +0 -23
- package/template/api/lambda/hello.ts.handlebars +0 -6
- package/template/config/public/locales/cs/translation.json +0 -39
- package/template/config/public/locales/en/translation.json +0 -39
- package/template/modern.config.ts.handlebars +0 -53
- package/template/oxfmt.config.ts +0 -8
- package/template/oxlint.config.ts +0 -12
- package/template/package.json.handlebars +0 -67
- package/template/postcss.config.mjs.handlebars +0 -6
- package/template/scripts/bootstrap-agent-skills.mjs +0 -95
- package/template/scripts/check-i18n-strings.mjs +0 -83
- package/template/scripts/validate-ultramodern.mjs.handlebars +0 -178
- package/template/shared/effect/api.ts.handlebars +0 -17
- package/template/src/modern-app-env.d.ts +0 -1
- package/template/src/modern.runtime.ts.handlebars +0 -23
- package/template/src/routes/index.css.handlebars +0 -129
- package/template/src/routes/layout.tsx.handlebars +0 -9
- package/template/src/routes/page.tsx.handlebars +0 -155
- package/template/tailwind.config.ts.handlebars +0 -10
- package/template/tsconfig.json +0 -120
- package/template-workspace/AGENTS.md +0 -50
- package/template-workspace/pnpm-workspace.yaml +0 -17
- package/template-workspace/scripts/check-i18n-strings.mjs +0 -83
- package/template-workspace/scripts/validate-ultramodern-workspace.mjs.handlebars +0 -433
package/README.md
CHANGED
|
@@ -8,117 +8,212 @@
|
|
|
8
8
|
A Progressive React Framework for modern web development.
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## UltraModern.js Create
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
For UltraModern.js, use the BleedingDev create package. It defaults to the
|
|
16
|
-
canonical SuperApp workspace and published BleedingDev package aliases:
|
|
13
|
+
The BleedingDev create package has one supported generated product: an
|
|
14
|
+
UltraModern SuperApp workspace.
|
|
17
15
|
|
|
18
16
|
```bash
|
|
19
|
-
pnpm dlx @bleedingdev/modern-js-create my-
|
|
17
|
+
pnpm dlx @bleedingdev/modern-js-create my-workspace
|
|
20
18
|
```
|
|
21
19
|
|
|
22
|
-
|
|
20
|
+
The supported pnpm command contract is the scoped package specifier above:
|
|
21
|
+
`pnpm dlx @bleedingdev/modern-js-create <target>`. Do not shorten it to
|
|
22
|
+
`pnpm dlx modern-js-create`; there is no unscoped `modern-js-create` npm
|
|
23
|
+
package. Release proof runs this scoped form from a temporary pnpm store/cache
|
|
24
|
+
so it cannot pass because of a local link cache.
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
To initialize the empty directory you are already in, pass `.` explicitly:
|
|
25
27
|
|
|
26
28
|
```bash
|
|
27
|
-
|
|
29
|
+
pnpm dlx @bleedingdev/modern-js-create .
|
|
28
30
|
```
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
The workspace starts shell-only so the first commit has no fake business
|
|
33
|
+
domains to delete. It generates:
|
|
31
34
|
|
|
32
|
-
|
|
35
|
+
- `apps/shell-super-app` as the Module Federation host and topology owner.
|
|
36
|
+
- `verticals/*` empty until a real domain is added with `--vertical`.
|
|
37
|
+
- `packages/shared-*` placeholders for shared contracts, tokens, and Effect
|
|
38
|
+
API support.
|
|
39
|
+
- `.modernjs/ultramodern-generated-contract.json` with Module Federation,
|
|
40
|
+
Effect, i18n, federated CSS, Cloudflare, route publicness, generated
|
|
41
|
+
public-surface, and Zephyr dependency metadata.
|
|
33
42
|
|
|
34
|
-
|
|
35
|
-
npx @modern-js/create my-app --tailwind
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
You can combine both options:
|
|
43
|
+
Validate the generated workspace before making application changes:
|
|
39
44
|
|
|
40
45
|
```bash
|
|
41
|
-
|
|
46
|
+
cd my-workspace
|
|
47
|
+
mise install
|
|
48
|
+
pnpm install
|
|
49
|
+
pnpm check
|
|
50
|
+
pnpm build
|
|
42
51
|
```
|
|
43
52
|
|
|
44
|
-
|
|
53
|
+
The generated toolchain baseline is Node `>=26` with pnpm `11.5.3`.
|
|
54
|
+
`packageManager`, `.mise.toml`, generated validation, and CI should all agree
|
|
55
|
+
on that baseline; do not reintroduce Corepack or older pnpm aliases.
|
|
45
56
|
|
|
46
|
-
|
|
57
|
+
Generated CI does not call the local aggregate. It runs format, lint,
|
|
58
|
+
typecheck, skills, i18n boundary validation, contract validation, and build as
|
|
59
|
+
separate matrix jobs so failures are isolated and parallelizable. Generated
|
|
60
|
+
lefthook config runs separate format and lint-fix commands on pre-commit, then
|
|
61
|
+
runs the read-only primitive gates in parallel on pre-push.
|
|
47
62
|
|
|
48
|
-
|
|
49
|
-
npx @modern-js/create my-app --bff
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
You can explicitly scaffold Effect HttpApi runtime for BFF:
|
|
63
|
+
For local monorepo dependency testing, add `--workspace`:
|
|
53
64
|
|
|
54
65
|
```bash
|
|
55
|
-
|
|
66
|
+
pnpm dlx @bleedingdev/modern-js-create my-workspace --workspace
|
|
56
67
|
```
|
|
57
68
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
npx @modern-js/create my-app --bff-runtime hono
|
|
62
|
-
```
|
|
69
|
+
For package-source validation outside the monorepo, pass explicit
|
|
70
|
+
`--ultramodern-package-*` options.
|
|
63
71
|
|
|
64
|
-
|
|
65
|
-
config wrapper when you want the full Ultramodern setup surface in
|
|
66
|
-
`modern.config.ts`.
|
|
72
|
+
## Vertical Workspace Recipes
|
|
67
73
|
|
|
68
|
-
|
|
74
|
+
Use the workspace add flow from the UltraModern workspace root. It derives the
|
|
75
|
+
package path, package name, port, Module Federation name, topology entry, local
|
|
76
|
+
overlay, ownership entry, Effect BFF surface, and root `dev:*` script from the
|
|
77
|
+
requested vertical name.
|
|
69
78
|
|
|
70
79
|
```bash
|
|
71
|
-
|
|
80
|
+
pnpm dlx @bleedingdev/modern-js-create catalog --vertical
|
|
72
81
|
```
|
|
73
82
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
Use this decision table before adding a vertical:
|
|
84
|
+
|
|
85
|
+
| Need | Keep inside current vertical | Create a new vertical |
|
|
86
|
+
| --- | --- | --- |
|
|
87
|
+
| Route or widget changes with the same product owner, release train, and fallback behavior | Yes | No |
|
|
88
|
+
| Route subtree needs independent rollout, rollback, or incident ownership | No | `--vertical` |
|
|
89
|
+
| UI and Effect BFF must version, deploy, and roll back together | No | `--vertical` |
|
|
90
|
+
| Design tokens, primitives, generated clients, or domain-neutral utilities | Yes | Use an ordinary workspace package, not a vertical |
|
|
91
|
+
| Feature composites or workflow state shared across verticals | No | Revisit ownership; do not hide it in shared code |
|
|
92
|
+
|
|
93
|
+
## SuperApp Architecture Contracts
|
|
94
|
+
|
|
95
|
+
The generated shell owns route assembly and policy. Each vertical added with
|
|
96
|
+
`--vertical` owns its route subtree, Module Federation exposes, Effect BFF
|
|
97
|
+
contract, generated client, `localisedUrls`, locale JSON, CSS layer, and
|
|
98
|
+
Cloudflare Worker output. The shell consumes vertical UI through Module
|
|
99
|
+
Federation manifests and vertical APIs through generated Effect clients
|
|
100
|
+
exported by the vertical packages.
|
|
101
|
+
|
|
102
|
+
Route metadata is route-owned and colocated in
|
|
103
|
+
`src/routes/**/route.meta.ts`. The scaffold regenerates
|
|
104
|
+
`src/routes/ultramodern-route-metadata.ts` as a compatibility manifest for
|
|
105
|
+
Modern.js config, i18n, public head, and public surface contracts; authors
|
|
106
|
+
should not hand-maintain it. Locale JSON is served from
|
|
107
|
+
`/locales/{{lng}}/{{ns}}.json`; Czech and English routes are generated from the
|
|
108
|
+
route owner, not from shell rewrites.
|
|
109
|
+
|
|
110
|
+
Routes default to `privateByDefault: true` and
|
|
111
|
+
`publicnessDefault: private-app-screen`. Public web artifacts are build/deploy
|
|
112
|
+
outputs generated by `scripts/generate-public-surface-assets.mjs` into
|
|
113
|
+
`dist/public` and `.output/public`, not source files under `config/public`.
|
|
114
|
+
Generated public files use only explicit `public && indexable` route metadata,
|
|
115
|
+
so private app screens publish only a disallowing `robots.txt` by default.
|
|
116
|
+
JSON-LD is not inferred from route titles, descriptions, localized paths, app
|
|
117
|
+
names, BFF APIs, or Module Federation metadata. To publish structured data,
|
|
118
|
+
author `jsonLd` explicitly in route metadata for a `public && indexable` route;
|
|
119
|
+
generated apps provide `src/routes/ultramodern-jsonld.ts` helpers for
|
|
120
|
+
`WebPage`, `WebApplication`, `SoftwareApplication`, `BreadcrumbList`,
|
|
121
|
+
`FAQPage`, and `Organization`, while raw JSON-LD remains possible for other
|
|
122
|
+
schema types.
|
|
123
|
+
|
|
124
|
+
Dynamic public routes can expand sitemap entries through route-owned,
|
|
125
|
+
Node-safe ESM providers, normally `route.sitemap.mjs` beside the route
|
|
126
|
+
metadata. The public-surface generator discovers those providers for dynamic
|
|
127
|
+
public routes and still honors explicit `routes.publicSurface.contentSources`
|
|
128
|
+
entries in the generated compatibility manifest. Providers may export
|
|
129
|
+
`entries`, `entries()`, or a default entries/loader returning sitemap entries;
|
|
130
|
+
draft entries and `indexable: false` entries are omitted.
|
|
131
|
+
|
|
132
|
+
CSS federation is explicit:
|
|
133
|
+
|
|
134
|
+
- `packages/shared-design-tokens` exports `./tokens.css` and owns
|
|
135
|
+
`ultramodern-shared-tokens`.
|
|
136
|
+
- The shell owns shell base and overlay CSS only.
|
|
137
|
+
- Verticals own their vertical CSS layer and `[data-app-id="<vertical>"]`
|
|
138
|
+
root marker.
|
|
139
|
+
- Tailwind CSS v4 is configured per app through `@tailwindcss/postcss`.
|
|
140
|
+
- Duplicate base styles are forbidden; SSR first paint depends on shared token
|
|
141
|
+
CSS plus Modern/Rspack-emitted app CSS.
|
|
142
|
+
|
|
143
|
+
## Public URL Environment Variables
|
|
144
|
+
|
|
145
|
+
Generated apps must not bake absolute `http://localhost:<port>` URLs into asset
|
|
146
|
+
configuration. Public URL and asset prefix environment variables have distinct
|
|
147
|
+
roles, and stale aliases should not be carried forward when regenerating or
|
|
148
|
+
updating workspaces.
|
|
149
|
+
|
|
150
|
+
| Variable | Role | Feeds |
|
|
151
|
+
| --- | --- | --- |
|
|
152
|
+
| `MODERN_PUBLIC_SITE_URL` | Canonical site origin for public SEO output only | Canonical, hreflang, sitemap `<loc>`, robots `Sitemap:` |
|
|
153
|
+
| `MODERN_ASSET_PREFIX` | Preferred JS/CSS/static asset prefix | Modern/Rspack-emitted asset URLs |
|
|
154
|
+
| `ULTRAMODERN_ASSET_PREFIX` | UltraModern compatibility asset prefix | Modern/Rspack-emitted asset URLs when `MODERN_ASSET_PREFIX` is unset |
|
|
155
|
+
| `ULTRAMODERN_PUBLIC_URL_<APP_ID>` | Per-app deployment/proof URL | Cloudflare proof inputs and Module Federation remote URLs |
|
|
156
|
+
|
|
157
|
+
Asset URLs use this precedence: `MODERN_ASSET_PREFIX` →
|
|
158
|
+
`ULTRAMODERN_ASSET_PREFIX` → origin-relative `/`. `MODERN_PUBLIC_SITE_URL` is
|
|
159
|
+
canonical/SEO-only and must not be used as an asset-prefix fallback.
|
|
160
|
+
SEO output uses `MODERN_PUBLIC_SITE_URL`; if it is unset, generated local and
|
|
161
|
+
preview outputs remain non-public until deployment proof provides explicit
|
|
162
|
+
public URLs.
|
|
163
|
+
|
|
164
|
+
Without public URLs configured, asset paths are origin-relative (`/`), and the
|
|
165
|
+
dev server uses `dev.assetPrefix: '/'` — so apps work through tunnels and
|
|
166
|
+
reverse proxies (ngrok, cloudflared) without triggering Chrome's Local Network
|
|
167
|
+
Access prompt or mixed-content errors. Shell-only workspaces can set
|
|
168
|
+
`MODERN_PUBLIC_SITE_URL` for SEO output without changing where assets load
|
|
169
|
+
from.
|
|
170
|
+
|
|
171
|
+
## Cloudflare And Zephyr Proof
|
|
172
|
+
|
|
173
|
+
Each generated workspace app has:
|
|
174
|
+
|
|
175
|
+
- `cloudflare:build`, `cloudflare:deploy`, `cloudflare:preview`, and
|
|
176
|
+
`cloudflare:proof` scripts.
|
|
177
|
+
- Cloudflare metadata in `.modernjs/ultramodern-generated-contract.json`.
|
|
178
|
+
- `zephyr:dependencies` for any consumed verticals.
|
|
179
|
+
- `zephyr-rspack-plugin` wired through the generated Modern.js Rspack bridge.
|
|
180
|
+
|
|
181
|
+
Deploy first, then pass each deployed app's generated public URL env key into
|
|
182
|
+
the proof step. The proof script reads the generated contract and checks the
|
|
183
|
+
Cloudflare Worker surface, including public-route sitemap/robots consistency,
|
|
184
|
+
preview noindex behavior, unknown-route status, asset headers, byte budgets,
|
|
185
|
+
and public sourcemap exposure. Shell-only workspaces only need the shell URL;
|
|
186
|
+
added verticals use the same `ULTRAMODERN_PUBLIC_URL_<APP_ID>` pattern with
|
|
187
|
+
hyphens converted to underscores and uppercased:
|
|
79
188
|
|
|
80
189
|
```bash
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
npx @modern-js/create services/legacy-api --bff-runtime hono --workspace --sub
|
|
190
|
+
pnpm cloudflare:deploy
|
|
191
|
+
ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP=https://shell-super-app.example.workers.dev \
|
|
192
|
+
ULTRAMODERN_PUBLIC_URL_TRANSPORTATION=https://transportation.example.workers.dev \
|
|
193
|
+
pnpm cloudflare:proof -- --require-public-urls
|
|
86
194
|
```
|
|
87
195
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
regular workspace packages for tokens, primitives, generated clients, or
|
|
92
|
-
domain-neutral utilities. Keep feature composites and workflow logic owned by a
|
|
93
|
-
shell, remote, or service package.
|
|
94
|
-
|
|
95
|
-
See
|
|
96
|
-
`docs/super-app-rfc-adr/WORKSPACE-0001-micro-vertical-workspace-scaffolding.md`
|
|
97
|
-
for the canonical workspace topology and local orchestration model.
|
|
196
|
+
Without public URLs and credentials, use local primitive gates and `pnpm build`
|
|
197
|
+
evidence only; do not claim live Cloudflare or Zephyr selection has been
|
|
198
|
+
proven.
|
|
98
199
|
|
|
99
|
-
|
|
100
|
-
UltraModern.js entrypoint. The lower-level `--ultramodern-*` flags remain
|
|
101
|
-
available for release engineering and local package-source testing, but users
|
|
102
|
-
should not need them for normal app creation.
|
|
200
|
+
## Troubleshooting
|
|
103
201
|
|
|
104
|
-
|
|
202
|
+
| Symptom | Current check | Owner |
|
|
203
|
+
| --- | --- | --- |
|
|
204
|
+
| Package cohort mismatch | Regenerate with one package source strategy, run `mise install`, then rerun `pnpm install` from the activated shell. | Generated workspace package source metadata |
|
|
205
|
+
| Install failure | Check the active Node/pnpm from `mise install`; rerun `pnpm install` after the shell sees the pinned versions. | Toolchain setup |
|
|
206
|
+
| Build failure | Run the matching primitive gate (`pnpm lint`, `pnpm typecheck`, `pnpm i18n:boundaries`, `pnpm contract:check`) before `pnpm build`; fix the owning failure first. | Owning package or generated contract |
|
|
207
|
+
| Missing public URL | Set the env key from `.modernjs/ultramodern-generated-contract.json`, for example `ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP`. | Deployment operator |
|
|
208
|
+
| Cloudflare credentials | Confirm Wrangler credentials before `pnpm cloudflare:deploy`; local checks do not prove live Worker access. | Deployment operator |
|
|
209
|
+
| Asset or CSS 404 | Rebuild with `pnpm build` or `pnpm cloudflare:deploy` and inspect emitted Modern/Rspack asset paths instead of hardcoding CSS URLs. | Framework/runtime asset pipeline |
|
|
210
|
+
| Federation manifest failure | Run the shell and vertical build scripts, then check each deployed `/mf-manifest.json` URL used by the shell. | Module Federation owner |
|
|
105
211
|
|
|
106
|
-
|
|
107
|
-
workspace protocol dependencies:
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
npx @modern-js/create my-app --router tanstack --bff-runtime effect --workspace
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Documentation
|
|
212
|
+
## Modern.js Documentation
|
|
114
213
|
|
|
115
214
|
- [English Documentation](https://modernjs.dev/en/)
|
|
116
215
|
- [中文文档](https://modernjs.dev)
|
|
117
216
|
|
|
118
|
-
## Contributing
|
|
119
|
-
|
|
120
|
-
Please read the [Contributing Guide](https://github.com/web-infra-dev/modern.js/blob/main/CONTRIBUTING.md).
|
|
121
|
-
|
|
122
217
|
## License
|
|
123
218
|
|
|
124
219
|
Modern.js is [MIT licensed](https://github.com/web-infra-dev/modern.js/blob/main/LICENSE).
|
package/bin/run.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.n = (module)=>{
|
|
5
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
6
|
+
__webpack_require__.d(getter, {
|
|
7
|
+
a: getter
|
|
8
|
+
});
|
|
9
|
+
return getter;
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
(()=>{
|
|
13
|
+
__webpack_require__.d = (exports1, getters, values)=>{
|
|
14
|
+
var define = (defs, kind)=>{
|
|
15
|
+
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
[kind]: defs[key]
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
define(getters, "get");
|
|
21
|
+
define(values, "value");
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
(()=>{
|
|
25
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
26
|
+
})();
|
|
27
|
+
(()=>{
|
|
28
|
+
__webpack_require__.r = (exports1)=>{
|
|
29
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
30
|
+
value: 'Module'
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
33
|
+
value: true
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
var __webpack_exports__ = {};
|
|
38
|
+
__webpack_require__.r(__webpack_exports__);
|
|
39
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
40
|
+
resolveCreatePackageRoot: ()=>resolveCreatePackageRoot
|
|
41
|
+
});
|
|
42
|
+
const external_node_fs_namespaceObject = require("node:fs");
|
|
43
|
+
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
44
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
45
|
+
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
46
|
+
const MAX_WALK_UP_LEVELS = 5;
|
|
47
|
+
function resolveCreatePackageRoot(fromDir) {
|
|
48
|
+
let candidate = fromDir;
|
|
49
|
+
for(let level = 0; level <= MAX_WALK_UP_LEVELS; level++){
|
|
50
|
+
if (external_node_fs_default().existsSync(external_node_path_default().join(candidate, 'package.json')) && external_node_fs_default().existsSync(external_node_path_default().join(candidate, 'template-workspace'))) return candidate;
|
|
51
|
+
const parent = external_node_path_default().dirname(candidate);
|
|
52
|
+
if (parent === candidate) break;
|
|
53
|
+
candidate = parent;
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`Unable to resolve the @modern-js/create package root (a directory containing both package.json and template-workspace/) within ${MAX_WALK_UP_LEVELS} levels above ${fromDir}`);
|
|
56
|
+
}
|
|
57
|
+
exports.resolveCreatePackageRoot = __webpack_exports__.resolveCreatePackageRoot;
|
|
58
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
59
|
+
"resolveCreatePackageRoot"
|
|
60
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
61
|
+
Object.defineProperty(exports, '__esModule', {
|
|
62
|
+
value: true
|
|
63
|
+
});
|