@cloudcome/utils-browser 1.2.16 → 1.2.18

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 (47) hide show
  1. package/README.md +72 -73
  2. package/dist/base64.cjs +21 -8
  3. package/dist/base64.cjs.map +1 -1
  4. package/dist/base64.mjs +22 -11
  5. package/dist/base64.mjs.map +1 -1
  6. package/dist/cache.cjs +91 -79
  7. package/dist/cache.cjs.map +1 -1
  8. package/dist/cache.d.ts +1 -1
  9. package/dist/cache.mjs +91 -82
  10. package/dist/cache.mjs.map +1 -1
  11. package/dist/canvas.cjs +64 -48
  12. package/dist/canvas.cjs.map +1 -1
  13. package/dist/canvas.mjs +64 -51
  14. package/dist/canvas.mjs.map +1 -1
  15. package/dist/clipboard.cjs +34 -15
  16. package/dist/clipboard.cjs.map +1 -1
  17. package/dist/clipboard.mjs +35 -17
  18. package/dist/clipboard.mjs.map +1 -1
  19. package/dist/cookie.cjs +42 -41
  20. package/dist/cookie.cjs.map +1 -1
  21. package/dist/cookie.mjs +42 -44
  22. package/dist/cookie.mjs.map +1 -1
  23. package/dist/dom.cjs +30 -11
  24. package/dist/dom.cjs.map +1 -1
  25. package/dist/dom.mjs +30 -13
  26. package/dist/dom.mjs.map +1 -1
  27. package/dist/download.cjs +24 -12
  28. package/dist/download.cjs.map +1 -1
  29. package/dist/download.mjs +25 -15
  30. package/dist/download.mjs.map +1 -1
  31. package/dist/image.cjs +45 -34
  32. package/dist/image.cjs.map +1 -1
  33. package/dist/image.mjs +45 -35
  34. package/dist/image.mjs.map +1 -1
  35. package/dist/index.cjs +8 -3
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.mjs +9 -5
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/timer.cjs +40 -37
  40. package/dist/timer.cjs.map +1 -1
  41. package/dist/timer.mjs +40 -38
  42. package/dist/timer.mjs.map +1 -1
  43. package/dist/video.cjs +25 -14
  44. package/dist/video.cjs.map +1 -1
  45. package/dist/video.mjs +26 -16
  46. package/dist/video.mjs.map +1 -1
  47. package/package.json +51 -52
package/dist/image.mjs CHANGED
@@ -1,38 +1,48 @@
1
1
  import { setStyle } from "./dom.mjs";
2
+ //#region src/image.ts
3
+ /**
4
+ * 加载图片并返回一个包含 HTMLImageElement 的 Promise
5
+ * @param {string} url - 图片的 URL 地址
6
+ * @returns {Promise<HTMLImageElement>} 返回一个包含 HTMLImageElement 的 Promise
7
+ * @example
8
+ * const img = await imageLoad('https://example.com/image.png');
9
+ * @throws {Error} 如果图片加载失败,抛出错误
10
+ */
2
11
  async function imageLoad(url) {
3
- return new Promise((resolve, reject) => {
4
- const image = new Image();
5
- let finished = false;
6
- const onFinish = (isError) => {
7
- if (finished) return;
8
- finished = true;
9
- image.onload = image.onerror = null;
10
- document.body.removeChild(image);
11
- isError ? reject(new Error("图片加载失败")) : resolve(image);
12
- };
13
- image.onload = () => onFinish();
14
- image.onerror = () => onFinish(true);
15
- image.crossOrigin = "anonymous";
16
- image.src = url;
17
- setStyle(image, {
18
- visibility: "hidden",
19
- position: "absolute",
20
- top: "-99999%",
21
- left: "-99999%",
22
- maxWidth: "none",
23
- maxHeight: "none",
24
- border: "0",
25
- width: "auto",
26
- height: "auto",
27
- margin: "0",
28
- padding: "0",
29
- transform: ""
30
- });
31
- document.body.appendChild(image);
32
- if (image.complete && image.width > 0) onFinish();
33
- });
12
+ return new Promise((resolve, reject) => {
13
+ const image = new Image();
14
+ let finished = false;
15
+ const onFinish = (isError) => {
16
+ if (finished) return;
17
+ finished = true;
18
+ image.onload = image.onerror = null;
19
+ document.body.removeChild(image);
20
+ if (isError) reject(/* @__PURE__ */ new Error("图片加载失败"));
21
+ else resolve(image);
22
+ };
23
+ image.onload = () => onFinish();
24
+ image.onerror = () => onFinish(true);
25
+ image.crossOrigin = "anonymous";
26
+ image.src = url;
27
+ setStyle(image, {
28
+ visibility: "hidden",
29
+ position: "absolute",
30
+ top: "-99999%",
31
+ left: "-99999%",
32
+ maxWidth: "none",
33
+ maxHeight: "none",
34
+ border: "0",
35
+ width: "auto",
36
+ height: "auto",
37
+ margin: "0",
38
+ padding: "0",
39
+ transform: ""
40
+ });
41
+ document.body.appendChild(image);
42
+ if (image.complete && image.width > 0) onFinish();
43
+ });
34
44
  }
35
- export {
36
- imageLoad
37
- };
38
- //# sourceMappingURL=image.mjs.map
45
+ //#endregion
46
+ export { imageLoad };
47
+
48
+ //# sourceMappingURL=image.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"image.mjs","sources":["../src/image.ts"],"sourcesContent":["import { setStyle } from './dom';\n\n/**\n * 加载图片并返回一个包含 HTMLImageElement 的 Promise\n * @param {string} url - 图片的 URL 地址\n * @returns {Promise<HTMLImageElement>} 返回一个包含 HTMLImageElement 的 Promise\n * @example\n * const img = await imageLoad('https://example.com/image.png');\n * @throws {Error} 如果图片加载失败,抛出错误\n */\nexport async function imageLoad(url: string) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n let finished = false;\n const onFinish = (isError?: boolean) => {\n if (finished) return;\n finished = true;\n image.onload = image.onerror = null;\n document.body.removeChild(image);\n isError ? reject(new Error('图片加载失败')) : resolve(image);\n };\n image.onload = () => onFinish();\n image.onerror = () => onFinish(true);\n image.crossOrigin = 'anonymous';\n image.src = url;\n\n // ios 拍照产生的图片,如果没有插入的 DOM 中获取到的图片尺寸是相反的\n setStyle(image, {\n visibility: 'hidden',\n position: 'absolute',\n top: '-99999%',\n left: '-99999%',\n maxWidth: 'none',\n maxHeight: 'none',\n border: '0',\n width: 'auto',\n height: 'auto',\n margin: '0',\n padding: '0',\n transform: '',\n });\n document.body.appendChild(image);\n\n if (image.complete && image.width > 0) onFinish();\n });\n}\n\n// 图片缩放函数\n"],"names":[],"mappings":";AAUA,eAAsB,UAAU,KAAa;AAC3C,SAAO,IAAI,QAA0B,CAAC,SAAS,WAAW;AAClD,UAAA,QAAQ,IAAI,MAAM;AACxB,QAAI,WAAW;AACT,UAAA,WAAW,CAAC,YAAsB;AACtC,UAAI,SAAU;AACH,iBAAA;AACL,YAAA,SAAS,MAAM,UAAU;AACtB,eAAA,KAAK,YAAY,KAAK;AAC/B,gBAAU,OAAO,IAAI,MAAM,QAAQ,CAAC,IAAI,QAAQ,KAAK;AAAA,IACvD;AACM,UAAA,SAAS,MAAM,SAAS;AACxB,UAAA,UAAU,MAAM,SAAS,IAAI;AACnC,UAAM,cAAc;AACpB,UAAM,MAAM;AAGZ,aAAS,OAAO;AAAA,MACd,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,IAAA,CACZ;AACQ,aAAA,KAAK,YAAY,KAAK;AAE/B,QAAI,MAAM,YAAY,MAAM,QAAQ,EAAY,UAAA;AAAA,EAAA,CACjD;AACH;"}
1
+ {"version":3,"file":"image.mjs","names":[],"sources":["../src/image.ts"],"sourcesContent":["import { setStyle } from './dom';\n\n/**\n * 加载图片并返回一个包含 HTMLImageElement 的 Promise\n * @param {string} url - 图片的 URL 地址\n * @returns {Promise<HTMLImageElement>} 返回一个包含 HTMLImageElement 的 Promise\n * @example\n * const img = await imageLoad('https://example.com/image.png');\n * @throws {Error} 如果图片加载失败,抛出错误\n */\nexport async function imageLoad(url: string) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n let finished = false;\n const onFinish = (isError?: boolean) => {\n if (finished) return;\n finished = true;\n image.onload = image.onerror = null;\n document.body.removeChild(image);\n if (isError) {\n reject(new Error('图片加载失败'));\n } else {\n resolve(image);\n }\n };\n image.onload = () => onFinish();\n image.onerror = () => onFinish(true);\n image.crossOrigin = 'anonymous';\n image.src = url;\n\n // ios 拍照产生的图片,如果没有插入的 DOM 中获取到的图片尺寸是相反的\n setStyle(image, {\n visibility: 'hidden',\n position: 'absolute',\n top: '-99999%',\n left: '-99999%',\n maxWidth: 'none',\n maxHeight: 'none',\n border: '0',\n width: 'auto',\n height: 'auto',\n margin: '0',\n padding: '0',\n transform: '',\n });\n document.body.appendChild(image);\n\n if (image.complete && image.width > 0) onFinish();\n });\n}\n\n// 图片缩放函数\n"],"mappings":";;;;;;;;;;AAUA,eAAsB,UAAU,KAAa;CAC3C,OAAO,IAAI,SAA2B,SAAS,WAAW;EACxD,MAAM,QAAQ,IAAI,OAAO;EACzB,IAAI,WAAW;EACf,MAAM,YAAY,YAAsB;GACtC,IAAI,UAAU;GACd,WAAW;GACX,MAAM,SAAS,MAAM,UAAU;GAC/B,SAAS,KAAK,YAAY,MAAM;GAChC,IAAI,SACF,uBAAO,IAAI,MAAM,SAAS,CAAC;QAE3B,QAAQ,MAAM;;EAGlB,MAAM,eAAe,UAAU;EAC/B,MAAM,gBAAgB,SAAS,KAAK;EACpC,MAAM,cAAc;EACpB,MAAM,MAAM;EAGZ,SAAS,OAAO;GACd,YAAY;GACZ,UAAU;GACV,KAAK;GACL,MAAM;GACN,UAAU;GACV,WAAW;GACX,QAAQ;GACR,OAAO;GACP,QAAQ;GACR,QAAQ;GACR,SAAS;GACT,WAAW;GACZ,CAAC;EACF,SAAS,KAAK,YAAY,MAAM;EAEhC,IAAI,MAAM,YAAY,MAAM,QAAQ,GAAG,UAAU;GACjD"}
package/dist/index.cjs CHANGED
@@ -1,5 +1,10 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const VERSION = "1.2.15";
2
+ //#region src/index.ts
3
+ /**
4
+ * `@cloudcome/utils-browser` 版本号
5
+ */
6
+ var VERSION = "1.2.18";
7
+ //#endregion
4
8
  exports.VERSION = VERSION;
5
- //# sourceMappingURL=index.cjs.map
9
+
10
+ //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * `@cloudcome/utils-browser` 版本号\n */\nexport const VERSION = PKG_VERSION;\n"],"names":[],"mappings":";;AAGO,MAAM,UAAU;;"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * `@cloudcome/utils-browser` 版本号\n */\nexport const VERSION = PKG_VERSION;\n"],"mappings":";;;;;AAGA,IAAa,UAAA"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,9 @@
1
- const VERSION = "1.2.15";
2
- export {
3
- VERSION
4
- };
5
- //# sourceMappingURL=index.mjs.map
1
+ //#region src/index.ts
2
+ /**
3
+ * `@cloudcome/utils-browser` 版本号
4
+ */
5
+ var VERSION = "1.2.18";
6
+ //#endregion
7
+ export { VERSION };
8
+
9
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * `@cloudcome/utils-browser` 版本号\n */\nexport const VERSION = PKG_VERSION;\n"],"names":[],"mappings":"AAGO,MAAM,UAAU;"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * `@cloudcome/utils-browser` 版本号\n */\nexport const VERSION = PKG_VERSION;\n"],"mappings":";;;;AAGA,IAAa,UAAA"}
package/dist/timer.cjs CHANGED
@@ -1,41 +1,44 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const timer = require("@cloudcome/utils-core/timer");
2
+ let _cloudcome_utils_core_timer = require("@cloudcome/utils-core/timer");
3
+ //#region src/timer.ts
4
+ /**
5
+ * 创建一个基于 `requestAnimationFrame` 的间隔定时器
6
+ *
7
+ * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数
8
+ * @param options - 配置选项
9
+ * @returns {TimerHandler} 返回包含控制方法的对象
10
+ */
4
11
  function frameInterval(callback, options) {
5
- let rafId;
6
- const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = timer.makeInterval((call) => {
7
- rafId = requestAnimationFrame(call);
8
- }, callback);
9
- return {
10
- start() {
11
- if (!canStart()) return;
12
- if (options?.leading) {
13
- start();
14
- } else {
15
- rafId = requestAnimationFrame(start);
16
- }
17
- },
18
- stop() {
19
- if (!canStop()) return;
20
- if (options?.trailing) execute();
21
- cancelAnimationFrame(rafId);
22
- stop();
23
- },
24
- pause() {
25
- if (!canPause()) return;
26
- if (options?.trailing) execute();
27
- cancelAnimationFrame(rafId);
28
- pause();
29
- },
30
- resume(immediate) {
31
- if (!canResume()) return;
32
- if (immediate || options?.leading) {
33
- resume();
34
- } else {
35
- rafId = requestAnimationFrame(resume);
36
- }
37
- }
38
- };
12
+ let rafId;
13
+ const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = (0, _cloudcome_utils_core_timer.makeInterval)((call) => {
14
+ rafId = requestAnimationFrame(call);
15
+ }, callback);
16
+ return {
17
+ start() {
18
+ if (!canStart()) return;
19
+ if (options?.leading) start();
20
+ else rafId = requestAnimationFrame(start);
21
+ },
22
+ stop() {
23
+ if (!canStop()) return;
24
+ if (options?.trailing) execute();
25
+ cancelAnimationFrame(rafId);
26
+ stop();
27
+ },
28
+ pause() {
29
+ if (!canPause()) return;
30
+ if (options?.trailing) execute();
31
+ cancelAnimationFrame(rafId);
32
+ pause();
33
+ },
34
+ resume(immediate) {
35
+ if (!canResume()) return;
36
+ if (immediate || options?.leading) resume();
37
+ else rafId = requestAnimationFrame(resume);
38
+ }
39
+ };
39
40
  }
41
+ //#endregion
40
42
  exports.frameInterval = frameInterval;
41
- //# sourceMappingURL=timer.cjs.map
43
+
44
+ //# sourceMappingURL=timer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"timer.cjs","sources":["../src/timer.ts"],"sourcesContent":["import { type TimerHandler, type TimerOptions, type TimerState, makeInterval } from '@cloudcome/utils-core/timer';\n\n/**\n * 创建一个基于 `requestAnimationFrame` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param options - 配置选项\n * @returns {TimerHandler} 返回包含控制方法的对象\n */\nexport function frameInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n options?: TimerOptions,\n): TimerHandler {\n let rafId: number;\n const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = makeInterval((call) => {\n rafId = requestAnimationFrame(call);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n rafId = requestAnimationFrame(start);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n rafId = requestAnimationFrame(resume);\n }\n },\n };\n}\n"],"names":["makeInterval"],"mappings":";;;AASgB,SAAA,cACd,UACA,SACc;AACV,MAAA;AACJ,QAAM,EAAE,UAAU,OAAO,SAAS,MAAM,UAAU,OAAO,WAAW,QAAQ,QAAY,IAAAA,MAAA,aAAa,CAAC,SAAS;AAC7G,YAAQ,sBAAsB,IAAI;AAAA,KACjC,QAAQ;AAEJ,SAAA;AAAA,IACL,QAAQ;AACF,UAAA,CAAC,WAAY;AAEjB,UAAI,SAAS,SAAS;AACd,cAAA;AAAA,MAAA,OACD;AACL,gBAAQ,sBAAsB,KAAK;AAAA,MAAA;AAAA,IAEvC;AAAA,IAEA,OAAO;AACD,UAAA,CAAC,UAAW;AACZ,UAAA,SAAS,SAAkB,SAAA;AAE/B,2BAAqB,KAAK;AACrB,WAAA;AAAA,IACP;AAAA,IAEA,QAAQ;AACF,UAAA,CAAC,WAAY;AACb,UAAA,SAAS,SAAkB,SAAA;AAE/B,2BAAqB,KAAK;AACpB,YAAA;AAAA,IACR;AAAA,IAEA,OAAO,WAAqB;AACtB,UAAA,CAAC,YAAa;AAEd,UAAA,aAAa,SAAS,SAAS;AAC1B,eAAA;AAAA,MAAA,OACF;AACL,gBAAQ,sBAAsB,MAAM;AAAA,MAAA;AAAA,IACtC;AAAA,EAEJ;AACF;;"}
1
+ {"version":3,"file":"timer.cjs","names":[],"sources":["../src/timer.ts"],"sourcesContent":["import { makeInterval, type TimerHandler, type TimerOptions, type TimerState } from '@cloudcome/utils-core/timer';\n\n/**\n * 创建一个基于 `requestAnimationFrame` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param options - 配置选项\n * @returns {TimerHandler} 返回包含控制方法的对象\n */\nexport function frameInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n options?: TimerOptions,\n): TimerHandler {\n let rafId: number;\n const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = makeInterval((call) => {\n rafId = requestAnimationFrame(call);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n rafId = requestAnimationFrame(start);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n rafId = requestAnimationFrame(resume);\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,cACd,UACA,SACc;CACd,IAAI;CACJ,MAAM,EAAE,UAAU,OAAO,SAAS,MAAM,UAAU,OAAO,WAAW,QAAQ,aAAA,GAAA,4BAAA,eAA0B,SAAS;EAC7G,QAAQ,sBAAsB,KAAK;IAClC,SAAS;CAEZ,OAAO;EACL,QAAQ;GACN,IAAI,CAAC,UAAU,EAAE;GAEjB,IAAI,SAAS,SACX,OAAO;QAEP,QAAQ,sBAAsB,MAAM;;EAIxC,OAAO;GACL,IAAI,CAAC,SAAS,EAAE;GAChB,IAAI,SAAS,UAAU,SAAS;GAEhC,qBAAqB,MAAM;GAC3B,MAAM;;EAGR,QAAQ;GACN,IAAI,CAAC,UAAU,EAAE;GACjB,IAAI,SAAS,UAAU,SAAS;GAEhC,qBAAqB,MAAM;GAC3B,OAAO;;EAGT,OAAO,WAAqB;GAC1B,IAAI,CAAC,WAAW,EAAE;GAElB,IAAI,aAAa,SAAS,SACxB,QAAQ;QAER,QAAQ,sBAAsB,OAAO;;EAG1C"}
package/dist/timer.mjs CHANGED
@@ -1,41 +1,43 @@
1
1
  import { makeInterval } from "@cloudcome/utils-core/timer";
2
+ //#region src/timer.ts
3
+ /**
4
+ * 创建一个基于 `requestAnimationFrame` 的间隔定时器
5
+ *
6
+ * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数
7
+ * @param options - 配置选项
8
+ * @returns {TimerHandler} 返回包含控制方法的对象
9
+ */
2
10
  function frameInterval(callback, options) {
3
- let rafId;
4
- const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = makeInterval((call) => {
5
- rafId = requestAnimationFrame(call);
6
- }, callback);
7
- return {
8
- start() {
9
- if (!canStart()) return;
10
- if (options?.leading) {
11
- start();
12
- } else {
13
- rafId = requestAnimationFrame(start);
14
- }
15
- },
16
- stop() {
17
- if (!canStop()) return;
18
- if (options?.trailing) execute();
19
- cancelAnimationFrame(rafId);
20
- stop();
21
- },
22
- pause() {
23
- if (!canPause()) return;
24
- if (options?.trailing) execute();
25
- cancelAnimationFrame(rafId);
26
- pause();
27
- },
28
- resume(immediate) {
29
- if (!canResume()) return;
30
- if (immediate || options?.leading) {
31
- resume();
32
- } else {
33
- rafId = requestAnimationFrame(resume);
34
- }
35
- }
36
- };
11
+ let rafId;
12
+ const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = makeInterval((call) => {
13
+ rafId = requestAnimationFrame(call);
14
+ }, callback);
15
+ return {
16
+ start() {
17
+ if (!canStart()) return;
18
+ if (options?.leading) start();
19
+ else rafId = requestAnimationFrame(start);
20
+ },
21
+ stop() {
22
+ if (!canStop()) return;
23
+ if (options?.trailing) execute();
24
+ cancelAnimationFrame(rafId);
25
+ stop();
26
+ },
27
+ pause() {
28
+ if (!canPause()) return;
29
+ if (options?.trailing) execute();
30
+ cancelAnimationFrame(rafId);
31
+ pause();
32
+ },
33
+ resume(immediate) {
34
+ if (!canResume()) return;
35
+ if (immediate || options?.leading) resume();
36
+ else rafId = requestAnimationFrame(resume);
37
+ }
38
+ };
37
39
  }
38
- export {
39
- frameInterval
40
- };
41
- //# sourceMappingURL=timer.mjs.map
40
+ //#endregion
41
+ export { frameInterval };
42
+
43
+ //# sourceMappingURL=timer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"timer.mjs","sources":["../src/timer.ts"],"sourcesContent":["import { type TimerHandler, type TimerOptions, type TimerState, makeInterval } from '@cloudcome/utils-core/timer';\n\n/**\n * 创建一个基于 `requestAnimationFrame` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param options - 配置选项\n * @returns {TimerHandler} 返回包含控制方法的对象\n */\nexport function frameInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n options?: TimerOptions,\n): TimerHandler {\n let rafId: number;\n const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = makeInterval((call) => {\n rafId = requestAnimationFrame(call);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n rafId = requestAnimationFrame(start);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n rafId = requestAnimationFrame(resume);\n }\n },\n };\n}\n"],"names":[],"mappings":";AASgB,SAAA,cACd,UACA,SACc;AACV,MAAA;AACJ,QAAM,EAAE,UAAU,OAAO,SAAS,MAAM,UAAU,OAAO,WAAW,QAAQ,QAAY,IAAA,aAAa,CAAC,SAAS;AAC7G,YAAQ,sBAAsB,IAAI;AAAA,KACjC,QAAQ;AAEJ,SAAA;AAAA,IACL,QAAQ;AACF,UAAA,CAAC,WAAY;AAEjB,UAAI,SAAS,SAAS;AACd,cAAA;AAAA,MAAA,OACD;AACL,gBAAQ,sBAAsB,KAAK;AAAA,MAAA;AAAA,IAEvC;AAAA,IAEA,OAAO;AACD,UAAA,CAAC,UAAW;AACZ,UAAA,SAAS,SAAkB,SAAA;AAE/B,2BAAqB,KAAK;AACrB,WAAA;AAAA,IACP;AAAA,IAEA,QAAQ;AACF,UAAA,CAAC,WAAY;AACb,UAAA,SAAS,SAAkB,SAAA;AAE/B,2BAAqB,KAAK;AACpB,YAAA;AAAA,IACR;AAAA,IAEA,OAAO,WAAqB;AACtB,UAAA,CAAC,YAAa;AAEd,UAAA,aAAa,SAAS,SAAS;AAC1B,eAAA;AAAA,MAAA,OACF;AACL,gBAAQ,sBAAsB,MAAM;AAAA,MAAA;AAAA,IACtC;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"timer.mjs","names":[],"sources":["../src/timer.ts"],"sourcesContent":["import { makeInterval, type TimerHandler, type TimerOptions, type TimerState } from '@cloudcome/utils-core/timer';\n\n/**\n * 创建一个基于 `requestAnimationFrame` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param options - 配置选项\n * @returns {TimerHandler} 返回包含控制方法的对象\n */\nexport function frameInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n options?: TimerOptions,\n): TimerHandler {\n let rafId: number;\n const { canStart, start, canStop, stop, canPause, pause, canResume, resume, execute } = makeInterval((call) => {\n rafId = requestAnimationFrame(call);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n rafId = requestAnimationFrame(start);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n cancelAnimationFrame(rafId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n rafId = requestAnimationFrame(resume);\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,cACd,UACA,SACc;CACd,IAAI;CACJ,MAAM,EAAE,UAAU,OAAO,SAAS,MAAM,UAAU,OAAO,WAAW,QAAQ,YAAY,cAAc,SAAS;EAC7G,QAAQ,sBAAsB,KAAK;IAClC,SAAS;CAEZ,OAAO;EACL,QAAQ;GACN,IAAI,CAAC,UAAU,EAAE;GAEjB,IAAI,SAAS,SACX,OAAO;QAEP,QAAQ,sBAAsB,MAAM;;EAIxC,OAAO;GACL,IAAI,CAAC,SAAS,EAAE;GAChB,IAAI,SAAS,UAAU,SAAS;GAEhC,qBAAqB,MAAM;GAC3B,MAAM;;EAGR,QAAQ;GACN,IAAI,CAAC,UAAU,EAAE;GACjB,IAAI,SAAS,UAAU,SAAS;GAEhC,qBAAqB,MAAM;GAC3B,OAAO;;EAGT,OAAO,WAAqB;GAC1B,IAAI,CAAC,WAAW,EAAE;GAElB,IAAI,aAAa,SAAS,SACxB,QAAQ;QAER,QAAQ,sBAAsB,OAAO;;EAG1C"}
package/dist/video.cjs CHANGED
@@ -1,18 +1,29 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/video.ts
3
+ /**
4
+ * 加载视频并返回一个包含 HTMLVideoElement 的 Promise
5
+ * @param {string} url - 视频的 URL 地址
6
+ * @returns {Promise<HTMLVideoElement>} 返回一个包含 HTMLVideoElement 的 Promise
7
+ * @example
8
+ * const video = await videoLoad('https://example.com/video.mp4');
9
+ * @throws {Error} 如果视频加载失败,抛出错误
10
+ */
3
11
  async function videoLoad(url) {
4
- return new Promise((resolve, reject) => {
5
- const video = document.createElement("video");
6
- const onFinish = (isError) => {
7
- video.onload = video.onerror = null;
8
- isError ? reject(new Error("视频加载失败")) : resolve(video);
9
- };
10
- video.src = url;
11
- video.crossOrigin = "anonymous";
12
- video.currentTime = 1;
13
- video.onloadedmetadata = () => onFinish();
14
- video.onerror = () => onFinish(true);
15
- });
12
+ return new Promise((resolve, reject) => {
13
+ const video = document.createElement("video");
14
+ const onFinish = (isError) => {
15
+ video.onload = video.onerror = null;
16
+ if (isError) reject(/* @__PURE__ */ new Error("视频加载失败"));
17
+ else resolve(video);
18
+ };
19
+ video.src = url;
20
+ video.crossOrigin = "anonymous";
21
+ video.currentTime = 1;
22
+ video.onloadedmetadata = () => onFinish();
23
+ video.onerror = () => onFinish(true);
24
+ });
16
25
  }
26
+ //#endregion
17
27
  exports.videoLoad = videoLoad;
18
- //# sourceMappingURL=video.cjs.map
28
+
29
+ //# sourceMappingURL=video.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"video.cjs","sources":["../src/video.ts"],"sourcesContent":["/**\n * 加载视频并返回一个包含 HTMLVideoElement 的 Promise\n * @param {string} url - 视频的 URL 地址\n * @returns {Promise<HTMLVideoElement>} 返回一个包含 HTMLVideoElement 的 Promise\n * @example\n * const video = await videoLoad('https://example.com/video.mp4');\n * @throws {Error} 如果视频加载失败,抛出错误\n */\nexport async function videoLoad(url: string) {\n return new Promise<HTMLVideoElement>((resolve, reject) => {\n const video = document.createElement('video');\n const onFinish = (isError?: boolean) => {\n video.onload = video.onerror = null;\n isError ? reject(new Error('视频加载失败')) : resolve(video);\n };\n\n video.src = url;\n video.crossOrigin = 'anonymous';\n video.currentTime = 1;\n video.onloadedmetadata = () => onFinish();\n video.onerror = () => onFinish(true);\n });\n}\n"],"names":[],"mappings":";;AAQA,eAAsB,UAAU,KAAa;AAC3C,SAAO,IAAI,QAA0B,CAAC,SAAS,WAAW;AAClD,UAAA,QAAQ,SAAS,cAAc,OAAO;AACtC,UAAA,WAAW,CAAC,YAAsB;AAChC,YAAA,SAAS,MAAM,UAAU;AAC/B,gBAAU,OAAO,IAAI,MAAM,QAAQ,CAAC,IAAI,QAAQ,KAAK;AAAA,IACvD;AAEA,UAAM,MAAM;AACZ,UAAM,cAAc;AACpB,UAAM,cAAc;AACd,UAAA,mBAAmB,MAAM,SAAS;AAClC,UAAA,UAAU,MAAM,SAAS,IAAI;AAAA,EAAA,CACpC;AACH;;"}
1
+ {"version":3,"file":"video.cjs","names":[],"sources":["../src/video.ts"],"sourcesContent":["/**\n * 加载视频并返回一个包含 HTMLVideoElement 的 Promise\n * @param {string} url - 视频的 URL 地址\n * @returns {Promise<HTMLVideoElement>} 返回一个包含 HTMLVideoElement 的 Promise\n * @example\n * const video = await videoLoad('https://example.com/video.mp4');\n * @throws {Error} 如果视频加载失败,抛出错误\n */\nexport async function videoLoad(url: string) {\n return new Promise<HTMLVideoElement>((resolve, reject) => {\n const video = document.createElement('video');\n const onFinish = (isError?: boolean) => {\n video.onload = video.onerror = null;\n if (isError) {\n reject(new Error('视频加载失败'));\n } else {\n resolve(video);\n }\n };\n\n video.src = url;\n video.crossOrigin = 'anonymous';\n video.currentTime = 1;\n video.onloadedmetadata = () => onFinish();\n video.onerror = () => onFinish(true);\n });\n}\n"],"mappings":";;;;;;;;;;AAQA,eAAsB,UAAU,KAAa;CAC3C,OAAO,IAAI,SAA2B,SAAS,WAAW;EACxD,MAAM,QAAQ,SAAS,cAAc,QAAQ;EAC7C,MAAM,YAAY,YAAsB;GACtC,MAAM,SAAS,MAAM,UAAU;GAC/B,IAAI,SACF,uBAAO,IAAI,MAAM,SAAS,CAAC;QAE3B,QAAQ,MAAM;;EAIlB,MAAM,MAAM;EACZ,MAAM,cAAc;EACpB,MAAM,cAAc;EACpB,MAAM,yBAAyB,UAAU;EACzC,MAAM,gBAAgB,SAAS,KAAK;GACpC"}
package/dist/video.mjs CHANGED
@@ -1,18 +1,28 @@
1
+ //#region src/video.ts
2
+ /**
3
+ * 加载视频并返回一个包含 HTMLVideoElement 的 Promise
4
+ * @param {string} url - 视频的 URL 地址
5
+ * @returns {Promise<HTMLVideoElement>} 返回一个包含 HTMLVideoElement 的 Promise
6
+ * @example
7
+ * const video = await videoLoad('https://example.com/video.mp4');
8
+ * @throws {Error} 如果视频加载失败,抛出错误
9
+ */
1
10
  async function videoLoad(url) {
2
- return new Promise((resolve, reject) => {
3
- const video = document.createElement("video");
4
- const onFinish = (isError) => {
5
- video.onload = video.onerror = null;
6
- isError ? reject(new Error("视频加载失败")) : resolve(video);
7
- };
8
- video.src = url;
9
- video.crossOrigin = "anonymous";
10
- video.currentTime = 1;
11
- video.onloadedmetadata = () => onFinish();
12
- video.onerror = () => onFinish(true);
13
- });
11
+ return new Promise((resolve, reject) => {
12
+ const video = document.createElement("video");
13
+ const onFinish = (isError) => {
14
+ video.onload = video.onerror = null;
15
+ if (isError) reject(/* @__PURE__ */ new Error("视频加载失败"));
16
+ else resolve(video);
17
+ };
18
+ video.src = url;
19
+ video.crossOrigin = "anonymous";
20
+ video.currentTime = 1;
21
+ video.onloadedmetadata = () => onFinish();
22
+ video.onerror = () => onFinish(true);
23
+ });
14
24
  }
15
- export {
16
- videoLoad
17
- };
18
- //# sourceMappingURL=video.mjs.map
25
+ //#endregion
26
+ export { videoLoad };
27
+
28
+ //# sourceMappingURL=video.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"video.mjs","sources":["../src/video.ts"],"sourcesContent":["/**\n * 加载视频并返回一个包含 HTMLVideoElement 的 Promise\n * @param {string} url - 视频的 URL 地址\n * @returns {Promise<HTMLVideoElement>} 返回一个包含 HTMLVideoElement 的 Promise\n * @example\n * const video = await videoLoad('https://example.com/video.mp4');\n * @throws {Error} 如果视频加载失败,抛出错误\n */\nexport async function videoLoad(url: string) {\n return new Promise<HTMLVideoElement>((resolve, reject) => {\n const video = document.createElement('video');\n const onFinish = (isError?: boolean) => {\n video.onload = video.onerror = null;\n isError ? reject(new Error('视频加载失败')) : resolve(video);\n };\n\n video.src = url;\n video.crossOrigin = 'anonymous';\n video.currentTime = 1;\n video.onloadedmetadata = () => onFinish();\n video.onerror = () => onFinish(true);\n });\n}\n"],"names":[],"mappings":"AAQA,eAAsB,UAAU,KAAa;AAC3C,SAAO,IAAI,QAA0B,CAAC,SAAS,WAAW;AAClD,UAAA,QAAQ,SAAS,cAAc,OAAO;AACtC,UAAA,WAAW,CAAC,YAAsB;AAChC,YAAA,SAAS,MAAM,UAAU;AAC/B,gBAAU,OAAO,IAAI,MAAM,QAAQ,CAAC,IAAI,QAAQ,KAAK;AAAA,IACvD;AAEA,UAAM,MAAM;AACZ,UAAM,cAAc;AACpB,UAAM,cAAc;AACd,UAAA,mBAAmB,MAAM,SAAS;AAClC,UAAA,UAAU,MAAM,SAAS,IAAI;AAAA,EAAA,CACpC;AACH;"}
1
+ {"version":3,"file":"video.mjs","names":[],"sources":["../src/video.ts"],"sourcesContent":["/**\n * 加载视频并返回一个包含 HTMLVideoElement 的 Promise\n * @param {string} url - 视频的 URL 地址\n * @returns {Promise<HTMLVideoElement>} 返回一个包含 HTMLVideoElement 的 Promise\n * @example\n * const video = await videoLoad('https://example.com/video.mp4');\n * @throws {Error} 如果视频加载失败,抛出错误\n */\nexport async function videoLoad(url: string) {\n return new Promise<HTMLVideoElement>((resolve, reject) => {\n const video = document.createElement('video');\n const onFinish = (isError?: boolean) => {\n video.onload = video.onerror = null;\n if (isError) {\n reject(new Error('视频加载失败'));\n } else {\n resolve(video);\n }\n };\n\n video.src = url;\n video.crossOrigin = 'anonymous';\n video.currentTime = 1;\n video.onloadedmetadata = () => onFinish();\n video.onerror = () => onFinish(true);\n });\n}\n"],"mappings":";;;;;;;;;AAQA,eAAsB,UAAU,KAAa;CAC3C,OAAO,IAAI,SAA2B,SAAS,WAAW;EACxD,MAAM,QAAQ,SAAS,cAAc,QAAQ;EAC7C,MAAM,YAAY,YAAsB;GACtC,MAAM,SAAS,MAAM,UAAU;GAC/B,IAAI,SACF,uBAAO,IAAI,MAAM,SAAS,CAAC;QAE3B,QAAQ,MAAM;;EAIlB,MAAM,MAAM;EACZ,MAAM,cAAc;EACpB,MAAM,cAAc;EACpB,MAAM,yBAAyB,UAAU;EACzC,MAAM,gBAAgB,SAAS,KAAK;GACpC"}
package/package.json CHANGED
@@ -1,11 +1,44 @@
1
1
  {
2
2
  "name": "@cloudcome/utils-browser",
3
- "version": "1.2.16",
3
+ "version": "1.2.18",
4
4
  "description": "cloudcome utils for browser",
5
- "engines": {
6
- "node": ">=22"
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "typesVersions": {
9
+ "*": {
10
+ "base64": [
11
+ "./dist/base64.d.ts"
12
+ ],
13
+ "cache": [
14
+ "./dist/cache.d.ts"
15
+ ],
16
+ "canvas": [
17
+ "./dist/canvas.d.ts"
18
+ ],
19
+ "clipboard": [
20
+ "./dist/clipboard.d.ts"
21
+ ],
22
+ "cookie": [
23
+ "./dist/cookie.d.ts"
24
+ ],
25
+ "dom": [
26
+ "./dist/dom.d.ts"
27
+ ],
28
+ "download": [
29
+ "./dist/download.d.ts"
30
+ ],
31
+ "image": [
32
+ "./dist/image.d.ts"
33
+ ],
34
+ "timer": [
35
+ "./dist/timer.d.ts"
36
+ ],
37
+ "video": [
38
+ "./dist/video.d.ts"
39
+ ]
40
+ }
7
41
  },
8
- "engineStrict": true,
9
42
  "sideEffects": false,
10
43
  "exports": {
11
44
  ".": {
@@ -65,64 +98,30 @@
65
98
  "require": "./dist/video.cjs"
66
99
  }
67
100
  },
68
- "typesVersions": {
69
- "*": {
70
- "base64": [
71
- "./dist/base64.d.ts"
72
- ],
73
- "cache": [
74
- "./dist/cache.d.ts"
75
- ],
76
- "canvas": [
77
- "./dist/canvas.d.ts"
78
- ],
79
- "clipboard": [
80
- "./dist/clipboard.d.ts"
81
- ],
82
- "cookie": [
83
- "./dist/cookie.d.ts"
84
- ],
85
- "dom": [
86
- "./dist/dom.d.ts"
87
- ],
88
- "download": [
89
- "./dist/download.d.ts"
90
- ],
91
- "image": [
92
- "./dist/image.d.ts"
93
- ],
94
- "timer": [
95
- "./dist/timer.d.ts"
96
- ],
97
- "video": [
98
- "./dist/video.d.ts"
99
- ]
100
- }
101
- },
102
- "main": "./dist/index.cjs",
103
- "module": "./dist/index.mjs",
104
- "types": "./dist/index.d.ts",
105
101
  "files": [
106
102
  "dist"
107
103
  ],
108
- "dependencies": {
109
- "@cloudcome/utils-core": "~1.19.1"
104
+ "engines": {
105
+ "node": ">=22"
110
106
  },
111
- "repository": {
112
- "type": "git",
113
- "url": "git+https://github.com/cloudcome/utils.git"
107
+ "dependencies": {
108
+ "@cloudcome/utils-core": "~1.20.1"
114
109
  },
115
110
  "keywords": [
116
- "utils",
117
111
  "cloudcome",
112
+ "utils",
113
+ "utils-browser",
118
114
  "utils-core",
119
- "utils-vue",
115
+ "utils-node",
120
116
  "utils-react",
121
117
  "utils-uni",
122
- "utils-node",
123
- "utils-browser"
118
+ "utils-vue"
124
119
  ],
125
- "homepage": "https://github.com/cloudcome/utils",
120
+ "homepage": "https://cloudcome.github.io/utils/",
126
121
  "license": "MIT",
127
- "author": "云淡然 <hi@ydr.me> (https://ydr.me/)"
122
+ "author": "云淡然 <hi@ydr.me> (https://ydr.me/)",
123
+ "repository": {
124
+ "type": "git",
125
+ "url": "git+https://github.com/cloudcome/utils.git"
126
+ }
128
127
  }