annil 1.8.1 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/api/SubComponent/SubComponentType.d.ts +1 -1
- package/dist/utils/assertNonNullable.d.ts +5 -0
- package/dist/utils/assertNonNullable.js +5 -0
- package/dist/utils/assertNonNullable.js.map +1 -1
- package/dist/utils/debounce.d.ts +2 -1
- package/dist/utils/debounce.js +3 -2
- package/dist/utils/debounce.js.map +1 -1
- package/dist/utils/deepClone.d.ts +1 -1
- package/dist/utils/deepClone.js +2 -2
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/deepEqual.js +7 -8
- package/dist/utils/deepEqual.js.map +1 -1
- package/dist/utils/isEmptyObject.d.ts +3 -2
- package/dist/utils/isEmptyObject.js +6 -5
- package/dist/utils/isEmptyObject.js.map +1 -1
- package/package.json +1 -1
- package/src/api/SubComponent/SubComponentType.ts +2 -1
- package/src/utils/assertNonNullable.ts +5 -0
- package/src/utils/debounce.ts +3 -2
- package/src/utils/deepClone.ts +2 -2
- package/src/utils/deepEqual.ts +8 -9
- package/src/utils/isEmptyObject.ts +6 -5
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
* 解决DetailedType不接收接口类型的错误 ([ae8acbf](https://github.com/missannil/annil/commit/ae8acbfc2e62f99db565c448ad9253aa549e78bb))
|
|
6
6
|
|
|
7
|
+
## [1.8.2](https://github.com/missannil/annil/compare/v1.8.1...v1.8.2) (2024-09-07)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* 优化_SubComponentType类型,避免接口或类的类型由于无签名照成的报错 ([ab97097](https://github.com/missannil/annil/commit/ab970972717b08138c8438825a1e19f7e3dd7c38))
|
|
13
|
+
|
|
7
14
|
## [1.8.1](https://github.com/missannil/annil/compare/v1.8.0...v1.8.1) (2024-09-07)
|
|
8
15
|
|
|
9
16
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SelectKeys } from "hry-types/src/Object/_api";
|
|
2
2
|
import type { Composed, CustomEventsTags } from "../RootComponent/CustomEvents/CustomEventsTag";
|
|
3
3
|
type _SubComponentType = {
|
|
4
|
-
[k in string]: string | number | bigint | boolean | symbol | null | Record<string,
|
|
4
|
+
[k in string]: string | number | bigint | boolean | symbol | null | Record<string, any> | unknown[] | CustomEventsTags;
|
|
5
5
|
};
|
|
6
6
|
type _Validator<O, ErrKeys = Exclude<keyof O, SelectKeys<O, Composed, "contains->">>> = [ErrKeys] extends [never] ? _SubComponentType : `${ErrKeys & string} 不是穿透事件`;
|
|
7
7
|
/**
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import type { IfContains } from "hry-types/src/Any/IfContains";
|
|
2
|
+
/**
|
|
3
|
+
* 使用此函数代替!断言
|
|
4
|
+
* @param value 类型中必须包含 null 或 undefined
|
|
5
|
+
* @returns 去除 null 和 undefined 后的类型
|
|
6
|
+
*/
|
|
2
7
|
export declare function assertNonNullable<T>(value: IfContains<T, null | undefined, T, "参数类型必须包含 null 或 undefined">): NonNullable<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertNonNullable.js","sourceRoot":"","sources":["../../src/utils/assertNonNullable.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAC/B,KAAsE;IAEtE,2BAA2B;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAuB,CAAC;AACjC,CAAC"}
|
|
1
|
+
{"version":3,"file":"assertNonNullable.js","sourceRoot":"","sources":["../../src/utils/assertNonNullable.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAsE;IAEtE,2BAA2B;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAuB,CAAC;AACjC,CAAC"}
|
package/dist/utils/debounce.d.ts
CHANGED
package/dist/utils/debounce.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
1
|
/**
|
|
3
2
|
* 防抖函数
|
|
4
|
-
*
|
|
3
|
+
* 注意 需要在tsconfig.json的types中添加"node",否则NodeJS.Timeout会报错
|
|
4
|
+
* 例如 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索,
|
|
5
5
|
* @param func
|
|
6
6
|
* @param delay
|
|
7
7
|
* @returns
|
|
8
8
|
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
10
|
export function debounce(func, delay) {
|
|
10
11
|
let timeoutId = null;
|
|
11
12
|
return (...args) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/utils/debounce.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/utils/debounce.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,8DAA8D;AAC9D,MAAM,UAAU,QAAQ,CAAoC,IAAO,EAAE,KAAa;IAChF,IAAI,SAAS,GAA0B,IAAI,CAAC;IAE5C,OAAO,CAAC,GAAG,IAAmB,EAAQ,EAAE;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/utils/deepClone.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 数组和普通对象的深度克隆,原型相同
|
|
3
3
|
*/
|
|
4
4
|
export function deepClone(value) {
|
|
5
|
-
if (typeof value !== "object" || value === null
|
|
5
|
+
if (typeof value !== "object" || value === null) {
|
|
6
6
|
return value;
|
|
7
7
|
}
|
|
8
8
|
const clone = (Array.isArray(value) ? [] : {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepClone.js","sourceRoot":"","sources":["../../src/utils/deepClone.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAI,KAAQ;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"deepClone.js","sourceRoot":"","sources":["../../src/utils/deepClone.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAI,KAAQ;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAM,CAAC;IAEpD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/utils/deepEqual.js
CHANGED
|
@@ -3,7 +3,7 @@ function isNonNullObject(value) {
|
|
|
3
3
|
return value !== null && typeof value === "object";
|
|
4
4
|
}
|
|
5
5
|
export function deepEqual(value1, value2) {
|
|
6
|
-
//
|
|
6
|
+
// 两个非对象类型相等或同引用对象的情况。
|
|
7
7
|
if (Object.is(value1, value2)) {
|
|
8
8
|
return true;
|
|
9
9
|
}
|
|
@@ -11,16 +11,15 @@ export function deepEqual(value1, value2) {
|
|
|
11
11
|
if (!isNonNullObject(value1) || !isNonNullObject(value2)) {
|
|
12
12
|
return false;
|
|
13
13
|
}
|
|
14
|
-
//
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
if (value1Keys.length !== value2Keys.length) {
|
|
14
|
+
// 到此两个值都是对象类型。
|
|
15
|
+
const value1Keys = Object.keys(value1);
|
|
16
|
+
// 使用Set提高查找效率。
|
|
17
|
+
const value2KeysSet = new Set(Object.keys(value2));
|
|
18
|
+
if (value1Keys.length !== value2KeysSet.size) {
|
|
20
19
|
return false;
|
|
21
20
|
}
|
|
22
21
|
for (const key of value1Keys) {
|
|
23
|
-
if (!
|
|
22
|
+
if (!value2KeysSet.has(key) || !deepEqual(value1[key], value2[key])) {
|
|
24
23
|
return false;
|
|
25
24
|
}
|
|
26
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepEqual.js","sourceRoot":"","sources":["../../src/utils/deepEqual.ts"],"names":[],"mappings":"AACA,aAAa;AACb,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAe,EAAE,MAAe;IACxD,sBAAsB;IACtB,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,qBAAqB;IACrB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,eAAe;IACf,MAAM,
|
|
1
|
+
{"version":3,"file":"deepEqual.js","sourceRoot":"","sources":["../../src/utils/deepEqual.ts"],"names":[],"mappings":"AACA,aAAa;AACb,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAe,EAAE,MAAe;IACxD,sBAAsB;IACtB,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,qBAAqB;IACrB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,eAAe;IACf,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,eAAe;IACf,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnD,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 判断一个值是否为空的普通对象 `{}`
|
|
3
|
+
* 有symblo和非枚举属性的对象会返回 `false`
|
|
3
4
|
*/
|
|
4
|
-
export function isEmptyObject(
|
|
5
|
-
if (typeof
|
|
6
|
-
||
|
|
5
|
+
export function isEmptyObject(value) {
|
|
6
|
+
if (typeof value !== "object" || value === null || Array.isArray(value) || value instanceof Set || value instanceof Map
|
|
7
|
+
|| value instanceof WeakSet || value instanceof WeakMap) {
|
|
7
8
|
return false;
|
|
8
9
|
}
|
|
9
|
-
return Reflect.ownKeys(
|
|
10
|
+
return Reflect.ownKeys(value).length === 0;
|
|
10
11
|
}
|
|
11
12
|
//# sourceMappingURL=isEmptyObject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isEmptyObject.js","sourceRoot":"","sources":["../../src/utils/isEmptyObject.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"isEmptyObject.js","sourceRoot":"","sources":["../../src/utils/isEmptyObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IACE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,GAAG,IAAI,KAAK,YAAY,GAAG;WAChH,KAAK,YAAY,OAAO,IAAI,KAAK,YAAY,OAAO,EACvD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { IfContains } from "hry-types/src/Any/IfContains";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* 使用此函数代替!断言
|
|
5
|
+
* @param value 类型中必须包含 null 或 undefined
|
|
6
|
+
* @returns 去除 null 和 undefined 后的类型
|
|
7
|
+
*/
|
|
3
8
|
export function assertNonNullable<T>(
|
|
4
9
|
value: IfContains<T, null | undefined, T, "参数类型必须包含 null 或 undefined">,
|
|
5
10
|
): NonNullable<T> {
|
package/src/utils/debounce.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
1
|
/**
|
|
3
2
|
* 防抖函数
|
|
4
|
-
*
|
|
3
|
+
* 注意 需要在tsconfig.json的types中添加"node",否则NodeJS.Timeout会报错
|
|
4
|
+
* 例如 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索,
|
|
5
5
|
* @param func
|
|
6
6
|
* @param delay
|
|
7
7
|
* @returns
|
|
8
8
|
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
10
|
export function debounce<F extends (...args: any[]) => any>(func: F, delay: number): (...args: Parameters<F>) => void {
|
|
10
11
|
let timeoutId: NodeJS.Timeout | null = null;
|
|
11
12
|
|
package/src/utils/deepClone.ts
CHANGED
package/src/utils/deepEqual.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
type PlainObject = Record<string, unknown>;
|
|
2
2
|
// 非null的对象类型
|
|
3
|
-
function isNonNullObject(value: unknown):
|
|
3
|
+
function isNonNullObject(value: unknown): value is PlainObject {
|
|
4
4
|
return value !== null && typeof value === "object";
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
export function deepEqual(value1: unknown, value2: unknown): boolean {
|
|
8
|
-
//
|
|
8
|
+
// 两个非对象类型相等或同引用对象的情况。
|
|
9
9
|
if (Object.is(value1, value2)) {
|
|
10
10
|
return true;
|
|
11
11
|
}
|
|
@@ -13,18 +13,17 @@ export function deepEqual(value1: unknown, value2: unknown): boolean {
|
|
|
13
13
|
if (!isNonNullObject(value1) || !isNonNullObject(value2)) {
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
16
|
-
//
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
const value2Keys = Object.keys(_value2);
|
|
16
|
+
// 到此两个值都是对象类型。
|
|
17
|
+
const value1Keys = Object.keys(value1);
|
|
18
|
+
// 使用Set提高查找效率。
|
|
19
|
+
const value2KeysSet = new Set(Object.keys(value2));
|
|
21
20
|
|
|
22
|
-
if (value1Keys.length !==
|
|
21
|
+
if (value1Keys.length !== value2KeysSet.size) {
|
|
23
22
|
return false;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
for (const key of value1Keys) {
|
|
27
|
-
if (!
|
|
26
|
+
if (!value2KeysSet.has(key) || !deepEqual(value1[key], value2[key])) {
|
|
28
27
|
return false;
|
|
29
28
|
}
|
|
30
29
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 判断一个值是否为空的普通对象 `{}`
|
|
3
|
+
* 有symblo和非枚举属性的对象会返回 `false`
|
|
3
4
|
*/
|
|
4
|
-
export function isEmptyObject(
|
|
5
|
+
export function isEmptyObject(value: unknown): boolean {
|
|
5
6
|
if (
|
|
6
|
-
typeof
|
|
7
|
-
||
|
|
7
|
+
typeof value !== "object" || value === null || Array.isArray(value) || value instanceof Set || value instanceof Map
|
|
8
|
+
|| value instanceof WeakSet || value instanceof WeakMap
|
|
8
9
|
) {
|
|
9
10
|
return false;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
return Reflect.ownKeys(
|
|
13
|
+
return Reflect.ownKeys(value).length === 0;
|
|
13
14
|
}
|