generator-mico-cli 0.2.29 → 0.2.31

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 (96) hide show
  1. package/README.md +10 -7
  2. package/generators/micro-react/README.md +34 -0
  3. package/generators/micro-react/index.js +19 -1
  4. package/generators/micro-react/templates/CICD/start_dev.sh +11 -0
  5. package/generators/micro-react/templates/CICD/start_local.sh +9 -0
  6. package/generators/micro-react/templates/CICD/start_prod.sh +13 -0
  7. package/generators/micro-react/templates/CICD/start_test.sh +11 -0
  8. package/generators/micro-react/templates/apps/layout/config/config.dev.ts +29 -3
  9. package/generators/micro-react/templates/apps/layout/config/config.prod.development.ts +10 -0
  10. package/generators/micro-react/templates/apps/layout/config/config.prod.testing.ts +10 -0
  11. package/generators/micro-react/templates/apps/layout/config/config.prod.ts +12 -0
  12. package/generators/micro-react/templates/apps/layout/config/config.ts +0 -15
  13. package/generators/micro-react/templates/apps/layout/docs/arch-/346/227/245/345/277/227/344/270/216/345/270/270/351/207/217.md +16 -8
  14. package/generators/micro-react/templates/apps/layout/docs/feat-/346/236/204/345/273/272define/344/270/216/345/205/215/350/256/244/350/257/201/345/210/235/345/247/213/346/200/201.md +49 -3
  15. package/generators/micro-react/templates/apps/layout/docs/feature-/345/233/275/351/231/205/345/214/226.md +121 -0
  16. 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
  17. 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 +3 -1
  18. 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 +4 -4
  19. package/generators/micro-react/templates/apps/layout/mock/menus.ts +14 -0
  20. package/generators/micro-react/templates/apps/layout/mock/pages.ts +22 -2
  21. package/generators/micro-react/templates/apps/layout/package.json +3 -2
  22. package/generators/micro-react/templates/apps/layout/src/app.tsx +68 -9
  23. package/generators/micro-react/templates/apps/layout/src/common/auth/auth-check-path.ts +14 -0
  24. package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +4 -0
  25. package/generators/micro-react/templates/apps/layout/src/common/auth/tenant.ts +25 -0
  26. package/generators/micro-react/templates/apps/layout/src/common/auth/type.ts +28 -2
  27. package/generators/micro-react/templates/apps/layout/src/common/intl/formatLayoutMessage.ts +30 -0
  28. package/generators/micro-react/templates/apps/layout/src/common/intl/index.ts +6 -0
  29. package/generators/micro-react/templates/apps/layout/src/common/intl/intlRuntime.ts +14 -0
  30. package/generators/micro-react/templates/apps/layout/src/common/intl/localeMapping.ts +30 -0
  31. package/generators/micro-react/templates/apps/layout/src/common/intl/types.ts +14 -0
  32. package/generators/micro-react/templates/apps/layout/src/common/intl/useLayoutIntl.ts +40 -0
  33. package/generators/micro-react/templates/apps/layout/src/common/logger.ts +50 -18
  34. package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +27 -0
  35. package/generators/micro-react/templates/apps/layout/src/common/micro/types.ts +23 -0
  36. package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +82 -20
  37. package/generators/micro-react/templates/apps/layout/src/common/request/token-refresh.ts +2 -0
  38. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +28 -6
  39. package/generators/micro-react/templates/apps/layout/src/components/RightContent/TenantDropdown.tsx +76 -0
  40. package/generators/micro-react/templates/apps/layout/src/components/RightContent/index.ts +1 -0
  41. package/generators/micro-react/templates/apps/layout/src/components/RightContent/tenant-dropdown.less +48 -0
  42. package/generators/micro-react/templates/apps/layout/src/constants/index.ts +1 -0
  43. package/generators/micro-react/templates/apps/layout/src/hooks/index.ts +1 -0
  44. package/generators/micro-react/templates/apps/layout/src/hooks/useMenuState.ts +18 -0
  45. package/generators/micro-react/templates/apps/layout/src/hooks/useTenant.ts +41 -0
  46. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +4 -1
  47. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +18 -6
  48. package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +11 -0
  49. package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +10 -0
  50. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +27 -0
  51. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +108 -12
  52. package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +2 -1
  53. package/generators/micro-react/templates/apps/layout/src/services/user.ts +53 -2
  54. package/generators/micro-react/templates/apps/layout/typings.d.ts +16 -0
  55. package/generators/micro-react/templates/docs/package-shared.md +189 -0
  56. package/generators/micro-react/templates/package.json +1 -1
  57. package/generators/micro-react/templates/packages/common-intl/README.md +3 -1
  58. package/generators/micro-react/templates/packages/common-intl/package.json +1 -1
  59. package/generators/micro-react/templates/packages/common-intl/src/index.ts +4 -2
  60. package/generators/micro-react/templates/packages/common-intl/src/intl.ts +104 -8
  61. package/generators/micro-react/templates/packages/common-intl/src/umiLocaleBridge.ts +101 -0
  62. package/generators/micro-react/templates/packages/shared/README.md +120 -0
  63. package/generators/micro-react/templates/packages/shared/package.json +26 -0
  64. package/generators/micro-react/templates/packages/shared/services/common/index.ts +43 -0
  65. package/generators/micro-react/templates/packages/shared/services/index.ts +21 -0
  66. package/generators/micro-react/templates/packages/shared/services/request.ts +43 -0
  67. package/generators/micro-react/templates/packages/shared/timezone/index.ts +228 -0
  68. package/generators/micro-react/templates/packages/shared/tsconfig.json +20 -0
  69. package/generators/micro-react/templates/scripts/apply-sentry-plugin.ts +6 -1
  70. package/generators/micro-react/templates/turbo.json +9 -1
  71. package/generators/subapp-react/README.md +43 -0
  72. package/generators/subapp-react/index.js +2 -0
  73. package/generators/subapp-react/templates/homepage/README.md +5 -1
  74. package/generators/subapp-react/templates/homepage/config/config.dev.ts +20 -0
  75. package/generators/subapp-react/templates/homepage/config/config.ts +10 -15
  76. package/generators/subapp-react/templates/homepage/docs/feature-/345/233/275/351/231/205/345/214/226.md +124 -0
  77. package/generators/subapp-react/templates/homepage/package.json +2 -1
  78. package/generators/subapp-react/templates/homepage/src/app.tsx +100 -5
  79. package/generators/subapp-react/templates/homepage/src/common/intl/index.ts +15 -0
  80. package/generators/subapp-react/templates/homepage/src/common/intl/intlRuntime.ts +14 -0
  81. package/generators/subapp-react/templates/homepage/src/common/intl/localeMapping.ts +24 -0
  82. package/generators/subapp-react/templates/homepage/src/common/intl/subappIntlConfig.ts +28 -0
  83. package/generators/subapp-react/templates/homepage/src/common/intl/subappLocale.ts +18 -0
  84. package/generators/subapp-react/templates/homepage/src/common/intl/subappOwnIntl.ts +63 -0
  85. package/generators/subapp-react/templates/homepage/src/common/intl/types.ts +14 -0
  86. package/generators/subapp-react/templates/homepage/src/common/intl/useSubappIntl.ts +61 -0
  87. package/generators/subapp-react/templates/homepage/src/common/locale.ts +80 -0
  88. package/generators/subapp-react/templates/homepage/src/common/logger.ts +50 -18
  89. package/generators/subapp-react/templates/homepage/src/common/mainApp.ts +2 -0
  90. package/generators/subapp-react/templates/homepage/src/locales/en-US.ts +6 -0
  91. package/generators/subapp-react/templates/homepage/src/locales/zh-CN.ts +6 -0
  92. package/generators/subapp-react/templates/homepage/src/pages/index.less +10 -0
  93. package/generators/subapp-react/templates/homepage/src/pages/index.tsx +51 -0
  94. package/generators/subapp-react/templates/homepage/typings.d.ts +12 -0
  95. package/generators/subapp-umd/README.md +37 -0
  96. package/package.json +1 -1
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 语言管理(与主应用 layout `umi_locale` 规则一致:URL > localStorage > 浏览器)
3
+ * 独立运行子应用时使用;qiankun 下 {@link getSubappCurrentLocale} 优先主应用 props.locale
4
+ */
5
+
6
+ const LOCALE_STORAGE_KEY = 'umi_locale';
7
+ const URL_PARAM_KEY = 'lang';
8
+
9
+ export const SUPPORTED_LOCALES = ['zh-CN', 'en-US'] as const;
10
+ export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
11
+
12
+ export const LOCALE = {
13
+ ZH_CN: 'zh-CN',
14
+ EN_US: 'en-US',
15
+ } as const;
16
+
17
+ const DEFAULT_LOCALE: SupportedLocale = 'en-US';
18
+
19
+ function getLocaleFromUrl(): string | null {
20
+ if (typeof window === 'undefined') {
21
+ return null;
22
+ }
23
+ const urlParams = new URLSearchParams(window.location.search);
24
+ return urlParams.get(URL_PARAM_KEY);
25
+ }
26
+
27
+ function getLocaleFromStorage(): string | null {
28
+ if (typeof window === 'undefined') {
29
+ return null;
30
+ }
31
+ try {
32
+ return localStorage.getItem(LOCALE_STORAGE_KEY);
33
+ } catch {
34
+ return null;
35
+ }
36
+ }
37
+
38
+ function getBrowserLocale(): SupportedLocale {
39
+ if (typeof window === 'undefined') {
40
+ return DEFAULT_LOCALE;
41
+ }
42
+ const browserLang = navigator.language || (navigator as { userLanguage?: string }).userLanguage;
43
+ const locales = [...SUPPORTED_LOCALES];
44
+ if (locales.includes(browserLang as SupportedLocale)) {
45
+ return browserLang as SupportedLocale;
46
+ }
47
+ const langPrefix = browserLang.split('-')[0];
48
+ const matchedLocale = locales.find((locale) => locale.startsWith(langPrefix));
49
+ return matchedLocale || DEFAULT_LOCALE;
50
+ }
51
+
52
+ function isValidLocale(locale: string | null): locale is SupportedLocale {
53
+ if (!locale) {
54
+ return false;
55
+ }
56
+ return ([...SUPPORTED_LOCALES] as string[]).includes(locale);
57
+ }
58
+
59
+ export function getCurrentLocale(): SupportedLocale {
60
+ const urlLocale = getLocaleFromUrl();
61
+ if (isValidLocale(urlLocale)) {
62
+ return urlLocale;
63
+ }
64
+ const storageLocale = getLocaleFromStorage();
65
+ if (isValidLocale(storageLocale)) {
66
+ return storageLocale;
67
+ }
68
+ return getBrowserLocale();
69
+ }
70
+
71
+ export function setLocaleToStorage(locale: SupportedLocale): void {
72
+ if (typeof window === 'undefined') {
73
+ return;
74
+ }
75
+ try {
76
+ localStorage.setItem(LOCALE_STORAGE_KEY, locale);
77
+ } catch (error) {
78
+ console.error('Failed to save locale to localStorage:', error);
79
+ }
80
+ }
@@ -1,38 +1,70 @@
1
1
  /**
2
2
  * 日志工具
3
- * 仅在开发环境下输出日志,生产环境自动静默
3
+ * - 开发环境:全量输出
4
+ * - 生产环境:默认仅 `error` 带前缀输出;可在**首屏 URL** 带 query 打开全量 `log` / `info` / `warn`(与 layout `apps/layout` 的 logger 行为一致)
4
5
  *
5
- * 使用 bind 保持原始调用位置,避免错误栈指向 logger 内部
6
+ * 生产开启方式:首次进入页面时地址栏带 `?debug=1`(或 `debug=true` / `yes`),
7
+ * 在**本 JS 模块加载时刻**解析一次并固定,后续路由或 query 变更**不会**再切换日志级别(需整页刷新带参 URL)。
8
+ *
9
+ * **安全与合规**:`debug` 仅用于临时排障;全量日志可能在控制台暴露业务或个人信息,**勿长期公开或转发**带 `debug` 的生产链接;若接入日志采集需自行脱敏。
10
+ *
11
+ * 使用 bind 保持原始调用位置,避免错误栈指向 logger 内部(在开启详细日志时)
6
12
  */
7
13
 
8
14
  const isDev = process.env.NODE_ENV === 'development';
9
15
 
10
- // 空操作函数(生产环境使用)
11
- const noop = (): void => {};
16
+ /** Query 参数名;与主应用 layout 一致,勿随意改名以免已分享的排障链接失效 */
17
+ export const DEBUG_LOGS_QUERY_KEY = 'debug';
12
18
 
13
- /**
14
- * 创建带前缀的日志函数
15
- * 使用 bind 绑定前缀,保持控制台显示正确的调用位置
16
- */
17
- const createLogger = (prefix: string) => {
18
- if (!isDev) {
19
- // 生产环境返回空操作
20
- return {
21
- log: noop,
22
- info: noop,
23
- warn: noop,
24
- error: noop,
25
- };
19
+ /** 模块初始化时读取一次 `location.search`,之后不变 */
20
+ function readVerboseDebugQueryOnce(): boolean {
21
+ if (typeof window === 'undefined') {
22
+ return false;
23
+ }
24
+ try {
25
+ const v = new URLSearchParams(window.location.search).get(DEBUG_LOGS_QUERY_KEY);
26
+ if (v == null || v === '') {
27
+ return false;
28
+ }
29
+ const normalized = v.toLowerCase();
30
+ return normalized === '1' || normalized === 'true' || normalized === 'yes';
31
+ } catch {
32
+ return false;
26
33
  }
34
+ }
27
35
 
28
- const formattedPrefix = `[${prefix}]`;
36
+ /** 开发环境,或生产环境首屏 URL 已带 `debug` 开关(模块加载时确定);供业务侧按需分支 */
37
+ export const isAppDebugLogsEnabled: boolean = isDev || readVerboseDebugQueryOnce();
38
+
39
+ const noop = (): void => {};
29
40
 
41
+ function createVerboseHandlers(formattedPrefix: string) {
30
42
  return {
31
43
  log: console.log.bind(console, formattedPrefix),
32
44
  info: console.info.bind(console, formattedPrefix),
33
45
  warn: console.warn.bind(console, formattedPrefix),
34
46
  error: console.error.bind(console, formattedPrefix),
35
47
  };
48
+ }
49
+
50
+ function createQuietHandlers(formattedPrefix: string) {
51
+ return {
52
+ log: noop,
53
+ info: noop,
54
+ warn: noop,
55
+ error: console.error.bind(console, formattedPrefix),
56
+ };
57
+ }
58
+
59
+ /**
60
+ * 创建带前缀的日志函数
61
+ * 使用 bind 绑定前缀,保持控制台显示正确的调用位置(在开启详细日志时)
62
+ */
63
+ const createLogger = (prefix: string) => {
64
+ const formattedPrefix = `[${prefix}]`;
65
+ return isAppDebugLogsEnabled
66
+ ? createVerboseHandlers(formattedPrefix)
67
+ : createQuietHandlers(formattedPrefix);
36
68
  };
37
69
 
38
70
  // 预定义的日志实例
@@ -15,6 +15,8 @@ export interface IMicroAppProps {
15
15
  request?: <T = any>(url: string, options?: any) => Promise<T>;
16
16
  /** 当前路由路径(由主应用传递,用于子应用内部路由切换) */
17
17
  routePath?: string;
18
+ /** 当前语言(与主应用 getCurrentLocale 一致,如 zh-CN / en-US),供国际化与 common-intl 对齐 */
19
+ locale?: string;
18
20
  /**
19
21
  * 按钮权限列表(与主应用 fetchUserInfo.button_perms 一致,由主应用 MicroAppLoader 注入)
20
22
  */
@@ -0,0 +1,6 @@
1
+ export default {
2
+ 'page.subapp.home.demoSectionTitle': 'i18n demo',
3
+ 'page.subapp.home.title': 'Subapp home',
4
+ 'page.subapp.home.umiOnly':
5
+ 'Fallback copy provided only in subapp Umi locales',
6
+ };
@@ -0,0 +1,6 @@
1
+ export default {
2
+ 'page.subapp.home.demoSectionTitle': '国际化示例',
3
+ 'page.subapp.home.title': '子应用首页',
4
+ /** 仅存在于子应用 locales,用于演示 intl 无该 key 时走 Umi 兜底 */
5
+ 'page.subapp.home.umiOnly': '仅子应用 Umi locales 提供的兜底文案',
6
+ };
@@ -28,6 +28,16 @@
28
28
  margin-bottom: @spacing-lg;
29
29
  }
30
30
 
31
+ &-intl-hint {
32
+ margin-bottom: @spacing-sm;
33
+ color: @color-text-2;
34
+ }
35
+
36
+ &-intl-meta {
37
+ font-size: @font-size-sm;
38
+ margin-top: @spacing-md;
39
+ }
40
+
31
41
  &-card {
32
42
  padding: @card-padding;
33
43
  // 卡片背景色 - 使用 color-text-5(亮色模式为白色)
@@ -1,4 +1,5 @@
1
1
  import PermissionFilter from '@/components/PermissionFilter';
2
+ import { useSubappIntl } from '@/common/intl';
2
3
  import { getRequestSource, request } from '@/common/request';
3
4
  import {
4
5
  Alert,
@@ -55,6 +56,14 @@ interface IListItem {
55
56
  * 4. Less 变量自动适配主应用的主题切换
56
57
  */
57
58
  export default function HomePage() {
59
+ const {
60
+ formatMessage,
61
+ commonIntlEnabled,
62
+ locale,
63
+ subappOwnIntl,
64
+ subappOwnIntlTag,
65
+ } = useSubappIntl();
66
+
58
67
  const [loading, setLoading] = useState(false);
59
68
  const [userInfo, setUserInfo] = useState<IUserInfo | null>(null);
60
69
  const [stats, setStats] = useState<IStatsData | null>(null);
@@ -144,6 +153,48 @@ export default function HomePage() {
144
153
 
145
154
  <Divider />
146
155
 
156
+ <Card
157
+ title={formatMessage({
158
+ id: 'page.subapp.home.demoSectionTitle',
159
+ defaultMessage: '国际化示例',
160
+ })}
161
+ style={{ marginBottom: 16 }}
162
+ >
163
+ <Title heading={4}>
164
+ {formatMessage({
165
+ id: 'page.subapp.home.title',
166
+ defaultMessage: '子应用首页',
167
+ })}
168
+ </Title>
169
+ <Paragraph className="subapp-intl-hint">
170
+ common-intl 优先样例(使用主应用的tag):
171
+ {formatMessage({
172
+ id: 'cs_web_workbench_userlist_chat',
173
+ defaultMessage: '看到该文案代表未启用 主应用commonIntl 或中台无该 key',
174
+ })}
175
+ </Paragraph>
176
+ <Paragraph className="subapp-intl-hint">
177
+ common-intl 优先样例(使用子应用的tag):
178
+ {formatMessage({
179
+ id: 'sdk_h5_ticket_you_can_leave_us_a_message_we_will_reply_within_24_hours',
180
+ defaultMessage: '看到该文案代表未启用 子应用commonIntl 或中台无该 key',
181
+ })}
182
+ </Paragraph>
183
+ <Paragraph className="<%= appName %>-intl-hint">
184
+ 仅子应用 locales 的 key(intl 通常无该 key):
185
+ {formatMessage({
186
+ id: 'page.subapp.home.umiOnly',
187
+ defaultMessage: '若仍见此默认文案,请检查 locales 是否注册该 id',
188
+ })}
189
+ </Paragraph>
190
+ <Paragraph type="secondary" className="<%= appName %>-intl-meta">
191
+ commonIntlEnabled: {String(commonIntlEnabled)} · locale: {locale}
192
+ {subappOwnIntl
193
+ ? ` · subappOwnIntl: true · tag: ${subappOwnIntlTag ?? '-'}`
194
+ : ' · subappOwnIntl: false'}
195
+ </Paragraph>
196
+ </Card>
197
+
147
198
  {/* 请求示例 */}
148
199
  <Spin loading={loading} style={{ display: 'block' }}>
149
200
  <Card
@@ -87,6 +87,18 @@ declare global {
87
87
  __MICO_CONFIG__?: {
88
88
  appName?: string;
89
89
  apiBaseUrl?: string;
90
+ /** 多语言中台(与 commonIntl 二选一字段名,见 common-intl intlRuntime) */
91
+ intl?: {
92
+ tag: string;
93
+ app_name: string;
94
+ indexedDBParams?: { dbName?: string };
95
+ };
96
+ /** 多语言中台保底配置(可选);与 packages/common-intl README、子应用可选 intl 模块配合 */
97
+ commonIntl?: {
98
+ tag: string;
99
+ app_name: string;
100
+ indexedDBParams?: { dbName?: string };
101
+ };
90
102
  [key: string]: unknown;
91
103
  };
92
104
  }
@@ -0,0 +1,37 @@
1
+ # subapp-umd 生成器
2
+
3
+ 在已有 Monorepo 的 `packages/` 下创建 UMD 组件包(Webpack 构建)。详见 [docs/generators.md#subapp-umd](../../docs/generators.md#subapp-umd)。
4
+
5
+ ## 快速索引
6
+
7
+ | 文件 | 职责 |
8
+ |---|---|
9
+ | `index.js` | 生成器主体;无跨模块联动修改 |
10
+ | `meta.json` | `mico list` 展示信息 |
11
+ | `ignore-list.json` | 模板过滤清单 |
12
+ | `templates/` | 模板根 |
13
+
14
+ ## 使用
15
+
16
+ ```bash
17
+ cd <monorepo-root>
18
+ mico create subapp-umd
19
+ ```
20
+
21
+ 要求 monorepo 根包含 `packages/` 目录。
22
+
23
+ ## Prompt 默认值
24
+
25
+ | name | 默认 |
26
+ |---|---|
27
+ | `appName` | `.micorc.defaultUmdName` ?? `'my-widget'` |
28
+ | `umdGlobalName` | `toPascal(appName)` |
29
+ | `packageScope` | `.micorc.packageScope` ?? `detectPackageScope()` ?? `'@my-project'` |
30
+ | `devPort` | `.micorc.umdDevPort` ?? `'9100'` |
31
+
32
+ ## 运行产物
33
+
34
+ | URL | 说明 |
35
+ |---|---|
36
+ | `http://localhost:<devPort>/` | HTML 预览页 |
37
+ | `http://localhost:<devPort>/<appName>.umd.js` | UMD JS,供主应用通过 `jsUrls` 接入 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "generator-mico-cli",
3
- "version": "0.2.29",
3
+ "version": "0.2.31",
4
4
  "description": "Yeoman generator for Mico CLI projects",
5
5
  "keywords": [
6
6
  "yeoman-generator",