generator-mico-cli 0.2.28 → 0.2.30

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 (112) hide show
  1. package/README.md +7 -20
  2. package/bin/mico.js +27 -62
  3. package/generators/micro-react/index.js +25 -1
  4. package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +3 -0
  5. package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +1 -0
  6. package/generators/micro-react/templates/CICD/start_dev.sh +11 -0
  7. package/generators/micro-react/templates/CICD/start_local.sh +9 -0
  8. package/generators/micro-react/templates/CICD/start_prod.sh +13 -0
  9. package/generators/micro-react/templates/CICD/start_test.sh +11 -0
  10. package/generators/micro-react/templates/CLAUDE.md +1 -0
  11. package/generators/micro-react/templates/README.md +1 -1
  12. package/generators/micro-react/templates/apps/layout/config/config.dev.ts +13 -5
  13. package/generators/micro-react/templates/apps/layout/config/config.prod.development.ts +12 -0
  14. package/generators/micro-react/templates/apps/layout/config/config.prod.testing.ts +12 -0
  15. package/generators/micro-react/templates/apps/layout/config/config.prod.ts +14 -0
  16. package/generators/micro-react/templates/apps/layout/docs/feature-PermissionFilter/346/214/211/351/222/256/346/235/203/351/231/220.md +116 -0
  17. package/generators/micro-react/templates/apps/layout/docs/feature-/345/233/275/351/231/205/345/214/226.md +121 -0
  18. package/generators/micro-react/templates/apps/layout/docs/feature-/345/276/256/345/211/215/347/253/257/346/250/241/345/274/217.md +8 -0
  19. package/generators/micro-react/templates/apps/layout/docs/feature-/350/217/234/345/215/225/346/235/203/351/231/220/346/216/247/345/210/266.md +83 -77
  20. package/generators/micro-react/templates/apps/layout/docs/feature-/350/267/257/347/224/261/344/270/216/350/217/234/345/215/225/350/247/243/350/200/246.md +50 -35
  21. package/generators/micro-react/templates/apps/layout/docs/feature-/350/267/257/347/224/261/346/235/203/351/231/220/346/227/245/345/277/227.md +162 -0
  22. package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +23 -31
  23. package/generators/micro-react/templates/apps/layout/mock/menus.ts +14 -0
  24. package/generators/micro-react/templates/apps/layout/mock/pages.ts +27 -8
  25. package/generators/micro-react/templates/apps/layout/package.json +2 -0
  26. package/generators/micro-react/templates/apps/layout/src/app.tsx +85 -4
  27. package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +3 -0
  28. package/generators/micro-react/templates/apps/layout/src/common/auth/tenant.ts +25 -0
  29. package/generators/micro-react/templates/apps/layout/src/common/auth/type.ts +41 -27
  30. package/generators/micro-react/templates/apps/layout/src/common/intl/formatLayoutMessage.ts +30 -0
  31. package/generators/micro-react/templates/apps/layout/src/common/intl/index.ts +6 -0
  32. package/generators/micro-react/templates/apps/layout/src/common/intl/intlRuntime.ts +14 -0
  33. package/generators/micro-react/templates/apps/layout/src/common/intl/localeMapping.ts +30 -0
  34. package/generators/micro-react/templates/apps/layout/src/common/intl/types.ts +14 -0
  35. package/generators/micro-react/templates/apps/layout/src/common/intl/useLayoutIntl.ts +40 -0
  36. package/generators/micro-react/templates/apps/layout/src/common/logger.ts +3 -4
  37. package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +148 -85
  38. package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +29 -6
  39. package/generators/micro-react/templates/apps/layout/src/common/micro/types.ts +23 -0
  40. package/generators/micro-react/templates/apps/layout/src/common/portal-data.ts +46 -2
  41. package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +74 -15
  42. package/generators/micro-react/templates/apps/layout/src/common/request/token-refresh.ts +2 -0
  43. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +32 -6
  44. package/generators/micro-react/templates/apps/layout/src/components/PermissionFilter/index.tsx +51 -0
  45. package/generators/micro-react/templates/apps/layout/src/components/RightContent/AvatarDropdown.tsx +10 -1
  46. package/generators/micro-react/templates/apps/layout/src/components/RightContent/TenantDropdown.tsx +76 -0
  47. package/generators/micro-react/templates/apps/layout/src/components/RightContent/index.ts +1 -0
  48. package/generators/micro-react/templates/apps/layout/src/components/RightContent/tenant-dropdown.less +48 -0
  49. package/generators/micro-react/templates/apps/layout/src/constants/index.ts +1 -0
  50. package/generators/micro-react/templates/apps/layout/src/hooks/index.ts +1 -0
  51. package/generators/micro-react/templates/apps/layout/src/hooks/useMenuState.ts +18 -0
  52. package/generators/micro-react/templates/apps/layout/src/hooks/useTenant.ts +41 -0
  53. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +4 -1
  54. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +21 -9
  55. package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +105 -60
  56. package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +28 -0
  57. package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +26 -0
  58. package/generators/micro-react/templates/apps/layout/src/pages/404/index.tsx +7 -3
  59. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +32 -0
  60. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +148 -4
  61. package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +2 -1
  62. package/generators/micro-react/templates/apps/layout/src/services/user.ts +79 -21
  63. package/generators/micro-react/templates/apps/layout/typings.d.ts +16 -0
  64. package/generators/micro-react/templates/docs/package-shared.md +189 -0
  65. package/generators/micro-react/templates/package.json +1 -1
  66. package/generators/micro-react/templates/packages/common-intl/README.md +78 -368
  67. package/generators/micro-react/templates/packages/common-intl/package.json +3 -13
  68. package/generators/micro-react/templates/packages/common-intl/src/index.ts +5 -6
  69. package/generators/micro-react/templates/packages/common-intl/src/intl.ts +115 -28
  70. package/generators/micro-react/templates/packages/common-intl/src/umiLocaleBridge.ts +101 -0
  71. package/generators/micro-react/templates/packages/common-intl/tsconfig.json +2 -4
  72. package/generators/micro-react/templates/packages/shared/README.md +120 -0
  73. package/generators/micro-react/templates/packages/shared/package.json +26 -0
  74. package/generators/micro-react/templates/packages/shared/services/common/index.ts +43 -0
  75. package/generators/micro-react/templates/packages/shared/services/index.ts +21 -0
  76. package/generators/micro-react/templates/packages/shared/services/request.ts +43 -0
  77. package/generators/micro-react/templates/packages/shared/timezone/index.ts +228 -0
  78. package/generators/micro-react/templates/packages/shared/tsconfig.json +20 -0
  79. package/generators/micro-react/templates/scripts/apply-sentry-plugin.ts +6 -1
  80. package/generators/micro-react/templates/turbo.json +9 -1
  81. package/generators/subapp-react/index.js +28 -22
  82. package/generators/subapp-react/templates/homepage/README.md +1 -0
  83. package/generators/subapp-react/templates/homepage/config/config.prod.development.ts +1 -0
  84. package/generators/subapp-react/templates/homepage/config/config.prod.testing.ts +1 -0
  85. package/generators/subapp-react/templates/homepage/config/config.prod.ts +1 -0
  86. package/generators/subapp-react/templates/homepage/config/config.ts +10 -0
  87. package/generators/subapp-react/templates/homepage/docs/feature-PermissionFilter/346/214/211/351/222/256/346/235/203/351/231/220.md +35 -0
  88. package/generators/subapp-react/templates/homepage/docs/feature-/345/233/275/351/231/205/345/214/226.md +124 -0
  89. package/generators/subapp-react/templates/homepage/package.json +3 -1
  90. package/generators/subapp-react/templates/homepage/src/app.tsx +104 -2
  91. package/generators/subapp-react/templates/homepage/src/common/intl/index.ts +15 -0
  92. package/generators/subapp-react/templates/homepage/src/common/intl/intlRuntime.ts +14 -0
  93. package/generators/subapp-react/templates/homepage/src/common/intl/localeMapping.ts +24 -0
  94. package/generators/subapp-react/templates/homepage/src/common/intl/subappIntlConfig.ts +28 -0
  95. package/generators/subapp-react/templates/homepage/src/common/intl/subappLocale.ts +18 -0
  96. package/generators/subapp-react/templates/homepage/src/common/intl/subappOwnIntl.ts +63 -0
  97. package/generators/subapp-react/templates/homepage/src/common/intl/types.ts +14 -0
  98. package/generators/subapp-react/templates/homepage/src/common/intl/useSubappIntl.ts +61 -0
  99. package/generators/subapp-react/templates/homepage/src/common/locale.ts +80 -0
  100. package/generators/subapp-react/templates/homepage/src/common/mainApp.ts +41 -2
  101. package/generators/subapp-react/templates/homepage/src/components/PermissionFilter/index.tsx +48 -0
  102. package/generators/subapp-react/templates/homepage/src/locales/en-US.ts +6 -0
  103. package/generators/subapp-react/templates/homepage/src/locales/zh-CN.ts +6 -0
  104. package/generators/subapp-react/templates/homepage/src/pages/index.less +10 -0
  105. package/generators/subapp-react/templates/homepage/src/pages/index.tsx +86 -1
  106. package/generators/subapp-react/templates/homepage/typings.d.ts +12 -0
  107. package/lib/utils.js +0 -1
  108. package/package.json +2 -2
  109. package/generators/micro-react/templates/apps/layout/docs/common-intl.md +0 -372
  110. package/generators/micro-react/templates/packages/common-intl/src/indexedDBUtils.ts +0 -51
  111. package/generators/micro-react/templates/packages/common-intl/src/utils.ts +0 -482
  112. package/generators/micro-react/templates/packages/common-intl/vite.config.ts +0 -25
@@ -1,482 +0,0 @@
1
- import { isIndexedDBSupported, openDatabase } from './indexedDBUtils';
2
-
3
- // ============ Window 类型扩展 ============
4
-
5
- /**
6
- * 扩展 Window 接口,声明微前端共享的全局翻译缓存
7
- */
8
- declare global {
9
- interface Window {
10
- __MICO_COMMON_INTL_TRANSLATIONS__?: Record<string, Record<string, string>>;
11
- }
12
- }
13
-
14
- // ============ 常量定义 ============
15
-
16
- export const LANG = {
17
- ZH_CN: 'zh_CN',
18
- EN_US: 'en',
19
- /** 阿拉伯语 */
20
- AR_SA: 'ar',
21
- /** 土耳其语 */
22
- TR_TR: 'tr',
23
- } as const;
24
-
25
- export type ILang = (typeof LANG)[keyof typeof LANG];
26
-
27
- // ============ 类型定义 ============
28
-
29
- /**
30
- * 消息提示实例接口
31
- */
32
- export interface IMessageInstance {
33
- error: (message: string) => unknown;
34
- warning: (message: string) => unknown;
35
- }
36
-
37
- /**
38
- * 初始化国际化参数接口
39
- */
40
- export interface IInitIntlParams {
41
- /** 请求实例,用于请求多语言数据 */
42
- requestInstance: (
43
- url: string,
44
- options: { method: string; params: Record<string, string> },
45
- ) => Promise<{
46
- code: number;
47
- data?: Record<string, string>;
48
- errorMessage?: string;
49
- }>;
50
- /** 消息提示实例,必填,外部自定义消息提示 */
51
- messageInstance: IMessageInstance;
52
- /** 获取多语言数据的参数 */
53
- fetchMultilingualDataParams: {
54
- tag: string;
55
- lang: ILang;
56
- app_name: string;
57
- };
58
- /** IndexedDB 参数,可选 */
59
- indexedDBParams?: {
60
- dbName?: string;
61
- dbVersion?: number;
62
- storeName?: string;
63
- keyPathKey?: string;
64
- };
65
- }
66
-
67
- /**
68
- * i18n 函数参数接口
69
- */
70
- export interface II18nParams {
71
- /** 翻译文案的 key */
72
- key: string;
73
- /** 插值数组 [AA, BB, CC, ... ZZ],用于替换文案中的占位符 %AA% %BB% %CC% ... %ZZ% 等 */
74
- interpolations?: Array<string | number | undefined>;
75
- /** 兜底文案,当找不到翻译时返回 */
76
- defaultMessage: string;
77
- }
78
-
79
- // ============ API 配置 ============
80
-
81
- const API_CONFIG = {
82
- development: 'https://api-test.micoplatform.com/lang_server/pull',
83
- testing: 'https://api-test.micoplatform.com/lang_server/pull',
84
- production: 'https://api.micoplatform.com/lang_server/pull',
85
- };
86
-
87
- // ============ 全局状态 ============
88
-
89
- /**
90
- * 语言管理工具
91
- * 支持三种配置渠道,优先级从高到低:
92
- * 1. URL 参数 (lang)
93
- * 2. localStorage 配置 (umi_locale)
94
- * 3. 默认浏览器语言
95
- */
96
-
97
- const LOCALE_STORAGE_KEY = 'umi_locale';
98
- const URL_PARAM_KEY = 'lang';
99
-
100
- /**
101
- * 支持的语言列表
102
- */
103
- export const SUPPORTED_LOCALES = Object.values(LANG) as ILang[];
104
-
105
- /**
106
- * 默认语言
107
- */
108
- const DEFAULT_LOCALE: ILang = LANG.EN_US;
109
-
110
- /**
111
- * 从 URL 参数获取语言
112
- */
113
- function getLocaleFromUrl(): string | null {
114
- if (typeof window === 'undefined') {
115
- return null;
116
- }
117
- const urlParams = new URLSearchParams(window.location.search);
118
- return urlParams.get(URL_PARAM_KEY);
119
- }
120
-
121
- /**
122
- * 从 localStorage 获取语言
123
- */
124
- function getLocaleFromStorage(): string | null {
125
- if (typeof window === 'undefined') {
126
- return null;
127
- }
128
- try {
129
- return localStorage.getItem(LOCALE_STORAGE_KEY);
130
- } catch {
131
- return null;
132
- }
133
- }
134
-
135
- /**
136
- * 获取浏览器默认语言
137
- */
138
- function getBrowserLocale(): ILang {
139
- if (typeof window === 'undefined') {
140
- return DEFAULT_LOCALE;
141
- }
142
- const browserLang = navigator.language;
143
- // 检查语言前缀(如 zh-TW -> zh-CN)
144
- const langPrefix = browserLang.split('-')[0];
145
- const matchedLocale = SUPPORTED_LOCALES.find((locale) =>
146
- locale.startsWith(langPrefix),
147
- );
148
- return matchedLocale || DEFAULT_LOCALE;
149
- }
150
-
151
- /**
152
- * 验证语言是否支持
153
- */
154
- function isValidLocale(locale: string | null): locale is ILang {
155
- if (!locale) {
156
- return false;
157
- }
158
- return SUPPORTED_LOCALES.includes(locale as ILang);
159
- }
160
-
161
- /**
162
- * 获取当前语言(按优先级)
163
- * 优先级:URL 参数 > localStorage > 浏览器默认语言
164
- */
165
- export function getCurrentLocale(): ILang {
166
- // 1. 优先从 URL 参数获取
167
- const urlLocale = getLocaleFromUrl();
168
- if (isValidLocale(urlLocale)) {
169
- return urlLocale;
170
- }
171
-
172
- // 2. 从 localStorage 获取
173
- const storageLocale = getLocaleFromStorage();
174
- if (isValidLocale(storageLocale)) {
175
- return storageLocale;
176
- }
177
-
178
- // 3. 使用浏览器默认语言
179
- return getBrowserLocale();
180
- }
181
-
182
- /**
183
- * 设置语言到 localStorage
184
- */
185
- export function setLocaleToStorage(locale: ILang): void {
186
- if (typeof window === 'undefined') {
187
- return;
188
- }
189
- try {
190
- localStorage.setItem(LOCALE_STORAGE_KEY, locale);
191
- } catch (error) {
192
- console.error('Failed to save locale to localStorage:', error);
193
- }
194
- }
195
-
196
- /**
197
- * 获取共享的翻译缓存对象
198
- */
199
- function getSharedTranslationsCache(): Record<string, Record<string, string>> {
200
- if (typeof window !== "undefined") {
201
- if (!window.__MICO_COMMON_INTL_TRANSLATIONS__) {
202
- window.__MICO_COMMON_INTL_TRANSLATIONS__ = {};
203
- }
204
- return window.__MICO_COMMON_INTL_TRANSLATIONS__;
205
- }
206
- // 非浏览器环境使用本地缓存
207
- return {};
208
- }
209
-
210
- /**
211
- * IndexedDB 配置
212
- */
213
- let dbConfig = {
214
- dbName: 'mico_cs_i18n_db',
215
- dbVersion: 1,
216
- storeName: 'translations',
217
- keyPathKey: 'locale',
218
- };
219
-
220
- // ============ IndexedDB 存储相关 ============
221
-
222
- /**
223
- * 将翻译数据存储到 IndexedDB
224
- * @param locale 语言环境
225
- * @param translations 翻译数据
226
- */
227
- async function saveTranslationsToStorage(
228
- locale: ILang,
229
- translations: Record<string, string>,
230
- ): Promise<void> {
231
- // 同时更新全局变量缓存(使用共享缓存,支持微前端)
232
- getSharedTranslationsCache()[locale] = translations;
233
-
234
- if (!isIndexedDBSupported()) {
235
- return;
236
- }
237
-
238
- try {
239
- const database = await openDatabase(
240
- dbConfig.dbName,
241
- dbConfig.dbVersion,
242
- dbConfig.storeName,
243
- dbConfig.keyPathKey,
244
- );
245
- const transaction = database.transaction(dbConfig.storeName, 'readwrite');
246
- const store = transaction.objectStore(dbConfig.storeName);
247
-
248
- return new Promise((resolve, reject) => {
249
- const request = store.put({ locale, translations });
250
- request.onsuccess = () => resolve();
251
- request.onerror = () => reject(request.error);
252
- });
253
- } catch (error) {
254
- console.error('保存翻译数据到 IndexedDB 失败:', error);
255
- }
256
- }
257
-
258
- /**
259
- * 从 IndexedDB 获取翻译数据
260
- * @param locale 语言环境
261
- */
262
- async function getTranslationsFromStorage(
263
- locale: ILang,
264
- ): Promise<Record<string, string> | null> {
265
- // 优先从全局变量缓存获取(使用共享缓存,支持微前端)
266
- const sharedCache = getSharedTranslationsCache();
267
- if (sharedCache[locale]) {
268
- return sharedCache[locale];
269
- }
270
-
271
- if (!isIndexedDBSupported()) {
272
- return null;
273
- }
274
-
275
- try {
276
- const database = await openDatabase(
277
- dbConfig.dbName,
278
- dbConfig.dbVersion,
279
- dbConfig.storeName,
280
- dbConfig.keyPathKey,
281
- );
282
- const transaction = database.transaction(dbConfig.storeName, 'readonly');
283
- const store = transaction.objectStore(dbConfig.storeName);
284
-
285
- return new Promise((resolve, reject) => {
286
- const request = store.get(locale);
287
- request.onsuccess = () => {
288
- const result = request.result;
289
- if (result) {
290
- // 同步到全局变量缓存(使用共享缓存,支持微前端)
291
- getSharedTranslationsCache()[locale] = result.translations;
292
- resolve(result.translations);
293
- } else {
294
- resolve(null);
295
- }
296
- };
297
- request.onerror = () => reject(request.error);
298
- });
299
- } catch (error) {
300
- console.error('从 IndexedDB 获取翻译数据失败:', error);
301
- return null;
302
- }
303
- }
304
-
305
- /**
306
- * 同步获取翻译数据(仅从全局变量缓存获取)
307
- * @param locale 语言环境
308
- */
309
- function getTranslationsFromCacheSync(
310
- locale: ILang,
311
- ): Record<string, string> | null {
312
- // 使用共享缓存,支持微前端
313
- return getSharedTranslationsCache()[locale] || null;
314
- }
315
-
316
- // ============ i18n 函数 ============
317
-
318
- /**
319
- * 国际化翻译函数
320
- *
321
- * 从全局变量缓存中获取翻译后的文案,支持插值替换
322
- *
323
- * @param params 参数对象
324
- * @param params.key 翻译文案的 key
325
- * @param params.interpolations 插值数组,用于替换文案中的占位符
326
- * @param params.defaultMessage 兜底文案,当找不到翻译时返回
327
- * @returns 翻译后的文案
328
- *
329
- * @example
330
- * // 无插值示例
331
- * i18n({ key: 'common_cancel', defaultMessage: '取消' })
332
- * // 返回 'Cancel' 或兜底文案 '取消'
333
- *
334
- * @example
335
- * // 单个插值示例
336
- * i18n({ key: 'common_page_total_count', interpolations: [pagination.total], defaultMessage: `总数量: ${pagination.total}条` })
337
- * // 如果翻译文案为 '总数量: %AA%条',则返回 '总数量: 100条'
338
- *
339
- * @example
340
- * // 多个插值示例
341
- * i18n({ key: 'some_key', interpolations: [valueA, valueB, valueC], defaultMessage: `XXX${valueA}YYY${valueB}ZZZ${valueC}` })
342
- * // 如果翻译文案为 'XXX%AA%YYY%BB%ZZZ%CC%',则按顺序替换占位符
343
- */
344
- export function i18n({
345
- key,
346
- interpolations = [],
347
- defaultMessage,
348
- }: II18nParams): string {
349
- // 从缓存同步获取翻译数据(使用共享语言环境,支持微前端)
350
- const translations = getTranslationsFromCacheSync(getCurrentLocale());
351
-
352
- // 获取翻译文案,如果没有则使用兜底文案
353
- let text = translations?.[key] || defaultMessage;
354
-
355
- // 处理插值替换
356
- // 占位符格式:%AA% %BB% %CC% ... %ZZ%
357
- if (interpolations.length > 0) {
358
- const placeholderPattern = /%([A-Z]{2})%/g;
359
- let placeholderIndex = 0;
360
-
361
- text = text.replace(placeholderPattern, () => {
362
- if (placeholderIndex < interpolations.length) {
363
- const value = interpolations[placeholderIndex];
364
- placeholderIndex++;
365
- return String(value ?? '');
366
- }
367
- return '';
368
- });
369
- }
370
-
371
- return text;
372
- }
373
-
374
- // ============ 初始化函数 ============
375
-
376
- /**
377
- * 初始化国际化模块
378
- *
379
- * @param params 初始化参数
380
- * @returns 返回配置好的 fetchMultilingualData 函数
381
- *
382
- * @example
383
- * const fetchMultilingualData = initIntl({
384
- * requestInstance: request,
385
- * messageInstance: {
386
- * error: (msg) => Toast.error(msg),
387
- * warning: (msg) => Toast.warn(msg),
388
- * },
389
- * fetchMultilingualDataParams: {
390
- * tag: 'cs_fe_mobile',
391
- * lang: 'zh-CN',
392
- * app_name: 'middle',
393
- * },
394
- * indexedDBParams: {
395
- * dbName: 'mico_cs_mobile_i18n_db',
396
- * },
397
- * });
398
- */
399
- export function initIntl(params: IInitIntlParams) {
400
- const {
401
- requestInstance,
402
- messageInstance,
403
- fetchMultilingualDataParams,
404
- indexedDBParams,
405
- } = params;
406
-
407
- // 合并默认 IndexedDB 参数
408
- dbConfig = {
409
- dbName: 'mico_cs_i18n_db',
410
- dbVersion: 1,
411
- storeName: 'translations',
412
- keyPathKey: 'locale',
413
- ...indexedDBParams,
414
- };
415
-
416
- // 设置当前语言环境到 window,支持微前端共享
417
- // setCurrentLocaleToGlobal(fetchMultilingualDataParams.lang);
418
-
419
- /**
420
- * 获取多语言中台接口
421
- * @returns Promise 回调可以获取当前多语言数据
422
- */
423
- return function fetchMultilingualData(): Promise<Record<string, string>> {
424
- const { tag, lang, app_name } = fetchMultilingualDataParams;
425
-
426
- // 验证必填参数
427
- if (!tag) {
428
- throw new Error('参数 tag 不能为空');
429
- }
430
- if (!lang) {
431
- throw new Error('参数 lang 不能为空');
432
- }
433
- if (!app_name) {
434
- throw new Error('参数 app_name 不能为空');
435
- }
436
-
437
- // @ts-expect-error - process.env 类型在不同构建环境中可能不兼容
438
- return requestInstance(process.env.LOCALE_REQUEST_URL || API_CONFIG[process.env.REACT_APP_ENV as keyof typeof API_CONFIG] || API_CONFIG.production, {
439
- method: 'GET',
440
- params: {
441
- tag,
442
- lang,
443
- app_name,
444
- },
445
- })
446
- .then((response) => {
447
- if (response.code !== 0) {
448
- const errorMessage = `${
449
- response.errorMessage || '获取多语言文案失败'
450
- }。响应码:${response.code}`;
451
- console.error(errorMessage, response);
452
- messageInstance.error(errorMessage);
453
- return {};
454
- }
455
-
456
- const translations = response.data || {};
457
-
458
- // 存储到 IndexedDB 和全局变量缓存
459
- saveTranslationsToStorage(getCurrentLocale(), translations).catch(
460
- (error) => {
461
- console.error('存储翻译数据失败:', error);
462
- },
463
- );
464
-
465
- return translations;
466
- })
467
- .catch(async (error) => {
468
- const errorMessage = error.message || '获取多语言文案失败';
469
- console.error(errorMessage, error);
470
- messageInstance.warning(errorMessage);
471
-
472
- const cachedTranslations =
473
- await getTranslationsFromStorage(getCurrentLocale());
474
- if (cachedTranslations) {
475
- console.warn('使用本地缓存的翻译文案');
476
- return cachedTranslations;
477
- }
478
-
479
- return {};
480
- });
481
- };
482
- }
@@ -1,25 +0,0 @@
1
- import { defineConfig } from 'vite';
2
- import dts from 'vite-plugin-dts';
3
-
4
- export default defineConfig({
5
- plugins: [
6
- dts({
7
- insertTypesEntry: true,
8
- outDir: 'dist',
9
- }),
10
- ],
11
- build: {
12
- lib: {
13
- entry: './src/index.ts',
14
- formats: ['es'],
15
- fileName: 'index',
16
- },
17
- outDir: 'dist',
18
- emptyOutDir: true,
19
- sourcemap: false,
20
- rollupOptions: {
21
- // 不打包外部依赖
22
- external: [],
23
- },
24
- },
25
- });