generator-mico-cli 0.2.1 → 0.2.2-8.beta.1

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 (159) hide show
  1. package/README.md +199 -15
  2. package/bin/mico.js +232 -27
  3. package/generators/micro-react/index.js +200 -18
  4. package/generators/micro-react/meta.json +13 -0
  5. package/generators/micro-react/templates/.commitlintrc.js +1 -0
  6. package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +14 -4
  7. package/generators/micro-react/templates/.cursor/rules/cicd-deploy.mdc +10 -8
  8. package/generators/micro-react/templates/.cursor/rules/coding-conventions.mdc +1 -1
  9. package/generators/micro-react/templates/.cursor/rules/development-guide.mdc +3 -4
  10. package/generators/micro-react/templates/.cursor/rules/layout-app.mdc +38 -31
  11. package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +7 -4
  12. package/generators/micro-react/templates/.cursor/rules/theme-system.mdc +10 -12
  13. package/generators/micro-react/templates/.eslintrc.js +25 -1
  14. package/generators/micro-react/templates/AGENTS.md +5 -2
  15. package/generators/micro-react/templates/CICD/before_build.sh +76 -0
  16. package/generators/micro-react/templates/CICD/start_dev.sh +27 -3
  17. package/generators/micro-react/templates/CICD/start_prod.sh +26 -3
  18. package/generators/micro-react/templates/CICD/start_test.sh +28 -3
  19. package/generators/micro-react/templates/CICD/wangsu_fresh_dev.sh +4 -4
  20. package/generators/micro-react/templates/CICD/wangsu_fresh_prod.sh +4 -4
  21. package/generators/micro-react/templates/CICD/wangsu_fresh_test.sh +4 -4
  22. package/generators/micro-react/templates/CLAUDE.md +16 -9
  23. package/generators/micro-react/templates/README.md +42 -4
  24. package/generators/micro-react/templates/_gitignore +4 -0
  25. package/generators/micro-react/templates/_npmrc +4 -0
  26. package/generators/micro-react/templates/apps/layout/config/config.dev.ts +32 -16
  27. package/generators/micro-react/templates/apps/layout/config/config.prod.development.ts +24 -29
  28. package/generators/micro-react/templates/apps/layout/config/config.prod.testing.ts +25 -6
  29. package/generators/micro-react/templates/apps/layout/config/config.prod.ts +16 -7
  30. package/generators/micro-react/templates/apps/layout/config/config.ts +27 -4
  31. package/generators/micro-react/templates/apps/layout/config/routes.ts +5 -5
  32. package/generators/micro-react/templates/apps/layout/docs/arch-/346/227/245/345/277/227/344/270/216/345/270/270/351/207/217.md +2 -2
  33. package/generators/micro-react/templates/apps/layout/docs/common-intl.md +372 -0
  34. package/generators/micro-react/templates/apps/layout/docs/feat-/346/236/204/345/273/272define/344/270/216/345/205/215/350/256/244/350/257/201/345/210/235/345/247/213/346/200/201.md +44 -0
  35. package/generators/micro-react/templates/apps/layout/docs/feature-404/351/241/265/351/235/242.md +103 -0
  36. package/generators/micro-react/templates/apps/layout/docs/feature-/344/270/273/351/242/230/350/211/262/345/210/207/346/215/242.md +22 -26
  37. package/generators/micro-react/templates/apps/layout/docs/feature-/345/276/256/345/211/215/347/253/257/346/250/241/345/274/217.md +185 -28
  38. package/generators/micro-react/templates/apps/layout/docs/feature-/350/217/234/345/215/225/346/235/203/351/231/220/346/216/247/345/210/266.md +308 -63
  39. package/generators/micro-react/templates/apps/layout/docs/feature-/350/267/257/347/224/261/344/270/216/350/217/234/345/215/225/350/247/243/350/200/246.md +179 -0
  40. package/generators/micro-react/templates/apps/layout/docs/fix-SSO/346/227/240/351/231/220/351/207/215/345/256/232/345/220/221.md +88 -0
  41. package/generators/micro-react/templates/apps/layout/docs/utils-timezone.md +324 -0
  42. package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +81 -61
  43. package/generators/micro-react/templates/apps/layout/mock/menus.ts +114 -4
  44. package/generators/micro-react/templates/apps/layout/mock/pages.ts +86 -0
  45. package/generators/micro-react/templates/apps/layout/package.json +7 -4
  46. package/generators/micro-react/templates/apps/layout/src/app.tsx +111 -76
  47. package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +3 -0
  48. package/generators/micro-react/templates/apps/layout/src/common/helpers.ts +177 -0
  49. package/generators/micro-react/templates/apps/layout/src/common/locale.ts +22 -17
  50. package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +192 -42
  51. package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +69 -5
  52. package/generators/micro-react/templates/apps/layout/src/common/micro/index.ts +34 -0
  53. package/generators/micro-react/templates/apps/layout/src/common/micro-prefetch.ts +109 -0
  54. package/generators/micro-react/templates/apps/layout/src/common/portal-data.ts +45 -0
  55. package/generators/micro-react/templates/apps/layout/src/common/request/config.ts +72 -10
  56. package/generators/micro-react/templates/apps/layout/src/common/request/index.ts +2 -2
  57. package/generators/micro-react/templates/apps/layout/src/common/request/interceptors.ts +31 -3
  58. package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +29 -11
  59. package/generators/micro-react/templates/apps/layout/src/common/request/url-resolver.ts +1 -1
  60. package/generators/micro-react/templates/apps/layout/src/common/route-guard.ts +345 -0
  61. package/generators/micro-react/templates/apps/layout/src/common/theme.ts +2 -4
  62. package/generators/micro-react/templates/apps/layout/src/common/upload/oss.ts +3 -4
  63. package/generators/micro-react/templates/apps/layout/src/common/upload/types.ts +1 -1
  64. package/generators/micro-react/templates/apps/layout/src/common/uploadFiles.ts +1 -1
  65. package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.less +8 -3
  66. package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.tsx +25 -8
  67. package/generators/micro-react/templates/apps/layout/src/components/HeaderDropdown/index.tsx +20 -0
  68. package/generators/micro-react/templates/apps/layout/src/components/IconFont/index.tsx +5 -6
  69. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.less +21 -6
  70. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +83 -149
  71. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/micro-app-manager.ts +569 -0
  72. package/generators/micro-react/templates/apps/layout/src/components/RightContent/AvatarDropdown.tsx +383 -0
  73. package/generators/micro-react/templates/apps/layout/src/components/RightContent/avatar-dropdown.less +35 -0
  74. package/generators/micro-react/templates/apps/layout/src/components/RightContent/index.ts +2 -0
  75. package/generators/micro-react/templates/apps/layout/src/constants/index.ts +170 -6
  76. package/generators/micro-react/templates/apps/layout/src/global.less +18 -9
  77. package/generators/micro-react/templates/apps/layout/src/hooks/useMenu.ts +3 -2
  78. package/generators/micro-react/templates/apps/layout/src/hooks/useRoutePermissionRefresh.ts +72 -0
  79. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less +3 -1
  80. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +10 -55
  81. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.less +34 -4
  82. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +24 -8
  83. package/generators/micro-react/templates/apps/layout/src/layouts/index.less +84 -13
  84. package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +156 -69
  85. package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +12 -0
  86. package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +12 -0
  87. package/generators/micro-react/templates/apps/layout/src/pages/403/index.tsx +8 -2
  88. package/generators/micro-react/templates/apps/layout/src/pages/404/index.tsx +78 -0
  89. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +3 -0
  90. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +7 -1
  91. package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.less +1 -1
  92. package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.tsx +3 -3
  93. package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +1 -1
  94. package/generators/micro-react/templates/apps/layout/src/services/config/index.ts +63 -0
  95. package/generators/micro-react/templates/apps/layout/src/services/config/type.ts +30 -0
  96. package/generators/micro-react/templates/apps/layout/src/services/user.ts +29 -2
  97. package/generators/micro-react/templates/apps/layout/tailwind.config.js +3 -0
  98. package/generators/micro-react/templates/deployDesc.md +3 -3
  99. package/generators/micro-react/templates/dev.preset.json +14 -0
  100. package/generators/micro-react/templates/docs/dev-preset.md +130 -0
  101. package/generators/micro-react/templates/package.json +21 -6
  102. package/generators/micro-react/templates/packages/common-intl/README.md +427 -0
  103. package/generators/micro-react/templates/packages/common-intl/package.json +34 -0
  104. package/generators/micro-react/templates/packages/common-intl/src/index.ts +7 -0
  105. package/generators/micro-react/templates/packages/common-intl/src/indexedDBUtils.ts +51 -0
  106. package/generators/micro-react/templates/packages/common-intl/src/intl.ts +50 -0
  107. package/generators/micro-react/templates/packages/common-intl/src/utils.ts +482 -0
  108. package/generators/micro-react/templates/packages/common-intl/tsconfig.json +22 -0
  109. package/generators/micro-react/templates/packages/common-intl/vite.config.ts +25 -0
  110. package/generators/micro-react/templates/scripts/apply-sentry-plugin.ts +45 -0
  111. package/generators/micro-react/templates/scripts/collect-dist.js +10 -0
  112. package/generators/micro-react/templates/scripts/dev-preset.js +265 -0
  113. package/generators/micro-react/templates/scripts/dev-preset.schema.json +39 -0
  114. package/generators/micro-react/templates/turbo.json +4 -1
  115. package/generators/subapp-react/index.js +326 -40
  116. package/generators/subapp-react/meta.json +10 -0
  117. package/generators/subapp-react/templates/homepage/.env +2 -1
  118. package/generators/subapp-react/templates/homepage/README.md +3 -3
  119. package/generators/subapp-react/templates/homepage/config/config.dev.ts +14 -7
  120. package/generators/subapp-react/templates/homepage/config/config.prod.development.ts +16 -5
  121. package/generators/subapp-react/templates/homepage/config/config.prod.testing.ts +16 -5
  122. package/generators/subapp-react/templates/homepage/config/config.prod.ts +14 -5
  123. package/generators/subapp-react/templates/homepage/config/config.ts +21 -0
  124. package/generators/subapp-react/templates/homepage/config/routes.ts +2 -2
  125. package/generators/subapp-react/templates/homepage/mock/api.mock.ts +2 -2
  126. package/generators/subapp-react/templates/homepage/package.json +7 -4
  127. package/generators/subapp-react/templates/homepage/src/app.tsx +18 -27
  128. package/generators/subapp-react/templates/homepage/src/common/request.ts +29 -2
  129. package/generators/subapp-react/templates/homepage/src/global.less +6 -5
  130. package/generators/subapp-react/templates/homepage/src/pages/index.less +3 -3
  131. package/generators/subapp-react/templates/homepage/src/pages/index.tsx +99 -60
  132. package/generators/subapp-react/templates/homepage/src/styles/theme.less +1 -1
  133. package/generators/subapp-umd/ignore-list.json +5 -0
  134. package/generators/subapp-umd/index.js +309 -0
  135. package/generators/subapp-umd/meta.json +11 -0
  136. package/generators/subapp-umd/templates/README.md +94 -0
  137. package/generators/subapp-umd/templates/package.json +35 -0
  138. package/generators/subapp-umd/templates/public/index.html +34 -0
  139. package/generators/subapp-umd/templates/src/App.less +15 -0
  140. package/generators/subapp-umd/templates/src/App.tsx +13 -0
  141. package/generators/subapp-umd/templates/src/index.ts +2 -0
  142. package/generators/subapp-umd/templates/tsconfig.json +27 -0
  143. package/generators/subapp-umd/templates/webpack.config.js +70 -0
  144. package/lib/utils.js +332 -2
  145. package/package.json +15 -2
  146. package/generators/micro-react/templates/apps/layout/mock/menus.json +0 -100
  147. package/generators/micro-react/templates/apps/layout/src/common/constants.ts +0 -38
  148. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/container-manager.ts +0 -202
  149. package/generators/micro-react/templates/packages/shared-styles/README.md +0 -124
  150. package/generators/micro-react/templates/packages/shared-styles/arco-design-mobile-override.less +0 -91
  151. package/generators/micro-react/templates/packages/shared-styles/arco-override.less +0 -119
  152. package/generators/micro-react/templates/packages/shared-styles/index.d.ts +0 -44
  153. package/generators/micro-react/templates/packages/shared-styles/index.less +0 -13
  154. package/generators/micro-react/templates/packages/shared-styles/package.json +0 -30
  155. package/generators/micro-react/templates/packages/shared-styles/theme-inject.less +0 -10
  156. package/generators/micro-react/templates/packages/shared-styles/themes/dark/custom-var.less +0 -290
  157. package/generators/micro-react/templates/packages/shared-styles/themes/normal/custom-var.less +0 -269
  158. package/generators/micro-react/templates/packages/shared-styles/variables-only.less +0 -433
  159. package/generators/micro-react/templates/packages/shared-styles/variables.less +0 -452
@@ -0,0 +1,265 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 多应用并行启动脚本
4
+ *
5
+ * 用法:
6
+ * pnpm dev:preset # 使用默认预设
7
+ * pnpm dev:preset <preset> # 使用指定预设
8
+ * pnpm dev:preset --list # 列出所有预设
9
+ * pnpm dev:preset --config # 显示配置文件路径
10
+ */
11
+ const fs = require('node:fs/promises');
12
+ const path = require('node:path');
13
+ const { spawn } = require('node:child_process');
14
+
15
+ const CONFIG_FILE = 'dev.preset.json';
16
+ const ROOT_DIR = path.resolve(__dirname, '..');
17
+ const APPS_DIR = path.join(ROOT_DIR, 'apps');
18
+
19
+ // 颜色代码
20
+ const colors = {
21
+ reset: '\x1b[0m',
22
+ cyan: '\x1b[36m',
23
+ yellow: '\x1b[33m',
24
+ green: '\x1b[32m',
25
+ red: '\x1b[31m',
26
+ gray: '\x1b[90m',
27
+ magenta: '\x1b[35m',
28
+ blue: '\x1b[34m',
29
+ };
30
+
31
+ // 为不同应用分配不同颜色
32
+ const appColors = [
33
+ '\x1b[36m', // cyan
34
+ '\x1b[33m', // yellow
35
+ '\x1b[32m', // green
36
+ '\x1b[35m', // magenta
37
+ '\x1b[34m', // blue
38
+ '\x1b[91m', // bright red
39
+ '\x1b[92m', // bright green
40
+ '\x1b[93m', // bright yellow
41
+ ];
42
+
43
+ async function loadConfig() {
44
+ const configPath = path.join(ROOT_DIR, CONFIG_FILE);
45
+ try {
46
+ const raw = await fs.readFile(configPath, 'utf8');
47
+ return JSON.parse(raw);
48
+ } catch (error) {
49
+ if (error.code === 'ENOENT') {
50
+ console.error(`${colors.red}错误: 未找到配置文件 ${CONFIG_FILE}${colors.reset}`);
51
+ console.error(`${colors.gray}请在项目根目录创建 ${CONFIG_FILE} 文件${colors.reset}`);
52
+ process.exit(1);
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+
58
+ async function collectApps() {
59
+ const entries = await fs.readdir(APPS_DIR, { withFileTypes: true });
60
+ const apps = [];
61
+ for (const entry of entries) {
62
+ if (!entry.isDirectory()) continue;
63
+ const pkgPath = path.join(APPS_DIR, entry.name, 'package.json');
64
+ try {
65
+ const pkgRaw = await fs.readFile(pkgPath, 'utf8');
66
+ const pkgJson = JSON.parse(pkgRaw);
67
+ if (pkgJson?.scripts?.dev) {
68
+ apps.push(entry.name);
69
+ }
70
+ } catch {
71
+ // ignore
72
+ }
73
+ }
74
+ return apps;
75
+ }
76
+
77
+ async function resolveDotenvCli() {
78
+ const pnpmVirtualStore = path.join(ROOT_DIR, 'node_modules', '.pnpm');
79
+ let entries;
80
+ try {
81
+ entries = await fs.readdir(pnpmVirtualStore);
82
+ } catch {
83
+ throw new Error('未找到 pnpm 虚拟模块目录,请先执行 pnpm install');
84
+ }
85
+ const match = entries.find((entry) => entry.startsWith('dotenv-cli@'));
86
+ if (!match) {
87
+ throw new Error('未安装 dotenv-cli,请执行 pnpm install');
88
+ }
89
+ return path.join(pnpmVirtualStore, match, 'node_modules', 'dotenv-cli', 'cli.js');
90
+ }
91
+
92
+ function listPresets(config) {
93
+ console.log(`\n${colors.cyan}可用的预设列表:${colors.reset}\n`);
94
+
95
+ const defaultPreset = config.default;
96
+ for (const [name, preset] of Object.entries(config.presets)) {
97
+ const isDefault = name === defaultPreset;
98
+ const marker = isDefault ? ` ${colors.green}(默认)${colors.reset}` : '';
99
+ const desc = preset.description || '';
100
+ console.log(` ${colors.yellow}${name}${colors.reset}${marker}`);
101
+ if (desc) {
102
+ console.log(` ${colors.gray}${desc}${colors.reset}`);
103
+ }
104
+ console.log(` ${colors.gray}应用: ${preset.apps.join(', ')}${colors.reset}`);
105
+ console.log();
106
+ }
107
+
108
+ console.log(`${colors.gray}使用方式: pnpm dev:preset <预设名>${colors.reset}`);
109
+ console.log(`${colors.gray}配置文件: ${CONFIG_FILE}${colors.reset}\n`);
110
+ }
111
+
112
+ function printBanner(presetName, apps) {
113
+ const title = `dev:preset [${presetName}]`;
114
+ const appList = apps.join(', ');
115
+ console.log(`
116
+ ${colors.cyan}╭${'─'.repeat(Math.max(title.length, appList.length) + 10)}╮
117
+ │ 🚀 ${title.padEnd(Math.max(title.length, appList.length) + 5)}│
118
+ │ 📦 ${appList.padEnd(Math.max(title.length, appList.length) + 5)}│
119
+ ╰${'─'.repeat(Math.max(title.length, appList.length) + 10)}╯${colors.reset}
120
+ `);
121
+ }
122
+
123
+ function createPrefixedStream(appName, color, stream) {
124
+ const prefix = `${color}[${appName}]${colors.reset} `;
125
+ let buffer = '';
126
+
127
+ return (chunk) => {
128
+ buffer += chunk.toString();
129
+ const lines = buffer.split('\n');
130
+ buffer = lines.pop() || '';
131
+ for (const line of lines) {
132
+ stream.write(prefix + line + '\n');
133
+ }
134
+ };
135
+ }
136
+
137
+ async function startApp(appName, dotenvCli, color) {
138
+ const args = [
139
+ dotenvCli,
140
+ '-e', '.env',
141
+ '-e', '.env.local',
142
+ '-e', '.env.development',
143
+ '-e', '.env.development.local',
144
+ '--',
145
+ 'pnpm', '--filter', appName, 'run', 'dev',
146
+ ];
147
+
148
+ const child = spawn(process.execPath, args, {
149
+ stdio: ['inherit', 'pipe', 'pipe'],
150
+ cwd: ROOT_DIR,
151
+ });
152
+
153
+ const stdoutHandler = createPrefixedStream(appName, color, process.stdout);
154
+ const stderrHandler = createPrefixedStream(appName, color, process.stderr);
155
+
156
+ child.stdout.on('data', stdoutHandler);
157
+ child.stderr.on('data', stderrHandler);
158
+
159
+ child.on('error', (error) => {
160
+ console.error(`${color}[${appName}]${colors.reset} ${colors.red}启动失败: ${error.message}${colors.reset}`);
161
+ });
162
+
163
+ return child;
164
+ }
165
+
166
+ async function main() {
167
+ const args = process.argv.slice(2);
168
+ const config = await loadConfig();
169
+
170
+ // 处理 --list 参数
171
+ if (args.includes('--list') || args.includes('list')) {
172
+ listPresets(config);
173
+ return;
174
+ }
175
+
176
+ // 处理 --config 参数
177
+ if (args.includes('--config')) {
178
+ console.log(path.join(ROOT_DIR, CONFIG_FILE));
179
+ return;
180
+ }
181
+
182
+ // 确定要使用的预设
183
+ const presetName = args[0] || config.default;
184
+ if (!presetName) {
185
+ console.error(`${colors.red}错误: 未指定预设,且配置中未设置默认预设${colors.reset}`);
186
+ console.error(`${colors.gray}使用 --list 查看可用预设${colors.reset}`);
187
+ process.exit(1);
188
+ }
189
+
190
+ const preset = config.presets[presetName];
191
+ if (!preset) {
192
+ console.error(`${colors.red}错误: 未找到预设 "${presetName}"${colors.reset}`);
193
+ console.error(`${colors.gray}可用预设: ${Object.keys(config.presets).join(', ')}${colors.reset}`);
194
+ process.exit(1);
195
+ }
196
+
197
+ const appsToStart = preset.apps;
198
+ if (!appsToStart || appsToStart.length === 0) {
199
+ console.error(`${colors.red}错误: 预设 "${presetName}" 中未配置任何应用${colors.reset}`);
200
+ process.exit(1);
201
+ }
202
+
203
+ // 验证应用是否存在
204
+ const availableApps = await collectApps();
205
+ const invalidApps = appsToStart.filter((app) => !availableApps.includes(app));
206
+ if (invalidApps.length > 0) {
207
+ console.error(`${colors.red}错误: 以下应用不存在或没有 dev 脚本: ${invalidApps.join(', ')}${colors.reset}`);
208
+ console.error(`${colors.gray}可用应用: ${availableApps.join(', ')}${colors.reset}`);
209
+ process.exit(1);
210
+ }
211
+
212
+ // 显示启动 banner
213
+ printBanner(presetName, appsToStart);
214
+
215
+ // 启动所有应用
216
+ const dotenvCli = await resolveDotenvCli();
217
+ const children = [];
218
+
219
+ for (let i = 0; i < appsToStart.length; i++) {
220
+ const appName = appsToStart[i];
221
+ const color = appColors[i % appColors.length];
222
+ console.log(`${color}[${appName}]${colors.reset} 正在启动...`);
223
+ const child = await startApp(appName, dotenvCli, color);
224
+ children.push({ name: appName, process: child });
225
+ }
226
+
227
+ // 处理 Ctrl+C,同时终止所有子进程
228
+ const cleanup = (signal) => {
229
+ console.log(`\n${colors.yellow}正在停止所有应用...${colors.reset}`);
230
+ for (const { name, process: child } of children) {
231
+ if (!child.killed) {
232
+ console.log(`${colors.gray}停止 ${name}...${colors.reset}`);
233
+ child.kill(signal);
234
+ }
235
+ }
236
+ };
237
+
238
+ process.on('SIGINT', () => cleanup('SIGINT'));
239
+ process.on('SIGTERM', () => cleanup('SIGTERM'));
240
+
241
+ // 监听子进程退出
242
+ let exitedCount = 0;
243
+ for (const { name, process: child } of children) {
244
+ child.on('exit', (code, signal) => {
245
+ exitedCount++;
246
+ if (signal) {
247
+ console.log(`${colors.gray}[${name}] 被信号 ${signal} 终止${colors.reset}`);
248
+ } else if (code !== 0) {
249
+ console.log(`${colors.red}[${name}] 退出,代码: ${code}${colors.reset}`);
250
+ } else {
251
+ console.log(`${colors.green}[${name}] 正常退出${colors.reset}`);
252
+ }
253
+
254
+ // 所有进程都退出后,主进程也退出
255
+ if (exitedCount === children.length) {
256
+ process.exit(0);
257
+ }
258
+ });
259
+ }
260
+ }
261
+
262
+ main().catch((error) => {
263
+ console.error(`${colors.red}执行失败: ${error.message}${colors.reset}`);
264
+ process.exit(1);
265
+ });
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Dev Preset Configuration",
4
+ "description": "多应用并行启动预设配置",
5
+ "type": "object",
6
+ "required": ["presets"],
7
+ "properties": {
8
+ "$schema": {
9
+ "type": "string",
10
+ "description": "JSON Schema 引用"
11
+ },
12
+ "presets": {
13
+ "type": "object",
14
+ "description": "预设配置列表",
15
+ "additionalProperties": {
16
+ "type": "object",
17
+ "required": ["apps"],
18
+ "properties": {
19
+ "description": {
20
+ "type": "string",
21
+ "description": "预设描述"
22
+ },
23
+ "apps": {
24
+ "type": "array",
25
+ "description": "要启动的应用列表",
26
+ "items": {
27
+ "type": "string"
28
+ },
29
+ "minItems": 1
30
+ }
31
+ }
32
+ }
33
+ },
34
+ "default": {
35
+ "type": "string",
36
+ "description": "默认使用的预设名称"
37
+ }
38
+ }
39
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://turbo.build/schema.json",
3
- "globalEnv": ["CDN_PUBLIC_PATH"],
3
+ "globalEnv": ["CDN_PUBLIC_PATH", "SENTRY_AUTH_TOKEN"],
4
4
  "tasks": {
5
5
  "build": {
6
6
  "dependsOn": ["^build"],
@@ -61,6 +61,9 @@
61
61
  "lint:fix": {
62
62
  "outputs": []
63
63
  },
64
+ "check-types": {
65
+ "outputs": []
66
+ },
64
67
  "test": {
65
68
  "outputs": []
66
69
  }