@go-wind/admin-react 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +74 -2
- package/dist/access/access-control.d.ts +39 -0
- package/dist/access/field-permission.d.ts +11 -0
- package/dist/access/index.d.ts +4 -0
- package/dist/access/use-access.d.ts +50 -0
- package/dist/admin-react.css +2 -0
- package/dist/admin-react.js +5432 -0
- package/dist/admin-react.js.map +1 -0
- package/dist/auth-gateway.d.ts +54 -0
- package/dist/components/Loading/index.d.ts +22 -0
- package/dist/env.d.ts +5 -0
- package/dist/hooks/useProTableScrollY.d.ts +22 -0
- package/dist/hooks/useTime.d.ts +6 -0
- package/dist/hooks/useTitle.d.ts +1 -0
- package/dist/hooks/useTokenRefresh.d.ts +26 -0
- package/dist/i18n/components/LocaleSwitcher/index.d.ts +1 -0
- package/dist/i18n/components/index.d.ts +1 -0
- package/dist/i18n/config/i18n.d.ts +18 -0
- package/dist/i18n/hooks/index.d.ts +2 -0
- package/dist/i18n/hooks/useI18n.d.ts +96 -0
- package/dist/i18n/hooks/useLocaleSync.d.ts +4 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/utils/detector.d.ts +26 -0
- package/dist/i18n/utils/formatter.d.ts +38 -0
- package/dist/i18n/utils/index.d.ts +3 -0
- package/dist/i18n/utils/sync.d.ts +27 -0
- package/dist/index.d.ts +34 -0
- package/dist/locales/en-US/index.d.ts +2 -0
- package/dist/locales/index.d.ts +10 -0
- package/dist/locales/zh-CN/index.d.ts +2 -0
- package/dist/nprogress-CwfUlis6.js +159 -0
- package/dist/nprogress-CwfUlis6.js.map +1 -0
- package/dist/preferences/components/PreferencesPanel/AppearancePanel.d.ts +3 -0
- package/dist/preferences/components/PreferencesPanel/GeneralPanel.d.ts +3 -0
- package/dist/preferences/components/PreferencesPanel/LayoutPanel.d.ts +3 -0
- package/dist/preferences/components/PreferencesPanel/ShortcutKeyPanel.d.ts +3 -0
- package/dist/preferences/components/PreferencesPanel/index.d.ts +8 -0
- package/dist/preferences/components/ThemeProvider/index.d.ts +9 -0
- package/dist/preferences/components/index.d.ts +2 -0
- package/dist/preferences/config/constants.d.ts +24 -0
- package/dist/preferences/config/darkTheme.d.ts +32 -0
- package/dist/preferences/config/default.d.ts +3 -0
- package/dist/preferences/config/index.d.ts +4 -0
- package/dist/preferences/config/lightTheme.d.ts +33 -0
- package/dist/preferences/hooks/index.d.ts +3 -0
- package/dist/preferences/hooks/useLocale.d.ts +23 -0
- package/dist/preferences/hooks/usePreferences.d.ts +31 -0
- package/dist/preferences/hooks/useThemeConfig.d.ts +2 -0
- package/dist/preferences/index.d.ts +5 -0
- package/dist/preferences/store/index.d.ts +24 -0
- package/dist/preferences/theme-transition.d.ts +17 -0
- package/dist/preferences/types/app.d.ts +238 -0
- package/dist/preferences/types/index.d.ts +4 -0
- package/dist/preferences/types/layout.d.ts +78 -0
- package/dist/preferences/types/preferences-root.d.ts +48 -0
- package/dist/preferences/types/theme.d.ts +29 -0
- package/dist/preferences/utils/diff.d.ts +7 -0
- package/dist/preferences/utils/merge.d.ts +9 -0
- package/dist/query-client.d.ts +9 -0
- package/dist/rolldown-runtime-BbCBk-LD.js +19 -0
- package/dist/router/factory.d.ts +7 -0
- package/dist/router/generators/generate-menus.d.ts +13 -0
- package/dist/router/generators/generate-routes-backend.d.ts +12 -0
- package/dist/router/generators/generate-routes-frontend.d.ts +17 -0
- package/dist/router/generators/index.d.ts +3 -0
- package/dist/router/index.d.ts +5 -0
- package/dist/router/routes-context.d.ts +8 -0
- package/dist/router/types/index.d.ts +207 -0
- package/dist/router/utils/index.d.ts +8 -0
- package/dist/router/utils/inject-redirect.d.ts +6 -0
- package/dist/router/utils/lazy.d.ts +11 -0
- package/dist/router/utils/loader.d.ts +14 -0
- package/dist/router/utils/menu.d.ts +5 -0
- package/dist/router/utils/merge-route-modules.d.ts +23 -0
- package/dist/router/utils/reset-routes.d.ts +18 -0
- package/dist/router/utils/sort-routes.d.ts +5 -0
- package/dist/router/utils/transform-meta-to-handle.d.ts +11 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/storage.class.d.ts +125 -0
- package/dist/storage/storage.types.d.ts +199 -0
- package/dist/stores/auth.d.ts +56 -0
- package/dist/stores/index.d.ts +2 -0
- package/dist/stores/user.d.ts +32 -0
- package/dist/transport/rest/captcha-headers.d.ts +2 -0
- package/dist/transport/rest/index.d.ts +8 -0
- package/dist/transport/rest/modules/downloader.d.ts +9 -0
- package/dist/transport/rest/modules/interceptor.d.ts +9 -0
- package/dist/transport/rest/modules/uploader.d.ts +10 -0
- package/dist/transport/rest/pagination.d.ts +73 -0
- package/dist/transport/rest/preset-interceptors.d.ts +25 -0
- package/dist/transport/rest/request-api.d.ts +6 -0
- package/dist/transport/rest/request-client.d.ts +87 -0
- package/dist/transport/rest/types.d.ts +38 -0
- package/dist/transport/rest/utils.d.ts +16 -0
- package/dist/transport/sse/event.d.ts +44 -0
- package/dist/transport/sse/index.d.ts +5 -0
- package/dist/transport/sse/sse_client.d.ts +76 -0
- package/dist/transport/sse/types.d.ts +27 -0
- package/dist/types.d.ts +44 -0
- package/dist/utils/color.d.ts +27 -0
- package/dist/utils/date.d.ts +5 -0
- package/dist/utils/diff.d.ts +6 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/inference.d.ts +111 -0
- package/dist/utils/merge.d.ts +17 -0
- package/dist/utils/nprogress.d.ts +11 -0
- package/dist/utils/tree.d.ts +27 -0
- package/dist/utils/url.d.ts +11 -0
- package/dist/utils/utils.d.ts +37 -0
- package/package.json +70 -3
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AdminUserInfo } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* AuthGateway:认证数据面与机制面的唯一边界。
|
|
4
|
+
*
|
|
5
|
+
* 本包只提供认证"机制"(token 内存态、刷新调度、MFA 挑战态、SSE 重连、登出清理),
|
|
6
|
+
* 所有实际的后端调用(登录/登出/刷新/MFA 验证/SSO/拉取用户信息)与口令加密都由宿主
|
|
7
|
+
* 应用启动时通过 setAuthGateway 注入。这样宿主可以自由再生成自己的 API 客户端
|
|
8
|
+
* (如 go-wind-admin 的 `make ts` 产物)而不与包的发布版本漂移。
|
|
9
|
+
*/
|
|
10
|
+
/** 登录请求参数(最小结构;宿主可经 [key: string]: unknown 附加协议字段) */
|
|
11
|
+
export interface AdminLoginParams {
|
|
12
|
+
username?: string;
|
|
13
|
+
password?: string;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** 登录/刷新/MFA 验证的统一结果(最小结构,字段名与后端 proto3 JSON 对齐) */
|
|
17
|
+
export interface AdminTokenResult {
|
|
18
|
+
/** 访问令牌;为空且 mfa_operation_id 非空表示进入 MFA 挑战 */
|
|
19
|
+
access_token?: string;
|
|
20
|
+
/** 有效期(秒);proto3 JSON 下 int64 可能是字符串,消费方需 Number() 转换 */
|
|
21
|
+
expires_in?: number | string;
|
|
22
|
+
/** MFA 挑战 operation_id;非空表示密码校验通过、需二次验证 */
|
|
23
|
+
mfa_operation_id?: string;
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
export interface AuthGateway {
|
|
27
|
+
/** 登录。password 必须已经 encryptPassword 加密为信封密文。 */
|
|
28
|
+
login(params: AdminLoginParams): Promise<AdminTokenResult>;
|
|
29
|
+
/** 完成 MFA 挑战(TOTP)。成功返回含真 token 的结果。 */
|
|
30
|
+
verifyMfa(params: {
|
|
31
|
+
operationId: string;
|
|
32
|
+
totpCode: string;
|
|
33
|
+
}): Promise<AdminTokenResult>;
|
|
34
|
+
/** 完成 OIDC SSO 登录:code+state 换令牌。 */
|
|
35
|
+
ssoLogin(params: {
|
|
36
|
+
code: string;
|
|
37
|
+
state: string;
|
|
38
|
+
}): Promise<AdminTokenResult>;
|
|
39
|
+
/** 服务端登出。失败由实现方决定是否吞错——机制层继续本地清理。 */
|
|
40
|
+
logout(): Promise<unknown>;
|
|
41
|
+
/** 刷新 access token(refresh token 走 HttpOnly Cookie,由实现方保证浏览器携带)。 */
|
|
42
|
+
refresh(): Promise<AdminTokenResult>;
|
|
43
|
+
/** 拉取当前登录用户信息(登录成功与 token 刷新后惰性补拉共用)。 */
|
|
44
|
+
fetchProfile(): Promise<AdminUserInfo>;
|
|
45
|
+
/**
|
|
46
|
+
* 口令加密(AES 信封/混合信封,与后端 NeedDecrypt 同规)。
|
|
47
|
+
* 密钥属宿主环境配置(如 VITE_AES_KEY / VITE_PASSWORD_RSA_PUB),由实现方持有。
|
|
48
|
+
*/
|
|
49
|
+
encryptPassword(plain: string): Promise<string>;
|
|
50
|
+
}
|
|
51
|
+
/** 宿主启动时(bootstrap)注入认证数据面实现。重复注入覆盖旧的。 */
|
|
52
|
+
export declare function setAuthGateway(g: AuthGateway): void;
|
|
53
|
+
/** 获取已注入的 gateway;未注入即抛错(fail-fast,不吞错)。 */
|
|
54
|
+
export declare function getAuthGateway(): AuthGateway;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useThemeConfig } from '../../preferences';
|
|
2
|
+
export interface ThemeLoadingProps {
|
|
3
|
+
text?: string;
|
|
4
|
+
subText?: string;
|
|
5
|
+
fullScreen?: boolean;
|
|
6
|
+
className?: string;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
/** 进度值 0-100 */
|
|
9
|
+
progress?: number;
|
|
10
|
+
/** 加载状态:'loading' | 'success' | 'error' */
|
|
11
|
+
status?: 'loading' | 'success' | 'error';
|
|
12
|
+
/** 自动隐藏(当 progress=100 时) */
|
|
13
|
+
autoHide?: boolean;
|
|
14
|
+
/** 自定义主题覆盖 */
|
|
15
|
+
themeOverride?: Partial<ReturnType<typeof useThemeConfig>>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 主题化 Loading 组件
|
|
19
|
+
* 自动同步应用主题配置(颜色、圆角、暗黑模式等)
|
|
20
|
+
*/
|
|
21
|
+
export declare const ThemeLoading: ({ text, subText, fullScreen, className, style, progress, status, autoHide, themeOverride, }: ThemeLoadingProps) => import("react").JSX.Element | null;
|
|
22
|
+
export default ThemeLoading;
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 为 ProTable 的 .ant-table-body 动态设置高度,使分页器固定在容器底部。
|
|
4
|
+
*
|
|
5
|
+
* 核心思路(参考 CSDN 验证可行的方案):
|
|
6
|
+
* 1. scroll.y 给一个初始像素值,让 antd 创建 .ant-table-body 滚动结构
|
|
7
|
+
* 2. JS 测量容器高度、分页器位置,直接操作 .ant-table-body.style.maxHeight
|
|
8
|
+
* 3. 不依赖 CSS flex 穿透 antd 内部 DOM(因为 antd 内部层级不可控)
|
|
9
|
+
*
|
|
10
|
+
* 注意:列表页通常不需要直接使用本 hook——ListTable 已内置同样的撑满逻辑
|
|
11
|
+
* (页面不传 scroll.y 时自动接管)。手写样板会被 eslint 警告。
|
|
12
|
+
*
|
|
13
|
+
* @param containerRef - .page-container-content 容器 div 的 ref
|
|
14
|
+
* @param options.enabled - 是否启用(默认 true)。ListTable 内部用它做按需接管。
|
|
15
|
+
* @param options.requireFlexParent - 要求容器父级必须是 flex column(默认 false,
|
|
16
|
+
* 即维持历史行为)。ListTable 的自动撑满开它:外层不是 ContentContainer 这类
|
|
17
|
+
* flex 列容器(如 Drawer 内嵌表)时不接管,避免把自然高度的表压瘪。
|
|
18
|
+
*/
|
|
19
|
+
export declare function useProTableScrollY(containerRef: RefObject<HTMLElement | null>, options?: {
|
|
20
|
+
enabled?: boolean;
|
|
21
|
+
requireFlexParent?: boolean;
|
|
22
|
+
}): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useTitle(title: string): void;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 启动定时刷新
|
|
3
|
+
* 在登录成功后调用
|
|
4
|
+
*/
|
|
5
|
+
export declare function startRefreshTimer(): void;
|
|
6
|
+
/**
|
|
7
|
+
* 停止定时刷新
|
|
8
|
+
* 在登出、token 失效时调用
|
|
9
|
+
*/
|
|
10
|
+
export declare function stopRefreshTimer(): void;
|
|
11
|
+
/**
|
|
12
|
+
* 重连 SSE 服务器(使用最新的 access token)
|
|
13
|
+
* 在 token 刷新成功后调用,确保 SSE 连接携带新凭证
|
|
14
|
+
*/
|
|
15
|
+
export declare function reconnectSSEServer(): void;
|
|
16
|
+
/**
|
|
17
|
+
* 连接 SSE 服务器
|
|
18
|
+
* 使用当前 access token 建立 SSE 连接。
|
|
19
|
+
* @param sseBaseUrl SSE 基础地址(宿主从自身 env 解析后传入,如 `${VITE_SSE_URL ?? '/api/sse'}`),
|
|
20
|
+
* 后续定时刷新后的重连会复用该地址。
|
|
21
|
+
*/
|
|
22
|
+
export declare function connectSSEServer(sseBaseUrl: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* 关闭 SSE 连接
|
|
25
|
+
*/
|
|
26
|
+
export declare function disconnectSSEServer(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const LocaleSwitcher: () => import("react").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LocaleSwitcher';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type SupportedLocale } from '../../locales';
|
|
2
|
+
/**
|
|
3
|
+
* initI18n 的资源配置由宿主注入:包只带机制(引擎/回退/命名空间约定),
|
|
4
|
+
* 文案 = 包内置框架命名空间(coreResources)+ 宿主业务命名空间合并后传入。
|
|
5
|
+
*/
|
|
6
|
+
export interface InitI18nOptions {
|
|
7
|
+
/** 合并后的完整语言资源(语言 -> 命名空间 -> 文案) */
|
|
8
|
+
resources: Record<string, Record<string, Record<string, unknown>>>;
|
|
9
|
+
/** 全部命名空间列表(一般取 merged['zh-CN'] 的键) */
|
|
10
|
+
namespaces: string[];
|
|
11
|
+
/** 支持的语言列表(默认 zh-CN/en-US) */
|
|
12
|
+
supportedLngs?: readonly string[];
|
|
13
|
+
/** 回退语言(默认 zh-CN) */
|
|
14
|
+
fallbackLng?: string;
|
|
15
|
+
/** 开发环境缺失 key 告警(宿主传 import.meta.env.DEV,包内不读 env) */
|
|
16
|
+
missingKeyWarn?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare const initI18n: (initialLang: SupportedLocale, options: InitI18nOptions) => Promise<import("i18next").i18n>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type UseTranslationOptions } from 'react-i18next';
|
|
2
|
+
import { type SupportedLocale } from '../../locales';
|
|
3
|
+
export type TFunction = (key: string, options?: {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}) => string;
|
|
6
|
+
export declare const useI18n: <N extends string = "common">(ns?: N | readonly N[], options?: UseTranslationOptions<any>) => {
|
|
7
|
+
0: import("i18next").TFunction<any, any>;
|
|
8
|
+
1: import("i18next").i18n;
|
|
9
|
+
2: boolean;
|
|
10
|
+
length: 3;
|
|
11
|
+
toString(): string;
|
|
12
|
+
toLocaleString(): string;
|
|
13
|
+
toLocaleString(locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string;
|
|
14
|
+
pop(): boolean | import("i18next").i18n | import("i18next").TFunction<any, any> | undefined;
|
|
15
|
+
push(...items: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]): number;
|
|
16
|
+
concat(...items: ConcatArray<boolean | import("i18next").i18n | import("i18next").TFunction<any, any>>[]): (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[];
|
|
17
|
+
concat(...items: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any> | ConcatArray<boolean | import("i18next").i18n | import("i18next").TFunction<any, any>>)[]): (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[];
|
|
18
|
+
join(separator?: string): string;
|
|
19
|
+
reverse(): (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[];
|
|
20
|
+
shift(): boolean | import("i18next").i18n | import("i18next").TFunction<any, any> | undefined;
|
|
21
|
+
slice(start?: number, end?: number): (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[];
|
|
22
|
+
sort(compareFn?: ((a: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, b: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>) => number) | undefined): import("react-i18next").UseTranslationResponse<any, any>;
|
|
23
|
+
splice(start: number, deleteCount?: number): (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[];
|
|
24
|
+
splice(start: number, deleteCount: number, ...items: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]): (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[];
|
|
25
|
+
unshift(...items: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]): number;
|
|
26
|
+
indexOf(searchElement: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, fromIndex?: number): number;
|
|
27
|
+
lastIndexOf(searchElement: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, fromIndex?: number): number;
|
|
28
|
+
every<S extends boolean | import("i18next").i18n | import("i18next").TFunction<any, any>>(predicate: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => value is S, thisArg?: any): this is S[];
|
|
29
|
+
every(predicate: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => unknown, thisArg?: any): boolean;
|
|
30
|
+
some(predicate: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => unknown, thisArg?: any): boolean;
|
|
31
|
+
forEach(callbackfn: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => void, thisArg?: any): void;
|
|
32
|
+
map<U>(callbackfn: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => U, thisArg?: any): U[];
|
|
33
|
+
filter<S extends boolean | import("i18next").i18n | import("i18next").TFunction<any, any>>(predicate: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => value is S, thisArg?: any): S[];
|
|
34
|
+
filter(predicate: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => unknown, thisArg?: any): (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[];
|
|
35
|
+
reduce(callbackfn: (previousValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentIndex: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => boolean | import("i18next").i18n | import("i18next").TFunction<any, any>): boolean | import("i18next").i18n | import("i18next").TFunction<any, any>;
|
|
36
|
+
reduce(callbackfn: (previousValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentIndex: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, initialValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>): boolean | import("i18next").i18n | import("i18next").TFunction<any, any>;
|
|
37
|
+
reduce<U>(callbackfn: (previousValue: U, currentValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentIndex: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => U, initialValue: U): U;
|
|
38
|
+
reduceRight(callbackfn: (previousValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentIndex: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => boolean | import("i18next").i18n | import("i18next").TFunction<any, any>): boolean | import("i18next").i18n | import("i18next").TFunction<any, any>;
|
|
39
|
+
reduceRight(callbackfn: (previousValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentIndex: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, initialValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>): boolean | import("i18next").i18n | import("i18next").TFunction<any, any>;
|
|
40
|
+
reduceRight<U>(callbackfn: (previousValue: U, currentValue: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, currentIndex: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => U, initialValue: U): U;
|
|
41
|
+
find<S extends boolean | import("i18next").i18n | import("i18next").TFunction<any, any>>(predicate: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, obj: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => value is S, thisArg?: any): S | undefined;
|
|
42
|
+
find(predicate: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, obj: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => unknown, thisArg?: any): boolean | import("i18next").i18n | import("i18next").TFunction<any, any> | undefined;
|
|
43
|
+
findIndex(predicate: (value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, obj: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => unknown, thisArg?: any): number;
|
|
44
|
+
fill(value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, start?: number, end?: number): import("react-i18next").UseTranslationResponse<any, any>;
|
|
45
|
+
copyWithin(target: number, start: number, end?: number): import("react-i18next").UseTranslationResponse<any, any>;
|
|
46
|
+
entries(): ArrayIterator<[number, boolean | import("i18next").i18n | import("i18next").TFunction<any, any>]>;
|
|
47
|
+
keys(): ArrayIterator<number>;
|
|
48
|
+
values(): ArrayIterator<boolean | import("i18next").i18n | import("i18next").TFunction<any, any>>;
|
|
49
|
+
includes(searchElement: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, fromIndex?: number): boolean;
|
|
50
|
+
flatMap<U, This = undefined>(callback: (this: This, value: boolean | import("i18next").i18n | import("i18next").TFunction<any, any>, index: number, array: (boolean | import("i18next").i18n | import("i18next").TFunction<any, any>)[]) => U | readonly U[], thisArg?: This | undefined): U[];
|
|
51
|
+
flat<A, D extends number = 1>(this: A, depth?: D | undefined): FlatArray<A, D>[];
|
|
52
|
+
at(index: number): boolean | import("i18next").i18n | import("i18next").TFunction<any, any> | undefined;
|
|
53
|
+
[Symbol.iterator](): ArrayIterator<boolean | import("i18next").i18n | import("i18next").TFunction<any, any>>;
|
|
54
|
+
[Symbol.unscopables]: {
|
|
55
|
+
[x: number]: boolean | undefined;
|
|
56
|
+
length?: boolean | undefined;
|
|
57
|
+
toString?: boolean | undefined;
|
|
58
|
+
toLocaleString?: boolean | undefined;
|
|
59
|
+
pop?: boolean | undefined;
|
|
60
|
+
push?: boolean | undefined;
|
|
61
|
+
concat?: boolean | undefined;
|
|
62
|
+
join?: boolean | undefined;
|
|
63
|
+
reverse?: boolean | undefined;
|
|
64
|
+
shift?: boolean | undefined;
|
|
65
|
+
slice?: boolean | undefined;
|
|
66
|
+
sort?: boolean | undefined;
|
|
67
|
+
splice?: boolean | undefined;
|
|
68
|
+
unshift?: boolean | undefined;
|
|
69
|
+
indexOf?: boolean | undefined;
|
|
70
|
+
lastIndexOf?: boolean | undefined;
|
|
71
|
+
every?: boolean | undefined;
|
|
72
|
+
some?: boolean | undefined;
|
|
73
|
+
forEach?: boolean | undefined;
|
|
74
|
+
map?: boolean | undefined;
|
|
75
|
+
filter?: boolean | undefined;
|
|
76
|
+
reduce?: boolean | undefined;
|
|
77
|
+
reduceRight?: boolean | undefined;
|
|
78
|
+
find?: boolean | undefined;
|
|
79
|
+
findIndex?: boolean | undefined;
|
|
80
|
+
fill?: boolean | undefined;
|
|
81
|
+
copyWithin?: boolean | undefined;
|
|
82
|
+
entries?: boolean | undefined;
|
|
83
|
+
keys?: boolean | undefined;
|
|
84
|
+
values?: boolean | undefined;
|
|
85
|
+
includes?: boolean | undefined;
|
|
86
|
+
flatMap?: boolean | undefined;
|
|
87
|
+
flat?: boolean | undefined;
|
|
88
|
+
at?: boolean | undefined;
|
|
89
|
+
[Symbol.iterator]?: boolean | undefined;
|
|
90
|
+
readonly [Symbol.unscopables]?: boolean | undefined;
|
|
91
|
+
};
|
|
92
|
+
ready: boolean;
|
|
93
|
+
t: TFunction;
|
|
94
|
+
i18n: import("i18next").i18n;
|
|
95
|
+
changeLocale: (locale: SupportedLocale) => Promise<void>;
|
|
96
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SupportedLocale } from '../../locales';
|
|
2
|
+
/**
|
|
3
|
+
* 从浏览器环境自动检测首选语言
|
|
4
|
+
* @returns 检测到的语言代码
|
|
5
|
+
*/
|
|
6
|
+
export declare const detectBrowserLocale: () => SupportedLocale;
|
|
7
|
+
/**
|
|
8
|
+
* 从本地存储读取用户上次选择的语言
|
|
9
|
+
* @returns 存储的语言代码 | null
|
|
10
|
+
*/
|
|
11
|
+
export declare const getStoredLocale: () => SupportedLocale | null;
|
|
12
|
+
/**
|
|
13
|
+
* 存储用户选择的语言到本地存储
|
|
14
|
+
* @param locale 要存储的语言代码
|
|
15
|
+
*/
|
|
16
|
+
export declare const setStoredLocale: (locale: SupportedLocale) => void;
|
|
17
|
+
/**
|
|
18
|
+
* 综合检测:优先级 存储语言 > 浏览器语言 > 默认语言
|
|
19
|
+
* @returns 最终生效的语言代码
|
|
20
|
+
*/
|
|
21
|
+
export declare const getFinalLocale: () => SupportedLocale;
|
|
22
|
+
/**
|
|
23
|
+
* 校验语言是否为项目支持的语言
|
|
24
|
+
* @param locale 待校验的语言代码
|
|
25
|
+
*/
|
|
26
|
+
export declare const isSupportedLocale: (locale: string) => locale is SupportedLocale;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SupportedLocale } from '../../locales';
|
|
2
|
+
/**
|
|
3
|
+
* 日期格式化工具(Intl 本地化格式;与 utils/date 的 dayjs 版 formatDate 同名冲突,
|
|
4
|
+
* 故此处命名为 formatLocaleDate)
|
|
5
|
+
* @param date 日期对象/时间戳
|
|
6
|
+
* @param locale 目标语言
|
|
7
|
+
* @param options Intl.DateTimeFormat 配置
|
|
8
|
+
*/
|
|
9
|
+
export declare const formatLocaleDate: (date: Date | number | string, locale: SupportedLocale, options?: Intl.DateTimeFormatOptions) => string;
|
|
10
|
+
/**
|
|
11
|
+
* 数字格式化工具(支持千分位、小数位)
|
|
12
|
+
* @param num 数字
|
|
13
|
+
* @param locale 目标语言
|
|
14
|
+
* @param options Intl.NumberFormat 配置
|
|
15
|
+
*/
|
|
16
|
+
export declare const formatNumber: (num: number, locale: SupportedLocale, options?: Intl.NumberFormatOptions) => string;
|
|
17
|
+
/**
|
|
18
|
+
* 货币格式化工具
|
|
19
|
+
* @param amount 金额
|
|
20
|
+
* @param locale 目标语言
|
|
21
|
+
* @param currency 货币代码(CNY/USD等)
|
|
22
|
+
* @param options Intl.NumberFormat 配置
|
|
23
|
+
*/
|
|
24
|
+
export declare const formatCurrency: (amount: number, locale: SupportedLocale, currency?: string, options?: Intl.NumberFormatOptions) => string;
|
|
25
|
+
/**
|
|
26
|
+
* 百分比格式化工具
|
|
27
|
+
* @param value 小数(0.85 → 85%)
|
|
28
|
+
* @param locale 目标语言
|
|
29
|
+
* @param options Intl.NumberFormat 配置
|
|
30
|
+
*/
|
|
31
|
+
export declare const formatPercent: (value: number, locale: SupportedLocale, options?: Intl.NumberFormatOptions) => string;
|
|
32
|
+
/**
|
|
33
|
+
* 相对时间格式化(如“3分钟前”“昨天”)
|
|
34
|
+
* @param date 目标日期
|
|
35
|
+
* @param locale 目标语言
|
|
36
|
+
* @param options Intl.RelativeTimeFormat 配置
|
|
37
|
+
*/
|
|
38
|
+
export declare const formatRelativeTime: (date: Date | number, locale: SupportedLocale, options?: Intl.RelativeTimeFormatOptions) => string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { SupportedLocale } from '../../locales';
|
|
2
|
+
/**
|
|
3
|
+
* 同步语言到浏览器环境
|
|
4
|
+
* 1. 更新 HTML lang 属性
|
|
5
|
+
* 2. 更新 HTML dir 属性(RTL 语言支持)
|
|
6
|
+
* 3. 持久化到本地存储
|
|
7
|
+
* @param locale 目标语言
|
|
8
|
+
*/
|
|
9
|
+
export declare const syncLocaleToBrowser: (locale: SupportedLocale) => void;
|
|
10
|
+
/**
|
|
11
|
+
* 监听 i18n 语言变化,自动触发同步
|
|
12
|
+
* @param callback 语言变化时的额外回调
|
|
13
|
+
* @returns 取消监听的函数
|
|
14
|
+
*/
|
|
15
|
+
export declare const setupLocaleSync: (callback?: (locale: SupportedLocale) => void) => (() => void);
|
|
16
|
+
/**
|
|
17
|
+
* 同步页面标题(配合 i18n 实现标题多语言)
|
|
18
|
+
* @param t 翻译函数
|
|
19
|
+
* @param titleKey 翻译 key
|
|
20
|
+
* @param params 翻译参数
|
|
21
|
+
*/
|
|
22
|
+
export declare const syncPageTitle: (t: (key: string, params?: Record<string, any>) => string, titleKey: string, params?: Record<string, any>) => void;
|
|
23
|
+
/**
|
|
24
|
+
* 初始化语言同步(项目启动时调用一次)
|
|
25
|
+
* 自动读取存储/浏览器语言,同步到 i18n 和浏览器环境
|
|
26
|
+
*/
|
|
27
|
+
export declare const initLocaleSync: () => Promise<void>;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @go-wind/admin-react — 管理端壳层"机制"包(React 19)
|
|
3
|
+
*
|
|
4
|
+
* 自 go-wind-admin 的 src/core 及关联基础设施抽取。边界约定:
|
|
5
|
+
* - 机制进包:transport(token 轮换/验证码 header/SSE)、auth store(经 AuthGateway 注入数据面)、
|
|
6
|
+
* 路由工厂(frontend/backend 双模式,pageMap 由宿主 import.meta.glob 注入)、权限检查、
|
|
7
|
+
* i18n 引擎、主题/偏好、query client、通用 hooks 与 utils。
|
|
8
|
+
* - 数据留宿主:generated API 客户端、api hooks、路由表、权限码、业务文案命名空间、
|
|
9
|
+
* 登录页/布局/业务页面。
|
|
10
|
+
* - 包内零 import.meta.env 直读(lib 构建会静态替换):env 相关全部经
|
|
11
|
+
* configureAdminRuntime / configureQueryClient / initI18n / connectSSEServer 运行时注入。
|
|
12
|
+
*/
|
|
13
|
+
export * from './env';
|
|
14
|
+
export * from './types';
|
|
15
|
+
export * from './auth-gateway';
|
|
16
|
+
export * from './locales';
|
|
17
|
+
export * from './query-client';
|
|
18
|
+
export * from './storage';
|
|
19
|
+
export * from './transport/rest';
|
|
20
|
+
export * from './transport/sse';
|
|
21
|
+
export * from './i18n';
|
|
22
|
+
export * from './i18n/components';
|
|
23
|
+
export * from './preferences';
|
|
24
|
+
export * from './preferences/theme-transition';
|
|
25
|
+
export * from './access';
|
|
26
|
+
export * from './router';
|
|
27
|
+
export * from './stores/auth';
|
|
28
|
+
export * from './stores/user';
|
|
29
|
+
export * from './hooks/useTokenRefresh';
|
|
30
|
+
export * from './hooks/useTitle';
|
|
31
|
+
export * from './hooks/useTime';
|
|
32
|
+
export * from './hooks/useProTableScrollY';
|
|
33
|
+
export * from './utils';
|
|
34
|
+
export { default as ThemeLoading } from './components/Loading';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResourceLanguage } from 'i18next';
|
|
2
|
+
export type SupportedLocale = 'zh-CN' | 'en-US';
|
|
3
|
+
export declare const supportedLocales: SupportedLocale[];
|
|
4
|
+
export declare const FALLBACK_LOCALE: SupportedLocale;
|
|
5
|
+
/**
|
|
6
|
+
* 包内置的框架命名空间文案(common/auth/editor/preferences)。
|
|
7
|
+
* 宿主把业务命名空间与之合并后传给 initI18n——同名命名空间宿主可整体覆盖。
|
|
8
|
+
*/
|
|
9
|
+
export declare const coreResources: Record<SupportedLocale, ResourceLanguage>;
|
|
10
|
+
export declare const CORE_NAMESPACES: string[];
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { t as e } from "./rolldown-runtime-BbCBk-LD.js";
|
|
2
|
+
// ../../node_modules/.pnpm/nprogress@0.2.0/node_modules/nprogress/nprogress.js
|
|
3
|
+
var t = /* @__PURE__ */ e(((e, t, n) => {
|
|
4
|
+
(function(n, r) {
|
|
5
|
+
typeof define == "function" && define.amd ? define(r) : typeof e == "object" ? t.exports = r() : n.NProgress = r();
|
|
6
|
+
})(n, function() {
|
|
7
|
+
var e = {};
|
|
8
|
+
e.version = "0.2.0";
|
|
9
|
+
var t = e.settings = {
|
|
10
|
+
minimum: .08,
|
|
11
|
+
easing: "ease",
|
|
12
|
+
positionUsing: "",
|
|
13
|
+
speed: 200,
|
|
14
|
+
trickle: !0,
|
|
15
|
+
trickleRate: .02,
|
|
16
|
+
trickleSpeed: 800,
|
|
17
|
+
showSpinner: !0,
|
|
18
|
+
barSelector: "[role=\"bar\"]",
|
|
19
|
+
spinnerSelector: "[role=\"spinner\"]",
|
|
20
|
+
parent: "body",
|
|
21
|
+
template: "<div class=\"bar\" role=\"bar\"><div class=\"peg\"></div></div><div class=\"spinner\" role=\"spinner\"><div class=\"spinner-icon\"></div></div>"
|
|
22
|
+
};
|
|
23
|
+
e.configure = function(e) {
|
|
24
|
+
var n, r;
|
|
25
|
+
for (n in e) r = e[n], r !== void 0 && e.hasOwnProperty(n) && (t[n] = r);
|
|
26
|
+
return this;
|
|
27
|
+
}, e.status = null, e.set = function(r) {
|
|
28
|
+
var s = e.isStarted();
|
|
29
|
+
r = n(r, t.minimum, 1), e.status = r === 1 ? null : r;
|
|
30
|
+
var c = e.render(!s), l = c.querySelector(t.barSelector), u = t.speed, d = t.easing;
|
|
31
|
+
return c.offsetWidth, a(function(n) {
|
|
32
|
+
t.positionUsing === "" && (t.positionUsing = e.getPositioningCSS()), o(l, i(r, u, d)), r === 1 ? (o(c, {
|
|
33
|
+
transition: "none",
|
|
34
|
+
opacity: 1
|
|
35
|
+
}), c.offsetWidth, setTimeout(function() {
|
|
36
|
+
o(c, {
|
|
37
|
+
transition: "all " + u + "ms linear",
|
|
38
|
+
opacity: 0
|
|
39
|
+
}), setTimeout(function() {
|
|
40
|
+
e.remove(), n();
|
|
41
|
+
}, u);
|
|
42
|
+
}, u)) : setTimeout(n, u);
|
|
43
|
+
}), this;
|
|
44
|
+
}, e.isStarted = function() {
|
|
45
|
+
return typeof e.status == "number";
|
|
46
|
+
}, e.start = function() {
|
|
47
|
+
e.status || e.set(0);
|
|
48
|
+
var n = function() {
|
|
49
|
+
setTimeout(function() {
|
|
50
|
+
e.status && (e.trickle(), n());
|
|
51
|
+
}, t.trickleSpeed);
|
|
52
|
+
};
|
|
53
|
+
return t.trickle && n(), this;
|
|
54
|
+
}, e.done = function(t) {
|
|
55
|
+
return !t && !e.status ? this : e.inc(.3 + .5 * Math.random()).set(1);
|
|
56
|
+
}, e.inc = function(t) {
|
|
57
|
+
var r = e.status;
|
|
58
|
+
return r ? (typeof t != "number" && (t = (1 - r) * n(Math.random() * r, .1, .95)), r = n(r + t, 0, .994), e.set(r)) : e.start();
|
|
59
|
+
}, e.trickle = function() {
|
|
60
|
+
return e.inc(Math.random() * t.trickleRate);
|
|
61
|
+
}, (function() {
|
|
62
|
+
var t = 0, n = 0;
|
|
63
|
+
e.promise = function(r) {
|
|
64
|
+
return !r || r.state() === "resolved" || (n === 0 && e.start(), t++, n++, r.always(function() {
|
|
65
|
+
n--, n === 0 ? (t = 0, e.done()) : e.set((t - n) / t);
|
|
66
|
+
})), this;
|
|
67
|
+
};
|
|
68
|
+
})(), e.render = function(n) {
|
|
69
|
+
if (e.isRendered()) return document.getElementById("nprogress");
|
|
70
|
+
c(document.documentElement, "nprogress-busy");
|
|
71
|
+
var i = document.createElement("div");
|
|
72
|
+
i.id = "nprogress", i.innerHTML = t.template;
|
|
73
|
+
var a = i.querySelector(t.barSelector), s = n ? "-100" : r(e.status || 0), l = document.querySelector(t.parent), u;
|
|
74
|
+
return o(a, {
|
|
75
|
+
transition: "all 0 linear",
|
|
76
|
+
transform: "translate3d(" + s + "%,0,0)"
|
|
77
|
+
}), t.showSpinner || (u = i.querySelector(t.spinnerSelector), u && d(u)), l != document.body && c(l, "nprogress-custom-parent"), l.appendChild(i), i;
|
|
78
|
+
}, e.remove = function() {
|
|
79
|
+
l(document.documentElement, "nprogress-busy"), l(document.querySelector(t.parent), "nprogress-custom-parent");
|
|
80
|
+
var e = document.getElementById("nprogress");
|
|
81
|
+
e && d(e);
|
|
82
|
+
}, e.isRendered = function() {
|
|
83
|
+
return !!document.getElementById("nprogress");
|
|
84
|
+
}, e.getPositioningCSS = function() {
|
|
85
|
+
var e = document.body.style, t = "WebkitTransform" in e ? "Webkit" : "MozTransform" in e ? "Moz" : "msTransform" in e ? "ms" : "OTransform" in e ? "O" : "";
|
|
86
|
+
return t + "Perspective" in e ? "translate3d" : t + "Transform" in e ? "translate" : "margin";
|
|
87
|
+
};
|
|
88
|
+
function n(e, t, n) {
|
|
89
|
+
return e < t ? t : e > n ? n : e;
|
|
90
|
+
}
|
|
91
|
+
function r(e) {
|
|
92
|
+
return (-1 + e) * 100;
|
|
93
|
+
}
|
|
94
|
+
function i(e, n, i) {
|
|
95
|
+
var a = t.positionUsing === "translate3d" ? { transform: "translate3d(" + r(e) + "%,0,0)" } : t.positionUsing === "translate" ? { transform: "translate(" + r(e) + "%,0)" } : { "margin-left": r(e) + "%" };
|
|
96
|
+
return a.transition = "all " + n + "ms " + i, a;
|
|
97
|
+
}
|
|
98
|
+
var a = (function() {
|
|
99
|
+
var e = [];
|
|
100
|
+
function t() {
|
|
101
|
+
var n = e.shift();
|
|
102
|
+
n && n(t);
|
|
103
|
+
}
|
|
104
|
+
return function(n) {
|
|
105
|
+
e.push(n), e.length == 1 && t();
|
|
106
|
+
};
|
|
107
|
+
})(), o = (function() {
|
|
108
|
+
var e = [
|
|
109
|
+
"Webkit",
|
|
110
|
+
"O",
|
|
111
|
+
"Moz",
|
|
112
|
+
"ms"
|
|
113
|
+
], t = {};
|
|
114
|
+
function n(e) {
|
|
115
|
+
return e.replace(/^-ms-/, "ms-").replace(/-([\da-z])/gi, function(e, t) {
|
|
116
|
+
return t.toUpperCase();
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function r(t) {
|
|
120
|
+
var n = document.body.style;
|
|
121
|
+
if (t in n) return t;
|
|
122
|
+
for (var r = e.length, i = t.charAt(0).toUpperCase() + t.slice(1), a; r--;) if (a = e[r] + i, a in n) return a;
|
|
123
|
+
return t;
|
|
124
|
+
}
|
|
125
|
+
function i(e) {
|
|
126
|
+
return e = n(e), t[e] || (t[e] = r(e));
|
|
127
|
+
}
|
|
128
|
+
function a(e, t, n) {
|
|
129
|
+
t = i(t), e.style[t] = n;
|
|
130
|
+
}
|
|
131
|
+
return function(e, t) {
|
|
132
|
+
var n = arguments, r, i;
|
|
133
|
+
if (n.length == 2) for (r in t) i = t[r], i !== void 0 && t.hasOwnProperty(r) && a(e, r, i);
|
|
134
|
+
else a(e, n[1], n[2]);
|
|
135
|
+
};
|
|
136
|
+
})();
|
|
137
|
+
function s(e, t) {
|
|
138
|
+
return (typeof e == "string" ? e : u(e)).indexOf(" " + t + " ") >= 0;
|
|
139
|
+
}
|
|
140
|
+
function c(e, t) {
|
|
141
|
+
var n = u(e), r = n + t;
|
|
142
|
+
s(n, t) || (e.className = r.substring(1));
|
|
143
|
+
}
|
|
144
|
+
function l(e, t) {
|
|
145
|
+
var n = u(e), r;
|
|
146
|
+
s(e, t) && (r = n.replace(" " + t + " ", " "), e.className = r.substring(1, r.length - 1));
|
|
147
|
+
}
|
|
148
|
+
function u(e) {
|
|
149
|
+
return (" " + (e.className || "") + " ").replace(/\s+/gi, " ");
|
|
150
|
+
}
|
|
151
|
+
function d(e) {
|
|
152
|
+
e && e.parentNode && e.parentNode.removeChild(e);
|
|
153
|
+
}
|
|
154
|
+
return e;
|
|
155
|
+
});
|
|
156
|
+
}));
|
|
157
|
+
export default t();
|
|
158
|
+
|
|
159
|
+
//# sourceMappingURL=nprogress-CwfUlis6.js.map
|