sculp-js 1.13.3-beta.0 → 1.13.6

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 (119) hide show
  1. package/dist/cjs/_virtual/_commonjsHelpers.js +3 -3
  2. package/dist/cjs/array.js +36 -46
  3. package/dist/cjs/async.js +41 -43
  4. package/dist/cjs/base64.js +77 -66
  5. package/dist/cjs/clipboard.js +54 -53
  6. package/dist/cjs/cloneDeep.js +90 -91
  7. package/dist/cjs/cookie.js +27 -30
  8. package/dist/cjs/date.js +101 -98
  9. package/dist/cjs/dom.js +114 -121
  10. package/dist/cjs/download.js +77 -78
  11. package/dist/cjs/easing.js +29 -32
  12. package/dist/cjs/file.js +147 -152
  13. package/dist/cjs/func.js +64 -78
  14. package/dist/cjs/index.js +1 -3
  15. package/dist/cjs/math.js +32 -38
  16. package/dist/cjs/node_modules/bezier-easing/src/index.js +35 -23
  17. package/dist/cjs/number.js +58 -61
  18. package/dist/cjs/object.js +112 -126
  19. package/dist/cjs/path.js +39 -43
  20. package/dist/cjs/qs.js +34 -41
  21. package/dist/cjs/random.js +31 -34
  22. package/dist/cjs/string.js +62 -63
  23. package/dist/cjs/tooltip.js +66 -69
  24. package/dist/cjs/tree.js +265 -263
  25. package/dist/cjs/type.js +42 -46
  26. package/dist/cjs/unique.js +39 -42
  27. package/dist/cjs/url.js +47 -48
  28. package/dist/cjs/validator.js +38 -38
  29. package/dist/cjs/variable.js +27 -21
  30. package/dist/cjs/watermark.js +78 -67
  31. package/dist/esm/array.js +36 -46
  32. package/dist/esm/async.js +41 -43
  33. package/dist/esm/base64.js +77 -66
  34. package/dist/esm/clipboard.js +55 -54
  35. package/dist/esm/cloneDeep.js +90 -91
  36. package/dist/esm/cookie.js +27 -30
  37. package/dist/esm/date.js +101 -98
  38. package/dist/esm/dom.js +114 -121
  39. package/dist/esm/download.js +78 -79
  40. package/dist/esm/easing.js +29 -32
  41. package/dist/esm/file.js +147 -152
  42. package/dist/esm/func.js +64 -78
  43. package/dist/esm/index.js +96 -8
  44. package/dist/esm/math.js +32 -38
  45. package/dist/esm/number.js +58 -61
  46. package/dist/esm/object.js +124 -127
  47. package/dist/esm/path.js +39 -43
  48. package/dist/esm/qs.js +34 -41
  49. package/dist/esm/random.js +31 -34
  50. package/dist/esm/string.js +74 -64
  51. package/dist/esm/tooltip.js +66 -69
  52. package/dist/esm/tree.js +265 -263
  53. package/dist/esm/type.js +68 -47
  54. package/dist/esm/unique.js +39 -42
  55. package/dist/esm/url.js +47 -48
  56. package/dist/esm/validator.js +56 -39
  57. package/dist/esm/variable.js +27 -21
  58. package/dist/esm/watermark.js +79 -68
  59. package/dist/types/array.d.ts +0 -1
  60. package/dist/types/async.d.ts +0 -1
  61. package/dist/types/base64.d.ts +0 -1
  62. package/dist/types/clipboard.d.ts +0 -1
  63. package/dist/types/cloneDeep.d.ts +0 -1
  64. package/dist/types/cookie.d.ts +0 -1
  65. package/dist/types/date.d.ts +0 -1
  66. package/dist/types/dom.d.ts +0 -1
  67. package/dist/types/download.d.ts +0 -1
  68. package/dist/types/easing.d.ts +0 -1
  69. package/dist/types/file.d.ts +0 -1
  70. package/dist/types/func.d.ts +0 -1
  71. package/dist/types/index.d.ts +0 -1
  72. package/dist/types/math.d.ts +0 -1
  73. package/dist/types/number.d.ts +0 -1
  74. package/dist/types/object.d.ts +0 -1
  75. package/dist/types/path.d.ts +0 -1
  76. package/dist/types/qs.d.ts +0 -1
  77. package/dist/types/random.d.ts +0 -1
  78. package/dist/types/string.d.ts +0 -1
  79. package/dist/types/tooltip.d.ts +0 -1
  80. package/dist/types/tree.d.ts +2 -2
  81. package/dist/types/type.d.ts +0 -1
  82. package/dist/types/unique.d.ts +0 -1
  83. package/dist/types/url.d.ts +0 -1
  84. package/dist/types/validator.d.ts +0 -1
  85. package/dist/types/variable.d.ts +0 -1
  86. package/dist/types/watermark.d.ts +0 -1
  87. package/dist/umd/index.min.js +2 -2
  88. package/package.json +12 -6
  89. package/dist/types/array.d.ts.map +0 -1
  90. package/dist/types/async.d.ts.map +0 -1
  91. package/dist/types/base64.d.ts.map +0 -1
  92. package/dist/types/clipboard.d.ts.map +0 -1
  93. package/dist/types/cloneDeep.d.ts.map +0 -1
  94. package/dist/types/cookie.d.ts.map +0 -1
  95. package/dist/types/core-index.d.ts +0 -17
  96. package/dist/types/core-index.d.ts.map +0 -1
  97. package/dist/types/date.d.ts.map +0 -1
  98. package/dist/types/dom.d.ts.map +0 -1
  99. package/dist/types/download.d.ts.map +0 -1
  100. package/dist/types/easing.d.ts.map +0 -1
  101. package/dist/types/file.d.ts.map +0 -1
  102. package/dist/types/func.d.ts.map +0 -1
  103. package/dist/types/index.d.ts.map +0 -1
  104. package/dist/types/index.js +0 -3278
  105. package/dist/types/math.d.ts.map +0 -1
  106. package/dist/types/number.d.ts.map +0 -1
  107. package/dist/types/object.d.ts.map +0 -1
  108. package/dist/types/path.d.ts.map +0 -1
  109. package/dist/types/qs.d.ts.map +0 -1
  110. package/dist/types/random.d.ts.map +0 -1
  111. package/dist/types/string.d.ts.map +0 -1
  112. package/dist/types/tooltip.d.ts.map +0 -1
  113. package/dist/types/tree.d.ts.map +0 -1
  114. package/dist/types/type.d.ts.map +0 -1
  115. package/dist/types/unique.d.ts.map +0 -1
  116. package/dist/types/url.d.ts.map +0 -1
  117. package/dist/types/validator.d.ts.map +0 -1
  118. package/dist/types/variable.d.ts.map +0 -1
  119. package/dist/types/watermark.d.ts.map +0 -1
@@ -1,11 +1,11 @@
1
1
  /*!
2
- * sculp-js v1.13.3-beta.0
2
+ * sculp-js v1.13.6
3
3
  * (c) 2023-present chandq
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
7
  import { select } from './dom.js';
8
- import { isFunction, isNullOrUnDef } from './type.js';
8
+ import { isNullOrUnDef, isFunction } from './type.js';
9
9
 
10
10
  /**
11
11
  * 复制文本,优先使用navigator.clipboard,仅在安全上下文(HTTPS/localhost)下生效,若不支持则回退使用execCommand方式
@@ -15,23 +15,22 @@ import { isFunction, isNullOrUnDef } from './type.js';
15
15
  * 解决脱离文档流的元素无法复制的问题,如Modal内复制操作)
16
16
  */
17
17
  function copyText(text, options) {
18
- const { successCallback = void 0, failCallback = void 0 } = isNullOrUnDef(options) ? {} : options;
19
- if (navigator.clipboard) {
20
- navigator.clipboard
21
- .writeText(text)
22
- .then(() => {
23
- if (isFunction(successCallback)) {
24
- successCallback();
25
- }
26
- })
27
- .catch(err => {
28
- fallbackCopyText(text, options);
29
- });
30
- }
31
- else {
32
- // 使用旧版execCommand方法
18
+ const { successCallback = void 0, failCallback = void 0 } = isNullOrUnDef(options) ? {} : options;
19
+ if (navigator.clipboard) {
20
+ navigator.clipboard
21
+ .writeText(text)
22
+ .then(() => {
23
+ if (isFunction(successCallback)) {
24
+ successCallback();
25
+ }
26
+ })
27
+ .catch(err => {
33
28
  fallbackCopyText(text, options);
34
- }
29
+ });
30
+ } else {
31
+ // 使用旧版execCommand方法
32
+ fallbackCopyText(text, options);
33
+ }
35
34
  }
36
35
  /**
37
36
  * 使用execCommand方式复制文本
@@ -39,27 +38,29 @@ function copyText(text, options) {
39
38
  * @param options
40
39
  */
41
40
  function fallbackCopyText(text, options) {
42
- const { successCallback = void 0, failCallback = void 0, container = document.body } = isNullOrUnDef(options) ? {} : options;
43
- let textEl = createFakeElement(text);
44
- container.appendChild(textEl);
45
- select(textEl);
46
- try {
47
- const res = document.execCommand('copy');
48
- if (res && isFunction(successCallback)) {
49
- successCallback();
50
- }
51
- }
52
- catch (err) {
53
- if (isFunction(failCallback)) {
54
- failCallback(err);
55
- }
41
+ const {
42
+ successCallback = void 0,
43
+ failCallback = void 0,
44
+ container = document.body
45
+ } = isNullOrUnDef(options) ? {} : options;
46
+ let textEl = createFakeElement(text);
47
+ container.appendChild(textEl);
48
+ select(textEl);
49
+ try {
50
+ const res = document.execCommand('copy');
51
+ if (res && isFunction(successCallback)) {
52
+ successCallback();
56
53
  }
57
- finally {
58
- container.removeChild(textEl);
59
- // @ts-ignore
60
- textEl = null;
61
- window.getSelection()?.removeAllRanges(); // 清除选区
54
+ } catch (err) {
55
+ if (isFunction(failCallback)) {
56
+ failCallback(err);
62
57
  }
58
+ } finally {
59
+ container.removeChild(textEl);
60
+ // @ts-ignore
61
+ textEl = null;
62
+ window.getSelection()?.removeAllRanges(); // 清除选区
63
+ }
63
64
  }
64
65
  /**
65
66
  * Creates a fake textarea element with a value.
@@ -67,23 +68,23 @@ function fallbackCopyText(text, options) {
67
68
  * @return {HTMLElement}
68
69
  */
69
70
  function createFakeElement(value) {
70
- const isRTL = document.documentElement.getAttribute('dir') === 'rtl';
71
- const fakeElement = document.createElement('textarea');
72
- // Prevent zooming on iOS
73
- fakeElement.style.fontSize = '12pt';
74
- // Reset box model
75
- fakeElement.style.border = '0';
76
- fakeElement.style.padding = '0';
77
- fakeElement.style.margin = '0';
78
- // Move element out of screen horizontally
79
- fakeElement.style.position = 'absolute';
80
- fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px';
81
- // Move element to the same position vertically
82
- const yPosition = window.pageYOffset || document.documentElement.scrollTop;
83
- fakeElement.style.top = `${yPosition}px`;
84
- fakeElement.setAttribute('readonly', '');
85
- fakeElement.value = value;
86
- return fakeElement;
71
+ const isRTL = document.documentElement.getAttribute('dir') === 'rtl';
72
+ const fakeElement = document.createElement('textarea');
73
+ // Prevent zooming on iOS
74
+ fakeElement.style.fontSize = '12pt';
75
+ // Reset box model
76
+ fakeElement.style.border = '0';
77
+ fakeElement.style.padding = '0';
78
+ fakeElement.style.margin = '0';
79
+ // Move element out of screen horizontally
80
+ fakeElement.style.position = 'absolute';
81
+ fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px';
82
+ // Move element to the same position vertically
83
+ const yPosition = window.pageYOffset || document.documentElement.scrollTop;
84
+ fakeElement.style.top = `${yPosition}px`;
85
+ fakeElement.setAttribute('readonly', '');
86
+ fakeElement.value = value;
87
+ return fakeElement;
87
88
  }
88
89
 
89
90
  export { copyText, fallbackCopyText };
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * sculp-js v1.13.3-beta.0
2
+ * sculp-js v1.13.6
3
3
  * (c) 2023-present chandq
4
4
  * Released under the MIT License.
5
5
  */
@@ -15,101 +15,100 @@
15
15
  * @returns {T}
16
16
  */
17
17
  function cloneDeep(source, map = new WeakMap()) {
18
- // 处理原始类型和 null/undefined
19
- if (source === null || typeof source !== 'object') {
20
- return source;
21
- }
22
- // 处理循环引用
23
- if (map.has(source)) {
24
- return map.get(source);
25
- }
26
- // 处理 ArrayBuffer
27
- if (source instanceof ArrayBuffer) {
28
- const copy = new ArrayBuffer(source.byteLength);
29
- new Uint8Array(copy).set(new Uint8Array(source));
30
- map.set(source, copy);
31
- return copy;
32
- }
33
- // 处理 DataView 和 TypedArray (Uint8Array 等)
34
- if (ArrayBuffer.isView(source)) {
35
- const constructor = source.constructor;
36
- const bufferCopy = cloneDeep(source.buffer, map);
37
- return new constructor(bufferCopy, source.byteOffset, source.length);
38
- }
39
- // 处理 Date 对象
40
- if (source instanceof Date) {
41
- const copy = new Date(source.getTime());
42
- map.set(source, copy);
43
- return copy;
44
- }
45
- // 处理 RegExp 对象
46
- if (source instanceof RegExp) {
47
- const copy = new RegExp(source.source, source.flags);
48
- copy.lastIndex = source.lastIndex; // 保留匹配状态
49
- map.set(source, copy);
50
- return copy;
51
- }
52
- // 处理 Map
53
- if (source instanceof Map) {
54
- const copy = new Map();
55
- map.set(source, copy);
56
- source.forEach((value, key) => {
57
- copy.set(cloneDeep(key, map), cloneDeep(value, map));
58
- });
59
- return copy;
60
- }
61
- // 处理 Set
62
- if (source instanceof Set) {
63
- const copy = new Set();
64
- map.set(source, copy);
65
- source.forEach(value => {
66
- copy.add(cloneDeep(value, map));
67
- });
68
- return copy;
69
- }
70
- // 处理数组 (包含稀疏数组)
71
- if (Array.isArray(source)) {
72
- const copy = new Array(source.length);
73
- map.set(source, copy);
74
- // 克隆所有有效索引
75
- for (let i = 0, len = source.length; i < len; i++) {
76
- if (i in source) {
77
- // 保留空位
78
- copy[i] = cloneDeep(source[i], map);
79
- }
80
- }
81
- // 克隆数组的自定义属性
82
- const descriptors = Object.getOwnPropertyDescriptors(source);
83
- for (const key of Reflect.ownKeys(descriptors)) {
84
- Object.defineProperty(copy, key, {
85
- ...descriptors[key],
86
- value: cloneDeep(descriptors[key].value, map)
87
- });
88
- }
89
- return copy;
90
- }
91
- // 处理普通对象和类实例
92
- const copy = Object.create(Object.getPrototypeOf(source));
18
+ // 处理原始类型和 null/undefined
19
+ if (source === null || typeof source !== 'object') {
20
+ return source;
21
+ }
22
+ // 处理循环引用
23
+ if (map.has(source)) {
24
+ return map.get(source);
25
+ }
26
+ // 处理 ArrayBuffer
27
+ if (source instanceof ArrayBuffer) {
28
+ const copy = new ArrayBuffer(source.byteLength);
29
+ new Uint8Array(copy).set(new Uint8Array(source));
30
+ map.set(source, copy);
31
+ return copy;
32
+ }
33
+ // 处理 DataView 和 TypedArray (Uint8Array 等)
34
+ if (ArrayBuffer.isView(source)) {
35
+ const constructor = source.constructor;
36
+ const bufferCopy = cloneDeep(source.buffer, map);
37
+ return new constructor(bufferCopy, source.byteOffset, source.length);
38
+ }
39
+ // 处理 Date 对象
40
+ if (source instanceof Date) {
41
+ const copy = new Date(source.getTime());
93
42
  map.set(source, copy);
43
+ return copy;
44
+ }
45
+ // 处理 RegExp 对象
46
+ if (source instanceof RegExp) {
47
+ const copy = new RegExp(source.source, source.flags);
48
+ copy.lastIndex = source.lastIndex; // 保留匹配状态
49
+ map.set(source, copy);
50
+ return copy;
51
+ }
52
+ // 处理 Map
53
+ if (source instanceof Map) {
54
+ const copy = new Map();
55
+ map.set(source, copy);
56
+ source.forEach((value, key) => {
57
+ copy.set(cloneDeep(key, map), cloneDeep(value, map));
58
+ });
59
+ return copy;
60
+ }
61
+ // 处理 Set
62
+ if (source instanceof Set) {
63
+ const copy = new Set();
64
+ map.set(source, copy);
65
+ source.forEach(value => {
66
+ copy.add(cloneDeep(value, map));
67
+ });
68
+ return copy;
69
+ }
70
+ // 处理数组 (包含稀疏数组)
71
+ if (Array.isArray(source)) {
72
+ const copy = new Array(source.length);
73
+ map.set(source, copy);
74
+ // 克隆所有有效索引
75
+ for (let i = 0, len = source.length; i < len; i++) {
76
+ if (i in source) {
77
+ // 保留空位
78
+ copy[i] = cloneDeep(source[i], map);
79
+ }
80
+ }
81
+ // 克隆数组的自定义属性
94
82
  const descriptors = Object.getOwnPropertyDescriptors(source);
95
83
  for (const key of Reflect.ownKeys(descriptors)) {
96
- const descriptor = descriptors[key];
97
- if ('value' in descriptor) {
98
- // 克隆数据属性
99
- descriptor.value = cloneDeep(descriptor.value, map);
100
- }
101
- else {
102
- // 处理访问器属性 (getter/setter)
103
- if (descriptor.get) {
104
- descriptor.get = cloneDeep(descriptor.get, map);
105
- }
106
- if (descriptor.set) {
107
- descriptor.set = cloneDeep(descriptor.set, map);
108
- }
109
- }
110
- Object.defineProperty(copy, key, descriptor);
84
+ Object.defineProperty(copy, key, {
85
+ ...descriptors[key],
86
+ value: cloneDeep(descriptors[key].value, map)
87
+ });
111
88
  }
112
89
  return copy;
90
+ }
91
+ // 处理普通对象和类实例
92
+ const copy = Object.create(Object.getPrototypeOf(source));
93
+ map.set(source, copy);
94
+ const descriptors = Object.getOwnPropertyDescriptors(source);
95
+ for (const key of Reflect.ownKeys(descriptors)) {
96
+ const descriptor = descriptors[key];
97
+ if ('value' in descriptor) {
98
+ // 克隆数据属性
99
+ descriptor.value = cloneDeep(descriptor.value, map);
100
+ } else {
101
+ // 处理访问器属性 (getter/setter)
102
+ if (descriptor.get) {
103
+ descriptor.get = cloneDeep(descriptor.get, map);
104
+ }
105
+ if (descriptor.set) {
106
+ descriptor.set = cloneDeep(descriptor.set, map);
107
+ }
108
+ }
109
+ Object.defineProperty(copy, key, descriptor);
110
+ }
111
+ return copy;
113
112
  }
114
113
 
115
114
  export { cloneDeep };
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * sculp-js v1.13.3-beta.0
2
+ * sculp-js v1.13.6
3
3
  * (c) 2023-present chandq
4
4
  * Released under the MIT License.
5
5
  */
@@ -12,17 +12,15 @@ import { isNumber, isDate } from './type.js';
12
12
  * @returns {string}
13
13
  */
14
14
  function cookieGet(name) {
15
- const { cookie } = document;
16
- if (!cookie)
17
- return '';
18
- const result = cookie.split(';');
19
- for (let i = 0; i < result.length; i++) {
20
- const item = result[i];
21
- const [key, val = ''] = item.split('=');
22
- if (key === name)
23
- return decodeURIComponent(val);
24
- }
25
- return '';
15
+ const { cookie } = document;
16
+ if (!cookie) return '';
17
+ const result = cookie.split(';');
18
+ for (let i = 0; i < result.length; i++) {
19
+ const item = result[i];
20
+ const [key, val = ''] = item.split('=');
21
+ if (key === name) return decodeURIComponent(val);
22
+ }
23
+ return '';
26
24
  }
27
25
  /**
28
26
  * 设置 cookie
@@ -31,29 +29,28 @@ function cookieGet(name) {
31
29
  * @param {number | Date} [maxAge]
32
30
  */
33
31
  function cookieSet(name, value, maxAge) {
34
- const metas = [];
35
- const EXPIRES = 'expires';
36
- metas.push([name, encodeURIComponent(value)]);
37
- if (isNumber(maxAge)) {
38
- const d = new Date();
39
- d.setTime(d.getTime() + maxAge);
40
- metas.push([EXPIRES, d.toUTCString()]);
41
- }
42
- else if (isDate(maxAge)) {
43
- metas.push([EXPIRES, maxAge.toUTCString()]);
44
- }
45
- metas.push(['path', '/']);
46
- document.cookie = metas
47
- .map(item => {
48
- const [key, val] = item;
49
- return `${key}=${val}`;
32
+ const metas = [];
33
+ const EXPIRES = 'expires';
34
+ metas.push([name, encodeURIComponent(value)]);
35
+ if (isNumber(maxAge)) {
36
+ const d = new Date();
37
+ d.setTime(d.getTime() + maxAge);
38
+ metas.push([EXPIRES, d.toUTCString()]);
39
+ } else if (isDate(maxAge)) {
40
+ metas.push([EXPIRES, maxAge.toUTCString()]);
41
+ }
42
+ metas.push(['path', '/']);
43
+ document.cookie = metas
44
+ .map(item => {
45
+ const [key, val] = item;
46
+ return `${key}=${val}`;
50
47
  })
51
- .join(';');
48
+ .join(';');
52
49
  }
53
50
  /**
54
51
  * 删除单个 cookie
55
52
  * @param name cookie 名称
56
53
  */
57
- const cookieDel = (name) => cookieSet(name, '', -1);
54
+ const cookieDel = name => cookieSet(name, '', -1);
58
55
 
59
56
  export { cookieDel, cookieGet, cookieSet };