@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
|
@@ -10,8 +10,7 @@ import { VerticalShowcase } from '../vertical-components';
|
|
|
10
10
|
import { ultramodernUiMarker } from '../../ultramodern-build';
|
|
11
11
|
|
|
12
12
|
export default function ShellHome() {
|
|
13
|
-
const {
|
|
14
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
13
|
+
const { t } = useModernI18n();
|
|
15
14
|
|
|
16
15
|
return (
|
|
17
16
|
<ShellFrame>
|
|
@@ -84,13 +83,14 @@ const loadRemoteComponent = (specifier: string) =>
|
|
|
84
83
|
|
|
85
84
|
const createRemoteFallback = (specifier: string) =>
|
|
86
85
|
({ error }: { error: Error }) => {
|
|
87
|
-
const {
|
|
88
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
86
|
+
const { t } = useModernI18n();
|
|
89
87
|
const classification = classifyModuleFederationFallback(error);
|
|
88
|
+
const telemetryEntry =
|
|
89
|
+
typeof window === 'undefined' ? undefined : window.location.href;
|
|
90
90
|
const telemetry = createModuleFederationFallbackTelemetry({
|
|
91
91
|
appName: '${shellApp.id}',
|
|
92
92
|
classification,
|
|
93
|
-
|
|
93
|
+
...(telemetryEntry === undefined ? {} : { entry: telemetryEntry }),
|
|
94
94
|
error,
|
|
95
95
|
eventName: 'mf.client.remote.fallback',
|
|
96
96
|
exportName: 'default',
|
|
@@ -103,7 +103,7 @@ const createRemoteFallback = (specifier: string) =>
|
|
|
103
103
|
void emitModuleFederationFallbackTelemetry({
|
|
104
104
|
appName: telemetry.appName,
|
|
105
105
|
classification,
|
|
106
|
-
entry: telemetry.entry,
|
|
106
|
+
...(telemetry.entry === undefined ? {} : { entry: telemetry.entry }),
|
|
107
107
|
error,
|
|
108
108
|
eventName: telemetry.eventName,
|
|
109
109
|
exportName: 'default',
|
|
@@ -112,7 +112,7 @@ const createRemoteFallback = (specifier: string) =>
|
|
|
112
112
|
remote: specifier,
|
|
113
113
|
status: 'degraded',
|
|
114
114
|
});
|
|
115
|
-
}, [classification, error,
|
|
115
|
+
}, [classification, error, telemetry]);
|
|
116
116
|
|
|
117
117
|
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>;
|
|
118
118
|
};
|
|
@@ -167,8 +167,7 @@ const createHydratedRemote =
|
|
|
167
167
|
${hydratedExports}
|
|
168
168
|
|
|
169
169
|
export const Header = () => {
|
|
170
|
-
const {
|
|
171
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
170
|
+
const { t } = useModernI18n();
|
|
172
171
|
|
|
173
172
|
return (
|
|
174
173
|
<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">
|
|
@@ -178,8 +177,7 @@ const createHydratedRemote =
|
|
|
178
177
|
};
|
|
179
178
|
|
|
180
179
|
export const StatusBadge = () => {
|
|
181
|
-
const {
|
|
182
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
180
|
+
const { t } = useModernI18n();
|
|
183
181
|
|
|
184
182
|
return (
|
|
185
183
|
<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')}">
|
|
@@ -189,8 +187,7 @@ export const StatusBadge = () => {
|
|
|
189
187
|
};
|
|
190
188
|
|
|
191
189
|
export const VerticalShowcase = () => {
|
|
192
|
-
const {
|
|
193
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
190
|
+
const { t } = useModernI18n();
|
|
194
191
|
|
|
195
192
|
if (widgetCount === 0) {
|
|
196
193
|
return (
|
|
@@ -212,36 +209,36 @@ ${showcaseItems}
|
|
|
212
209
|
}
|
|
213
210
|
function createRemotePage(app) {
|
|
214
211
|
const tw = createTw(tailwindPrefixForApp(app));
|
|
215
|
-
const
|
|
216
|
-
const
|
|
212
|
+
const listApiItems = `list${toPascalCase(effectApiStem(app))}`;
|
|
213
|
+
const apiImport = appHasEffectApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
217
214
|
import { Link } from '@modern-js/plugin-tanstack/runtime';
|
|
218
215
|
import { useEffect, useState } from 'react';
|
|
219
216
|
import {
|
|
220
217
|
Effect,
|
|
221
|
-
${
|
|
218
|
+
${listApiItems},
|
|
222
219
|
runEffectRequest,
|
|
223
|
-
} from '../../
|
|
220
|
+
} from '../../api/${effectApiStem(app)}-client';
|
|
224
221
|
import { UltramodernRouteHead } from '../ultramodern-route-head';
|
|
225
222
|
import { ultramodernUiMarker } from '../../ultramodern-build';
|
|
226
223
|
` : "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";
|
|
227
|
-
const
|
|
224
|
+
const apiState = appHasEffectApi(app) ? ` const [apiStatus, setApiStatus] = useState('pending');
|
|
228
225
|
|
|
229
226
|
useEffect(() => {
|
|
230
227
|
let cancelled = false;
|
|
231
228
|
void runEffectRequest(
|
|
232
|
-
${
|
|
229
|
+
${listApiItems}({ limit: 1 }).pipe(
|
|
233
230
|
Effect.match({
|
|
234
231
|
onFailure: () => {
|
|
235
232
|
if (cancelled) {
|
|
236
233
|
return;
|
|
237
234
|
}
|
|
238
|
-
|
|
235
|
+
setApiStatus('unavailable');
|
|
239
236
|
},
|
|
240
237
|
onSuccess: data => {
|
|
241
238
|
if (cancelled) {
|
|
242
239
|
return;
|
|
243
240
|
}
|
|
244
|
-
|
|
241
|
+
setApiStatus(data.items.at(0)?.title ?? 'empty');
|
|
245
242
|
},
|
|
246
243
|
}),
|
|
247
244
|
),
|
|
@@ -253,13 +250,12 @@ import { ultramodernUiMarker } from '../../ultramodern-build';
|
|
|
253
250
|
}, []);
|
|
254
251
|
|
|
255
252
|
` : '';
|
|
256
|
-
const
|
|
253
|
+
const apiMarkup = appHasEffectApi(app) ? ` <p data-testid="api-status">{apiStatus}</p>
|
|
257
254
|
` : '';
|
|
258
|
-
return `${
|
|
255
|
+
return `${apiImport}
|
|
259
256
|
export default function ${toPascalCase(app.id)}Home() {
|
|
260
|
-
const {
|
|
261
|
-
|
|
262
|
-
${effectBffState} return (
|
|
257
|
+
const { language, supportedLanguages, t } = useModernI18n();
|
|
258
|
+
${apiState} return (
|
|
263
259
|
<main className="${tw('min-h-screen bg-um-canvas px-4 py-6 text-um-foreground sm:px-8')}">
|
|
264
260
|
<UltramodernRouteHead />
|
|
265
261
|
<nav aria-label={t('${app.domain}.language.switcher')} className="${tw('flex gap-3')}">
|
|
@@ -280,7 +276,7 @@ ${effectBffState} return (
|
|
|
280
276
|
<p className="${tw('sr-only')}" data-build-marker={ultramodernUiMarker.build} data-testid="ultramodern-ui-marker">
|
|
281
277
|
{ultramodernUiMarker.appId}:{ultramodernUiMarker.version}
|
|
282
278
|
</p>
|
|
283
|
-
${
|
|
279
|
+
${apiMarkup} </main>
|
|
284
280
|
);
|
|
285
281
|
}
|
|
286
282
|
`;
|
|
@@ -304,8 +300,7 @@ function createRemoteEntry(app) {
|
|
|
304
300
|
return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
305
301
|
|
|
306
302
|
export default function ${toPascalCase(domain)}Route() {
|
|
307
|
-
const {
|
|
308
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
303
|
+
const { t } = useModernI18n();
|
|
309
304
|
|
|
310
305
|
return (
|
|
311
306
|
<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">
|
|
@@ -323,8 +318,7 @@ function createRemoteWidget(app) {
|
|
|
323
318
|
return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
324
319
|
|
|
325
320
|
export default function ${componentName}() {
|
|
326
|
-
const {
|
|
327
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
321
|
+
const { t } = useModernI18n();
|
|
328
322
|
|
|
329
323
|
return (
|
|
330
324
|
<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">
|
|
@@ -343,8 +337,7 @@ function createRemoteExposeComponent(app, expose) {
|
|
|
343
337
|
return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
344
338
|
|
|
345
339
|
export default function ${componentName}() {
|
|
346
|
-
const {
|
|
347
|
-
const t = i18nInstance['t'].bind(i18nInstance);
|
|
340
|
+
const { t } = useModernI18n();
|
|
348
341
|
|
|
349
342
|
return (
|
|
350
343
|
<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,5 +1,5 @@
|
|
|
1
1
|
import { packageName, toCamelCase, toEnvSegment, toKebabCase, toPascalCase } from "./naming.js";
|
|
2
|
-
const
|
|
2
|
+
const ULTRAMODERN_CONFIG_PATH = '.modernjs/ultramodern.json';
|
|
3
3
|
const shellApp = {
|
|
4
4
|
id: 'shell-super-app',
|
|
5
5
|
directory: 'apps/shell-super-app',
|
|
@@ -130,4 +130,4 @@ function createCloudflarePublicUrlEnv(app) {
|
|
|
130
130
|
function appI18nNamespace(app) {
|
|
131
131
|
return 'shell' === app.kind ? 'shell' : app.domain ?? app.id;
|
|
132
132
|
}
|
|
133
|
-
export {
|
|
133
|
+
export { ULTRAMODERN_CONFIG_PATH, appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, effectApiStem, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalEffectApps, zephyrRemoteDependency };
|