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.
Files changed (155) hide show
  1. package/README.md +84 -0
  2. package/bin/mico.js +316 -0
  3. package/generators/micro-react/ignore-list.json +8 -0
  4. package/generators/micro-react/index.js +158 -0
  5. package/generators/micro-react/templates/.commitlintrc.js +6 -0
  6. package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +129 -0
  7. package/generators/micro-react/templates/.cursor/rules/cicd-deploy.mdc +143 -0
  8. package/generators/micro-react/templates/.cursor/rules/coding-conventions.mdc +206 -0
  9. package/generators/micro-react/templates/.cursor/rules/commit-conventions.mdc +111 -0
  10. package/generators/micro-react/templates/.cursor/rules/development-guide.mdc +295 -0
  11. package/generators/micro-react/templates/.cursor/rules/layout-app.mdc +275 -0
  12. package/generators/micro-react/templates/.cursor/rules/micro-frontend.mdc +196 -0
  13. package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +128 -0
  14. package/generators/micro-react/templates/.cursor/rules/request-auth.mdc +220 -0
  15. package/generators/micro-react/templates/.cursor/rules/theme-system.mdc +206 -0
  16. package/generators/micro-react/templates/.editorconfig +16 -0
  17. package/generators/micro-react/templates/.env +3 -0
  18. package/generators/micro-react/templates/.eslintrc.js +30 -0
  19. package/generators/micro-react/templates/.husky/commit-msg +2 -0
  20. package/generators/micro-react/templates/.husky/pre-commit +2 -0
  21. package/generators/micro-react/templates/.lintstagedrc +5 -0
  22. package/generators/micro-react/templates/.stylelintrc.js +25 -0
  23. package/generators/micro-react/templates/AGENTS.md +39 -0
  24. package/generators/micro-react/templates/CICD/start_dev.sh +30 -0
  25. package/generators/micro-react/templates/CICD/start_local.sh +30 -0
  26. package/generators/micro-react/templates/CICD/start_prod.sh +30 -0
  27. package/generators/micro-react/templates/CICD/start_test.sh +30 -0
  28. package/generators/micro-react/templates/CICD/wangsu_fresh_dev.sh +19 -0
  29. package/generators/micro-react/templates/CICD/wangsu_fresh_prod.sh +19 -0
  30. package/generators/micro-react/templates/CICD/wangsu_fresh_test.sh +19 -0
  31. package/generators/micro-react/templates/CLAUDE.md +106 -0
  32. package/generators/micro-react/templates/README.md +84 -0
  33. package/generators/micro-react/templates/_gitignore +57 -0
  34. package/generators/micro-react/templates/_npmrc +2 -0
  35. package/generators/micro-react/templates/apps/layout/.env +4 -0
  36. package/generators/micro-react/templates/apps/layout/.eslintrc.js +10 -0
  37. package/generators/micro-react/templates/apps/layout/.lintstagedrc +17 -0
  38. package/generators/micro-react/templates/apps/layout/.prettierignore +3 -0
  39. package/generators/micro-react/templates/apps/layout/.prettierrc +8 -0
  40. package/generators/micro-react/templates/apps/layout/.stylelintrc.js +20 -0
  41. package/generators/micro-react/templates/apps/layout/README.md +37 -0
  42. package/generators/micro-react/templates/apps/layout/config/config.dev.ts +54 -0
  43. package/generators/micro-react/templates/apps/layout/config/config.prod.ts +37 -0
  44. package/generators/micro-react/templates/apps/layout/config/config.testing.ts +27 -0
  45. package/generators/micro-react/templates/apps/layout/config/config.ts +132 -0
  46. package/generators/micro-react/templates/apps/layout/config/routes.ts +13 -0
  47. package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +78 -0
  48. package/generators/micro-react/templates/apps/layout/mock/menus.json +100 -0
  49. package/generators/micro-react/templates/apps/layout/mock/menus.ts +11 -0
  50. package/generators/micro-react/templates/apps/layout/mock/user.mock.ts +20 -0
  51. package/generators/micro-react/templates/apps/layout/package.json +45 -0
  52. package/generators/micro-react/templates/apps/layout/public/font/ar-SA.js +54 -0
  53. package/generators/micro-react/templates/apps/layout/public/font/default.js +54 -0
  54. package/generators/micro-react/templates/apps/layout/src/app.tsx +123 -0
  55. package/generators/micro-react/templates/apps/layout/src/assets/.gitkeep +0 -0
  56. package/generators/micro-react/templates/apps/layout/src/common/auth/cs-auth-manager.ts +220 -0
  57. package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +41 -0
  58. package/generators/micro-react/templates/apps/layout/src/common/auth/tool.ts +3 -0
  59. package/generators/micro-react/templates/apps/layout/src/common/auth/type.ts +6 -0
  60. package/generators/micro-react/templates/apps/layout/src/common/constants.ts +38 -0
  61. package/generators/micro-react/templates/apps/layout/src/common/env.ts +73 -0
  62. package/generators/micro-react/templates/apps/layout/src/common/helpers.ts +69 -0
  63. package/generators/micro-react/templates/apps/layout/src/common/locale.ts +123 -0
  64. package/generators/micro-react/templates/apps/layout/src/common/logger.ts +45 -0
  65. package/generators/micro-react/templates/apps/layout/src/common/menu/index.ts +2 -0
  66. package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +143 -0
  67. package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +92 -0
  68. package/generators/micro-react/templates/apps/layout/src/common/request/config.ts +73 -0
  69. package/generators/micro-react/templates/apps/layout/src/common/request/index.ts +188 -0
  70. package/generators/micro-react/templates/apps/layout/src/common/request/interceptors.ts +186 -0
  71. package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +132 -0
  72. package/generators/micro-react/templates/apps/layout/src/common/request/token-refresh.ts +136 -0
  73. package/generators/micro-react/templates/apps/layout/src/common/request/types.ts +44 -0
  74. package/generators/micro-react/templates/apps/layout/src/common/request/url-resolver.ts +75 -0
  75. package/generators/micro-react/templates/apps/layout/src/common/theme.ts +107 -0
  76. package/generators/micro-react/templates/apps/layout/src/common/types.ts +7 -0
  77. package/generators/micro-react/templates/apps/layout/src/common/upload/index.ts +2 -0
  78. package/generators/micro-react/templates/apps/layout/src/common/upload/oss.ts +401 -0
  79. package/generators/micro-react/templates/apps/layout/src/common/upload/types.ts +47 -0
  80. package/generators/micro-react/templates/apps/layout/src/common/uploadFiles.ts +35 -0
  81. package/generators/micro-react/templates/apps/layout/src/components/IconFont/index.tsx +25 -0
  82. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.less +44 -0
  83. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +121 -0
  84. package/generators/micro-react/templates/apps/layout/src/constants/index.ts +15 -0
  85. package/generators/micro-react/templates/apps/layout/src/global.less +13 -0
  86. package/generators/micro-react/templates/apps/layout/src/hooks/index.ts +3 -0
  87. package/generators/micro-react/templates/apps/layout/src/hooks/useAuth.ts +75 -0
  88. package/generators/micro-react/templates/apps/layout/src/hooks/useMenu.ts +35 -0
  89. package/generators/micro-react/templates/apps/layout/src/hooks/useMenuState.ts +112 -0
  90. package/generators/micro-react/templates/apps/layout/src/hooks/useTheme.ts +124 -0
  91. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less +109 -0
  92. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +97 -0
  93. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.less +164 -0
  94. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +165 -0
  95. package/generators/micro-react/templates/apps/layout/src/layouts/index.less +71 -0
  96. package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +91 -0
  97. package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +20 -0
  98. package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +19 -0
  99. package/generators/micro-react/templates/apps/layout/src/models/global.ts +13 -0
  100. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +3 -0
  101. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +7 -0
  102. package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +171 -0
  103. package/generators/micro-react/templates/apps/layout/src/services/auth.ts +37 -0
  104. package/generators/micro-react/templates/apps/layout/src/services/oss.ts +40 -0
  105. package/generators/micro-react/templates/apps/layout/src/styles/arco-override.less +78 -0
  106. package/generators/micro-react/templates/apps/layout/src/styles/themes/dark/custom-var.less +244 -0
  107. package/generators/micro-react/templates/apps/layout/src/styles/themes/normal/custom-var.less +195 -0
  108. package/generators/micro-react/templates/apps/layout/src/styles/variables.less +5 -0
  109. package/generators/micro-react/templates/apps/layout/src/utils/format.ts +4 -0
  110. package/generators/micro-react/templates/apps/layout/tailwind.config.js +7 -0
  111. package/generators/micro-react/templates/apps/layout/tailwind.css +3 -0
  112. package/generators/micro-react/templates/apps/layout/tsconfig.json +3 -0
  113. package/generators/micro-react/templates/apps/layout/typings.d.ts +1 -0
  114. package/generators/micro-react/templates/deployDesc.md +60 -0
  115. package/generators/micro-react/templates/docs/commit-message.md +98 -0
  116. package/generators/micro-react/templates/package.json +35 -0
  117. package/generators/micro-react/templates/packages/shared-styles/README.md +125 -0
  118. package/generators/micro-react/templates/packages/shared-styles/arco-override.less +78 -0
  119. package/generators/micro-react/templates/packages/shared-styles/index.less +14 -0
  120. package/generators/micro-react/templates/packages/shared-styles/package.json +27 -0
  121. package/generators/micro-react/templates/packages/shared-styles/theme-inject.less +10 -0
  122. package/generators/micro-react/templates/packages/shared-styles/themes/dark/custom-var.less +246 -0
  123. package/generators/micro-react/templates/packages/shared-styles/themes/normal/custom-var.less +195 -0
  124. package/generators/micro-react/templates/packages/shared-styles/variables-only.less +301 -0
  125. package/generators/micro-react/templates/packages/shared-styles/variables.less +363 -0
  126. package/generators/micro-react/templates/pnpm-workspace.yaml +9 -0
  127. package/generators/micro-react/templates/scripts/collect-dist.js +68 -0
  128. package/generators/micro-react/templates/scripts/create-umi-app.sh +61 -0
  129. package/generators/micro-react/templates/scripts/dev.js +133 -0
  130. package/generators/micro-react/templates/turbo.json +68 -0
  131. package/generators/subapp-react/ignore-list.json +7 -0
  132. package/generators/subapp-react/index.js +189 -0
  133. package/generators/subapp-react/templates/homepage/.env +4 -0
  134. package/generators/subapp-react/templates/homepage/README.md +116 -0
  135. package/generators/subapp-react/templates/homepage/_gitignore +9 -0
  136. package/generators/subapp-react/templates/homepage/config/config.dev.ts +59 -0
  137. package/generators/subapp-react/templates/homepage/config/config.prod.ts +41 -0
  138. package/generators/subapp-react/templates/homepage/config/config.testing.ts +40 -0
  139. package/generators/subapp-react/templates/homepage/config/config.ts +102 -0
  140. package/generators/subapp-react/templates/homepage/config/routes.ts +7 -0
  141. package/generators/subapp-react/templates/homepage/mock/api.mock.ts +59 -0
  142. package/generators/subapp-react/templates/homepage/package.json +30 -0
  143. package/generators/subapp-react/templates/homepage/src/app.tsx +80 -0
  144. package/generators/subapp-react/templates/homepage/src/assets/yay.jpg +0 -0
  145. package/generators/subapp-react/templates/homepage/src/common/logger.ts +42 -0
  146. package/generators/subapp-react/templates/homepage/src/common/mainApp.ts +53 -0
  147. package/generators/subapp-react/templates/homepage/src/common/request.ts +49 -0
  148. package/generators/subapp-react/templates/homepage/src/global.less +26 -0
  149. package/generators/subapp-react/templates/homepage/src/pages/index.less +139 -0
  150. package/generators/subapp-react/templates/homepage/src/pages/index.tsx +342 -0
  151. package/generators/subapp-react/templates/homepage/src/styles/theme.less +6 -0
  152. package/generators/subapp-react/templates/homepage/tsconfig.json +3 -0
  153. package/generators/subapp-react/templates/homepage/typings.d.ts +17 -0
  154. package/lib/utils.js +165 -0
  155. package/package.json +31 -0
@@ -0,0 +1,342 @@
1
+ import { getRequestSource, request } from '@/common/request';
2
+ import {
3
+ Alert,
4
+ Button,
5
+ Card,
6
+ Descriptions,
7
+ Divider,
8
+ Message,
9
+ Space,
10
+ Spin,
11
+ Switch,
12
+ Table,
13
+ Tag,
14
+ Typography,
15
+ } from '@arco-design/web-react';
16
+ import { IconMoon, IconRefresh, IconSun } from '@arco-design/web-react/icon';
17
+ import { useState } from 'react';
18
+ import './index.less';
19
+
20
+ const { Title, Paragraph, Text } = Typography;
21
+
22
+ // 定义响应类型
23
+ interface IUserInfo {
24
+ id: number;
25
+ name: string;
26
+ email: string;
27
+ avatar: string;
28
+ role: string;
29
+ department: string;
30
+ }
31
+
32
+ interface IStatsData {
33
+ totalUsers: number;
34
+ activeUsers: number;
35
+ pendingTasks: number;
36
+ completedTasks: number;
37
+ lastUpdated: string;
38
+ }
39
+
40
+ interface IListItem {
41
+ id: number;
42
+ title: string;
43
+ status: 'pending' | 'approved' | 'rejected';
44
+ createdAt: string;
45
+ }
46
+
47
+ /**
48
+ * 主题色变量 & Arco Design 组件使用示例
49
+ *
50
+ * 子应用使用主题色变量和 Arco Design 的方式:
51
+ * 1. 在 config.ts 中配置 externals,将 react/react-dom/@arco-design/web-react 排除打包
52
+ * 2. 运行时从主应用的 window.React / window.arco 获取
53
+ * 3. 在 global.less 中导入 @import '<%= packageScope %>/shared-styles/variables-only';
54
+ * 4. Less 变量自动适配主应用的主题切换
55
+ */
56
+ export default function HomePage() {
57
+ const [loading, setLoading] = useState(false);
58
+ const [userInfo, setUserInfo] = useState<IUserInfo | null>(null);
59
+ const [stats, setStats] = useState<IStatsData | null>(null);
60
+ const [listData, setListData] = useState<IListItem[]>([]);
61
+
62
+ // 获取用户信息
63
+ const fetchUserInfo = async () => {
64
+ setLoading(true);
65
+ try {
66
+ const res = await request<{ success: boolean; data: IUserInfo }>('/api/user/info');
67
+ if (res.success) {
68
+ setUserInfo(res.data);
69
+ Message.success('获取用户信息成功');
70
+ }
71
+ } catch (err) {
72
+ Message.error('获取用户信息失败');
73
+ console.error(err);
74
+ } finally {
75
+ setLoading(false);
76
+ }
77
+ };
78
+
79
+ // 获取统计数据
80
+ const fetchStats = async () => {
81
+ setLoading(true);
82
+ try {
83
+ const res = await request<{ success: boolean; data: IStatsData }>('/api/dashboard/stats');
84
+ if (res.success) {
85
+ setStats(res.data);
86
+ Message.success('获取统计数据成功');
87
+ }
88
+ } catch (err) {
89
+ Message.error('获取统计数据失败');
90
+ console.error(err);
91
+ } finally {
92
+ setLoading(false);
93
+ }
94
+ };
95
+
96
+ // 获取列表数据
97
+ const fetchList = async () => {
98
+ setLoading(true);
99
+ try {
100
+ const res = await request<{ success: boolean; data: { list: IListItem[] } }>('/api/items');
101
+ if (res.success) {
102
+ setListData(res.data.list);
103
+ Message.success('获取列表数据成功');
104
+ }
105
+ } catch (err) {
106
+ Message.error('获取列表数据失败');
107
+ console.error(err);
108
+ } finally {
109
+ setLoading(false);
110
+ }
111
+ };
112
+
113
+ // 状态颜色映射
114
+ const statusColorMap = {
115
+ pending: 'orange',
116
+ approved: 'green',
117
+ rejected: 'red',
118
+ };
119
+
120
+ const statusTextMap = {
121
+ pending: '待审核',
122
+ approved: '已通过',
123
+ rejected: '已拒绝',
124
+ };
125
+
126
+ const showMessage = () => {
127
+ Message.success('Arco Design Message 组件正常工作!');
128
+ };
129
+
130
+ return (
131
+ <div className="homepage">
132
+ <Title heading={2}>🎨 子应用主题 & 组件示例</Title>
133
+ <Paragraph type="secondary">
134
+ 子应用复用主应用的 React 和 Arco Design,无重复打包,主题自动同步
135
+ </Paragraph>
136
+
137
+ <Divider />
138
+
139
+ {/* 请求示例 */}
140
+ <Spin loading={loading} style={{ display: 'block' }}>
141
+ <Card
142
+ title="🔗 Request 请求示例"
143
+ style={{ marginBottom: 16 }}
144
+ extra={
145
+ <Tag color={getRequestSource() === 'main-app' ? 'green' : 'blue'}>
146
+ {getRequestSource() === 'main-app' ? '使用主应用 Request' : '使用 Umi Request'}
147
+ </Tag>
148
+ }
149
+ >
150
+ <Paragraph>
151
+ 子应用优先使用主应用传递的 <Text code>request</Text> 实例,独立运行时使用 Umi
152
+ 内置的 request。两种模式都支持 Mock。
153
+ </Paragraph>
154
+
155
+ <Space size="medium" style={{ marginTop: 16 }}>
156
+ <Button type="primary" icon={<IconRefresh />} onClick={fetchUserInfo}>
157
+ 获取用户信息
158
+ </Button>
159
+ <Button type="secondary" icon={<IconRefresh />} onClick={fetchStats}>
160
+ 获取统计数据
161
+ </Button>
162
+ <Button type="outline" icon={<IconRefresh />} onClick={fetchList}>
163
+ 获取列表数据
164
+ </Button>
165
+ </Space>
166
+
167
+ {/* 用户信息展示 */}
168
+ {userInfo && (
169
+ <>
170
+ <Divider />
171
+ <Title heading={6}>用户信息</Title>
172
+ <Descriptions
173
+ column={2}
174
+ data={[
175
+ { label: 'ID', value: userInfo.id },
176
+ { label: '姓名', value: userInfo.name },
177
+ { label: '邮箱', value: userInfo.email },
178
+ { label: '角色', value: <Tag color="arcoblue">{userInfo.role}</Tag> },
179
+ { label: '部门', value: userInfo.department },
180
+ ]}
181
+ />
182
+ </>
183
+ )}
184
+
185
+ {/* 统计数据展示 */}
186
+ {stats && (
187
+ <>
188
+ <Divider />
189
+ <Title heading={6}>统计数据</Title>
190
+ <Descriptions
191
+ column={2}
192
+ data={[
193
+ { label: '总用户数', value: stats.totalUsers.toLocaleString() },
194
+ { label: '活跃用户', value: stats.activeUsers.toLocaleString() },
195
+ { label: '待处理任务', value: <Tag color="orange">{stats.pendingTasks}</Tag> },
196
+ { label: '已完成任务', value: <Tag color="green">{stats.completedTasks}</Tag> },
197
+ { label: '更新时间', value: new Date(stats.lastUpdated).toLocaleString() },
198
+ ]}
199
+ />
200
+ </>
201
+ )}
202
+
203
+ {/* 列表数据展示 */}
204
+ {listData.length > 0 && (
205
+ <>
206
+ <Divider />
207
+ <Title heading={6}>列表数据</Title>
208
+ <Table
209
+ size="small"
210
+ pagination={false}
211
+ columns={[
212
+ { title: 'ID', dataIndex: 'id', width: 80 },
213
+ { title: '标题', dataIndex: 'title' },
214
+ {
215
+ title: '状态',
216
+ dataIndex: 'status',
217
+ width: 100,
218
+ render: (status: keyof typeof statusColorMap) => (
219
+ <Tag color={statusColorMap[status]}>{statusTextMap[status]}</Tag>
220
+ ),
221
+ },
222
+ { title: '创建时间', dataIndex: 'createdAt', width: 180 },
223
+ ]}
224
+ data={listData}
225
+ />
226
+ </>
227
+ )}
228
+ </Card>
229
+ </Spin>
230
+
231
+ {/* Arco Design 组件示例 */}
232
+ <Card title="📦 Arco Design 组件" style={{ marginBottom: 16 }}>
233
+ <Paragraph>
234
+ 子应用通过 <Text code>externals</Text> 配置复用主应用的 Arco Design,
235
+ 避免重复打包(节省 ~800KB)。
236
+ </Paragraph>
237
+
238
+ <Space size="medium" style={{ marginTop: 16 }}>
239
+ <Button type="primary" onClick={showMessage}>
240
+ 主要按钮
241
+ </Button>
242
+ <Button type="secondary">次要按钮</Button>
243
+ <Button type="outline">线框按钮</Button>
244
+ <Button type="text">文字按钮</Button>
245
+ </Space>
246
+
247
+ <Divider />
248
+
249
+ <Space size="medium">
250
+ <Tag color="arcoblue">Arco Blue</Tag>
251
+ <Tag color="green">Success</Tag>
252
+ <Tag color="gold">Warning</Tag>
253
+ <Tag color="red">Danger</Tag>
254
+ <Tag color="purple">Purple</Tag>
255
+ </Space>
256
+
257
+ <Divider />
258
+
259
+ <Space size="medium" align="center">
260
+ <Text>主题切换:</Text>
261
+ <Switch
262
+ checkedIcon={<IconMoon />}
263
+ uncheckedIcon={<IconSun />}
264
+ onChange={(checked: boolean) => {
265
+ Message.info(`切换到 ${checked ? '暗色' : '亮色'} 模式(需在主应用操作)`);
266
+ }}
267
+ />
268
+ <Text type="secondary">(实际切换请在主应用 Header 操作)</Text>
269
+ </Space>
270
+ </Card>
271
+
272
+ {/* 自定义主题色示例 */}
273
+ <Card title="🎨 自定义主题色变量" style={{ marginBottom: 16 }}>
274
+ <Paragraph>
275
+ 在 Less 中使用 <Text code><%= packageScope %>/shared-styles/variables-only</Text>{' '}
276
+ 导入主题变量,自动适配亮色/暗色主题。
277
+ </Paragraph>
278
+
279
+ <Title heading={6}>品牌色 & 功能色</Title>
280
+ <div className="homepage-colors">
281
+ <div className="homepage-color-item">
282
+ <div className="homepage-color-box brand-1" />
283
+ <span className="homepage-color-label">@Brand1-6</span>
284
+ </div>
285
+ <div className="homepage-color-item">
286
+ <div className="homepage-color-box brand-2" />
287
+ <span className="homepage-color-label">@Brand2-6</span>
288
+ </div>
289
+ <div className="homepage-color-item">
290
+ <div className="homepage-color-box success" />
291
+ <span className="homepage-color-label">@Success-6</span>
292
+ </div>
293
+ <div className="homepage-color-item">
294
+ <div className="homepage-color-box warning" />
295
+ <span className="homepage-color-label">@Warning-6</span>
296
+ </div>
297
+ <div className="homepage-color-item">
298
+ <div className="homepage-color-box danger" />
299
+ <span className="homepage-color-label">@Danger-6</span>
300
+ </div>
301
+ </div>
302
+
303
+ <Title heading={6} style={{ marginTop: 16 }}>
304
+ 中性色(随主题自动切换)
305
+ </Title>
306
+ <div className="homepage-colors">
307
+ <div className="homepage-color-item">
308
+ <div className="homepage-color-box fill-1" />
309
+ <span className="homepage-color-label">@color-fill-1</span>
310
+ </div>
311
+ <div className="homepage-color-item">
312
+ <div className="homepage-color-box fill-2" />
313
+ <span className="homepage-color-label">@color-fill-2</span>
314
+ </div>
315
+ <div className="homepage-color-item">
316
+ <div className="homepage-color-box fill-3" />
317
+ <span className="homepage-color-label">@color-fill-3</span>
318
+ </div>
319
+ </div>
320
+ </Card>
321
+
322
+ {/* 提示信息 */}
323
+ <Space direction="vertical" style={{ width: '100%' }}>
324
+ <Alert
325
+ type="info"
326
+ title="依赖共享"
327
+ content="通过 externals 配置,子应用复用主应用的 React 和 Arco Design,打包体积减少 ~1MB"
328
+ />
329
+ <Alert
330
+ type="success"
331
+ title="主题同步"
332
+ content="子应用的 Arco 组件和自定义样式自动跟随主应用主题切换"
333
+ />
334
+ <Alert
335
+ type="warning"
336
+ title="注意事项"
337
+ content="使用 variables-only 导入,避免重复打包 CSS 变量定义"
338
+ />
339
+ </Space>
340
+ </div>
341
+ );
342
+ }
@@ -0,0 +1,6 @@
1
+ // ==================== 子应用主题注入 ====================
2
+ // 此文件仅在独立运行时被动态导入
3
+ // 作为微前端子应用时不会被导入(使用主应用的主题)
4
+
5
+ @import '<%= packageScope %>/shared-styles/theme-inject';
6
+
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "./src/.umi/tsconfig.json"
3
+ }
@@ -0,0 +1,17 @@
1
+ import '@umijs/max/typings';
2
+
3
+ declare global {
4
+ interface Window {
5
+ /**
6
+ * @name qiankun 环境标识
7
+ * @description 当应用作为 qiankun 子应用运行时为 true
8
+ */
9
+ __POWERED_BY_QIANKUN__?: boolean;
10
+
11
+ /**
12
+ * @name qiankun 注入的公共路径
13
+ * @description qiankun 运行时注入的资源路径前缀
14
+ */
15
+ __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string;
16
+ }
17
+ }
package/lib/utils.js ADDED
@@ -0,0 +1,165 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+
6
+ /**
7
+ * 转换为 kebab-case
8
+ * @param {string} input
9
+ * @returns {string}
10
+ */
11
+ function toKebab(input) {
12
+ return String(input)
13
+ .trim()
14
+ .replace(/[\s_]+/g, '-')
15
+ .replace(/[^a-zA-Z0-9-]/g, '-')
16
+ .replace(/-+/g, '-')
17
+ .replace(/^-|-$/g, '')
18
+ .toLowerCase();
19
+ }
20
+
21
+ /**
22
+ * 转换为 PascalCase
23
+ * @param {string} input
24
+ * @returns {string}
25
+ */
26
+ function toPascal(input) {
27
+ return toKebab(input)
28
+ .split('-')
29
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
30
+ .join('');
31
+ }
32
+
33
+ /**
34
+ * 转换为 camelCase
35
+ * @param {string} input
36
+ * @returns {string}
37
+ */
38
+ function toCamel(input) {
39
+ const pascal = toPascal(input);
40
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
41
+ }
42
+
43
+ // ============ Generator 工具函数 ============
44
+
45
+ /**
46
+ * 检查路径是否应该被忽略
47
+ * @param {string} sourceRoot - 源目录根路径
48
+ * @param {string} currentPath - 当前路径
49
+ * @param {string[]} ignoreList - 忽略列表
50
+ * @returns {boolean}
51
+ */
52
+ function shouldIgnorePath(sourceRoot, currentPath, ignoreList) {
53
+ const rel = path.relative(sourceRoot, currentPath);
54
+ if (!rel || rel.startsWith('..')) return false;
55
+ const parts = rel.split(path.sep);
56
+ return parts.some((part) => ignoreList.includes(part));
57
+ }
58
+
59
+ /**
60
+ * 递归遍历目录,收集所有文件的相对路径
61
+ * @param {string} dir - 目录路径
62
+ * @param {string} sourceRoot - 源目录根路径
63
+ * @param {string[]} ignoreList - 忽略列表
64
+ * @param {string[]} files - 已收集的文件列表
65
+ * @returns {string[]}
66
+ */
67
+ function collectFiles(dir, sourceRoot, ignoreList, files = []) {
68
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
69
+ const fullPath = path.join(dir, entry.name);
70
+ if (shouldIgnorePath(sourceRoot, fullPath, ignoreList)) continue;
71
+
72
+ if (entry.isDirectory()) {
73
+ collectFiles(fullPath, sourceRoot, ignoreList, files);
74
+ } else if (entry.isFile()) {
75
+ files.push(path.relative(sourceRoot, fullPath));
76
+ }
77
+ }
78
+ return files;
79
+ }
80
+
81
+ /**
82
+ * 转换目标文件路径
83
+ * - 处理 npm 忽略的点文件:_gitignore -> .gitignore
84
+ * - 使用下划线前缀约定(Yeoman 社区标准做法)
85
+ * @param {string} relPath - 相对路径
86
+ * @returns {string}
87
+ */
88
+ function transformDestPath(relPath) {
89
+ const fileName = path.basename(relPath);
90
+ // 下划线前缀约定:_gitignore -> .gitignore, _npmrc -> .npmrc
91
+ if (fileName.startsWith('_')) {
92
+ const newFileName = '.' + fileName.slice(1);
93
+ return path.join(path.dirname(relPath), newFileName);
94
+ }
95
+ return relPath;
96
+ }
97
+
98
+ /**
99
+ * 需要使用 EJS 模板处理的文件扩展名
100
+ */
101
+ const TEMPLATE_EXTENSIONS = new Set([
102
+ '.ts',
103
+ '.tsx',
104
+ '.js',
105
+ '.jsx',
106
+ '.json',
107
+ '.less',
108
+ '.md',
109
+ '.mdc',
110
+ '.sh'
111
+ ]);
112
+
113
+ /**
114
+ * 判断文件是否需要模板处理
115
+ * @param {string} filePath - 文件路径
116
+ * @returns {boolean}
117
+ */
118
+ function isTemplateFile(filePath) {
119
+ return TEMPLATE_EXTENSIONS.has(path.extname(filePath));
120
+ }
121
+
122
+ /**
123
+ * 安装全局未捕获异常处理
124
+ */
125
+ function setupErrorHandlers() {
126
+ process.on('uncaughtException', (error) => {
127
+ console.error('');
128
+ console.error('❌ Unexpected error:');
129
+ console.error(` ${error.message}`);
130
+ if (error.stack) {
131
+ console.error('');
132
+ console.error(' Stack trace:');
133
+ console.error(error.stack.split('\n').map(line => ` ${line}`).join('\n'));
134
+ }
135
+ console.error('');
136
+ process.exit(1);
137
+ });
138
+
139
+ process.on('unhandledRejection', (reason) => {
140
+ console.error('');
141
+ console.error('❌ Unhandled promise rejection:');
142
+ console.error(` ${reason instanceof Error ? reason.message : String(reason)}`);
143
+ if (reason instanceof Error && reason.stack) {
144
+ console.error('');
145
+ console.error(' Stack trace:');
146
+ console.error(reason.stack.split('\n').map(line => ` ${line}`).join('\n'));
147
+ }
148
+ console.error('');
149
+ process.exit(1);
150
+ });
151
+ }
152
+
153
+ module.exports = {
154
+ // 字符串转换
155
+ toKebab,
156
+ toPascal,
157
+ toCamel,
158
+ // Generator 工具
159
+ shouldIgnorePath,
160
+ collectFiles,
161
+ transformDestPath,
162
+ isTemplateFile,
163
+ setupErrorHandlers,
164
+ TEMPLATE_EXTENSIONS
165
+ };
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "generator-mico-cli",
3
+ "version": "0.1.18",
4
+ "description": "Yeoman generator for Mico CLI projects",
5
+ "keywords": [
6
+ "yeoman-generator",
7
+ "generator",
8
+ "cli"
9
+ ],
10
+ "license": "MIT",
11
+ "main": "generators/subapp-react/index.js",
12
+ "bin": {
13
+ "mico": "bin/mico.js"
14
+ },
15
+ "files": [
16
+ "bin",
17
+ "lib",
18
+ "generators"
19
+ ],
20
+ "scripts": {
21
+ "sync:subapp-react-template": "node scripts/sync-subapp-react-template.js"
22
+ },
23
+ "engines": {
24
+ "node": ">=18"
25
+ },
26
+ "dependencies": {
27
+ "semver": "^7.6.3",
28
+ "update-notifier": "^7.3.1",
29
+ "yeoman-generator": "^5.9.0"
30
+ }
31
+ }