@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.
- package/dist/templates/AntdStaticMethods/index.tsx +20 -0
- package/dist/templates/AppTheme.tsx +136 -0
- package/dist/templates/DIRECTORY_STRUCTURE.md +141 -0
- package/dist/templates/GlobalProvider/AppTheme.tsx +136 -0
- package/dist/templates/GlobalProvider/Locale.tsx +84 -0
- package/dist/templates/GlobalProvider/Query.tsx +12 -0
- package/dist/templates/GlobalProvider/StyleRegistry.tsx +9 -0
- package/dist/templates/GlobalProvider/index.tsx +23 -0
- package/dist/templates/HarmonyOS_Sans_Bold.woff2 +0 -0
- package/dist/templates/HarmonyOS_Sans_Medium.woff2 +0 -0
- package/dist/templates/HarmonyOS_Sans_Regular.woff2 +0 -0
- package/dist/templates/Locale.tsx +49 -54
- package/dist/templates/MainContentWrap.tsx +11 -15
- package/dist/templates/Query.tsx +12 -0
- package/dist/templates/StyleRegistry.tsx +9 -0
- package/dist/templates/ThemeContext.tsx +27 -24
- package/dist/templates/analyzeUnusedKeys.ts +506 -0
- package/dist/templates/app/.i18nrc.js +57 -0
- package/dist/templates/app/config/env/.env.public.tpl +2 -19
- package/dist/templates/app/config/jwt/index.ts +4 -4
- package/dist/templates/app/config/request/error-handler.ts +67 -0
- package/dist/templates/app/config/request/index.ts +127 -129
- package/dist/templates/app/config/request/interceptors.ts +118 -0
- package/dist/templates/app/config/request/token-manager.ts +23 -0
- package/dist/templates/app/config/request/types.ts +63 -0
- package/dist/templates/app/config/rspack/rspack.config.mjs +62 -61
- package/dist/templates/app/config/rspack/rspack.prod.mjs +41 -62
- package/dist/templates/app/docs/DIRECTORY_STRUCTURE.md +141 -0
- package/dist/templates/app/docs/glossary.md +11 -0
- package/dist/templates/app/locales/zh-CN/common.json +3 -0
- package/dist/templates/app/package.json.tpl +8 -25
- package/dist/templates/app/public/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
- package/dist/templates/app/public/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
- package/dist/templates/app/public/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
- package/dist/templates/app/react-app-env.d.ts +13 -8
- package/dist/templates/app/scripts/i18nWorkflow/analyzeUnusedKeys.ts +506 -0
- package/dist/templates/app/scripts/i18nWorkflow/cleanUnusedKeys.ts +344 -0
- package/dist/templates/app/scripts/i18nWorkflow/const.ts +18 -0
- package/dist/templates/app/scripts/i18nWorkflow/flattenLocaleKeys.ts +139 -0
- package/dist/templates/app/scripts/i18nWorkflow/genDefaultLocale.ts +19 -0
- package/dist/templates/app/scripts/i18nWorkflow/genDiff.ts +49 -0
- package/dist/templates/app/scripts/i18nWorkflow/i18nConfig.ts +7 -0
- package/dist/templates/app/scripts/i18nWorkflow/index.ts +11 -0
- package/dist/templates/app/scripts/i18nWorkflow/protectedPatterns.ts +91 -0
- package/dist/templates/app/scripts/i18nWorkflow/utils.ts +76 -0
- package/dist/templates/app/src/bootstrap/index.ts +34 -0
- package/dist/templates/app/src/components/AntdStaticMethods/index.tsx +20 -0
- package/dist/templates/app/src/config/env.ts +84 -0
- package/dist/templates/app/src/index.tsx +13 -51
- package/dist/templates/app/src/layout/GlobalProvider/AppTheme.tsx +136 -0
- package/dist/templates/app/src/layout/GlobalProvider/Locale.tsx +84 -0
- package/dist/templates/app/src/layout/GlobalProvider/Query.tsx +12 -0
- package/dist/templates/app/src/layout/GlobalProvider/StyleRegistry.tsx +9 -0
- package/dist/templates/app/src/layout/GlobalProvider/index.tsx +23 -0
- package/dist/templates/app/src/layout/Locale.tsx +14 -18
- package/dist/templates/app/src/layout/MainContentWrap.tsx +11 -15
- package/dist/templates/app/src/layout/ThemeContext.tsx +27 -24
- package/dist/templates/app/src/locales/default/common.ts +3 -1
- package/dist/templates/app/src/locales/utils.ts +23 -0
- package/dist/templates/app/src/micro/garfish.ts +53 -0
- package/dist/templates/app/src/pages/base/index.tsx +280 -25
- package/dist/templates/app/src/routes.tsx +21 -12
- package/dist/templates/app/src/types/global.d.ts +19 -0
- package/dist/templates/app/src/utils/index.ts +3 -1
- package/dist/templates/app/store/middleware/createDevtools.ts +7 -7
- package/dist/templates/app/tsconfig.json +19 -3
- package/dist/templates/base/index.tsx +280 -25
- package/dist/templates/bootstrap/index.ts +34 -0
- package/dist/templates/cleanUnusedKeys.ts +344 -0
- package/dist/templates/common.json +3 -0
- package/dist/templates/common.ts +3 -1
- package/dist/templates/components/AntdStaticMethods/index.tsx +20 -0
- package/dist/templates/config/env/.env.public.tpl +2 -19
- package/dist/templates/config/env.ts +84 -0
- package/dist/templates/config/jwt/index.ts +4 -4
- package/dist/templates/config/request/error-handler.ts +67 -0
- package/dist/templates/config/request/index.ts +127 -129
- package/dist/templates/config/request/interceptors.ts +118 -0
- package/dist/templates/config/request/token-manager.ts +23 -0
- package/dist/templates/config/request/types.ts +63 -0
- package/dist/templates/config/rspack/rspack.config.mjs +62 -61
- package/dist/templates/config/rspack/rspack.prod.mjs +41 -62
- package/dist/templates/const.ts +18 -0
- package/dist/templates/createDevtools.ts +7 -7
- package/dist/templates/default/common.ts +3 -1
- package/dist/templates/docs/DIRECTORY_STRUCTURE.md +141 -0
- package/dist/templates/docs/glossary.md +11 -0
- package/dist/templates/env/.env.public.tpl +2 -19
- package/dist/templates/env.ts +83 -2
- package/dist/templates/error-handler.ts +67 -0
- package/dist/templates/flattenLocaleKeys.ts +139 -0
- package/dist/templates/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
- package/dist/templates/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
- package/dist/templates/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
- package/dist/templates/garfish.ts +53 -0
- package/dist/templates/genDefaultLocale.ts +19 -0
- package/dist/templates/genDiff.ts +49 -0
- package/dist/templates/global.d.ts +19 -0
- package/dist/templates/glossary.md +11 -0
- package/dist/templates/i18nConfig.ts +7 -0
- package/dist/templates/i18nWorkflow/analyzeUnusedKeys.ts +506 -0
- package/dist/templates/i18nWorkflow/cleanUnusedKeys.ts +344 -0
- package/dist/templates/i18nWorkflow/const.ts +18 -0
- package/dist/templates/i18nWorkflow/flattenLocaleKeys.ts +139 -0
- package/dist/templates/i18nWorkflow/genDefaultLocale.ts +19 -0
- package/dist/templates/i18nWorkflow/genDiff.ts +49 -0
- package/dist/templates/i18nWorkflow/i18nConfig.ts +7 -0
- package/dist/templates/i18nWorkflow/index.ts +11 -0
- package/dist/templates/i18nWorkflow/protectedPatterns.ts +91 -0
- package/dist/templates/i18nWorkflow/utils.ts +76 -0
- package/dist/templates/index.tsx +280 -25
- package/dist/templates/interceptors.ts +118 -0
- package/dist/templates/jwt/index.ts +4 -4
- package/dist/templates/layout/GlobalProvider/AppTheme.tsx +136 -0
- package/dist/templates/layout/GlobalProvider/Locale.tsx +84 -0
- package/dist/templates/layout/GlobalProvider/Query.tsx +12 -0
- package/dist/templates/layout/GlobalProvider/StyleRegistry.tsx +9 -0
- package/dist/templates/layout/GlobalProvider/index.tsx +23 -0
- package/dist/templates/layout/Locale.tsx +14 -18
- package/dist/templates/layout/MainContentWrap.tsx +11 -15
- package/dist/templates/layout/ThemeContext.tsx +27 -24
- package/dist/templates/locales/default/common.ts +3 -1
- package/dist/templates/locales/utils.ts +23 -0
- package/dist/templates/locales/zh-CN/common.json +3 -0
- package/dist/templates/micro/garfish.ts +53 -0
- package/dist/templates/middleware/createDevtools.ts +7 -7
- package/dist/templates/package.json.tpl +8 -25
- package/dist/templates/page.tsx +21 -19
- package/dist/templates/pages/base/index.tsx +280 -25
- package/dist/templates/protectedPatterns.ts +91 -0
- package/dist/templates/public/fonts/HarmonyOS_Sans_Bold.woff2 +0 -0
- package/dist/templates/public/fonts/HarmonyOS_Sans_Medium.woff2 +0 -0
- package/dist/templates/public/fonts/HarmonyOS_Sans_Regular.woff2 +0 -0
- package/dist/templates/react-app-env.d.ts +13 -8
- package/dist/templates/request/error-handler.ts +67 -0
- package/dist/templates/request/index.ts +127 -129
- package/dist/templates/request/interceptors.ts +118 -0
- package/dist/templates/request/token-manager.ts +23 -0
- package/dist/templates/request/types.ts +63 -0
- package/dist/templates/routes.tsx +21 -12
- package/dist/templates/rspack/rspack.config.mjs +62 -61
- package/dist/templates/rspack/rspack.prod.mjs +41 -62
- package/dist/templates/rspack.config.mjs +62 -61
- package/dist/templates/rspack.prod.mjs +41 -62
- package/dist/templates/scripts/i18nWorkflow/analyzeUnusedKeys.ts +506 -0
- package/dist/templates/scripts/i18nWorkflow/cleanUnusedKeys.ts +344 -0
- package/dist/templates/scripts/i18nWorkflow/const.ts +18 -0
- package/dist/templates/scripts/i18nWorkflow/flattenLocaleKeys.ts +139 -0
- package/dist/templates/scripts/i18nWorkflow/genDefaultLocale.ts +19 -0
- package/dist/templates/scripts/i18nWorkflow/genDiff.ts +49 -0
- package/dist/templates/scripts/i18nWorkflow/i18nConfig.ts +7 -0
- package/dist/templates/scripts/i18nWorkflow/index.ts +11 -0
- package/dist/templates/scripts/i18nWorkflow/protectedPatterns.ts +91 -0
- package/dist/templates/scripts/i18nWorkflow/utils.ts +76 -0
- package/dist/templates/src/bootstrap/index.ts +34 -0
- package/dist/templates/src/components/AntdStaticMethods/index.tsx +20 -0
- package/dist/templates/src/config/env.ts +84 -0
- package/dist/templates/src/index.tsx +13 -51
- package/dist/templates/src/layout/GlobalProvider/AppTheme.tsx +136 -0
- package/dist/templates/src/layout/GlobalProvider/Locale.tsx +84 -0
- package/dist/templates/src/layout/GlobalProvider/Query.tsx +12 -0
- package/dist/templates/src/layout/GlobalProvider/StyleRegistry.tsx +9 -0
- package/dist/templates/src/layout/GlobalProvider/index.tsx +23 -0
- package/dist/templates/src/layout/Locale.tsx +14 -18
- package/dist/templates/src/layout/MainContentWrap.tsx +11 -15
- package/dist/templates/src/layout/ThemeContext.tsx +27 -24
- package/dist/templates/src/locales/default/common.ts +3 -1
- package/dist/templates/src/locales/utils.ts +23 -0
- package/dist/templates/src/micro/garfish.ts +53 -0
- package/dist/templates/src/pages/base/index.tsx +280 -25
- package/dist/templates/src/routes.tsx +21 -12
- package/dist/templates/src/types/global.d.ts +19 -0
- package/dist/templates/src/utils/index.ts +3 -1
- package/dist/templates/store/middleware/createDevtools.ts +7 -7
- package/dist/templates/token-manager.ts +23 -0
- package/dist/templates/tsconfig.json +19 -3
- package/dist/templates/type.ts +23 -24
- package/dist/templates/types/global.d.ts +19 -0
- package/dist/templates/utils/index.ts +3 -1
- package/dist/templates/utils.ts +23 -0
- package/dist/templates/zh-CN/common.json +3 -0
- package/package.json +19 -21
- package/dist/templates/app/config/sentry/sentry.config.ts +0 -188
- package/dist/templates/app/src/hooks/useRouteTitle.tsx +0 -36
- package/dist/templates/app/src/hooks/useSentry.ts +0 -92
- package/dist/templates/app/src/pages/base/layout.tsx +0 -6
- package/dist/templates/app/src/pages/base/page.tsx +0 -25
- package/dist/templates/app/src/utils/env.ts +0 -3
- package/dist/templates/app/src/utils/format.ts +0 -21
- package/dist/templates/app/src/utils/getMicroApp.ts +0 -39
- package/dist/templates/app/src/utils/sentry.ts +0 -187
- package/dist/templates/app/src/utils/sentryDecorators.ts +0 -34
- package/dist/templates/app/src/utils/updateVersion.ts +0 -186
- package/dist/templates/base/layout.tsx +0 -6
- package/dist/templates/base/page.tsx +0 -25
- package/dist/templates/config/public/404.png +0 -0
- package/dist/templates/config/public/favicon.ico +0 -0
- package/dist/templates/config/public/images/banner_market_modal.webp +0 -0
- package/dist/templates/config/public/images/chatmode_chat_dark.webp +0 -0
- package/dist/templates/config/public/images/chatmode_chat_light.webp +0 -0
- package/dist/templates/config/public/images/chatmode_docs_dark.webp +0 -0
- package/dist/templates/config/public/images/chatmode_docs_light.webp +0 -0
- package/dist/templates/config/public/images/empty_topic_dark.webp +0 -0
- package/dist/templates/config/public/images/empty_topic_light.webp +0 -0
- package/dist/templates/config/public/images/screenshot_background.webp +0 -0
- package/dist/templates/config/public/images/theme_auto.webp +0 -0
- package/dist/templates/config/public/images/theme_dark.webp +0 -0
- package/dist/templates/config/public/images/theme_light.webp +0 -0
- package/dist/templates/config/public/index.html +0 -29
- package/dist/templates/config/sentry/sentry.config.ts +0 -188
- package/dist/templates/format.ts +0 -21
- package/dist/templates/getMicroApp.ts +0 -39
- package/dist/templates/hooks/useRouteTitle.tsx +0 -36
- package/dist/templates/hooks/useSentry.ts +0 -92
- package/dist/templates/layout.tsx +0 -6
- package/dist/templates/pages/base/layout.tsx +0 -6
- package/dist/templates/pages/base/page.tsx +0 -25
- package/dist/templates/sentry/sentry.config.ts +0 -188
- package/dist/templates/sentry.config.ts +0 -188
- package/dist/templates/sentry.ts +0 -187
- package/dist/templates/sentryDecorators.ts +0 -34
- package/dist/templates/src/hooks/useRouteTitle.tsx +0 -36
- package/dist/templates/src/hooks/useSentry.ts +0 -92
- package/dist/templates/src/pages/base/layout.tsx +0 -6
- package/dist/templates/src/pages/base/page.tsx +0 -25
- package/dist/templates/src/utils/env.ts +0 -3
- package/dist/templates/src/utils/format.ts +0 -21
- package/dist/templates/src/utils/getMicroApp.ts +0 -39
- package/dist/templates/src/utils/sentry.ts +0 -187
- package/dist/templates/src/utils/sentryDecorators.ts +0 -34
- package/dist/templates/src/utils/updateVersion.ts +0 -186
- package/dist/templates/updateVersion.ts +0 -186
- package/dist/templates/useRouteTitle.tsx +0 -36
- package/dist/templates/useSentry.ts +0 -92
- package/dist/templates/utils/env.ts +0 -3
- package/dist/templates/utils/format.ts +0 -21
- package/dist/templates/utils/getMicroApp.ts +0 -39
- package/dist/templates/utils/sentry.ts +0 -187
- package/dist/templates/utils/sentryDecorators.ts +0 -34
- package/dist/templates/utils/updateVersion.ts +0 -186
- /package/dist/templates/app/{config/public → public}/404.png +0 -0
- /package/dist/templates/app/{config/public → public}/favicon.ico +0 -0
- /package/dist/templates/app/{config/public → public}/images/banner_market_modal.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/chatmode_chat_dark.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/chatmode_chat_light.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/chatmode_docs_dark.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/chatmode_docs_light.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/empty_topic_dark.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/empty_topic_light.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/screenshot_background.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/theme_auto.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/theme_dark.webp +0 -0
- /package/dist/templates/app/{config/public → public}/images/theme_light.webp +0 -0
- /package/dist/templates/app/{config/public → public}/index.html +0 -0
|
@@ -1,32 +1,287 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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.
|
|
28
|
-
|
|
29
|
-
|
|
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();
|
package/dist/templates/common.ts
CHANGED