@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.
Files changed (128) hide show
  1. package/README.md +13 -11
  2. package/dist/cjs/index.cjs +37 -4
  3. package/dist/cjs/locale/en.cjs +12 -2
  4. package/dist/cjs/locale/zh.cjs +12 -2
  5. package/dist/cjs/ultramodern-tooling/commands.cjs +185 -0
  6. package/dist/cjs/ultramodern-tooling/config.cjs +172 -0
  7. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +79 -61
  8. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
  9. package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
  10. package/dist/cjs/ultramodern-workspace/contracts.cjs +121 -648
  11. package/dist/cjs/ultramodern-workspace/demo-components.cjs +26 -33
  12. package/dist/cjs/ultramodern-workspace/descriptors.cjs +4 -4
  13. package/dist/cjs/ultramodern-workspace/effect-api.cjs +230 -100
  14. package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
  15. package/dist/cjs/ultramodern-workspace/generation-result.cjs +1 -1
  16. package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
  17. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +571 -0
  18. package/dist/cjs/ultramodern-workspace/module-federation.cjs +51 -20
  19. package/dist/cjs/ultramodern-workspace/package-json.cjs +62 -19
  20. package/dist/cjs/ultramodern-workspace/policy.cjs +2 -2
  21. package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
  22. package/dist/cjs/ultramodern-workspace/versions.cjs +5 -0
  23. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +80 -43
  24. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +63 -20
  25. package/dist/esm/index.js +37 -4
  26. package/dist/esm/locale/en.js +12 -2
  27. package/dist/esm/locale/zh.js +12 -2
  28. package/dist/esm/ultramodern-tooling/commands.js +132 -0
  29. package/dist/esm/ultramodern-tooling/config.js +120 -0
  30. package/dist/esm/ultramodern-workspace/add-vertical.js +81 -66
  31. package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
  32. package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
  33. package/dist/esm/ultramodern-workspace/contracts.js +124 -603
  34. package/dist/esm/ultramodern-workspace/demo-components.js +26 -33
  35. package/dist/esm/ultramodern-workspace/descriptors.js +2 -2
  36. package/dist/esm/ultramodern-workspace/effect-api.js +230 -100
  37. package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
  38. package/dist/esm/ultramodern-workspace/generation-result.js +2 -2
  39. package/dist/esm/ultramodern-workspace/index.js +1 -0
  40. package/dist/esm/ultramodern-workspace/mf-validation.js +516 -0
  41. package/dist/esm/ultramodern-workspace/module-federation.js +49 -21
  42. package/dist/esm/ultramodern-workspace/package-json.js +60 -20
  43. package/dist/esm/ultramodern-workspace/policy.js +2 -2
  44. package/dist/esm/ultramodern-workspace/public-api.js +1 -0
  45. package/dist/esm/ultramodern-workspace/versions.js +3 -1
  46. package/dist/esm/ultramodern-workspace/workspace-scripts.js +78 -26
  47. package/dist/esm/ultramodern-workspace/write-workspace.js +67 -27
  48. package/dist/esm-node/index.js +37 -4
  49. package/dist/esm-node/locale/en.js +12 -2
  50. package/dist/esm-node/locale/zh.js +12 -2
  51. package/dist/esm-node/ultramodern-tooling/commands.js +133 -0
  52. package/dist/esm-node/ultramodern-tooling/config.js +121 -0
  53. package/dist/esm-node/ultramodern-workspace/add-vertical.js +81 -66
  54. package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
  55. package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
  56. package/dist/esm-node/ultramodern-workspace/contracts.js +124 -603
  57. package/dist/esm-node/ultramodern-workspace/demo-components.js +26 -33
  58. package/dist/esm-node/ultramodern-workspace/descriptors.js +2 -2
  59. package/dist/esm-node/ultramodern-workspace/effect-api.js +230 -100
  60. package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
  61. package/dist/esm-node/ultramodern-workspace/generation-result.js +2 -2
  62. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  63. package/dist/esm-node/ultramodern-workspace/mf-validation.js +517 -0
  64. package/dist/esm-node/ultramodern-workspace/module-federation.js +49 -21
  65. package/dist/esm-node/ultramodern-workspace/package-json.js +60 -20
  66. package/dist/esm-node/ultramodern-workspace/policy.js +2 -2
  67. package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
  68. package/dist/esm-node/ultramodern-workspace/versions.js +3 -1
  69. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +78 -26
  70. package/dist/esm-node/ultramodern-workspace/write-workspace.js +67 -27
  71. package/dist/types/locale/en.d.ts +10 -0
  72. package/dist/types/locale/index.d.ts +20 -0
  73. package/dist/types/locale/zh.d.ts +10 -0
  74. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  75. package/dist/types/ultramodern-tooling/config.d.ts +43 -0
  76. package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
  77. package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
  78. package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
  79. package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
  80. package/dist/types/ultramodern-workspace/descriptors.d.ts +1 -1
  81. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
  82. package/dist/types/ultramodern-workspace/index.d.ts +2 -0
  83. package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
  84. package/dist/types/ultramodern-workspace/module-federation.d.ts +1 -0
  85. package/dist/types/ultramodern-workspace/package-json.d.ts +5 -3
  86. package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
  87. package/dist/types/ultramodern-workspace/types.d.ts +2 -0
  88. package/dist/types/ultramodern-workspace/versions.d.ts +2 -0
  89. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +2 -7
  90. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
  91. package/package.json +5 -3
  92. package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
  93. package/template-workspace/.gitignore.handlebars +3 -0
  94. package/template-workspace/AGENTS.md.handlebars +11 -5
  95. package/template-workspace/README.md.handlebars +15 -12
  96. package/template-workspace/oxfmt.config.ts +1 -0
  97. package/template-workspace/oxlint.config.ts +1 -0
  98. package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +51 -0
  99. package/template-workspace/pnpm-workspace.yaml.handlebars +12 -0
  100. package/template-workspace/scripts/bootstrap-agent-skills.mjs +96 -69
  101. package/templates/app/shell-frame.tsx +1 -2
  102. package/templates/app/ultramodern-route-head.tsx.handlebars +5 -6
  103. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +59 -7
  104. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mjs +339 -0
  105. package/templates/workspace-scripts/generate-public-surface-assets.mjs +245 -8
  106. package/templates/workspace-scripts/proof-cloudflare-version.mjs +276 -8
  107. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +35 -10
  108. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +164 -1
  109. package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
  110. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +949 -63
  111. /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
  112. /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
  113. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
  114. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
  115. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
  116. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
  117. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
  118. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
  119. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
  120. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
  121. /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
  122. /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
  123. /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
  124. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
  125. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
  126. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
  127. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
  128. /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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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
- entry: typeof window === 'undefined' ? undefined : window.location.href,
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, specifier, telemetry]);
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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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 listEffectItems = `list${toPascalCase(effectApiStem(app))}`;
217
- const effectBffImport = appHasEffectApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
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
- ${listEffectItems},
219
+ ${listApiItems},
223
220
  runEffectRequest,
224
- } from '../../effect/${effectApiStem(app)}-client';
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 effectBffState = appHasEffectApi(app) ? ` const [effectApiStatus, setEffectApiStatus] = useState('pending');
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
- ${listEffectItems}({ limit: 1 }).pipe(
230
+ ${listApiItems}({ limit: 1 }).pipe(
234
231
  Effect.match({
235
232
  onFailure: () => {
236
233
  if (cancelled) {
237
234
  return;
238
235
  }
239
- setEffectApiStatus('unavailable');
236
+ setApiStatus('unavailable');
240
237
  },
241
238
  onSuccess: data => {
242
239
  if (cancelled) {
243
240
  return;
244
241
  }
245
- setEffectApiStatus(data.items.at(0)?.title ?? 'empty');
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 effectBffMarkup = appHasEffectApi(app) ? ` <p data-testid="effect-bff-status">{effectApiStatus}</p>
254
+ const apiMarkup = appHasEffectApi(app) ? ` <p data-testid="api-status">{apiStatus}</p>
258
255
  ` : '';
259
- return `${effectBffImport}
256
+ return `${apiImport}
260
257
  export default function ${toPascalCase(app.id)}Home() {
261
- const { i18nInstance, language, supportedLanguages } = useModernI18n();
262
- const t = i18nInstance['t'].bind(i18nInstance);
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
- ${effectBffMarkup} </main>
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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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 GENERATED_CONTRACT_PATH = '.modernjs/ultramodern-generated-contract.json';
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 { GENERATED_CONTRACT_PATH, appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, effectApiStem, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalEffectApps, zephyrRemoteDependency };
134
+ export { ULTRAMODERN_CONFIG_PATH, appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, effectApiStem, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalEffectApps, zephyrRemoteDependency };