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 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, unknown> | unknown[] | CustomEventsTags;
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,3 +1,8 @@
1
+ /**
2
+ * 使用此函数代替!断言
3
+ * @param value 类型中必须包含 null 或 undefined
4
+ * @returns 去除 null 和 undefined 后的类型
5
+ */
1
6
  export function assertNonNullable(value) {
2
7
  /* istanbul ignore next */
3
8
  if (value === null || value === undefined) {
@@ -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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * 防抖函数
3
- * 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索
3
+ * 注意 需要在tsconfig.json的types中添加"node",否则NodeJS.Timeout会报错
4
+ * 例如 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索,
4
5
  * @param func
5
6
  * @param delay
6
7
  * @returns
@@ -1,11 +1,12 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  /**
3
2
  * 防抖函数
4
- * 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索
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,uDAAuD;AACvD;;;;;;GAMG;AACH,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"}
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"}
@@ -1,4 +1,4 @@
1
1
  /**
2
- * 深度克隆 函数相同 原型一致
2
+ * 数组和普通对象的深度克隆,原型相同
3
3
  */
4
4
  export declare function deepClone<T>(value: T): T;
@@ -1,8 +1,8 @@
1
1
  /**
2
- * 深度克隆 函数相同 原型一致
2
+ * 数组和普通对象的深度克隆,原型相同
3
3
  */
4
4
  export function deepClone(value) {
5
- if (typeof value !== "object" || value === null || value instanceof RegExp) {
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,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;QAC3E,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"}
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"}
@@ -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
- // 2个非对象类型相等或同引用对象的情况。
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
- // 到此,2个都是对象类型。
15
- const _value1 = value1;
16
- const _value2 = value2;
17
- const value1Keys = Object.keys(_value1);
18
- const value2Keys = Object.keys(_value2);
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 (!value2Keys.includes(key) || !deepEqual(_value1[key], _value2[key])) {
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,OAAO,GAAG,MAAqB,CAAC;IACtC,MAAM,OAAO,GAAG,MAAqB,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
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,4 +1,5 @@
1
1
  /**
2
- * 判断一个值是否为空对象 `{}`
2
+ * 判断一个值是否为空的普通对象 `{}`
3
+ * 有symblo和非枚举属性的对象会返回 `false`
3
4
  */
4
- export declare function isEmptyObject(obj: object): boolean;
5
+ export declare function isEmptyObject(value: unknown): boolean;
@@ -1,11 +1,12 @@
1
1
  /**
2
- * 判断一个值是否为空对象 `{}`
2
+ * 判断一个值是否为空的普通对象 `{}`
3
+ * 有symblo和非枚举属性的对象会返回 `false`
3
4
  */
4
- export function isEmptyObject(obj) {
5
- if (typeof obj !== "object" || obj === null || Array.isArray(obj) || obj instanceof Set || obj instanceof Map
6
- || obj instanceof WeakSet || obj instanceof WeakMap) {
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(obj).length === 0;
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;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IACE,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,GAAG,IAAI,GAAG,YAAY,GAAG;WACtG,GAAG,YAAY,OAAO,IAAI,GAAG,YAAY,OAAO,EACnD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC3C,CAAC"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "annil",
3
- "version": "1.8.1",
3
+ "version": "1.8.2",
4
4
  "description": "微信小程序(原生开发)插件",
5
5
  "main": "dist/index.js",
6
6
  "types": "src/index.ts",
@@ -9,7 +9,8 @@ type _SubComponentType = {
9
9
  | boolean
10
10
  | symbol
11
11
  | null
12
- | Record<string, unknown>
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ | Record<string, any>
13
14
  | unknown[]
14
15
  | CustomEventsTags;
15
16
  };
@@ -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> {
@@ -1,11 +1,12 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  /**
3
2
  * 防抖函数
4
- * 应用在输入框输入时,只有在输入完成并delay后,才会触发搜索
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
 
@@ -1,8 +1,8 @@
1
1
  /**
2
- * 深度克隆 函数相同 原型一致
2
+ * 数组和普通对象的深度克隆,原型相同
3
3
  */
4
4
  export function deepClone<T>(value: T): T {
5
- if (typeof value !== "object" || value === null || value instanceof RegExp) {
5
+ if (typeof value !== "object" || value === null) {
6
6
  return value;
7
7
  }
8
8
 
@@ -1,11 +1,11 @@
1
1
  type PlainObject = Record<string, unknown>;
2
2
  // 非null的对象类型
3
- function isNonNullObject(value: unknown): boolean {
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
- // 2个非对象类型相等或同引用对象的情况。
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
- // 到此,2个都是对象类型。
17
- const _value1 = value1 as PlainObject;
18
- const _value2 = value2 as PlainObject;
19
- const value1Keys = Object.keys(_value1);
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 !== value2Keys.length) {
21
+ if (value1Keys.length !== value2KeysSet.size) {
23
22
  return false;
24
23
  }
25
24
 
26
25
  for (const key of value1Keys) {
27
- if (!value2Keys.includes(key) || !deepEqual(_value1[key], _value2[key])) {
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(obj: object): boolean {
5
+ export function isEmptyObject(value: unknown): boolean {
5
6
  if (
6
- typeof obj !== "object" || obj === null || Array.isArray(obj) || obj instanceof Set || obj instanceof Map
7
- || obj instanceof WeakSet || obj instanceof WeakMap
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(obj).length === 0;
13
+ return Reflect.ownKeys(value).length === 0;
13
14
  }