@4399ywkf/cli 1.0.7 → 1.0.9

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 (254) hide show
  1. package/dist/templates/AntdStaticMethods/index.tsx +20 -0
  2. package/dist/templates/AppTheme.tsx +136 -0
  3. package/dist/templates/DIRECTORY_STRUCTURE.md +141 -0
  4. package/dist/templates/GlobalProvider/AppTheme.tsx +136 -0
  5. package/dist/templates/GlobalProvider/Locale.tsx +84 -0
  6. package/dist/templates/GlobalProvider/Query.tsx +12 -0
  7. package/dist/templates/GlobalProvider/StyleRegistry.tsx +9 -0
  8. package/dist/templates/GlobalProvider/index.tsx +23 -0
  9. package/dist/templates/HarmonyOS_Sans_Bold.woff2 +0 -0
  10. package/dist/templates/HarmonyOS_Sans_Medium.woff2 +0 -0
  11. package/dist/templates/HarmonyOS_Sans_Regular.woff2 +0 -0
  12. package/dist/templates/Locale.tsx +49 -54
  13. package/dist/templates/MainContentWrap.tsx +11 -15
  14. package/dist/templates/Query.tsx +12 -0
  15. package/dist/templates/StyleRegistry.tsx +9 -0
  16. package/dist/templates/ThemeContext.tsx +27 -24
  17. package/dist/templates/analyzeUnusedKeys.ts +506 -0
  18. package/dist/templates/app/.i18nrc.js +57 -0
  19. package/dist/templates/app/config/env/.env.public.tpl +2 -19
  20. package/dist/templates/app/config/jwt/index.ts +4 -4
  21. package/dist/templates/app/config/request/error-handler.ts +67 -0
  22. package/dist/templates/app/config/request/index.ts +127 -129
  23. package/dist/templates/app/config/request/interceptors.ts +118 -0
  24. package/dist/templates/app/config/request/token-manager.ts +23 -0
  25. package/dist/templates/app/config/request/types.ts +63 -0
  26. package/dist/templates/app/config/rspack/rspack.config.mjs +62 -61
  27. package/dist/templates/app/config/rspack/rspack.prod.mjs +41 -62
  28. package/dist/templates/app/docs/DIRECTORY_STRUCTURE.md +141 -0
  29. package/dist/templates/app/docs/glossary.md +11 -0
  30. package/dist/templates/app/locales/zh-CN/common.json +3 -0
  31. package/dist/templates/app/package.json.tpl +8 -25
  32. package/dist/templates/app/public/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
  33. package/dist/templates/app/public/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
  34. package/dist/templates/app/public/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
  35. package/dist/templates/app/react-app-env.d.ts +13 -8
  36. package/dist/templates/app/scripts/i18nWorkflow/analyzeUnusedKeys.ts +506 -0
  37. package/dist/templates/app/scripts/i18nWorkflow/cleanUnusedKeys.ts +344 -0
  38. package/dist/templates/app/scripts/i18nWorkflow/const.ts +18 -0
  39. package/dist/templates/app/scripts/i18nWorkflow/flattenLocaleKeys.ts +139 -0
  40. package/dist/templates/app/scripts/i18nWorkflow/genDefaultLocale.ts +19 -0
  41. package/dist/templates/app/scripts/i18nWorkflow/genDiff.ts +49 -0
  42. package/dist/templates/app/scripts/i18nWorkflow/i18nConfig.ts +7 -0
  43. package/dist/templates/app/scripts/i18nWorkflow/index.ts +11 -0
  44. package/dist/templates/app/scripts/i18nWorkflow/protectedPatterns.ts +91 -0
  45. package/dist/templates/app/scripts/i18nWorkflow/utils.ts +76 -0
  46. package/dist/templates/app/src/bootstrap/index.ts +34 -0
  47. package/dist/templates/app/src/components/AntdStaticMethods/index.tsx +20 -0
  48. package/dist/templates/app/src/config/env.ts +84 -0
  49. package/dist/templates/app/src/index.tsx +13 -51
  50. package/dist/templates/app/src/layout/GlobalProvider/AppTheme.tsx +136 -0
  51. package/dist/templates/app/src/layout/GlobalProvider/Locale.tsx +84 -0
  52. package/dist/templates/app/src/layout/GlobalProvider/Query.tsx +12 -0
  53. package/dist/templates/app/src/layout/GlobalProvider/StyleRegistry.tsx +9 -0
  54. package/dist/templates/app/src/layout/GlobalProvider/index.tsx +23 -0
  55. package/dist/templates/app/src/layout/Locale.tsx +14 -18
  56. package/dist/templates/app/src/layout/MainContentWrap.tsx +11 -15
  57. package/dist/templates/app/src/layout/ThemeContext.tsx +27 -24
  58. package/dist/templates/app/src/locales/default/common.ts +3 -1
  59. package/dist/templates/app/src/locales/utils.ts +23 -0
  60. package/dist/templates/app/src/micro/garfish.ts +53 -0
  61. package/dist/templates/app/src/pages/base/index.tsx +280 -25
  62. package/dist/templates/app/src/routes.tsx +21 -12
  63. package/dist/templates/app/src/types/global.d.ts +19 -0
  64. package/dist/templates/app/src/utils/index.ts +3 -1
  65. package/dist/templates/app/store/middleware/createDevtools.ts +7 -7
  66. package/dist/templates/app/tsconfig.json +19 -3
  67. package/dist/templates/base/index.tsx +280 -25
  68. package/dist/templates/bootstrap/index.ts +34 -0
  69. package/dist/templates/cleanUnusedKeys.ts +344 -0
  70. package/dist/templates/common.json +3 -0
  71. package/dist/templates/common.ts +3 -1
  72. package/dist/templates/components/AntdStaticMethods/index.tsx +20 -0
  73. package/dist/templates/config/env/.env.public.tpl +2 -19
  74. package/dist/templates/config/env.ts +84 -0
  75. package/dist/templates/config/jwt/index.ts +4 -4
  76. package/dist/templates/config/request/error-handler.ts +67 -0
  77. package/dist/templates/config/request/index.ts +127 -129
  78. package/dist/templates/config/request/interceptors.ts +118 -0
  79. package/dist/templates/config/request/token-manager.ts +23 -0
  80. package/dist/templates/config/request/types.ts +63 -0
  81. package/dist/templates/config/rspack/rspack.config.mjs +62 -61
  82. package/dist/templates/config/rspack/rspack.prod.mjs +41 -62
  83. package/dist/templates/const.ts +18 -0
  84. package/dist/templates/createDevtools.ts +7 -7
  85. package/dist/templates/default/common.ts +3 -1
  86. package/dist/templates/docs/DIRECTORY_STRUCTURE.md +141 -0
  87. package/dist/templates/docs/glossary.md +11 -0
  88. package/dist/templates/env/.env.public.tpl +2 -19
  89. package/dist/templates/env.ts +83 -2
  90. package/dist/templates/error-handler.ts +67 -0
  91. package/dist/templates/flattenLocaleKeys.ts +139 -0
  92. package/dist/templates/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
  93. package/dist/templates/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
  94. package/dist/templates/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
  95. package/dist/templates/garfish.ts +53 -0
  96. package/dist/templates/genDefaultLocale.ts +19 -0
  97. package/dist/templates/genDiff.ts +49 -0
  98. package/dist/templates/global.d.ts +19 -0
  99. package/dist/templates/glossary.md +11 -0
  100. package/dist/templates/i18nConfig.ts +7 -0
  101. package/dist/templates/i18nWorkflow/analyzeUnusedKeys.ts +506 -0
  102. package/dist/templates/i18nWorkflow/cleanUnusedKeys.ts +344 -0
  103. package/dist/templates/i18nWorkflow/const.ts +18 -0
  104. package/dist/templates/i18nWorkflow/flattenLocaleKeys.ts +139 -0
  105. package/dist/templates/i18nWorkflow/genDefaultLocale.ts +19 -0
  106. package/dist/templates/i18nWorkflow/genDiff.ts +49 -0
  107. package/dist/templates/i18nWorkflow/i18nConfig.ts +7 -0
  108. package/dist/templates/i18nWorkflow/index.ts +11 -0
  109. package/dist/templates/i18nWorkflow/protectedPatterns.ts +91 -0
  110. package/dist/templates/i18nWorkflow/utils.ts +76 -0
  111. package/dist/templates/index.tsx +280 -25
  112. package/dist/templates/interceptors.ts +118 -0
  113. package/dist/templates/jwt/index.ts +4 -4
  114. package/dist/templates/layout/GlobalProvider/AppTheme.tsx +136 -0
  115. package/dist/templates/layout/GlobalProvider/Locale.tsx +84 -0
  116. package/dist/templates/layout/GlobalProvider/Query.tsx +12 -0
  117. package/dist/templates/layout/GlobalProvider/StyleRegistry.tsx +9 -0
  118. package/dist/templates/layout/GlobalProvider/index.tsx +23 -0
  119. package/dist/templates/layout/Locale.tsx +14 -18
  120. package/dist/templates/layout/MainContentWrap.tsx +11 -15
  121. package/dist/templates/layout/ThemeContext.tsx +27 -24
  122. package/dist/templates/locales/default/common.ts +3 -1
  123. package/dist/templates/locales/utils.ts +23 -0
  124. package/dist/templates/locales/zh-CN/common.json +3 -0
  125. package/dist/templates/micro/garfish.ts +53 -0
  126. package/dist/templates/middleware/createDevtools.ts +7 -7
  127. package/dist/templates/package.json.tpl +8 -25
  128. package/dist/templates/page.tsx +21 -19
  129. package/dist/templates/pages/base/index.tsx +280 -25
  130. package/dist/templates/protectedPatterns.ts +91 -0
  131. package/dist/templates/public/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
  132. package/dist/templates/public/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
  133. package/dist/templates/public/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
  134. package/dist/templates/react-app-env.d.ts +13 -8
  135. package/dist/templates/request/error-handler.ts +67 -0
  136. package/dist/templates/request/index.ts +127 -129
  137. package/dist/templates/request/interceptors.ts +118 -0
  138. package/dist/templates/request/token-manager.ts +23 -0
  139. package/dist/templates/request/types.ts +63 -0
  140. package/dist/templates/routes.tsx +21 -12
  141. package/dist/templates/rspack/rspack.config.mjs +62 -61
  142. package/dist/templates/rspack/rspack.prod.mjs +41 -62
  143. package/dist/templates/rspack.config.mjs +62 -61
  144. package/dist/templates/rspack.prod.mjs +41 -62
  145. package/dist/templates/scripts/i18nWorkflow/analyzeUnusedKeys.ts +506 -0
  146. package/dist/templates/scripts/i18nWorkflow/cleanUnusedKeys.ts +344 -0
  147. package/dist/templates/scripts/i18nWorkflow/const.ts +18 -0
  148. package/dist/templates/scripts/i18nWorkflow/flattenLocaleKeys.ts +139 -0
  149. package/dist/templates/scripts/i18nWorkflow/genDefaultLocale.ts +19 -0
  150. package/dist/templates/scripts/i18nWorkflow/genDiff.ts +49 -0
  151. package/dist/templates/scripts/i18nWorkflow/i18nConfig.ts +7 -0
  152. package/dist/templates/scripts/i18nWorkflow/index.ts +11 -0
  153. package/dist/templates/scripts/i18nWorkflow/protectedPatterns.ts +91 -0
  154. package/dist/templates/scripts/i18nWorkflow/utils.ts +76 -0
  155. package/dist/templates/src/bootstrap/index.ts +34 -0
  156. package/dist/templates/src/components/AntdStaticMethods/index.tsx +20 -0
  157. package/dist/templates/src/config/env.ts +84 -0
  158. package/dist/templates/src/index.tsx +13 -51
  159. package/dist/templates/src/layout/GlobalProvider/AppTheme.tsx +136 -0
  160. package/dist/templates/src/layout/GlobalProvider/Locale.tsx +84 -0
  161. package/dist/templates/src/layout/GlobalProvider/Query.tsx +12 -0
  162. package/dist/templates/src/layout/GlobalProvider/StyleRegistry.tsx +9 -0
  163. package/dist/templates/src/layout/GlobalProvider/index.tsx +23 -0
  164. package/dist/templates/src/layout/Locale.tsx +14 -18
  165. package/dist/templates/src/layout/MainContentWrap.tsx +11 -15
  166. package/dist/templates/src/layout/ThemeContext.tsx +27 -24
  167. package/dist/templates/src/locales/default/common.ts +3 -1
  168. package/dist/templates/src/locales/utils.ts +23 -0
  169. package/dist/templates/src/micro/garfish.ts +53 -0
  170. package/dist/templates/src/pages/base/index.tsx +280 -25
  171. package/dist/templates/src/routes.tsx +21 -12
  172. package/dist/templates/src/types/global.d.ts +19 -0
  173. package/dist/templates/src/utils/index.ts +3 -1
  174. package/dist/templates/store/middleware/createDevtools.ts +7 -7
  175. package/dist/templates/token-manager.ts +23 -0
  176. package/dist/templates/tsconfig.json +19 -3
  177. package/dist/templates/type.ts +23 -24
  178. package/dist/templates/types/global.d.ts +19 -0
  179. package/dist/templates/utils/index.ts +3 -1
  180. package/dist/templates/utils.ts +23 -0
  181. package/dist/templates/zh-CN/common.json +3 -0
  182. package/package.json +19 -21
  183. package/dist/templates/app/config/sentry/sentry.config.ts +0 -188
  184. package/dist/templates/app/src/hooks/useRouteTitle.tsx +0 -36
  185. package/dist/templates/app/src/hooks/useSentry.ts +0 -92
  186. package/dist/templates/app/src/pages/base/layout.tsx +0 -6
  187. package/dist/templates/app/src/pages/base/page.tsx +0 -25
  188. package/dist/templates/app/src/utils/env.ts +0 -3
  189. package/dist/templates/app/src/utils/format.ts +0 -21
  190. package/dist/templates/app/src/utils/getMicroApp.ts +0 -39
  191. package/dist/templates/app/src/utils/sentry.ts +0 -187
  192. package/dist/templates/app/src/utils/sentryDecorators.ts +0 -34
  193. package/dist/templates/app/src/utils/updateVersion.ts +0 -186
  194. package/dist/templates/base/layout.tsx +0 -6
  195. package/dist/templates/base/page.tsx +0 -25
  196. package/dist/templates/config/public/404.png +0 -0
  197. package/dist/templates/config/public/favicon.ico +0 -0
  198. package/dist/templates/config/public/images/banner_market_modal.webp +0 -0
  199. package/dist/templates/config/public/images/chatmode_chat_dark.webp +0 -0
  200. package/dist/templates/config/public/images/chatmode_chat_light.webp +0 -0
  201. package/dist/templates/config/public/images/chatmode_docs_dark.webp +0 -0
  202. package/dist/templates/config/public/images/chatmode_docs_light.webp +0 -0
  203. package/dist/templates/config/public/images/empty_topic_dark.webp +0 -0
  204. package/dist/templates/config/public/images/empty_topic_light.webp +0 -0
  205. package/dist/templates/config/public/images/screenshot_background.webp +0 -0
  206. package/dist/templates/config/public/images/theme_auto.webp +0 -0
  207. package/dist/templates/config/public/images/theme_dark.webp +0 -0
  208. package/dist/templates/config/public/images/theme_light.webp +0 -0
  209. package/dist/templates/config/public/index.html +0 -29
  210. package/dist/templates/config/sentry/sentry.config.ts +0 -188
  211. package/dist/templates/format.ts +0 -21
  212. package/dist/templates/getMicroApp.ts +0 -39
  213. package/dist/templates/hooks/useRouteTitle.tsx +0 -36
  214. package/dist/templates/hooks/useSentry.ts +0 -92
  215. package/dist/templates/layout.tsx +0 -6
  216. package/dist/templates/pages/base/layout.tsx +0 -6
  217. package/dist/templates/pages/base/page.tsx +0 -25
  218. package/dist/templates/sentry/sentry.config.ts +0 -188
  219. package/dist/templates/sentry.config.ts +0 -188
  220. package/dist/templates/sentry.ts +0 -187
  221. package/dist/templates/sentryDecorators.ts +0 -34
  222. package/dist/templates/src/hooks/useRouteTitle.tsx +0 -36
  223. package/dist/templates/src/hooks/useSentry.ts +0 -92
  224. package/dist/templates/src/pages/base/layout.tsx +0 -6
  225. package/dist/templates/src/pages/base/page.tsx +0 -25
  226. package/dist/templates/src/utils/env.ts +0 -3
  227. package/dist/templates/src/utils/format.ts +0 -21
  228. package/dist/templates/src/utils/getMicroApp.ts +0 -39
  229. package/dist/templates/src/utils/sentry.ts +0 -187
  230. package/dist/templates/src/utils/sentryDecorators.ts +0 -34
  231. package/dist/templates/src/utils/updateVersion.ts +0 -186
  232. package/dist/templates/updateVersion.ts +0 -186
  233. package/dist/templates/useRouteTitle.tsx +0 -36
  234. package/dist/templates/useSentry.ts +0 -92
  235. package/dist/templates/utils/env.ts +0 -3
  236. package/dist/templates/utils/format.ts +0 -21
  237. package/dist/templates/utils/getMicroApp.ts +0 -39
  238. package/dist/templates/utils/sentry.ts +0 -187
  239. package/dist/templates/utils/sentryDecorators.ts +0 -34
  240. package/dist/templates/utils/updateVersion.ts +0 -186
  241. /package/dist/templates/app/{config/public → public}/404.png +0 -0
  242. /package/dist/templates/app/{config/public → public}/favicon.ico +0 -0
  243. /package/dist/templates/app/{config/public → public}/images/banner_market_modal.webp +0 -0
  244. /package/dist/templates/app/{config/public → public}/images/chatmode_chat_dark.webp +0 -0
  245. /package/dist/templates/app/{config/public → public}/images/chatmode_chat_light.webp +0 -0
  246. /package/dist/templates/app/{config/public → public}/images/chatmode_docs_dark.webp +0 -0
  247. /package/dist/templates/app/{config/public → public}/images/chatmode_docs_light.webp +0 -0
  248. /package/dist/templates/app/{config/public → public}/images/empty_topic_dark.webp +0 -0
  249. /package/dist/templates/app/{config/public → public}/images/empty_topic_light.webp +0 -0
  250. /package/dist/templates/app/{config/public → public}/images/screenshot_background.webp +0 -0
  251. /package/dist/templates/app/{config/public → public}/images/theme_auto.webp +0 -0
  252. /package/dist/templates/app/{config/public → public}/images/theme_dark.webp +0 -0
  253. /package/dist/templates/app/{config/public → public}/images/theme_light.webp +0 -0
  254. /package/dist/templates/app/{config/public → public}/index.html +0 -0
@@ -1,32 +1,287 @@
1
- import React from 'react';
2
- import { createStyles } from "antd-style"
3
-
4
-
5
- const useStyles = createStyles(({ token, isDarkMode }) => ({
6
- button: {
7
- backgroundColor: token.colorPrimary,
8
- width: '100px',
9
- color: isDarkMode ? token.colorText : "#fff",
10
- padding: `${token.paddingXS}px ${token.paddingSM}px`,
11
- borderRadius: token.borderRadius,
12
- cursor: 'pointer',
13
- transition: 'all 0.3s ease',
14
-
15
- '&:hover': {
16
- backgroundColor: token.colorPrimaryHover,
1
+ import { useUserStore } from "@store/user";
2
+ import { Button, Card, Space, Typography, Tag, Flex } from "antd";
3
+ import {
4
+ RocketOutlined,
5
+ ThunderboltOutlined,
6
+ BulbOutlined,
7
+ GithubOutlined,
8
+ BookOutlined,
9
+ SettingOutlined,
10
+ } from "@ant-design/icons";
11
+ import React from "react";
12
+ import { createStyles } from "antd-style";
13
+
14
+ const { Title, Paragraph, Text } = Typography;
15
+
16
+ const px = (value: number | string) =>
17
+ typeof value === "number" ? `${value}px` : value;
18
+
19
+ const useStyles = createStyles(({ token, css }) => ({
20
+ root: css`
21
+ width: 100%;
22
+ min-height: 100vh;
23
+ padding: ${px(token.paddingLG)};
24
+ background: linear-gradient(180deg, ${token.colorFillTertiary}, ${token.colorPrimaryHover});
25
+ overflow: auto;
26
+ `,
27
+ container: css`
28
+ margin: 0 auto;
29
+ max-width: 960px;
30
+ `,
31
+ hero: css`
32
+ text-align: center;
33
+ margin-bottom: ${px(token.marginLG)};
34
+ `,
35
+ heroIcon: css`
36
+ font-size: 3.5rem;
37
+ color: ${token.colorPrimary};
38
+ animation: bounce 1.2s infinite alternate;
39
+
40
+ @keyframes bounce {
41
+ from {
42
+ transform: translateY(0);
43
+ }
44
+ to {
45
+ transform: translateY(-6px);
46
+ }
47
+ }
48
+ `,
49
+ tagSpace: css`
50
+ margin-top: ${px(token.marginMD)};
51
+ `,
52
+ featuresGrid: css`
53
+ display: grid;
54
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
55
+ gap: ${px(token.marginSM)};
56
+ margin-bottom: ${px(token.marginLG)};
57
+ `,
58
+ featureCard: css`
59
+ text-align: center;
60
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
61
+
62
+ &:hover {
63
+ transform: translateY(-6px);
64
+ box-shadow: ${token.boxShadowSecondary};
65
+ }
66
+ `,
67
+ quickLinkGrid: css`
68
+ display: grid;
69
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
70
+ gap: ${px(token.marginSM)};
71
+ `,
72
+ quickLink: css`
73
+ padding: ${px(token.paddingMD)};
74
+ border-radius: ${px(token.borderRadiusLG)};
75
+ background: ${token.colorBgContainer};
76
+ cursor: pointer;
77
+ transition: background 0.2s ease;
78
+
79
+ &:hover {
80
+ background: ${token.colorBgElevated};
81
+ }
82
+ `,
83
+ footerActions: css`
84
+ margin-top: ${px(token.marginMD)};
85
+ text-align: center;
86
+ `,
87
+ cardTitle: css`
88
+ display: inline-flex;
89
+ align-items: center;
90
+ gap: ${px(token.marginXS)};
91
+ font-size: ${px(token.fontSizeHeading4)};
92
+ `,
93
+ codeBlock: css`
94
+ margin-top: ${px(token.marginXS)};
95
+ padding: ${px(token.paddingSM)};
96
+ background: ${token.colorFillAlter};
97
+ border-radius: ${px(token.borderRadiusLG)};
98
+ font-family: ${token.fontFamilyCode};
99
+ font-size: ${px(token.fontSizeSM)};
100
+ `,
101
+ stepLabel: css`
102
+ font-size: ${px(token.fontSizeBase)};
103
+ `,
104
+ quickLinkLabel: css`
105
+ font-size: ${px(token.fontSizeHeading2)};
106
+ margin-bottom: ${px(token.marginXS)};
107
+ `,
108
+ quickLinkDescription: css`
109
+ color: ${token.colorTextTertiary};
110
+ `,
111
+ panelCard: css`
112
+ margin-bottom: ${px(token.marginLG)};
113
+ background: ${token.colorBgElevated};
114
+ `,
115
+ featureIcon: css`
116
+ margin-bottom: ${px(token.marginMD)};
117
+ `,
118
+ footerParagraph: css`
119
+ margin-top: ${px(token.marginMD)};
120
+ color: ${token.colorTextTertiary};
121
+ `,
122
+ textCenterCard: css`
123
+ text-align: center;
124
+ `,
125
+ }));
126
+
127
+ export default function BasePage() {
128
+ const theme = useUserStore((state) => state.themeMode);
129
+ const setTheme = useUserStore((state) => state.setThemeMode);
130
+ const { styles, cx } = useStyles();
131
+
132
+ const features = [
133
+ {
134
+ icon: <ThunderboltOutlined className={styles.heroIcon} />,
135
+ title: "Rspack 构建",
136
+ description: "基于 Rspack 的极速构建体验,开发效率翻倍",
17
137
  },
18
- '&:active': {
19
- backgroundColor: token.colorPrimaryActive,
138
+ {
139
+ icon: <BulbOutlined className={styles.heroIcon} />,
140
+ title: "React 19",
141
+ description: "使用最新的 React 19 特性,享受并发渲染",
20
142
  },
21
- },
22
- }));
143
+ {
144
+ icon: <SettingOutlined className={styles.heroIcon} />,
145
+ title: "TypeScript",
146
+ description: "完整的 TypeScript 支持,类型安全有保障",
147
+ },
148
+ ];
149
+
150
+ const quickLinks = [
151
+ { label: "📖 文档", description: "查看完整文档" },
152
+ { label: "🎨 组件库", description: "Ant Design 组件" },
153
+ { label: "🔧 配置", description: "项目配置说明" },
154
+ { label: "🚀 部署", description: "部署指南" },
155
+ ];
23
156
 
24
- export default function Base() {
25
- const { styles } = useStyles();
26
157
  return (
27
- <div className={styles.button}>
28
- Base
29
- {/* <Button type="primary">antd按钮</Button> */}
158
+ <div className={cx(styles.root)}>
159
+ <div className={styles.container}>
160
+ <Flex vertical gap={12}>
161
+ <section className={styles.hero}>
162
+ <div>
163
+ <RocketOutlined className={styles.heroIcon} />
164
+ </div>
165
+ <Title level={1} style={{ marginBottom: 16 }}>
166
+ 🎉 恭喜!项目创建成功
167
+ </Title>
168
+ <Paragraph>
169
+ 你的项目已经准备就绪,现在可以开始开发了
170
+ </Paragraph>
171
+ <Space size="middle" className={styles.tagSpace}>
172
+ <Tag color="blue">React 19</Tag>
173
+ <Tag color="green">TypeScript</Tag>
174
+ <Tag color="orange">Rspack</Tag>
175
+ <Tag color="purple">Ant Design</Tag>
176
+ <Tag color="cyan">Tailwind CSS</Tag>
177
+ </Space>
178
+ </section>
179
+
180
+ <div className={styles.featuresGrid}>
181
+ {features.map((feature, index) => (
182
+ <Card
183
+ key={index}
184
+ hoverable
185
+ className={cx(styles.featureCard)}
186
+ bodyStyle={{ padding: 24 }}
187
+ >
188
+ <div className={styles.featureIcon}>{feature.icon}</div>
189
+ <Title level={4}>{feature.title}</Title>
190
+ <Paragraph type="secondary">{feature.description}</Paragraph>
191
+ </Card>
192
+ ))}
193
+ </div>
194
+
195
+ <Card
196
+ title={
197
+ <span className={styles.cardTitle}>
198
+ <BookOutlined />
199
+ 快速开始
200
+ </span>
201
+ }
202
+ className={styles.panelCard}
203
+ >
204
+ <Space direction="vertical" size="large">
205
+ <div>
206
+ <Text strong className={styles.stepLabel}>
207
+ 1. 安装依赖
208
+ </Text>
209
+ <div className={styles.codeBlock}>
210
+ <code>pnpm install</code>
211
+ </div>
212
+ </div>
213
+ <div>
214
+ <Text strong className={styles.stepLabel}>
215
+ 2. 启动开发服务器
216
+ </Text>
217
+ <div className={styles.codeBlock}>
218
+ <code>pnpm dev</code>
219
+ </div>
220
+ </div>
221
+ <div>
222
+ <Text strong className={styles.stepLabel}>
223
+ 3. 构建生产版本
224
+ </Text>
225
+ <div className={styles.codeBlock}>
226
+ <code>pnpm build</code>
227
+ </div>
228
+ </div>
229
+ </Space>
230
+ </Card>
231
+
232
+ <Card
233
+ title={
234
+ <span className={styles.cardTitle}>
235
+ <GithubOutlined />
236
+ 快捷链接
237
+ </span>
238
+ }
239
+ className={styles.panelCard}
240
+ >
241
+ <div className={styles.quickLinkGrid}>
242
+ {quickLinks.map((link, index) => (
243
+ <div key={index} className={styles.quickLink}>
244
+ <div className={styles.quickLinkLabel}>{link.label}</div>
245
+ <Text className={styles.quickLinkDescription}>
246
+ {link.description}
247
+ </Text>
248
+ </div>
249
+ ))}
250
+ </div>
251
+ </Card>
252
+
253
+ <Card className={cx(styles.panelCard, styles.textCenterCard)}>
254
+ <div className={styles.footerActions}>
255
+ <Space size="large" wrap>
256
+ <Button
257
+ type="primary"
258
+ size="large"
259
+ icon={<RocketOutlined />}
260
+ onClick={() => window.open("https://ant.design", "_blank")}
261
+ >
262
+ 查看 Ant Design 文档
263
+ </Button>
264
+ <Button
265
+ size="large"
266
+ icon={<BookOutlined />}
267
+ onClick={() => window.open("https://react.dev", "_blank")}
268
+ >
269
+ React 文档
270
+ </Button>
271
+ <Button
272
+ size="large"
273
+ onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
274
+ >
275
+ 切换主题 ({theme === "dark" ? "🌙 暗色" : "☀️ 亮色"})
276
+ </Button>
277
+ </Space>
278
+ <Paragraph className={styles.footerParagraph}>
279
+ 祝你开发愉快!如有问题,请查阅文档或联系技术支持 💪
280
+ </Paragraph>
281
+ </div>
282
+ </Card>
283
+ </Flex>
284
+ </div>
30
285
  </div>
31
286
  );
32
287
  }
@@ -0,0 +1,34 @@
1
+ import "dayjs/locale/zh-cn";
2
+ import dayjs from "dayjs";
3
+ import { ConfigProvider } from "antd";
4
+ import { env } from "@/config/env";
5
+
6
+ interface BootstrapConfig {
7
+ appName: string;
8
+ }
9
+
10
+ /**
11
+ * 应用启动前的初始化配置
12
+ */
13
+ export function bootstrap(config: BootstrapConfig) {
14
+ const { appName } = config;
15
+
16
+ // 配置 dayjs 国际化
17
+ dayjs.locale("zh-cn");
18
+
19
+ // 配置 antd 静态方法的前缀
20
+ ConfigProvider.config({
21
+ prefixCls: appName,
22
+ });
23
+
24
+ console.log(`✅ Application [${appName}] bootstrapped successfully`);
25
+ }
26
+
27
+ /**
28
+ * 使用环境变量初始化应用
29
+ */
30
+ export function bootstrapWithEnv() {
31
+ bootstrap({
32
+ appName: env.APP_NAME,
33
+ });
34
+ }
@@ -0,0 +1,344 @@
1
+ /* eslint-disable unicorn/prefer-top-level-await */
2
+ import { consola } from 'consola';
3
+ import { colors } from 'consola/utils';
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+
7
+ import { IGNORED_FILES } from './protectedPatterns';
8
+
9
+ interface UnusedKey {
10
+ filePath: string;
11
+ fullKey: string;
12
+ key: string;
13
+ namespace: string;
14
+ }
15
+
16
+ interface ReportData {
17
+ generatedAt: string;
18
+ statistics: {
19
+ totalKeys: number;
20
+ unusedKeys: number;
21
+ usageRate: string;
22
+ usedKeys: number;
23
+ };
24
+ unusedKeys: UnusedKey[];
25
+ unusedKeysByNamespace: Array<{
26
+ count: number;
27
+ keys: string[];
28
+ namespace: string;
29
+ }>;
30
+ }
31
+
32
+ /**
33
+ * Remove a key from a nested object
34
+ */
35
+ function removeKeyFromObject(obj: any, keyPath: string): boolean {
36
+ const keys = keyPath.split('.');
37
+ const lastKey = keys.pop()!;
38
+
39
+ let current = obj;
40
+ const parents: Array<{ key: string; obj: any }> = [];
41
+
42
+ // Navigate to the parent of the target key
43
+ for (const key of keys) {
44
+ if (!current[key]) {
45
+ return false; // Key path doesn't exist
46
+ }
47
+ parents.push({ key, obj: current });
48
+ current = current[key];
49
+ }
50
+
51
+ // Remove the key
52
+ if (lastKey in current) {
53
+ delete current[lastKey];
54
+
55
+ // Clean up empty parent objects
56
+ for (let i = parents.length - 1; i >= 0; i--) {
57
+ const { obj, key } = parents[i];
58
+ if (Object.keys(obj[key]).length === 0) {
59
+ delete obj[key];
60
+ } else {
61
+ break; // Stop if parent still has other keys
62
+ }
63
+ }
64
+
65
+ return true;
66
+ }
67
+
68
+ return false;
69
+ }
70
+
71
+ /**
72
+ * Clean unused keys from TypeScript default locale files
73
+ */
74
+ function cleanDefaultLocaleFiles(unusedKeys: UnusedKey[], dryRun: boolean = true) {
75
+ const defaultLocalesPath = path.join(process.cwd(), 'src/locales/default');
76
+
77
+ // Get ignored namespace names from IGNORED_FILES (remove .ts extension)
78
+ const ignoredNamespaces = new Set(IGNORED_FILES.map((f) => f.replace('.ts', '')));
79
+
80
+ // Group by namespace
81
+ const byNamespace = new Map<string, string[]>();
82
+ for (const key of unusedKeys) {
83
+ // Skip ignored namespaces (from IGNORED_FILES)
84
+ if (ignoredNamespaces.has(key.namespace)) {
85
+ continue;
86
+ }
87
+
88
+ if (!byNamespace.has(key.namespace)) {
89
+ byNamespace.set(key.namespace, []);
90
+ }
91
+ byNamespace.get(key.namespace)!.push(key.key);
92
+ }
93
+
94
+ consola.info(`Processing ${byNamespace.size} namespace files...`);
95
+ consola.info('');
96
+
97
+ let totalRemoved = 0;
98
+
99
+ for (const [namespace, keys] of byNamespace.entries()) {
100
+ const filePath = path.join(defaultLocalesPath, `${namespace}.ts`);
101
+
102
+ if (!fs.existsSync(filePath)) {
103
+ consola.warn(`File not found: ${filePath}`);
104
+ continue;
105
+ }
106
+
107
+ try {
108
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
109
+ const loadedModule = require(filePath);
110
+ const translations = loadedModule.default || loadedModule;
111
+
112
+ // Create a deep copy to avoid modifying the original
113
+ const updatedTranslations = structuredClone(translations);
114
+
115
+ let removedCount = 0;
116
+
117
+ // Remove each unused key
118
+ for (const key of keys) {
119
+ if (removeKeyFromObject(updatedTranslations, key)) {
120
+ removedCount++;
121
+ totalRemoved++;
122
+ }
123
+ }
124
+
125
+ if (removedCount > 0) {
126
+ consola.info(
127
+ colors.cyan(namespace.padEnd(20)),
128
+ colors.gray('→'),
129
+ colors.red(`${removedCount} keys to remove`),
130
+ );
131
+
132
+ if (!dryRun) {
133
+ // Generate new content
134
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
135
+ const newContent = generateTypeScriptContent(updatedTranslations);
136
+
137
+ // Write back to file
138
+ fs.writeFileSync(filePath, newContent, 'utf8');
139
+ consola.success(` ✓ Updated ${filePath}`);
140
+ } else {
141
+ consola.info(` ${colors.gray('(dry run - no changes made)')}`);
142
+ }
143
+ }
144
+ } catch (error) {
145
+ consola.error(`Failed to process ${namespace}:`, error);
146
+ }
147
+ }
148
+
149
+ return totalRemoved;
150
+ }
151
+
152
+ /**
153
+ * Clean unused keys from JSON locale files
154
+ */
155
+ function cleanLocaleJsonFiles(unusedKeys: UnusedKey[], dryRun: boolean = true) {
156
+ const localesPath = path.join(process.cwd(), 'locales');
157
+ const locales = fs
158
+ .readdirSync(localesPath)
159
+ .filter((f) => fs.statSync(path.join(localesPath, f)).isDirectory());
160
+
161
+ consola.info(`Processing ${locales.length} locale directories...`);
162
+ consola.info('');
163
+
164
+ // Get ignored namespace names from IGNORED_FILES (remove .ts extension)
165
+ const ignoredNamespaces = new Set(IGNORED_FILES.map((f) => f.replace('.ts', '')));
166
+
167
+ // Group by namespace
168
+ const byNamespace = new Map<string, string[]>();
169
+ for (const key of unusedKeys) {
170
+ // Skip ignored namespaces (from IGNORED_FILES)
171
+ if (ignoredNamespaces.has(key.namespace)) {
172
+ continue;
173
+ }
174
+
175
+ if (!byNamespace.has(key.namespace)) {
176
+ byNamespace.set(key.namespace, []);
177
+ }
178
+ byNamespace.get(key.namespace)!.push(key.key);
179
+ }
180
+
181
+ let totalRemoved = 0;
182
+
183
+ for (const locale of locales) {
184
+ consola.info(colors.cyan(`Locale: ${locale}`));
185
+
186
+ for (const [namespace, keys] of byNamespace.entries()) {
187
+ const filePath = path.join(localesPath, locale, `${namespace}.json`);
188
+
189
+ if (!fs.existsSync(filePath)) {
190
+ continue;
191
+ }
192
+
193
+ try {
194
+ const content = fs.readFileSync(filePath, 'utf8');
195
+ const translations = JSON.parse(content);
196
+
197
+ let removedCount = 0;
198
+
199
+ // Remove each unused key
200
+ for (const key of keys) {
201
+ if (removeKeyFromObject(translations, key)) {
202
+ removedCount++;
203
+ totalRemoved++;
204
+ }
205
+ }
206
+
207
+ if (removedCount > 0) {
208
+ consola.info(
209
+ ` ${colors.gray(namespace.padEnd(20))} → ${colors.red(removedCount + ' keys removed')}`,
210
+ );
211
+
212
+ if (!dryRun) {
213
+ // Write back to file with pretty formatting
214
+ fs.writeFileSync(filePath, JSON.stringify(translations, null, 2) + '\n', 'utf8');
215
+ }
216
+ }
217
+ } catch (error) {
218
+ consola.error(`Failed to process ${locale}/${namespace}:`, error);
219
+ }
220
+ }
221
+
222
+ consola.info('');
223
+ }
224
+
225
+ return totalRemoved;
226
+ }
227
+
228
+ /**
229
+ * Check if a key needs quotes in TypeScript object notation
230
+ */
231
+ function needsQuotes(key: string): boolean {
232
+ // Keys that need quotes:
233
+ // - Contains special characters (-, ., spaces, etc.)
234
+ // - Starts with a number
235
+ // - Is a reserved keyword
236
+ return !/^[$A-Z_a-z][\w$]*$/.test(key);
237
+ }
238
+
239
+ /**
240
+ * Generate TypeScript file content from object
241
+ */
242
+ function generateTypeScriptContent(obj: any): string {
243
+ const jsonString = JSON.stringify(obj, null, 2);
244
+
245
+ // Convert JSON to TypeScript object notation
246
+ // Handle keys that need quotes vs those that don't
247
+ let tsContent = jsonString.replaceAll(/"([^"]+)":/g, (match, key) => {
248
+ if (needsQuotes(key)) {
249
+ // Keep quotes for keys with special characters
250
+ return `'${key}':`;
251
+ }
252
+ // Remove quotes for valid identifiers
253
+ return `${key}:`;
254
+ });
255
+
256
+ // Use single quotes for string values
257
+ tsContent = tsContent.replaceAll(/: "([^"]*)"/g, ": '$1'");
258
+
259
+ return `export default ${tsContent};\n`;
260
+ }
261
+
262
+ /**
263
+ * Main function
264
+ */
265
+ async function main() {
266
+ const reportPath = path.join(process.cwd(), 'i18n-unused-keys-report.json');
267
+
268
+ // Check if report exists
269
+ if (!fs.existsSync(reportPath)) {
270
+ consola.error(
271
+ `Report file not found: ${reportPath}\n` +
272
+ 'Please run "bun run workflow:i18n-analyze" first to generate the report.',
273
+ );
274
+ throw new Error('Report file not found');
275
+ }
276
+
277
+ // Load report
278
+ const reportContent = fs.readFileSync(reportPath, 'utf8');
279
+ const report: ReportData = JSON.parse(reportContent);
280
+
281
+ consola.box('🧹 Clean Unused i18n Keys');
282
+ consola.info('');
283
+
284
+ // Show statistics
285
+ consola.info(colors.cyan('Statistics from report:'));
286
+ consola.info(` Total keys: ${report.statistics.totalKeys}`);
287
+ consola.info(` Used keys: ${report.statistics.usedKeys}`);
288
+ consola.info(` Unused keys: ${colors.red(report.statistics.unusedKeys.toString())}`);
289
+ consola.info(` Usage rate: ${report.statistics.usageRate}`);
290
+ consola.info('');
291
+
292
+ if (report.unusedKeys.length === 0) {
293
+ consola.success('No unused keys to clean!');
294
+ return;
295
+ }
296
+
297
+ // Ask for confirmation
298
+ const args = process.argv.slice(2);
299
+ const dryRun = !args.includes('--no-dry-run');
300
+
301
+ if (dryRun) {
302
+ consola.warn('Running in DRY RUN mode - no files will be modified');
303
+ consola.info('To actually clean the files, run: bun run workflow:i18n-clean --no-dry-run');
304
+ consola.info('');
305
+ } else {
306
+ consola.warn('⚠️ WARNING: This will modify your locale files!');
307
+ consola.info('Make sure you have committed your changes or have a backup.');
308
+ consola.info('');
309
+ }
310
+
311
+ // Clean default locale files (TypeScript)
312
+ consola.box('Step 1: Cleaning default locale files (TypeScript)');
313
+ const removedFromDefault = cleanDefaultLocaleFiles(report.unusedKeys, dryRun);
314
+ consola.info('');
315
+
316
+ // Clean locale JSON files
317
+ consola.box('Step 2: Cleaning locale JSON files');
318
+ const removedFromJson = cleanLocaleJsonFiles(report.unusedKeys, dryRun);
319
+ consola.info('');
320
+
321
+ // Summary
322
+ consola.box('Summary');
323
+ consola.info(`Keys marked for removal: ${colors.red(report.unusedKeys.length.toString())}`);
324
+ consola.info(
325
+ `Total operations: ${colors.yellow((removedFromDefault + removedFromJson).toString())}`,
326
+ );
327
+
328
+ if (dryRun) {
329
+ consola.info('');
330
+ consola.warn('This was a DRY RUN - no files were modified');
331
+ consola.info('To actually clean the files, run:');
332
+ consola.info(colors.cyan(' bun run workflow:i18n-clean --no-dry-run'));
333
+ } else {
334
+ consola.success('✓ Cleanup completed!');
335
+ consola.info('');
336
+ consola.info('Next steps:');
337
+ consola.info(' 1. Review the changes with git diff');
338
+ consola.info(' 2. Run "bun run i18n" to regenerate all locale files');
339
+ consola.info(' 3. Test your application');
340
+ consola.info(' 4. Commit the changes');
341
+ }
342
+ }
343
+
344
+ main();
@@ -0,0 +1,3 @@
1
+ {
2
+ "appName": "Chat应用"
3
+ }
@@ -1 +1,3 @@
1
- export default {};
1
+ export default {
2
+ appName: "Chat应用",
3
+ };