@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
@@ -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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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
- entry: typeof window === 'undefined' ? undefined : window.location.href,
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, specifier, telemetry]);
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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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 listEffectItems = `list${toPascalCase(effectApiStem(app))}`;
216
- const effectBffImport = appHasEffectApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
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
- ${listEffectItems},
218
+ ${listApiItems},
222
219
  runEffectRequest,
223
- } from '../../effect/${effectApiStem(app)}-client';
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 effectBffState = appHasEffectApi(app) ? ` const [effectApiStatus, setEffectApiStatus] = useState('pending');
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
- ${listEffectItems}({ limit: 1 }).pipe(
229
+ ${listApiItems}({ limit: 1 }).pipe(
233
230
  Effect.match({
234
231
  onFailure: () => {
235
232
  if (cancelled) {
236
233
  return;
237
234
  }
238
- setEffectApiStatus('unavailable');
235
+ setApiStatus('unavailable');
239
236
  },
240
237
  onSuccess: data => {
241
238
  if (cancelled) {
242
239
  return;
243
240
  }
244
- setEffectApiStatus(data.items.at(0)?.title ?? 'empty');
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 effectBffMarkup = appHasEffectApi(app) ? ` <p data-testid="effect-bff-status">{effectApiStatus}</p>
253
+ const apiMarkup = appHasEffectApi(app) ? ` <p data-testid="api-status">{apiStatus}</p>
257
254
  ` : '';
258
- return `${effectBffImport}
255
+ return `${apiImport}
259
256
  export default function ${toPascalCase(app.id)}Home() {
260
- const { i18nInstance, language, supportedLanguages } = useModernI18n();
261
- const t = i18nInstance['t'].bind(i18nInstance);
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
- ${effectBffMarkup} </main>
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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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 { i18nInstance } = useModernI18n();
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 GENERATED_CONTRACT_PATH = '.modernjs/ultramodern-generated-contract.json';
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 { GENERATED_CONTRACT_PATH, appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, effectApiStem, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalEffectApps, zephyrRemoteDependency };
133
+ export { ULTRAMODERN_CONFIG_PATH, appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createNeutralOwnership, createRemoteManifestEnv, createShellHost, createVerticalDescriptor, effectApiPrefix, effectApiStem, remoteDependencyAlias, resolveRemoteRefs, sharedPackages, shellApp, verticalEffectApps, zephyrRemoteDependency };