@pawover/kit 0.0.0-beta.4 → 0.0.0-beta.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/enums-BL6w5-mS.js +148 -0
  2. package/dist/enums-BL6w5-mS.js.map +1 -0
  3. package/dist/enums.d.ts +2 -25
  4. package/dist/enums.js +2 -24
  5. package/dist/except-MacUK44u.d.ts +971 -0
  6. package/dist/except-MacUK44u.d.ts.map +1 -0
  7. package/dist/hooks-alova.d.ts +22 -13
  8. package/dist/hooks-alova.d.ts.map +1 -1
  9. package/dist/hooks-alova.js +54 -24
  10. package/dist/hooks-alova.js.map +1 -1
  11. package/dist/hooks-react.d.ts +82 -42
  12. package/dist/hooks-react.d.ts.map +1 -1
  13. package/dist/hooks-react.js +83 -260
  14. package/dist/hooks-react.js.map +1 -1
  15. package/dist/index-Bn_PNnsM.d.ts +212 -0
  16. package/dist/index-Bn_PNnsM.d.ts.map +1 -0
  17. package/dist/index-DBPmnr4a.d.ts +21 -0
  18. package/dist/index-DBPmnr4a.d.ts.map +1 -0
  19. package/dist/index.d.ts +1958 -1029
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +2 -1430
  22. package/dist/patches-fetchEventSource.d.ts +2 -721
  23. package/dist/patches-fetchEventSource.d.ts.map +1 -1
  24. package/dist/patches-fetchEventSource.js +1 -114
  25. package/dist/patches-fetchEventSource.js.map +1 -1
  26. package/dist/utils-_dtCs-qa.js +2004 -0
  27. package/dist/utils-_dtCs-qa.js.map +1 -0
  28. package/dist/value-of-DUmTbnuw.d.ts +26 -0
  29. package/dist/value-of-DUmTbnuw.d.ts.map +1 -0
  30. package/dist/vite.d.ts.map +1 -1
  31. package/dist/vite.js.map +1 -1
  32. package/dist/zod.d.ts +8 -1
  33. package/dist/zod.d.ts.map +1 -1
  34. package/dist/zod.js +13 -1
  35. package/dist/zod.js.map +1 -1
  36. package/metadata.json +31 -9
  37. package/package.json +31 -23
  38. package/dist/enums.d.ts.map +0 -1
  39. package/dist/enums.js.map +0 -1
  40. package/dist/index.js.map +0 -1
@@ -1,172 +1,14 @@
1
- import { useEffect, useRef, useState } from "react";
1
+ import { Ft as isEqual, H as isBrowser, Vt as isFunction, W as arrayZipToObject, _t as isPromiseLike, mt as isString, w as objectAssign, x as objectKeys } from "./utils-_dtCs-qa.js";
2
+ import { i as BREAK_POINT_TOKEN_ENUM } from "./enums-BL6w5-mS.js";
3
+ import { useEffect, useMemo, useRef, useState } from "react";
2
4
 
3
- //#region src/utils/typeof/types.ts
4
- const PROTOTYPE_TAGS = {
5
- abortSignal: "[object AbortSignal]",
6
- array: "[object Array]",
7
- asyncFunction: "[object AsyncFunction]",
8
- asyncGeneratorFunction: "[object AsyncGeneratorFunction]",
9
- bigInt: "[object BigInt]",
10
- blob: "[object Blob]",
11
- boolean: "[object Boolean]",
12
- date: "[object Date]",
13
- error: "[object Error]",
14
- file: "[object File]",
15
- function: "[object Function]",
16
- generatorFunction: "[object GeneratorFunction]",
17
- map: "[object Map]",
18
- null: "[object Null]",
19
- number: "[object Number]",
20
- object: "[object Object]",
21
- promise: "[object Promise]",
22
- readableStream: "[object ReadableStream]",
23
- regExp: "[object RegExp]",
24
- set: "[object Set]",
25
- string: "[object String]",
26
- symbol: "[object Symbol]",
27
- undefined: "[object Undefined]",
28
- URLSearchParams: "[object URLSearchParams]",
29
- weakMap: "[object WeakMap]",
30
- weakSet: "[object WeakSet]",
31
- webSocket: "[object WebSocket]",
32
- window: "[object Window]"
33
- };
34
- function resolvePrototypeString(value) {
35
- return Object.prototype.toString.call(value);
36
- }
37
-
38
- //#endregion
39
- //#region src/utils/typeof/isBoolean.ts
40
- function isBoolean(value) {
41
- return typeof value === "boolean";
42
- }
43
-
44
- //#endregion
45
- //#region src/utils/typeof/isObject.ts
46
- /**
47
- * 判断是否为对象类型
48
- * - 可选是否检查原型为 `Object.prototype`,防止原型链污染
49
- *
50
- * @param value 待检查值
51
- * @param prototypeCheck 是否进行原型检查,默认 `true`
52
- */
53
- function isObject(value, prototypeCheck = true) {
54
- const check = resolvePrototypeString(value) === PROTOTYPE_TAGS.object;
55
- return prototypeCheck ? check && Object.getPrototypeOf(value) === Object.prototype : check;
56
- }
57
-
58
- //#endregion
59
- //#region src/utils/typeof/isDate.ts
60
- function isDate(value) {
61
- if (!isObject(value)) return false;
62
- try {
63
- return resolvePrototypeString(value) === PROTOTYPE_TAGS.date && typeof value["getTime"] === "function";
64
- } catch (error) {
65
- return false;
66
- }
67
- }
68
-
69
- //#endregion
70
- //#region src/utils/typeof/isEqual.ts
71
- /**
72
- * 检查给定的值是否相等
73
- * @reference https://github.com/radashi-org/radashi/blob/main/src/typed/isEqual.ts
74
- *
75
- * @param {T} x
76
- * @param {T} y
77
- */
78
- function isEqual(x, y) {
79
- if (Object.is(x, y)) return true;
80
- if (isDate(x) && isDate(y)) return x.getTime() === y.getTime();
81
- if (isRegExp(x) && isRegExp(y)) return x.toString() === y.toString();
82
- if (typeof x !== "object" || x === null || typeof y !== "object" || y === null) return false;
83
- const keysX = Reflect.ownKeys(x);
84
- const keysY = Reflect.ownKeys(y);
85
- if (keysX.length !== keysY.length) return false;
86
- for (const key of keysX) {
87
- if (!Reflect.has(y, key)) return false;
88
- if (!isEqual(x[key], y[key])) return false;
89
- }
90
- return true;
91
- }
92
-
93
- //#endregion
94
- //#region src/utils/typeof/isFunction.ts
95
- function isFunction(value) {
96
- return typeof value === "function";
97
- }
98
-
99
- //#endregion
100
- //#region src/utils/typeof/isPromise.ts
101
- function isPromise(value) {
102
- return resolvePrototypeString(value) === PROTOTYPE_TAGS.promise;
103
- }
104
- function isPromiseLike(value) {
105
- return isPromise(value) || isObject(value) && isFunction(value["then"]);
106
- }
107
-
108
- //#endregion
109
- //#region src/utils/typeof/isRegExp.ts
110
- function isRegExp(value) {
111
- if (!isObject(value)) return false;
112
- try {
113
- const regex = value;
114
- return resolvePrototypeString(value) === PROTOTYPE_TAGS.regExp && isString(regex.source) && isString(regex.flags) && isBoolean(regex.global) && isFunction(regex.test);
115
- } catch (error) {
116
- return false;
117
- }
118
- }
119
-
120
- //#endregion
121
- //#region src/utils/typeof/isString.ts
122
- /**
123
- * 检查 value 是否为 string 类型
124
- *
125
- * @param value 待检查值
126
- * @param checkEmpty 是否排除空字符串
127
- */
128
- function isString(value, checkEmpty = false) {
129
- return typeof value === "string" && (!checkEmpty || !!value.length);
130
- }
131
-
132
- //#endregion
133
- //#region src/utils/object/objectKeys.ts
134
- /**
135
- * 返回对象的可枚举属性和方法的名称
136
- * - `Object.keys` 始终返回 `string[]` 类型,此函数可以返回具体类型
137
- *
138
- * @param obj 对象
139
- */
140
- function objectKeys(obj) {
141
- return Object.keys(obj);
142
- }
143
-
144
- //#endregion
145
- //#region src/utils/object/objectAssign.ts
146
- /**
147
- * 递归地将第二个对象合并到第一个对象的副本中
148
- * - 只有普通对象才会递归合并
149
- *
150
- * @param initial 初始对象
151
- * @param override 待合并对象
152
- */
153
- function objectAssign(initial, override) {
154
- if (!isObject(initial) || !isObject(override)) return initial ?? override ?? {};
155
- const proto = Object.getPrototypeOf(initial);
156
- const assigned = proto ? { ...initial } : Object.assign(Object.create(proto), initial);
157
- for (const key of Object.keys(override)) assigned[key] = isObject(initial[key]) && isObject(override[key]) ? objectAssign(initial[key], override[key]) : override[key];
158
- return assigned;
159
- }
160
-
161
- //#endregion
162
5
  //#region src/hooks/react/useCreation.ts
163
6
  /**
164
7
  * useCreation
165
8
  * @reference https://ahooks.js.org/zh-CN/hooks/use-creation
166
9
  *
167
- * @template T
168
- * @param {() => T} factory
169
- * @param {DependencyList} deps
10
+ * @param factory
11
+ * @param deps
170
12
  */
171
13
  function useCreation(factory, deps) {
172
14
  const { current } = useRef({
@@ -188,8 +30,7 @@ function useCreation(factory, deps) {
188
30
  * 返回当前最新值的 Hook
189
31
  * @reference https://ahooks.js.org/zh-CN/hooks/use-latest
190
32
  *
191
- * @template T
192
- * @param {T} value
33
+ * @param value
193
34
  */
194
35
  function useLatest(value) {
195
36
  const ref = useRef(value);
@@ -202,122 +43,76 @@ function useLatest(value) {
202
43
  /**
203
44
  * 在组件初始化时执行的 Hook
204
45
  * - 即使在严格模式下也只执行一次
205
- * @reference https://ahooks.js.org/hooks/use-mount
206
46
  *
207
- * @param {MountCallback} effect 副作用函数
47
+ * @param effect 副作用函数
208
48
  */
209
49
  function useMount(effect) {
210
- if (!isFunction(effect)) console.error(`useMount expected parameter is a function, but got ${typeof effect}`);
211
50
  const isMountedRef = useRef(false);
212
51
  const effectRef = useLatest(effect);
213
52
  useEffect(() => {
53
+ if (!isFunction(effectRef.current)) console.error(`useMount expected parameter is a function, but got ${typeof effectRef.current}`);
214
54
  if (isMountedRef.current) return;
215
55
  isMountedRef.current = true;
216
56
  const result = effectRef.current?.();
217
57
  if (isPromiseLike(result)) return;
218
58
  return result;
219
- }, []);
59
+ }, [effectRef]);
220
60
  }
221
61
 
222
- //#endregion
223
- //#region src/enums/grid.ts
224
- /** 屏幕响应断点 token 配置 */
225
- const BREAK_POINT_TOKEN_ENUM = {
226
- XS: 576,
227
- XSMin: 576,
228
- XSMax: 767,
229
- SM: 768,
230
- SMMin: 768,
231
- SMMax: 991,
232
- MD: 992,
233
- MDMin: 992,
234
- MDMax: 1199,
235
- LG: 1200,
236
- LGMin: 1200,
237
- LGMax: 1599,
238
- XL: 1600,
239
- XLMin: 1600,
240
- XLMax: 1919,
241
- XXL: 1920,
242
- XXLMin: 1920
243
- };
244
-
245
62
  //#endregion
246
63
  //#region src/hooks/react/useResponsive.ts
247
- const subscriberList = /* @__PURE__ */ new Set();
248
- const { XS, SM, MD, LG, XL, XXL } = BREAK_POINT_TOKEN_ENUM;
249
- const defaultResponsiveValues = {
250
- xxl: false,
251
- xl: false,
252
- lg: false,
253
- md: false,
254
- sm: false,
255
- xs: false
256
- };
257
- let responsiveConfig = {
258
- xxl: XXL,
259
- xl: XL,
260
- lg: LG,
261
- md: MD,
262
- sm: SM,
263
- xs: XS
264
- };
265
- let responsiveValues = { ...defaultResponsiveValues };
64
+ const tuple = [
65
+ "xxxl",
66
+ "xxl",
67
+ "xl",
68
+ "lg",
69
+ "md",
70
+ "sm",
71
+ "xs"
72
+ ];
73
+ const TUPLE = [
74
+ "XXXL",
75
+ "XXL",
76
+ "XL",
77
+ "LG",
78
+ "MD",
79
+ "SM",
80
+ "XS"
81
+ ];
82
+ const defaultValues = arrayZipToObject(tuple, tuple.map(() => false));
266
83
  function useResponsive(options) {
267
- const { compactBreakPoint = "xl", breakPointTokens = {} } = options || {};
268
- const tokens = objectAssign(BREAK_POINT_TOKEN_ENUM, breakPointTokens);
269
- responsiveConfig = {
270
- xxl: tokens.XXL,
271
- xl: tokens.XL,
272
- lg: tokens.LG,
273
- md: tokens.MD,
274
- sm: tokens.SM,
275
- xs: tokens.XS
276
- };
277
- calculate();
278
- const [responsive, setResponsive] = useState(responsiveValues);
279
- const isCompact = !responsive[compactBreakPoint];
280
- const current = objectKeys(defaultResponsiveValues).find((key) => responsive[key] === true) || "xs";
84
+ const { breakPointTokens = {} } = options || {};
85
+ const responsiveValuesRef = useRef({ ...defaultValues });
86
+ const [responsive, setResponsive] = useState({ ...defaultValues });
87
+ const tokens = useMemo(() => objectAssign(BREAK_POINT_TOKEN_ENUM, breakPointTokens), [breakPointTokens]);
88
+ const current = objectKeys(responsive).find((key) => responsive[key] === true) || "xs";
281
89
  useEffect(() => {
282
- addListener();
283
- const subscriber = () => {
284
- setResponsive(responsiveValues);
285
- };
286
- subscriberList.add(subscriber);
90
+ function calculate() {
91
+ const newValues = { ...defaultValues };
92
+ const responsiveConfig = arrayZipToObject(tuple, TUPLE.map((t) => tokens[t]));
93
+ let shouldUpdate = false;
94
+ for (const key of tuple) {
95
+ newValues[key] = window.innerWidth >= responsiveConfig[key];
96
+ if (newValues[key] !== responsiveValuesRef.current[key]) shouldUpdate = true;
97
+ }
98
+ if (shouldUpdate) responsiveValuesRef.current = newValues;
99
+ }
100
+ function resizeListener() {
101
+ const oldInfo = responsiveValuesRef.current;
102
+ calculate();
103
+ if (oldInfo !== responsiveValuesRef.current) setResponsive(responsiveValuesRef.current);
104
+ }
105
+ window.addEventListener("resize", resizeListener);
287
106
  return () => {
288
- subscriberList.delete(subscriber);
289
- if (subscriberList.size === 0) removeListener();
107
+ window.removeEventListener("resize", resizeListener);
290
108
  };
291
- }, []);
109
+ }, [tokens]);
292
110
  return {
293
111
  responsive,
294
112
  current,
295
- isCompact,
296
113
  breakPointTokens: tokens
297
114
  };
298
115
  }
299
- function resizeListener() {
300
- const oldInfo = responsiveValues;
301
- calculate();
302
- if (oldInfo === responsiveValues) return;
303
- for (const subscriber of subscriberList) subscriber();
304
- }
305
- function addListener() {
306
- window.addEventListener("resize", resizeListener);
307
- }
308
- function removeListener() {
309
- window.removeEventListener("resize", resizeListener);
310
- }
311
- function calculate() {
312
- const width = window.innerWidth;
313
- const newValues = { ...defaultResponsiveValues };
314
- let shouldUpdate = false;
315
- for (const key of objectKeys(responsiveConfig)) {
316
- newValues[key] = width >= responsiveConfig[key];
317
- if (newValues[key] !== responsiveValues[key]) shouldUpdate = true;
318
- }
319
- if (shouldUpdate) responsiveValues = newValues;
320
- }
321
116
 
322
117
  //#endregion
323
118
  //#region src/hooks/react/useUnmount.ts
@@ -325,16 +120,44 @@ function calculate() {
325
120
  * 在组件卸载时执行的 Hook
326
121
  * @reference https://ahooks.js.org/zh-CN/hooks/use-unmount
327
122
  *
328
- * @param {AnyFunction} effect 副作用函数
123
+ * @param effect 副作用函数
329
124
  */
330
125
  function useUnmount(effect) {
331
- if (!isFunction(effect)) console.error(`useUnmount expected parameter is a function, got ${typeof effect}`);
332
126
  const effectRef = useLatest(effect);
333
127
  useEffect(() => () => {
128
+ if (!isFunction(effectRef.current)) {
129
+ console.error(`useUnmount expected parameter is a function, but got ${typeof effectRef.current}`);
130
+ return;
131
+ }
334
132
  effectRef.current?.();
335
- }, []);
133
+ }, [effectRef]);
134
+ }
135
+
136
+ //#endregion
137
+ //#region src/hooks/react/useTitle.ts
138
+ /**
139
+ * 设置页面标题
140
+ * - 轻量级,适用于无路由库时设置页面标题
141
+ * - 多个 `useTitle` 实例会互相干扰,需在顶层组件使用
142
+ * - 无法处理 `document.title` 固有的竞态问题
143
+ *
144
+ * @param title 页面标题
145
+ * @param options 配置选项
146
+ */
147
+ function useTitle(title, options) {
148
+ const titleRef = useRef(isBrowser() ? document.title : "");
149
+ useEffect(() => {
150
+ if (!isString(title)) {
151
+ console.error(`useTitle expected title is a string, but got ${typeof title}`);
152
+ return;
153
+ }
154
+ if (isBrowser()) document.title = title;
155
+ }, [title]);
156
+ useUnmount(() => {
157
+ if (isBrowser() && options?.isRestoreOnUnmount) document.title = titleRef.current;
158
+ });
336
159
  }
337
160
 
338
161
  //#endregion
339
- export { useCreation, useLatest, useMount, useResponsive, useUnmount };
162
+ export { useCreation, useLatest, useMount, useResponsive, useTitle, useUnmount };
340
163
  //# sourceMappingURL=hooks-react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-react.js","names":["defaultResponsiveValues: ResponsiveValues","responsiveConfig: ResponsiveConfig","responsiveValues: ResponsiveValues","tokens: BREAK_POINT_TOKEN_TYPE"],"sources":["../src/utils/typeof/types.ts","../src/utils/typeof/isBoolean.ts","../src/utils/typeof/isObject.ts","../src/utils/typeof/isDate.ts","../src/utils/typeof/isEqual.ts","../src/utils/typeof/isFunction.ts","../src/utils/typeof/isPromise.ts","../src/utils/typeof/isRegExp.ts","../src/utils/typeof/isString.ts","../src/utils/object/objectKeys.ts","../src/utils/object/objectAssign.ts","../src/hooks/react/useCreation.ts","../src/hooks/react/useLatest.ts","../src/hooks/react/useMount.ts","../src/enums/grid.ts","../src/hooks/react/useResponsive.ts","../src/hooks/react/useUnmount.ts"],"sourcesContent":["export const PROTOTYPE_TAGS = {\n abortSignal: \"[object AbortSignal]\",\n array: \"[object Array]\",\n asyncFunction: \"[object AsyncFunction]\",\n asyncGeneratorFunction: \"[object AsyncGeneratorFunction]\",\n bigInt: \"[object BigInt]\",\n blob: \"[object Blob]\",\n boolean: \"[object Boolean]\",\n date: \"[object Date]\",\n error: \"[object Error]\",\n file: \"[object File]\",\n function: \"[object Function]\",\n generatorFunction: \"[object GeneratorFunction]\",\n map: \"[object Map]\",\n null: \"[object Null]\",\n number: \"[object Number]\",\n object: \"[object Object]\",\n promise: \"[object Promise]\",\n readableStream: \"[object ReadableStream]\",\n regExp: \"[object RegExp]\",\n set: \"[object Set]\",\n string: \"[object String]\",\n symbol: \"[object Symbol]\",\n undefined: \"[object Undefined]\",\n URLSearchParams: \"[object URLSearchParams]\",\n weakMap: \"[object WeakMap]\",\n weakSet: \"[object WeakSet]\",\n webSocket: \"[object WebSocket]\",\n window: \"[object Window]\",\n} as const;\n\nexport const TYPED_ARRAY_TAGS = new Set([\n \"[object Int8Array]\",\n \"[object Uint8Array]\",\n \"[object Uint8ClampedArray]\",\n \"[object Int16Array]\",\n \"[object Uint16Array]\",\n \"[object Int32Array]\",\n \"[object Uint32Array]\",\n \"[object Float32Array]\",\n \"[object Float64Array]\",\n \"[object BigInt64Array]\",\n \"[object BigUint64Array]\",\n]);\n\nexport function resolvePrototypeString(value: unknown) {\n return Object.prototype.toString.call(value);\n}\n","export function isBoolean(value: unknown): value is boolean {\n return typeof value === \"boolean\";\n}\n","import { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\n/**\n * 判断是否为对象类型\n * - 可选是否检查原型为 `Object.prototype`,防止原型链污染\n *\n * @param value 待检查值\n * @param prototypeCheck 是否进行原型检查,默认 `true`\n */\nexport function isObject(value: unknown, prototypeCheck = true): value is Record<PropertyKey, unknown> {\n const check = resolvePrototypeString(value) === PROTOTYPE_TAGS.object;\n\n return prototypeCheck ? check && Object.getPrototypeOf(value) === Object.prototype : check;\n}\n","import { isObject } from \"./isObject\";\nimport { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\nexport function isDate(value: unknown): value is Date {\n if (!isObject(value)) {\n return false;\n }\n\n try {\n return resolvePrototypeString(value) === PROTOTYPE_TAGS.date && typeof (value)[\"getTime\"] === \"function\";\n } catch (error) {\n return false;\n }\n}\n","import { isDate, isRegExp } from \".\";\n\n/**\n * 检查给定的值是否相等\n * @reference https://github.com/radashi-org/radashi/blob/main/src/typed/isEqual.ts\n *\n * @param {T} x\n * @param {T} y\n */\nexport function isEqual<T>(x: T, y: T): boolean {\n if (Object.is(x, y)) {\n return true;\n }\n if (isDate(x) && isDate(y)) {\n return x.getTime() === y.getTime();\n }\n if (isRegExp(x) && isRegExp(y)) {\n return x.toString() === y.toString();\n }\n if (typeof x !== \"object\" || x === null || typeof y !== \"object\" || y === null) {\n return false;\n }\n\n const keysX = Reflect.ownKeys(x) as (keyof typeof x)[];\n const keysY = Reflect.ownKeys(y);\n if (keysX.length !== keysY.length) {\n return false;\n }\n\n for (const key of keysX) {\n if (!Reflect.has(y, key)) {\n return false;\n }\n if (!isEqual(x[key], y[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\nexport function isFunction(value: unknown): value is AnyFunction {\n return typeof value === \"function\";\n}\n\nexport function isAsyncFunction(value: unknown): value is AnyAsyncFunction {\n return isFunction(value) && resolvePrototypeString(value) === PROTOTYPE_TAGS.asyncFunction;\n}\n\nexport function isGeneratorFunction(value: unknown): value is AnyGeneratorFunction {\n return isFunction(value) && resolvePrototypeString(value) === PROTOTYPE_TAGS.generatorFunction;\n}\n\nexport function isAsyncGeneratorFunction(value: unknown): value is AnyAsyncGeneratorFunction {\n return isFunction(value) && resolvePrototypeString(value) === PROTOTYPE_TAGS.asyncGeneratorFunction;\n}\n","import { isFunction } from \"./isFunction\";\nimport { isObject } from \"./isObject\";\nimport { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\nexport function isPromise(value: unknown): value is Promise<unknown> {\n return resolvePrototypeString(value) === PROTOTYPE_TAGS.promise;\n}\n\nexport function isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return isPromise(value) || (isObject(value) && isFunction(value[\"then\"]));\n}\n","import { isBoolean, isFunction, isObject, isString } from \".\";\nimport { PROTOTYPE_TAGS, resolvePrototypeString } from \"./types\";\n\nexport function isRegExp(value: unknown): value is RegExp {\n if (!isObject(value)) {\n return false;\n }\n\n try {\n const regex = value as unknown as RegExp;\n\n return (\n resolvePrototypeString(value) === PROTOTYPE_TAGS.regExp &&\n isString(regex.source) &&\n isString(regex.flags) &&\n isBoolean(regex.global) &&\n isFunction(regex.test)\n );\n } catch (error) {\n return false;\n }\n}\n","/**\n * 检查 value 是否为 string 类型\n *\n * @param value 待检查值\n * @param checkEmpty 是否排除空字符串\n */\nexport function isString(value: unknown, checkEmpty = false): value is string {\n return typeof value === \"string\" && (!checkEmpty || !!value.length);\n}\n","/**\n * 返回对象的可枚举属性和方法的名称\n * - `Object.keys` 始终返回 `string[]` 类型,此函数可以返回具体类型\n *\n * @param obj 对象\n */\nexport function objectKeys<O extends AnyObject>(obj: O): (keyof O)[] {\n return Object.keys(obj);\n}\n","import type { Assign } from \"radashi\";\nimport { isObject } from \"../typeof\";\n\n/**\n * 递归地将第二个对象合并到第一个对象的副本中\n * - 只有普通对象才会递归合并\n *\n * @param initial 初始对象\n * @param override 待合并对象\n */\nexport function objectAssign<I extends PlainObject, O extends PlainObject>(initial: I, override: O): Assign<I, O> {\n if (!isObject(initial) || !isObject(override)) {\n return (initial ?? override ?? {}) as Assign<I, O>;\n }\n\n const proto = Object.getPrototypeOf(initial);\n const assigned = proto ? { ...initial } : Object.assign(Object.create(proto), initial);\n\n for (const key of Object.keys(override)) {\n assigned[key] = isObject(initial[key]) && isObject(override[key]) ? objectAssign(initial[key], override[key]) : override[key];\n }\n\n return assigned;\n}\n","import { useRef, type DependencyList } from \"react\";\nimport { isEqual } from \"src/utils\";\n\ninterface RefObject<T> {\n deps: DependencyList;\n result: T;\n isInitialized: boolean;\n}\n\n/**\n * useCreation\n * @reference https://ahooks.js.org/zh-CN/hooks/use-creation\n *\n * @template T\n * @param {() => T} factory\n * @param {DependencyList} deps\n */\nexport function useCreation<T>(factory: () => T, deps: DependencyList) {\n const { current } = useRef<RefObject<T>>({ deps, result: undefined!, isInitialized: false });\n\n if (current.isInitialized === false || !isEqual(current.deps, deps)) {\n current.deps = deps;\n current.result = factory();\n current.isInitialized = true;\n }\n\n return current.result;\n}\n\n","import { useRef, type RefObject } from \"react\";\n\n/**\n * 返回当前最新值的 Hook\n * @reference https://ahooks.js.org/zh-CN/hooks/use-latest\n *\n * @template T\n * @param {T} value\n */\nexport function useLatest<T>(value: T): RefObject<T> {\n const ref = useRef(value);\n ref.current = value;\n\n return ref;\n}\n\n","import { useEffect, useRef, type EffectCallback } from \"react\";\nimport { isFunction, isPromiseLike } from \"src/utils\";\nimport { useLatest } from \"./useLatest\";\n\ntype MountCallback = EffectCallback | AnyAsyncFunction;\n\n/**\n * 在组件初始化时执行的 Hook\n * - 即使在严格模式下也只执行一次\n * @reference https://ahooks.js.org/hooks/use-mount\n *\n * @param {MountCallback} effect 副作用函数\n */\nexport function useMount(effect: MountCallback) {\n if (!isFunction(effect)) {\n console.error(`useMount expected parameter is a function, but got ${typeof effect}`);\n }\n\n const isMountedRef = useRef(false);\n const effectRef = useLatest(effect);\n\n useEffect(() => {\n if (isMountedRef.current) {\n return;\n }\n\n isMountedRef.current = true;\n const result = effectRef.current?.();\n // If fn returns a Promise, don't return it as cleanup function\n if (isPromiseLike(result)) {\n return;\n }\n\n return result as ReturnType<EffectCallback>;\n }, []);\n}\n\n","export type BREAK_POINT_TOKEN_TYPE = Record<keyof typeof BREAK_POINT_TOKEN_ENUM, number>;\n/** 屏幕响应断点 token 配置 */\nexport const BREAK_POINT_TOKEN_ENUM = {\n XS: 576,\n XSMin: 576,\n XSMax: 767,\n SM: 768,\n SMMin: 768,\n SMMax: 991,\n MD: 992,\n MDMin: 992,\n MDMax: 1199,\n LG: 1200,\n LGMin: 1200,\n LGMax: 1599,\n XL: 1600,\n XLMin: 1600,\n XLMax: 1919,\n XXL: 1920,\n XXLMin: 1920,\n} as const;\n","import { useEffect, useState } from \"react\";\nimport { BREAK_POINT_TOKEN_ENUM, type BREAK_POINT_TOKEN_TYPE } from \"src/enums\";\nimport { objectAssign, objectKeys } from \"src/utils\";\n\ntype Breakpoint = \"xxl\" | \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\ntype Subscriber = () => void;\ntype ResponsiveConfig = Record<Breakpoint, number>;\ntype ResponsiveValues = Record<Breakpoint, boolean>;\n\nconst subscriberList = new Set<Subscriber>();\nconst { XS, SM, MD, LG, XL, XXL } = BREAK_POINT_TOKEN_ENUM;\nconst defaultResponsiveValues: ResponsiveValues = { xxl: false, xl: false, lg: false, md: false, sm: false, xs: false };\nlet responsiveConfig: ResponsiveConfig = { xxl: XXL, xl: XL, lg: LG, md: MD, sm: SM, xs: XS };\nlet responsiveValues: ResponsiveValues = { ...defaultResponsiveValues };\n\nexport interface ResponsiveHookOptions {\n /**\n * 紧凑布局断点\n * - 低于此断点时使用紧凑布局\n * @default \"xl\"\n */\n compactBreakPoint?: Breakpoint;\n /** 屏幕响应断点 token 配置 */\n breakPointTokens?: BREAK_POINT_TOKEN_TYPE;\n}\nexport function useResponsive(options?: ResponsiveHookOptions) {\n const { compactBreakPoint = \"xl\", breakPointTokens = {} } = options || {};\n const tokens: BREAK_POINT_TOKEN_TYPE = objectAssign(BREAK_POINT_TOKEN_ENUM, breakPointTokens);\n responsiveConfig = { xxl: tokens.XXL, xl: tokens.XL, lg: tokens.LG, md: tokens.MD, sm: tokens.SM, xs: tokens.XS };\n\n calculate();\n\n const [responsive, setResponsive] = useState<ResponsiveValues>(responsiveValues);\n const isCompact = !responsive[compactBreakPoint];\n const current = objectKeys(defaultResponsiveValues).find((key) => responsive[key] === true) || \"xs\";\n\n useEffect(() => {\n addListener();\n\n const subscriber = () => {\n setResponsive(responsiveValues);\n };\n\n subscriberList.add(subscriber);\n\n return () => {\n subscriberList.delete(subscriber);\n\n if (subscriberList.size === 0) {\n removeListener();\n }\n };\n }, []);\n\n return { responsive, current, isCompact, breakPointTokens: tokens };\n}\n\nfunction resizeListener() {\n const oldInfo = responsiveValues;\n calculate();\n\n if (oldInfo === responsiveValues) {\n return;\n }\n\n for (const subscriber of subscriberList) {\n subscriber();\n }\n}\nfunction addListener() {\n window.addEventListener(\"resize\", resizeListener);\n}\nfunction removeListener() {\n window.removeEventListener(\"resize\", resizeListener);\n}\nfunction calculate() {\n const width = window.innerWidth;\n const newValues = { ...defaultResponsiveValues };\n let shouldUpdate = false;\n\n for (const key of objectKeys(responsiveConfig)) {\n newValues[key] = width >= responsiveConfig[key];\n if (newValues[key] !== responsiveValues[key]) {\n shouldUpdate = true;\n }\n }\n if (shouldUpdate) {\n responsiveValues = newValues;\n }\n}\n\n","import { useEffect } from \"react\";\nimport { isFunction } from \"src/utils\";\nimport { useLatest } from \"./useLatest\";\n\n/**\n * 在组件卸载时执行的 Hook\n * @reference https://ahooks.js.org/zh-CN/hooks/use-unmount\n *\n * @param {AnyFunction} effect 副作用函数\n */\nexport function useUnmount(effect: AnyFunction) {\n if (!isFunction(effect)) {\n console.error(`useUnmount expected parameter is a function, got ${typeof effect}`);\n }\n\n const effectRef = useLatest(effect);\n\n useEffect(\n () => () => {\n effectRef.current?.();\n },\n [],\n );\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"hooks-react.js","names":["defaultValues: ResponsiveValues","tokens: BREAK_POINT_TOKEN_TYPE"],"sources":["../src/hooks/react/useCreation.ts","../src/hooks/react/useLatest.ts","../src/hooks/react/useMount.ts","../src/hooks/react/useResponsive.ts","../src/hooks/react/useUnmount.ts","../src/hooks/react/useTitle.ts"],"sourcesContent":["import { useRef, type DependencyList } from \"react\";\nimport { isEqual } from \"src/utils\";\n\ninterface RefObject<T> {\n deps: DependencyList;\n result: T;\n isInitialized: boolean;\n}\n\n/**\n * useCreation\n * @reference https://ahooks.js.org/zh-CN/hooks/use-creation\n *\n * @param factory\n * @param deps\n */\nexport function useCreation<T> (factory: () => T, deps: DependencyList) {\n const { current } = useRef<RefObject<T>>({ deps, result: undefined!, isInitialized: false });\n\n if (current.isInitialized === false || !isEqual(current.deps, deps)) {\n current.deps = deps;\n current.result = factory();\n current.isInitialized = true;\n }\n\n return current.result;\n}\n","import { useRef, type RefObject } from \"react\";\n\n/**\n * 返回当前最新值的 Hook\n * @reference https://ahooks.js.org/zh-CN/hooks/use-latest\n *\n * @param value\n */\nexport function useLatest<T> (value: T): RefObject<T> {\n const ref = useRef(value);\n // eslint-disable-next-line react-x/refs\n ref.current = value;\n\n return ref;\n}\n","import type { AnyAsyncFunction } from \"@pawover/types\";\nimport { useEffect, useRef, type EffectCallback } from \"react\";\nimport { isFunction, isPromiseLike } from \"src/utils\";\nimport { useLatest } from \"./useLatest\";\n\ntype MountCallback = EffectCallback | AnyAsyncFunction;\n\n/**\n * 在组件初始化时执行的 Hook\n * - 即使在严格模式下也只执行一次\n *\n * @param effect 副作用函数\n */\nexport function useMount (effect: MountCallback) {\n const isMountedRef = useRef(false);\n const effectRef = useLatest(effect);\n\n useEffect(() => {\n if (!isFunction(effectRef.current)) {\n console.error(`useMount expected parameter is a function, but got ${typeof effectRef.current}`);\n }\n if (isMountedRef.current) {\n return;\n }\n isMountedRef.current = true;\n const result = effectRef.current?.();\n // If fn returns a Promise, don't return it as cleanup function\n if (isPromiseLike(result)) {\n return;\n }\n\n return result;\n }, [effectRef]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { BREAK_POINT_TOKEN_ENUM, type BREAK_POINT_TOKEN_TYPE } from \"src/enums\";\nimport { arrayZipToObject, objectAssign, objectKeys } from \"src/utils\";\nimport type { TupleToUnion } from \"type-fest\";\n\ntype Breakpoint = TupleToUnion<typeof tuple>;\ntype ResponsiveValues = Record<Breakpoint, boolean>;\n\nconst tuple = [\"xxxl\", \"xxl\", \"xl\", \"lg\", \"md\", \"sm\", \"xs\"] as const;\nconst TUPLE = [\"XXXL\", \"XXL\", \"XL\", \"LG\", \"MD\", \"SM\", \"XS\"] as const;\nconst defaultValues: ResponsiveValues = arrayZipToObject(tuple, tuple.map(() => false));\n\nexport interface ResponsiveHookOptions {\n /** 屏幕响应断点 token 配置 */\n breakPointTokens?: BREAK_POINT_TOKEN_TYPE;\n}\nexport function useResponsive (options?: ResponsiveHookOptions) {\n const { breakPointTokens = {} } = options || {};\n const responsiveValuesRef = useRef({ ...defaultValues });\n const [responsive, setResponsive] = useState<ResponsiveValues>({ ...defaultValues });\n const tokens: BREAK_POINT_TOKEN_TYPE = useMemo(() => objectAssign(BREAK_POINT_TOKEN_ENUM, breakPointTokens), [breakPointTokens]);\n const current = objectKeys(responsive).find((key) => responsive[key] === true) || \"xs\";\n\n useEffect(() => {\n function calculate () {\n const newValues = { ...defaultValues };\n const responsiveConfig = arrayZipToObject(tuple, TUPLE.map((t) => tokens[t]));\n let shouldUpdate = false;\n\n for (const key of tuple) {\n newValues[key] = window.innerWidth >= responsiveConfig[key];\n if (newValues[key] !== responsiveValuesRef.current[key]) {\n shouldUpdate = true;\n }\n }\n if (shouldUpdate) {\n responsiveValuesRef.current = newValues;\n }\n }\n\n function resizeListener () {\n const oldInfo = responsiveValuesRef.current;\n calculate();\n\n if (oldInfo !== responsiveValuesRef.current) {\n setResponsive(responsiveValuesRef.current);\n }\n }\n\n window.addEventListener(\"resize\", resizeListener);\n\n return () => {\n window.removeEventListener(\"resize\", resizeListener);\n };\n }, [tokens]);\n\n return { responsive, current, breakPointTokens: tokens };\n}\n","import type { AnyFunction } from \"@pawover/types\";\nimport { useEffect } from \"react\";\nimport { isFunction } from \"src/utils\";\nimport { useLatest } from \"./useLatest\";\n\n/**\n * 在组件卸载时执行的 Hook\n * @reference https://ahooks.js.org/zh-CN/hooks/use-unmount\n *\n * @param effect 副作用函数\n */\nexport function useUnmount (effect: AnyFunction) {\n const effectRef = useLatest(effect);\n\n useEffect(\n () => () => {\n if (!isFunction(effectRef.current)) {\n console.error(`useUnmount expected parameter is a function, but got ${typeof effectRef.current}`);\n\n return;\n }\n effectRef.current?.();\n },\n [effectRef],\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { isBrowser, isString } from \"../../utils\";\nimport { useUnmount } from \"./useUnmount\";\n\ninterface TitleHookOptions {\n /** 件卸载时是否恢复原始标题 */\n isRestoreOnUnmount?: boolean;\n}\n\n/**\n * 设置页面标题\n * - 轻量级,适用于无路由库时设置页面标题\n * - 多个 `useTitle` 实例会互相干扰,需在顶层组件使用\n * - 无法处理 `document.title` 固有的竞态问题\n *\n * @param title 页面标题\n * @param options 配置选项\n */\nexport function useTitle (title: string, options?: TitleHookOptions | undefined) {\n const titleRef = useRef(isBrowser() ? document.title : \"\");\n\n useEffect(() => {\n if (!isString(title)) {\n console.error(`useTitle expected title is a string, but got ${typeof title}`);\n\n return;\n }\n if (isBrowser()) {\n document.title = title;\n }\n }, [title]);\n\n useUnmount(() => {\n if (isBrowser() && options?.isRestoreOnUnmount) {\n document.title = titleRef.current;\n }\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { t as ValueOf } from "./value-of-DUmTbnuw.js";
2
+
3
+ //#region src/enums/date.d.ts
4
+ declare const DATE_FORMAT: {
5
+ readonly ISO_DATE: "yyyy-MM-dd";
6
+ readonly ISO_TIME: "HH:mm:ss";
7
+ readonly ISO_DATE_TIME: "yyyy-MM-dd HH:mm:ss";
8
+ readonly ISO_DATE_TIME_MS: "yyyy-MM-dd HH:mm:ss.SSS";
9
+ readonly ISO_DATETIME_TZ: "yyyy-MM-dd'T'HH:mm:ssXXX";
10
+ readonly ISO_DATETIME_TZ_MS: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
11
+ readonly US_DATE: "MM/dd/yyyy";
12
+ readonly US_DATE_TIME: "MM/dd/yyyy HH:mm:ss";
13
+ readonly US_DATE_SHORT_YEAR: "MM/dd/yy";
14
+ readonly EU_DATE: "dd/MM/yyyy";
15
+ readonly EU_DATE_TIME: "dd/MM/yyyy HH:mm:ss";
16
+ readonly CN_DATE: "yyyy年MM月dd日";
17
+ readonly CN_DATE_TIME: "yyyy年MM月dd日 HH时mm分ss秒";
18
+ readonly CN_DATE_WEEKDAY: "yyyy年MM月dd日 EEE";
19
+ readonly CN_WEEKDAY_FULL: "EEEE";
20
+ readonly SHORT_DATE: "yy-MM-dd";
21
+ readonly SHORT_DATE_SLASH: "yy/MM/dd";
22
+ readonly MONTH_DAY: "MM-dd";
23
+ readonly MONTH_DAY_CN: "MM月dd日";
24
+ readonly DATE_WITH_WEEKDAY_SHORT: "yyyy-MM-dd (EEE)";
25
+ readonly DATE_WITH_WEEKDAY_FULL: "yyyy-MM-dd (EEEE)";
26
+ readonly TIME_24: "HH:mm:ss";
27
+ readonly TIME_24_NO_SEC: "HH:mm";
28
+ readonly TIME_12: "hh:mm:ss a";
29
+ readonly TIME_12_NO_SEC: "hh:mm a";
30
+ readonly TIMESTAMP: "yyyyMMddHHmmss";
31
+ readonly TIMESTAMP_MS: "yyyyMMddHHmmssSSS";
32
+ readonly RFC2822: "EEE, dd MMM yyyy HH:mm:ss xxx";
33
+ readonly READABLE_DATE: "MMM dd, yyyy";
34
+ readonly READABLE_DATE_TIME: "MMM dd, yyyy HH:mm";
35
+ readonly COMPACT_DATETIME: "yyyyMMdd_HHmmss";
36
+ };
37
+ //#endregion
38
+ //#region src/enums/grid.d.ts
39
+ type BREAK_POINT_TOKEN_TYPE = Record<keyof typeof BREAK_POINT_TOKEN_ENUM, number>;
40
+ /** 屏幕响应断点 token 配置 */
41
+ declare const BREAK_POINT_TOKEN_ENUM: {
42
+ readonly XS: 480;
43
+ readonly XSMax: 575;
44
+ readonly XSMin: 480;
45
+ readonly SM: 576;
46
+ readonly SMMax: 767;
47
+ readonly SMMin: 576;
48
+ readonly MD: 768;
49
+ readonly MDMax: 991;
50
+ readonly MDMin: 768;
51
+ readonly LG: 992;
52
+ readonly LGMax: 1199;
53
+ readonly LGMin: 992;
54
+ readonly XL: 1200;
55
+ readonly XLMax: 1599;
56
+ readonly XLMin: 1200;
57
+ readonly XXL: 1600;
58
+ readonly XXLMax: 1919;
59
+ readonly XXLMin: 1600;
60
+ readonly XXXL: 1920;
61
+ readonly XXXLMin: 1920;
62
+ };
63
+ //#endregion
64
+ //#region src/enums/mime.d.ts
65
+ /**
66
+ * 标准 MIME 类型常量,用于文件类型标识和 HTTP Content-Type 头部
67
+ * 基于 IANA 注册标准和浏览器兼容性验证
68
+ */
69
+ declare const MIME: {
70
+ /** 普通文本文件 */
71
+ readonly TEXT: "text/plain";
72
+ /** 超文本标记语言文档 */
73
+ readonly HTML: "text/html";
74
+ /** 层叠样式表文件 */
75
+ readonly CSS: "text/css";
76
+ /** 逗号分隔值文件(表格数据) */
77
+ readonly CSV: "text/csv";
78
+ /** 制表符分隔值文件 */
79
+ readonly TSV: "text/tab-separated-values";
80
+ /** XML 文档 */
81
+ readonly XML: "text/xml";
82
+ /** XHTML 文档(XML 严格格式的 HTML) */
83
+ readonly XHTML: "application/xhtml+xml";
84
+ /** JavaScript 脚本文件(标准推荐) */
85
+ readonly JS: "text/javascript";
86
+ /** Markdown 格式文档 */
87
+ readonly MARKDOWN: "text/markdown";
88
+ /** 富文本格式文档(.rtf) */
89
+ readonly RTF: "application/rtf";
90
+ /** iCalendar 日历格式(.ics) */
91
+ readonly CALENDAR: "text/calendar";
92
+ /** JPEG 图像(.jpg/.jpeg) */
93
+ readonly JPEG: "image/jpeg";
94
+ /** PNG 图像(无损压缩,支持透明) */
95
+ readonly PNG: "image/png";
96
+ /** GIF 图像(支持动画) */
97
+ readonly GIF: "image/gif";
98
+ /** Windows 位图(.bmp) */
99
+ readonly BMP: "image/bmp";
100
+ /** SVG 向量图形(.svg) */
101
+ readonly SVG: "image/svg+xml";
102
+ /** APNG 动态图像(.apng) */
103
+ readonly APNG: "image/apng";
104
+ /** AVIF 图像(高效压缩) */
105
+ readonly AVIF: "image/avif";
106
+ /** 图标文件格式(.ico) */
107
+ readonly ICO: "image/vnd.microsoft.icon";
108
+ /** WebP 图像(高效压缩) */
109
+ readonly WEBP: "image/webp";
110
+ /** MP3 音频(.mp3) */
111
+ readonly MP3: "audio/mpeg";
112
+ /** AAC 音频(.aac) */
113
+ readonly AAC: "audio/aac";
114
+ /** MIDI 音乐文件(.mid/.midi) */
115
+ readonly MIDI: "audio/midi";
116
+ /** OGG 音频(.oga) */
117
+ readonly OGG_AUDIO: "audio/ogg";
118
+ /** Opus 音频(.opus) */
119
+ readonly OPUS: "audio/opus";
120
+ /** WAV 音频(.wav) */
121
+ readonly WAV: "audio/wav";
122
+ /** RealAudio 音频(.ra/.ram) */
123
+ readonly REAL_AUDIO: "audio/x-pn-realaudio";
124
+ /** MP4 视频(.mp4) */
125
+ readonly MP4: "video/mp4";
126
+ /** MPEG 视频(.mpeg/.mpg) */
127
+ readonly MPEG: "video/mpeg";
128
+ /** OGG 视频(.ogv) */
129
+ readonly OGG_VIDEO: "video/ogg";
130
+ /** AVI 视频(.avi) */
131
+ readonly AVI: "video/x-msvideo";
132
+ /** 3GPP 视频(.3gp) */
133
+ readonly THREE_GPP: "video/3gpp";
134
+ /** 3GPP2 视频(.3g2) */
135
+ readonly THREE_GPP2: "video/3gpp2";
136
+ /** WebM 视频(.webm) */
137
+ readonly WEBM: "video/webm";
138
+ /** PDF 文档 */
139
+ readonly PDF: "application/pdf";
140
+ /** Word 97-2003 文档(.doc) */
141
+ readonly DOC: "application/msword";
142
+ /** Word 2007+ 文档(.docx) */
143
+ readonly DOCX: "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
144
+ /** Excel 2007+ 工作簿(.xlsx) */
145
+ readonly XLSX: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
146
+ /** 启用宏的Excel工作簿(.xlsm) */
147
+ readonly XLSM: "application/vnd.ms-excel.sheet.macroEnabled.12";
148
+ /** Excel模板文件(.xltx) */
149
+ readonly XLTX: "application/vnd.openxmlformats-officedocument.spreadsheetml.template";
150
+ /** PowerPoint 2007+ 演示文稿(.pptx) */
151
+ readonly PPTX: "application/vnd.openxmlformats-officedocument.presentationml.presentation";
152
+ /** PowerPoint 97-2003 演示文稿(.ppt) */
153
+ readonly PPT: "application/vnd.ms-powerpoint";
154
+ /** OpenDocument 文本文档(.odt) */
155
+ readonly ODT: "application/vnd.oasis.opendocument.text";
156
+ /** OpenDocument 表格文档(.ods) */
157
+ readonly ODS: "application/vnd.oasis.opendocument.spreadsheet";
158
+ /** OpenDocument 演示文稿(.odp) */
159
+ readonly ODP: "application/vnd.oasis.opendocument.presentation";
160
+ /** EPUB 电子书(.epub) */
161
+ readonly EPUB: "application/epub+zip";
162
+ /** Kindle 电子书(.azw) */
163
+ readonly AZW: "application/vnd.amazon.ebook";
164
+ /** ZIP 压缩文件(.zip) */
165
+ readonly ZIP: "application/zip";
166
+ /** GZIP 压缩文件(.gz) */
167
+ readonly GZIP: "application/gzip";
168
+ /** GZIP 压缩文件(旧格式) */
169
+ readonly X_GZIP: "application/x-gzip";
170
+ /** TAR 归档文件(.tar) */
171
+ readonly TAR: "application/x-tar";
172
+ /** BZip 归档(.bz) */
173
+ readonly BZIP: "application/x-bzip";
174
+ /** BZip2 归档(.bz2) */
175
+ readonly BZIP2: "application/x-bzip2";
176
+ /** 7-Zip 压缩文件(.7z) */
177
+ readonly SEVEN_Z: "application/x-7z-compressed";
178
+ /** 通用二进制数据(默认类型) */
179
+ readonly OCTET_STREAM: "application/octet-stream";
180
+ /** JSON 数据格式(.json) */
181
+ readonly JSON: "application/json";
182
+ /** JSON-LD 格式(.jsonld) */
183
+ readonly LD_JSON: "application/ld+json";
184
+ /** Java 归档文件(.jar) */
185
+ readonly JAR: "application/java-archive";
186
+ /** MS 嵌入式 OpenType 字体(.eot) */
187
+ readonly EOT: "application/vnd.ms-fontobject";
188
+ /** OpenType 字体(.otf) */
189
+ readonly OTF: "font/otf";
190
+ /** Excel 97-2003 工作簿(.xls) */
191
+ readonly XLS: "application/vnd.ms-excel";
192
+ /** Microsoft XPS 文档(.xps) */
193
+ readonly XPS: "application/vnd.ms-xpsdocument";
194
+ /** Word 启用宏文档(.docm) */
195
+ readonly DOCM: "application/vnd.ms-word.document.macroEnabled.12";
196
+ };
197
+ //#endregion
198
+ //#region src/enums/theme.d.ts
199
+ type THEME_TYPE = ValueOf<typeof THEME_ENUM>;
200
+ declare const THEME_ENUM: {
201
+ readonly LIGHT: "light";
202
+ readonly DARK: "dark";
203
+ };
204
+ type THEME_MODE_TYPE = ValueOf<typeof THEME_MODE_ENUM>;
205
+ declare const THEME_MODE_ENUM: {
206
+ readonly LIGHT: "light";
207
+ readonly DARK: "dark";
208
+ readonly SYSTEM: "system";
209
+ };
210
+ //#endregion
211
+ export { MIME as a, DATE_FORMAT as c, THEME_TYPE as i, THEME_MODE_ENUM as n, BREAK_POINT_TOKEN_ENUM as o, THEME_MODE_TYPE as r, BREAK_POINT_TOKEN_TYPE as s, THEME_ENUM as t };
212
+ //# sourceMappingURL=index-Bn_PNnsM.d.ts.map