@bleedingdev/modern-js-create 3.4.0-ultramodern.2 → 3.4.0-ultramodern.20
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 +13 -11
- package/dist/cjs/index.cjs +37 -4
- package/dist/cjs/locale/en.cjs +12 -2
- package/dist/cjs/locale/zh.cjs +12 -2
- package/dist/cjs/ultramodern-tooling/commands.cjs +185 -0
- package/dist/cjs/ultramodern-tooling/config.cjs +172 -0
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +79 -61
- package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
- package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
- package/dist/cjs/ultramodern-workspace/contracts.cjs +121 -648
- package/dist/cjs/ultramodern-workspace/demo-components.cjs +26 -33
- package/dist/cjs/ultramodern-workspace/descriptors.cjs +4 -4
- package/dist/cjs/ultramodern-workspace/effect-api.cjs +230 -100
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
- package/dist/cjs/ultramodern-workspace/generation-result.cjs +1 -1
- package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
- package/dist/cjs/ultramodern-workspace/mf-validation.cjs +571 -0
- package/dist/cjs/ultramodern-workspace/module-federation.cjs +51 -20
- package/dist/cjs/ultramodern-workspace/package-json.cjs +62 -19
- package/dist/cjs/ultramodern-workspace/policy.cjs +2 -2
- package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
- package/dist/cjs/ultramodern-workspace/versions.cjs +5 -0
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +80 -43
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +63 -20
- package/dist/esm/index.js +37 -4
- package/dist/esm/locale/en.js +12 -2
- package/dist/esm/locale/zh.js +12 -2
- package/dist/esm/ultramodern-tooling/commands.js +132 -0
- package/dist/esm/ultramodern-tooling/config.js +120 -0
- package/dist/esm/ultramodern-workspace/add-vertical.js +81 -66
- package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
- package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
- package/dist/esm/ultramodern-workspace/contracts.js +124 -603
- package/dist/esm/ultramodern-workspace/demo-components.js +26 -33
- package/dist/esm/ultramodern-workspace/descriptors.js +2 -2
- package/dist/esm/ultramodern-workspace/effect-api.js +230 -100
- package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
- package/dist/esm/ultramodern-workspace/generation-result.js +2 -2
- package/dist/esm/ultramodern-workspace/index.js +1 -0
- package/dist/esm/ultramodern-workspace/mf-validation.js +516 -0
- package/dist/esm/ultramodern-workspace/module-federation.js +49 -21
- package/dist/esm/ultramodern-workspace/package-json.js +60 -20
- package/dist/esm/ultramodern-workspace/policy.js +2 -2
- package/dist/esm/ultramodern-workspace/public-api.js +1 -0
- package/dist/esm/ultramodern-workspace/versions.js +3 -1
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +78 -26
- package/dist/esm/ultramodern-workspace/write-workspace.js +67 -27
- package/dist/esm-node/index.js +37 -4
- package/dist/esm-node/locale/en.js +12 -2
- package/dist/esm-node/locale/zh.js +12 -2
- package/dist/esm-node/ultramodern-tooling/commands.js +133 -0
- package/dist/esm-node/ultramodern-tooling/config.js +121 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +81 -66
- package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
- package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
- package/dist/esm-node/ultramodern-workspace/contracts.js +124 -603
- package/dist/esm-node/ultramodern-workspace/demo-components.js +26 -33
- package/dist/esm-node/ultramodern-workspace/descriptors.js +2 -2
- package/dist/esm-node/ultramodern-workspace/effect-api.js +230 -100
- package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
- package/dist/esm-node/ultramodern-workspace/generation-result.js +2 -2
- package/dist/esm-node/ultramodern-workspace/index.js +1 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation.js +517 -0
- package/dist/esm-node/ultramodern-workspace/module-federation.js +49 -21
- package/dist/esm-node/ultramodern-workspace/package-json.js +60 -20
- package/dist/esm-node/ultramodern-workspace/policy.js +2 -2
- package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
- package/dist/esm-node/ultramodern-workspace/versions.js +3 -1
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +78 -26
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +67 -27
- package/dist/types/locale/en.d.ts +10 -0
- package/dist/types/locale/index.d.ts +20 -0
- package/dist/types/locale/zh.d.ts +10 -0
- package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
- package/dist/types/ultramodern-tooling/config.d.ts +43 -0
- package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
- package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
- package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
- package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
- package/dist/types/ultramodern-workspace/descriptors.d.ts +1 -1
- package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
- package/dist/types/ultramodern-workspace/index.d.ts +2 -0
- package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
- package/dist/types/ultramodern-workspace/module-federation.d.ts +1 -0
- package/dist/types/ultramodern-workspace/package-json.d.ts +5 -3
- package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
- package/dist/types/ultramodern-workspace/types.d.ts +2 -0
- package/dist/types/ultramodern-workspace/versions.d.ts +2 -0
- package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +2 -7
- package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
- package/package.json +5 -3
- package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
- package/template-workspace/.gitignore.handlebars +3 -0
- package/template-workspace/AGENTS.md.handlebars +11 -5
- package/template-workspace/README.md.handlebars +15 -12
- package/template-workspace/oxfmt.config.ts +1 -0
- package/template-workspace/oxlint.config.ts +1 -0
- package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +51 -0
- package/template-workspace/pnpm-workspace.yaml.handlebars +12 -0
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +96 -69
- package/templates/app/shell-frame.tsx +1 -2
- package/templates/app/ultramodern-route-head.tsx.handlebars +5 -6
- package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +59 -7
- package/templates/workspace-scripts/check-ultramodern-api-boundaries.mjs +339 -0
- package/templates/workspace-scripts/generate-public-surface-assets.mjs +245 -8
- package/templates/workspace-scripts/proof-cloudflare-version.mjs +276 -8
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +35 -10
- package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +164 -1
- package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
- package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +949 -63
- /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
- /package/template-workspace/{.agents → .codex}/skills/rstest-best-practices/SKILL.md +0 -0
|
@@ -11,8 +11,7 @@ import { VerticalShowcase } from '../vertical-components';
|
|
|
11
11
|
import { ultramodernUiMarker } from '../../ultramodern-build';
|
|
12
12
|
|
|
13
13
|
export default function ShellHome() {
|
|
14
|
-
const {
|
|
15
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
14
|
+
const { t } = useModernI18n();
|
|
16
15
|
|
|
17
16
|
return (
|
|
18
17
|
<ShellFrame>
|
|
@@ -85,13 +84,14 @@ const loadRemoteComponent = (specifier: string) =>
|
|
|
85
84
|
|
|
86
85
|
const createRemoteFallback = (specifier: string) =>
|
|
87
86
|
({ error }: { error: Error }) => {
|
|
88
|
-
const {
|
|
89
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
87
|
+
const { t } = useModernI18n();
|
|
90
88
|
const classification = classifyModuleFederationFallback(error);
|
|
89
|
+
const telemetryEntry =
|
|
90
|
+
typeof window === 'undefined' ? undefined : window.location.href;
|
|
91
91
|
const telemetry = createModuleFederationFallbackTelemetry({
|
|
92
92
|
appName: '${shellApp.id}',
|
|
93
93
|
classification,
|
|
94
|
-
|
|
94
|
+
...(telemetryEntry === undefined ? {} : { entry: telemetryEntry }),
|
|
95
95
|
error,
|
|
96
96
|
eventName: 'mf.client.remote.fallback',
|
|
97
97
|
exportName: 'default',
|
|
@@ -104,7 +104,7 @@ const createRemoteFallback = (specifier: string) =>
|
|
|
104
104
|
void emitModuleFederationFallbackTelemetry({
|
|
105
105
|
appName: telemetry.appName,
|
|
106
106
|
classification,
|
|
107
|
-
entry: telemetry.entry,
|
|
107
|
+
...(telemetry.entry === undefined ? {} : { entry: telemetry.entry }),
|
|
108
108
|
error,
|
|
109
109
|
eventName: telemetry.eventName,
|
|
110
110
|
exportName: 'default',
|
|
@@ -113,7 +113,7 @@ const createRemoteFallback = (specifier: string) =>
|
|
|
113
113
|
remote: specifier,
|
|
114
114
|
status: 'degraded',
|
|
115
115
|
});
|
|
116
|
-
}, [classification, error,
|
|
116
|
+
}, [classification, error, telemetry]);
|
|
117
117
|
|
|
118
118
|
return <div className="${tw('rounded-xl border border-red-900/20 bg-red-50 px-4 py-3 text-sm font-semibold text-red-900')}" data-remote-error={error.name} {...toModuleFederationFallbackAttributes(telemetry)}>{t('shell.remoteUnavailable')}</div>;
|
|
119
119
|
};
|
|
@@ -168,8 +168,7 @@ const createHydratedRemote =
|
|
|
168
168
|
${hydratedExports}
|
|
169
169
|
|
|
170
170
|
export const Header = () => {
|
|
171
|
-
const {
|
|
172
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
171
|
+
const { t } = useModernI18n();
|
|
173
172
|
|
|
174
173
|
return (
|
|
175
174
|
<header className="${tw('flex min-w-0 flex-wrap items-center gap-x-8 gap-y-2 md:flex-1')}" data-modern-boundary-id="${shellApp.mfName}" data-modern-mf-expose="shell/Header">
|
|
@@ -179,8 +178,7 @@ const createHydratedRemote =
|
|
|
179
178
|
};
|
|
180
179
|
|
|
181
180
|
export const StatusBadge = () => {
|
|
182
|
-
const {
|
|
183
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
181
|
+
const { t } = useModernI18n();
|
|
184
182
|
|
|
185
183
|
return (
|
|
186
184
|
<span className="${tw('inline-flex h-10 shrink-0 items-center justify-center rounded-full border border-stone-900/15 bg-white px-4 text-sm font-extrabold text-stone-950 shadow-lg shadow-stone-900/5')}">
|
|
@@ -190,8 +188,7 @@ export const StatusBadge = () => {
|
|
|
190
188
|
};
|
|
191
189
|
|
|
192
190
|
export const VerticalShowcase = () => {
|
|
193
|
-
const {
|
|
194
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
191
|
+
const { t } = useModernI18n();
|
|
195
192
|
|
|
196
193
|
if (widgetCount === 0) {
|
|
197
194
|
return (
|
|
@@ -213,36 +210,36 @@ ${showcaseItems}
|
|
|
213
210
|
}
|
|
214
211
|
function createRemotePage(app) {
|
|
215
212
|
const tw = createTw(tailwindPrefixForApp(app));
|
|
216
|
-
const
|
|
217
|
-
const
|
|
213
|
+
const listApiItems = `list${toPascalCase(effectApiStem(app))}`;
|
|
214
|
+
const apiImport = appHasEffectApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
218
215
|
import { Link } from '@modern-js/plugin-tanstack/runtime';
|
|
219
216
|
import { useEffect, useState } from 'react';
|
|
220
217
|
import {
|
|
221
218
|
Effect,
|
|
222
|
-
${
|
|
219
|
+
${listApiItems},
|
|
223
220
|
runEffectRequest,
|
|
224
|
-
} from '../../
|
|
221
|
+
} from '../../api/${effectApiStem(app)}-client';
|
|
225
222
|
import { UltramodernRouteHead } from '../ultramodern-route-head';
|
|
226
223
|
import { ultramodernUiMarker } from '../../ultramodern-build';
|
|
227
224
|
` : "import { useModernI18n } from '@modern-js/plugin-i18n/runtime';\nimport { Link } from '@modern-js/plugin-tanstack/runtime';\nimport { UltramodernRouteHead } from '../ultramodern-route-head';\nimport { ultramodernUiMarker } from '../../ultramodern-build';\n";
|
|
228
|
-
const
|
|
225
|
+
const apiState = appHasEffectApi(app) ? ` const [apiStatus, setApiStatus] = useState('pending');
|
|
229
226
|
|
|
230
227
|
useEffect(() => {
|
|
231
228
|
let cancelled = false;
|
|
232
229
|
void runEffectRequest(
|
|
233
|
-
${
|
|
230
|
+
${listApiItems}({ limit: 1 }).pipe(
|
|
234
231
|
Effect.match({
|
|
235
232
|
onFailure: () => {
|
|
236
233
|
if (cancelled) {
|
|
237
234
|
return;
|
|
238
235
|
}
|
|
239
|
-
|
|
236
|
+
setApiStatus('unavailable');
|
|
240
237
|
},
|
|
241
238
|
onSuccess: data => {
|
|
242
239
|
if (cancelled) {
|
|
243
240
|
return;
|
|
244
241
|
}
|
|
245
|
-
|
|
242
|
+
setApiStatus(data.items.at(0)?.title ?? 'empty');
|
|
246
243
|
},
|
|
247
244
|
}),
|
|
248
245
|
),
|
|
@@ -254,13 +251,12 @@ import { ultramodernUiMarker } from '../../ultramodern-build';
|
|
|
254
251
|
}, []);
|
|
255
252
|
|
|
256
253
|
` : '';
|
|
257
|
-
const
|
|
254
|
+
const apiMarkup = appHasEffectApi(app) ? ` <p data-testid="api-status">{apiStatus}</p>
|
|
258
255
|
` : '';
|
|
259
|
-
return `${
|
|
256
|
+
return `${apiImport}
|
|
260
257
|
export default function ${toPascalCase(app.id)}Home() {
|
|
261
|
-
const {
|
|
262
|
-
|
|
263
|
-
${effectBffState} return (
|
|
258
|
+
const { language, supportedLanguages, t } = useModernI18n();
|
|
259
|
+
${apiState} return (
|
|
264
260
|
<main className="${tw('min-h-screen bg-um-canvas px-4 py-6 text-um-foreground sm:px-8')}">
|
|
265
261
|
<UltramodernRouteHead />
|
|
266
262
|
<nav aria-label={t('${app.domain}.language.switcher')} className="${tw('flex gap-3')}">
|
|
@@ -281,7 +277,7 @@ ${effectBffState} return (
|
|
|
281
277
|
<p className="${tw('sr-only')}" data-build-marker={ultramodernUiMarker.build} data-testid="ultramodern-ui-marker">
|
|
282
278
|
{ultramodernUiMarker.appId}:{ultramodernUiMarker.version}
|
|
283
279
|
</p>
|
|
284
|
-
${
|
|
280
|
+
${apiMarkup} </main>
|
|
285
281
|
);
|
|
286
282
|
}
|
|
287
283
|
`;
|
|
@@ -305,8 +301,7 @@ function createRemoteEntry(app) {
|
|
|
305
301
|
return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
306
302
|
|
|
307
303
|
export default function ${toPascalCase(domain)}Route() {
|
|
308
|
-
const {
|
|
309
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
304
|
+
const { t } = useModernI18n();
|
|
310
305
|
|
|
311
306
|
return (
|
|
312
307
|
<section className="${tw('rounded-2xl bg-white/90 p-5 shadow-xl shadow-stone-900/10')}" data-modern-boundary-id="${app.mfName}" data-modern-mf-expose="./Route">
|
|
@@ -324,8 +319,7 @@ function createRemoteWidget(app) {
|
|
|
324
319
|
return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
325
320
|
|
|
326
321
|
export default function ${componentName}() {
|
|
327
|
-
const {
|
|
328
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
322
|
+
const { t } = useModernI18n();
|
|
329
323
|
|
|
330
324
|
return (
|
|
331
325
|
<section className="${tw('rounded-2xl bg-white/90 p-5 shadow-xl shadow-stone-900/10')}" data-modern-boundary-id="${app.mfName}" data-modern-mf-expose="./Widget">
|
|
@@ -344,8 +338,7 @@ function createRemoteExposeComponent(app, expose) {
|
|
|
344
338
|
return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
345
339
|
|
|
346
340
|
export default function ${componentName}() {
|
|
347
|
-
const {
|
|
348
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
341
|
+
const { t } = useModernI18n();
|
|
349
342
|
|
|
350
343
|
return (
|
|
351
344
|
<section className="${tw('rounded-2xl bg-white/90 p-5 shadow-xl shadow-stone-900/10')}" data-modern-boundary-id="${app.mfName}" data-modern-mf-expose="${expose}">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { packageName, toCamelCase, toEnvSegment, toKebabCase, toPascalCase } from "./naming.js";
|
|
3
|
-
const
|
|
3
|
+
const ULTRAMODERN_CONFIG_PATH = '.modernjs/ultramodern.json';
|
|
4
4
|
const shellApp = {
|
|
5
5
|
id: 'shell-super-app',
|
|
6
6
|
directory: 'apps/shell-super-app',
|
|
@@ -131,4 +131,4 @@ function createCloudflarePublicUrlEnv(app) {
|
|
|
131
131
|
function appI18nNamespace(app) {
|
|
132
132
|
return 'shell' === app.kind ? 'shell' : app.domain ?? app.id;
|
|
133
133
|
}
|
|
134
|
-
export {
|
|
134
|
+
export { ULTRAMODERN_CONFIG_PATH, appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, effectApiStem, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalEffectApps, zephyrRemoteDependency };
|