@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
@@ -49,8 +49,7 @@ import { VerticalShowcase } from '../vertical-components';
49
49
  import { ultramodernUiMarker } from '../../ultramodern-build';
50
50
 
51
51
  export default function ShellHome() {
52
- const { i18nInstance } = useModernI18n();
53
- const t = i18nInstance['t'].bind(i18nInstance);
52
+ const { t } = useModernI18n();
54
53
 
55
54
  return (
56
55
  <ShellFrame>
@@ -123,13 +122,14 @@ const loadRemoteComponent = (specifier: string) =>
123
122
 
124
123
  const createRemoteFallback = (specifier: string) =>
125
124
  ({ error }: { error: Error }) => {
126
- const { i18nInstance } = useModernI18n();
127
- const t = i18nInstance['t'].bind(i18nInstance);
125
+ const { t } = useModernI18n();
128
126
  const classification = classifyModuleFederationFallback(error);
127
+ const telemetryEntry =
128
+ typeof window === 'undefined' ? undefined : window.location.href;
129
129
  const telemetry = createModuleFederationFallbackTelemetry({
130
130
  appName: '${external_descriptors_cjs_namespaceObject.shellApp.id}',
131
131
  classification,
132
- entry: typeof window === 'undefined' ? undefined : window.location.href,
132
+ ...(telemetryEntry === undefined ? {} : { entry: telemetryEntry }),
133
133
  error,
134
134
  eventName: 'mf.client.remote.fallback',
135
135
  exportName: 'default',
@@ -142,7 +142,7 @@ const createRemoteFallback = (specifier: string) =>
142
142
  void emitModuleFederationFallbackTelemetry({
143
143
  appName: telemetry.appName,
144
144
  classification,
145
- entry: telemetry.entry,
145
+ ...(telemetry.entry === undefined ? {} : { entry: telemetry.entry }),
146
146
  error,
147
147
  eventName: telemetry.eventName,
148
148
  exportName: 'default',
@@ -151,7 +151,7 @@ const createRemoteFallback = (specifier: string) =>
151
151
  remote: specifier,
152
152
  status: 'degraded',
153
153
  });
154
- }, [classification, error, specifier, telemetry]);
154
+ }, [classification, error, telemetry]);
155
155
 
156
156
  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>;
157
157
  };
@@ -206,8 +206,7 @@ const createHydratedRemote =
206
206
  ${hydratedExports}
207
207
 
208
208
  export const Header = () => {
209
- const { i18nInstance } = useModernI18n();
210
- const t = i18nInstance['t'].bind(i18nInstance);
209
+ const { t } = useModernI18n();
211
210
 
212
211
  return (
213
212
  <header className="${tw('flex min-w-0 flex-wrap items-center gap-x-8 gap-y-2 md:flex-1')}" data-modern-boundary-id="${external_descriptors_cjs_namespaceObject.shellApp.mfName}" data-modern-mf-expose="shell/Header">
@@ -217,8 +216,7 @@ const createHydratedRemote =
217
216
  };
218
217
 
219
218
  export const StatusBadge = () => {
220
- const { i18nInstance } = useModernI18n();
221
- const t = i18nInstance['t'].bind(i18nInstance);
219
+ const { t } = useModernI18n();
222
220
 
223
221
  return (
224
222
  <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')}">
@@ -228,8 +226,7 @@ export const StatusBadge = () => {
228
226
  };
229
227
 
230
228
  export const VerticalShowcase = () => {
231
- const { i18nInstance } = useModernI18n();
232
- const t = i18nInstance['t'].bind(i18nInstance);
229
+ const { t } = useModernI18n();
233
230
 
234
231
  if (widgetCount === 0) {
235
232
  return (
@@ -251,36 +248,36 @@ ${showcaseItems}
251
248
  }
252
249
  function createRemotePage(app) {
253
250
  const tw = (0, external_naming_cjs_namespaceObject.createTw)((0, external_naming_cjs_namespaceObject.tailwindPrefixForApp)(app));
254
- const listEffectItems = `list${(0, external_naming_cjs_namespaceObject.toPascalCase)((0, external_descriptors_cjs_namespaceObject.effectApiStem)(app))}`;
255
- const effectBffImport = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
251
+ const listApiItems = `list${(0, external_naming_cjs_namespaceObject.toPascalCase)((0, external_descriptors_cjs_namespaceObject.effectApiStem)(app))}`;
252
+ const apiImport = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
256
253
  import { Link } from '@modern-js/plugin-tanstack/runtime';
257
254
  import { useEffect, useState } from 'react';
258
255
  import {
259
256
  Effect,
260
- ${listEffectItems},
257
+ ${listApiItems},
261
258
  runEffectRequest,
262
- } from '../../effect/${(0, external_descriptors_cjs_namespaceObject.effectApiStem)(app)}-client';
259
+ } from '../../api/${(0, external_descriptors_cjs_namespaceObject.effectApiStem)(app)}-client';
263
260
  import { UltramodernRouteHead } from '../ultramodern-route-head';
264
261
  import { ultramodernUiMarker } from '../../ultramodern-build';
265
262
  ` : "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";
266
- const effectBffState = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? ` const [effectApiStatus, setEffectApiStatus] = useState('pending');
263
+ const apiState = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? ` const [apiStatus, setApiStatus] = useState('pending');
267
264
 
268
265
  useEffect(() => {
269
266
  let cancelled = false;
270
267
  void runEffectRequest(
271
- ${listEffectItems}({ limit: 1 }).pipe(
268
+ ${listApiItems}({ limit: 1 }).pipe(
272
269
  Effect.match({
273
270
  onFailure: () => {
274
271
  if (cancelled) {
275
272
  return;
276
273
  }
277
- setEffectApiStatus('unavailable');
274
+ setApiStatus('unavailable');
278
275
  },
279
276
  onSuccess: data => {
280
277
  if (cancelled) {
281
278
  return;
282
279
  }
283
- setEffectApiStatus(data.items.at(0)?.title ?? 'empty');
280
+ setApiStatus(data.items.at(0)?.title ?? 'empty');
284
281
  },
285
282
  }),
286
283
  ),
@@ -292,13 +289,12 @@ import { ultramodernUiMarker } from '../../ultramodern-build';
292
289
  }, []);
293
290
 
294
291
  ` : '';
295
- const effectBffMarkup = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? ` <p data-testid="effect-bff-status">{effectApiStatus}</p>
292
+ const apiMarkup = (0, external_descriptors_cjs_namespaceObject.appHasEffectApi)(app) ? ` <p data-testid="api-status">{apiStatus}</p>
296
293
  ` : '';
297
- return `${effectBffImport}
294
+ return `${apiImport}
298
295
  export default function ${(0, external_naming_cjs_namespaceObject.toPascalCase)(app.id)}Home() {
299
- const { i18nInstance, language, supportedLanguages } = useModernI18n();
300
- const t = i18nInstance['t'].bind(i18nInstance);
301
- ${effectBffState} return (
296
+ const { language, supportedLanguages, t } = useModernI18n();
297
+ ${apiState} return (
302
298
  <main className="${tw('min-h-screen bg-um-canvas px-4 py-6 text-um-foreground sm:px-8')}">
303
299
  <UltramodernRouteHead />
304
300
  <nav aria-label={t('${app.domain}.language.switcher')} className="${tw('flex gap-3')}">
@@ -319,7 +315,7 @@ ${effectBffState} return (
319
315
  <p className="${tw('sr-only')}" data-build-marker={ultramodernUiMarker.build} data-testid="ultramodern-ui-marker">
320
316
  {ultramodernUiMarker.appId}:{ultramodernUiMarker.version}
321
317
  </p>
322
- ${effectBffMarkup} </main>
318
+ ${apiMarkup} </main>
323
319
  );
324
320
  }
325
321
  `;
@@ -343,8 +339,7 @@ function createRemoteEntry(app) {
343
339
  return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
344
340
 
345
341
  export default function ${(0, external_naming_cjs_namespaceObject.toPascalCase)(domain)}Route() {
346
- const { i18nInstance } = useModernI18n();
347
- const t = i18nInstance['t'].bind(i18nInstance);
342
+ const { t } = useModernI18n();
348
343
 
349
344
  return (
350
345
  <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">
@@ -362,8 +357,7 @@ function createRemoteWidget(app) {
362
357
  return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
363
358
 
364
359
  export default function ${componentName}() {
365
- const { i18nInstance } = useModernI18n();
366
- const t = i18nInstance['t'].bind(i18nInstance);
360
+ const { t } = useModernI18n();
367
361
 
368
362
  return (
369
363
  <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">
@@ -382,8 +376,7 @@ function createRemoteExposeComponent(app, expose) {
382
376
  return `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
383
377
 
384
378
  export default function ${componentName}() {
385
- const { i18nInstance } = useModernI18n();
386
- const t = i18nInstance['t'].bind(i18nInstance);
379
+ const { t } = useModernI18n();
387
380
 
388
381
  return (
389
382
  <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}">
@@ -28,7 +28,7 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
- GENERATED_CONTRACT_PATH: ()=>GENERATED_CONTRACT_PATH,
31
+ ULTRAMODERN_CONFIG_PATH: ()=>ULTRAMODERN_CONFIG_PATH,
32
32
  appHasEffectApi: ()=>appHasEffectApi,
33
33
  appI18nNamespace: ()=>appI18nNamespace,
34
34
  createCloudflarePublicUrlEnv: ()=>createCloudflarePublicUrlEnv,
@@ -48,7 +48,7 @@ __webpack_require__.d(__webpack_exports__, {
48
48
  zephyrRemoteDependency: ()=>zephyrRemoteDependency
49
49
  });
50
50
  const external_naming_cjs_namespaceObject = require("./naming.cjs");
51
- const GENERATED_CONTRACT_PATH = '.modernjs/ultramodern-generated-contract.json';
51
+ const ULTRAMODERN_CONFIG_PATH = '.modernjs/ultramodern.json';
52
52
  const shellApp = {
53
53
  id: 'shell-super-app',
54
54
  directory: 'apps/shell-super-app',
@@ -179,7 +179,7 @@ function createCloudflarePublicUrlEnv(app) {
179
179
  function appI18nNamespace(app) {
180
180
  return 'shell' === app.kind ? 'shell' : app.domain ?? app.id;
181
181
  }
182
- exports.GENERATED_CONTRACT_PATH = __webpack_exports__.GENERATED_CONTRACT_PATH;
182
+ exports.ULTRAMODERN_CONFIG_PATH = __webpack_exports__.ULTRAMODERN_CONFIG_PATH;
183
183
  exports.appHasEffectApi = __webpack_exports__.appHasEffectApi;
184
184
  exports.appI18nNamespace = __webpack_exports__.appI18nNamespace;
185
185
  exports.createCloudflarePublicUrlEnv = __webpack_exports__.createCloudflarePublicUrlEnv;
@@ -198,7 +198,7 @@ exports.shellApp = __webpack_exports__.shellApp;
198
198
  exports.verticalEffectApps = __webpack_exports__.verticalEffectApps;
199
199
  exports.zephyrRemoteDependency = __webpack_exports__.zephyrRemoteDependency;
200
200
  for(var __rspack_i in __webpack_exports__)if (-1 === [
201
- "GENERATED_CONTRACT_PATH",
201
+ "ULTRAMODERN_CONFIG_PATH",
202
202
  "appHasEffectApi",
203
203
  "appI18nNamespace",
204
204
  "createCloudflarePublicUrlEnv",