@wapri/gbase 0.0.0-stage → 1.0.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/README.md CHANGED
@@ -1,3 +1,88 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # @wapri/gbase
2
+
3
+ ## Storage
4
+
5
+ `MyStorage` 创建时先检查对应浏览器存储是否可用,并在不可用时回退到内存,避免 App 壳或非浏览器环境的读写异常。
6
+
7
+ ```ts
8
+ import storage, { MyStorage } from '@wapri/gbase'
9
+
10
+ storage.setItem('token', 'value')
11
+
12
+ const sessionStorage = new MyStorage('sessionStorage')
13
+ sessionStorage.setItem('step', '2')
14
+ ```
15
+
16
+ `storage` 是 `new MyStorage('localStorage')` 的默认实例;也保留具名导出以兼容现有导入方式。
17
+
18
+ ## 运行环境判断(os)
19
+
20
+ 统一从 `@wapri/gbase` 导入 `os`,不要在业务里内联 UA 正则。
21
+
22
+ ```ts
23
+ import { os } from '@wapri/gbase'
24
+
25
+ os.isHarmonyOS() // 是否为鸿蒙(纯血鸿蒙 + 旧版鸿蒙)
26
+ os.getOS() // 'mac' | 'windows' | 'linux' | 'ios' | 'android' | 'harmonyos' | undefined
27
+ ```
28
+
29
+ ### 鸿蒙相关方法
30
+
31
+ | 方法 | 说明 |
32
+ | ----------------------- | -------------------------------------------------------- |
33
+ | `isHarmonyOS()` | 广义鸿蒙:纯血鸿蒙 + 旧版鸿蒙 |
34
+ | `isHarmonyOSNext()` | 仅纯血鸿蒙(HarmonyOS NEXT 5.x) |
35
+ | `isHarmonyOSLegacy()` | 仅旧版鸿蒙(HarmonyOS 4 及以前,兼容 AOSP,可装安卓 APK) |
36
+ | `getOS()` | 返回 `'harmonyos'` |
37
+
38
+ ### 两类鸿蒙的 UA 差异
39
+
40
+ | 类型 | UA 关键特征 | `isAndroid()` |
41
+ | ---------------- | ------------------------------------------------- | ------------- |
42
+ | 纯血鸿蒙 NEXT | `Phone; OpenHarmony 5.0`、`ArkWeb/4.1.6.1`,无 `Android` | `false` |
43
+ | 旧版鸿蒙(≤ 4) | `Android 10; HarmonyOS`、`HMSCore`,含 `Android` | `true` |
44
+
45
+ ```txt
46
+ // 纯血鸿蒙系统浏览器
47
+ Mozilla/5.0 (Phone; OpenHarmony 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 ArkWeb/4.1.6.1 Mobile HuaweiBrowser/5.0.3.351
48
+
49
+ // 旧版鸿蒙
50
+ Mozilla/5.0 (Linux; Android 10; HarmonyOS; LIO-AL10; HMSCore 6.3.0.311) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 Mobile Safari/537.36
51
+ ```
52
+
53
+ 需要注意:
54
+
55
+ - **判断顺序**:旧版鸿蒙兼容 AOSP,`isAndroid()` 对它同样返回 `true`。需要区分时先判断 `isHarmonyOS()`,不要只用 `isAndroid()`。
56
+ - **不要用 `HMSCore` 判定鸿蒙**:它是华为移动服务的 SDK 标识,普通华为安卓机(如 Mate 系列)的 UA 里同样带有,会把所有华为安卓机误判成鸿蒙。
57
+ - UA 正则统一维护在 `src/constant/os.ts`,新增规则时先补正则再暴露方法。
58
+
59
+ ## 正则校验
60
+
61
+ 正则统一维护在 `src/constant/regexp.ts`,校验方法放在 `src/regexp.ts`。新增规则时先补正则,再暴露对应的 `isXxx` 方法,不要在业务里内联正则。
62
+
63
+ ```ts
64
+ import { isEmail, isPhone } from '@wapri/gbase'
65
+
66
+ isEmail('user@kaimai.com') // true
67
+ isPhone('13800138000') // true
68
+ ```
69
+
70
+ | 方法 | 说明 |
71
+ | --------- | ------------------------ |
72
+ | `isEmail` | 邮箱 |
73
+ | `isPhone` | 手机号(中国大陆 11 位) |
74
+
75
+ ### 为什么正则不直接导出
76
+
77
+ `src/constant/regexp.ts` 导出的是构造函数(`regexpEmail()`、`regexpPhone()`),而不是正则对象,原因有两点:
78
+
79
+ 1. 正则字面量在**脚本解析阶段**就会被引擎校验,一旦浏览器不支持其中的语法(如 lookbehind),解析期就直接抛 `SyntaxError`,整个模块都加载不了,调用方连兜底的机会都没有。
80
+ 2. 所以正则改用字符串 + `new RegExp`,把编译推迟到调用时;`isEmail` / `isPhone` 内部已用 `try/catch` 包裹,构造或匹配失败时统一返回 `false`,不会把异常抛给业务。
81
+
82
+ 需要 RegExp 对象本身(例如 Element Plus 表单的 `pattern`)时,再显式调用构造函数:
83
+
84
+ ```ts
85
+ import { regexpEmail } from '@wapri/gbase'
86
+
87
+ const rules = [{ pattern: regexpEmail(), message: '邮箱格式不正确' }]
88
+ ```
package/dist/auth.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import { type PlatformType } from './platform';
2
+ export declare const systemType: {
3
+ readonly PLATFORM: "PLATFORM";
4
+ readonly MERCHANT: "MERCHANT";
5
+ readonly MAITIAN: "MAITIAN";
6
+ };
7
+ export type SystemType = (typeof systemType)[keyof typeof systemType];
8
+ /** 读取当前登录主体类型(内存态,由 Account 实例写入)。 */
9
+ export declare const getCurrentUserType: () => SystemType | '';
10
+ /** 写入当前登录主体类型(内存态,由 Account 实例调用)。 */
11
+ export declare const setCurrentUserType: (userType: SystemType | '') => void;
12
+ /**
13
+ * 身份判断使用的平台参数名。
14
+ *
15
+ * 加 `kaimai-` 前缀,避免和业务自身常见的 `platform` 参数撞车:
16
+ * 业务链接里带一个无关的 `platform=xxx` 就会把登录主体判错。
17
+ */
18
+ export declare const PLATFORM_URL_PARAM = "kaimai-platform";
19
+ /** 读取 URL 上的平台参数;未传或非法时返回空字符串。 */
20
+ export declare const getUrlPlatform: () => PlatformType | '';
21
+ /**
22
+ * 按 location.origin 识别部署域:
23
+ * - `admin-xxx.xxx.com` / `admin.xxx.com` → 平台端
24
+ * - `merchant-xxx.xxx.com` / `merchant.xxx.com` → 商家端
25
+ */
26
+ export declare const resolveOriginPlatform: (origin: string) => PlatformType | '';
27
+ /** 读取当前 location.origin 对应的平台标识。 */
28
+ export declare const getOriginPlatform: () => PlatformType | '';
29
+ /**
30
+ * 判断当前是否为平台端。
31
+ *
32
+ * 优先级:部署域(location.origin)> URL `kaimai-platform` 参数 > Account 实例写入的当前主体。
33
+ * 部署域命中时以域名锁定为准,避免在 admin/merchant 业务域上被 URL 参数串用。
34
+ */
35
+ export declare const systemPlatform: () => boolean;
36
+ export declare const systemMerchant: () => boolean;
37
+ export declare const systemMaitian: () => boolean;
38
+ export declare const getToken: () => string | null;
39
+ export declare const setToken: (token: string) => void;
40
+ export declare const removeToken: () => void;
package/dist/auth.js ADDED
@@ -0,0 +1,128 @@
1
+ import { default as Cookies } from 'js-cookie';
2
+ import { isPlatformType, platformType } from "./platform";
3
+ import { storage } from "./storage";
4
+ import { getUrlParam } from "./url";
5
+ var TokenKey = 'Admin-Token';
6
+ var tokenKeyMerchant = 'Admin-Token-MERCHANT';
7
+ var tokenKeyPlatform = 'Admin-Token-PLATFORM';
8
+ var tokenKeyMaitian = 'Admin-Token-MAITIAN';
9
+ export var systemType = {
10
+ PLATFORM: 'PLATFORM',
11
+ MERCHANT: 'MERCHANT',
12
+ MAITIAN: 'MAITIAN'
13
+ };
14
+ /**
15
+ * 当前登录主体,只保存在内存中。
16
+ *
17
+ * 主体归属由 `@wapri/gaccount` 的 Account 实例按自身 platform 决定,
18
+ * 不再落 storage:避免多平台页面共用同一份持久化主体而读错 Token。
19
+ */
20
+ var currentUserType = '';
21
+
22
+ /** 读取当前登录主体类型(内存态,由 Account 实例写入)。 */
23
+ export var getCurrentUserType = function getCurrentUserType() {
24
+ return currentUserType;
25
+ };
26
+
27
+ /** 写入当前登录主体类型(内存态,由 Account 实例调用)。 */
28
+ export var setCurrentUserType = function setCurrentUserType(userType) {
29
+ currentUserType = userType;
30
+ };
31
+
32
+ /**
33
+ * 网关 JWT 较长,不能放 Cookie:浏览器会自动带上 Admin-Token,
34
+ * 与 Authorization: Bearer 同时出现时权限中心会返回 401。
35
+ * Token 仅存 localStorage,请求时由 axios 写入 Authorization。
36
+ */
37
+ function clearLegacyTokenCookie() {
38
+ Cookies.remove(TokenKey);
39
+ Cookies.remove(TokenKey, {
40
+ path: '/'
41
+ });
42
+ }
43
+
44
+ /**
45
+ * 身份判断使用的平台参数名。
46
+ *
47
+ * 加 `kaimai-` 前缀,避免和业务自身常见的 `platform` 参数撞车:
48
+ * 业务链接里带一个无关的 `platform=xxx` 就会把登录主体判错。
49
+ */
50
+ export var PLATFORM_URL_PARAM = 'kaimai-platform';
51
+
52
+ /** 读取 URL 上的平台参数;未传或非法时返回空字符串。 */
53
+ export var getUrlPlatform = function getUrlPlatform() {
54
+ if (typeof window === 'undefined') return '';
55
+ var value = String(getUrlParam(PLATFORM_URL_PARAM) || '').toLowerCase();
56
+ return isPlatformType(value) ? value : '';
57
+ };
58
+
59
+ /**
60
+ * 按 location.origin 识别部署域:
61
+ * - `admin-xxx.xxx.com` / `admin.xxx.com` → 平台端
62
+ * - `merchant-xxx.xxx.com` / `merchant.xxx.com` → 商家端
63
+ */
64
+ export var resolveOriginPlatform = function resolveOriginPlatform(origin) {
65
+ var normalized = origin.toLowerCase();
66
+ if (/^https?:\/\/admin[.-]/.test(normalized)) return platformType.KAIMAI_ADMIN;
67
+ if (/^https?:\/\/merchant[.-]/.test(normalized)) return platformType.KAIMAI_MERCHANT;
68
+ return '';
69
+ };
70
+
71
+ /** 读取当前 location.origin 对应的平台标识。 */
72
+ export var getOriginPlatform = function getOriginPlatform() {
73
+ if (typeof window === 'undefined') return '';
74
+ return resolveOriginPlatform(window.location.origin);
75
+ };
76
+
77
+ /**
78
+ * 判断当前是否为平台端。
79
+ *
80
+ * 优先级:部署域(location.origin)> URL `kaimai-platform` 参数 > Account 实例写入的当前主体。
81
+ * 部署域命中时以域名锁定为准,避免在 admin/merchant 业务域上被 URL 参数串用。
82
+ */
83
+ export var systemPlatform = function systemPlatform() {
84
+ var originPlatform = getOriginPlatform();
85
+ if (originPlatform) return originPlatform === platformType.KAIMAI_ADMIN;
86
+ var urlPlatform = getUrlPlatform();
87
+ if (urlPlatform) return urlPlatform === platformType.KAIMAI_ADMIN;
88
+ return currentUserType === systemType.PLATFORM;
89
+ };
90
+ export var systemMerchant = function systemMerchant() {
91
+ var originPlatform = getOriginPlatform();
92
+ if (originPlatform) return originPlatform === platformType.KAIMAI_MERCHANT;
93
+ var urlPlatform = getUrlPlatform();
94
+ if (urlPlatform) return urlPlatform === platformType.KAIMAI_MERCHANT;
95
+ return currentUserType === systemType.MERCHANT;
96
+ };
97
+ export var systemMaitian = function systemMaitian() {
98
+ var originPlatform = getOriginPlatform();
99
+ if (originPlatform) return originPlatform === platformType.MAITIAN;
100
+ var urlPlatform = getUrlPlatform();
101
+ if (urlPlatform) return urlPlatform === platformType.MAITIAN;
102
+ return currentUserType === systemType.MAITIAN;
103
+ };
104
+ var getTokenKey = function getTokenKey() {
105
+ if (systemPlatform()) {
106
+ return tokenKeyPlatform;
107
+ }
108
+ if (systemMerchant()) {
109
+ return tokenKeyMerchant;
110
+ }
111
+ if (systemMaitian()) {
112
+ return tokenKeyMaitian;
113
+ }
114
+ return TokenKey;
115
+ };
116
+ export var getToken = function getToken() {
117
+ // 历史版本会把 token 写进 Cookie,每次读取时顺带清掉,避免继续随请求发出
118
+ clearLegacyTokenCookie();
119
+ return storage.getItem(getTokenKey());
120
+ };
121
+ export var setToken = function setToken(token) {
122
+ clearLegacyTokenCookie();
123
+ storage.setItem(getTokenKey(), token);
124
+ };
125
+ export var removeToken = function removeToken() {
126
+ clearLegacyTokenCookie();
127
+ storage.removeItem(getTokenKey());
128
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 鸿蒙系统 UA 特征集中维护
3
+ *
4
+ * 约定与 `constant/regexp.ts` 一致:只导出「创建正则」的函数,避免正则字面量在脚本解析阶段抛错。
5
+ *
6
+ * 真实 UA 样本:
7
+ * - 纯血鸿蒙(HarmonyOS NEXT)系统浏览器:
8
+ * `Mozilla/5.0 (Phone; OpenHarmony 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 ArkWeb/4.1.6.1 Mobile HuaweiBrowser/5.0.3.351`
9
+ * - 纯血鸿蒙 App 内嵌 WebView(部分应用会把型号与版本追加在末尾,形态为 `Harmony/5.0.1.71`):
10
+ * `Mozilla/5.0 (Phone; OpenHarmony 5.0) ... ArkWeb/4.1.6.1 Mobile PPDWebUI/10.5.0 ... (Harmony/5.0.1.71)`
11
+ * - 旧版鸿蒙(HarmonyOS 4 及以前,兼容 AOSP):UA 中同时含 `Android` 与 `HarmonyOS`,
12
+ * 形如 `Mozilla/5.0 (Linux; Android 10; HarmonyOS; ...) ... HuaweiBrowser/12.x`
13
+ */
14
+ /** 鸿蒙 ArkWeb 内核标识,纯血鸿蒙(HarmonyOS NEXT)必带,旧版鸿蒙不带 */
15
+ export declare const regexpArkWeb: () => RegExp;
16
+ /** 纯血鸿蒙(HarmonyOS NEXT)平台标识,形如 `OpenHarmony 5.0` 或 `Harmony/5.0.1.71` */
17
+ export declare const regexpHarmonyOSNext: () => RegExp;
18
+ /**
19
+ * 广义鸿蒙标识:覆盖纯血鸿蒙(`OpenHarmony`、`Harmony/5.x`、`ArkWeb`)与旧版鸿蒙(`HarmonyOS`)
20
+ *
21
+ * 注意不要把 `HMSCore` 作为判定依据:它是华为移动服务的 SDK 标识,普通华为 Android 机型
22
+ * (如 ELS-AN00 / Mate 系列)的 UA 里同样带有,会把所有华为安卓机误判成鸿蒙。
23
+ */
24
+ export declare const regexpHarmonyOS: () => RegExp;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 鸿蒙系统 UA 特征集中维护
3
+ *
4
+ * 约定与 `constant/regexp.ts` 一致:只导出「创建正则」的函数,避免正则字面量在脚本解析阶段抛错。
5
+ *
6
+ * 真实 UA 样本:
7
+ * - 纯血鸿蒙(HarmonyOS NEXT)系统浏览器:
8
+ * `Mozilla/5.0 (Phone; OpenHarmony 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 ArkWeb/4.1.6.1 Mobile HuaweiBrowser/5.0.3.351`
9
+ * - 纯血鸿蒙 App 内嵌 WebView(部分应用会把型号与版本追加在末尾,形态为 `Harmony/5.0.1.71`):
10
+ * `Mozilla/5.0 (Phone; OpenHarmony 5.0) ... ArkWeb/4.1.6.1 Mobile PPDWebUI/10.5.0 ... (Harmony/5.0.1.71)`
11
+ * - 旧版鸿蒙(HarmonyOS 4 及以前,兼容 AOSP):UA 中同时含 `Android` 与 `HarmonyOS`,
12
+ * 形如 `Mozilla/5.0 (Linux; Android 10; HarmonyOS; ...) ... HuaweiBrowser/12.x`
13
+ */
14
+
15
+ /** 鸿蒙 ArkWeb 内核标识,纯血鸿蒙(HarmonyOS NEXT)必带,旧版鸿蒙不带 */
16
+ export var regexpArkWeb = function regexpArkWeb() {
17
+ return new RegExp('arkweb', 'i');
18
+ };
19
+
20
+ /** 纯血鸿蒙(HarmonyOS NEXT)平台标识,形如 `OpenHarmony 5.0` 或 `Harmony/5.0.1.71` */
21
+ export var regexpHarmonyOSNext = function regexpHarmonyOSNext() {
22
+ return new RegExp('openharmony|harmony/\\d', 'i');
23
+ };
24
+
25
+ /**
26
+ * 广义鸿蒙标识:覆盖纯血鸿蒙(`OpenHarmony`、`Harmony/5.x`、`ArkWeb`)与旧版鸿蒙(`HarmonyOS`)
27
+ *
28
+ * 注意不要把 `HMSCore` 作为判定依据:它是华为移动服务的 SDK 标识,普通华为 Android 机型
29
+ * (如 ELS-AN00 / Mate 系列)的 UA 里同样带有,会把所有华为安卓机误判成鸿蒙。
30
+ */
31
+ export var regexpHarmonyOS = function regexpHarmonyOS() {
32
+ return new RegExp('openharmony|harmony/\\d|harmonyos|arkweb', 'i');
33
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 正则集中维护
3
+ *
4
+ * 约定:
5
+ * 1. 这里只导出「创建正则」的函数,不直接导出正则对象。
6
+ * 2. 正则用字符串 + new RegExp 构造,而不是正则字面量。
7
+ * 字面量会在脚本解析阶段就被引擎校验,一旦用到浏览器不支持的语法(如 lookbehind),
8
+ * 解析期就会抛 SyntaxError,导致整个模块加载失败,调用方的 try/catch 也拦不住;
9
+ * 字符串形式把编译推迟到调用时,异常才能被捕获并降级。
10
+ * 3. 校验方法(src/regexp.ts)只负责调用,不内联正则。
11
+ */
12
+ /** 邮箱 */
13
+ export declare const regexpEmail: () => RegExp;
14
+ /** 手机号(中国大陆 11 位,1 开头,第二位 3-9) */
15
+ export declare const regexpPhone: () => RegExp;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 正则集中维护
3
+ *
4
+ * 约定:
5
+ * 1. 这里只导出「创建正则」的函数,不直接导出正则对象。
6
+ * 2. 正则用字符串 + new RegExp 构造,而不是正则字面量。
7
+ * 字面量会在脚本解析阶段就被引擎校验,一旦用到浏览器不支持的语法(如 lookbehind),
8
+ * 解析期就会抛 SyntaxError,导致整个模块加载失败,调用方的 try/catch 也拦不住;
9
+ * 字符串形式把编译推迟到调用时,异常才能被捕获并降级。
10
+ * 3. 校验方法(src/regexp.ts)只负责调用,不内联正则。
11
+ */
12
+
13
+ /** 邮箱 */
14
+ export var regexpEmail = function regexpEmail() {
15
+ return new RegExp('^[\\w.%+-]+@(?:[\\w-]+\\.)+[a-zA-Z]{2,}$');
16
+ };
17
+
18
+ /** 手机号(中国大陆 11 位,1 开头,第二位 3-9) */
19
+ export var regexpPhone = function regexpPhone() {
20
+ return new RegExp('^1[3-9]\\d{9}$');
21
+ };
package/dist/copy.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import copy from 'copy-to-clipboard';
2
+ export { copy };
package/dist/copy.js ADDED
@@ -0,0 +1,2 @@
1
+ import copy from 'copy-to-clipboard';
2
+ export { copy };
@@ -0,0 +1 @@
1
+ export { default as currency } from 'currency.js';
@@ -0,0 +1 @@
1
+ export { default as currency } from 'currency.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 下载 Blob 对象为文件
3
+ * @param {string} name 文件名
4
+ * @param {Blob} blob Blob 对象
5
+ */
6
+ export declare const downloadBlob: (name: string, blob: Blob) => void;
7
+ export declare const blobToJson: (blob: Blob) => Promise<unknown>;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 下载 Blob 对象为文件
3
+ * @param {string} name 文件名
4
+ * @param {Blob} blob Blob 对象
5
+ */
6
+ export var downloadBlob = function downloadBlob(name, blob) {
7
+ try {
8
+ if ('download' in document.createElement('a')) {
9
+ // 非IE下载
10
+ var elink = document.createElement('a');
11
+ elink.download = name;
12
+ elink.style.display = 'none';
13
+ elink.href = URL.createObjectURL(blob);
14
+ document.body.appendChild(elink);
15
+ elink.click();
16
+ URL.revokeObjectURL(elink.href); // 释放URL 对象
17
+ document.body.removeChild(elink);
18
+ } else {
19
+ var _window;
20
+ // IE10+下载
21
+ // @ts-ignore
22
+ (_window = window) === null || _window === void 0 || (_window = _window.navigator) === null || _window === void 0 || _window.msSaveBlob(blob, name);
23
+ }
24
+ } catch (e) {}
25
+ };
26
+ export var blobToJson = function blobToJson(blob) {
27
+ return new Promise(function (resolve, reject) {
28
+ var reader = new FileReader();
29
+ reader.onload = function () {
30
+ var arrayBuffer = reader.result;
31
+ var decoder = new TextDecoder();
32
+ var jsonString = decoder.decode(arrayBuffer);
33
+ try {
34
+ var jsonData = JSON.parse(jsonString);
35
+ resolve(jsonData);
36
+ } catch (error) {
37
+ reject(error);
38
+ }
39
+ };
40
+ reader.onerror = reject;
41
+ reader.readAsArrayBuffer(blob);
42
+ });
43
+ };
@@ -0,0 +1,2 @@
1
+ import mitt from 'mitt';
2
+ export declare const emitter: typeof mitt;
@@ -0,0 +1,2 @@
1
+ import mitt from 'mitt';
2
+ export var emitter = mitt;
package/dist/env.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare enum Env {
2
+ DEV = "dev",
3
+ TEST = "test",
4
+ PRE = "pre",
5
+ PROD = "prod"
6
+ }
package/dist/env.js ADDED
@@ -0,0 +1,7 @@
1
+ export var Env = /*#__PURE__*/function (Env) {
2
+ Env["DEV"] = "dev";
3
+ Env["TEST"] = "test";
4
+ Env["PRE"] = "pre";
5
+ Env["PROD"] = "prod";
6
+ return Env;
7
+ }({});
@@ -0,0 +1,21 @@
1
+ export * from './lodash';
2
+ export * from './sleep';
3
+ export * from './env';
4
+ export * from './copy';
5
+ export { default as dayjs } from 'dayjs';
6
+ export * from './auth';
7
+ export * from './platform';
8
+ export * from './url';
9
+ export * from './download';
10
+ export * from './emitter';
11
+ export * from './loadResource';
12
+ export * from './json';
13
+ export * from './uuid';
14
+ export * from './size';
15
+ export * from './os';
16
+ export * from './storage';
17
+ export * from './currency';
18
+ export * from './regexp';
19
+ export * from './constant/regexp';
20
+ export * from './constant/os';
21
+ export type { OSType } from './types/os';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ export * from "./lodash";
2
+ export * from "./sleep";
3
+ export * from "./env";
4
+ export * from "./copy";
5
+ export { default as dayjs } from 'dayjs';
6
+ export * from "./auth";
7
+ export * from "./platform";
8
+ export * from "./url";
9
+ export * from "./download";
10
+ export * from "./emitter";
11
+ export * from "./loadResource";
12
+ export * from "./json";
13
+ export * from "./uuid";
14
+ export * from "./size";
15
+ export * from "./os";
16
+ export * from "./storage";
17
+ export * from "./currency";
18
+ export * from "./regexp";
19
+ export * from "./constant/regexp";
20
+ export * from "./constant/os";
package/dist/json.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const tryParse: <T>(value: string, backstop: T) => T;
2
+ export declare const safeString: (data: unknown) => string;
package/dist/json.js ADDED
@@ -0,0 +1,17 @@
1
+ import { isUndefined, isNull } from 'lodash-es';
2
+ export var tryParse = function tryParse(value, backstop) {
3
+ if (isUndefined(value)) {
4
+ return value;
5
+ }
6
+ try {
7
+ return JSON.parse(value);
8
+ } catch (error) {
9
+ return backstop;
10
+ }
11
+ };
12
+ export var safeString = function safeString(data) {
13
+ if (isNull(data) || isUndefined(data)) {
14
+ return '';
15
+ }
16
+ return String(data);
17
+ };
@@ -0,0 +1,4 @@
1
+ type Status = 'loading' | 'ready' | 'error';
2
+ type LoadProps = Record<string, any>;
3
+ export declare const loadResource: (path: string, props?: LoadProps, remove?: boolean) => Promise<Status> | Promise<void>;
4
+ export {};
@@ -0,0 +1,77 @@
1
+ function loadElement(selector, createElement, props, remove, parent) {
2
+ return new Promise(function (resolve, reject) {
3
+ var el = document.querySelector(selector);
4
+ if (!el) {
5
+ var newEl = createElement();
6
+ Object.keys(props).forEach(function (key) {
7
+ // @ts-ignore
8
+ newEl[key] = props[key];
9
+ });
10
+ newEl.setAttribute('data-loaded', 'loading');
11
+ parent.appendChild(newEl);
12
+ newEl.addEventListener('load', function () {
13
+ newEl.setAttribute('data-loaded', 'ready');
14
+ resolve('ready');
15
+ if (remove) {
16
+ parent.removeChild(newEl);
17
+ }
18
+ });
19
+ newEl.addEventListener('error', function () {
20
+ newEl.setAttribute('data-loaded', 'error');
21
+ reject('error');
22
+ if (remove) {
23
+ parent.removeChild(newEl);
24
+ }
25
+ });
26
+ } else {
27
+ if (el.getAttribute('data-loaded') === 'ready') {
28
+ resolve('ready');
29
+ return;
30
+ }
31
+ el.addEventListener('load', function () {
32
+ resolve('ready');
33
+ });
34
+ el.addEventListener('error', function () {
35
+ resolve('error');
36
+ });
37
+ }
38
+ });
39
+ }
40
+ var loadScript = function loadScript(path, props, remove) {
41
+ return loadElement("script[src=\"".concat(path, "\"][data-loaded]"), function () {
42
+ var script = document.createElement('script');
43
+ script.src = path;
44
+ return script;
45
+ }, props, remove, document.body);
46
+ };
47
+ var loadCss = function loadCss(path, props, remove) {
48
+ return loadElement("link[href=\"".concat(path, "\"][data-loaded]"), function () {
49
+ var link = document.createElement('link');
50
+ link.rel = 'stylesheet';
51
+ link.href = path;
52
+ // IE9+
53
+ var isLegacyIECss = ('hideFocus' in link);
54
+ // use preload in IE Edge (to detect load errors)
55
+ if (isLegacyIECss && link.relList) {
56
+ link.rel = 'preload';
57
+ // @ts-ignore
58
+ link.as = 'style';
59
+ }
60
+ return link;
61
+ }, props, remove, document.head);
62
+ };
63
+
64
+ // 默认判断为js,仅后缀是.css的才认为是css
65
+ export var loadResource = function loadResource(path) {
66
+ var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
67
+ var remove = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
68
+ if (!path) {
69
+ return Promise.resolve();
70
+ }
71
+ var pathname = path.replace(/[|#].*$/, '');
72
+ if (/(^css!|\.css$)/.test(pathname)) {
73
+ return loadCss(path, props || {}, remove);
74
+ } else {
75
+ return loadScript(path, props || {}, remove);
76
+ }
77
+ };
@@ -0,0 +1,4 @@
1
+ export * from 'lodash-es';
2
+ export declare const isObject: (item: any) => boolean;
3
+ export declare const isNumber: (value: any) => boolean;
4
+ export declare const isEmpty: (obj: any) => boolean;
package/dist/lodash.js ADDED
@@ -0,0 +1,23 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ /* eslint-disable import/export */
3
+ export * from 'lodash-es';
4
+
5
+ // 覆写一些lodash方法
6
+ export var isObject = function isObject(item) {
7
+ return item !== null && _typeof(item) === 'object' && !Array.isArray(item);
8
+ };
9
+ export var isNumber = function isNumber(value) {
10
+ return typeof value === 'number' && !isNaN(value) && Math.abs(value) !== Infinity;
11
+ };
12
+ export var isEmpty = function isEmpty(obj) {
13
+ if (!obj && obj !== 0 && obj !== false) {
14
+ return true;
15
+ }
16
+ if (Object.prototype.toString.call(obj) === '[object Array]' && obj.length === 0) {
17
+ return true;
18
+ }
19
+ if (Object.prototype.toString.call(obj) === '[object Object]' && Object.keys(obj).length === 0) {
20
+ return true;
21
+ }
22
+ return false;
23
+ };