is-what 4.1.10 → 4.1.12

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/README.md CHANGED
@@ -180,6 +180,18 @@ getType('') // returns 'String'
180
180
  isType('', String) // returns true
181
181
  ```
182
182
 
183
+ If you just want to make sure your object _inherits_ from a particular class or
184
+ `toStringTag` value, you can use `isInstanceOf()` like this:
185
+
186
+ ```js
187
+ import { isInstanceOf } from 'is-what'
188
+
189
+ isInstanceOf(new XMLHttpRequest(), "EventTarget")
190
+ // returns true
191
+ isInstanceOf(globalThis, ReadableStream)
192
+ // returns false
193
+ ```
194
+
183
195
  ## TypeScript
184
196
 
185
197
  is-what makes TypeScript know the type during if statements. This means that a check returns the type of the payload for TypeScript users.
@@ -1,346 +1,137 @@
1
1
  'use strict';
2
2
 
3
- /**
4
- * Returns the object type of the given payload
5
- *
6
- * @param {*} payload
7
- * @returns {string}
8
- */
9
3
  function getType(payload) {
10
- return Object.prototype.toString.call(payload).slice(8, -1);
11
- }
12
- /**
13
- * Returns whether the payload is undefined
14
- *
15
- * @param {*} payload
16
- * @returns {payload is undefined}
17
- */
4
+ return Object.prototype.toString.call(payload).slice(8, -1);
5
+ }
18
6
  function isUndefined(payload) {
19
- return getType(payload) === 'Undefined';
20
- }
21
- /**
22
- * Returns whether the payload is null
23
- *
24
- * @param {*} payload
25
- * @returns {payload is null}
26
- */
7
+ return getType(payload) === "Undefined";
8
+ }
27
9
  function isNull(payload) {
28
- return getType(payload) === 'Null';
29
- }
30
- /**
31
- * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
32
- *
33
- * @param {*} payload
34
- * @returns {payload is PlainObject}
35
- */
10
+ return getType(payload) === "Null";
11
+ }
36
12
  function isPlainObject(payload) {
37
- if (getType(payload) !== 'Object')
38
- return false;
39
- const prototype = Object.getPrototypeOf(payload);
40
- return prototype.constructor === Object && prototype === Object.prototype;
41
- }
42
- /**
43
- * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)
44
- *
45
- * @param {*} payload
46
- * @returns {payload is PlainObject}
47
- */
13
+ if (getType(payload) !== "Object")
14
+ return false;
15
+ const prototype = Object.getPrototypeOf(payload);
16
+ return !!prototype && prototype.constructor === Object && prototype === Object.prototype;
17
+ }
48
18
  function isObject(payload) {
49
- return isPlainObject(payload);
50
- }
51
- /**
52
- * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)
53
- *
54
- * @param {*} payload
55
- * @returns {payload is { [K in any]: never }}
56
- */
19
+ return isPlainObject(payload);
20
+ }
57
21
  function isEmptyObject(payload) {
58
- return isPlainObject(payload) && Object.keys(payload).length === 0;
59
- }
60
- /**
61
- * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)
62
- *
63
- * @param {*} payload
64
- * @returns {payload is PlainObject}
65
- */
22
+ return isPlainObject(payload) && Object.keys(payload).length === 0;
23
+ }
66
24
  function isFullObject(payload) {
67
- return isPlainObject(payload) && Object.keys(payload).length > 0;
68
- }
69
- /**
70
- * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)
71
- *
72
- * @param {*} payload
73
- * @returns {payload is PlainObject}
74
- */
25
+ return isPlainObject(payload) && Object.keys(payload).length > 0;
26
+ }
75
27
  function isAnyObject(payload) {
76
- return getType(payload) === 'Object';
77
- }
78
- /**
79
- * Returns whether the payload is an object like a type passed in < >
80
- *
81
- * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.
82
- *
83
- * @template T this must be passed in < >
84
- * @param {*} payload
85
- * @returns {payload is T}
86
- */
28
+ return getType(payload) === "Object";
29
+ }
87
30
  function isObjectLike(payload) {
88
- return isAnyObject(payload);
89
- }
90
- /**
91
- * Returns whether the payload is a function (regular or async)
92
- *
93
- * @param {*} payload
94
- * @returns {payload is AnyFunction}
95
- */
31
+ return isAnyObject(payload);
32
+ }
96
33
  function isFunction(payload) {
97
- return typeof payload === 'function';
98
- }
99
- /**
100
- * Returns whether the payload is an array
101
- *
102
- * @param {any} payload
103
- * @returns {payload is any[]}
104
- */
34
+ return typeof payload === "function";
35
+ }
105
36
  function isArray(payload) {
106
- return getType(payload) === 'Array';
107
- }
108
- /**
109
- * Returns whether the payload is a an array with at least 1 item
110
- *
111
- * @param {*} payload
112
- * @returns {payload is any[]}
113
- */
37
+ return getType(payload) === "Array";
38
+ }
114
39
  function isFullArray(payload) {
115
- return isArray(payload) && payload.length > 0;
116
- }
117
- /**
118
- * Returns whether the payload is a an empty array
119
- *
120
- * @param {*} payload
121
- * @returns {payload is []}
122
- */
40
+ return isArray(payload) && payload.length > 0;
41
+ }
123
42
  function isEmptyArray(payload) {
124
- return isArray(payload) && payload.length === 0;
125
- }
126
- /**
127
- * Returns whether the payload is a string
128
- *
129
- * @param {*} payload
130
- * @returns {payload is string}
131
- */
43
+ return isArray(payload) && payload.length === 0;
44
+ }
132
45
  function isString(payload) {
133
- return getType(payload) === 'String';
134
- }
135
- /**
136
- * Returns whether the payload is a string, BUT returns false for ''
137
- *
138
- * @param {*} payload
139
- * @returns {payload is string}
140
- */
46
+ return getType(payload) === "String";
47
+ }
141
48
  function isFullString(payload) {
142
- return isString(payload) && payload !== '';
143
- }
144
- /**
145
- * Returns whether the payload is ''
146
- *
147
- * @param {*} payload
148
- * @returns {payload is string}
149
- */
49
+ return isString(payload) && payload !== "";
50
+ }
150
51
  function isEmptyString(payload) {
151
- return payload === '';
152
- }
153
- /**
154
- * Returns whether the payload is a number (but not NaN)
155
- *
156
- * This will return `false` for `NaN`!!
157
- *
158
- * @param {*} payload
159
- * @returns {payload is number}
160
- */
52
+ return payload === "";
53
+ }
161
54
  function isNumber(payload) {
162
- return getType(payload) === 'Number' && !isNaN(payload);
163
- }
164
- /**
165
- * Returns whether the payload is a positive number (but not 0)
166
- *
167
- * @param {*} payload
168
- * @returns {payload is number}
169
- */
55
+ return getType(payload) === "Number" && !isNaN(payload);
56
+ }
170
57
  function isPositiveNumber(payload) {
171
- return isNumber(payload) && payload > 0;
172
- }
173
- /**
174
- * Returns whether the payload is a negative number (but not 0)
175
- *
176
- * @param {*} payload
177
- * @returns {payload is number}
178
- */
58
+ return isNumber(payload) && payload > 0;
59
+ }
179
60
  function isNegativeNumber(payload) {
180
- return isNumber(payload) && payload < 0;
181
- }
182
- /**
183
- * Returns whether the payload is a boolean
184
- *
185
- * @param {*} payload
186
- * @returns {payload is boolean}
187
- */
61
+ return isNumber(payload) && payload < 0;
62
+ }
188
63
  function isBoolean(payload) {
189
- return getType(payload) === 'Boolean';
190
- }
191
- /**
192
- * Returns whether the payload is a regular expression (RegExp)
193
- *
194
- * @param {*} payload
195
- * @returns {payload is RegExp}
196
- */
64
+ return getType(payload) === "Boolean";
65
+ }
197
66
  function isRegExp(payload) {
198
- return getType(payload) === 'RegExp';
199
- }
200
- /**
201
- * Returns whether the payload is a Map
202
- *
203
- * @param {*} payload
204
- * @returns {payload is Map<any, any>}
205
- */
67
+ return getType(payload) === "RegExp";
68
+ }
206
69
  function isMap(payload) {
207
- return getType(payload) === 'Map';
208
- }
209
- /**
210
- * Returns whether the payload is a WeakMap
211
- *
212
- * @param {*} payload
213
- * @returns {payload is WeakMap<any, any>}
214
- */
70
+ return getType(payload) === "Map";
71
+ }
215
72
  function isWeakMap(payload) {
216
- return getType(payload) === 'WeakMap';
217
- }
218
- /**
219
- * Returns whether the payload is a Set
220
- *
221
- * @param {*} payload
222
- * @returns {payload is Set<any>}
223
- */
73
+ return getType(payload) === "WeakMap";
74
+ }
224
75
  function isSet(payload) {
225
- return getType(payload) === 'Set';
226
- }
227
- /**
228
- * Returns whether the payload is a WeakSet
229
- *
230
- * @param {*} payload
231
- * @returns {payload is WeakSet<any>}
232
- */
76
+ return getType(payload) === "Set";
77
+ }
233
78
  function isWeakSet(payload) {
234
- return getType(payload) === 'WeakSet';
235
- }
236
- /**
237
- * Returns whether the payload is a Symbol
238
- *
239
- * @param {*} payload
240
- * @returns {payload is symbol}
241
- */
79
+ return getType(payload) === "WeakSet";
80
+ }
242
81
  function isSymbol(payload) {
243
- return getType(payload) === 'Symbol';
244
- }
245
- /**
246
- * Returns whether the payload is a Date, and that the date is valid
247
- *
248
- * @param {*} payload
249
- * @returns {payload is Date}
250
- */
82
+ return getType(payload) === "Symbol";
83
+ }
251
84
  function isDate(payload) {
252
- return getType(payload) === 'Date' && !isNaN(payload);
253
- }
254
- /**
255
- * Returns whether the payload is a Blob
256
- *
257
- * @param {*} payload
258
- * @returns {payload is Blob}
259
- */
85
+ return getType(payload) === "Date" && !isNaN(payload);
86
+ }
260
87
  function isBlob(payload) {
261
- return getType(payload) === 'Blob';
262
- }
263
- /**
264
- * Returns whether the payload is a File
265
- *
266
- * @param {*} payload
267
- * @returns {payload is File}
268
- */
88
+ return getType(payload) === "Blob";
89
+ }
269
90
  function isFile(payload) {
270
- return getType(payload) === 'File';
271
- }
272
- /**
273
- * Returns whether the payload is a Promise
274
- *
275
- * @param {*} payload
276
- * @returns {payload is Promise<any>}
277
- */
91
+ return getType(payload) === "File";
92
+ }
278
93
  function isPromise(payload) {
279
- return getType(payload) === 'Promise';
280
- }
281
- /**
282
- * Returns whether the payload is an Error
283
- *
284
- * @param {*} payload
285
- * @returns {payload is Error}
286
- */
94
+ return getType(payload) === "Promise";
95
+ }
287
96
  function isError(payload) {
288
- return getType(payload) === 'Error';
289
- }
290
- /**
291
- * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)
292
- *
293
- * @param {*} payload
294
- * @returns {payload is typeof NaN}
295
- */
97
+ return getType(payload) === "Error";
98
+ }
296
99
  function isNaNValue(payload) {
297
- return getType(payload) === 'Number' && isNaN(payload);
298
- }
299
- /**
300
- * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)
301
- *
302
- * @param {*} payload
303
- * @returns {(payload is boolean | null | undefined | number | string | symbol)}
304
- */
100
+ return getType(payload) === "Number" && isNaN(payload);
101
+ }
305
102
  function isPrimitive(payload) {
306
- return (isBoolean(payload) ||
307
- isNull(payload) ||
308
- isUndefined(payload) ||
309
- isNumber(payload) ||
310
- isString(payload) ||
311
- isSymbol(payload));
312
- }
313
- /**
314
- * Returns true whether the payload is null or undefined
315
- *
316
- * @param {*} payload
317
- * @returns {(payload is null | undefined)}
318
- */
103
+ return isBoolean(payload) || isNull(payload) || isUndefined(payload) || isNumber(payload) || isString(payload) || isSymbol(payload);
104
+ }
319
105
  const isNullOrUndefined = isOneOf(isNull, isUndefined);
320
106
  function isOneOf(a, b, c, d, e) {
321
- return (value) => a(value) || b(value) || (!!c && c(value)) || (!!d && d(value)) || (!!e && e(value));
322
- }
323
- /**
324
- * Does a generic check to check that the given payload is of a given type.
325
- * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);
326
- * It will, however, differentiate between object and null
327
- *
328
- * @template T
329
- * @param {*} payload
330
- * @param {T} type
331
- * @throws {TypeError} Will throw type error if type is an invalid type
332
- * @returns {payload is T}
333
- */
107
+ return (value) => a(value) || b(value) || !!c && c(value) || !!d && d(value) || !!e && e(value);
108
+ }
334
109
  function isType(payload, type) {
335
- if (!(type instanceof Function)) {
336
- throw new TypeError('Type must be a function');
110
+ if (!(type instanceof Function)) {
111
+ throw new TypeError("Type must be a function");
112
+ }
113
+ if (!Object.prototype.hasOwnProperty.call(type, "prototype")) {
114
+ throw new TypeError("Type is not a class");
115
+ }
116
+ const name = type.name;
117
+ return getType(payload) === name || Boolean(payload && payload.constructor === type);
118
+ }
119
+ function isInstanceOf(value, classOrClassName) {
120
+ if (typeof classOrClassName === "function") {
121
+ for (let p = value; p; p = Object.getPrototypeOf(p)) {
122
+ if (isType(p, classOrClassName)) {
123
+ return true;
124
+ }
337
125
  }
338
- if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {
339
- throw new TypeError('Type is not a class');
126
+ return false;
127
+ } else {
128
+ for (let p = value; p; p = Object.getPrototypeOf(p)) {
129
+ if (getType(p) === classOrClassName) {
130
+ return true;
131
+ }
340
132
  }
341
- // Classes usually have names (as functions usually have names)
342
- const name = type.name;
343
- return getType(payload) === name || Boolean(payload && payload.constructor === type);
133
+ return false;
134
+ }
344
135
  }
345
136
 
346
137
  exports.getType = getType;
@@ -358,6 +149,7 @@ exports.isFullArray = isFullArray;
358
149
  exports.isFullObject = isFullObject;
359
150
  exports.isFullString = isFullString;
360
151
  exports.isFunction = isFunction;
152
+ exports.isInstanceOf = isInstanceOf;
361
153
  exports.isMap = isMap;
362
154
  exports.isNaNValue = isNaNValue;
363
155
  exports.isNegativeNumber = isNegativeNumber;