is-what 3.9.0 → 3.11.2

Sign up to get free protection for your applications and to get access to all the features.
package/.eslintignore CHANGED
@@ -6,3 +6,4 @@ dist
6
6
  coverage
7
7
 
8
8
  test
9
+ .eslintrc.js
package/README.md CHANGED
@@ -1,10 +1,12 @@
1
1
  # is What? 🙉
2
2
 
3
+ Very simple & small JS type check functions. It's fully TypeScript supported!
4
+
3
5
  ```
4
6
  npm i is-what
5
7
  ```
6
8
 
7
- Very simple & small JS type check functions. It's fully TypeScript supported!
9
+ Or for deno available at: `"deno.land/x/is_what"`
8
10
 
9
11
  ## Motivation
10
12
 
@@ -110,7 +112,7 @@ getType(specialObject) // returns 'Object'
110
112
 
111
113
  is-what makes TypeScript know the type during if statements. This means that a check returns the type of the payload for TypeScript users.
112
114
 
113
- ```TypeScript
115
+ ```ts
114
116
  function isNumber (payload: any): payload is number {
115
117
  // return boolean
116
118
  }
@@ -127,7 +129,7 @@ function fn (payload: string | number): number {
127
129
 
128
130
  `isPlainObject` and `isAnyObject` with TypeScript will declare the payload to be an object type with any props:
129
131
 
130
- ```TypeScript
132
+ ```ts
131
133
  function isPlainObject (payload: any): payload is {[key: string]: any}
132
134
  function isAnyObject (payload: any): payload is {[key: string]: any}
133
135
  // The reason to return `{[key: string]: any}` is to be able to do
@@ -139,7 +141,7 @@ if (isPlainObject(payload) && payload.id) return payload.id
139
141
 
140
142
  If you want more control over which kind of objects are allowed you can use `isObjectLike<T>`:
141
143
 
142
- ```TypeScript
144
+ ```ts
143
145
  import { isObjectLike } from 'is-what'
144
146
  // usage examples:
145
147
  isObjectLike<{specificKey: string}>(payload)
@@ -149,7 +151,7 @@ isObjectLike<object>(payload)
149
151
 
150
152
  `isObjectLike<T>` works like this under the hood:
151
153
 
152
- ```TypeScript
154
+ ```ts
153
155
  function isObjectLike<T extends object> (payload: any): payload is T {
154
156
  return isAnyObject(payload)
155
157
  }
@@ -18,7 +18,7 @@ import typescript from 'rollup-plugin-typescript2'
18
18
  // ------------------------------------------------------------------------------------------
19
19
  // setup
20
20
  // ------------------------------------------------------------------------------------------
21
- const pkg = require('../package.json')
21
+ const pkg = require('./package.json')
22
22
  const name = pkg.name
23
23
  const className = name.replace(/(^\w|-\w)/g, c => c.replace('-', '').toUpperCase())
24
24
  const external = Object.keys(pkg.dependencies || [])
package/dist/index.cjs.js CHANGED
@@ -33,7 +33,7 @@ function isNull(payload) {
33
33
  * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
34
34
  *
35
35
  * @param {*} payload
36
- * @returns {payload is {[key: string]: any}}
36
+ * @returns {payload is Record<string, any>}
37
37
  */
38
38
  function isPlainObject(payload) {
39
39
  if (getType(payload) !== 'Object')
@@ -44,16 +44,25 @@ function isPlainObject(payload) {
44
44
  * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
45
45
  *
46
46
  * @param {*} payload
47
- * @returns {payload is {[key: string]: any}}
47
+ * @returns {payload is Record<string, any>}
48
48
  */
49
49
  function isObject(payload) {
50
50
  return isPlainObject(payload);
51
51
  }
52
+ /**
53
+ * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)
54
+ *
55
+ * @param {*} payload
56
+ * @returns {payload is { [K in any]: never }}
57
+ */
58
+ function isEmptyObject(payload) {
59
+ return isPlainObject(payload) && Object.keys(payload).length === 0;
60
+ }
52
61
  /**
53
62
  * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)
54
63
  *
55
64
  * @param {*} payload
56
- * @returns {payload is {[key: string]: any}}
65
+ * @returns {payload is Record<string, any>}
57
66
  */
58
67
  function isAnyObject(payload) {
59
68
  return getType(payload) === 'Object';
@@ -74,7 +83,7 @@ function isObjectLike(payload) {
74
83
  * Returns whether the payload is a function
75
84
  *
76
85
  * @param {*} payload
77
- * @returns {payload is Function}
86
+ * @returns {payload is AnyFunction}
78
87
  */
79
88
  function isFunction(payload) {
80
89
  return getType(payload) === 'Function';
@@ -82,12 +91,21 @@ function isFunction(payload) {
82
91
  /**
83
92
  * Returns whether the payload is an array
84
93
  *
85
- * @param {*} payload
86
- * @returns {payload is undefined}
94
+ * @param {any} payload
95
+ * @returns {payload is any[]}
87
96
  */
88
97
  function isArray(payload) {
89
98
  return getType(payload) === 'Array';
90
99
  }
100
+ /**
101
+ * Returns whether the payload is a an empty array
102
+ *
103
+ * @param {*} payload
104
+ * @returns {payload is []}
105
+ */
106
+ function isEmptyArray(payload) {
107
+ return isArray(payload) && payload.length === 0;
108
+ }
91
109
  /**
92
110
  * Returns whether the payload is a string
93
111
  *
@@ -116,9 +134,9 @@ function isEmptyString(payload) {
116
134
  return payload === '';
117
135
  }
118
136
  /**
119
- * Returns whether the payload is a number
137
+ * Returns whether the payload is a number (but not NaN)
120
138
  *
121
- * This will return false for NaN
139
+ * This will return `false` for `NaN`!!
122
140
  *
123
141
  * @param {*} payload
124
142
  * @returns {payload is number}
@@ -148,7 +166,7 @@ function isRegExp(payload) {
148
166
  * Returns whether the payload is a Map
149
167
  *
150
168
  * @param {*} payload
151
- * @returns {payload is Map}
169
+ * @returns {payload is Map<any, any>}
152
170
  */
153
171
  function isMap(payload) {
154
172
  return getType(payload) === 'Map';
@@ -157,7 +175,7 @@ function isMap(payload) {
157
175
  * Returns whether the payload is a WeakMap
158
176
  *
159
177
  * @param {*} payload
160
- * @returns {payload is WeakMap}
178
+ * @returns {payload is WeakMap<any, any>}
161
179
  */
162
180
  function isWeakMap(payload) {
163
181
  return getType(payload) === 'WeakMap';
@@ -166,7 +184,7 @@ function isWeakMap(payload) {
166
184
  * Returns whether the payload is a Set
167
185
  *
168
186
  * @param {*} payload
169
- * @returns {payload is Set}
187
+ * @returns {payload is Set<any>}
170
188
  */
171
189
  function isSet(payload) {
172
190
  return getType(payload) === 'Set';
@@ -175,7 +193,7 @@ function isSet(payload) {
175
193
  * Returns whether the payload is a WeakSet
176
194
  *
177
195
  * @param {*} payload
178
- * @returns {payload is WeakSet}
196
+ * @returns {payload is WeakSet<any>}
179
197
  */
180
198
  function isWeakSet(payload) {
181
199
  return getType(payload) === 'WeakSet';
@@ -220,7 +238,7 @@ function isFile(payload) {
220
238
  * Returns whether the payload is a Promise
221
239
  *
222
240
  * @param {*} payload
223
- * @returns {payload is Promise}
241
+ * @returns {payload is Promise<any>}
224
242
  */
225
243
  function isPromise(payload) {
226
244
  return getType(payload) === 'Promise';
@@ -235,7 +253,7 @@ function isError(payload) {
235
253
  return getType(payload) === 'Error';
236
254
  }
237
255
  /**
238
- * Returns whether the payload is an Error
256
+ * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)
239
257
  *
240
258
  * @param {*} payload
241
259
  * @returns {payload is typeof NaN}
@@ -295,6 +313,8 @@ exports.isArray = isArray;
295
313
  exports.isBlob = isBlob;
296
314
  exports.isBoolean = isBoolean;
297
315
  exports.isDate = isDate;
316
+ exports.isEmptyArray = isEmptyArray;
317
+ exports.isEmptyObject = isEmptyObject;
298
318
  exports.isEmptyString = isEmptyString;
299
319
  exports.isError = isError;
300
320
  exports.isFile = isFile;
package/dist/index.esm.js CHANGED
@@ -29,7 +29,7 @@ function isNull(payload) {
29
29
  * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
30
30
  *
31
31
  * @param {*} payload
32
- * @returns {payload is {[key: string]: any}}
32
+ * @returns {payload is Record<string, any>}
33
33
  */
34
34
  function isPlainObject(payload) {
35
35
  if (getType(payload) !== 'Object')
@@ -40,16 +40,25 @@ function isPlainObject(payload) {
40
40
  * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
41
41
  *
42
42
  * @param {*} payload
43
- * @returns {payload is {[key: string]: any}}
43
+ * @returns {payload is Record<string, any>}
44
44
  */
45
45
  function isObject(payload) {
46
46
  return isPlainObject(payload);
47
47
  }
48
+ /**
49
+ * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)
50
+ *
51
+ * @param {*} payload
52
+ * @returns {payload is { [K in any]: never }}
53
+ */
54
+ function isEmptyObject(payload) {
55
+ return isPlainObject(payload) && Object.keys(payload).length === 0;
56
+ }
48
57
  /**
49
58
  * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)
50
59
  *
51
60
  * @param {*} payload
52
- * @returns {payload is {[key: string]: any}}
61
+ * @returns {payload is Record<string, any>}
53
62
  */
54
63
  function isAnyObject(payload) {
55
64
  return getType(payload) === 'Object';
@@ -70,7 +79,7 @@ function isObjectLike(payload) {
70
79
  * Returns whether the payload is a function
71
80
  *
72
81
  * @param {*} payload
73
- * @returns {payload is Function}
82
+ * @returns {payload is AnyFunction}
74
83
  */
75
84
  function isFunction(payload) {
76
85
  return getType(payload) === 'Function';
@@ -78,12 +87,21 @@ function isFunction(payload) {
78
87
  /**
79
88
  * Returns whether the payload is an array
80
89
  *
81
- * @param {*} payload
82
- * @returns {payload is undefined}
90
+ * @param {any} payload
91
+ * @returns {payload is any[]}
83
92
  */
84
93
  function isArray(payload) {
85
94
  return getType(payload) === 'Array';
86
95
  }
96
+ /**
97
+ * Returns whether the payload is a an empty array
98
+ *
99
+ * @param {*} payload
100
+ * @returns {payload is []}
101
+ */
102
+ function isEmptyArray(payload) {
103
+ return isArray(payload) && payload.length === 0;
104
+ }
87
105
  /**
88
106
  * Returns whether the payload is a string
89
107
  *
@@ -112,9 +130,9 @@ function isEmptyString(payload) {
112
130
  return payload === '';
113
131
  }
114
132
  /**
115
- * Returns whether the payload is a number
133
+ * Returns whether the payload is a number (but not NaN)
116
134
  *
117
- * This will return false for NaN
135
+ * This will return `false` for `NaN`!!
118
136
  *
119
137
  * @param {*} payload
120
138
  * @returns {payload is number}
@@ -144,7 +162,7 @@ function isRegExp(payload) {
144
162
  * Returns whether the payload is a Map
145
163
  *
146
164
  * @param {*} payload
147
- * @returns {payload is Map}
165
+ * @returns {payload is Map<any, any>}
148
166
  */
149
167
  function isMap(payload) {
150
168
  return getType(payload) === 'Map';
@@ -153,7 +171,7 @@ function isMap(payload) {
153
171
  * Returns whether the payload is a WeakMap
154
172
  *
155
173
  * @param {*} payload
156
- * @returns {payload is WeakMap}
174
+ * @returns {payload is WeakMap<any, any>}
157
175
  */
158
176
  function isWeakMap(payload) {
159
177
  return getType(payload) === 'WeakMap';
@@ -162,7 +180,7 @@ function isWeakMap(payload) {
162
180
  * Returns whether the payload is a Set
163
181
  *
164
182
  * @param {*} payload
165
- * @returns {payload is Set}
183
+ * @returns {payload is Set<any>}
166
184
  */
167
185
  function isSet(payload) {
168
186
  return getType(payload) === 'Set';
@@ -171,7 +189,7 @@ function isSet(payload) {
171
189
  * Returns whether the payload is a WeakSet
172
190
  *
173
191
  * @param {*} payload
174
- * @returns {payload is WeakSet}
192
+ * @returns {payload is WeakSet<any>}
175
193
  */
176
194
  function isWeakSet(payload) {
177
195
  return getType(payload) === 'WeakSet';
@@ -216,7 +234,7 @@ function isFile(payload) {
216
234
  * Returns whether the payload is a Promise
217
235
  *
218
236
  * @param {*} payload
219
- * @returns {payload is Promise}
237
+ * @returns {payload is Promise<any>}
220
238
  */
221
239
  function isPromise(payload) {
222
240
  return getType(payload) === 'Promise';
@@ -231,7 +249,7 @@ function isError(payload) {
231
249
  return getType(payload) === 'Error';
232
250
  }
233
251
  /**
234
- * Returns whether the payload is an Error
252
+ * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)
235
253
  *
236
254
  * @param {*} payload
237
255
  * @returns {payload is typeof NaN}
@@ -285,4 +303,4 @@ function isType(payload, type) {
285
303
  return getType(payload) === name || Boolean(payload && payload.constructor === type);
286
304
  }
287
305
 
288
- export { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyString, isError, isFile, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };
306
+ export { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "is-what",
3
3
  "sideEffects": false,
4
- "version": "3.9.0",
4
+ "version": "3.11.2",
5
5
  "description": "JS type check (TypeScript supported) functions like `isPlainObject() isArray()` etc. A simple & small integration.",
6
6
  "main": "dist/index.cjs.js",
7
7
  "module": "dist/index.esm.js",
8
8
  "typings": "types/index.d.ts",
9
9
  "scripts": {
10
- "ava": "ava",
11
- "test": "jest",
12
- "test-w": "jest --watchAll",
10
+ "test": "ava",
11
+ "jest": "jest",
12
+ "jest-w": "jest --watchAll",
13
13
  "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
14
- "rollup": "rollup -c ./build/rollup.js",
15
- "build": "npm run lint && npm run rollup && npm run test"
14
+ "rollup": "rollup -c ./build.js",
15
+ "build": "rm -rf types && rm -rf dist && npm run lint && npm run rollup && npm run test && npm run jest"
16
16
  },
17
17
  "repository": {
18
18
  "type": "git",
@@ -47,28 +47,33 @@
47
47
  "homepage": "https://github.com/mesqueeb/is-what#readme",
48
48
  "dependencies": {},
49
49
  "devDependencies": {
50
- "@babel/core": "^7.9.0",
50
+ "@babel/core": "^7.11.5",
51
51
  "@types/babel-core": "^6.25.6",
52
- "@types/jest": "^25.2.1",
53
- "@typescript-eslint/eslint-plugin": "^2.27.0",
54
- "@typescript-eslint/parser": "^2.27.0",
55
- "ava": "^3.6.0",
52
+ "@types/jest": "^26.0.12",
53
+ "@typescript-eslint/eslint-plugin": "^4.0.1",
54
+ "@typescript-eslint/parser": "^4.0.1",
55
+ "ava": "^3.12.1",
56
56
  "babel-core": "^7.0.0-bridge.0",
57
- "babel-jest": "^25.3.0",
57
+ "babel-jest": "^26.3.0",
58
58
  "babel-preset-env": "^1.7.0",
59
- "eslint": "^6.8.0",
60
- "eslint-config-prettier": "^6.10.1",
59
+ "eslint": "^7.8.1",
60
+ "eslint-config-prettier": "^6.11.0",
61
61
  "eslint-plugin-tree-shaking": "^1.8.0",
62
- "jest": "^25.3.0",
63
- "regenerator-runtime": "^0.13.5",
64
- "rollup": "^1.32.1",
65
- "rollup-plugin-typescript2": "^0.26.0",
62
+ "jest": "^26.4.2",
63
+ "regenerator-runtime": "^0.13.7",
64
+ "rollup": "^2.26.9",
65
+ "rollup-plugin-typescript2": "^0.27.2",
66
66
  "tsconfig-paths": "^3.9.0",
67
- "ts-node": "^8.8.2",
68
- "typescript": "^3.8.3"
67
+ "ts-node": "^9.0.0",
68
+ "typescript": "^4.0.2"
69
69
  },
70
70
  "ava": {
71
- "extensions": ["ts"],
72
- "require": ["tsconfig-paths/register", "ts-node/register"]
71
+ "extensions": [
72
+ "ts"
73
+ ],
74
+ "require": [
75
+ "tsconfig-paths/register",
76
+ "ts-node/register"
77
+ ]
73
78
  }
74
79
  }
package/src/index.ts CHANGED
@@ -1,3 +1,6 @@
1
+ export type AnyFunction = (...args: any[]) => any
2
+ export type AnyClass = new (...args: any[]) => any
3
+
1
4
  /**
2
5
  * Returns the object type of the given payload
3
6
  *
@@ -32,9 +35,9 @@ export function isNull (payload: any): payload is null {
32
35
  * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
33
36
  *
34
37
  * @param {*} payload
35
- * @returns {payload is {[key: string]: any}}
38
+ * @returns {payload is Record<string, any>}
36
39
  */
37
- export function isPlainObject (payload: any): payload is { [key: string]: any } {
40
+ export function isPlainObject (payload: any): payload is Record<string, any> {
38
41
  if (getType(payload) !== 'Object') return false
39
42
  return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype
40
43
  }
@@ -43,19 +46,29 @@ export function isPlainObject (payload: any): payload is { [key: string]: any }
43
46
  * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
44
47
  *
45
48
  * @param {*} payload
46
- * @returns {payload is {[key: string]: any}}
49
+ * @returns {payload is Record<string, any>}
47
50
  */
48
- export function isObject (payload: any): payload is { [key: string]: any } {
51
+ export function isObject (payload: any): payload is Record<string, any> {
49
52
  return isPlainObject(payload)
50
53
  }
51
54
 
55
+ /**
56
+ * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)
57
+ *
58
+ * @param {*} payload
59
+ * @returns {payload is { [K in any]: never }}
60
+ */
61
+ export function isEmptyObject (payload: any): payload is { [K in any]: never } {
62
+ return isPlainObject(payload) && Object.keys(payload).length === 0
63
+ }
64
+
52
65
  /**
53
66
  * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)
54
67
  *
55
68
  * @param {*} payload
56
- * @returns {payload is {[key: string]: any}}
69
+ * @returns {payload is Record<string, any>}
57
70
  */
58
- export function isAnyObject (payload: any): payload is { [key: string]: any } {
71
+ export function isAnyObject (payload: any): payload is Record<string, any> {
59
72
  return getType(payload) === 'Object'
60
73
  }
61
74
 
@@ -68,7 +81,7 @@ export function isAnyObject (payload: any): payload is { [key: string]: any } {
68
81
  * @param {*} payload
69
82
  * @returns {payload is T}
70
83
  */
71
- export function isObjectLike<T extends object> (payload: any): payload is T {
84
+ export function isObjectLike<T extends Record<string, any>> (payload: any): payload is T {
72
85
  return isAnyObject(payload)
73
86
  }
74
87
 
@@ -76,22 +89,32 @@ export function isObjectLike<T extends object> (payload: any): payload is T {
76
89
  * Returns whether the payload is a function
77
90
  *
78
91
  * @param {*} payload
79
- * @returns {payload is Function}
92
+ * @returns {payload is AnyFunction}
80
93
  */
81
- export function isFunction (payload: any): payload is Function {
94
+ export function isFunction (payload: any): payload is AnyFunction {
82
95
  return getType(payload) === 'Function'
83
96
  }
84
97
 
85
98
  /**
86
99
  * Returns whether the payload is an array
87
100
  *
88
- * @param {*} payload
89
- * @returns {payload is undefined}
101
+ * @param {any} payload
102
+ * @returns {payload is any[]}
90
103
  */
91
104
  export function isArray (payload: any): payload is any[] {
92
105
  return getType(payload) === 'Array'
93
106
  }
94
107
 
108
+ /**
109
+ * Returns whether the payload is a an empty array
110
+ *
111
+ * @param {*} payload
112
+ * @returns {payload is []}
113
+ */
114
+ export function isEmptyArray (payload: any): payload is [] {
115
+ return isArray(payload) && payload.length === 0
116
+ }
117
+
95
118
  /**
96
119
  * Returns whether the payload is a string
97
120
  *
@@ -123,9 +146,9 @@ export function isEmptyString (payload: any): payload is string {
123
146
  }
124
147
 
125
148
  /**
126
- * Returns whether the payload is a number
149
+ * Returns whether the payload is a number (but not NaN)
127
150
  *
128
- * This will return false for NaN
151
+ * This will return `false` for `NaN`!!
129
152
  *
130
153
  * @param {*} payload
131
154
  * @returns {payload is number}
@@ -158,7 +181,7 @@ export function isRegExp (payload: any): payload is RegExp {
158
181
  * Returns whether the payload is a Map
159
182
  *
160
183
  * @param {*} payload
161
- * @returns {payload is Map}
184
+ * @returns {payload is Map<any, any>}
162
185
  */
163
186
  export function isMap (payload: any): payload is Map<any, any> {
164
187
  return getType(payload) === 'Map'
@@ -168,7 +191,7 @@ export function isMap (payload: any): payload is Map<any, any> {
168
191
  * Returns whether the payload is a WeakMap
169
192
  *
170
193
  * @param {*} payload
171
- * @returns {payload is WeakMap}
194
+ * @returns {payload is WeakMap<any, any>}
172
195
  */
173
196
  export function isWeakMap (payload: any): payload is WeakMap<any, any> {
174
197
  return getType(payload) === 'WeakMap'
@@ -178,7 +201,7 @@ export function isWeakMap (payload: any): payload is WeakMap<any, any> {
178
201
  * Returns whether the payload is a Set
179
202
  *
180
203
  * @param {*} payload
181
- * @returns {payload is Set}
204
+ * @returns {payload is Set<any>}
182
205
  */
183
206
  export function isSet (payload: any): payload is Set<any> {
184
207
  return getType(payload) === 'Set'
@@ -188,7 +211,7 @@ export function isSet (payload: any): payload is Set<any> {
188
211
  * Returns whether the payload is a WeakSet
189
212
  *
190
213
  * @param {*} payload
191
- * @returns {payload is WeakSet}
214
+ * @returns {payload is WeakSet<any>}
192
215
  */
193
216
  export function isWeakSet (payload: any): payload is WeakSet<any> {
194
217
  return getType(payload) === 'WeakSet'
@@ -238,7 +261,7 @@ export function isFile (payload: any): payload is File {
238
261
  * Returns whether the payload is a Promise
239
262
  *
240
263
  * @param {*} payload
241
- * @returns {payload is Promise}
264
+ * @returns {payload is Promise<any>}
242
265
  */
243
266
  export function isPromise (payload: any): payload is Promise<any> {
244
267
  return getType(payload) === 'Promise'
@@ -255,7 +278,7 @@ export function isError (payload: any): payload is Error {
255
278
  }
256
279
 
257
280
  /**
258
- * Returns whether the payload is an Error
281
+ * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)
259
282
  *
260
283
  * @param {*} payload
261
284
  * @returns {payload is typeof NaN}
@@ -304,7 +327,7 @@ export function isNullOrUndefined (payload: any): payload is null | undefined {
304
327
  * @throws {TypeError} Will throw type error if type is an invalid type
305
328
  * @returns {payload is T}
306
329
  */
307
- export function isType<T extends Function> (payload: any, type: T): payload is T {
330
+ export function isType<T extends AnyFunction | AnyClass> (payload: any, type: T): payload is T {
308
331
  if (!(type instanceof Function)) {
309
332
  throw new TypeError('Type must be a function')
310
333
  }
package/test/ava.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import test from 'ava'
2
2
  import {
3
3
  isError,
4
+ isEmptyArray,
4
5
  isObject,
5
6
  isPlainObject,
6
7
  isAnyObject,
@@ -27,6 +28,7 @@ import {
27
28
  // isFile,
28
29
  isPromise,
29
30
  isNaNValue,
31
+ isEmptyObject,
30
32
  } from '../src/index'
31
33
 
32
34
  // const blob = Buffer.from([])
@@ -89,6 +91,41 @@ test('Basic false tests', t => {
89
91
  t.is(isNullOrUndefined(NaN), false)
90
92
  })
91
93
 
94
+ test('isEmptyObject', t => {
95
+ t.is(isEmptyObject({}), true)
96
+ t.is(isEmptyObject(new Object()), true)
97
+
98
+ t.is(isEmptyObject('{}'), false)
99
+ t.is(isEmptyObject('{}'), false)
100
+ t.is(isEmptyObject(null), false)
101
+ t.is(isEmptyObject(new Date()), false)
102
+ t.is(isEmptyObject(new Error('')), false)
103
+ t.is(isEmptyObject(new Date()), false)
104
+ t.is(isEmptyObject(Symbol()), false)
105
+ t.is(isEmptyObject(new Map()), false)
106
+ t.is(isEmptyObject(new WeakMap()), false)
107
+ t.is(isEmptyObject(new Set()), false)
108
+ t.is(isEmptyObject(new WeakSet()), false)
109
+ })
110
+
111
+ test('isEmptyArray', t => {
112
+ t.is(isEmptyArray([]), true)
113
+ t.is(isEmptyArray(new Array()), true)
114
+ t.is(isEmptyArray(new Array(0)), true)
115
+
116
+ t.is(isEmptyArray(new Array(1)), false)
117
+ t.is(isEmptyArray([undefined]), false)
118
+ t.is(isEmptyArray(null), false)
119
+ t.is(isEmptyArray(new Date()), false)
120
+ t.is(isEmptyArray(new Error('')), false)
121
+ t.is(isEmptyArray(new Date()), false)
122
+ t.is(isEmptyArray(Symbol()), false)
123
+ t.is(isEmptyArray(new Map()), false)
124
+ t.is(isEmptyArray(new WeakMap()), false)
125
+ t.is(isEmptyArray(new Set()), false)
126
+ t.is(isEmptyArray(new WeakSet()), false)
127
+ })
128
+
92
129
  test('NaN tests', t => {
93
130
  t.is(isNaNValue(NaN), true)
94
131
  t.is(isNaNValue(new Error('')), false)
@@ -239,3 +276,34 @@ test('isObject vs isAnyObject', t => {
239
276
  t.is(isAnyObject(new Date('_')), false)
240
277
  t.is(isAnyObject(new Date()), false)
241
278
  })
279
+
280
+ test('type related tests', t => {
281
+ t.pass()
282
+ // const fn: string | ((k: number) => string) = (p) => 'a'
283
+ // if (!isFunction(fn)) {
284
+ // fn
285
+ // }
286
+
287
+ // const a: Record<string, number> = {}
288
+
289
+ // a[fn(1)] = fn(2)
290
+
291
+ // const myArray: string | string[] = ['a', 'b']
292
+ // if (!isArray(myArray)) {
293
+ // myArray
294
+ // }
295
+
296
+ // const a: Record<string, number> = {}
297
+
298
+ // a[myArray[1]] = myArray[0]
299
+
300
+ // const myArray: string | any[] = [1, 2, 'a', 'b']
301
+ // if (!isArray(myArray)) {
302
+ // myArray
303
+ // }
304
+
305
+ // const a: Record<string, number> = {}
306
+
307
+ // a[myArray[1]] = myArray[0]
308
+
309
+ })
package/tsconfig.json CHANGED
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
+ "baseUrl": ".",
3
4
  "declaration": true,
4
5
  "declarationDir": "./types/"
5
6
  },
package/types/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ export declare type AnyFunction = (...args: any[]) => any;
2
+ export declare type AnyClass = new (...args: any[]) => any;
1
3
  /**
2
4
  * Returns the object type of the given payload
3
5
  *
@@ -23,29 +25,32 @@ export declare function isNull(payload: any): payload is null;
23
25
  * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
24
26
  *
25
27
  * @param {*} payload
26
- * @returns {payload is {[key: string]: any}}
28
+ * @returns {payload is Record<string, any>}
27
29
  */
28
- export declare function isPlainObject(payload: any): payload is {
29
- [key: string]: any;
30
- };
30
+ export declare function isPlainObject(payload: any): payload is Record<string, any>;
31
31
  /**
32
32
  * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
33
33
  *
34
34
  * @param {*} payload
35
- * @returns {payload is {[key: string]: any}}
35
+ * @returns {payload is Record<string, any>}
36
36
  */
37
- export declare function isObject(payload: any): payload is {
38
- [key: string]: any;
37
+ export declare function isObject(payload: any): payload is Record<string, any>;
38
+ /**
39
+ * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)
40
+ *
41
+ * @param {*} payload
42
+ * @returns {payload is { [K in any]: never }}
43
+ */
44
+ export declare function isEmptyObject(payload: any): payload is {
45
+ [K in any]: never;
39
46
  };
40
47
  /**
41
48
  * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)
42
49
  *
43
50
  * @param {*} payload
44
- * @returns {payload is {[key: string]: any}}
51
+ * @returns {payload is Record<string, any>}
45
52
  */
46
- export declare function isAnyObject(payload: any): payload is {
47
- [key: string]: any;
48
- };
53
+ export declare function isAnyObject(payload: any): payload is Record<string, any>;
49
54
  /**
50
55
  * Returns whether the payload is an object like a type passed in < >
51
56
  *
@@ -55,21 +60,28 @@ export declare function isAnyObject(payload: any): payload is {
55
60
  * @param {*} payload
56
61
  * @returns {payload is T}
57
62
  */
58
- export declare function isObjectLike<T extends object>(payload: any): payload is T;
63
+ export declare function isObjectLike<T extends Record<string, any>>(payload: any): payload is T;
59
64
  /**
60
65
  * Returns whether the payload is a function
61
66
  *
62
67
  * @param {*} payload
63
- * @returns {payload is Function}
68
+ * @returns {payload is AnyFunction}
64
69
  */
65
- export declare function isFunction(payload: any): payload is Function;
70
+ export declare function isFunction(payload: any): payload is AnyFunction;
66
71
  /**
67
72
  * Returns whether the payload is an array
68
73
  *
69
- * @param {*} payload
70
- * @returns {payload is undefined}
74
+ * @param {any} payload
75
+ * @returns {payload is any[]}
71
76
  */
72
77
  export declare function isArray(payload: any): payload is any[];
78
+ /**
79
+ * Returns whether the payload is a an empty array
80
+ *
81
+ * @param {*} payload
82
+ * @returns {payload is []}
83
+ */
84
+ export declare function isEmptyArray(payload: any): payload is [];
73
85
  /**
74
86
  * Returns whether the payload is a string
75
87
  *
@@ -92,9 +104,9 @@ export declare function isFullString(payload: any): payload is string;
92
104
  */
93
105
  export declare function isEmptyString(payload: any): payload is string;
94
106
  /**
95
- * Returns whether the payload is a number
107
+ * Returns whether the payload is a number (but not NaN)
96
108
  *
97
- * This will return false for NaN
109
+ * This will return `false` for `NaN`!!
98
110
  *
99
111
  * @param {*} payload
100
112
  * @returns {payload is number}
@@ -118,28 +130,28 @@ export declare function isRegExp(payload: any): payload is RegExp;
118
130
  * Returns whether the payload is a Map
119
131
  *
120
132
  * @param {*} payload
121
- * @returns {payload is Map}
133
+ * @returns {payload is Map<any, any>}
122
134
  */
123
135
  export declare function isMap(payload: any): payload is Map<any, any>;
124
136
  /**
125
137
  * Returns whether the payload is a WeakMap
126
138
  *
127
139
  * @param {*} payload
128
- * @returns {payload is WeakMap}
140
+ * @returns {payload is WeakMap<any, any>}
129
141
  */
130
142
  export declare function isWeakMap(payload: any): payload is WeakMap<any, any>;
131
143
  /**
132
144
  * Returns whether the payload is a Set
133
145
  *
134
146
  * @param {*} payload
135
- * @returns {payload is Set}
147
+ * @returns {payload is Set<any>}
136
148
  */
137
149
  export declare function isSet(payload: any): payload is Set<any>;
138
150
  /**
139
151
  * Returns whether the payload is a WeakSet
140
152
  *
141
153
  * @param {*} payload
142
- * @returns {payload is WeakSet}
154
+ * @returns {payload is WeakSet<any>}
143
155
  */
144
156
  export declare function isWeakSet(payload: any): payload is WeakSet<any>;
145
157
  /**
@@ -174,7 +186,7 @@ export declare function isFile(payload: any): payload is File;
174
186
  * Returns whether the payload is a Promise
175
187
  *
176
188
  * @param {*} payload
177
- * @returns {payload is Promise}
189
+ * @returns {payload is Promise<any>}
178
190
  */
179
191
  export declare function isPromise(payload: any): payload is Promise<any>;
180
192
  /**
@@ -185,7 +197,7 @@ export declare function isPromise(payload: any): payload is Promise<any>;
185
197
  */
186
198
  export declare function isError(payload: any): payload is Error;
187
199
  /**
188
- * Returns whether the payload is an Error
200
+ * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)
189
201
  *
190
202
  * @param {*} payload
191
203
  * @returns {payload is typeof NaN}
@@ -216,4 +228,4 @@ export declare function isNullOrUndefined(payload: any): payload is null | undef
216
228
  * @throws {TypeError} Will throw type error if type is an invalid type
217
229
  * @returns {payload is T}
218
230
  */
219
- export declare function isType<T extends Function>(payload: any, type: T): payload is T;
231
+ export declare function isType<T extends AnyFunction | AnyClass>(payload: any, type: T): payload is T;