@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 +33 -23
- package/dist/index.js +56 -50
- package/package.json +3 -3
- package/template-workspace/README.md.handlebars +2 -2
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
|
|
16
|
-
|
|
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-
|
|
21
|
+
pnpm dlx @bleedingdev/modern-js-create my-app
|
|
20
22
|
```
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
63
|
+
TanStack Router is generated by default. To force the compatibility router:
|
|
49
64
|
|
|
50
65
|
```bash
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
81
|
+
pnpm dlx @bleedingdev/modern-js-create my-app
|
|
67
82
|
```
|
|
68
83
|
|
|
69
84
|
### BFF Runtime Template
|
|
70
85
|
|
|
71
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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: 'đ
|
|
461
|
-
description: 'Create a new
|
|
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
|
|
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: '
|
|
485
|
-
example6: ' create my-app --router
|
|
486
|
-
example7: ' create my-app --bff',
|
|
487
|
-
example8: ' create my-app --
|
|
488
|
-
example9: ' create my-app --
|
|
489
|
-
example10: ' pnpm dlx @bleedingdev/modern-js-create my-app',
|
|
490
|
-
example11: ' pnpm dlx @bleedingdev/modern-js-create my-
|
|
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
|
|
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: 'đ 揢čżä˝żç¨
|
|
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: 'đ
|
|
519
|
-
description: '
|
|
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
|
|
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: '
|
|
543
|
-
example6: ' create my-app --router
|
|
544
|
-
example7: ' create my-app --bff',
|
|
545
|
-
example8: ' create my-app --
|
|
546
|
-
example9: ' create my-app --
|
|
547
|
-
example10: ' pnpm dlx @bleedingdev/modern-js-create my-app',
|
|
548
|
-
example11: ' pnpm dlx @bleedingdev/modern-js-create my-
|
|
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
|
|
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/
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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/
|
|
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
|
|
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)
|
|
6283
|
-
|
|
6284
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
18
|
-
pnpm
|
|
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,
|