generator-mico-cli 0.1.18
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 +84 -0
- package/bin/mico.js +316 -0
- package/generators/micro-react/ignore-list.json +8 -0
- package/generators/micro-react/index.js +158 -0
- package/generators/micro-react/templates/.commitlintrc.js +6 -0
- package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +129 -0
- package/generators/micro-react/templates/.cursor/rules/cicd-deploy.mdc +143 -0
- package/generators/micro-react/templates/.cursor/rules/coding-conventions.mdc +206 -0
- package/generators/micro-react/templates/.cursor/rules/commit-conventions.mdc +111 -0
- package/generators/micro-react/templates/.cursor/rules/development-guide.mdc +295 -0
- package/generators/micro-react/templates/.cursor/rules/layout-app.mdc +275 -0
- package/generators/micro-react/templates/.cursor/rules/micro-frontend.mdc +196 -0
- package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +128 -0
- package/generators/micro-react/templates/.cursor/rules/request-auth.mdc +220 -0
- package/generators/micro-react/templates/.cursor/rules/theme-system.mdc +206 -0
- package/generators/micro-react/templates/.editorconfig +16 -0
- package/generators/micro-react/templates/.env +3 -0
- package/generators/micro-react/templates/.eslintrc.js +30 -0
- package/generators/micro-react/templates/.husky/commit-msg +2 -0
- package/generators/micro-react/templates/.husky/pre-commit +2 -0
- package/generators/micro-react/templates/.lintstagedrc +5 -0
- package/generators/micro-react/templates/.stylelintrc.js +25 -0
- package/generators/micro-react/templates/AGENTS.md +39 -0
- package/generators/micro-react/templates/CICD/start_dev.sh +30 -0
- package/generators/micro-react/templates/CICD/start_local.sh +30 -0
- package/generators/micro-react/templates/CICD/start_prod.sh +30 -0
- package/generators/micro-react/templates/CICD/start_test.sh +30 -0
- package/generators/micro-react/templates/CICD/wangsu_fresh_dev.sh +19 -0
- package/generators/micro-react/templates/CICD/wangsu_fresh_prod.sh +19 -0
- package/generators/micro-react/templates/CICD/wangsu_fresh_test.sh +19 -0
- package/generators/micro-react/templates/CLAUDE.md +106 -0
- package/generators/micro-react/templates/README.md +84 -0
- package/generators/micro-react/templates/_gitignore +57 -0
- package/generators/micro-react/templates/_npmrc +2 -0
- package/generators/micro-react/templates/apps/layout/.env +4 -0
- package/generators/micro-react/templates/apps/layout/.eslintrc.js +10 -0
- package/generators/micro-react/templates/apps/layout/.lintstagedrc +17 -0
- package/generators/micro-react/templates/apps/layout/.prettierignore +3 -0
- package/generators/micro-react/templates/apps/layout/.prettierrc +8 -0
- package/generators/micro-react/templates/apps/layout/.stylelintrc.js +20 -0
- package/generators/micro-react/templates/apps/layout/README.md +37 -0
- package/generators/micro-react/templates/apps/layout/config/config.dev.ts +54 -0
- package/generators/micro-react/templates/apps/layout/config/config.prod.ts +37 -0
- package/generators/micro-react/templates/apps/layout/config/config.testing.ts +27 -0
- package/generators/micro-react/templates/apps/layout/config/config.ts +132 -0
- package/generators/micro-react/templates/apps/layout/config/routes.ts +13 -0
- package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +78 -0
- package/generators/micro-react/templates/apps/layout/mock/menus.json +100 -0
- package/generators/micro-react/templates/apps/layout/mock/menus.ts +11 -0
- package/generators/micro-react/templates/apps/layout/mock/user.mock.ts +20 -0
- package/generators/micro-react/templates/apps/layout/package.json +45 -0
- package/generators/micro-react/templates/apps/layout/public/font/ar-SA.js +54 -0
- package/generators/micro-react/templates/apps/layout/public/font/default.js +54 -0
- package/generators/micro-react/templates/apps/layout/src/app.tsx +123 -0
- package/generators/micro-react/templates/apps/layout/src/assets/.gitkeep +0 -0
- package/generators/micro-react/templates/apps/layout/src/common/auth/cs-auth-manager.ts +220 -0
- package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +41 -0
- package/generators/micro-react/templates/apps/layout/src/common/auth/tool.ts +3 -0
- package/generators/micro-react/templates/apps/layout/src/common/auth/type.ts +6 -0
- package/generators/micro-react/templates/apps/layout/src/common/constants.ts +38 -0
- package/generators/micro-react/templates/apps/layout/src/common/env.ts +73 -0
- package/generators/micro-react/templates/apps/layout/src/common/helpers.ts +69 -0
- package/generators/micro-react/templates/apps/layout/src/common/locale.ts +123 -0
- package/generators/micro-react/templates/apps/layout/src/common/logger.ts +45 -0
- package/generators/micro-react/templates/apps/layout/src/common/menu/index.ts +2 -0
- package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +143 -0
- package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +92 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/config.ts +73 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/index.ts +188 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/interceptors.ts +186 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +132 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/token-refresh.ts +136 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/types.ts +44 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/url-resolver.ts +75 -0
- package/generators/micro-react/templates/apps/layout/src/common/theme.ts +107 -0
- package/generators/micro-react/templates/apps/layout/src/common/types.ts +7 -0
- package/generators/micro-react/templates/apps/layout/src/common/upload/index.ts +2 -0
- package/generators/micro-react/templates/apps/layout/src/common/upload/oss.ts +401 -0
- package/generators/micro-react/templates/apps/layout/src/common/upload/types.ts +47 -0
- package/generators/micro-react/templates/apps/layout/src/common/uploadFiles.ts +35 -0
- package/generators/micro-react/templates/apps/layout/src/components/IconFont/index.tsx +25 -0
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.less +44 -0
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +121 -0
- package/generators/micro-react/templates/apps/layout/src/constants/index.ts +15 -0
- package/generators/micro-react/templates/apps/layout/src/global.less +13 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/index.ts +3 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/useAuth.ts +75 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/useMenu.ts +35 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/useMenuState.ts +112 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/useTheme.ts +124 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less +109 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +97 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.less +164 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +165 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/index.less +71 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +91 -0
- package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +20 -0
- package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +19 -0
- package/generators/micro-react/templates/apps/layout/src/models/global.ts +13 -0
- package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +3 -0
- package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +7 -0
- package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +171 -0
- package/generators/micro-react/templates/apps/layout/src/services/auth.ts +37 -0
- package/generators/micro-react/templates/apps/layout/src/services/oss.ts +40 -0
- package/generators/micro-react/templates/apps/layout/src/styles/arco-override.less +78 -0
- package/generators/micro-react/templates/apps/layout/src/styles/themes/dark/custom-var.less +244 -0
- package/generators/micro-react/templates/apps/layout/src/styles/themes/normal/custom-var.less +195 -0
- package/generators/micro-react/templates/apps/layout/src/styles/variables.less +5 -0
- package/generators/micro-react/templates/apps/layout/src/utils/format.ts +4 -0
- package/generators/micro-react/templates/apps/layout/tailwind.config.js +7 -0
- package/generators/micro-react/templates/apps/layout/tailwind.css +3 -0
- package/generators/micro-react/templates/apps/layout/tsconfig.json +3 -0
- package/generators/micro-react/templates/apps/layout/typings.d.ts +1 -0
- package/generators/micro-react/templates/deployDesc.md +60 -0
- package/generators/micro-react/templates/docs/commit-message.md +98 -0
- package/generators/micro-react/templates/package.json +35 -0
- package/generators/micro-react/templates/packages/shared-styles/README.md +125 -0
- package/generators/micro-react/templates/packages/shared-styles/arco-override.less +78 -0
- package/generators/micro-react/templates/packages/shared-styles/index.less +14 -0
- package/generators/micro-react/templates/packages/shared-styles/package.json +27 -0
- package/generators/micro-react/templates/packages/shared-styles/theme-inject.less +10 -0
- package/generators/micro-react/templates/packages/shared-styles/themes/dark/custom-var.less +246 -0
- package/generators/micro-react/templates/packages/shared-styles/themes/normal/custom-var.less +195 -0
- package/generators/micro-react/templates/packages/shared-styles/variables-only.less +301 -0
- package/generators/micro-react/templates/packages/shared-styles/variables.less +363 -0
- package/generators/micro-react/templates/pnpm-workspace.yaml +9 -0
- package/generators/micro-react/templates/scripts/collect-dist.js +68 -0
- package/generators/micro-react/templates/scripts/create-umi-app.sh +61 -0
- package/generators/micro-react/templates/scripts/dev.js +133 -0
- package/generators/micro-react/templates/turbo.json +68 -0
- package/generators/subapp-react/ignore-list.json +7 -0
- package/generators/subapp-react/index.js +189 -0
- package/generators/subapp-react/templates/homepage/.env +4 -0
- package/generators/subapp-react/templates/homepage/README.md +116 -0
- package/generators/subapp-react/templates/homepage/_gitignore +9 -0
- package/generators/subapp-react/templates/homepage/config/config.dev.ts +59 -0
- package/generators/subapp-react/templates/homepage/config/config.prod.ts +41 -0
- package/generators/subapp-react/templates/homepage/config/config.testing.ts +40 -0
- package/generators/subapp-react/templates/homepage/config/config.ts +102 -0
- package/generators/subapp-react/templates/homepage/config/routes.ts +7 -0
- package/generators/subapp-react/templates/homepage/mock/api.mock.ts +59 -0
- package/generators/subapp-react/templates/homepage/package.json +30 -0
- package/generators/subapp-react/templates/homepage/src/app.tsx +80 -0
- package/generators/subapp-react/templates/homepage/src/assets/yay.jpg +0 -0
- package/generators/subapp-react/templates/homepage/src/common/logger.ts +42 -0
- package/generators/subapp-react/templates/homepage/src/common/mainApp.ts +53 -0
- package/generators/subapp-react/templates/homepage/src/common/request.ts +49 -0
- package/generators/subapp-react/templates/homepage/src/global.less +26 -0
- package/generators/subapp-react/templates/homepage/src/pages/index.less +139 -0
- package/generators/subapp-react/templates/homepage/src/pages/index.tsx +342 -0
- package/generators/subapp-react/templates/homepage/src/styles/theme.less +6 -0
- package/generators/subapp-react/templates/homepage/tsconfig.json +3 -0
- package/generators/subapp-react/templates/homepage/typings.d.ts +17 -0
- package/lib/utils.js +165 -0
- package/package.json +31 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
// ==================== 共享变量文件 ====================
|
|
2
|
+
// 这个文件包含项目中所有自定义的 Less 变量
|
|
3
|
+
// 使用方式:
|
|
4
|
+
// - 在子应用中导入 @import '<%= packageScope %>/shared-styles/variables';
|
|
5
|
+
// - 或者在 layout 中导入 @import '@/styles/variables.less';
|
|
6
|
+
|
|
7
|
+
// 注意:CSS 变量(--Brand1-x 等)由 index.less 或 global.less 导入主题文件定义
|
|
8
|
+
// 此文件仅定义 Less 变量,引用 CSS 变量实现动态主题切换
|
|
9
|
+
|
|
10
|
+
// 由于arco定义的原生css变量是rgb三分量格式,所以这边也只能定义成三分量,less变量则是用rgb函数进行包裹,可以直接使用在color,background-color,border-color等属性上
|
|
11
|
+
// 例如:color: @Brand1-6;
|
|
12
|
+
// ==================== 品牌色系统 ====================
|
|
13
|
+
// Brand1
|
|
14
|
+
@Brand1-1: rgb(var(--Brand1-1, 242 235 255)); // 浅色/白底悬浮
|
|
15
|
+
@Brand1-2: rgb(var(--Brand1-2, 220 198 255)); // 文字禁用
|
|
16
|
+
@Brand1-3: rgb(var(--Brand1-3, 195 163 255)); // 一般禁用
|
|
17
|
+
@Brand1-4: rgb(var(--Brand1-4, 169 129 255)); // 特殊场景
|
|
18
|
+
@Brand1-5: rgb(var(--Brand1-5, 140 94 255)); // 悬浮
|
|
19
|
+
@Brand1-6: rgb(var(--Brand1-6, 110 60 255)); // 点击
|
|
20
|
+
@Brand1-7: rgb(var(--Brand1-7, 75 37 210)); // 常规
|
|
21
|
+
|
|
22
|
+
// Brand2
|
|
23
|
+
@Brand2-1: rgb(var(--Brand2-1, 232 248 255)); // 浅色/白底悬浮
|
|
24
|
+
@Brand2-2: rgb(var(--Brand2-2, 190 232 255)); // 文字禁用
|
|
25
|
+
@Brand2-3: rgb(var(--Brand2-3, 149 214 255)); // 一般禁用
|
|
26
|
+
@Brand2-4: rgb(var(--Brand2-4, 107 193 255)); // 特殊场景
|
|
27
|
+
@Brand2-5: rgb(var(--Brand2-5, 66 170 255)); // 悬浮
|
|
28
|
+
@Brand2-6: rgb(var(--Brand2-6, 24 144 255)); // 点击
|
|
29
|
+
@Brand2-7: rgb(var(--Brand2-7, 15 109 210)); // 常规
|
|
30
|
+
|
|
31
|
+
// ==================== 中性色系统 ====================
|
|
32
|
+
// 边框颜色
|
|
33
|
+
@color-border-1: var(--color-border-1, rgb(242 243 245)); // 浅
|
|
34
|
+
@color-border-2: var(--color-border-2, rgb(229 230 235)); // 一般
|
|
35
|
+
@color-border-3: var(--color-border-3, rgb(201 205 212)); // 深/悬浮
|
|
36
|
+
@color-border-4: var(--color-border-4, rgb(134 144 156)); // 重/按钮描边
|
|
37
|
+
|
|
38
|
+
@color-line-1: var(--line-1, @color-border-1);
|
|
39
|
+
@color-line-2: var(--line-2, @color-border-2);
|
|
40
|
+
@color-line-3: var(--line-3, @color-border-3);
|
|
41
|
+
@color-line-4: var(--line-4, @color-border-4);
|
|
42
|
+
|
|
43
|
+
// 填充颜色
|
|
44
|
+
@color-fill-1: var(--color-fill-1, rgb(247 248 250)); // 浅/禁用
|
|
45
|
+
@color-fill-2: var(--color-fill-2, rgb(242 243 245)); // 一般/常规/白底悬浮
|
|
46
|
+
@color-fill-3: var(--color-fill-3, rgb(229 230 235)); // 深/灰底悬浮
|
|
47
|
+
@color-fill-4: var(--color-fill-4, rgb(201 205 212)); // 重/特殊场景
|
|
48
|
+
@color-fill-5: var(--color-fill-5, rgb(78 89 105)); // 强调/图标/特殊场景
|
|
49
|
+
|
|
50
|
+
// 文字颜色
|
|
51
|
+
@color-text-1: var(--color-text-1, rgb(29 33 41)); // 强调/正文标题
|
|
52
|
+
@color-text-2: var(--color-text-2, rgb(78 89 105)); // 次强调/正文标题
|
|
53
|
+
@color-text-3: var(--color-text-3, rgb(134 144 156)); // 次要信息
|
|
54
|
+
@color-text-4: var(--color-text-4, rgb(201 205 212)); // 置灰信息
|
|
55
|
+
@color-text-5: var(--color-text-5, rgb(255 255 255)); // 纯白文字
|
|
56
|
+
|
|
57
|
+
// ==================== 功能色系统 ====================
|
|
58
|
+
// 成功色
|
|
59
|
+
@Success-1: rgb(var(--Success-1, 232 255 234)); // 浅色背景
|
|
60
|
+
@Success-2: rgb(var(--Success-2, 175 240 181)); // 特殊场景
|
|
61
|
+
@Success-3: rgb(var(--Success-3, 123 225 136)); // 禁用
|
|
62
|
+
@Success-5: rgb(var(--Success-5, 35 195 67)); // 悬浮
|
|
63
|
+
@Success-6: rgb(var(--Success-6, 0 180 42)); // 常规
|
|
64
|
+
@Success-7: rgb(var(--Success-7, 0 154 41)); // 点击
|
|
65
|
+
|
|
66
|
+
// 警告色
|
|
67
|
+
@Warning-1: rgb(var(--Warning-1, 255 247 232)); // 浅色背景
|
|
68
|
+
@Warning-2: rgb(var(--Warning-2, 255 228 186)); // 特殊场景
|
|
69
|
+
@Warning-3: rgb(var(--Warning-3, 255 207 139)); // 禁用
|
|
70
|
+
@Warning-5: rgb(var(--Warning-5, 255 154 46)); // 悬浮
|
|
71
|
+
@Warning-6: rgb(var(--Warning-6, 255 125 0)); // 常规
|
|
72
|
+
@Warning-7: rgb(var(--Warning-7, 255 154 46)); // 点击
|
|
73
|
+
|
|
74
|
+
// 危险色
|
|
75
|
+
@Danger-1: rgb(var(--Danger-1, 255 236 232)); // 浅色背景
|
|
76
|
+
@Danger-2: rgb(var(--Danger-2, 253 205 197)); // 特殊场景
|
|
77
|
+
@Danger-3: rgb(var(--Danger-3, 251 172 163)); // 禁用
|
|
78
|
+
@Danger-5: rgb(var(--Danger-5, 247 101 96)); // 悬浮
|
|
79
|
+
@Danger-6: rgb(var(--Danger-6, 245 63 63)); // 常规
|
|
80
|
+
@Danger-7: rgb(var(--Danger-7, 203 38 52)); // 点击
|
|
81
|
+
|
|
82
|
+
// ==================== 其他系统色 ====================
|
|
83
|
+
// 其他系统色 / 辅助色 (System Success / Auxiliary Color)
|
|
84
|
+
@cyan-1: rgb(var(--cyan-1, 232 255 251)); // 浅色背景 (Light Background)
|
|
85
|
+
@cyan-2: rgb(var(--cyan-2, 187 248 240)); // 特殊场景 (Special Scene)
|
|
86
|
+
@cyan-3: rgb(var(--cyan-3, 145 241 231)); // 禁用 (Disabled)
|
|
87
|
+
@cyan-5: rgb(var(--cyan-5, 66 227 222)); // 悬浮 (Hover)
|
|
88
|
+
@cyan-6: rgb(var(--cyan-6, 30 220 220)); // 常规 (Regular)
|
|
89
|
+
@cyan-7: rgb(var(--cyan-7, 19 179 184)); // 点击 (Click)
|
|
90
|
+
|
|
91
|
+
// 晚秋红 (Orange Red)
|
|
92
|
+
@Orange-Red-1: rgb(
|
|
93
|
+
var(--Orange-Red-1, 255 243 232)
|
|
94
|
+
); // 浅色背景 (Light Background)
|
|
95
|
+
@Orange-Red-2: rgb(
|
|
96
|
+
var(--Orange-Red-2, 253 221 195)
|
|
97
|
+
); // 特殊场景 (Special Scene)
|
|
98
|
+
@Orange-Red-3: rgb(var(--Orange-Red-3, 252 197 159)); // 禁用 (Disabled)
|
|
99
|
+
@Orange-Red-5: rgb(var(--Orange-Red-5, 249 144 87)); // 悬浮 (Hover)
|
|
100
|
+
@Orange-Red-6: rgb(var(--Orange-Red-6, 247 114 52)); // 常规 (Regular)
|
|
101
|
+
@Orange-Red-7: rgb(var(--Orange-Red-7, 204 81 32)); // 点击 (Click)
|
|
102
|
+
|
|
103
|
+
// 黄昏 (Gold)
|
|
104
|
+
@Gold-1: rgb(var(--Gold-1, 255 252 232)); // 浅色背景 (Light Background)
|
|
105
|
+
@Gold-2: rgb(var(--Gold-2, 253 244 191)); // 特殊场景 (Special Scene)
|
|
106
|
+
@Gold-3: rgb(var(--Gold-3, 252 233 150)); // 禁用 (Disabled)
|
|
107
|
+
@Gold-5: rgb(var(--Gold-5, 249 204 69)); // 悬浮 (Hover)
|
|
108
|
+
@Gold-6: rgb(var(--Gold-6, 247 186 30)); // 常规 (Regular)
|
|
109
|
+
@Gold-7: rgb(var(--Gold-7, 204 146 19)); // 点击 (Click)
|
|
110
|
+
|
|
111
|
+
// 海蔚蓝 (Blue)
|
|
112
|
+
@Blue-1: rgb(var(--Blue-1, 232 247 255)); // 浅色背景 (Light Background)
|
|
113
|
+
@Blue-2: rgb(var(--Blue-2, 195 231 254)); // 特殊场景 (Special Scene)
|
|
114
|
+
@Blue-3: rgb(var(--Blue-3, 158 212 253)); // 禁用 (Disabled)
|
|
115
|
+
@Blue-5: rgb(var(--Blue-5, 86 168 251)); // 悬浮 (Hover)
|
|
116
|
+
@Blue-6: rgb(var(--Blue-6, 50 145 250)); // 常规 (Regular)
|
|
117
|
+
@Blue-7: rgb(var(--Blue-7, 31 107 207)); // 点击 (Click)
|
|
118
|
+
|
|
119
|
+
// 深蓝 (Dark Blue)
|
|
120
|
+
@Dark-Blue-1: rgb(
|
|
121
|
+
var(--Dark-Blue-1, 232 242 255)
|
|
122
|
+
); // 浅色背景 (Light Background)
|
|
123
|
+
@Dark-Blue-2: rgb(var(--Dark-Blue-2, 183 206 242)); // 特殊场景 (Special Scene)
|
|
124
|
+
@Dark-Blue-3: rgb(var(--Dark-Blue-3, 137 171 229)); // 禁用 (Disabled)
|
|
125
|
+
@Dark-Blue-5: rgb(var(--Dark-Blue-5, 58 102 203)); // 悬浮 (Hover)
|
|
126
|
+
@Dark-Blue-6: rgb(var(--Dark-Blue-6, 25 70 190)); // 常规 (Regular)
|
|
127
|
+
@Dark-Blue-7: rgb(var(--Dark-Blue-7, 16 50 162)); // 点击 (Click)
|
|
128
|
+
|
|
129
|
+
// 黄色 (Yellow)
|
|
130
|
+
@Yellow-1: rgb(var(--Yellow-1, 254 255 232)); // 浅色背景 (Light Background)
|
|
131
|
+
@Yellow-2: rgb(var(--Yellow-2, 254 254 190)); // 特殊场景 (Special Scene)
|
|
132
|
+
@Yellow-3: rgb(var(--Yellow-3, 253 250 148)); // 禁用 (Disabled)
|
|
133
|
+
@Yellow-5: rgb(var(--Yellow-5, 251 232 66)); // 悬浮 (Hover)
|
|
134
|
+
@Yellow-6: rgb(var(--Yellow-6, 250 220 25)); // 常规 (Regular)
|
|
135
|
+
@Yellow-7: rgb(var(--Yellow-7, 207 175 15)); // 点击 (Click)
|
|
136
|
+
|
|
137
|
+
// 新生绿 (Lime)
|
|
138
|
+
@Lime-1: rgb(var(--Lime-1, 252 255 232)); // 浅色背景 (Light Background)
|
|
139
|
+
@Lime-2: rgb(var(--Lime-2, 237 248 187)); // 特殊场景 (Special Scene)
|
|
140
|
+
@Lime-3: rgb(var(--Lime-3, 220 241 144)); // 禁用 (Disabled)
|
|
141
|
+
@Lime-5: rgb(var(--Lime-5, 181 226 65)); // 悬浮 (Hover)
|
|
142
|
+
@Lime-6: rgb(var(--Lime-6, 159 219 29)); // 常规 (Regular)
|
|
143
|
+
@Lime-7: rgb(var(--Lime-7, 126 183 18)); // 点击 (Click)
|
|
144
|
+
|
|
145
|
+
// 青春紫 (Pink Purple)
|
|
146
|
+
@Pink-Purple-1: rgb(
|
|
147
|
+
var(--Pink-Purple-1, 255 232 251)
|
|
148
|
+
); // 浅色背景 (Light Background)
|
|
149
|
+
@Pink-Purple-2: rgb(
|
|
150
|
+
var(--Pink-Purple-2, 247 186 239)
|
|
151
|
+
); // 特殊场景 (Special Scene)
|
|
152
|
+
@Pink-Purple-3: rgb(var(--Pink-Purple-3, 240 142 230)); // 禁用 (Disabled)
|
|
153
|
+
@Pink-Purple-5: rgb(var(--Pink-Purple-5, 225 62 219)); // 悬浮 (Hover)
|
|
154
|
+
@Pink-Purple-6: rgb(var(--Pink-Purple-6, 217 26 217)); // 常规 (Regular)
|
|
155
|
+
@Pink-Purple-7: rgb(var(--Pink-Purple-7, 176 16 182)); // 点击 (Click)
|
|
156
|
+
|
|
157
|
+
// 品红 (Magenta)
|
|
158
|
+
@Magenta-1: rgb(var(--Magenta-1, 255 232 241)); // 浅色背景 (Light Background)
|
|
159
|
+
@Magenta-2: rgb(var(--Magenta-2, 253 194 219)); // 特殊场景 (Special Scene)
|
|
160
|
+
@Magenta-3: rgb(var(--Magenta-3, 251 157 199)); // 禁用 (Disabled)
|
|
161
|
+
@Magenta-5: rgb(var(--Magenta-5, 247 84 168)); // 悬浮 (Hover)
|
|
162
|
+
@Magenta-6: rgb(var(--Magenta-6, 245 49 157)); // 常规 (Regular)
|
|
163
|
+
@Magenta-7: rgb(var(--Magenta-7, 203 30 131)); // 点击 (Click)
|
|
164
|
+
|
|
165
|
+
// ==================== 品牌色系统 ====================
|
|
166
|
+
// Dramabite
|
|
167
|
+
@Dramabite: rgb(var(--Dramabite, 40 255 70));
|
|
168
|
+
@Dramabite-1: rgb(var(--Dramabite-1, 233 255 232));
|
|
169
|
+
@Dramabite-2: rgb(var(--Dramabite-2, 194 255 194));
|
|
170
|
+
@Dramabite-7: rgb(var(--Dramabite-7, 25 210 56));
|
|
171
|
+
|
|
172
|
+
// Soulstar
|
|
173
|
+
@Soulstar: rgb(var(--Soulstar, 168 81 255));
|
|
174
|
+
@Soulstar-1: rgb(var(--Soulstar-1, 247 232 255));
|
|
175
|
+
@Soulstar-2: rgb(var(--Soulstar-2, 236 202 255));
|
|
176
|
+
|
|
177
|
+
// Mico
|
|
178
|
+
@Mico: rgb(var(--Mico, 110 60 255));
|
|
179
|
+
@Mico-1: rgb(var(--Mico-1, 242 232 255));
|
|
180
|
+
@Mico-2: rgb(var(--Mico-2, 220 198 255));
|
|
181
|
+
|
|
182
|
+
// Somatch
|
|
183
|
+
@Somatch: rgb(var(--Somatch, 59 230 247));
|
|
184
|
+
@Somatch-1: rgb(var(--Somatch-1, 232 255 253));
|
|
185
|
+
@Somatch-2: rgb(var(--Somatch-2, 197 253 251));
|
|
186
|
+
@Somatch-7: rgb(var(--Somatch-7, 37 185 204));
|
|
187
|
+
|
|
188
|
+
// Sugo
|
|
189
|
+
@Sugo: rgb(var(--Sugo, 100 60 255));
|
|
190
|
+
@Sugo-1: rgb(var(--Sugo-1, 240 232 255));
|
|
191
|
+
@Sugo-2: rgb(var(--Sugo-2, 217 198 255));
|
|
192
|
+
|
|
193
|
+
// Top Top
|
|
194
|
+
@Toptop: rgb(var(--Toptop, 20 220 200));
|
|
195
|
+
@Toptop-1: rgb(var(--Toptop-1, 232 255 249));
|
|
196
|
+
@Toptop-2: rgb(var(--Toptop-2, 185 248 233));
|
|
197
|
+
|
|
198
|
+
// Xena
|
|
199
|
+
@Xena: rgb(var(--Xena, 0 110 255));
|
|
200
|
+
@Xena-1: rgb(var(--Xena-1, 232 246 255));
|
|
201
|
+
@Xena-2: rgb(var(--Xena-2, 186 225 255));
|
|
202
|
+
|
|
203
|
+
// Yoho
|
|
204
|
+
@Yoho: rgb(var(--Yoho, 0 200 60));
|
|
205
|
+
@Yoho-1: rgb(var(--Yoho-1, 232 255 235));
|
|
206
|
+
@Yoho-2: rgb(var(--Yoho-2, 178 244 189));
|
|
207
|
+
|
|
208
|
+
// Zili
|
|
209
|
+
@Zili: rgb(var(--Zili, 9 110 249));
|
|
210
|
+
@Zili-1: rgb(var(--Zili-1, 232 245 255));
|
|
211
|
+
@Zili-2: rgb(var(--Zili-2, 187 224 254));
|
|
212
|
+
|
|
213
|
+
// WhatsApp
|
|
214
|
+
@Whatsapp: rgb(var(--Whatsapp, 36 211 102));
|
|
215
|
+
@Whatsapp-1: rgb(var(--Whatsapp-1, 232 255 237));
|
|
216
|
+
@Whatsapp-2: rgb(var(--Whatsapp-2, 188 246 202));
|
|
217
|
+
|
|
218
|
+
// ==================== 遗留的颜色变量 ====================
|
|
219
|
+
// 中性色
|
|
220
|
+
@brand-neutral-1: #ffffff; // 纯白
|
|
221
|
+
@brand-neutral-2: #fafafa; // 浅灰
|
|
222
|
+
@brand-neutral-3: #f5f5f5; // 中浅灰
|
|
223
|
+
@brand-neutral-4: #e8e8e8; // 中灰
|
|
224
|
+
@brand-neutral-5: #d9d9d9; // 深灰
|
|
225
|
+
|
|
226
|
+
// ==================== 布局尺寸系统 ====================
|
|
227
|
+
// 头部和导航
|
|
228
|
+
@header-height: 56px; // 头部高度
|
|
229
|
+
@header-z-index: 1000; // 头部层级
|
|
230
|
+
|
|
231
|
+
// 侧边栏
|
|
232
|
+
@sidebar-width: 256px; // 侧边栏宽度
|
|
233
|
+
@sidebar-collapsed-width: 80px; // 折叠后宽度
|
|
234
|
+
@sidebar-z-index: 999; // 侧边栏层级
|
|
235
|
+
|
|
236
|
+
// 内容区域
|
|
237
|
+
@content-padding: 24px; // 内容区域内边距
|
|
238
|
+
@content-min-height: calc(100vh - @header-height); // 内容最小高度
|
|
239
|
+
|
|
240
|
+
// 尺寸
|
|
241
|
+
@size-base: 10px; // 基础尺寸
|
|
242
|
+
|
|
243
|
+
// ==================== 间距系统 ====================
|
|
244
|
+
// 基础间距
|
|
245
|
+
@spacing-xs: 4px; // 超小间距
|
|
246
|
+
@spacing-sm: 8px; // 小间距
|
|
247
|
+
@spacing-md: 16px; // 中间距
|
|
248
|
+
@spacing-lg: 24px; // 大间距
|
|
249
|
+
@spacing-xl: 32px; // 超大间距
|
|
250
|
+
@spacing-xxl: 48px; // 特大间距
|
|
251
|
+
|
|
252
|
+
// 组件间距
|
|
253
|
+
@section-margin: @spacing-xl; // 区块间距
|
|
254
|
+
@card-padding: 20px; // 卡片内边距
|
|
255
|
+
@form-item-margin: @spacing-md; // 表单项间距
|
|
256
|
+
@button-margin: @spacing-sm; // 按钮间距
|
|
257
|
+
|
|
258
|
+
// ==================== 字体系统 ====================
|
|
259
|
+
// 字体大小
|
|
260
|
+
@font-size-xs: 10px; // 超小字体
|
|
261
|
+
@font-size-sm: 12px; // 小字体
|
|
262
|
+
@font-size-base: 14px; // 基础字体
|
|
263
|
+
@font-size-md: 16px; // 中等字体
|
|
264
|
+
@font-size-lg: 18px; // 大字体
|
|
265
|
+
@font-size-xl: 20px; // 超大字体
|
|
266
|
+
@font-size-xxl: 24px; // 特大字体
|
|
267
|
+
|
|
268
|
+
// 标题字体
|
|
269
|
+
@font-size-title: @font-size-xl; // 标题字体大小
|
|
270
|
+
@font-size-subtitle: @font-size-md; // 副标题字体大小
|
|
271
|
+
@font-size-caption: @font-size-sm; // 说明文字字体大小
|
|
272
|
+
|
|
273
|
+
// 字体权重
|
|
274
|
+
@font-weight-light: 300; // 细体
|
|
275
|
+
@font-weight-normal: 400; // 正常
|
|
276
|
+
@font-weight-medium: 510; // 中等
|
|
277
|
+
@font-weight-semibold: 590; // 半粗
|
|
278
|
+
@font-weight-bold: 700; // 粗体
|
|
279
|
+
|
|
280
|
+
// 行高
|
|
281
|
+
@line-height-tight: 1.2; // 紧密行高
|
|
282
|
+
@line-height-normal: 1.5; // 正常行高
|
|
283
|
+
@line-height-loose: 1.8; // 宽松行高
|
|
284
|
+
|
|
285
|
+
// ==================== 阴影系统 ====================
|
|
286
|
+
@shadow-light: 0 2px 8px rgba(0, 0, 0, 0.1); // 浅阴影
|
|
287
|
+
@shadow-medium: 0 4px 16px rgba(0, 0, 0, 0.15); // 中阴影
|
|
288
|
+
@shadow-heavy: 0 8px 32px rgba(0, 0, 0, 0.2); // 重阴影
|
|
289
|
+
@shadow-card: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); // 卡片阴影
|
|
290
|
+
|
|
291
|
+
// ==================== 圆角系统 ====================
|
|
292
|
+
@border-radius-xs: 2px; // 超小圆角
|
|
293
|
+
@border-radius-sm: 4px; // 小圆角
|
|
294
|
+
@border-radius-md: 6px; // 中圆角
|
|
295
|
+
@border-radius-lg: 8px; // 大圆角
|
|
296
|
+
@border-radius-xl: 12px; // 超大圆角
|
|
297
|
+
@border-radius-round: 50%; // 圆形
|
|
298
|
+
|
|
299
|
+
// 组件圆角
|
|
300
|
+
@border-radius-button: @border-radius-lg; // 按钮圆角
|
|
301
|
+
@border-radius-card: @border-radius-lg; // 卡片圆角
|
|
302
|
+
@border-radius-input: @border-radius-lg; // 输入框圆角
|
|
303
|
+
|
|
304
|
+
// ==================== 动画系统 ====================
|
|
305
|
+
// 动画时长
|
|
306
|
+
@animation-duration-fast: 0.2s; // 快速动画
|
|
307
|
+
@animation-duration-normal: 0.3s; // 正常动画
|
|
308
|
+
@animation-duration-slow: 0.5s; // 慢速动画
|
|
309
|
+
|
|
310
|
+
// 动画缓动
|
|
311
|
+
@animation-ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
312
|
+
@animation-ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
313
|
+
@animation-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
314
|
+
|
|
315
|
+
// ==================== 响应式断点 ====================
|
|
316
|
+
@screen-xs: 480px; // 超小屏幕
|
|
317
|
+
@screen-sm: 576px; // 小屏幕
|
|
318
|
+
@screen-md: 768px; // 中等屏幕
|
|
319
|
+
@screen-lg: 992px; // 大屏幕
|
|
320
|
+
@screen-xl: 1200px; // 超大屏幕
|
|
321
|
+
@screen-xxl: 1600px; // 特大屏幕
|
|
322
|
+
|
|
323
|
+
// ==================== 层级系统 ====================
|
|
324
|
+
@z-index-dropdown: 1000; // 下拉菜单
|
|
325
|
+
@z-index-sticky: 1020; // 粘性元素
|
|
326
|
+
@z-index-fixed: 1030; // 固定元素
|
|
327
|
+
@z-index-modal-backdrop: 1040; // 模态框背景
|
|
328
|
+
@z-index-modal: 1050; // 模态框
|
|
329
|
+
@z-index-popover: 1060; // 弹出框
|
|
330
|
+
@z-index-tooltip: 1070; // 工具提示
|
|
331
|
+
|
|
332
|
+
// ==================== 状态颜色 ====================
|
|
333
|
+
@status-success: @Success-6; // 成功状态
|
|
334
|
+
@status-warning: @Warning-6; // 警告状态
|
|
335
|
+
@status-error: @Danger-6; // 错误状态
|
|
336
|
+
@status-info: @cyan-6; // 信息状态
|
|
337
|
+
|
|
338
|
+
// ==================== 业务特定变量 ====================
|
|
339
|
+
// 客服相关
|
|
340
|
+
@chat-bubble-radius: @border-radius-md; // 聊天气泡圆角
|
|
341
|
+
@chat-input-height: 40px; // 聊天输入框高度
|
|
342
|
+
@message-max-width: 70%; // 消息最大宽度
|
|
343
|
+
|
|
344
|
+
// 表格相关
|
|
345
|
+
@table-header-bg: @brand-neutral-2; // 表头背景色
|
|
346
|
+
@table-row-hover-bg: @brand-neutral-2; // 表格行悬停背景
|
|
347
|
+
@table-border-color: @brand-neutral-4; // 表格边框色
|
|
348
|
+
|
|
349
|
+
// 表单相关
|
|
350
|
+
@form-label-color: @color-text-1; // 表单标签颜色
|
|
351
|
+
@form-help-color: @color-text-2; // 表单帮助文字颜色
|
|
352
|
+
@form-error-color: @Danger-6; // 表单错误颜色
|
|
353
|
+
|
|
354
|
+
@form-gap: 8px;
|
|
355
|
+
@form-padding: 8px;
|
|
356
|
+
|
|
357
|
+
// 按钮相关
|
|
358
|
+
@button-size-base: 24px;
|
|
359
|
+
@button-size-small: 16px;
|
|
360
|
+
@button-size-mini: 14px;
|
|
361
|
+
|
|
362
|
+
// 蒙层
|
|
363
|
+
@mask-background-color: rgba(0, 0, 0, 0.4);
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const fs = require('node:fs/promises');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 收集所有子应用的构建产物到根目录的 dist 目录
|
|
7
|
+
* 将 apps/{app}/dist 移动到 dist/{app}/
|
|
8
|
+
*/
|
|
9
|
+
async function collectDist() {
|
|
10
|
+
const rootDir = path.resolve(__dirname, '..');
|
|
11
|
+
const appsDir = path.join(rootDir, 'apps');
|
|
12
|
+
const distDir = path.join(rootDir, 'dist');
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
// 确保根目录的 dist 目录存在
|
|
16
|
+
await fs.mkdir(distDir, { recursive: true });
|
|
17
|
+
|
|
18
|
+
// 读取 apps 目录下的所有子目录
|
|
19
|
+
const entries = await fs.readdir(appsDir, { withFileTypes: true });
|
|
20
|
+
const apps = entries.filter((entry) => entry.isDirectory());
|
|
21
|
+
|
|
22
|
+
if (apps.length === 0) {
|
|
23
|
+
console.log('未找到任何子应用');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
console.log('开始收集构建产物...\n');
|
|
28
|
+
|
|
29
|
+
for (const app of apps) {
|
|
30
|
+
const appName = app.name;
|
|
31
|
+
const appDistPath = path.join(appsDir, appName, 'dist');
|
|
32
|
+
const targetDistPath = path.join(distDir, appName);
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
// 检查源 dist 目录是否存在
|
|
36
|
+
const stat = await fs.stat(appDistPath);
|
|
37
|
+
if (!stat.isDirectory()) {
|
|
38
|
+
console.log(`跳过 ${appName}: dist 不是目录`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 检查目标目录是否已存在,如果存在则先删除
|
|
43
|
+
try {
|
|
44
|
+
await fs.rm(targetDistPath, { recursive: true, force: true });
|
|
45
|
+
} catch {
|
|
46
|
+
// 忽略删除错误
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 移动 dist 目录到目标位置
|
|
50
|
+
await fs.rename(appDistPath, targetDistPath);
|
|
51
|
+
console.log(`✓ ${appName}: apps/${appName}/dist -> dist/${appName}/`);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (error.code === 'ENOENT') {
|
|
54
|
+
console.log(`跳过 ${appName}: 未找到 dist 目录`);
|
|
55
|
+
} else {
|
|
56
|
+
console.error(`处理 ${appName} 时出错: ${error.message}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
console.log('\n构建产物收集完成!');
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.error(`收集构建产物失败: ${error.message}`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
collectDist();
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
if [ $# -lt 1 ]; then
|
|
6
|
+
echo "用法: pnpm create:umi-app <app-name>"
|
|
7
|
+
exit 1
|
|
8
|
+
fi
|
|
9
|
+
|
|
10
|
+
APP_NAME="$1"
|
|
11
|
+
TARGET_DIR="apps/${APP_NAME}"
|
|
12
|
+
|
|
13
|
+
if [ -d "${TARGET_DIR}" ]; then
|
|
14
|
+
echo "目录 ${TARGET_DIR} 已存在,请换一个名称。"
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
echo "将在 ${TARGET_DIR} 中创建 UmiJS 4 应用..."
|
|
19
|
+
|
|
20
|
+
pnpm dlx create-umi@latest "${TARGET_DIR}"
|
|
21
|
+
|
|
22
|
+
PACKAGE_JSON="${TARGET_DIR}/package.json"
|
|
23
|
+
|
|
24
|
+
if [ -f "${PACKAGE_JSON}" ]; then
|
|
25
|
+
node - "${PACKAGE_JSON}" "${APP_NAME}" <<'NODE'
|
|
26
|
+
const fs = require('fs');
|
|
27
|
+
|
|
28
|
+
const pkgPath = process.argv[2];
|
|
29
|
+
const appName = process.argv[3];
|
|
30
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
31
|
+
|
|
32
|
+
pkg.name = appName;
|
|
33
|
+
pkg.private = true;
|
|
34
|
+
|
|
35
|
+
pkg.dependencies = Object.assign(
|
|
36
|
+
{
|
|
37
|
+
react: '^18.2.0',
|
|
38
|
+
'react-dom': '^18.2.0',
|
|
39
|
+
},
|
|
40
|
+
pkg.dependencies || {},
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
pkg.devDependencies = Object.assign(
|
|
44
|
+
{
|
|
45
|
+
'@types/react': '^18.2.48',
|
|
46
|
+
'@types/react-dom': '^18.2.18',
|
|
47
|
+
typescript: '^5.3.3',
|
|
48
|
+
},
|
|
49
|
+
pkg.devDependencies || {},
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
|
|
53
|
+
NODE
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
echo "正在安装仓库依赖..."
|
|
57
|
+
pnpm install
|
|
58
|
+
|
|
59
|
+
echo "创建完成,依赖已同步。可以通过"
|
|
60
|
+
echo " pnpm dev --filter ${APP_NAME}"
|
|
61
|
+
echo "启动新应用的开发服务器。"
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const fs = require('node:fs/promises');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const readline = require('node:readline/promises');
|
|
5
|
+
const { stdin: input, stdout: output } = require('node:process');
|
|
6
|
+
const { spawn } = require('node:child_process');
|
|
7
|
+
|
|
8
|
+
async function collectApps(appsDir) {
|
|
9
|
+
const entries = await fs.readdir(appsDir, { withFileTypes: true });
|
|
10
|
+
const apps = [];
|
|
11
|
+
for (const entry of entries) {
|
|
12
|
+
if (!entry.isDirectory()) continue;
|
|
13
|
+
const appName = entry.name;
|
|
14
|
+
const pkgPath = path.join(appsDir, appName, 'package.json');
|
|
15
|
+
try {
|
|
16
|
+
const pkgRaw = await fs.readFile(pkgPath, 'utf8');
|
|
17
|
+
const pkgJson = JSON.parse(pkgRaw);
|
|
18
|
+
if (pkgJson?.scripts?.dev) {
|
|
19
|
+
apps.push({ name: appName });
|
|
20
|
+
}
|
|
21
|
+
} catch {
|
|
22
|
+
// ignore folders without package.json
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return apps;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function resolveDotenvCli() {
|
|
29
|
+
const pnpmVirtualStore = path.resolve(
|
|
30
|
+
__dirname,
|
|
31
|
+
'..',
|
|
32
|
+
'node_modules',
|
|
33
|
+
'.pnpm',
|
|
34
|
+
);
|
|
35
|
+
let entries;
|
|
36
|
+
try {
|
|
37
|
+
entries = await fs.readdir(pnpmVirtualStore);
|
|
38
|
+
} catch (_error) {
|
|
39
|
+
throw new Error('未找到 pnpm 虚拟模块目录,请先执行 pnpm install');
|
|
40
|
+
}
|
|
41
|
+
const match = entries.find((entry) => entry.startsWith('dotenv-cli@'));
|
|
42
|
+
if (!match) {
|
|
43
|
+
throw new Error('未安装 dotenv-cli,请执行 pnpm install 以继续');
|
|
44
|
+
}
|
|
45
|
+
const cliPath = path.join(
|
|
46
|
+
pnpmVirtualStore,
|
|
47
|
+
match,
|
|
48
|
+
'node_modules',
|
|
49
|
+
'dotenv-cli',
|
|
50
|
+
'cli.js',
|
|
51
|
+
);
|
|
52
|
+
return cliPath;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function askUser(apps) {
|
|
56
|
+
output.write('请选择要启动的应用:\n');
|
|
57
|
+
apps.forEach((app, idx) => {
|
|
58
|
+
output.write(` ${idx + 1}. ${app.name}\n`);
|
|
59
|
+
});
|
|
60
|
+
const rl = readline.createInterface({ input, output });
|
|
61
|
+
try {
|
|
62
|
+
while (true) {
|
|
63
|
+
const answer = await rl.question('请输入序号后回车: ');
|
|
64
|
+
const index = Number.parseInt(answer, 10);
|
|
65
|
+
if (!Number.isNaN(index) && index >= 1 && index <= apps.length) {
|
|
66
|
+
return apps[index - 1];
|
|
67
|
+
}
|
|
68
|
+
output.write('无效的选择, 请重新输入。\n');
|
|
69
|
+
}
|
|
70
|
+
} finally {
|
|
71
|
+
rl.close();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function runDev(appName) {
|
|
76
|
+
const dotenvCli = await resolveDotenvCli();
|
|
77
|
+
const args = [
|
|
78
|
+
dotenvCli,
|
|
79
|
+
'-e',
|
|
80
|
+
'.env',
|
|
81
|
+
'-e',
|
|
82
|
+
'.env.local',
|
|
83
|
+
'-e',
|
|
84
|
+
'.env.development',
|
|
85
|
+
'-e',
|
|
86
|
+
'.env.development.local',
|
|
87
|
+
'--',
|
|
88
|
+
'pnpm',
|
|
89
|
+
'--filter',
|
|
90
|
+
appName,
|
|
91
|
+
'run',
|
|
92
|
+
'dev',
|
|
93
|
+
];
|
|
94
|
+
const child = spawn(process.execPath, args, {
|
|
95
|
+
stdio: 'inherit',
|
|
96
|
+
shell: false,
|
|
97
|
+
});
|
|
98
|
+
child.on('exit', (code, signal) => {
|
|
99
|
+
if (signal) {
|
|
100
|
+
process.kill(process.pid, signal);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
process.exit(code ?? 1);
|
|
104
|
+
});
|
|
105
|
+
child.on('error', (error) => {
|
|
106
|
+
console.error(`启动失败: ${error.message}`);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function main() {
|
|
112
|
+
try {
|
|
113
|
+
const appsDir = path.resolve(__dirname, '..', 'apps');
|
|
114
|
+
const apps = await collectApps(appsDir);
|
|
115
|
+
if (apps.length === 0) {
|
|
116
|
+
console.error('未找到可启动的应用。');
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
let targetApp;
|
|
120
|
+
if (apps.length === 1) {
|
|
121
|
+
output.write(`检测到单一应用 ${apps[0].name}, 正在启动...\n`);
|
|
122
|
+
targetApp = apps[0];
|
|
123
|
+
} else {
|
|
124
|
+
targetApp = await askUser(apps);
|
|
125
|
+
}
|
|
126
|
+
await runDev(targetApp.name);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
console.error(`执行失败: ${error.message}`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
main();
|