@zxiaosi/sdk 0.2.1 → 0.2.3

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/README.md CHANGED
@@ -1,62 +1,178 @@
1
- ## 介绍
2
-
3
- - 旨在简化微前端功能
4
-
5
- - [规划图地址](https://excalidraw.com/#json=s2zc7f8zAhOnhX6NEMKcv,0qIxSEqNMs7vwkq0a6G2yQ)
6
-
7
- ![](https://cdn.zxiaosi.com/hexo/micro-sdk/sdk1.0.png)
8
-
9
- ## SDK 使用
10
-
11
- - 主应用, `sdk.use(Plugin, options)`, `sdk.mount('sdk')` 使用插件, 挂载到 `window`
12
-
13
- ```js
14
- // main.ts
15
-
16
- import {
17
- sdk,
18
- SdkApiPlugin,
19
- SdkAppPlugin,
20
- SdkClientPlugin,
21
- SdkConfigPlugin,
22
- SdkI18nPlugin,
23
- SdkStoragePlugin,
24
- SdkStorePlugin,
25
- SdkUIPlugin,
26
- } from '@zxiaosi/sdk';
27
-
28
- /** 挂载 SDK */
29
- sdk
30
- .use(SdkApiPlugin, {
31
- getRoutesApi: async () => ({ code: 0, data: [{ path: '/home', name: '首页', component: 'Home' }] }),
32
- getUserInfoApi: async () => ({ code: 0, data: { user: {}, permissions: ['/home'], roles: [], settings: {} } }),
33
- })
34
- .use(SdkAppPlugin)
35
- .use(SdkClientPlugin)
36
- .use(SdkConfigPlugin, {
37
- qiankunMode: 'router',
38
- proLayoutConfig: {
39
- title: 'Demo',
40
- layout: 'mix',
1
+ ## 路线规划
2
+
3
+ - [规划图地址](https://excalidraw.com/#json=_CghR9MKEcgUt4SaYUXFY,V9n_bmADhi6JXp2TUk-ObA)
4
+
5
+ ![](https://cdn.zxiaosi.com/hexo/micro-sdk/sdk0.2.png)
6
+
7
+ - [更多详情](https://zxiaosi.com/archives/c6c40209.html)
8
+
9
+ ## 项目介绍
10
+
11
+ - 整个 `SDK` 都是围绕 `getRoutesApi`、`getUserInfoApi` 这两个接口进行设计的,旨在简化微前端应用的开发
12
+
13
+ - `getRoutesApi` 接口用于获取应用路由信息,包括主应用和微应用的路由配置。因为 `Qiankun` 的 `entry` 配置比较特殊,在本地开发时是本地服务 `"entry": "http://localhost:5174"`,在生产环境是文件路径 `"entry": "/subapp/"`,所以 `主应用` 需要使用 `vite-plugin-mock` 插件 `mock` 接口
14
+
15
+ - `getUserInfoApi` 接口用于获取用户 `user`、权限 `permissions`、角色 `role`、配置信息 `setting`,以便进行权限控制和个性化设置。理论上来说 `permissions` 中应当包含 `getRoutesApi` 中的所有的路由路径,否则页面出走 `<NotPermission />` 组件。(目前的方案是所有的组件手动包一层 `<NotPermission />`,不在 `SDK` 中处理权限控制)
16
+
17
+ - 微应用使用 `sdk.ui.renderComponent('xxx')` 时,会报 `React 多实例` 的错误,需要使用 `vite-plugin-externals` 插件将 `React` 等依赖排除在打包之外,[更多详情](https://zxiaosi.com/archives/bc84a75a.html)
18
+
19
+ - 微应用启动服务时需要加上 `--host` 参数,否则可能会出现微应用静态资源访问不到的情况。完整命令 `"dev": "vite --host"`
20
+
21
+ - `SDK` 不能在 `组件外` 进行使用,否则会报 `SDK 未初始化` 错误
22
+
23
+ ## 具体使用
24
+
25
+ ### 主应用
26
+
27
+ - 安装依赖
28
+
29
+ ```sh
30
+ // 必须的依赖
31
+ npm install react react-dom react-router-dom@6.30.2 zustand @zxiaosi/sdk
32
+
33
+ // 可选的依赖
34
+ npm install antd dayjs
35
+ ```
36
+
37
+ - 在 `main.ts` 中进行 `SDK` 的挂载
38
+
39
+ ```js
40
+ import {
41
+ sdk,
42
+ SdkApiPlugin,
43
+ SdkAppPlugin,
44
+ SdkClientPlugin,
45
+ SdkConfigPlugin,
46
+ SdkI18nPlugin,
47
+ SdkStoragePlugin,
48
+ SdkStorePlugin,
49
+ SdkUIPlugin,
50
+ } from '@zxiaosi/sdk';
51
+ import { createRoot } from 'react-dom/client';
52
+ import App from './App';
53
+
54
+ /** 挂载 SDK */
55
+ sdk
56
+ .use(SdkApiPlugin, {
57
+ getRoutesApi: async () => ({
58
+ code: 0,
59
+ data: [
60
+ { path: '/home', name: '首页', component: 'Home' },
61
+ { path: '/subapp', name: '微应用', component: 'Microapp',
62
+ routeAttr: `{"name": "subapp", "entry": "http://localhost:5174", "activeRule": "/subapp", "rootId": "sub-app"}`,
63
+ },
64
+ ],
65
+ }),
66
+ getUserInfoApi: async () => ({
67
+ code: 0,
68
+ data: { user: {}, permissions: ['/home', '/subapp'], roles: [], settings: {} },
69
+ }),
70
+ loginApi: async () => ({ code: 0, data: { token: 'xxxx' } }),
71
+ })
72
+ .use(SdkAppPlugin)
73
+ .use(SdkClientPlugin)
74
+ .use(SdkConfigPlugin, {
75
+ qiankunMode: 'router',
76
+ proLayoutConfig: {
77
+ title: 'Demo',
78
+ layout: 'mix',
79
+ },
80
+ })
81
+ .use(SdkI18nPlugin)
82
+ .use(SdkStoragePlugin)
83
+ .use(SdkStorePlugin)
84
+ .use(SdkUIPlugin, { Home: () => <div>Home</div> })
85
+ .mount('sdk');
86
+
87
+ /** 渲染主应用 */
88
+ createRoot(document.getElementById('root')!).render(<App />);
89
+ ```
90
+
91
+ - 在 `App.tsx` 中使用 `<Mainapp />` 组件渲染主应用
92
+
93
+ ```js
94
+ import { sdk } from '@zxiaosi/sdk';
95
+
96
+ function App() {
97
+ const Mainapp = sdk.ui.getComponent('Mainapp');
98
+ return <Mainapp />;
99
+ }
100
+
101
+ export default App;
102
+ ```
103
+
104
+ ### 微应用
105
+
106
+ - 安装依赖
107
+
108
+ ```sh
109
+ // 必须的依赖
110
+ npm install react react-dom react-router-dom@6.30.2 zustand @zxiaosi/sdk
111
+ npm install vite-plugin-qiankun-lite --save-dev
112
+
113
+ // 可选的依赖
114
+ npm install antd dayjs
115
+ ```
116
+
117
+ - 在 `vite.config.ts` 中配置 `vite-plugin-qiankun-lite` 插件
118
+
119
+ ```js
120
+ import { defineConfig } from 'vite';
121
+ import react from '@vitejs/plugin-react';
122
+ import qiankun from 'vite-plugin-qiankun-lite';
123
+
124
+ export default defineConfig({
125
+ plugins: [
126
+ react(),
127
+ qiankun({ name: 'subapp', sandbox: !!process.env.VITE_SANDBOX }),
128
+ ],
129
+ server: {
130
+ port: 5174,
41
131
  },
42
- })
43
- .use(SdkI18nPlugin)
44
- .use(SdkStoragePlugin)
45
- .use(SdkStorePlugin)
46
- .use(SdkUIPlugin, { Home: ()=> <div>Home</div> })
47
- .mount('sdk');
48
- ```
49
-
50
- - 子应用 `sdk.extend('sdk')`, 从 `window` 上找实例
51
-
52
- ```js
53
- // main.ts
54
-
55
- import { sdk } from '@zxiaosi/sdk';
56
-
57
- // qiankun 生命周期
58
- export async function mount(props: any) {
59
- sdk.extend('sdk');
60
- render(props);
61
- }
62
- ```
132
+ });
133
+ ```
134
+
135
+ - 在 `main.ts` 中进行 `SDK` 的继承
136
+
137
+ ```js
138
+ import { sdk } from '@zxiaosi/sdk';
139
+ import { createRoot, type Root } from 'react-dom/client';
140
+ import App from './App.tsx';
141
+ import './index.css';
142
+
143
+ let root: Root;
144
+ const render = (props: any = {}) => {
145
+ const container = props?.container
146
+ ? props.container.querySelector('#root')
147
+ : document.getElementById('root');
148
+
149
+ root = createRoot(container);
150
+
151
+ root.render(<App />);
152
+ };
153
+
154
+ if (!window.__POWERED_BY_QIANKUN__) {
155
+ render();
156
+ }
157
+
158
+ export async function bootstrap() {
159
+ console.log(`Microapp bootstrap`);
160
+ }
161
+
162
+ export async function mount(props: any) {
163
+ console.log(`Microapp mount`, props);
164
+ sdk.extend('sdk'); // 继承 sdk 功能
165
+ render(props);
166
+ }
167
+
168
+ export async function unmount(props: any) {
169
+ console.log(`Microapp unmount`, props);
170
+ root.unmount();
171
+ }
172
+
173
+ export async function update(props: any) {
174
+ console.log(`Microapp update`, props);
175
+ }
176
+ ```
177
+
178
+ - [可参考项目](https://github.com/zxiaosi-team/fontend-sdk/tree/master/packages)
package/dist/index.d.ts CHANGED
@@ -43,6 +43,11 @@ interface ApiOptions {
43
43
  * @example { code: 0, data: [{path: '/', name: '首页', component: 'Home'}] }
44
44
  */
45
45
  getRoutesApi?(): Promise<any>;
46
+ /**
47
+ * 登录接口
48
+ * @example { code: 0, data: { token: 'xxxx' } }
49
+ */
50
+ loginApi?(params: any): Promise<any>;
46
51
  }
47
52
  interface ApiResults extends Required<ApiOptions> {
48
53
  /**
@@ -122,10 +127,10 @@ interface ClientOptions {}
122
127
  interface ClientResults extends Required<ClientOptions> {
123
128
  /** 主应用 location */
124
129
  location: Location;
125
- /** 主应用navigate(解决子应用跳转问题) */
126
- navigate: NavigateFunction;
127
130
  /** 路由匹配(用于面包屑) */
128
131
  matches: UIMatch[];
132
+ /** 主应用navigate(解决微应用跳转问题) */
133
+ navigate: NavigateFunction;
129
134
  }
130
135
  /**
131
136
  * 全局路由信息
@@ -138,23 +143,23 @@ declare const SdkClientPlugin: Plugin<'client'>;
138
143
  //#endregion
139
144
  //#region src/plugins/config/index.d.ts
140
145
  interface ConfigOptions {
141
- /** 环境变量(主应用共享给子应用变量) */
146
+ /** 环境变量(主应用共享给微应用变量) */
142
147
  env?: Record<string, any>;
143
148
  /** 主题 */
144
149
  theme?: ThemeProps;
145
- /** 国际化 */
150
+ /** 语言 */
146
151
  locale?: LocaleProps;
147
152
  /**
148
153
  * Qiankun模式(切换模式后请重新打开页面)
149
154
  * - 'router': 基于路由模式
150
155
  * - 登录时,刷新页面,会自动调用 getUserInfoApi、getRoutesApi 获取数据
151
- * - 拿到 routes 数据之后,需要 registerMicroApps 注册子应用 和 start 启动子应用
156
+ * - 拿到 routes 数据之后,需要 registerMicroApps 注册微应用 和 start 启动微应用
152
157
  * - 系统退出时,刷新页面,自动销毁 qiankun 声明周期和缓存的数据
153
158
  * - 系统登录和系统退出仅有一次刷新页面即可,为了销毁 qiankun 的声明周期,但数据需要手动加载或者清除
154
159
  * - 'load': 手动加载模式
155
160
  * - 登录时,不需刷新页面, 但需要手动调用 getUserInfoApi、getRoutesApi 获取数据
156
- * - 拿到 routes 数据之后,在 Microapp 组件中使用 loadMicroApp 手动加载子应用
157
- * - 系统退出时,不刷新页面,但需要手动销毁每个子应用,并清除缓存数据
161
+ * - 拿到 routes 数据之后,在 Microapp 组件中使用 loadMicroApp 手动加载微应用
162
+ * - 系统退出时,不刷新页面,但需要手动销毁每个微应用,并清除缓存数据
158
163
  */
159
164
  qiankunMode?: 'router' | 'load';
160
165
  /** 登录页路由 */
@@ -182,7 +187,7 @@ interface ConfigResults extends Required<ConfigOptions> {}
182
187
  * Sdk 配置信息
183
188
  * - 详情参考 {@link ConfigOptions} {@link ConfigResults}
184
189
  * - 配置 env 环境变量
185
- * - 配置 默认主题、国际化
190
+ * - 配置 默认主题、语言
186
191
  * - 配置 Qiankun 模式
187
192
  * - 配置 默认登录路径、跳转路径、自定义路由
188
193
  * - 配置 Antd 配置、ProLayout 配置
@@ -192,14 +197,14 @@ declare const SdkConfigPlugin: Plugin<'config'>;
192
197
  //#region src/plugins/i18n/index.d.ts
193
198
  interface I18nOptions {
194
199
  /**
195
- * React Intl Universal
200
+ * React Intl Universal 实例
196
201
  * - 不要解构使用, const { get } = useIntl() 会报错
197
202
  * - 如果项目不使用 React Compiler, 可以直接使用 sdk.i18n.intl
198
203
  * @example const intl = useIntl(); intl.get(key).d(defaultValue)
199
204
  */
200
205
  intl?: typeof intl;
201
206
  /**
202
- * React Intl Universal 配置的语言包
207
+ * 自定义语言包
203
208
  * @example
204
209
  * {
205
210
  * 'zh-CN': {
@@ -212,7 +217,7 @@ interface I18nOptions {
212
217
  */
213
218
  intlConfig?: Record<string, any>;
214
219
  /**
215
- * 加载 Antd 语言包
220
+ * 加载语言包
216
221
  * @param locale 语言包名
217
222
  * @example
218
223
  * import enUS from 'antd/es/locale/en_US';
@@ -247,7 +252,7 @@ declare const SdkI18nPlugin: Plugin<'i18n'>;
247
252
  //#endregion
248
253
  //#region src/plugins/storage/index.d.ts
249
254
  interface StorageOptions {
250
- /** 国际化存储名称 */
255
+ /** 语言存储名称 */
251
256
  localeKey?: string;
252
257
  /** 主题存储名称 */
253
258
  themeKey?: string;
@@ -255,11 +260,11 @@ interface StorageOptions {
255
260
  tokenKey?: string;
256
261
  }
257
262
  interface StorageResults extends Required<StorageOptions> {
258
- /** 获取当前国际化 */
263
+ /** 获取当前语言 */
259
264
  getLocale(): LocaleProps;
260
- /** 设置/切换切换国际化 */
265
+ /** 设置/切换语言 */
261
266
  setLocale(locale: LocaleProps): void;
262
- /** 清空国际化 */
267
+ /** 清空语言 */
263
268
  clearLocale(): void;
264
269
  /** 获取当前主题 */
265
270
  getTheme(): ThemeProps;
@@ -278,39 +283,39 @@ interface StorageResults extends Required<StorageOptions> {
278
283
  * 本地缓存
279
284
  * - 详情参考 {@link StorageOptions} {@link StorageResults}
280
285
  * - 配置 localStorage 变量名称
281
- * - 提供 国际化、主题、Token 的 get、change、clear 方法
286
+ * - 提供 语言、主题、Token 的 get、change、clear 方法
282
287
  * @example sdk.storage.getToken() // 获取 Token
283
288
  * @example sdk.storage.setTheme('dark') // 设置主题
284
- * @example sdk.storage.clearLocale() // 清空国际化
289
+ * @example sdk.storage.clearLocale() // 清空语言
285
290
  */
286
291
  declare const SdkStoragePlugin: Plugin<'storage'>;
287
292
  //#endregion
288
293
  //#region src/plugins/store/createInitState.d.ts
289
294
  interface InitStateStoreProps {
290
- /** 初始变量 */
295
+ /** 初始状态 */
291
296
  initState: UserInfo;
292
- /** 设置初始变量 */
297
+ /** 设置初始状态 */
293
298
  setInitState(initState: UserInfo): void;
294
299
  }
295
- /** 初始变量状态 */
300
+ /** 创建初始状态切片 */
296
301
  //#endregion
297
302
  //#region src/plugins/store/createLocale.d.ts
298
303
  interface LocaleStoreProps {
299
- /** 国际化 */
304
+ /** 语言 */
300
305
  locale: LocaleProps;
301
- /** 设置国际化 */
306
+ /** 设置语言 */
302
307
  setLocale(locale: LocaleProps): void;
303
308
  }
304
- /** 国际化状态 */
309
+ /** 创建语言切片 */
305
310
  //#endregion
306
311
  //#region src/plugins/store/createMicroAppLoading.d.ts
307
312
  interface MicroAppStateStoreProps {
308
- /** 子应用加载状态 */
313
+ /** 微应用加载状态 */
309
314
  microAppLoading: boolean;
310
- /** 设置子应用加载状态 */
315
+ /** 设置微应用加载状态 */
311
316
  setMicroAppLoading(state: boolean): void;
312
317
  }
313
- /** 子应用状态 */
318
+ /** 创建微应用状态切片 */
314
319
  //#endregion
315
320
  //#region src/plugins/store/createTheme.d.ts
316
321
  interface ThemeStoreProps {
@@ -319,7 +324,7 @@ interface ThemeStoreProps {
319
324
  /** 设置主题 */
320
325
  setTheme(theme: ThemeProps): void;
321
326
  }
322
- /** 主题状态 */
327
+ /** 创建主题切片 */
323
328
  //#endregion
324
329
  //#region src/plugins/store/index.d.ts
325
330
  type StoreOptions = InitStateStoreProps & LocaleStoreProps & MicroAppStateStoreProps & ThemeStoreProps;
@@ -378,7 +383,7 @@ interface UIResults extends Required<UIOptions> {
378
383
  * - 内置了 Layout、Loading、Login、Mainapp、Microapp、NotFound 等组件, 可传入覆盖
379
384
  * - 组件共享
380
385
  * - 在主应用中, 可通过 sdk.use(SdkUIPlugin, { MyComponent }) 传入组件
381
- * - 在子应用中, 可通过 sdk.ui.renderComponent('MyComponent') 使用组件
386
+ * - 在微应用中, 可通过 sdk.ui.renderComponent('MyComponent') 使用组件
382
387
  */
383
388
  declare const SdkUIPlugin: Plugin<'ui'>;
384
389
  //#endregion
@@ -450,7 +455,7 @@ interface SdkBase {
450
455
  _plugins: Map<string, any>;
451
456
  /** 挂载sdk - 主应用挂载 SDK 到 Window */
452
457
  mount(name: string): void;
453
- /** 继承sdk - 子应用从 Window 上继承 SDK */
458
+ /** 继承sdk - 微应用从 Window 上继承 SDK */
454
459
  extend(name: string): void;
455
460
  /** 使用插件 */
456
461
  use<K extends PluginName>(plugin: Plugin<K>, options?: PluginOptions[K]): this;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"axios";import{Button as t,ConfigProvider as n,Flex as r,Form as i,Input as a,message as o,theme as s}from"antd";import{Suspense as c,createElement as l,memo as u,useEffect as d,useMemo as ee,useState as f}from"react";import{Navigate as p,Outlet as m,RouterProvider as te,createBrowserRouter as h,useLocation as g,useMatches as _,useNavigate as v}from"react-router-dom";import{Fragment as y,jsx as b,jsxs as x}from"react/jsx-runtime";import S from"react-intl-universal";import{createStore as C,useStore as w}from"zustand";import{subscribeWithSelector as T}from"zustand/middleware";import E from"@ant-design/pro-layout";import{loadMicroApp as ne,registerMicroApps as D,start as O}from"qiankun";import{useShallow as k}from"zustand/shallow";const A=new class{name;_plugins;api;app;client;config;i18n;storage;store;ui;constructor(){this.name=``,this._plugins=new Map}mount(e){if(window[e])throw Error(`The SDK already exists - ${e}`);console.log(`%c SDK mounted:`,`color: pink; font-weight: bold;`,e,A),this.name=e;let t=new Proxy(this,{get:(e,t,n)=>e?Reflect.get(e,t,n):null,set:()=>(console.error(`The SDK cannot be modified.`),!1),deleteProperty:()=>(console.error(`The SDK cannot be deleted.`),!1)});window[this.name]=t}extend(e){if(!window[e])throw Error(`The SDK not found - ${e}`);console.log(`%c SDK extended:`,`color: pink; font-weight: bold;`,e),Object.assign(this,window[e])}use(e,t){let{name:n,install:r}=e;if(!n)throw Error(`${n} plugin has no name`);if(typeof r!=`function`)throw Error(`${n} plugin is not a function`);return r(this,t),this._plugins.set(n,{...e,options:t}),this}};function j(e){return e==null||typeof e!=`object`&&typeof e!=`function`}function M(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function re(e){return Object.getOwnPropertySymbols(e).filter(t=>Object.prototype.propertyIsEnumerable.call(e,t))}function ie(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}function N(e,t,n,r=new Map,i=void 0){let a=i?.(e,t,n,r);if(a!==void 0)return a;if(j(e))return e;if(r.has(e))return r.get(e);if(Array.isArray(e)){let t=Array(e.length);r.set(e,t);for(let a=0;a<e.length;a++)t[a]=N(e[a],a,n,r,i);return Object.hasOwn(e,`index`)&&(t.index=e.index),Object.hasOwn(e,`input`)&&(t.input=e.input),t}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp){let t=new RegExp(e.source,e.flags);return t.lastIndex=e.lastIndex,t}if(e instanceof Map){let t=new Map;r.set(e,t);for(let[a,o]of e)t.set(a,N(o,a,n,r,i));return t}if(e instanceof Set){let t=new Set;r.set(e,t);for(let a of e)t.add(N(a,void 0,n,r,i));return t}if(typeof Buffer<`u`&&Buffer.isBuffer(e))return e.subarray();if(M(e)){let t=new(Object.getPrototypeOf(e)).constructor(e.length);r.set(e,t);for(let a=0;a<e.length;a++)t[a]=N(e[a],a,n,r,i);return t}if(e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer)return e.slice(0);if(e instanceof DataView){let t=new DataView(e.buffer.slice(0),e.byteOffset,e.byteLength);return r.set(e,t),P(t,e,n,r,i),t}if(typeof File<`u`&&e instanceof File){let t=new File([e],e.name,{type:e.type});return r.set(e,t),P(t,e,n,r,i),t}if(typeof Blob<`u`&&e instanceof Blob){let t=new Blob([e],{type:e.type});return r.set(e,t),P(t,e,n,r,i),t}if(e instanceof Error){let t=new e.constructor;return r.set(e,t),t.message=e.message,t.name=e.name,t.stack=e.stack,t.cause=e.cause,P(t,e,n,r,i),t}if(e instanceof Boolean){let t=new Boolean(e.valueOf());return r.set(e,t),P(t,e,n,r,i),t}if(e instanceof Number){let t=new Number(e.valueOf());return r.set(e,t),P(t,e,n,r,i),t}if(e instanceof String){let t=new String(e.valueOf());return r.set(e,t),P(t,e,n,r,i),t}if(typeof e==`object`&&ae(e)){let t=Object.create(Object.getPrototypeOf(e));return r.set(e,t),P(t,e,n,r,i),t}return e}function P(e,t,n=e,r,i){let a=[...Object.keys(t),...re(t)];for(let o=0;o<a.length;o++){let s=a[o],c=Object.getOwnPropertyDescriptor(e,s);(c==null||c.writable)&&(e[s]=N(t[s],s,n,r,i))}}function ae(e){switch(ie(e)){case`[object Arguments]`:case`[object Array]`:case`[object ArrayBuffer]`:case`[object DataView]`:case`[object Boolean]`:case`[object Date]`:case`[object Float32Array]`:case`[object Float64Array]`:case`[object Int8Array]`:case`[object Int16Array]`:case`[object Int32Array]`:case`[object Map]`:case`[object Number]`:case`[object Object]`:case`[object RegExp]`:case`[object Set]`:case`[object String]`:case`[object Symbol]`:case`[object Uint8Array]`:case`[object Uint8ClampedArray]`:case`[object Uint16Array]`:case`[object Uint32Array]`:return!0;default:return!1}}function oe(e){return N(e,void 0,e,new Map,void 0)}function F(e){if(!e||typeof e!=`object`)return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype||Object.getPrototypeOf(t)===null?Object.prototype.toString.call(e)===`[object Object]`:!1}function se(e){return e===`__proto__`}function I(e,t){let n=Object.keys(t);for(let r=0;r<n.length;r++){let i=n[r];if(se(i))continue;let a=t[i],o=e[i];L(a)&&L(o)?e[i]=I(o,a):Array.isArray(a)?e[i]=I([],a):F(a)?e[i]=I({},a):(o===void 0||a!==void 0)&&(e[i]=a)}return e}function L(e){return F(e)||Array.isArray(e)}const R=e=>{let{requestId:t,url:n,method:r,params:i,data:a}=e;return t||`${r}:${n}?${JSON.stringify(i)}&${JSON.stringify(a)}`},z=e=>{let t=R(e),n=A.api.controllers.get(t);n&&(n.abort(),A.api.controllers.delete(t))},B={beforeLoad:[async e=>{console.log(`[LifeCycle] before load %c%s`,`color: green;`,e.name)}],beforeMount:[async e=>{console.log(`[LifeCycle] before mount %c%s`,`color: green;`,e.name)}],afterUnmount:[async e=>{console.log(`[LifeCycle] after unmount %c%s`,`color: green;`,e.name)}]},V=e=>{let t=e.storage.getTheme();if(t)return t;let n=e.config?.theme;if(n)return n;let r=window.matchMedia(`(prefers-color-scheme: dark)`);return r.matches&&r.matches?`dark`:`light`},H=e=>e.storage.getLocale()||e.config?.locale||navigator.language||`zh-CN`,U=e=>{let t=new Map,n=W(e,t);return{microApps:[...t.values()],menuData:n}},W=(e,t)=>!e||e?.length===0?[]:e.map(e=>{let n=null,{locale:r,path:i,icon:a,component:o,routeAttr:s,children:c}=e;if(s){let e={};try{e=JSON.parse(s)}catch(e){console.error(`Sdk: initData - Subapp routeAttr error: `,e)}let{name:r,rootId:i,...a}=e,o={...a,name:r,container:`#${i}`,props:{sdk:A},loader:e=>A.store.getState().setMicroAppLoading(e)};t.set(r,o),n=A.ui.renderComponent(`Microapp`,{name:r,rootId:i})}else n=o===`Outlet`?b(m,{}):A.ui.renderComponent(o);return{...e,key:`${i}_${a}_${r}`,element:n,children:W(c,t),handle:{crumb:(t={})=>({...e,...t})}}}),G=e=>{let t=`/`;return!e||e.length===0?t:(t=e?.[0]?.path,e?.[0]?.children&&e?.[0]?.children.length>0&&(t=G(e?.[0]?.children)),t)};var K=class{instance;constructor(t={}){this.instance=e.create(t),this.defaultRequestInterceptor(),this.defaultResponseInterceptor()}defaultRequestInterceptor(){this.instance.interceptors.request.use(function(e){if(e?.isCancelRequest){let t=R(e);z(e);let n=new AbortController;A.api.controllers.set(t,n),e.requestId=t,e.signal=n.signal}let t=A.storage.getToken();return e.headers.lang=A.config.locale,e.headers.Authorization=t,I(e.headers,A.api.config.headers||{}),e},function(e){return console.error(`Sdk: defaultRequestInterceptor - 请求错误`),Promise.reject(e)})}defaultResponseInterceptor(){this.instance.interceptors.response.use(function(e){let{data:t,config:n}=e,{isOriginalData:r,isShowFailMsg:i,isCancelRequest:a}=n,{code:s,msg:c}=t;return s!==0&&(i&&o.error(c),console.error(`Sdk: defaultResponseInterceptor - Response error: `,n.url,c),s==20041&&A.app.pageToLogin()),a&&A.api.controllers.delete(n.requestId),r?e:e.data},function(t){let{response:n,config:r}=t,{isShowFailMsg:i}=r;if(e.isCancel(t))return Promise.reject(t);if(n){let{status:e,data:t,statusText:r}=n;i&&o.error(t.msg||r),e==401&&A.app.pageToLogin()}else i&&o.error(`请求超时或服务器异常,请检查网络或联系管理员`),console.error(`Sdk: defaultResponseInterceptor - Request error:`,r.url,t);return Promise.reject(t)})}getInstance(){return this.instance}};const ce={name:`api`,install(e,t={}){let n={baseURL:`/`,timeout:0,...t.config},r=t?.instance||new K(n).getInstance();e.api=I({config:n,controllers:new Map,instance:null,request:(e,t={})=>r.request({url:e,isOriginalData:!1,isShowFailMsg:!0,isCancelRequest:!0,...t}),getUserInfoApi:()=>e.api.request(`/getUserInfo`,{method:`GET`}),getRoutesApi:()=>e.api.request(`/routes`,{method:`GET`})},t)}},le={name:`app`,install(e,t={}){e.app=I({menuData:[],allRoutes:[],microApps:[],microAppsInstance:new Map,user:null,permissions:[],roles:[],settings:{},initData:null,clearData:()=>{e.app.menuData=[],e.app.allRoutes=e.app.allRoutes.filter(e=>e.path!==`/`),e.app.microApps=[],e.app.microAppsInstance.forEach(e=>e.unmount()),e.app.microAppsInstance.clear(),e.app.user=null,e.app.permissions=[],e.app.roles=[],e.app.settings={}},pageToLogin:()=>{e.storage.clearToken();let t=window.location.pathname||`/`,n=e.config.loginPath,r=t===n?n:`${n}?redirect=${encodeURIComponent(t)}`;e.config.qiankunMode===`router`?window.location.replace(r):(e.app.clearData(),e.client.navigate(r,{replace:!0}))},getRedirectPath:()=>{let t=e.config.defaultPath;if(t)return t;let n=new URLSearchParams(window.location.search);return decodeURIComponent(n.get(`redirect`)||``)||`/`}},t)}},q=`client`,ue={name:q,install(e,t={}){e[q]=I({location:null,navigate:null,matches:null},t)}},J=`config`,de={name:J,install(e,t={}){e[J]=I({env:{},qiankunMode:`router`,theme:null,locale:null,loginPath:`/login`,defaultPath:``,customRoutes:[],antdConfig:{},proLayoutConfig:{title:`Demo`}},t)}},Y=`i18n`,fe={name:Y,install(e,t={}){e[Y]=I({intl:S,intlConfig:{},loadLocale:e=>void 0},t)}},X=`storage`,pe={name:X,install(e,t={}){e[X]=I({localeKey:`locale`,themeKey:`theme`,tokenKey:`token`,getLocale:()=>localStorage.getItem(e.storage.localeKey),setLocale:t=>{localStorage.setItem(e.storage.localeKey,t)},clearLocale:()=>{localStorage.removeItem(e.storage.localeKey)},getTheme:()=>localStorage.getItem(e.storage.themeKey),setTheme:t=>{localStorage.setItem(e.storage.themeKey,t)},clearTheme:()=>{localStorage.removeItem(e.storage.themeKey)},getToken:()=>localStorage.getItem(e.storage.tokenKey),setToken:t=>{localStorage.setItem(e.storage.tokenKey,t)},clearToken:()=>{localStorage.removeItem(e.storage.tokenKey)}},t)}},me=(e,t)=>({initState:{},setInitState:t=>{e(()=>({initState:t})),A.app={...A.app,...t}}}),he=(e,t)=>({locale:null,setLocale:t=>{e(()=>({locale:t})),A.config.locale=t,A.storage.setLocale(t),document.documentElement.setAttribute(`lang`,t);let n=A.i18n.intlConfig;S.init({currentLocale:t,locales:n});try{let e=A.i18n.loadLocale?.(t)||void 0;A.config.antdConfig.locale=e}catch(e){console.error(`Sdk: createLocaleSlice - sdk.i18n.loadLocale error:`,e)}}}),ge=(e,t)=>({microAppLoading:!1,setMicroAppLoading:t=>e(()=>({microAppLoading:t}))}),{defaultAlgorithm:_e,darkAlgorithm:ve}=s,ye=(e,t)=>({theme:null,setTheme:t=>{e(()=>({theme:t})),A.config.theme=t,A.storage.setTheme(t),document.documentElement.setAttribute(`theme`,t);let n=t===`light`?_e:ve;I(A.config.antdConfig,{theme:{algorithm:n}})}}),be=C()(T((...e)=>({...me(...e),...he(...e),...ge(...e),...ye(...e)}))),Z=`store`,xe={name:Z,install(e,t={}){e[Z]=be}};var Q=()=>{let e=v(),t=g(),n=_(),r=n[n.length-1]?.handle?.crumb()||{},i=JSON.parse(r?.routeAttr||`{}`)?.noLayout,a=t=>{e(t.path)};return b(E,{location:t,menuItemRender:(e,t)=>b(`div`,{onClick:()=>a(e),children:t}),onMenuHeaderClick:()=>{e(`/`)},onPageChange:e=>{if(!A.app.user||Object.keys(A.app.user).length===0)return A.app.pageToLogin()},...i&&{headerRender:!1,footerRender:!1,menuRender:!1},menu:{request:async()=>A.app.menuData||[],...A.config.proLayoutConfig.menu},...A.config.proLayoutConfig,children:b(c,{fallback:A.ui.renderComponent(`Loading`,{isSuspense:!0}),children:b(m,{})})})};const{useToken:Se}=s;var Ce=({isInitData:e=!1,isSuspense:t=!1,isMicroApp:n=!1})=>{let{token:r}=Se();return b(`div`,{style:e?{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,background:r.colorBgContainer,color:r.colorText}:{},children:`Loading...`})};const{useToken:we}=s;var Te=()=>{let{token:e}=we(),[n,o]=f(!1);return b(r,{style:{width:`100%`,height:`100%`,background:e.colorBgContainer},justify:`center`,align:`center`,children:x(i,{labelCol:{span:8},labelAlign:`left`,wrapperCol:{span:16},style:{maxWidth:600},initialValues:{remember:!0},onFinish:async e=>{try{o(()=>!0);let t=await A.api.request(`/login`,{method:`POST`,data:e});o(()=>!1);let n=t?.data?.token||``;if(!n)return;A.storage.setToken(n);let r=A.app.getRedirectPath();A.config.qiankunMode===`load`?(A.client.navigate(r,{replace:!0}),A.app.initData?.()):window.location.replace(r)}catch(e){console.log(`Sdk: Login - handleFinish: `,e),o(()=>!1)}},autoComplete:`off`,children:[b(i.Item,{label:`用户名`,name:`username`,rules:[{required:!0,message:`请输入用户名!`}],children:b(a,{})}),b(i.Item,{label:`密码`,name:`password`,rules:[{required:!0,message:`请输入密码!`}],children:b(a.Password,{})}),b(i.Item,{noStyle:!0,children:b(t,{block:!0,type:`primary`,htmlType:`submit`,loading:n,children:`登录`})})]})})};const $=({children:e})=>{let t=g(),n=_(),r=v();return A.client.location=t,A.client.matches=n,A.client.navigate=r,e};var Ee=()=>{let e=A.config.loginPath,t=A.config.customRoutes,r=A.config.qiankunMode===`router`,i=e=>A.ui.renderComponent(`Loading`,e),a=A.ui.renderComponent(`Layout`),o=A.ui.renderComponent(`Login`),s=A.ui.renderComponent(`NotFound`),l=[{path:e,element:o},{path:`*`,element:s},...t].map(e=>({...e,element:b($,{children:e.element})})),[u,m]=f(!1),[g,_]=f(l),[v,y,x,S]=w(A.store,k(e=>[e.locale,e.setLocale,e.theme,e.setTheme])),C=ee(()=>oe(A.config.antdConfig),[v,x]),T=(e,t)=>{S(e||V(A)),y(t||H(A))},E=async()=>{try{m(()=>!0);let[{data:e={}},{data:t=[]}]=await Promise.all([A.api.getUserInfoApi(),A.api.getRoutesApi()]);m(()=>!1);let{theme:n,locale:i}=e?.settings||{};T(n,i);let{microApps:o=[],menuData:c=[]}=U(t);r&&(D(o,B),O());let u=G(c),d=[...l,{path:`/`,element:b(p,{to:u,replace:!0})},{path:`/`,element:b($,{children:a}),children:c,errorElement:s}];_(d),A.app={...A.app,...e,allRoutes:d,microApps:o,menuData:c}}catch(e){console.error(e),m(()=>!1)}};return d(()=>{A.app.initData=E,A.app.allRoutes=l;let t=A.config.customRoutes?.map(e=>e.path),n=window.location.pathname;[e,...t]?.includes(n)?T():E()},[]),b(n,{...C,children:b(c,{fallback:i({isSuspense:!0}),children:u?i({isInitData:!0}):b(te,{router:h(g,{basename:`/`}),future:{v7_startTransition:!1}})})})},De=u(({name:e,rootId:t})=>{let[n,r]=w(A.store,k(e=>[e.microAppLoading,e.setMicroAppLoading]));return d(()=>{if(!e||A.config.qiankunMode!==`load`)return;let t=A.app.microAppsInstance.get(e);if(t)t?.mount();else{let n=A.app.microApps.find(t=>t.name===e);if(!n)return;r(!0),t=ne(n,{},B),t?.mountPromise?.finally(()=>{r(!1)}),A.app.microAppsInstance.set(e,t)}return()=>{t?.unmount()}},[e]),x(y,{children:[n&&A.ui.renderComponent(`Loading`,{isMicroApp:!0}),b(`main`,{id:t})]})}),Oe=()=>b(`div`,{children:`无权限`});const{useToken:ke}=s;var Ae=()=>{let{token:e}=ke();return b(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,background:e.colorBgContainer},children:`找不到页面`})};const je={name:`ui`,install(e,t={}){e.ui=I({Layout:Q,Loading:Ce,Login:Te,Mainapp:Ee,Microapp:De,NotFound:Ae,NoPermission:Oe,setComponent:(t,n)=>{if(!t){console.error(`Sdk: SdkUIPlugin - component cannot be empty`);return}let r=n||t.displayName||t.name;if(!r){console.error(`Sdk: SdkUIPlugin - Component name cannot be empty`);return}e.ui[r]=t},getComponent:t=>t?e.ui[t]:(console.error(`Sdk: SdkUIPlugin - Component name cannot be empty`),null),renderComponent:(t,n={})=>{let r=e.ui.getComponent(t);return r?l(r,n):(console.error(`Sdk: SdkUIPlugin - Component ${t} not found`),null)}},t)}};export{ce as SdkApiPlugin,le as SdkAppPlugin,ue as SdkClientPlugin,de as SdkConfigPlugin,fe as SdkI18nPlugin,pe as SdkStoragePlugin,xe as SdkStorePlugin,je as SdkUIPlugin,A as sdk};
1
+ import e from"axios";import{Button as t,ConfigProvider as n,Flex as r,Form as i,Input as a,message as o,theme as s}from"antd";import{Suspense as c,createElement as l,memo as u,useEffect as d,useMemo as ee,useState as f}from"react";import{Navigate as p,Outlet as m,RouterProvider as te,createBrowserRouter as h,useLocation as g,useMatches as _,useNavigate as v}from"react-router-dom";import{Fragment as y,jsx as b,jsxs as x}from"react/jsx-runtime";import S from"react-intl-universal";import{createStore as C,useStore as w}from"zustand";import{subscribeWithSelector as T}from"zustand/middleware";import E from"@ant-design/pro-layout";import{loadMicroApp as ne,registerMicroApps as D,start as O}from"qiankun";import{useShallow as k}from"zustand/shallow";const A=new class{name;_plugins;api;app;client;config;i18n;storage;store;ui;constructor(){this.name=``,this._plugins=new Map}mount(e){if(window[e])throw Error(`The SDK already exists - ${e}`);console.log(`%c SDK mounted:`,`color: pink; font-weight: bold;`,e,A),this.name=e;let t=new Proxy(this,{get:(e,t,n)=>e?Reflect.get(e,t,n):null,set:()=>(console.error(`The SDK cannot be modified.`),!1),deleteProperty:()=>(console.error(`The SDK cannot be deleted.`),!1)});window[this.name]=t}extend(e){if(!window[e])throw Error(`The SDK not found - ${e}`);console.log(`%c SDK extended:`,`color: pink; font-weight: bold;`,e),Object.assign(this,window[e])}use(e,t){let{name:n,install:r}=e;if(!n)throw Error(`${n} plugin has no name`);if(typeof r!=`function`)throw Error(`${n} plugin is not a function`);return r(this,t),this._plugins.set(n,{...e,options:t}),this}};function j(e){return e==null||typeof e!=`object`&&typeof e!=`function`}function M(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function re(e){return Object.getOwnPropertySymbols(e).filter(t=>Object.prototype.propertyIsEnumerable.call(e,t))}function ie(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}function N(e,t,n,r=new Map,i=void 0){let a=i?.(e,t,n,r);if(a!==void 0)return a;if(j(e))return e;if(r.has(e))return r.get(e);if(Array.isArray(e)){let t=Array(e.length);r.set(e,t);for(let a=0;a<e.length;a++)t[a]=N(e[a],a,n,r,i);return Object.hasOwn(e,`index`)&&(t.index=e.index),Object.hasOwn(e,`input`)&&(t.input=e.input),t}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp){let t=new RegExp(e.source,e.flags);return t.lastIndex=e.lastIndex,t}if(e instanceof Map){let t=new Map;r.set(e,t);for(let[a,o]of e)t.set(a,N(o,a,n,r,i));return t}if(e instanceof Set){let t=new Set;r.set(e,t);for(let a of e)t.add(N(a,void 0,n,r,i));return t}if(typeof Buffer<`u`&&Buffer.isBuffer(e))return e.subarray();if(M(e)){let t=new(Object.getPrototypeOf(e)).constructor(e.length);r.set(e,t);for(let a=0;a<e.length;a++)t[a]=N(e[a],a,n,r,i);return t}if(e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer)return e.slice(0);if(e instanceof DataView){let t=new DataView(e.buffer.slice(0),e.byteOffset,e.byteLength);return r.set(e,t),P(t,e,n,r,i),t}if(typeof File<`u`&&e instanceof File){let t=new File([e],e.name,{type:e.type});return r.set(e,t),P(t,e,n,r,i),t}if(typeof Blob<`u`&&e instanceof Blob){let t=new Blob([e],{type:e.type});return r.set(e,t),P(t,e,n,r,i),t}if(e instanceof Error){let t=new e.constructor;return r.set(e,t),t.message=e.message,t.name=e.name,t.stack=e.stack,t.cause=e.cause,P(t,e,n,r,i),t}if(e instanceof Boolean){let t=new Boolean(e.valueOf());return r.set(e,t),P(t,e,n,r,i),t}if(e instanceof Number){let t=new Number(e.valueOf());return r.set(e,t),P(t,e,n,r,i),t}if(e instanceof String){let t=new String(e.valueOf());return r.set(e,t),P(t,e,n,r,i),t}if(typeof e==`object`&&ae(e)){let t=Object.create(Object.getPrototypeOf(e));return r.set(e,t),P(t,e,n,r,i),t}return e}function P(e,t,n=e,r,i){let a=[...Object.keys(t),...re(t)];for(let o=0;o<a.length;o++){let s=a[o],c=Object.getOwnPropertyDescriptor(e,s);(c==null||c.writable)&&(e[s]=N(t[s],s,n,r,i))}}function ae(e){switch(ie(e)){case`[object Arguments]`:case`[object Array]`:case`[object ArrayBuffer]`:case`[object DataView]`:case`[object Boolean]`:case`[object Date]`:case`[object Float32Array]`:case`[object Float64Array]`:case`[object Int8Array]`:case`[object Int16Array]`:case`[object Int32Array]`:case`[object Map]`:case`[object Number]`:case`[object Object]`:case`[object RegExp]`:case`[object Set]`:case`[object String]`:case`[object Symbol]`:case`[object Uint8Array]`:case`[object Uint8ClampedArray]`:case`[object Uint16Array]`:case`[object Uint32Array]`:return!0;default:return!1}}function oe(e){return N(e,void 0,e,new Map,void 0)}function F(e){if(!e||typeof e!=`object`)return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype||Object.getPrototypeOf(t)===null?Object.prototype.toString.call(e)===`[object Object]`:!1}function se(e){return e===`__proto__`}function I(e,t){let n=Object.keys(t);for(let r=0;r<n.length;r++){let i=n[r];if(se(i))continue;let a=t[i],o=e[i];L(a)&&L(o)?e[i]=I(o,a):Array.isArray(a)?e[i]=I([],a):F(a)?e[i]=I({},a):(o===void 0||a!==void 0)&&(e[i]=a)}return e}function L(e){return F(e)||Array.isArray(e)}const R=e=>{let{requestId:t,url:n,method:r,params:i,data:a}=e;return t||`${r}:${n}?${JSON.stringify(i)}&${JSON.stringify(a)}`},z=e=>{let t=R(e),n=A.api.controllers.get(t);n&&(n.abort(),A.api.controllers.delete(t))},B={beforeLoad:[async e=>{console.log(`[LifeCycle] before load %c%s`,`color: green;`,e.name)}],beforeMount:[async e=>{console.log(`[LifeCycle] before mount %c%s`,`color: green;`,e.name)}],afterUnmount:[async e=>{console.log(`[LifeCycle] after unmount %c%s`,`color: green;`,e.name)}]},V=e=>{let t=e.storage.getTheme();if(t)return t;let n=e.config?.theme;if(n)return n;let r=window.matchMedia(`(prefers-color-scheme: dark)`);return r.matches&&r.matches?`dark`:`light`},H=e=>e.storage.getLocale()||e.config?.locale||navigator.language||`zh-CN`,U=e=>{let t=new Map,n=W(e,t);return{microApps:[...t.values()],menuData:n}},W=(e,t)=>!e||e?.length===0?[]:e.map(e=>{let n=null,{locale:r,path:i,icon:a,component:o,routeAttr:s,children:c}=e;if(s){let e={};try{e=JSON.parse(s)}catch(e){console.error(`Sdk: initData - Subapp routeAttr error: `,e)}let{name:r,rootId:i,...a}=e,o={...a,name:r,container:`#${i}`,props:{sdk:A},loader:e=>A.store.getState().setMicroAppLoading(e)};t.set(r,o),n=A.ui.renderComponent(`Microapp`,{name:r,rootId:i})}else n=o===`Outlet`?b(m,{}):A.ui.renderComponent(o);return{...e,key:`${i}_${a}_${r}`,element:n,children:W(c,t),handle:{crumb:(t={})=>({...e,...t})}}}),G=e=>{let t=`/`;return!e||e.length===0?t:(t=e?.[0]?.path,e?.[0]?.children&&e?.[0]?.children.length>0&&(t=G(e?.[0]?.children)),t)};var K=class{instance;constructor(t={}){this.instance=e.create(t),this.defaultRequestInterceptor(),this.defaultResponseInterceptor()}defaultRequestInterceptor(){this.instance.interceptors.request.use(function(e){if(e?.isCancelRequest){let t=R(e);z(e);let n=new AbortController;A.api.controllers.set(t,n),e.requestId=t,e.signal=n.signal}let t=A.storage.getToken();return e.headers.lang=A.config.locale,e.headers.Authorization=t,I(e.headers,A.api.config.headers||{}),e},function(e){return console.error(`Sdk: defaultRequestInterceptor - 请求错误`),Promise.reject(e)})}defaultResponseInterceptor(){this.instance.interceptors.response.use(function(e){let{data:t,config:n}=e,{isOriginalData:r,isShowFailMsg:i,isCancelRequest:a}=n,{code:s,msg:c}=t;return s!==0&&(i&&o.error(c),console.error(`Sdk: defaultResponseInterceptor - Response error: `,n.url,c),s==20041&&A.app.pageToLogin()),a&&A.api.controllers.delete(n.requestId),r?e:e.data},function(t){let{response:n,config:r}=t,{isShowFailMsg:i}=r;if(e.isCancel(t))return Promise.reject(t);if(n){let{status:e,data:t,statusText:r}=n;i&&o.error(t.msg||r),e==401&&A.app.pageToLogin()}else i&&o.error(`请求超时或服务器异常,请检查网络或联系管理员`),console.error(`Sdk: defaultResponseInterceptor - Request error:`,r.url,t);return Promise.reject(t)})}getInstance(){return this.instance}};const ce={name:`api`,install(e,t={}){let n={baseURL:`/`,timeout:0,...t.config},r=t?.instance||new K(n).getInstance();e.api=I({config:n,controllers:new Map,instance:null,request:(e,t={})=>r.request({url:e,isOriginalData:!1,isShowFailMsg:!0,isCancelRequest:!0,...t}),getUserInfoApi:()=>e.api.request(`/getUserInfo`,{method:`GET`}),getRoutesApi:()=>e.api.request(`/routes`,{method:`GET`}),loginApi:()=>e.api.request(`/login`,{method:`POST`})},t)}},le={name:`app`,install(e,t={}){e.app=I({menuData:[],allRoutes:[],microApps:[],microAppsInstance:new Map,user:null,permissions:[],roles:[],settings:{},initData:null,clearData:()=>{e.app.menuData=[],e.app.allRoutes=e.app.allRoutes.filter(e=>e.path!==`/`),e.app.microApps=[],e.app.microAppsInstance.forEach(e=>e.unmount()),e.app.microAppsInstance.clear(),e.app.user=null,e.app.permissions=[],e.app.roles=[],e.app.settings={}},pageToLogin:()=>{e.storage.clearToken();let t=window.location.pathname||`/`,n=e.config.loginPath,r=t===n?n:`${n}?redirect=${encodeURIComponent(t)}`;e.config.qiankunMode===`router`?window.location.replace(r):(e.app.clearData(),e.client.navigate(r,{replace:!0}))},getRedirectPath:()=>{let t=e.config.defaultPath;if(t)return t;let n=new URLSearchParams(window.location.search);return decodeURIComponent(n.get(`redirect`)||``)||`/`}},t)}},q=`client`,ue={name:q,install(e,t={}){e[q]=I({location:null,navigate:null,matches:null},t)}},J=`config`,de={name:J,install(e,t={}){e[J]=I({env:{},qiankunMode:`router`,theme:null,locale:null,loginPath:`/login`,defaultPath:``,customRoutes:[],antdConfig:{},proLayoutConfig:{title:`Demo`}},t)}},Y=`i18n`,fe={name:Y,install(e,t={}){e[Y]=I({intl:S,intlConfig:{},loadLocale:e=>void 0},t)}},X=`storage`,pe={name:X,install(e,t={}){e[X]=I({localeKey:`locale`,themeKey:`theme`,tokenKey:`token`,getLocale:()=>localStorage.getItem(e.storage.localeKey),setLocale:t=>{localStorage.setItem(e.storage.localeKey,t)},clearLocale:()=>{localStorage.removeItem(e.storage.localeKey)},getTheme:()=>localStorage.getItem(e.storage.themeKey),setTheme:t=>{localStorage.setItem(e.storage.themeKey,t)},clearTheme:()=>{localStorage.removeItem(e.storage.themeKey)},getToken:()=>localStorage.getItem(e.storage.tokenKey),setToken:t=>{localStorage.setItem(e.storage.tokenKey,t)},clearToken:()=>{localStorage.removeItem(e.storage.tokenKey)}},t)}},me=(e,t)=>({initState:{},setInitState:t=>{e(()=>({initState:t})),A.app={...A.app,...t}}}),he=(e,t)=>({locale:null,setLocale:t=>{e(()=>({locale:t})),A.config.locale=t,A.storage.setLocale(t),document.documentElement.setAttribute(`lang`,t);let n=A.i18n.intlConfig;S.init({currentLocale:t,locales:n});try{let e=A.i18n.loadLocale?.(t)||void 0;A.config.antdConfig.locale=e}catch(e){console.error(`Sdk: createLocaleSlice - sdk.i18n.loadLocale error:`,e)}}}),ge=(e,t)=>({microAppLoading:!1,setMicroAppLoading:t=>e(()=>({microAppLoading:t}))}),{defaultAlgorithm:_e,darkAlgorithm:ve}=s,ye=(e,t)=>({theme:null,setTheme:t=>{e(()=>({theme:t})),A.config.theme=t,A.storage.setTheme(t),document.documentElement.setAttribute(`theme`,t);let n=t===`light`?_e:ve;I(A.config.antdConfig,{theme:{algorithm:n}})}}),be=C()(T((...e)=>({...me(...e),...he(...e),...ge(...e),...ye(...e)}))),Z=`store`,xe={name:Z,install(e,t={}){e[Z]=be}};var Q=()=>{let e=v(),t=g(),n=_(),r=n[n.length-1]?.handle?.crumb()||{},i=JSON.parse(r?.routeAttr||`{}`)?.noLayout,a=t=>{e(t.path)};return b(E,{location:t,menuItemRender:(e,t)=>b(`div`,{onClick:()=>a(e),children:t}),onMenuHeaderClick:()=>{e(`/`)},onPageChange:e=>{if(!A.app.user||Object.keys(A.app.user).length===0)return A.app.pageToLogin()},...i&&{headerRender:!1,footerRender:!1,menuRender:!1},menu:{request:async()=>A.app.menuData||[],...A.config.proLayoutConfig.menu},...A.config.proLayoutConfig,children:b(c,{fallback:A.ui.renderComponent(`Loading`,{isSuspense:!0}),children:b(m,{})})})};const{useToken:Se}=s;var Ce=({isInitData:e=!1,isSuspense:t=!1,isMicroApp:n=!1})=>{let{token:r}=Se();return b(`div`,{style:e?{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,background:r.colorBgContainer,color:r.colorText}:{},children:`Loading...`})};const{useToken:we}=s;var Te=()=>{let{token:e}=we(),[n,o]=f(!1);return b(r,{style:{width:`100%`,height:`100%`,background:e.colorBgContainer},justify:`center`,align:`center`,children:x(i,{labelCol:{span:8},labelAlign:`left`,wrapperCol:{span:16},style:{maxWidth:600},initialValues:{remember:!0},onFinish:async e=>{try{o(()=>!0);let t=await A.api.loginApi(e);o(()=>!1);let n=t?.data?.token||``;if(!n)return;A.storage.setToken(n);let r=A.app.getRedirectPath();A.config.qiankunMode===`load`?(A.client.navigate(r,{replace:!0}),A.app.initData?.()):window.location.replace(r)}catch(e){console.log(`Sdk: Login - handleFinish: `,e),o(()=>!1)}},autoComplete:`off`,children:[b(i.Item,{label:`用户名`,name:`username`,rules:[{required:!0,message:`请输入用户名!`}],children:b(a,{})}),b(i.Item,{label:`密码`,name:`password`,rules:[{required:!0,message:`请输入密码!`}],children:b(a.Password,{})}),b(i.Item,{noStyle:!0,children:b(t,{block:!0,type:`primary`,htmlType:`submit`,loading:n,children:`登录`})})]})})};const $=({children:e})=>{let t=g(),n=_(),r=v();return A.client.location=t,A.client.matches=n,A.client.navigate=r,e};var Ee=()=>{let e=A.config.loginPath,t=A.config.customRoutes,r=A.config.qiankunMode===`router`,i=e=>A.ui.renderComponent(`Loading`,e),a=A.ui.renderComponent(`Layout`),o=A.ui.renderComponent(`Login`),s=A.ui.renderComponent(`NotFound`),l=[{path:e,element:o},{path:`*`,element:s},...t].map(e=>({...e,element:b($,{children:e.element})})),[u,m]=f(!1),[g,_]=f(l),[v,y,x,S]=w(A.store,k(e=>[e.locale,e.setLocale,e.theme,e.setTheme])),C=ee(()=>oe(A.config.antdConfig),[v,x]),T=(e,t)=>{S(e||V(A)),y(t||H(A))},E=async()=>{try{m(()=>!0);let[{data:e={}},{data:t=[]}]=await Promise.all([A.api.getUserInfoApi(),A.api.getRoutesApi()]);m(()=>!1);let{theme:n,locale:i}=e?.settings||{};T(n,i);let{microApps:o=[],menuData:c=[]}=U(t);r&&(D(o,B),O());let u=G(c),d=[...l,{path:`/`,element:b(p,{to:u,replace:!0})},{path:`/`,element:b($,{children:a}),children:c,errorElement:s}];_(d),A.app={...A.app,...e,allRoutes:d,microApps:o,menuData:c}}catch(e){console.error(e),m(()=>!1)}};return d(()=>{A.app.initData=E,A.app.allRoutes=l;let t=A.config.customRoutes?.map(e=>e.path),n=window.location.pathname;[e,...t]?.includes(n)?T():E()},[]),b(n,{...C,children:b(c,{fallback:i({isSuspense:!0}),children:u?i({isInitData:!0}):b(te,{router:h(g,{basename:`/`}),future:{v7_startTransition:!1}})})})},De=u(({name:e,rootId:t})=>{let[n,r]=w(A.store,k(e=>[e.microAppLoading,e.setMicroAppLoading]));return d(()=>{if(!e||A.config.qiankunMode!==`load`)return;let t=A.app.microAppsInstance.get(e);if(t)t?.mount();else{let n=A.app.microApps.find(t=>t.name===e);if(!n)return;r(!0),t=ne(n,{},B),t?.mountPromise?.finally(()=>{r(!1)}),A.app.microAppsInstance.set(e,t)}return()=>{t?.unmount()}},[e]),x(y,{children:[n&&A.ui.renderComponent(`Loading`,{isMicroApp:!0}),b(`main`,{id:t})]})}),Oe=()=>b(`div`,{children:`无权限`});const{useToken:ke}=s;var Ae=()=>{let{token:e}=ke();return b(`div`,{style:{width:`100%`,height:`100%`,display:`flex`,alignItems:`center`,justifyContent:`center`,background:e.colorBgContainer},children:`找不到页面`})};const je={name:`ui`,install(e,t={}){e.ui=I({Layout:Q,Loading:Ce,Login:Te,Mainapp:Ee,Microapp:De,NotFound:Ae,NoPermission:Oe,setComponent:(t,n)=>{if(!t){console.error(`Sdk: SdkUIPlugin - component cannot be empty`);return}let r=n||t.displayName||t.name;if(!r){console.error(`Sdk: SdkUIPlugin - Component name cannot be empty`);return}e.ui[r]=t},getComponent:t=>t?e.ui[t]:(console.error(`Sdk: SdkUIPlugin - Component name cannot be empty`),null),renderComponent:(t,n={})=>{let r=e.ui.getComponent(t);return r?l(r,n):(console.error(`Sdk: SdkUIPlugin - Component ${t} not found`),null)}},t)}};export{ce as SdkApiPlugin,le as SdkAppPlugin,ue as SdkClientPlugin,de as SdkConfigPlugin,fe as SdkI18nPlugin,pe as SdkStoragePlugin,xe as SdkStorePlugin,je as SdkUIPlugin,A as sdk};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["sdk","pluginName","Http","options","sdk","pluginName","sdk","pluginName","pluginName","pluginName","pluginName","sdk","theme","antdTheme","theme","pluginName","useToken","useToken","Loading","Layout","Login","NotFound","theme","locale","sdk"],"sources":["../src/core/index.ts","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/predicate/isPrimitive.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/predicate/isTypedArray.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/compat/_internal/getSymbols.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/compat/_internal/getTag.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/compat/_internal/tags.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/object/cloneDeepWith.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/object/cloneDeep.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs","../../node_modules/.pnpm/es-toolkit@1.43.0/node_modules/es-toolkit/dist/object/merge.mjs","../src/utils/request.ts","../src/utils/constant.ts","../src/utils/menus.tsx","../src/plugins/api/http.ts","../src/plugins/api/index.ts","../src/plugins/app/index.tsx","../src/plugins/client/index.ts","../src/plugins/config/index.ts","../src/plugins/i18n/index.ts","../src/plugins/storage/index.ts","../src/plugins/store/createInitState.ts","../src/plugins/store/createLocale.ts","../src/plugins/store/createMicroAppLoading.ts","../src/plugins/store/createTheme.ts","../src/plugins/store/index.ts","../src/plugins/ui/layout/index.tsx","../src/plugins/ui/loading/index.tsx","../src/plugins/ui/login/index.tsx","../src/plugins/ui/mainapp/index.tsx","../src/plugins/ui/microapp/index.tsx","../src/plugins/ui/noPermission/index.tsx","../src/plugins/ui/notFound/index.tsx","../src/plugins/ui/index.ts"],"sourcesContent":["import type { Plugin, PluginOptions, SdkResult } from '@/types';\n\nclass Sdk implements SdkResult {\n name: SdkResult['name'];\n _plugins: SdkResult['_plugins'];\n\n api: SdkResult['api'];\n app: SdkResult['app'];\n client: SdkResult['client'];\n config: SdkResult['config'];\n i18n: SdkResult['i18n'];\n storage: SdkResult['storage'];\n store: SdkResult['store'];\n ui: SdkResult['ui'];\n\n constructor() {\n this.name = '';\n this._plugins = new Map();\n }\n\n mount(name: string) {\n if (window[name]) throw new Error(`The SDK already exists - ${name}`);\n console.log(\n '%c SDK mounted:',\n 'color: pink; font-weight: bold;',\n name,\n sdk,\n );\n\n // 设置名称\n this.name = name;\n\n // 使用 new Proxy 禁止控制台对sdk属性的操作 (仅第一层属性)\n const _this = new Proxy(this, {\n get: (target, key, receiver) => {\n if (!target) return null;\n return Reflect.get(target, key, receiver);\n },\n set: () => {\n console.error('The SDK cannot be modified.');\n return false;\n },\n deleteProperty: () => {\n console.error('The SDK cannot be deleted.');\n return false;\n },\n });\n\n // 挂载到 Window 上\n window[this.name] = _this;\n }\n\n extend(name: string) {\n if (!window[name]) throw new Error(`The SDK not found - ${name}`);\n console.log('%c SDK extended:', 'color: pink; font-weight: bold;', name);\n\n // 合并实例属性\n Object.assign(this, window[name]);\n }\n\n use<K extends keyof PluginOptions>(\n plugin: Plugin<K>,\n options?: PluginOptions[K],\n ) {\n const { name, install } = plugin;\n\n if (!name) throw new Error(`${name} plugin has no name`);\n\n if (typeof install !== 'function')\n throw new Error(`${name} plugin is not a function`);\n\n // 插件安装\n install(this, options);\n\n // 添加到插件列表\n this._plugins.set(name, { ...plugin, options });\n\n // 链式调用\n return this;\n }\n}\n\n/**\n * sdk 实例\n */\nconst sdk = new Sdk();\n\nexport { sdk };\n","function isPrimitive(value) {\n return value == null || (typeof value !== 'object' && typeof value !== 'function');\n}\n\nexport { isPrimitive };\n","function isTypedArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\nexport { isTypedArray };\n","function getSymbols(object) {\n return Object.getOwnPropertySymbols(object).filter(symbol => Object.prototype.propertyIsEnumerable.call(object, symbol));\n}\n\nexport { getSymbols };\n","function getTag(value) {\n if (value == null) {\n return value === undefined ? '[object Undefined]' : '[object Null]';\n }\n return Object.prototype.toString.call(value);\n}\n\nexport { getTag };\n","const regexpTag = '[object RegExp]';\nconst stringTag = '[object String]';\nconst numberTag = '[object Number]';\nconst booleanTag = '[object Boolean]';\nconst argumentsTag = '[object Arguments]';\nconst symbolTag = '[object Symbol]';\nconst dateTag = '[object Date]';\nconst mapTag = '[object Map]';\nconst setTag = '[object Set]';\nconst arrayTag = '[object Array]';\nconst functionTag = '[object Function]';\nconst arrayBufferTag = '[object ArrayBuffer]';\nconst objectTag = '[object Object]';\nconst errorTag = '[object Error]';\nconst dataViewTag = '[object DataView]';\nconst uint8ArrayTag = '[object Uint8Array]';\nconst uint8ClampedArrayTag = '[object Uint8ClampedArray]';\nconst uint16ArrayTag = '[object Uint16Array]';\nconst uint32ArrayTag = '[object Uint32Array]';\nconst bigUint64ArrayTag = '[object BigUint64Array]';\nconst int8ArrayTag = '[object Int8Array]';\nconst int16ArrayTag = '[object Int16Array]';\nconst int32ArrayTag = '[object Int32Array]';\nconst bigInt64ArrayTag = '[object BigInt64Array]';\nconst float32ArrayTag = '[object Float32Array]';\nconst float64ArrayTag = '[object Float64Array]';\n\nexport { argumentsTag, arrayBufferTag, arrayTag, bigInt64ArrayTag, bigUint64ArrayTag, booleanTag, dataViewTag, dateTag, errorTag, float32ArrayTag, float64ArrayTag, functionTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag };\n","import { getSymbols } from '../compat/_internal/getSymbols.mjs';\nimport { getTag } from '../compat/_internal/getTag.mjs';\nimport { uint32ArrayTag, uint16ArrayTag, uint8ClampedArrayTag, uint8ArrayTag, symbolTag, stringTag, setTag, regexpTag, objectTag, numberTag, mapTag, int32ArrayTag, int16ArrayTag, int8ArrayTag, float64ArrayTag, float32ArrayTag, dateTag, booleanTag, dataViewTag, arrayBufferTag, arrayTag, argumentsTag } from '../compat/_internal/tags.mjs';\nimport { isPrimitive } from '../predicate/isPrimitive.mjs';\nimport { isTypedArray } from '../predicate/isTypedArray.mjs';\n\nfunction cloneDeepWith(obj, cloneValue) {\n return cloneDeepWithImpl(obj, undefined, obj, new Map(), cloneValue);\n}\nfunction cloneDeepWithImpl(valueToClone, keyToClone, objectToClone, stack = new Map(), cloneValue = undefined) {\n const cloned = cloneValue?.(valueToClone, keyToClone, objectToClone, stack);\n if (cloned !== undefined) {\n return cloned;\n }\n if (isPrimitive(valueToClone)) {\n return valueToClone;\n }\n if (stack.has(valueToClone)) {\n return stack.get(valueToClone);\n }\n if (Array.isArray(valueToClone)) {\n const result = new Array(valueToClone.length);\n stack.set(valueToClone, result);\n for (let i = 0; i < valueToClone.length; i++) {\n result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n }\n if (Object.hasOwn(valueToClone, 'index')) {\n result.index = valueToClone.index;\n }\n if (Object.hasOwn(valueToClone, 'input')) {\n result.input = valueToClone.input;\n }\n return result;\n }\n if (valueToClone instanceof Date) {\n return new Date(valueToClone.getTime());\n }\n if (valueToClone instanceof RegExp) {\n const result = new RegExp(valueToClone.source, valueToClone.flags);\n result.lastIndex = valueToClone.lastIndex;\n return result;\n }\n if (valueToClone instanceof Map) {\n const result = new Map();\n stack.set(valueToClone, result);\n for (const [key, value] of valueToClone) {\n result.set(key, cloneDeepWithImpl(value, key, objectToClone, stack, cloneValue));\n }\n return result;\n }\n if (valueToClone instanceof Set) {\n const result = new Set();\n stack.set(valueToClone, result);\n for (const value of valueToClone) {\n result.add(cloneDeepWithImpl(value, undefined, objectToClone, stack, cloneValue));\n }\n return result;\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(valueToClone)) {\n return valueToClone.subarray();\n }\n if (isTypedArray(valueToClone)) {\n const result = new (Object.getPrototypeOf(valueToClone).constructor)(valueToClone.length);\n stack.set(valueToClone, result);\n for (let i = 0; i < valueToClone.length; i++) {\n result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n }\n return result;\n }\n if (valueToClone instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' && valueToClone instanceof SharedArrayBuffer)) {\n return valueToClone.slice(0);\n }\n if (valueToClone instanceof DataView) {\n const result = new DataView(valueToClone.buffer.slice(0), valueToClone.byteOffset, valueToClone.byteLength);\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof File !== 'undefined' && valueToClone instanceof File) {\n const result = new File([valueToClone], valueToClone.name, {\n type: valueToClone.type,\n });\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof Blob !== 'undefined' && valueToClone instanceof Blob) {\n const result = new Blob([valueToClone], { type: valueToClone.type });\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Error) {\n const result = new valueToClone.constructor();\n stack.set(valueToClone, result);\n result.message = valueToClone.message;\n result.name = valueToClone.name;\n result.stack = valueToClone.stack;\n result.cause = valueToClone.cause;\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Boolean) {\n const result = new Boolean(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Number) {\n const result = new Number(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof String) {\n const result = new String(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof valueToClone === 'object' && isCloneableObject(valueToClone)) {\n const result = Object.create(Object.getPrototypeOf(valueToClone));\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n return valueToClone;\n}\nfunction copyProperties(target, source, objectToClone = target, stack, cloneValue) {\n const keys = [...Object.keys(source), ...getSymbols(source)];\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const descriptor = Object.getOwnPropertyDescriptor(target, key);\n if (descriptor == null || descriptor.writable) {\n target[key] = cloneDeepWithImpl(source[key], key, objectToClone, stack, cloneValue);\n }\n }\n}\nfunction isCloneableObject(object) {\n switch (getTag(object)) {\n case argumentsTag:\n case arrayTag:\n case arrayBufferTag:\n case dataViewTag:\n case booleanTag:\n case dateTag:\n case float32ArrayTag:\n case float64ArrayTag:\n case int8ArrayTag:\n case int16ArrayTag:\n case int32ArrayTag:\n case mapTag:\n case numberTag:\n case objectTag:\n case regexpTag:\n case setTag:\n case stringTag:\n case symbolTag:\n case uint8ArrayTag:\n case uint8ClampedArrayTag:\n case uint16ArrayTag:\n case uint32ArrayTag: {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nexport { cloneDeepWith, cloneDeepWithImpl, copyProperties };\n","import { cloneDeepWithImpl } from './cloneDeepWith.mjs';\n\nfunction cloneDeep(obj) {\n return cloneDeepWithImpl(obj, undefined, obj, new Map(), undefined);\n}\n\nexport { cloneDeep };\n","function isPlainObject(value) {\n if (!value || typeof value !== 'object') {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n const hasObjectPrototype = proto === null ||\n proto === Object.prototype ||\n Object.getPrototypeOf(proto) === null;\n if (!hasObjectPrototype) {\n return false;\n }\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\nexport { isPlainObject };\n","function isUnsafeProperty(key) {\n return key === '__proto__';\n}\n\nexport { isUnsafeProperty };\n","import { isUnsafeProperty } from '../_internal/isUnsafeProperty.mjs';\nimport { isPlainObject } from '../predicate/isPlainObject.mjs';\n\nfunction merge(target, source) {\n const sourceKeys = Object.keys(source);\n for (let i = 0; i < sourceKeys.length; i++) {\n const key = sourceKeys[i];\n if (isUnsafeProperty(key)) {\n continue;\n }\n const sourceValue = source[key];\n const targetValue = target[key];\n if (isMergeableValue(sourceValue) && isMergeableValue(targetValue)) {\n target[key] = merge(targetValue, sourceValue);\n }\n else if (Array.isArray(sourceValue)) {\n target[key] = merge([], sourceValue);\n }\n else if (isPlainObject(sourceValue)) {\n target[key] = merge({}, sourceValue);\n }\n else if (targetValue === undefined || sourceValue !== undefined) {\n target[key] = sourceValue;\n }\n }\n return target;\n}\nfunction isMergeableValue(value) {\n return isPlainObject(value) || Array.isArray(value);\n}\n\nexport { merge };\n","import type { AxiosResponse } from 'axios';\n\nimport type { ApiRequestOption } from '@/plugins/api/http';\n\nimport { sdk } from '@/core';\n\n/**\n * 生成请求id\n * @param config\n */\nexport const generateRequestIdUtil = (config: any) => {\n const { requestId, url, method, params, data } = config as ApiRequestOption;\n if (requestId) return requestId;\n\n return `${method}:${url}?${JSON.stringify(params)}&${JSON.stringify(data)}`;\n};\n\n/**\n * 取消请求\n * @param config 请求配置\n */\nexport const cancelRequestUtil = (config: any) => {\n const requestId = generateRequestIdUtil(config);\n\n const controller = sdk.api.controllers.get(requestId);\n if (!controller) return;\n\n controller.abort();\n sdk.api.controllers.delete(requestId);\n};\n\n/**\n * 下载文件\n * @param resp 响应数据\n */\nexport const downloadFileUtil = (resp: AxiosResponse) => {\n // 1. 从响应头中解析文件名\n const contentDisposition = resp.headers['content-disposition'];\n let filename = 'data.txt';\n\n if (contentDisposition) {\n // 使用正则匹配文件名(兼容带引号和不带引号的情况)\n const filenameMatch = contentDisposition.match(/filename=\"?(.+)\"?/);\n if (filenameMatch && filenameMatch[1]) {\n filename = filenameMatch[1];\n }\n }\n\n // 2. 创建 blob 对象\n const blob = new Blob([resp.data], { type: 'application/pdf' });\n\n // 3. 创建下载链接\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename; // Specify the file name\n document.body.appendChild(link);\n link.click();\n\n // 4. 释放 blob 对象\n window.URL.revokeObjectURL(url);\n document.body.removeChild(link);\n};\n","import type { FrameworkLifeCycles, ObjectType } from 'qiankun';\n\nimport type { LocaleProps, SdkResult, ThemeProps } from '@/types';\n\n/** qiankun 生命周期 钩子函数 */\nexport const lifeCyclesUtil: FrameworkLifeCycles<ObjectType> = {\n beforeLoad: [\n async (app) => {\n console.log('[LifeCycle] before load %c%s', 'color: green;', app.name);\n },\n ],\n beforeMount: [\n async (app) => {\n console.log('[LifeCycle] before mount %c%s', 'color: green;', app.name);\n },\n ],\n afterUnmount: [\n async (app) => {\n console.log('[LifeCycle] after unmount %c%s', 'color: green;', app.name);\n },\n ],\n};\n\n/**\n * 获取主题默认值\n * @param sdk sdk\n */\nexport const getDefaultThemeUtil = (sdk: SdkResult): ThemeProps => {\n // localStorage > sdk中主题 > 系统主题 > 默认\n\n // 1. localStorage\n const localTheme = sdk.storage.getTheme() as ThemeProps;\n if (localTheme) return localTheme;\n\n // 2. sdk中主题\n const sdkTheme = sdk.config?.theme;\n if (sdkTheme) return sdkTheme;\n\n // 3. 系统主题\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n if (media.matches) return media.matches ? 'dark' : 'light';\n\n // 4. 默认\n return 'light';\n};\n\n/**\n * 获取国际化默认值\n * @param sdk sdk\n */\nexport const getDefaultLocaleUtil = (sdk: SdkResult): LocaleProps => {\n // localStorage > sdk中国际化 > 浏览器语言 > 默认\n\n // 1. localStorage\n const localLocale = sdk.storage.getLocale() as LocaleProps;\n if (localLocale) return localLocale;\n\n // 2. sdk中国际化\n const sdkLocale = sdk.config?.locale;\n if (sdkLocale) return sdkLocale;\n\n // 3. 浏览器语言\n const browserLocale = navigator.language as LocaleProps;\n if (browserLocale) return browserLocale;\n\n // 4. 默认\n return 'zh-CN';\n};\n","import type { ObjectType, RegistrableApp } from 'qiankun';\n\nimport { createElement } from 'react';\nimport { Outlet, type RouteObject } from 'react-router-dom';\n\nimport { sdk } from '@/core';\n\ntype MicroAppsMap = Map<string, RegistrableApp<ObjectType>>;\n\n/**\n * 动态创建Icon\n * @param icon icon名称\n */\nexport const dynamicIcon = (icon: string) => {\n const antIcon: { [key: string]: any } = {}; // 防止类型报错\n return createElement(antIcon[icon]);\n};\n\n/**\n * 处理路由数据\n * @param routes 路由数据\n */\nexport const handleRoutesUtil = (routes: any[]) => {\n const microAppsMap: MicroAppsMap = new Map();\n const menuData = transformRoutesUtil(routes, microAppsMap);\n const microApps = [...microAppsMap.values()];\n return { microApps, menuData };\n};\n\n/**\n * 递归转换路由数据\n * @param routes 路由数据\n * @param microApps 子应用列表\n */\nexport const transformRoutesUtil = (\n routes: any[],\n microAppsMap: MicroAppsMap,\n) => {\n if (!routes || routes?.length === 0) return [];\n\n return routes.map((item) => {\n let element = null; // 组件\n\n const { locale, path, icon, component, routeAttr, children } = item;\n\n // 处理子应用路由\n if (routeAttr) {\n let newRouteAttr = {} as any;\n\n try {\n newRouteAttr = JSON.parse(routeAttr); // 解析子应用路由属性\n } catch (error) {\n console.error('Sdk: initData - Subapp routeAttr error: ', error);\n }\n\n const { name, rootId, ...rest } = newRouteAttr;\n\n // 子应用信息\n const microAppInfo = {\n ...rest,\n name,\n container: `#${rootId}`,\n props: { sdk },\n loader: (loading) => sdk.store.getState().setMicroAppLoading(loading),\n };\n\n // 添加子应用信息\n microAppsMap.set(name, microAppInfo);\n\n element = sdk.ui.renderComponent('Microapp', { name, rootId }); // 子应用挂载组件\n } else if (component === 'Outlet') {\n element = <Outlet />; // 路由出口组件\n } else {\n element = sdk.ui.renderComponent(component); // 普通组件\n }\n\n return {\n ...item,\n key: `${path}_${icon}_${locale}`, // 唯一key, 判断菜单是否折叠\n element,\n children: transformRoutesUtil(children, microAppsMap), // 转换子路由\n handle: {\n // 用户面包屑 https://reactrouter.com/6.30.2/hooks/use-matches\n crumb: (data = {}) => ({ ...item, ...data }),\n },\n };\n });\n};\n\n/**\n * 获取第一个页面的路径\n * @param routes 路由数据\n */\nexport const getFirstPagePathUtil = (routes: RouteObject[]) => {\n let firstPagePath = '/';\n\n if (!routes || routes.length === 0) return firstPagePath;\n\n firstPagePath = routes?.[0]?.path;\n\n if (routes?.[0]?.children && routes?.[0]?.children.length > 0) {\n firstPagePath = getFirstPagePathUtil(routes?.[0]?.children);\n }\n\n return firstPagePath;\n};\n","import { message } from 'antd';\nimport axios, {\n AxiosError,\n type AxiosInstance,\n type AxiosRequestConfig,\n type AxiosResponse,\n type CreateAxiosDefaults,\n type InternalAxiosRequestConfig,\n} from 'axios';\nimport { merge } from 'es-toolkit';\n\nimport { sdk } from '@/core';\nimport { cancelRequestUtil, generateRequestIdUtil } from '@/utils';\n\nexport interface ApiRequestOption extends AxiosRequestConfig {\n /** 请求唯一key(默认自动生成) */\n requestId?: string;\n /** 是否取消重复请求 */\n isCancelRequest?: boolean;\n /** 是否需要原始数据 */\n isOriginalData?: boolean;\n /** 是否显示错误信息 */\n isShowFailMsg?: boolean;\n}\n\n/** 请求类 */\nclass Http {\n instance: AxiosInstance;\n\n constructor(options: CreateAxiosDefaults = {}) {\n this.instance = axios.create(options); // 创建实例\n this.defaultRequestInterceptor(); // 添加默认请求拦截器\n this.defaultResponseInterceptor(); // 添加默认响应拦截器\n }\n\n /** 默认请求拦截器 */\n defaultRequestInterceptor() {\n this.instance.interceptors.request.use(\n function (config: InternalAxiosRequestConfig) {\n // @ts-ignore\n if (config?.isCancelRequest) {\n const requestId = generateRequestIdUtil(config); // 设置请求唯一标识\n cancelRequestUtil(config); // 取消重复请求\n const controller = new AbortController(); // 创建取消请求控制器\n sdk.api.controllers.set(requestId, controller); // 存储取消请求控制器\n\n config['requestId'] = requestId; // 记录请求id\n config.signal = controller.signal; // 取消请求标识\n }\n\n const token = sdk.storage.getToken();\n config.headers.lang = sdk.config.locale; // 添加语言到请求头\n config.headers.Authorization = token; // 添加token到请求头\n merge(config.headers, sdk.api.config.headers || {}); // 合并请求头\n return config;\n },\n function (error: AxiosError) {\n console.error(`Sdk: defaultRequestInterceptor - 请求错误`);\n return Promise.reject(error);\n },\n );\n }\n\n /** 默认响应拦截器 */\n defaultResponseInterceptor() {\n this.instance.interceptors.response.use(\n function (response: AxiosResponse) {\n const { data, config } = response;\n const { isOriginalData, isShowFailMsg, isCancelRequest } =\n config as ApiRequestOption;\n\n const { code, msg } = data;\n\n // 跟后端定义的成功标识 非0的都是失败\n if (code !== 0) {\n if (isShowFailMsg) message.error(msg);\n console.error(\n 'Sdk: defaultResponseInterceptor - Response error: ',\n config.url,\n msg,\n );\n\n if (code == 20041) sdk.app.pageToLogin(); // 登录过期,跳转登录页\n }\n\n if (isCancelRequest) sdk.api.controllers.delete(config['requestId']);\n\n return isOriginalData ? response : response.data;\n },\n function (error: AxiosError) {\n const { response, config } = error;\n const { isShowFailMsg } = config as ApiRequestOption;\n\n // 如果是取消请求,则不显示错误信息\n if (axios.isCancel(error)) return Promise.reject(error);\n\n if (response) {\n // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围\n const { status, data, statusText } = response as AxiosResponse;\n\n if (isShowFailMsg) message.error(data.msg || statusText);\n\n if (status == 401) sdk.app.pageToLogin(); // 登录过期,跳转登录页\n } else {\n // 请求已经成功发起,但没有收到响应\n if (isShowFailMsg)\n message.error('请求超时或服务器异常,请检查网络或联系管理员');\n\n console.error(\n 'Sdk: defaultResponseInterceptor - Request error:',\n config.url,\n error,\n );\n }\n\n return Promise.reject(error);\n },\n );\n }\n\n /** 获取实例 */\n getInstance() {\n return this.instance;\n }\n}\n\nexport default Http;\n","import type { RouteObject } from 'react-router-dom';\n\nimport { type AxiosInstance, type CreateAxiosDefaults } from 'axios';\nimport { merge } from 'es-toolkit';\n\nimport type { Plugin, UserInfo } from '@/types';\n\nimport Http, { type ApiRequestOption } from './http';\n\ninterface ApiOptions {\n /** Axios配置 */\n config?: CreateAxiosDefaults;\n\n /** 取消请求控制器 */\n controllers?: Map<string, AbortController>;\n\n /**\n * 自定义请求实例\n * - 替换 SDK 内置的请求实例\n * @example instance = axios.create(options)\n */\n instance?: AxiosInstance;\n\n /**\n * 获取用户信息\n * {@link UserInfo}\n * @example { code: 0, data: { user: {}, permissions: [], roles: [], settings: {} } }\n */\n getUserInfoApi?(): Promise<any>;\n /**\n * 获取路由数据\n * {@link RouteObject}\n * @example { code: 0, data: [{path: '/', name: '首页', component: 'Home'}] }\n */\n getRoutesApi?(): Promise<any>;\n}\n\ninterface ApiResults extends Required<ApiOptions> {\n /**\n * 请求\n * @param url 请求地址\n * @param options 自定义配置项\n */\n request(url: string, options?: ApiRequestOption): Promise<any>;\n}\n\n/** 插件名称 */\nconst pluginName = 'api';\n\n/**\n * 请求插件\n * - 详情参考 {@link ApiOptions} {@link ApiResults}\n * - 内置了请求, 通过 sdk.api.request 发起请求\n * - 可通过外部传入 instance 自定义请求实例\n * - 预置了获取用户信息, 获取路由接口, 以便组件使用\n * @example sdk.api.request('/getTemp', { method: 'POST', ... })\n * @example sdk.api.request('/getTemp', { method: 'POST', isOriginalData: true }) // 返回原始数据\n * @example sdk.api.request('/getTemp', { method: 'POST', isShowFailMsg: false }) // 不显示错误信息\n * @example sdk.api.request('/getTemp', { method: 'POST', isCancelRequest: false }) // 不自动取消重复请求\n */\nconst SdkApiPlugin: Plugin<'api'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // Axios 配置\n const axiosConfig = {\n baseURL: '/',\n timeout: 0,\n ...options.config,\n } satisfies ApiOptions['config'];\n\n // 创建 Axios 实例\n const instance = options?.instance || new Http(axiosConfig).getInstance();\n\n // 默认插件配置\n const defaultOptions = {\n config: axiosConfig,\n controllers: new Map(),\n\n instance: null,\n\n request: (url, options = {}) => {\n return instance.request({\n url,\n isOriginalData: false,\n isShowFailMsg: true,\n isCancelRequest: true,\n ...options,\n });\n },\n\n getUserInfoApi: () => sdk.api.request('/getUserInfo', { method: 'GET' }),\n getRoutesApi: () => sdk.api.request('/routes', { method: 'GET' }),\n } satisfies ApiResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkApiPlugin };\nexport type { ApiOptions, ApiResults };\n","import type { MenuDataItem } from '@ant-design/pro-layout';\nimport type { MicroApp, ObjectType, RegistrableApp } from 'qiankun';\nimport type { RouteObject } from 'react-router-dom';\n\nimport { merge } from 'es-toolkit';\n\nimport type { Plugin, UserInfo } from '@/types';\n\ninterface AppOptions {\n /** 菜单数据 */\n menuData?: MenuDataItem[];\n /** 所有路由信息 */\n allRoutes?: RouteObject[];\n\n /** 微应用信息 */\n microApps?: RegistrableApp<ObjectType>[];\n /** 微应用实例 */\n microAppsInstance?: Map<string, MicroApp>;\n\n /** 用户信息 */\n user?: UserInfo['user'];\n /** 用户权限 */\n permissions?: UserInfo['permissions'];\n /** 用户角色 */\n roles?: UserInfo['roles'];\n /** 用户设置 */\n settings?: UserInfo['settings'];\n}\n\ninterface AppResults extends Required<AppOptions> {\n /**\n * 初始化数据\n * - sdk.config.qiankunMode = 'load' 时, 登录时用\n */\n initData(): void;\n /**\n * 清空数据\n * - sdk.config.qiankunMode = 'load' 时, 登出时用\n */\n clearData(): void;\n /**\n * 跳转登录页\n */\n pageToLogin(): void;\n /**\n * 获取重定向路径\n */\n getRedirectPath(): string;\n}\n\n/** 插件名称 */\nconst pluginName = 'app';\n\n/**\n * 项目信息\n * - 详情参考 {@link AppOptions} {@link AppResults}\n * - 菜单信息 sdk.app.menuData\n * - 路由信息 sdk.app.allRoutes\n * - 微应用信息 sdk.app.microApps\n * - 用户信息 sdk.app.user\n * - 用户权限 sdk.app.permissions\n * - 用户角色 sdk.app.roles\n * - 用户设置 sdk.app.settings\n */\nconst SdkAppPlugin: Plugin<'app'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n menuData: [],\n allRoutes: [],\n\n microApps: [],\n microAppsInstance: new Map(),\n\n user: null,\n permissions: [],\n roles: [],\n settings: {},\n\n initData: null,\n clearData: () => {\n sdk.app.menuData = [];\n sdk.app.allRoutes = sdk.app.allRoutes.filter((_) => _.path !== '/');\n\n sdk.app.microApps = [];\n sdk.app.microAppsInstance.forEach((_) => _.unmount());\n sdk.app.microAppsInstance.clear();\n\n sdk.app.user = null;\n sdk.app.permissions = [];\n sdk.app.roles = [];\n sdk.app.settings = {};\n },\n pageToLogin: () => {\n // 清除 Token\n sdk.storage.clearToken();\n\n // 获取当前页路由\n const pathname = window.location.pathname || '/';\n const loginPath = sdk.config.loginPath;\n const path =\n pathname === loginPath\n ? loginPath\n : `${loginPath}?redirect=${encodeURIComponent(pathname)}`;\n\n // 跳转登录页\n if (sdk.config.qiankunMode === 'router') {\n window.location.replace(path); // 这里必须刷新一下页面, 否则qiankun实例不会销毁, 登录后会直接mount子应用, 而不是bootstrap子应用\n } else {\n sdk.app.clearData(); // 手动清空数据\n sdk.client.navigate(path, { replace: true }); // 使用客户端路由跳转\n }\n },\n getRedirectPath: () => {\n // 1. 优先使用指定值\n const defaultPath = sdk.config.defaultPath;\n if (defaultPath) return defaultPath;\n\n // 2. 其次使用重定向的值\n const param = new URLSearchParams(window.location.search);\n const redirect = decodeURIComponent(param.get('redirect') || '');\n if (redirect) return redirect;\n\n // 3. 最后使用菜单中第一项\n return '/';\n },\n } satisfies AppResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkAppPlugin };\nexport type { AppOptions, AppResults };\n","import type { Location, NavigateFunction, UIMatch } from 'react-router-dom';\n\nimport { merge } from 'es-toolkit';\n\nimport type { Plugin } from '@/types';\n\ninterface ClientOptions {}\n\ninterface ClientResults extends Required<ClientOptions> {\n /** 主应用 location */\n location: Location;\n /** 主应用navigate(解决子应用跳转问题) */\n navigate: NavigateFunction;\n /** 路由匹配(用于面包屑) */\n matches: UIMatch[];\n}\n\n/** 插件名称 */\nconst pluginName = 'client';\n\n/**\n * 全局路由信息\n * - 详情参考 {@link ClientOptions} {@link ClientResults}\n * - 路由信息 sdk.client.location\n * - 路由跳转 sdk.client.navigate\n * - 面包屑信息 sdk.client.matches\n */\nconst SdkClientPlugin: Plugin<'client'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n location: null,\n navigate: null,\n matches: null,\n } satisfies ClientResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkClientPlugin };\nexport type { ClientOptions, ClientResults };\n","import type { ProLayoutProps } from '@ant-design/pro-layout';\nimport type { ConfigProviderProps } from 'antd';\nimport type { RouteObject } from 'react-router-dom';\n\nimport { merge } from 'es-toolkit';\n\nimport type { LocaleProps, Plugin, ThemeProps } from '@/types';\n\ninterface ConfigOptions {\n /** 环境变量(主应用共享给子应用变量) */\n env?: Record<string, any>;\n\n /** 主题 */\n theme?: ThemeProps;\n /** 国际化 */\n locale?: LocaleProps;\n\n /**\n * Qiankun模式(切换模式后请重新打开页面)\n * - 'router': 基于路由模式\n * - 登录时,刷新页面,会自动调用 getUserInfoApi、getRoutesApi 获取数据\n * - 拿到 routes 数据之后,需要 registerMicroApps 注册子应用 和 start 启动子应用\n * - 系统退出时,刷新页面,自动销毁 qiankun 声明周期和缓存的数据\n * - 系统登录和系统退出仅有一次刷新页面即可,为了销毁 qiankun 的声明周期,但数据需要手动加载或者清除\n * - 'load': 手动加载模式\n * - 登录时,不需刷新页面, 但需要手动调用 getUserInfoApi、getRoutesApi 获取数据\n * - 拿到 routes 数据之后,在 Microapp 组件中使用 loadMicroApp 手动加载子应用\n * - 系统退出时,不刷新页面,但需要手动销毁每个子应用,并清除缓存数据\n */\n qiankunMode?: 'router' | 'load';\n\n /** 登录页路由 */\n loginPath?: string;\n /**\n * 登录后跳转的路由\n * - 优先使用指定值\n * - 其次使用重定向的值\n * - 最后使用菜单中第一项\n */\n defaultPath?: string;\n /**\n * 自定义路由信息\n * - 目前只支持最外层路由自定义\n * - 会合并到 sdk.app.allRoutes 中\n */\n customRoutes?: RouteObject[];\n\n /** Antd 配置 */\n antdConfig?: ConfigProviderProps;\n /** ProLayout 配置 */\n proLayoutConfig?: ProLayoutProps;\n}\n\ninterface ConfigResults extends Required<ConfigOptions> {}\n\n/** 插件名称 */\nconst pluginName = 'config';\n\n/**\n * Sdk 配置信息\n * - 详情参考 {@link ConfigOptions} {@link ConfigResults}\n * - 配置 env 环境变量\n * - 配置 默认主题、国际化\n * - 配置 Qiankun 模式\n * - 配置 默认登录路径、跳转路径、自定义路由\n * - 配置 Antd 配置、ProLayout 配置\n */\nconst SdkConfigPlugin: Plugin<'config'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n env: {},\n\n qiankunMode: 'router',\n\n theme: null,\n locale: null,\n\n loginPath: '/login',\n defaultPath: '',\n customRoutes: [],\n\n antdConfig: {},\n proLayoutConfig: {\n title: 'Demo',\n },\n } satisfies ConfigResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkConfigPlugin };\nexport type { ConfigOptions, ConfigResults };\n","import { merge } from 'es-toolkit';\nimport intl from 'react-intl-universal';\n\nimport type { Plugin } from '@/types';\n\ninterface I18nOptions {\n /**\n * React Intl Universal\n * - 不要解构使用, const { get } = useIntl() 会报错\n * - 如果项目不使用 React Compiler, 可以直接使用 sdk.i18n.intl\n * @example const intl = useIntl(); intl.get(key).d(defaultValue)\n */\n intl?: typeof intl;\n /**\n * React Intl Universal 配置的语言包\n * @example\n * {\n * 'zh-CN': {\n * test: '测试国际化'\n * },\n * 'en-US': {\n * test: 'Test Intl'\n * }\n * }\n */\n intlConfig?: Record<string, any>;\n /**\n * 加载 Antd 语言包\n * @param locale 语言包名\n * @example\n * import enUS from 'antd/es/locale/en_US';\n * import zhCN from 'antd/es/locale/zh_CN';\n * import dayjs from 'dayjs';\n * import 'dayjs/locale/en';\n * import 'dayjs/locale/zh';\n *\n * const loadLocale = (locale: string) => {\n * switch (locale) {\n * case 'en-US':\n * dayjs.locale('en');\n * return enUS;\n * case 'zh-CN':\n * dayjs.locale('zh');\n * return zhCN;\n * default:\n * return undefined;\n * }\n * }\n */\n loadLocale?(locale: string): any;\n}\n\ninterface I18nResults extends Required<I18nOptions> {}\n\n/** 插件名称 */\nconst pluginName = 'i18n';\n\n/**\n * 多语言\n * - 详情参考 {@link I18nOptions} {@link I18nResults}\n * - 集成 React Intl Universal 和 Antd 国际化\n * - 需要从外部引入语言包, 详见 intlConfig 和 loadLocale 配置项\n */\nconst SdkI18nPlugin: Plugin<'i18n'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n intl: intl,\n intlConfig: {},\n loadLocale: (locale: string) => undefined,\n } satisfies I18nResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkI18nPlugin };\nexport type { I18nOptions, I18nResults };\n","import { merge } from 'es-toolkit';\n\nimport type { LocaleProps, Plugin, ThemeProps } from '@/types';\n\ninterface StorageOptions {\n /** 国际化存储名称 */\n localeKey?: string;\n /** 主题存储名称 */\n themeKey?: string;\n /** Token存储名称 */\n tokenKey?: string;\n}\n\ninterface StorageResults extends Required<StorageOptions> {\n /** 获取当前国际化 */\n getLocale(): LocaleProps;\n /** 设置/切换切换国际化 */\n setLocale(locale: LocaleProps): void;\n /** 清空国际化 */\n clearLocale(): void;\n\n /** 获取当前主题 */\n getTheme(): ThemeProps;\n /** 设置/切换主题 */\n setTheme(theme: ThemeProps): void;\n /** 清空主题 */\n clearTheme(): void;\n\n /** 获取当前 Token */\n getToken(): string;\n /** 设置 Token */\n setToken(token: string): void;\n /** 清空 Token */\n clearToken(): void;\n}\n\n/** 插件名称 */\nconst pluginName = 'storage';\n\n/**\n * 本地缓存\n * - 详情参考 {@link StorageOptions} {@link StorageResults}\n * - 配置 localStorage 变量名称\n * - 提供 国际化、主题、Token 的 get、change、clear 方法\n * @example sdk.storage.getToken() // 获取 Token\n * @example sdk.storage.setTheme('dark') // 设置主题\n * @example sdk.storage.clearLocale() // 清空国际化\n */\nconst SdkStoragePlugin: Plugin<'storage'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n localeKey: 'locale',\n themeKey: 'theme',\n tokenKey: 'token',\n\n getLocale: () => {\n return localStorage.getItem(sdk.storage.localeKey);\n },\n setLocale: (locale: string) => {\n localStorage.setItem(sdk.storage.localeKey, locale);\n },\n clearLocale: () => {\n localStorage.removeItem(sdk.storage.localeKey);\n },\n getTheme: () => {\n return localStorage.getItem(sdk.storage.themeKey);\n },\n setTheme: (theme: string) => {\n localStorage.setItem(sdk.storage.themeKey, theme);\n },\n clearTheme: () => {\n localStorage.removeItem(sdk.storage.themeKey);\n },\n getToken: () => {\n return localStorage.getItem(sdk.storage.tokenKey);\n },\n setToken: (token: string) => {\n localStorage.setItem(sdk.storage.tokenKey, token);\n },\n clearToken: () => {\n localStorage.removeItem(sdk.storage.tokenKey);\n },\n } satisfies StorageResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkStoragePlugin };\nexport type { StorageOptions, StorageResults };\n","import type { StateCreator } from 'zustand';\n\nimport type { UserInfo } from '@/types';\n\nimport { sdk } from '@/core';\n\ninterface InitStateStoreProps {\n /** 初始变量 */\n initState: UserInfo;\n /** 设置初始变量 */\n setInitState(initState: UserInfo): void;\n}\n\n/** 初始变量状态 */\nconst createInitStateSlice: StateCreator<InitStateStoreProps> = (set, get) => ({\n initState: {},\n setInitState: (initState) => {\n set(() => ({ initState }));\n sdk.app = { ...sdk.app, ...initState };\n },\n});\n\nexport { createInitStateSlice };\nexport type { InitStateStoreProps };\n","import type { StateCreator } from 'zustand';\n\nimport intl from 'react-intl-universal';\n\nimport type { LocaleProps } from '@/types';\n\nimport { sdk } from '@/core';\n\ninterface LocaleStoreProps {\n /** 国际化 */\n locale: LocaleProps;\n /** 设置国际化 */\n setLocale(locale: LocaleProps): void;\n}\n\n/** 国际化状态 */\nconst createLocaleSlice: StateCreator<LocaleStoreProps> = (set, get) => ({\n locale: null,\n\n setLocale: (locale) => {\n set(() => ({ locale })); // 自动合并其他\n\n // 记录值\n sdk.config.locale = locale;\n sdk.storage.setLocale(locale);\n\n // 设置作用域\n document.documentElement.setAttribute('lang', locale);\n\n // 设置 React Intl Universal 语言包\n const intlConfig = sdk.i18n.intlConfig;\n intl.init({ currentLocale: locale, locales: intlConfig });\n\n // 加载 Antd 语言包\n try {\n const localeData = sdk.i18n.loadLocale?.(locale) || undefined;\n sdk.config.antdConfig.locale = localeData;\n } catch (e) {\n console.error('Sdk: createLocaleSlice - sdk.i18n.loadLocale error:', e);\n }\n },\n});\n\nexport { createLocaleSlice };\nexport type { LocaleStoreProps };\n","import type { StateCreator } from 'zustand';\n\ninterface MicroAppStateStoreProps {\n /** 子应用加载状态 */\n microAppLoading: boolean;\n /** 设置子应用加载状态 */\n setMicroAppLoading(state: boolean): void;\n}\n\n/** 子应用状态 */\nconst createMicroAppStateSlice: StateCreator<MicroAppStateStoreProps> = (\n set,\n get,\n) => ({\n microAppLoading: false,\n setMicroAppLoading: (microAppLoading) => set(() => ({ microAppLoading })),\n});\n\nexport { createMicroAppStateSlice };\nexport type { MicroAppStateStoreProps };\n","import type { StateCreator } from 'zustand';\n\nimport { theme as antdTheme } from 'antd';\nimport { merge } from 'es-toolkit';\n\nimport type { ThemeProps } from '@/types';\n\nimport { sdk } from '@/core';\n\nconst { defaultAlgorithm, darkAlgorithm } = antdTheme;\ninterface ThemeStoreProps {\n /** 主题 */\n theme: ThemeProps;\n /** 设置主题 */\n setTheme(theme: ThemeProps): void;\n}\n\n/** 主题状态 */\nconst createThemeSlice: StateCreator<ThemeStoreProps> = (set, get) => ({\n theme: null,\n\n setTheme: (theme) => {\n set(() => ({ theme })); // 自动合并其他\n\n // 记录值\n sdk.config.theme = theme;\n sdk.storage.setTheme(theme);\n\n // 设置作用域\n document.documentElement.setAttribute('theme', theme);\n\n // 设置Antd主题算法\n const algorithm = theme === 'light' ? defaultAlgorithm : darkAlgorithm;\n merge(sdk.config.antdConfig, { theme: { algorithm } });\n },\n});\n\nexport { createThemeSlice };\nexport type { ThemeStoreProps };\n","import { createStore } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport type { Plugin } from '@/types';\n\nimport {\n createInitStateSlice,\n type InitStateStoreProps,\n} from './createInitState';\nimport { createLocaleSlice, type LocaleStoreProps } from './createLocale';\nimport {\n createMicroAppStateSlice,\n type MicroAppStateStoreProps,\n} from './createMicroAppLoading';\nimport { createThemeSlice, type ThemeStoreProps } from './createTheme';\n\ntype StoreOptions = InitStateStoreProps &\n LocaleStoreProps &\n MicroAppStateStoreProps &\n ThemeStoreProps;\n\ntype StoreResults = typeof globalStore;\n\n/**\n * 创建 Store\n * - 这里单独声明变量, 主要是为了使用返回类型 StoreResults 🤔\n */\nconst globalStore = createStore<StoreOptions>()(\n subscribeWithSelector((...a) => ({\n ...createInitStateSlice(...a),\n ...createLocaleSlice(...a),\n ...createMicroAppStateSlice(...a),\n ...createThemeSlice(...a),\n })),\n);\n\n/** 插件名称 */\nconst pluginName = 'store';\n\n/**\n * 全局状态管理\n * - 详情参考 {@link StoreOptions} {@link StoreResults}\n * - 此插件不会合并传入属性\n * @example const setTheme = useStore(sdk.store, (state) => state.setTheme)\n * @example const { theme, setTheme } = useStore(sdk.store, useShallow((state) => { theme: state.theme, setTheme: state.setTheme }))\n * @example const [theme, setTheme] = useStore(sdk.store, useShallow((state) => [state.theme, state.setTheme]))\n * @example sdk.store?.getState()?.setTheme('light')\n * @example sdk.store.subscribe((state) => state.theme, (theme) => { console.log('theme', theme) }, { fireImmediately: true }) // fireImmediately 立即变更\n */\nconst SdkStorePlugin: Plugin<'store'> = {\n name: pluginName,\n install(sdk, options = {}) {\n sdk[pluginName] = globalStore satisfies StoreResults;\n },\n};\n\nexport { SdkStorePlugin };\nexport type { StoreOptions, StoreResults };\n","import ProLayout from '@ant-design/pro-layout';\nimport { Suspense } from 'react';\nimport { Outlet, useLocation, useMatches, useNavigate } from 'react-router-dom';\n\nimport { sdk } from '@/core';\n\n/** 布局组件 */\nconst Layout: React.FC = () => {\n const navigate = useNavigate();\n const location = useLocation();\n const matches = useMatches();\n\n const currentMatch = matches[matches.length - 1]?.handle?.crumb() || {};\n const noLayout = JSON.parse(currentMatch?.routeAttr || '{}')?.noLayout;\n\n /** 菜单点击事件 */\n const handleMenuClick = (item: any) => {\n navigate(item.path);\n };\n\n /** 菜单头点击事件 */\n const handleMenuHeaderClick = () => {\n navigate('/');\n };\n\n /** 页面切换事件 */\n const handlePageChange = (location: Location) => {\n // 是否有用户信息\n if (!sdk.app.user || Object.keys(sdk.app.user).length === 0)\n return sdk.app.pageToLogin();\n };\n\n return (\n <ProLayout\n location={location}\n menuItemRender={(item, dom) => (\n <div onClick={() => handleMenuClick(item)}>{dom}</div>\n )}\n onMenuHeaderClick={handleMenuHeaderClick}\n onPageChange={handlePageChange}\n {...(noLayout && {\n headerRender: false,\n footerRender: false,\n menuRender: false,\n })}\n menu={{\n request: async () => sdk.app.menuData || [],\n ...sdk.config.proLayoutConfig.menu,\n }}\n {...sdk.config.proLayoutConfig}\n >\n <Suspense\n fallback={sdk.ui.renderComponent('Loading', { isSuspense: true })}\n >\n <Outlet />\n </Suspense>\n </ProLayout>\n );\n};\n\nexport default Layout;\n","import { theme } from 'antd';\n\nconst { useToken } = theme;\n\ninterface Props {\n /** 是否是初始化数据 */\n isInitData?: boolean;\n /** 是否是懒加载 */\n isSuspense?: boolean;\n /** 是否是子应用加载 */\n isMicroApp?: boolean;\n}\n\n/** 加载中组件 */\nconst Loading: React.FC = ({\n isInitData = false,\n isSuspense = false,\n isMicroApp = false,\n}: Props) => {\n const { token } = useToken();\n return (\n <div\n style={\n isInitData\n ? {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: token.colorBgContainer,\n color: token.colorText,\n }\n : {}\n }\n >\n Loading...\n </div>\n );\n};\n\nexport default Loading;\n","import { Button, Flex, Form, type FormProps, Input, theme } from 'antd';\nimport { useState } from 'react';\n\nimport { sdk } from '@/core';\n\nconst { useToken } = theme;\n\n/** 登录组件 */\nconst Login: React.FC = () => {\n const { token: themeToken } = useToken();\n\n const [loading, setLoading] = useState(false);\n\n /** 表单提交成功事件 */\n const handleFinish: FormProps['onFinish'] = async (values) => {\n try {\n setLoading(() => true);\n const resp = await sdk.api.request('/login', {\n method: 'POST',\n data: values,\n });\n setLoading(() => false);\n\n const token = resp?.data?.token || '';\n if (!token) return;\n\n sdk.storage.setToken(token);\n const defaultPath = sdk.app.getRedirectPath();\n\n if (sdk.config.qiankunMode === 'load') {\n sdk.client.navigate(defaultPath, { replace: true });\n sdk.app.initData?.();\n } else {\n window.location.replace(defaultPath);\n }\n } catch (e) {\n console.log('Sdk: Login - handleFinish: ', e);\n setLoading(() => false);\n }\n };\n\n return (\n <Flex\n style={{\n width: '100%',\n height: '100%',\n background: themeToken.colorBgContainer,\n }}\n justify={'center'}\n align={'center'}\n >\n <Form\n labelCol={{ span: 8 }}\n labelAlign='left'\n wrapperCol={{ span: 16 }}\n style={{ maxWidth: 600 }}\n initialValues={{ remember: true }}\n onFinish={handleFinish}\n autoComplete='off'\n >\n <Form.Item\n label='用户名'\n name='username'\n rules={[{ required: true, message: '请输入用户名!' }]}\n >\n <Input />\n </Form.Item>\n\n <Form.Item\n label='密码'\n name='password'\n rules={[{ required: true, message: '请输入密码!' }]}\n >\n <Input.Password />\n </Form.Item>\n\n <Form.Item noStyle>\n <Button block type='primary' htmlType='submit' loading={loading}>\n 登录\n </Button>\n </Form.Item>\n </Form>\n </Flex>\n );\n};\n\nexport default Login;\n","import { ConfigProvider, Spin } from 'antd';\nimport { cloneDeep } from 'es-toolkit/object';\nimport { registerMicroApps, start } from 'qiankun';\nimport React, { Suspense, useEffect, useMemo, useState } from 'react';\nimport {\n createBrowserRouter,\n Navigate,\n type RouteObject,\n RouterProvider,\n useLocation,\n useMatches,\n useNavigate,\n} from 'react-router-dom';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport { sdk } from '@/core';\nimport {\n getDefaultLocaleUtil,\n getDefaultThemeUtil,\n getFirstPagePathUtil,\n handleRoutesUtil,\n lifeCyclesUtil,\n} from '@/utils';\n\n/** 记录路由信息 */\nconst WithClient: React.FC<any> = ({ children }) => {\n const location = useLocation();\n const matches = useMatches();\n const navigate = useNavigate();\n\n sdk.client.location = location;\n sdk.client.matches = matches;\n sdk.client.navigate = navigate;\n\n return children;\n};\n\n/** 主应用的根组件 */\nconst Mainapp: React.FC = () => {\n const loginPath = sdk.config.loginPath; // 登录路径\n const customRoutes = sdk.config.customRoutes; // 自定义路由\n const isRouterQiankunMode = sdk.config.qiankunMode === 'router'; // 是否使用 qiankun router 模式\n\n const Loading = (props) => sdk.ui.renderComponent('Loading', props); // 加载组件\n const Layout = sdk.ui.renderComponent('Layout'); // 布局组件\n const Login = sdk.ui.renderComponent('Login'); // 登录组件\n const NotFound = sdk.ui.renderComponent('NotFound'); // 404组件\n\n /** 默认路由(最外层路由都要被 WithClient 包裹, 可以实现不刷新页面跳转) */\n const defaultRoutes: RouteObject[] = [\n { path: loginPath, element: Login },\n { path: '*', element: NotFound },\n ...customRoutes,\n ].map((_) => ({ ..._, element: <WithClient>{_.element}</WithClient> }));\n\n const [loading, setLoading] = useState(false); // 加载状态(获取初始化数据时)\n const [routes, setRoutes] = useState<RouteObject[]>(defaultRoutes); // 路由\n\n const [locale, setLocale, theme, setTheme] = useStore(\n sdk.store,\n useShallow((state) => [\n state.locale,\n state.setLocale,\n state.theme,\n state.setTheme,\n ]),\n );\n\n // antd 配置\n const antdConfig = useMemo(() => {\n return cloneDeep(sdk.config.antdConfig); // 改变引用地址(触发变更)\n }, [locale, theme]);\n\n /** 设置主题和国际化 */\n const setThemeLocale = (apiTheme?: any, apiLocale?: any) => {\n setTheme(apiTheme || getDefaultThemeUtil(sdk));\n setLocale(apiLocale || getDefaultLocaleUtil(sdk));\n };\n /** 获取初始化数据 */\n const initData = async () => {\n try {\n setLoading(() => true);\n const [{ data: userData = {} }, { data: routerData = [] }] =\n await Promise.all([sdk.api.getUserInfoApi(), sdk.api.getRoutesApi()]);\n setLoading(() => false);\n\n // 设置主题和语言(每个用户配置的主题和语言)\n const { theme, locale } = userData?.settings || {};\n setThemeLocale(theme, locale);\n\n // 处理路由数据\n const { microApps = [], menuData = [] } = handleRoutesUtil(routerData);\n\n // 使用 qiankun router 模式\n if (isRouterQiankunMode) {\n registerMicroApps(microApps, lifeCyclesUtil); // 注册微应用\n start(); // 启动 qiankun\n }\n\n // 获取首页路径\n const firstPath = getFirstPagePathUtil(menuData);\n\n // 合并所有路由\n const allRoutes: RouteObject[] = [\n ...defaultRoutes,\n {\n path: '/',\n element: <Navigate to={firstPath} replace />,\n },\n {\n path: '/',\n element: <WithClient>{Layout}</WithClient>,\n children: menuData,\n errorElement: NotFound,\n },\n ];\n\n setRoutes(allRoutes); // 重新赋值,触发路由更新\n\n sdk.app = {\n ...sdk.app,\n ...userData,\n allRoutes,\n microApps,\n menuData,\n };\n } catch (error) {\n console.error(error);\n setLoading(() => false);\n }\n };\n\n useEffect(() => {\n sdk.app.initData = initData;\n sdk.app.allRoutes = defaultRoutes;\n\n const paths = sdk.config.customRoutes?.map((item) => item.path);\n const pathName = window.location.pathname;\n const noNeedAuth = [loginPath, ...paths]?.includes(pathName);\n\n // 如果时登录页面\n if (noNeedAuth) setThemeLocale();\n else initData();\n }, []);\n\n return (\n <ConfigProvider {...antdConfig}>\n <Suspense fallback={Loading({ isSuspense: true })}>\n {loading ? (\n Loading({ isInitData: true })\n ) : (\n <RouterProvider\n router={createBrowserRouter(routes, { basename: '/' })}\n future={{ v7_startTransition: false }}\n />\n )}\n </Suspense>\n </ConfigProvider>\n );\n};\n\nexport default Mainapp;\n","import { loadMicroApp } from 'qiankun';\nimport React, { memo, useEffect } from 'react';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport { sdk } from '@/core';\nimport { lifeCyclesUtil } from '@/utils';\n\ninterface Props {\n /** 子应用名称 */\n name: string;\n /** 子应用挂载节点 */\n rootId: string;\n}\n\n/** 子应用挂载组件 */\nconst Microapp: React.FC<Props> = ({ name, rootId }) => {\n const [microAppLoading, setMicroAppLoading] = useStore(\n sdk.store,\n useShallow((state) => [state.microAppLoading, state.setMicroAppLoading]),\n );\n\n useEffect(() => {\n if (!name || sdk.config.qiankunMode !== 'load') return;\n\n let instance = sdk.app.microAppsInstance.get(name);\n if (instance) {\n instance?.mount();\n } else {\n const microApp = sdk.app.microApps.find((_) => _.name === name);\n if (!microApp) return;\n\n setMicroAppLoading(true);\n instance = loadMicroApp(microApp, {}, lifeCyclesUtil);\n instance?.mountPromise?.finally(() => {\n setMicroAppLoading(false);\n });\n sdk.app.microAppsInstance.set(name, instance);\n }\n\n return () => {\n instance?.unmount();\n };\n }, [name]);\n\n return (\n <>\n {microAppLoading &&\n sdk.ui.renderComponent('Loading', { isMicroApp: true })}\n <main id={rootId}></main>\n </>\n );\n};\n\nexport default memo(Microapp);\n","/** 无权限组件 */\nconst NoPermission: React.FC = () => {\n return <div>无权限</div>;\n};\n\nexport default NoPermission;\n","import { theme } from 'antd';\n\nconst { useToken } = theme;\n\n/** 404组件 */\nconst NotFound: React.FC = () => {\n const { token } = useToken();\n\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: token.colorBgContainer,\n }}\n >\n 找不到页面\n </div>\n );\n};\n\nexport default NotFound;\n","import { merge } from 'es-toolkit';\nimport { type ComponentType, createElement, type ReactElement } from 'react';\n\nimport type { Plugin } from '@/types';\n\nimport Layout from './layout';\nimport Loading from './loading';\nimport Login from './login';\nimport Mainapp from './mainapp';\nimport Microapp from './microapp';\nimport NoPermission from './noPermission';\nimport NotFound from './notFound';\n\ninterface UIOptions {\n /** 组件 */\n [key: string]:\n | ComponentType\n | ((name: string) => ComponentType)\n | ((component: ComponentType, name?: string) => void);\n}\n\ninterface UIResults extends Required<UIOptions> {\n /**\n * 设置组件\n * @param component 组件\n * @param name 组件名称\n */\n setComponent(component: ComponentType, name?: string): void;\n /**\n * 获取组件\n * @param name 组件名称\n */\n getComponent(name: string): ComponentType;\n /**\n * 渲染组件\n * @param name 组件名称\n */\n renderComponent(name: string, props?: any): ReactElement;\n}\n\n/** 插件名称 */\nconst pluginName = 'ui';\n\n/**\n * 可复用组件\n * - 详情参考 {@link UIOptions} {@link UIResults}\n * - 内置了 Layout、Loading、Login、Mainapp、Microapp、NotFound 等组件, 可传入覆盖\n * - 组件共享\n * - 在主应用中, 可通过 sdk.use(SdkUIPlugin, { MyComponent }) 传入组件\n * - 在子应用中, 可通过 sdk.ui.renderComponent('MyComponent') 使用组件\n */\nconst SdkUIPlugin: Plugin<'ui'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n Layout,\n Loading,\n Login,\n Mainapp,\n Microapp,\n NotFound,\n NoPermission,\n\n setComponent: (component, name) => {\n if (!component) {\n console.error('Sdk: SdkUIPlugin - component cannot be empty');\n return;\n }\n\n const componentName = name || component.displayName || component.name;\n if (!componentName) {\n console.error('Sdk: SdkUIPlugin - Component name cannot be empty');\n return;\n }\n\n sdk.ui[componentName] = component;\n },\n getComponent: (name) => {\n if (!name) {\n console.error('Sdk: SdkUIPlugin - Component name cannot be empty');\n return null;\n } else {\n return sdk.ui[name] as ComponentType;\n }\n },\n renderComponent: (name, props = {}) => {\n const Component = sdk.ui.getComponent(name);\n if (!Component) {\n console.error(`Sdk: SdkUIPlugin - Component ${name} not found`);\n return null;\n } else {\n return createElement(Component, props);\n }\n },\n } satisfies UIResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkUIPlugin };\nexport type { UIOptions, UIResults };\n"],"x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["pluginName","Http","pluginName","pluginName","pluginName","pluginName","pluginName","antdTheme","pluginName","useToken","useToken"],"sources":["../src/core/index.ts","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/predicate/isPrimitive.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/predicate/isTypedArray.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/compat/_internal/getSymbols.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/compat/_internal/getTag.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/compat/_internal/tags.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/object/cloneDeepWith.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/object/cloneDeep.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs","../../node_modules/.pnpm/es-toolkit@1.44.0/node_modules/es-toolkit/dist/object/merge.mjs","../src/utils/request.ts","../src/utils/constant.ts","../src/utils/menus.tsx","../src/plugins/api/http.ts","../src/plugins/api/index.ts","../src/plugins/app/index.tsx","../src/plugins/client/index.ts","../src/plugins/config/index.ts","../src/plugins/i18n/index.ts","../src/plugins/storage/index.ts","../src/plugins/store/createInitState.ts","../src/plugins/store/createLocale.ts","../src/plugins/store/createMicroAppLoading.ts","../src/plugins/store/createTheme.ts","../src/plugins/store/index.ts","../src/plugins/ui/layout/index.tsx","../src/plugins/ui/loading/index.tsx","../src/plugins/ui/login/index.tsx","../src/plugins/ui/mainapp/index.tsx","../src/plugins/ui/microapp/index.tsx","../src/plugins/ui/noPermission/index.tsx","../src/plugins/ui/notFound/index.tsx","../src/plugins/ui/index.ts"],"sourcesContent":["import type { Plugin, PluginOptions, SdkResult } from '@/types';\n\nclass Sdk implements SdkResult {\n name: SdkResult['name'];\n _plugins: SdkResult['_plugins'];\n\n api: SdkResult['api'];\n app: SdkResult['app'];\n client: SdkResult['client'];\n config: SdkResult['config'];\n i18n: SdkResult['i18n'];\n storage: SdkResult['storage'];\n store: SdkResult['store'];\n ui: SdkResult['ui'];\n\n constructor() {\n this.name = '';\n this._plugins = new Map();\n }\n\n mount(name: string) {\n if (window[name]) throw new Error(`The SDK already exists - ${name}`);\n console.log(\n '%c SDK mounted:',\n 'color: pink; font-weight: bold;',\n name,\n sdk,\n );\n\n // 设置名称\n this.name = name;\n\n // 使用 new Proxy 禁止控制台对sdk属性的操作 (仅第一层属性)\n const _this = new Proxy(this, {\n get: (target, key, receiver) => {\n if (!target) return null;\n return Reflect.get(target, key, receiver);\n },\n set: () => {\n console.error('The SDK cannot be modified.');\n return false;\n },\n deleteProperty: () => {\n console.error('The SDK cannot be deleted.');\n return false;\n },\n });\n\n // 挂载到 Window 上\n window[this.name] = _this;\n }\n\n extend(name: string) {\n if (!window[name]) throw new Error(`The SDK not found - ${name}`);\n console.log('%c SDK extended:', 'color: pink; font-weight: bold;', name);\n\n // 合并实例属性\n Object.assign(this, window[name]);\n }\n\n use<K extends keyof PluginOptions>(\n plugin: Plugin<K>,\n options?: PluginOptions[K],\n ) {\n const { name, install } = plugin;\n\n if (!name) throw new Error(`${name} plugin has no name`);\n\n if (typeof install !== 'function')\n throw new Error(`${name} plugin is not a function`);\n\n // 插件安装\n install(this, options);\n\n // 添加到插件列表\n this._plugins.set(name, { ...plugin, options });\n\n // 链式调用\n return this;\n }\n}\n\n/**\n * sdk 实例\n */\nconst sdk = new Sdk();\n\nexport { sdk };\n","function isPrimitive(value) {\n return value == null || (typeof value !== 'object' && typeof value !== 'function');\n}\n\nexport { isPrimitive };\n","function isTypedArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\nexport { isTypedArray };\n","function getSymbols(object) {\n return Object.getOwnPropertySymbols(object).filter(symbol => Object.prototype.propertyIsEnumerable.call(object, symbol));\n}\n\nexport { getSymbols };\n","function getTag(value) {\n if (value == null) {\n return value === undefined ? '[object Undefined]' : '[object Null]';\n }\n return Object.prototype.toString.call(value);\n}\n\nexport { getTag };\n","const regexpTag = '[object RegExp]';\nconst stringTag = '[object String]';\nconst numberTag = '[object Number]';\nconst booleanTag = '[object Boolean]';\nconst argumentsTag = '[object Arguments]';\nconst symbolTag = '[object Symbol]';\nconst dateTag = '[object Date]';\nconst mapTag = '[object Map]';\nconst setTag = '[object Set]';\nconst arrayTag = '[object Array]';\nconst functionTag = '[object Function]';\nconst arrayBufferTag = '[object ArrayBuffer]';\nconst objectTag = '[object Object]';\nconst errorTag = '[object Error]';\nconst dataViewTag = '[object DataView]';\nconst uint8ArrayTag = '[object Uint8Array]';\nconst uint8ClampedArrayTag = '[object Uint8ClampedArray]';\nconst uint16ArrayTag = '[object Uint16Array]';\nconst uint32ArrayTag = '[object Uint32Array]';\nconst bigUint64ArrayTag = '[object BigUint64Array]';\nconst int8ArrayTag = '[object Int8Array]';\nconst int16ArrayTag = '[object Int16Array]';\nconst int32ArrayTag = '[object Int32Array]';\nconst bigInt64ArrayTag = '[object BigInt64Array]';\nconst float32ArrayTag = '[object Float32Array]';\nconst float64ArrayTag = '[object Float64Array]';\n\nexport { argumentsTag, arrayBufferTag, arrayTag, bigInt64ArrayTag, bigUint64ArrayTag, booleanTag, dataViewTag, dateTag, errorTag, float32ArrayTag, float64ArrayTag, functionTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag };\n","import { getSymbols } from '../compat/_internal/getSymbols.mjs';\nimport { getTag } from '../compat/_internal/getTag.mjs';\nimport { uint32ArrayTag, uint16ArrayTag, uint8ClampedArrayTag, uint8ArrayTag, symbolTag, stringTag, setTag, regexpTag, objectTag, numberTag, mapTag, int32ArrayTag, int16ArrayTag, int8ArrayTag, float64ArrayTag, float32ArrayTag, dateTag, booleanTag, dataViewTag, arrayBufferTag, arrayTag, argumentsTag } from '../compat/_internal/tags.mjs';\nimport { isPrimitive } from '../predicate/isPrimitive.mjs';\nimport { isTypedArray } from '../predicate/isTypedArray.mjs';\n\nfunction cloneDeepWith(obj, cloneValue) {\n return cloneDeepWithImpl(obj, undefined, obj, new Map(), cloneValue);\n}\nfunction cloneDeepWithImpl(valueToClone, keyToClone, objectToClone, stack = new Map(), cloneValue = undefined) {\n const cloned = cloneValue?.(valueToClone, keyToClone, objectToClone, stack);\n if (cloned !== undefined) {\n return cloned;\n }\n if (isPrimitive(valueToClone)) {\n return valueToClone;\n }\n if (stack.has(valueToClone)) {\n return stack.get(valueToClone);\n }\n if (Array.isArray(valueToClone)) {\n const result = new Array(valueToClone.length);\n stack.set(valueToClone, result);\n for (let i = 0; i < valueToClone.length; i++) {\n result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n }\n if (Object.hasOwn(valueToClone, 'index')) {\n result.index = valueToClone.index;\n }\n if (Object.hasOwn(valueToClone, 'input')) {\n result.input = valueToClone.input;\n }\n return result;\n }\n if (valueToClone instanceof Date) {\n return new Date(valueToClone.getTime());\n }\n if (valueToClone instanceof RegExp) {\n const result = new RegExp(valueToClone.source, valueToClone.flags);\n result.lastIndex = valueToClone.lastIndex;\n return result;\n }\n if (valueToClone instanceof Map) {\n const result = new Map();\n stack.set(valueToClone, result);\n for (const [key, value] of valueToClone) {\n result.set(key, cloneDeepWithImpl(value, key, objectToClone, stack, cloneValue));\n }\n return result;\n }\n if (valueToClone instanceof Set) {\n const result = new Set();\n stack.set(valueToClone, result);\n for (const value of valueToClone) {\n result.add(cloneDeepWithImpl(value, undefined, objectToClone, stack, cloneValue));\n }\n return result;\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(valueToClone)) {\n return valueToClone.subarray();\n }\n if (isTypedArray(valueToClone)) {\n const result = new (Object.getPrototypeOf(valueToClone).constructor)(valueToClone.length);\n stack.set(valueToClone, result);\n for (let i = 0; i < valueToClone.length; i++) {\n result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n }\n return result;\n }\n if (valueToClone instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' && valueToClone instanceof SharedArrayBuffer)) {\n return valueToClone.slice(0);\n }\n if (valueToClone instanceof DataView) {\n const result = new DataView(valueToClone.buffer.slice(0), valueToClone.byteOffset, valueToClone.byteLength);\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof File !== 'undefined' && valueToClone instanceof File) {\n const result = new File([valueToClone], valueToClone.name, {\n type: valueToClone.type,\n });\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof Blob !== 'undefined' && valueToClone instanceof Blob) {\n const result = new Blob([valueToClone], { type: valueToClone.type });\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Error) {\n const result = new valueToClone.constructor();\n stack.set(valueToClone, result);\n result.message = valueToClone.message;\n result.name = valueToClone.name;\n result.stack = valueToClone.stack;\n result.cause = valueToClone.cause;\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Boolean) {\n const result = new Boolean(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof Number) {\n const result = new Number(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (valueToClone instanceof String) {\n const result = new String(valueToClone.valueOf());\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n if (typeof valueToClone === 'object' && isCloneableObject(valueToClone)) {\n const result = Object.create(Object.getPrototypeOf(valueToClone));\n stack.set(valueToClone, result);\n copyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n return result;\n }\n return valueToClone;\n}\nfunction copyProperties(target, source, objectToClone = target, stack, cloneValue) {\n const keys = [...Object.keys(source), ...getSymbols(source)];\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const descriptor = Object.getOwnPropertyDescriptor(target, key);\n if (descriptor == null || descriptor.writable) {\n target[key] = cloneDeepWithImpl(source[key], key, objectToClone, stack, cloneValue);\n }\n }\n}\nfunction isCloneableObject(object) {\n switch (getTag(object)) {\n case argumentsTag:\n case arrayTag:\n case arrayBufferTag:\n case dataViewTag:\n case booleanTag:\n case dateTag:\n case float32ArrayTag:\n case float64ArrayTag:\n case int8ArrayTag:\n case int16ArrayTag:\n case int32ArrayTag:\n case mapTag:\n case numberTag:\n case objectTag:\n case regexpTag:\n case setTag:\n case stringTag:\n case symbolTag:\n case uint8ArrayTag:\n case uint8ClampedArrayTag:\n case uint16ArrayTag:\n case uint32ArrayTag: {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\nexport { cloneDeepWith, cloneDeepWithImpl, copyProperties };\n","import { cloneDeepWithImpl } from './cloneDeepWith.mjs';\n\nfunction cloneDeep(obj) {\n return cloneDeepWithImpl(obj, undefined, obj, new Map(), undefined);\n}\n\nexport { cloneDeep };\n","function isPlainObject(value) {\n if (!value || typeof value !== 'object') {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n const hasObjectPrototype = proto === null ||\n proto === Object.prototype ||\n Object.getPrototypeOf(proto) === null;\n if (!hasObjectPrototype) {\n return false;\n }\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\nexport { isPlainObject };\n","function isUnsafeProperty(key) {\n return key === '__proto__';\n}\n\nexport { isUnsafeProperty };\n","import { isUnsafeProperty } from '../_internal/isUnsafeProperty.mjs';\nimport { isPlainObject } from '../predicate/isPlainObject.mjs';\n\nfunction merge(target, source) {\n const sourceKeys = Object.keys(source);\n for (let i = 0; i < sourceKeys.length; i++) {\n const key = sourceKeys[i];\n if (isUnsafeProperty(key)) {\n continue;\n }\n const sourceValue = source[key];\n const targetValue = target[key];\n if (isMergeableValue(sourceValue) && isMergeableValue(targetValue)) {\n target[key] = merge(targetValue, sourceValue);\n }\n else if (Array.isArray(sourceValue)) {\n target[key] = merge([], sourceValue);\n }\n else if (isPlainObject(sourceValue)) {\n target[key] = merge({}, sourceValue);\n }\n else if (targetValue === undefined || sourceValue !== undefined) {\n target[key] = sourceValue;\n }\n }\n return target;\n}\nfunction isMergeableValue(value) {\n return isPlainObject(value) || Array.isArray(value);\n}\n\nexport { merge };\n","import type { AxiosResponse } from 'axios';\n\nimport type { ApiRequestOption } from '@/plugins/api/http';\n\nimport { sdk } from '@/core';\n\n/**\n * 生成请求id\n * @param config\n */\nexport const generateRequestIdUtil = (config: any) => {\n const { requestId, url, method, params, data } = config as ApiRequestOption;\n if (requestId) return requestId;\n\n return `${method}:${url}?${JSON.stringify(params)}&${JSON.stringify(data)}`;\n};\n\n/**\n * 取消请求\n * @param config 请求配置\n */\nexport const cancelRequestUtil = (config: any) => {\n const requestId = generateRequestIdUtil(config);\n\n const controller = sdk.api.controllers.get(requestId);\n if (!controller) return;\n\n controller.abort();\n sdk.api.controllers.delete(requestId);\n};\n\n/**\n * 下载文件\n * @param resp 响应数据\n */\nexport const downloadFileUtil = (resp: AxiosResponse) => {\n // 1. 从响应头中解析文件名\n const contentDisposition = resp.headers['content-disposition'];\n let filename = 'data.txt';\n\n if (contentDisposition) {\n // 使用正则匹配文件名(兼容带引号和不带引号的情况)\n const filenameMatch = contentDisposition.match(/filename=\"?(.+)\"?/);\n if (filenameMatch && filenameMatch[1]) {\n filename = filenameMatch[1];\n }\n }\n\n // 2. 创建 blob 对象\n const blob = new Blob([resp.data], { type: 'application/pdf' });\n\n // 3. 创建下载链接\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename; // Specify the file name\n document.body.appendChild(link);\n link.click();\n\n // 4. 释放 blob 对象\n window.URL.revokeObjectURL(url);\n document.body.removeChild(link);\n};\n","import type { FrameworkLifeCycles, ObjectType } from 'qiankun';\n\nimport type { LocaleProps, SdkResult, ThemeProps } from '@/types';\n\n/** qiankun 生命周期 钩子函数 */\nexport const lifeCyclesUtil: FrameworkLifeCycles<ObjectType> = {\n beforeLoad: [\n async (app) => {\n console.log('[LifeCycle] before load %c%s', 'color: green;', app.name);\n },\n ],\n beforeMount: [\n async (app) => {\n console.log('[LifeCycle] before mount %c%s', 'color: green;', app.name);\n },\n ],\n afterUnmount: [\n async (app) => {\n console.log('[LifeCycle] after unmount %c%s', 'color: green;', app.name);\n },\n ],\n};\n\n/**\n * 获取主题默认值\n * @param sdk sdk\n */\nexport const getDefaultThemeUtil = (sdk: SdkResult): ThemeProps => {\n // localStorage > sdk中主题 > 系统主题 > 默认\n\n // 1. localStorage\n const localTheme = sdk.storage.getTheme() as ThemeProps;\n if (localTheme) return localTheme;\n\n // 2. sdk中主题\n const sdkTheme = sdk.config?.theme;\n if (sdkTheme) return sdkTheme;\n\n // 3. 系统主题\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n if (media.matches) return media.matches ? 'dark' : 'light';\n\n // 4. 默认\n return 'light';\n};\n\n/**\n * 获取国际化默认值\n * @param sdk sdk\n */\nexport const getDefaultLocaleUtil = (sdk: SdkResult): LocaleProps => {\n // localStorage > sdk中国际化 > 浏览器语言 > 默认\n\n // 1. localStorage\n const localLocale = sdk.storage.getLocale() as LocaleProps;\n if (localLocale) return localLocale;\n\n // 2. sdk中国际化\n const sdkLocale = sdk.config?.locale;\n if (sdkLocale) return sdkLocale;\n\n // 3. 浏览器语言\n const browserLocale = navigator.language as LocaleProps;\n if (browserLocale) return browserLocale;\n\n // 4. 默认\n return 'zh-CN';\n};\n","import type { ObjectType, RegistrableApp } from 'qiankun';\n\nimport { createElement } from 'react';\nimport { Outlet, type RouteObject } from 'react-router-dom';\n\nimport { sdk } from '@/core';\n\ntype MicroAppsMap = Map<string, RegistrableApp<ObjectType>>;\n\n/**\n * 动态创建Icon\n * @param icon icon名称\n */\nexport const dynamicIcon = (icon: string) => {\n const antIcon: { [key: string]: any } = {}; // 防止类型报错\n return createElement(antIcon[icon]);\n};\n\n/**\n * 处理路由数据\n * @param routes 路由数据\n */\nexport const handleRoutesUtil = (routes: any[]) => {\n const microAppsMap: MicroAppsMap = new Map();\n const menuData = transformRoutesUtil(routes, microAppsMap);\n const microApps = [...microAppsMap.values()];\n return { microApps, menuData };\n};\n\n/**\n * 递归转换路由数据\n * @param routes 路由数据\n * @param microApps 微应用列表\n */\nexport const transformRoutesUtil = (\n routes: any[],\n microAppsMap: MicroAppsMap,\n) => {\n if (!routes || routes?.length === 0) return [];\n\n return routes.map((item) => {\n let element = null; // 组件\n\n const { locale, path, icon, component, routeAttr, children } = item;\n\n // 处理微应用路由\n if (routeAttr) {\n let newRouteAttr = {} as any;\n\n try {\n newRouteAttr = JSON.parse(routeAttr); // 解析微应用路由属性\n } catch (error) {\n console.error('Sdk: initData - Subapp routeAttr error: ', error);\n }\n\n const { name, rootId, ...rest } = newRouteAttr;\n\n // 微应用信息\n const microAppInfo = {\n ...rest,\n name,\n container: `#${rootId}`,\n props: { sdk },\n loader: (loading) => sdk.store.getState().setMicroAppLoading(loading),\n };\n\n // 添加微应用信息\n microAppsMap.set(name, microAppInfo);\n\n element = sdk.ui.renderComponent('Microapp', { name, rootId }); // 微应用挂载组件\n } else if (component === 'Outlet') {\n element = <Outlet />; // 路由出口组件\n } else {\n element = sdk.ui.renderComponent(component); // 普通组件\n }\n\n return {\n ...item,\n key: `${path}_${icon}_${locale}`, // 唯一key, 判断菜单是否折叠\n element,\n children: transformRoutesUtil(children, microAppsMap), // 转换子路由\n handle: {\n // 用户面包屑 https://reactrouter.com/6.30.2/hooks/use-matches\n crumb: (data = {}) => ({ ...item, ...data }),\n },\n };\n });\n};\n\n/**\n * 获取第一个页面的路径\n * @param routes 路由数据\n */\nexport const getFirstPagePathUtil = (routes: RouteObject[]) => {\n let firstPagePath = '/';\n\n if (!routes || routes.length === 0) return firstPagePath;\n\n firstPagePath = routes?.[0]?.path;\n\n if (routes?.[0]?.children && routes?.[0]?.children.length > 0) {\n firstPagePath = getFirstPagePathUtil(routes?.[0]?.children);\n }\n\n return firstPagePath;\n};\n","import { message } from 'antd';\nimport axios, {\n AxiosError,\n type AxiosInstance,\n type AxiosRequestConfig,\n type AxiosResponse,\n type CreateAxiosDefaults,\n type InternalAxiosRequestConfig,\n} from 'axios';\nimport { merge } from 'es-toolkit';\n\nimport { sdk } from '@/core';\nimport { cancelRequestUtil, generateRequestIdUtil } from '@/utils';\n\nexport interface ApiRequestOption extends AxiosRequestConfig {\n /** 请求唯一key(默认自动生成) */\n requestId?: string;\n /** 是否取消重复请求 */\n isCancelRequest?: boolean;\n /** 是否需要原始数据 */\n isOriginalData?: boolean;\n /** 是否显示错误信息 */\n isShowFailMsg?: boolean;\n}\n\n/** 请求类 */\nclass Http {\n instance: AxiosInstance;\n\n constructor(options: CreateAxiosDefaults = {}) {\n this.instance = axios.create(options); // 创建实例\n this.defaultRequestInterceptor(); // 添加默认请求拦截器\n this.defaultResponseInterceptor(); // 添加默认响应拦截器\n }\n\n /** 默认请求拦截器 */\n defaultRequestInterceptor() {\n this.instance.interceptors.request.use(\n function (config: InternalAxiosRequestConfig) {\n // @ts-ignore\n if (config?.isCancelRequest) {\n const requestId = generateRequestIdUtil(config); // 设置请求唯一标识\n cancelRequestUtil(config); // 取消重复请求\n const controller = new AbortController(); // 创建取消请求控制器\n sdk.api.controllers.set(requestId, controller); // 存储取消请求控制器\n\n config['requestId'] = requestId; // 记录请求id\n config.signal = controller.signal; // 取消请求标识\n }\n\n const token = sdk.storage.getToken();\n config.headers.lang = sdk.config.locale; // 添加语言到请求头\n config.headers.Authorization = token; // 添加token到请求头\n merge(config.headers, sdk.api.config.headers || {}); // 合并请求头\n return config;\n },\n function (error: AxiosError) {\n console.error(`Sdk: defaultRequestInterceptor - 请求错误`);\n return Promise.reject(error);\n },\n );\n }\n\n /** 默认响应拦截器 */\n defaultResponseInterceptor() {\n this.instance.interceptors.response.use(\n function (response: AxiosResponse) {\n const { data, config } = response;\n const { isOriginalData, isShowFailMsg, isCancelRequest } =\n config as ApiRequestOption;\n\n const { code, msg } = data;\n\n // 跟后端定义的成功标识 非0的都是失败\n if (code !== 0) {\n if (isShowFailMsg) message.error(msg);\n console.error(\n 'Sdk: defaultResponseInterceptor - Response error: ',\n config.url,\n msg,\n );\n\n if (code == 20041) sdk.app.pageToLogin(); // 登录过期,跳转登录页\n }\n\n if (isCancelRequest) sdk.api.controllers.delete(config['requestId']);\n\n return isOriginalData ? response : response.data;\n },\n function (error: AxiosError) {\n const { response, config } = error;\n const { isShowFailMsg } = config as ApiRequestOption;\n\n // 如果是取消请求,则不显示错误信息\n if (axios.isCancel(error)) return Promise.reject(error);\n\n if (response) {\n // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围\n const { status, data, statusText } = response as AxiosResponse;\n\n if (isShowFailMsg) message.error(data.msg || statusText);\n\n if (status == 401) sdk.app.pageToLogin(); // 登录过期,跳转登录页\n } else {\n // 请求已经成功发起,但没有收到响应\n if (isShowFailMsg)\n message.error('请求超时或服务器异常,请检查网络或联系管理员');\n\n console.error(\n 'Sdk: defaultResponseInterceptor - Request error:',\n config.url,\n error,\n );\n }\n\n return Promise.reject(error);\n },\n );\n }\n\n /** 获取实例 */\n getInstance() {\n return this.instance;\n }\n}\n\nexport default Http;\n","import type { RouteObject } from 'react-router-dom';\n\nimport { type AxiosInstance, type CreateAxiosDefaults } from 'axios';\nimport { merge } from 'es-toolkit';\n\nimport type { Plugin, UserInfo } from '@/types';\n\nimport Http, { type ApiRequestOption } from './http';\n\ninterface ApiOptions {\n /** Axios配置 */\n config?: CreateAxiosDefaults;\n\n /** 取消请求控制器 */\n controllers?: Map<string, AbortController>;\n\n /**\n * 自定义请求实例\n * - 替换 SDK 内置的请求实例\n * @example instance = axios.create(options)\n */\n instance?: AxiosInstance;\n\n /**\n * 获取用户信息\n * {@link UserInfo}\n * @example { code: 0, data: { user: {}, permissions: [], roles: [], settings: {} } }\n */\n getUserInfoApi?(): Promise<any>;\n /**\n * 获取路由数据\n * {@link RouteObject}\n * @example { code: 0, data: [{path: '/', name: '首页', component: 'Home'}] }\n */\n getRoutesApi?(): Promise<any>;\n /**\n * 登录接口\n * @example { code: 0, data: { token: 'xxxx' } }\n */\n loginApi?(params: any): Promise<any>;\n}\n\ninterface ApiResults extends Required<ApiOptions> {\n /**\n * 请求\n * @param url 请求地址\n * @param options 自定义配置项\n */\n request(url: string, options?: ApiRequestOption): Promise<any>;\n}\n\n/** 插件名称 */\nconst pluginName = 'api';\n\n/**\n * 请求插件\n * - 详情参考 {@link ApiOptions} {@link ApiResults}\n * - 内置了请求, 通过 sdk.api.request 发起请求\n * - 可通过外部传入 instance 自定义请求实例\n * - 预置了获取用户信息, 获取路由接口, 以便组件使用\n * @example sdk.api.request('/getTemp', { method: 'POST', ... })\n * @example sdk.api.request('/getTemp', { method: 'POST', isOriginalData: true }) // 返回原始数据\n * @example sdk.api.request('/getTemp', { method: 'POST', isShowFailMsg: false }) // 不显示错误信息\n * @example sdk.api.request('/getTemp', { method: 'POST', isCancelRequest: false }) // 不自动取消重复请求\n */\nconst SdkApiPlugin: Plugin<'api'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // Axios 配置\n const axiosConfig = {\n baseURL: '/',\n timeout: 0,\n ...options.config,\n } satisfies ApiOptions['config'];\n\n // 创建 Axios 实例\n const instance = options?.instance || new Http(axiosConfig).getInstance();\n\n // 默认插件配置\n const defaultOptions = {\n config: axiosConfig,\n controllers: new Map(),\n\n instance: null,\n\n request: (url, options = {}) => {\n return instance.request({\n url,\n isOriginalData: false,\n isShowFailMsg: true,\n isCancelRequest: true,\n ...options,\n });\n },\n\n getUserInfoApi: () => sdk.api.request('/getUserInfo', { method: 'GET' }),\n getRoutesApi: () => sdk.api.request('/routes', { method: 'GET' }),\n loginApi: () => sdk.api.request('/login', { method: 'POST' }),\n } satisfies ApiResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkApiPlugin };\nexport type { ApiOptions, ApiResults };\n","import type { MenuDataItem } from '@ant-design/pro-layout';\nimport type { MicroApp, ObjectType, RegistrableApp } from 'qiankun';\nimport type { RouteObject } from 'react-router-dom';\n\nimport { merge } from 'es-toolkit';\n\nimport type { Plugin, UserInfo } from '@/types';\n\ninterface AppOptions {\n /** 菜单数据 */\n menuData?: MenuDataItem[];\n /** 所有路由信息 */\n allRoutes?: RouteObject[];\n\n /** 微应用信息 */\n microApps?: RegistrableApp<ObjectType>[];\n /** 微应用实例 */\n microAppsInstance?: Map<string, MicroApp>;\n\n /** 用户信息 */\n user?: UserInfo['user'];\n /** 用户权限 */\n permissions?: UserInfo['permissions'];\n /** 用户角色 */\n roles?: UserInfo['roles'];\n /** 用户设置 */\n settings?: UserInfo['settings'];\n}\n\ninterface AppResults extends Required<AppOptions> {\n /**\n * 初始化数据\n * - sdk.config.qiankunMode = 'load' 时, 登录时用\n */\n initData(): void;\n /**\n * 清空数据\n * - sdk.config.qiankunMode = 'load' 时, 登出时用\n */\n clearData(): void;\n /**\n * 跳转登录页\n */\n pageToLogin(): void;\n /**\n * 获取重定向路径\n */\n getRedirectPath(): string;\n}\n\n/** 插件名称 */\nconst pluginName = 'app';\n\n/**\n * 项目信息\n * - 详情参考 {@link AppOptions} {@link AppResults}\n * - 菜单信息 sdk.app.menuData\n * - 路由信息 sdk.app.allRoutes\n * - 微应用信息 sdk.app.microApps\n * - 用户信息 sdk.app.user\n * - 用户权限 sdk.app.permissions\n * - 用户角色 sdk.app.roles\n * - 用户设置 sdk.app.settings\n */\nconst SdkAppPlugin: Plugin<'app'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n menuData: [],\n allRoutes: [],\n\n microApps: [],\n microAppsInstance: new Map(),\n\n user: null,\n permissions: [],\n roles: [],\n settings: {},\n\n initData: null,\n clearData: () => {\n sdk.app.menuData = [];\n sdk.app.allRoutes = sdk.app.allRoutes.filter((_) => _.path !== '/');\n\n sdk.app.microApps = [];\n sdk.app.microAppsInstance.forEach((_) => _.unmount());\n sdk.app.microAppsInstance.clear();\n\n sdk.app.user = null;\n sdk.app.permissions = [];\n sdk.app.roles = [];\n sdk.app.settings = {};\n },\n pageToLogin: () => {\n // 清除 Token\n sdk.storage.clearToken();\n\n // 获取当前页路由\n const pathname = window.location.pathname || '/';\n const loginPath = sdk.config.loginPath;\n const path =\n pathname === loginPath\n ? loginPath\n : `${loginPath}?redirect=${encodeURIComponent(pathname)}`;\n\n // 跳转登录页\n if (sdk.config.qiankunMode === 'router') {\n window.location.replace(path); // 这里必须刷新一下页面, 否则qiankun实例不会销毁, 登录后会直接mount微应用, 而不是bootstrap微应用\n } else {\n sdk.app.clearData(); // 手动清空数据\n sdk.client.navigate(path, { replace: true }); // 使用客户端路由跳转\n }\n },\n getRedirectPath: () => {\n // 1. 优先使用指定值\n const defaultPath = sdk.config.defaultPath;\n if (defaultPath) return defaultPath;\n\n // 2. 其次使用重定向的值\n const param = new URLSearchParams(window.location.search);\n const redirect = decodeURIComponent(param.get('redirect') || '');\n if (redirect) return redirect;\n\n // 3. 最后使用菜单中第一项\n return '/';\n },\n } satisfies AppResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkAppPlugin };\nexport type { AppOptions, AppResults };\n","import type { Location, NavigateFunction, UIMatch } from 'react-router-dom';\n\nimport { merge } from 'es-toolkit';\n\nimport type { Plugin } from '@/types';\n\ninterface ClientOptions {}\n\ninterface ClientResults extends Required<ClientOptions> {\n /** 主应用 location */\n location: Location;\n /** 路由匹配(用于面包屑) */\n matches: UIMatch[];\n /** 主应用navigate(解决微应用跳转问题) */\n navigate: NavigateFunction;\n}\n\n/** 插件名称 */\nconst pluginName = 'client';\n\n/**\n * 全局路由信息\n * - 详情参考 {@link ClientOptions} {@link ClientResults}\n * - 路由信息 sdk.client.location\n * - 路由跳转 sdk.client.navigate\n * - 面包屑信息 sdk.client.matches\n */\nconst SdkClientPlugin: Plugin<'client'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n location: null,\n navigate: null,\n matches: null,\n } satisfies ClientResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkClientPlugin };\nexport type { ClientOptions, ClientResults };\n","import type { ProLayoutProps } from '@ant-design/pro-layout';\nimport type { ConfigProviderProps } from 'antd';\nimport type { RouteObject } from 'react-router-dom';\n\nimport { merge } from 'es-toolkit';\n\nimport type { LocaleProps, Plugin, ThemeProps } from '@/types';\n\ninterface ConfigOptions {\n /** 环境变量(主应用共享给微应用变量) */\n env?: Record<string, any>;\n\n /** 主题 */\n theme?: ThemeProps;\n /** 语言 */\n locale?: LocaleProps;\n\n /**\n * Qiankun模式(切换模式后请重新打开页面)\n * - 'router': 基于路由模式\n * - 登录时,刷新页面,会自动调用 getUserInfoApi、getRoutesApi 获取数据\n * - 拿到 routes 数据之后,需要 registerMicroApps 注册微应用 和 start 启动微应用\n * - 系统退出时,刷新页面,自动销毁 qiankun 声明周期和缓存的数据\n * - 系统登录和系统退出仅有一次刷新页面即可,为了销毁 qiankun 的声明周期,但数据需要手动加载或者清除\n * - 'load': 手动加载模式\n * - 登录时,不需刷新页面, 但需要手动调用 getUserInfoApi、getRoutesApi 获取数据\n * - 拿到 routes 数据之后,在 Microapp 组件中使用 loadMicroApp 手动加载微应用\n * - 系统退出时,不刷新页面,但需要手动销毁每个微应用,并清除缓存数据\n */\n qiankunMode?: 'router' | 'load';\n\n /** 登录页路由 */\n loginPath?: string;\n /**\n * 登录后跳转的路由\n * - 优先使用指定值\n * - 其次使用重定向的值\n * - 最后使用菜单中第一项\n */\n defaultPath?: string;\n /**\n * 自定义路由信息\n * - 目前只支持最外层路由自定义\n * - 会合并到 sdk.app.allRoutes 中\n */\n customRoutes?: RouteObject[];\n\n /** Antd 配置 */\n antdConfig?: ConfigProviderProps;\n /** ProLayout 配置 */\n proLayoutConfig?: ProLayoutProps;\n}\n\ninterface ConfigResults extends Required<ConfigOptions> {}\n\n/** 插件名称 */\nconst pluginName = 'config';\n\n/**\n * Sdk 配置信息\n * - 详情参考 {@link ConfigOptions} {@link ConfigResults}\n * - 配置 env 环境变量\n * - 配置 默认主题、语言\n * - 配置 Qiankun 模式\n * - 配置 默认登录路径、跳转路径、自定义路由\n * - 配置 Antd 配置、ProLayout 配置\n */\nconst SdkConfigPlugin: Plugin<'config'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n env: {},\n\n qiankunMode: 'router',\n\n theme: null,\n locale: null,\n\n loginPath: '/login',\n defaultPath: '',\n customRoutes: [],\n\n antdConfig: {},\n proLayoutConfig: {\n title: 'Demo',\n },\n } satisfies ConfigResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkConfigPlugin };\nexport type { ConfigOptions, ConfigResults };\n","import { merge } from 'es-toolkit';\nimport intl from 'react-intl-universal';\n\nimport type { Plugin } from '@/types';\n\ninterface I18nOptions {\n /**\n * React Intl Universal 实例\n * - 不要解构使用, const { get } = useIntl() 会报错\n * - 如果项目不使用 React Compiler, 可以直接使用 sdk.i18n.intl\n * @example const intl = useIntl(); intl.get(key).d(defaultValue)\n */\n intl?: typeof intl;\n /**\n * 自定义语言包\n * @example\n * {\n * 'zh-CN': {\n * test: '测试国际化'\n * },\n * 'en-US': {\n * test: 'Test Intl'\n * }\n * }\n */\n intlConfig?: Record<string, any>;\n /**\n * 加载语言包\n * @param locale 语言包名\n * @example\n * import enUS from 'antd/es/locale/en_US';\n * import zhCN from 'antd/es/locale/zh_CN';\n * import dayjs from 'dayjs';\n * import 'dayjs/locale/en';\n * import 'dayjs/locale/zh';\n *\n * const loadLocale = (locale: string) => {\n * switch (locale) {\n * case 'en-US':\n * dayjs.locale('en');\n * return enUS;\n * case 'zh-CN':\n * dayjs.locale('zh');\n * return zhCN;\n * default:\n * return undefined;\n * }\n * }\n */\n loadLocale?(locale: string): any;\n}\n\ninterface I18nResults extends Required<I18nOptions> {}\n\n/** 插件名称 */\nconst pluginName = 'i18n';\n\n/**\n * 多语言\n * - 详情参考 {@link I18nOptions} {@link I18nResults}\n * - 集成 React Intl Universal 和 Antd 国际化\n * - 需要从外部引入语言包, 详见 intlConfig 和 loadLocale 配置项\n */\nconst SdkI18nPlugin: Plugin<'i18n'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n intl: intl,\n intlConfig: {},\n loadLocale: (locale: string) => undefined,\n } satisfies I18nResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkI18nPlugin };\nexport type { I18nOptions, I18nResults };\n","import { merge } from 'es-toolkit';\n\nimport type { LocaleProps, Plugin, ThemeProps } from '@/types';\n\ninterface StorageOptions {\n /** 语言存储名称 */\n localeKey?: string;\n /** 主题存储名称 */\n themeKey?: string;\n /** Token存储名称 */\n tokenKey?: string;\n}\n\ninterface StorageResults extends Required<StorageOptions> {\n /** 获取当前语言 */\n getLocale(): LocaleProps;\n /** 设置/切换语言 */\n setLocale(locale: LocaleProps): void;\n /** 清空语言 */\n clearLocale(): void;\n\n /** 获取当前主题 */\n getTheme(): ThemeProps;\n /** 设置/切换主题 */\n setTheme(theme: ThemeProps): void;\n /** 清空主题 */\n clearTheme(): void;\n\n /** 获取当前 Token */\n getToken(): string;\n /** 设置 Token */\n setToken(token: string): void;\n /** 清空 Token */\n clearToken(): void;\n}\n\n/** 插件名称 */\nconst pluginName = 'storage';\n\n/**\n * 本地缓存\n * - 详情参考 {@link StorageOptions} {@link StorageResults}\n * - 配置 localStorage 变量名称\n * - 提供 语言、主题、Token 的 get、change、clear 方法\n * @example sdk.storage.getToken() // 获取 Token\n * @example sdk.storage.setTheme('dark') // 设置主题\n * @example sdk.storage.clearLocale() // 清空语言\n */\nconst SdkStoragePlugin: Plugin<'storage'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n localeKey: 'locale',\n themeKey: 'theme',\n tokenKey: 'token',\n\n getLocale: () => {\n return localStorage.getItem(sdk.storage.localeKey);\n },\n setLocale: (locale: string) => {\n localStorage.setItem(sdk.storage.localeKey, locale);\n },\n clearLocale: () => {\n localStorage.removeItem(sdk.storage.localeKey);\n },\n getTheme: () => {\n return localStorage.getItem(sdk.storage.themeKey);\n },\n setTheme: (theme: string) => {\n localStorage.setItem(sdk.storage.themeKey, theme);\n },\n clearTheme: () => {\n localStorage.removeItem(sdk.storage.themeKey);\n },\n getToken: () => {\n return localStorage.getItem(sdk.storage.tokenKey);\n },\n setToken: (token: string) => {\n localStorage.setItem(sdk.storage.tokenKey, token);\n },\n clearToken: () => {\n localStorage.removeItem(sdk.storage.tokenKey);\n },\n } satisfies StorageResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkStoragePlugin };\nexport type { StorageOptions, StorageResults };\n","import type { StateCreator } from 'zustand';\n\nimport type { UserInfo } from '@/types';\n\nimport { sdk } from '@/core';\n\ninterface InitStateStoreProps {\n /** 初始状态 */\n initState: UserInfo;\n /** 设置初始状态 */\n setInitState(initState: UserInfo): void;\n}\n\n/** 创建初始状态切片 */\nconst createInitStateSlice: StateCreator<InitStateStoreProps> = (set, get) => ({\n initState: {},\n setInitState: (initState) => {\n set(() => ({ initState }));\n sdk.app = { ...sdk.app, ...initState };\n },\n});\n\nexport { createInitStateSlice };\nexport type { InitStateStoreProps };\n","import type { StateCreator } from 'zustand';\n\nimport intl from 'react-intl-universal';\n\nimport type { LocaleProps } from '@/types';\n\nimport { sdk } from '@/core';\n\ninterface LocaleStoreProps {\n /** 语言 */\n locale: LocaleProps;\n /** 设置语言 */\n setLocale(locale: LocaleProps): void;\n}\n\n/** 创建语言切片 */\nconst createLocaleSlice: StateCreator<LocaleStoreProps> = (set, get) => ({\n locale: null,\n\n setLocale: (locale) => {\n set(() => ({ locale })); // 自动合并其他\n\n // 记录值\n sdk.config.locale = locale;\n sdk.storage.setLocale(locale);\n\n // 设置作用域\n document.documentElement.setAttribute('lang', locale);\n\n // 设置 React Intl Universal 语言包\n const intlConfig = sdk.i18n.intlConfig;\n intl.init({ currentLocale: locale, locales: intlConfig });\n\n // 加载 Antd 语言包\n try {\n const localeData = sdk.i18n.loadLocale?.(locale) || undefined;\n sdk.config.antdConfig.locale = localeData;\n } catch (e) {\n console.error('Sdk: createLocaleSlice - sdk.i18n.loadLocale error:', e);\n }\n },\n});\n\nexport { createLocaleSlice };\nexport type { LocaleStoreProps };\n","import type { StateCreator } from 'zustand';\n\ninterface MicroAppStateStoreProps {\n /** 微应用加载状态 */\n microAppLoading: boolean;\n /** 设置微应用加载状态 */\n setMicroAppLoading(state: boolean): void;\n}\n\n/** 创建微应用状态切片 */\nconst createMicroAppStateSlice: StateCreator<MicroAppStateStoreProps> = (\n set,\n get,\n) => ({\n microAppLoading: false,\n setMicroAppLoading: (microAppLoading) => set(() => ({ microAppLoading })),\n});\n\nexport { createMicroAppStateSlice };\nexport type { MicroAppStateStoreProps };\n","import type { StateCreator } from 'zustand';\n\nimport { theme as antdTheme } from 'antd';\nimport { merge } from 'es-toolkit';\n\nimport type { ThemeProps } from '@/types';\n\nimport { sdk } from '@/core';\n\nconst { defaultAlgorithm, darkAlgorithm } = antdTheme;\ninterface ThemeStoreProps {\n /** 主题 */\n theme: ThemeProps;\n /** 设置主题 */\n setTheme(theme: ThemeProps): void;\n}\n\n/** 创建主题切片 */\nconst createThemeSlice: StateCreator<ThemeStoreProps> = (set, get) => ({\n theme: null,\n\n setTheme: (theme) => {\n set(() => ({ theme })); // 自动合并其他\n\n // 记录值\n sdk.config.theme = theme;\n sdk.storage.setTheme(theme);\n\n // 设置作用域\n document.documentElement.setAttribute('theme', theme);\n\n // 设置Antd主题算法\n const algorithm = theme === 'light' ? defaultAlgorithm : darkAlgorithm;\n merge(sdk.config.antdConfig, { theme: { algorithm } });\n },\n});\n\nexport { createThemeSlice };\nexport type { ThemeStoreProps };\n","import { createStore } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport type { Plugin } from '@/types';\n\nimport {\n createInitStateSlice,\n type InitStateStoreProps,\n} from './createInitState';\nimport { createLocaleSlice, type LocaleStoreProps } from './createLocale';\nimport {\n createMicroAppStateSlice,\n type MicroAppStateStoreProps,\n} from './createMicroAppLoading';\nimport { createThemeSlice, type ThemeStoreProps } from './createTheme';\n\ntype StoreOptions = InitStateStoreProps &\n LocaleStoreProps &\n MicroAppStateStoreProps &\n ThemeStoreProps;\n\ntype StoreResults = typeof globalStore;\n\n/**\n * 创建 Store\n * - 这里单独声明变量, 主要是为了使用返回类型 StoreResults 🤔\n */\nconst globalStore = createStore<StoreOptions>()(\n subscribeWithSelector((...a) => ({\n ...createInitStateSlice(...a),\n ...createLocaleSlice(...a),\n ...createMicroAppStateSlice(...a),\n ...createThemeSlice(...a),\n })),\n);\n\n/** 插件名称 */\nconst pluginName = 'store';\n\n/**\n * 全局状态管理\n * - 详情参考 {@link StoreOptions} {@link StoreResults}\n * - 此插件不会合并传入属性\n * @example const setTheme = useStore(sdk.store, (state) => state.setTheme)\n * @example const { theme, setTheme } = useStore(sdk.store, useShallow((state) => { theme: state.theme, setTheme: state.setTheme }))\n * @example const [theme, setTheme] = useStore(sdk.store, useShallow((state) => [state.theme, state.setTheme]))\n * @example sdk.store?.getState()?.setTheme('light')\n * @example sdk.store.subscribe((state) => state.theme, (theme) => { console.log('theme', theme) }, { fireImmediately: true }) // fireImmediately 立即变更\n */\nconst SdkStorePlugin: Plugin<'store'> = {\n name: pluginName,\n install(sdk, options = {}) {\n sdk[pluginName] = globalStore satisfies StoreResults;\n },\n};\n\nexport { SdkStorePlugin };\nexport type { StoreOptions, StoreResults };\n","import ProLayout from '@ant-design/pro-layout';\nimport { Suspense } from 'react';\nimport { Outlet, useLocation, useMatches, useNavigate } from 'react-router-dom';\n\nimport { sdk } from '@/core';\n\n/** 布局组件 */\nconst Layout: React.FC = () => {\n const navigate = useNavigate();\n const location = useLocation();\n const matches = useMatches();\n\n const currentMatch = matches[matches.length - 1]?.handle?.crumb() || {};\n const noLayout = JSON.parse(currentMatch?.routeAttr || '{}')?.noLayout;\n\n /** 菜单点击事件 */\n const handleMenuClick = (item: any) => {\n navigate(item.path);\n };\n\n /** 菜单头点击事件 */\n const handleMenuHeaderClick = () => {\n navigate('/');\n };\n\n /** 页面切换事件 */\n const handlePageChange = (location: Location) => {\n // 是否有用户信息\n if (!sdk.app.user || Object.keys(sdk.app.user).length === 0)\n return sdk.app.pageToLogin();\n };\n\n return (\n <ProLayout\n location={location}\n menuItemRender={(item, dom) => (\n <div onClick={() => handleMenuClick(item)}>{dom}</div>\n )}\n onMenuHeaderClick={handleMenuHeaderClick}\n onPageChange={handlePageChange}\n {...(noLayout && {\n headerRender: false,\n footerRender: false,\n menuRender: false,\n })}\n menu={{\n request: async () => sdk.app.menuData || [],\n ...sdk.config.proLayoutConfig.menu,\n }}\n {...sdk.config.proLayoutConfig}\n >\n <Suspense\n fallback={sdk.ui.renderComponent('Loading', { isSuspense: true })}\n >\n <Outlet />\n </Suspense>\n </ProLayout>\n );\n};\n\nexport default Layout;\n","import { theme } from 'antd';\n\nconst { useToken } = theme;\n\ninterface Props {\n /** 是否是初始化数据 */\n isInitData?: boolean;\n /** 是否是懒加载 */\n isSuspense?: boolean;\n /** 是否是微应用加载 */\n isMicroApp?: boolean;\n}\n\n/** 加载中组件 */\nconst Loading: React.FC = ({\n isInitData = false,\n isSuspense = false,\n isMicroApp = false,\n}: Props) => {\n const { token } = useToken();\n return (\n <div\n style={\n isInitData\n ? {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: token.colorBgContainer,\n color: token.colorText,\n }\n : {}\n }\n >\n Loading...\n </div>\n );\n};\n\nexport default Loading;\n","import { Button, Flex, Form, type FormProps, Input, theme } from 'antd';\nimport { useState } from 'react';\n\nimport { sdk } from '@/core';\n\nconst { useToken } = theme;\n\n/** 登录组件 */\nconst Login: React.FC = () => {\n const { token: themeToken } = useToken();\n\n const [loading, setLoading] = useState(false);\n\n /** 表单提交成功事件 */\n const handleFinish: FormProps['onFinish'] = async (values) => {\n try {\n setLoading(() => true);\n const resp = await sdk.api.loginApi(values);\n setLoading(() => false);\n\n const token = resp?.data?.token || '';\n if (!token) return;\n\n sdk.storage.setToken(token);\n const defaultPath = sdk.app.getRedirectPath();\n\n if (sdk.config.qiankunMode === 'load') {\n sdk.client.navigate(defaultPath, { replace: true });\n sdk.app.initData?.();\n } else {\n window.location.replace(defaultPath);\n }\n } catch (e) {\n console.log('Sdk: Login - handleFinish: ', e);\n setLoading(() => false);\n }\n };\n\n return (\n <Flex\n style={{\n width: '100%',\n height: '100%',\n background: themeToken.colorBgContainer,\n }}\n justify={'center'}\n align={'center'}\n >\n <Form\n labelCol={{ span: 8 }}\n labelAlign='left'\n wrapperCol={{ span: 16 }}\n style={{ maxWidth: 600 }}\n initialValues={{ remember: true }}\n onFinish={handleFinish}\n autoComplete='off'\n >\n <Form.Item\n label='用户名'\n name='username'\n rules={[{ required: true, message: '请输入用户名!' }]}\n >\n <Input />\n </Form.Item>\n\n <Form.Item\n label='密码'\n name='password'\n rules={[{ required: true, message: '请输入密码!' }]}\n >\n <Input.Password />\n </Form.Item>\n\n <Form.Item noStyle>\n <Button block type='primary' htmlType='submit' loading={loading}>\n 登录\n </Button>\n </Form.Item>\n </Form>\n </Flex>\n );\n};\n\nexport default Login;\n","import { ConfigProvider, Spin } from 'antd';\nimport { cloneDeep } from 'es-toolkit/object';\nimport { registerMicroApps, start } from 'qiankun';\nimport React, { Suspense, useEffect, useMemo, useState } from 'react';\nimport {\n createBrowserRouter,\n Navigate,\n type RouteObject,\n RouterProvider,\n useLocation,\n useMatches,\n useNavigate,\n} from 'react-router-dom';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport { sdk } from '@/core';\nimport {\n getDefaultLocaleUtil,\n getDefaultThemeUtil,\n getFirstPagePathUtil,\n handleRoutesUtil,\n lifeCyclesUtil,\n} from '@/utils';\n\n/** 记录路由信息 */\nconst WithClient: React.FC<any> = ({ children }) => {\n const location = useLocation();\n const matches = useMatches();\n const navigate = useNavigate();\n\n sdk.client.location = location;\n sdk.client.matches = matches;\n sdk.client.navigate = navigate;\n\n return children;\n};\n\n/** 主应用根组件 */\nconst Mainapp: React.FC = () => {\n const loginPath = sdk.config.loginPath; // 登录路径\n const customRoutes = sdk.config.customRoutes; // 自定义路由\n const isRouterQiankunMode = sdk.config.qiankunMode === 'router'; // 是否使用 qiankun router 模式\n\n const Loading = (props) => sdk.ui.renderComponent('Loading', props); // 加载组件\n const Layout = sdk.ui.renderComponent('Layout'); // 布局组件\n const Login = sdk.ui.renderComponent('Login'); // 登录组件\n const NotFound = sdk.ui.renderComponent('NotFound'); // 404组件\n\n /** 默认路由(最外层路由都要被 WithClient 包裹, 可以实现不刷新页面跳转) */\n const defaultRoutes: RouteObject[] = [\n { path: loginPath, element: Login },\n { path: '*', element: NotFound },\n ...customRoutes,\n ].map((_) => ({ ..._, element: <WithClient>{_.element}</WithClient> }));\n\n const [loading, setLoading] = useState(false); // 加载状态(获取初始化数据时)\n const [routes, setRoutes] = useState<RouteObject[]>(defaultRoutes); // 路由\n\n const [locale, setLocale, theme, setTheme] = useStore(\n sdk.store,\n useShallow((state) => [\n state.locale,\n state.setLocale,\n state.theme,\n state.setTheme,\n ]),\n );\n\n // antd 配置\n const antdConfig = useMemo(() => {\n return cloneDeep(sdk.config.antdConfig); // 改变引用地址(触发变更)\n }, [locale, theme]);\n\n /** 设置主题和国际化 */\n const setThemeLocale = (apiTheme?: any, apiLocale?: any) => {\n setTheme(apiTheme || getDefaultThemeUtil(sdk));\n setLocale(apiLocale || getDefaultLocaleUtil(sdk));\n };\n /** 获取初始化数据 */\n const initData = async () => {\n try {\n setLoading(() => true);\n const [{ data: userData = {} }, { data: routerData = [] }] =\n await Promise.all([sdk.api.getUserInfoApi(), sdk.api.getRoutesApi()]);\n setLoading(() => false);\n\n // 设置主题和语言(每个用户配置的主题和语言)\n const { theme, locale } = userData?.settings || {};\n setThemeLocale(theme, locale);\n\n // 处理路由数据\n const { microApps = [], menuData = [] } = handleRoutesUtil(routerData);\n\n // 使用 qiankun router 模式\n if (isRouterQiankunMode) {\n registerMicroApps(microApps, lifeCyclesUtil); // 注册微应用\n start(); // 启动 qiankun\n }\n\n // 获取首页路径\n const firstPath = getFirstPagePathUtil(menuData);\n\n // 合并所有路由\n const allRoutes: RouteObject[] = [\n ...defaultRoutes,\n {\n path: '/',\n element: <Navigate to={firstPath} replace />,\n },\n {\n path: '/',\n element: <WithClient>{Layout}</WithClient>,\n children: menuData,\n errorElement: NotFound,\n },\n ];\n\n setRoutes(allRoutes); // 重新赋值,触发路由更新\n\n sdk.app = {\n ...sdk.app,\n ...userData,\n allRoutes,\n microApps,\n menuData,\n };\n } catch (error) {\n console.error(error);\n setLoading(() => false);\n }\n };\n\n useEffect(() => {\n sdk.app.initData = initData;\n sdk.app.allRoutes = defaultRoutes;\n\n const paths = sdk.config.customRoutes?.map((item) => item.path);\n const pathName = window.location.pathname;\n const noNeedAuth = [loginPath, ...paths]?.includes(pathName);\n\n // 如果时登录页面\n if (noNeedAuth) setThemeLocale();\n else initData();\n }, []);\n\n return (\n <ConfigProvider {...antdConfig}>\n <Suspense fallback={Loading({ isSuspense: true })}>\n {loading ? (\n Loading({ isInitData: true })\n ) : (\n <RouterProvider\n router={createBrowserRouter(routes, { basename: '/' })}\n future={{ v7_startTransition: false }}\n />\n )}\n </Suspense>\n </ConfigProvider>\n );\n};\n\nexport default Mainapp;\n","import { loadMicroApp } from 'qiankun';\nimport React, { memo, useEffect } from 'react';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport { sdk } from '@/core';\nimport { lifeCyclesUtil } from '@/utils';\n\ninterface Props {\n /** 微应用名称 */\n name: string;\n /** 微应用挂载节点 */\n rootId: string;\n}\n\n/** 微应用挂载组件 */\nconst Microapp: React.FC<Props> = ({ name, rootId }) => {\n const [microAppLoading, setMicroAppLoading] = useStore(\n sdk.store,\n useShallow((state) => [state.microAppLoading, state.setMicroAppLoading]),\n );\n\n useEffect(() => {\n if (!name || sdk.config.qiankunMode !== 'load') return;\n\n let instance = sdk.app.microAppsInstance.get(name);\n if (instance) {\n instance?.mount();\n } else {\n const microApp = sdk.app.microApps.find((_) => _.name === name);\n if (!microApp) return;\n\n setMicroAppLoading(true);\n instance = loadMicroApp(microApp, {}, lifeCyclesUtil);\n instance?.mountPromise?.finally(() => {\n setMicroAppLoading(false);\n });\n sdk.app.microAppsInstance.set(name, instance);\n }\n\n return () => {\n instance?.unmount();\n };\n }, [name]);\n\n return (\n <>\n {microAppLoading &&\n sdk.ui.renderComponent('Loading', { isMicroApp: true })}\n <main id={rootId}></main>\n </>\n );\n};\n\nexport default memo(Microapp);\n","/** 无权限组件 */\nconst NoPermission: React.FC = () => {\n return <div>无权限</div>;\n};\n\nexport default NoPermission;\n","import { theme } from 'antd';\n\nconst { useToken } = theme;\n\n/** 404组件 */\nconst NotFound: React.FC = () => {\n const { token } = useToken();\n\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: token.colorBgContainer,\n }}\n >\n 找不到页面\n </div>\n );\n};\n\nexport default NotFound;\n","import { merge } from 'es-toolkit';\nimport { type ComponentType, createElement, type ReactElement } from 'react';\n\nimport type { Plugin } from '@/types';\n\nimport Layout from './layout';\nimport Loading from './loading';\nimport Login from './login';\nimport Mainapp from './mainapp';\nimport Microapp from './microapp';\nimport NoPermission from './noPermission';\nimport NotFound from './notFound';\n\ninterface UIOptions {\n /** 组件 */\n [key: string]:\n | ComponentType\n | ((name: string) => ComponentType)\n | ((component: ComponentType, name?: string) => void);\n}\n\ninterface UIResults extends Required<UIOptions> {\n /**\n * 设置组件\n * @param component 组件\n * @param name 组件名称\n */\n setComponent(component: ComponentType, name?: string): void;\n /**\n * 获取组件\n * @param name 组件名称\n */\n getComponent(name: string): ComponentType;\n /**\n * 渲染组件\n * @param name 组件名称\n */\n renderComponent(name: string, props?: any): ReactElement;\n}\n\n/** 插件名称 */\nconst pluginName = 'ui';\n\n/**\n * 可复用组件\n * - 详情参考 {@link UIOptions} {@link UIResults}\n * - 内置了 Layout、Loading、Login、Mainapp、Microapp、NotFound 等组件, 可传入覆盖\n * - 组件共享\n * - 在主应用中, 可通过 sdk.use(SdkUIPlugin, { MyComponent }) 传入组件\n * - 在微应用中, 可通过 sdk.ui.renderComponent('MyComponent') 使用组件\n */\nconst SdkUIPlugin: Plugin<'ui'> = {\n name: pluginName,\n install(sdk, options = {}) {\n // 默认插件配置\n const defaultOptions = {\n Layout,\n Loading,\n Login,\n Mainapp,\n Microapp,\n NotFound,\n NoPermission,\n\n setComponent: (component, name) => {\n if (!component) {\n console.error('Sdk: SdkUIPlugin - component cannot be empty');\n return;\n }\n\n const componentName = name || component.displayName || component.name;\n if (!componentName) {\n console.error('Sdk: SdkUIPlugin - Component name cannot be empty');\n return;\n }\n\n sdk.ui[componentName] = component;\n },\n getComponent: (name) => {\n if (!name) {\n console.error('Sdk: SdkUIPlugin - Component name cannot be empty');\n return null;\n } else {\n return sdk.ui[name] as ComponentType;\n }\n },\n renderComponent: (name, props = {}) => {\n const Component = sdk.ui.getComponent(name);\n if (!Component) {\n console.error(`Sdk: SdkUIPlugin - Component ${name} not found`);\n return null;\n } else {\n return createElement(Component, props);\n }\n },\n } satisfies UIResults;\n\n sdk[pluginName] = merge(defaultOptions, options);\n },\n};\n\nexport { SdkUIPlugin };\nexport type { UIOptions, UIResults };\n"],"x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zxiaosi/sdk",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "A micro frontend kit",
5
5
  "keywords": [
6
6
  "micro frontend",
@@ -41,8 +41,8 @@
41
41
  "@types/react": "^18.3.12",
42
42
  "@types/react-dom": "^18.3.1",
43
43
  "es-toolkit": "^1.43.0",
44
- "rolldown": "^1.0.0-beta.58",
45
- "rolldown-plugin-dts": "^0.20.0",
44
+ "rolldown": "^1.0.0-rc.1",
45
+ "rolldown-plugin-dts": "^0.21.5",
46
46
  "rollup-plugin-node-externals": "^8.1.2",
47
47
  "typescript": "^5.9.3"
48
48
  },