@bleedingdev/modern-js-create 3.2.0-ultramodern.74 → 3.2.0-ultramodern.77

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 CHANGED
@@ -12,15 +12,30 @@
12
12
 
13
13
  Please follow [Quick Start](https://modernjs.dev/en/guides/get-started/quick-start) to get started with Modern.js.
14
14
 
15
- For UltraModern.js, use the BleedingDev create package. It defaults to the
16
- canonical Tractor SuperApp workspace and published BleedingDev package aliases:
15
+ For UltraModern.js, use the BleedingDev create package. It defaults to a
16
+ production-ready single app with `presetUltramodern(...)`, TanStack Router,
17
+ Tailwind CSS v4, i18n, Effect BFF, generated quality gates, and published
18
+ BleedingDev package aliases:
17
19
 
18
20
  ```bash
19
- pnpm dlx @bleedingdev/modern-js-create my-super-app
21
+ pnpm dlx @bleedingdev/modern-js-create my-app
20
22
  ```
21
23
 
22
- The default workspace is a full-stack reference, not a visual-only commerce
23
- boundary demo. It generates:
24
+ To initialize the empty directory you are already in, pass `.` explicitly:
25
+
26
+ ```bash
27
+ pnpm dlx @bleedingdev/modern-js-create .
28
+ ```
29
+
30
+ Create a full SuperApp workspace only when you need independently owned
31
+ verticals:
32
+
33
+ ```bash
34
+ pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace
35
+ ```
36
+
37
+ The workspace is a full-stack reference, not a visual-only commerce boundary
38
+ demo. It generates:
24
39
 
25
40
  - `apps/shell-super-app` as the Module Federation host and topology owner.
26
41
  - `verticals/explore` for discovery UI plus
@@ -45,10 +60,10 @@ pnpm build
45
60
 
46
61
  ### Router Template
47
62
 
48
- You can scaffold a TanStack Router first template:
63
+ TanStack Router is generated by default. To force the compatibility router:
49
64
 
50
65
  ```bash
51
- npx @modern-js/create my-app --router tanstack
66
+ pnpm dlx @bleedingdev/modern-js-create my-app --router react-router
52
67
  ```
53
68
 
54
69
  ### Tailwind Template
@@ -57,43 +72,38 @@ Tailwind CSS v4 setup is generated by default. Disable it explicitly when you
57
72
  need a plain CSS starter:
58
73
 
59
74
  ```bash
60
- npx @modern-js/create my-app --no-tailwind
75
+ pnpm dlx @bleedingdev/modern-js-create my-app --no-tailwind
61
76
  ```
62
77
 
63
78
  TanStack Router and Tailwind CSS work together without extra flags:
64
79
 
65
80
  ```bash
66
- npx @modern-js/create my-app --router tanstack
81
+ pnpm dlx @bleedingdev/modern-js-create my-app
67
82
  ```
68
83
 
69
84
  ### BFF Runtime Template
70
85
 
71
- You can scaffold BFF APIs with the current default runtime:
72
-
73
- ```bash
74
- npx @modern-js/create my-app --bff
75
- ```
76
-
77
- You can explicitly scaffold Effect HttpApi runtime for BFF:
86
+ UltraModern app scaffolds include Effect HttpApi BFF by default:
78
87
 
79
88
  ```bash
80
- npx @modern-js/create my-app --bff-runtime effect
89
+ pnpm dlx @bleedingdev/modern-js-create my-app
81
90
  ```
82
91
 
83
92
  To scaffold Hono runtime explicitly:
84
93
 
85
94
  ```bash
86
- npx @modern-js/create my-app --bff-runtime hono
95
+ pnpm dlx @bleedingdev/modern-js-create my-app --bff-runtime hono
87
96
  ```
88
97
 
89
98
  Generated starters expose `presetUltramodern(...)` as the public opinionated
90
99
  config wrapper when you want the full Ultramodern setup surface in
91
100
  `modern.config.ts`.
92
101
 
93
- You can combine TanStack Router + default Tailwind + Effect BFF in one command:
102
+ TanStack Router, default Tailwind, and Effect BFF are included without extra
103
+ flags. For local monorepo dependency testing, add `--workspace`:
94
104
 
95
105
  ```bash
96
- npx @modern-js/create my-app --router tanstack --bff-runtime effect
106
+ pnpm dlx @bleedingdev/modern-js-create my-app --workspace
97
107
  ```
98
108
 
99
109
  ### Vertical Workspace Recipes
@@ -104,7 +114,7 @@ overlay, ownership entry, Effect BFF surface, and root `dev:*` script from the
104
114
  requested vertical name.
105
115
 
106
116
  ```bash
107
- npx @modern-js/create catalog --vertical
117
+ pnpm dlx @bleedingdev/modern-js-create catalog --vertical
108
118
  ```
109
119
 
110
120
  Use this decision table before adding a vertical:
@@ -195,14 +205,14 @@ When testing unreleased Modern.js packages from a local monorepo checkout, use
195
205
  workspace protocol dependencies:
196
206
 
197
207
  ```bash
198
- npx @modern-js/create my-app --router tanstack --bff-runtime effect --workspace
208
+ pnpm dlx @bleedingdev/modern-js-create my-app --workspace
199
209
  ```
200
210
 
201
211
  For package-source validation of the full Tractor workspace, generate with the
202
212
  workspace package source, then run the generated contract gate:
203
213
 
204
214
  ```bash
205
- npx @modern-js/create tractor-super-app --workspace
215
+ pnpm dlx @bleedingdev/modern-js-create tractor-super-app --ultramodern-workspace --ultramodern-package-source workspace
206
216
  cd tractor-super-app
207
217
  pnpm install
208
218
  pnpm ultramodern:check
package/dist/index.js CHANGED
@@ -449,7 +449,7 @@ const EN_LOCALE = {
449
449
  createFailed: 'Error creating project:'
450
450
  },
451
451
  message: {
452
- welcome: '🚀 Welcome to Modern.js',
452
+ welcome: '🚀 Welcome to UltraModern.js',
453
453
  success: '✨ Created successfully!',
454
454
  nextSteps: '📋 Next steps:',
455
455
  step1: 'cd {projectName}',
@@ -457,16 +457,16 @@ const EN_LOCALE = {
457
457
  step3: 'pnpm dev'
458
458
  },
459
459
  help: {
460
- title: '🚀 Modern.js Project Creator',
461
- description: 'Create a new Modern.js project with ease',
460
+ title: '🚀 UltraModern.js Project Creator',
461
+ description: 'Create a new UltraModern.js app with TanStack Router and Effect BFF by default',
462
462
  usage: '📖 Usage:',
463
- usageExample: ' create [project-name] [options]',
463
+ usageExample: ' pnpm dlx @bleedingdev/modern-js-create [project-name] [options]',
464
464
  options: '⚙️ Options:',
465
465
  optionHelp: ' -h, --help Display this help message',
466
466
  optionVersion: ' -v, --version Display version information',
467
467
  optionLang: ' -l, --lang Set the language (zh or en)',
468
468
  optionRouter: ' -r, --router Select router framework (react-router or tanstack)',
469
- optionBff: ' --bff Enable BFF scaffold (default runtime: effect)',
469
+ optionBff: ' --bff Keep Effect BFF enabled (default for UltraModern apps)',
470
470
  optionBffRuntime: ' --bff-runtime Select BFF runtime (hono or effect)',
471
471
  optionTailwind: ' --no-tailwind Disable default Tailwind CSS v4 scaffold',
472
472
  optionWorkspace: ' --workspace Use workspace protocol for @modern-js dependencies (for local monorepo testing)',
@@ -477,22 +477,22 @@ const EN_LOCALE = {
477
477
  optionVertical: ' --vertical Mutate the current existing UltraModern workspace and wire a MicroVertical named <project-name>',
478
478
  optionSub: ' -s, --sub Mark as a subproject (package in monorepo)',
479
479
  examples: '💡 Examples:',
480
- example1: ' create my-app',
481
- example2: ' create my-app --lang zh',
482
- example3: ' create my-app --sub',
483
- example4: ' create --help',
484
- example5: ' create my-app --router tanstack',
485
- example6: ' create my-app --router tanstack --no-tailwind',
486
- example7: ' create my-app --bff',
487
- example8: ' create my-app --router tanstack --bff-runtime effect',
488
- example9: ' create my-app --router tanstack --bff-runtime effect --workspace',
489
- example10: ' pnpm dlx @bleedingdev/modern-js-create my-app',
490
- example11: ' pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace',
491
- example12: ' create catalog --vertical',
480
+ example1: ' pnpm dlx @bleedingdev/modern-js-create my-app',
481
+ example2: ' pnpm dlx @bleedingdev/modern-js-create my-app --lang zh',
482
+ example3: ' pnpm dlx @bleedingdev/modern-js-create my-app --sub',
483
+ example4: ' pnpm dlx @bleedingdev/modern-js-create --help',
484
+ example5: ' pnpm dlx @bleedingdev/modern-js-create .',
485
+ example6: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router --no-tailwind',
486
+ example7: ' pnpm dlx @bleedingdev/modern-js-create my-app --bff-runtime hono',
487
+ example8: ' pnpm dlx @bleedingdev/modern-js-create my-app --workspace',
488
+ example9: ' pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace',
489
+ example10: ' pnpm dlx @bleedingdev/modern-js-create my-app --no-tailwind',
490
+ example11: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router',
491
+ example12: ' pnpm dlx @bleedingdev/modern-js-create catalog --vertical',
492
492
  moreInfo: '📚 Learn more: https://modernjs.dev'
493
493
  },
494
494
  version: {
495
- message: '@modern-js/create version: {version}'
495
+ message: '@bleedingdev/modern-js-create version: {version}'
496
496
  }
497
497
  };
498
498
  const ZH_LOCALE = {
@@ -507,7 +507,7 @@ const ZH_LOCALE = {
507
507
  createFailed: '创建项目时出错:'
508
508
  },
509
509
  message: {
510
- welcome: '🚀 欢迎使用 Modern.js',
510
+ welcome: '🚀 欢迎使用 UltraModern.js',
511
511
  success: '✨ 创建成功!',
512
512
  nextSteps: '📋 下一步:',
513
513
  step1: 'cd {projectName}',
@@ -515,16 +515,16 @@ const ZH_LOCALE = {
515
515
  step3: 'pnpm dev'
516
516
  },
517
517
  help: {
518
- title: '🚀 Modern.js 项目创建工具',
519
- description: '快速创建一个新的 Modern.js 项目',
518
+ title: '🚀 UltraModern.js 项目创建工具',
519
+ description: '创建默认包含 TanStack Router 和 Effect BFF 的 UltraModern.js 应用',
520
520
  usage: '📖 用法:',
521
- usageExample: ' create [项目名称] [选项]',
521
+ usageExample: ' pnpm dlx @bleedingdev/modern-js-create [项目名称] [选项]',
522
522
  options: '⚙️ 选项:',
523
523
  optionHelp: ' -h, --help 显示帮助信息',
524
524
  optionVersion: ' -v, --version 显示版本信息',
525
525
  optionLang: ' -l, --lang 设置语言 (zh 或 en)',
526
526
  optionRouter: ' -r, --router 选择路由框架 (react-router 或 tanstack)',
527
- optionBff: ' --bff 启用 BFF 模板(默认运行时:effect)',
527
+ optionBff: ' --bff 保持启用 Effect BFF(UltraModern 应用默认值)',
528
528
  optionBffRuntime: ' --bff-runtime 选择 BFF 运行时(hono 或 effect)',
529
529
  optionTailwind: ' --no-tailwind 禁用默认 Tailwind CSS v4 模板',
530
530
  optionWorkspace: ' --workspace 寚 @modern-js 依赖使用 workspace 协议(用于本地 monorepo 联调)',
@@ -535,22 +535,22 @@ const ZH_LOCALE = {
535
535
  optionVertical: ' --vertical 修改当前已有的 UltraModern 工作区,并接入名为 <项目名称> 的 MicroVertical',
536
536
  optionSub: ' -s, --sub 标记为子项目(monorepo 中的子包)',
537
537
  examples: '💡 示例:',
538
- example1: ' create my-app',
539
- example2: ' create my-app --lang zh',
540
- example3: ' create my-app --sub',
541
- example4: ' create --help',
542
- example5: ' create my-app --router tanstack',
543
- example6: ' create my-app --router tanstack --no-tailwind',
544
- example7: ' create my-app --bff',
545
- example8: ' create my-app --router tanstack --bff-runtime effect',
546
- example9: ' create my-app --router tanstack --bff-runtime effect --workspace',
547
- example10: ' pnpm dlx @bleedingdev/modern-js-create my-app',
548
- example11: ' pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace',
549
- example12: ' create catalog --vertical',
538
+ example1: ' pnpm dlx @bleedingdev/modern-js-create my-app',
539
+ example2: ' pnpm dlx @bleedingdev/modern-js-create my-app --lang zh',
540
+ example3: ' pnpm dlx @bleedingdev/modern-js-create my-app --sub',
541
+ example4: ' pnpm dlx @bleedingdev/modern-js-create --help',
542
+ example5: ' pnpm dlx @bleedingdev/modern-js-create .',
543
+ example6: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router --no-tailwind',
544
+ example7: ' pnpm dlx @bleedingdev/modern-js-create my-app --bff-runtime hono',
545
+ example8: ' pnpm dlx @bleedingdev/modern-js-create my-app --workspace',
546
+ example9: ' pnpm dlx @bleedingdev/modern-js-create my-super-app --ultramodern-workspace',
547
+ example10: ' pnpm dlx @bleedingdev/modern-js-create my-app --no-tailwind',
548
+ example11: ' pnpm dlx @bleedingdev/modern-js-create my-app --router react-router',
549
+ example12: ' pnpm dlx @bleedingdev/modern-js-create catalog --vertical',
550
550
  moreInfo: '📚 更多信息: https://modernjs.dev'
551
551
  },
552
552
  version: {
553
- message: '@modern-js/create 版本: {version}'
553
+ message: '@bleedingdev/modern-js-create 版本: {version}'
554
554
  }
555
555
  };
556
556
  const i18n = new I18n();
@@ -921,6 +921,7 @@ function appDependencies(scope, packageSource, app, remotes = []) {
921
921
  '@modern-js/plugin-tanstack': modernPackageSpecifier('@modern-js/plugin-tanstack', packageSource),
922
922
  '@modern-js/plugin-i18n': modernPackageSpecifier('@modern-js/plugin-i18n', packageSource),
923
923
  '@modern-js/runtime': modernPackageSpecifier('@modern-js/runtime', packageSource),
924
+ '@module-federation/bridge-react': MODULE_FEDERATION_VERSION,
924
925
  '@module-federation/modern-js-v3': MODULE_FEDERATION_VERSION,
925
926
  '@module-federation/runtime': MODULE_FEDERATION_VERSION,
926
927
  '@tanstack/react-router': TANSTACK_ROUTER_VERSION,
@@ -2371,7 +2372,7 @@ function createShellRemoteComponents(scope, remotes = []) {
2371
2372
  return ` <${componentName} key="${remote.id}" />`;
2372
2373
  }).join('\n');
2373
2374
  const remoteCount = String(widgetRemotes.length);
2374
- return `import { createLazyComponent } from '@module-federation/modern-js-v3/react';
2375
+ return `import { createLazyComponent } from '@module-federation/bridge-react';
2375
2376
  import { getInstance, loadRemote } from '@module-federation/modern-js-v3/runtime';
2376
2377
  import { Suspense, useEffect, useMemo, useState } from 'react';
2377
2378
  import type { ComponentType } from 'react';
@@ -2482,7 +2483,7 @@ function createRemotePage(app) {
2482
2483
  const listEffectItems = `list${toPascalCase(effectApiStem(app))}`;
2483
2484
  const effectBffImport = appHasEffectApi(app) ? `import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
2484
2485
  import { Helmet } from '@modern-js/runtime/head';
2485
- import { useLocation } from '@modern-js/plugin-tanstack/runtime';
2486
+ import { Link, useLocation } from '@modern-js/plugin-tanstack/runtime';
2486
2487
  import { useEffect, useState } from 'react';
2487
2488
  import {
2488
2489
  Effect,
@@ -2491,7 +2492,7 @@ import {
2491
2492
  } from '../../effect/${effectApiStem(app)}-client';
2492
2493
  import { ultramodernLocalisedUrls } from '../ultramodern-route-metadata';
2493
2494
  import { ultramodernUiMarker } from '../../ultramodern-build';
2494
- ` : "import { useModernI18n } from '@modern-js/plugin-i18n/runtime';\nimport { Helmet } from '@modern-js/runtime/head';\nimport { useLocation } from '@modern-js/plugin-tanstack/runtime';\nimport { ultramodernLocalisedUrls } from '../ultramodern-route-metadata';\nimport { ultramodernUiMarker } from '../../ultramodern-build';\n";
2495
+ ` : "import { useModernI18n } from '@modern-js/plugin-i18n/runtime';\nimport { Helmet } from '@modern-js/runtime/head';\nimport { Link, useLocation } from '@modern-js/plugin-tanstack/runtime';\nimport { ultramodernLocalisedUrls } from '../ultramodern-route-metadata';\nimport { ultramodernUiMarker } from '../../ultramodern-build';\n";
2495
2496
  const effectBffState = appHasEffectApi(app) ? ` const [effectApiStatus, setEffectApiStatus] = useState('pending');
2496
2497
 
2497
2498
  useEffect(() => {
@@ -2528,21 +2529,20 @@ ${createLocalizedHeadComponent()}
2528
2529
  export default function ${toPascalCase(app.id)}Home() {
2529
2530
  const { i18nInstance, language } = useModernI18n();
2530
2531
  const t = i18nInstance['t'].bind(i18nInstance);
2531
- const location = useLocation();
2532
- const suffix = locationSuffix(location);
2533
2532
  ${effectBffState} return (
2534
2533
  <main className="${tw('min-h-screen bg-um-canvas px-4 py-6 text-um-foreground sm:px-8')}">
2535
2534
  <LocalizedHead />
2536
2535
  <nav aria-label={t('${app.domain}.language.switcher')} className="${tw('flex gap-3')}">
2537
2536
  {supportedLanguages.map(code => (
2538
- <a
2537
+ <Link
2539
2538
  aria-current={language === code ? 'page' : undefined}
2540
2539
  className="${tw('rounded-full border border-stone-900/15 bg-white px-4 py-2 text-sm font-bold text-stone-950 no-underline')}"
2541
- href={\`\${localizedPath(location.pathname, code)}\${suffix}\`}
2542
2540
  key={code}
2541
+ params={{ lang: code }}
2542
+ to="/$lang"
2543
2543
  >
2544
2544
  {t(\`${app.domain}.language.\${code}\`)}
2545
- </a>
2545
+ </Link>
2546
2546
  ))}
2547
2547
  </nav>
2548
2548
  <h1 className="${tw('mt-10 text-5xl font-black')}">{t('${app.domain}.title')}</h1>
@@ -2821,7 +2821,7 @@ export default function ${componentName}() {
2821
2821
  }
2822
2822
  function createRecordsRemoteComponents(scope, app) {
2823
2823
  const tw = createTw(tailwindPrefixForApp(app));
2824
- return `import { createLazyComponent } from '@module-federation/modern-js-v3/react';
2824
+ return `import { createLazyComponent } from '@module-federation/bridge-react';
2825
2825
  import { getInstance, loadRemote } from '@module-federation/modern-js-v3/runtime';
2826
2826
  import { Suspense, useEffect, useMemo, useState } from 'react';
2827
2827
  import type { ComponentType } from 'react';
@@ -5752,7 +5752,7 @@ function detectBffRuntime() {
5752
5752
  const runtimeValue = getOptionValue(args, [
5753
5753
  '--bff-runtime'
5754
5754
  ]);
5755
- if (!runtimeValue) return args.includes('--bff') ? 'effect' : 'none';
5755
+ if (!runtimeValue) return 'effect';
5756
5756
  if ('hono' === runtimeValue || 'effect' === runtimeValue) return runtimeValue;
5757
5757
  console.error(i18n.t(localeKeys.error.invalidBffRuntime, {
5758
5758
  runtime: runtimeValue
@@ -6279,10 +6279,16 @@ async function getProjectName() {
6279
6279
  process.exit(1);
6280
6280
  }
6281
6281
  const projectNameArg = positionalArgs[0];
6282
- if (projectNameArg) return {
6283
- name: projectNameArg,
6284
- useCurrentDir: false
6285
- };
6282
+ if (projectNameArg) {
6283
+ if ('.' === projectNameArg) return {
6284
+ name: node_path.basename(process.cwd()),
6285
+ useCurrentDir: true
6286
+ };
6287
+ return {
6288
+ name: projectNameArg,
6289
+ useCurrentDir: false
6290
+ };
6291
+ }
6286
6292
  const currentDir = process.cwd();
6287
6293
  if (isDirectoryEmpty(currentDir)) return {
6288
6294
  name: node_path.basename(currentDir),
package/package.json CHANGED
@@ -21,7 +21,7 @@
21
21
  "engines": {
22
22
  "node": ">=20"
23
23
  },
24
- "version": "3.2.0-ultramodern.74",
24
+ "version": "3.2.0-ultramodern.77",
25
25
  "types": "./dist/types/index.d.ts",
26
26
  "main": "./dist/index.js",
27
27
  "bin": {
@@ -41,7 +41,7 @@
41
41
  "@types/node": "^25.9.1",
42
42
  "@typescript/native-preview": "7.0.0-dev.20260527.2",
43
43
  "tsx": "^4.22.3",
44
- "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.2.0-ultramodern.74"
44
+ "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.2.0-ultramodern.77"
45
45
  },
46
46
  "publishConfig": {
47
47
  "registry": "https://registry.npmjs.org/",
@@ -54,6 +54,6 @@
54
54
  "start": "node ./dist/index.js"
55
55
  },
56
56
  "ultramodern": {
57
- "frameworkVersion": "3.2.0-ultramodern.74"
57
+ "frameworkVersion": "3.2.0-ultramodern.77"
58
58
  }
59
59
  }
@@ -14,8 +14,8 @@ UltraModern.js 3.0 SuperApp surface and starts with an explicit shell:
14
14
  Add a full-stack MicroVertical when the product needs one:
15
15
 
16
16
  ```bash
17
- pnpm create modern@latest transportation --vertical
18
- pnpm create modern@latest payments --vertical
17
+ pnpm dlx @bleedingdev/modern-js-create transportation --vertical
18
+ pnpm dlx @bleedingdev/modern-js-create payments --vertical
19
19
  ```
20
20
 
21
21
  Each added vertical owns its UI/routes, browser-safe Module Federation exposes,