@magic/types 0.1.40 → 0.1.41
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 +14 -17
- package/package.json +40 -39
- package/src/fns.js +36 -10
- package/src/lib.js +3 -1
- package/types/fns.d.ts +11 -1
- package/types/index.d.ts +25 -4
- package/types/lib.d.ts +25 -4
package/README.md
CHANGED
|
@@ -3,24 +3,9 @@
|
|
|
3
3
|
typechecking utilities
|
|
4
4
|
|
|
5
5
|
[![NPM version][npm-image]][npm-url]
|
|
6
|
-
[![Linux Build Status][travis-image]][travis-url]
|
|
7
|
-
[![Windows Build Status][appveyor-image]][appveyor-url]
|
|
8
|
-
[![Coverage Status][coveralls-image]][coveralls-url]
|
|
9
|
-
[![Greenkeeper badge][greenkeeper-image]][greenkeeper-url]
|
|
10
|
-
[![Known Vulnerabilities][snyk-image]][snyk-url]
|
|
11
6
|
|
|
12
7
|
[npm-image]: https://img.shields.io/npm/v/@magic/types.svg
|
|
13
8
|
[npm-url]: https://www.npmjs.com/package/@magic/types
|
|
14
|
-
[travis-image]: https://img.shields.io/travis/com/magic/types/master
|
|
15
|
-
[travis-url]: https://travis-ci.com/magic/types
|
|
16
|
-
[appveyor-image]: https://img.shields.io/appveyor/ci/magic/types/master.svg
|
|
17
|
-
[appveyor-url]: https://ci.appveyor.com/project/magic/types/branch/master
|
|
18
|
-
[coveralls-image]: https://coveralls.io/repos/github/magic/types/badge.svg
|
|
19
|
-
[coveralls-url]: https://coveralls.io/github/magic/types
|
|
20
|
-
[greenkeeper-image]: https://badges.greenkeeper.io/magic/types.svg
|
|
21
|
-
[greenkeeper-url]: https://badges.greenkeeper.io/magic/types.svg
|
|
22
|
-
[snyk-image]: https://snyk.io/test/github/magic/types/badge.svg
|
|
23
|
-
[snyk-url]: https://snyk.io/test/github/magic/types
|
|
24
9
|
|
|
25
10
|
##### install
|
|
26
11
|
|
|
@@ -533,6 +518,18 @@ update dependencies
|
|
|
533
518
|
- update docs
|
|
534
519
|
- update dependencies
|
|
535
520
|
|
|
536
|
-
##### 0.1.41
|
|
521
|
+
##### 0.1.41
|
|
537
522
|
|
|
538
|
-
|
|
523
|
+
- isArray accepts type predicates and narrows the element type: `isArray(arr, isString, isNumber)` → `e is (string | number)[]`, falling back to `unknown[]` without predicates
|
|
524
|
+
- change isArray return type from `unknown[]` to `any[]` in generated types
|
|
525
|
+
- add `scripts/add-node-reference.mjs` and run it after tsc in the build so `Buffer` resolves in the generated `.d.ts` files
|
|
526
|
+
- move `@types/node` from dependencies to devDependencies
|
|
527
|
+
- add `oxlint.config.ts` and lint fixes (curly braces, unused `@ts-expect-error` removals)
|
|
528
|
+
- use bundler module resolution in tsconfig, disable strict, add separate `tsconfig.test.json` for fixtures
|
|
529
|
+
- update dependencies (@magic/core, @magic/format, @magic/lint, @magic/test, @swc/core)
|
|
530
|
+
- update docs
|
|
531
|
+
- update dependencies
|
|
532
|
+
|
|
533
|
+
##### 0.1.42 - unreleased
|
|
534
|
+
|
|
535
|
+
- ...
|
package/package.json
CHANGED
|
@@ -1,13 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@magic/types",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"
|
|
3
|
+
"version": "0.1.41",
|
|
4
|
+
"description": "typechecking library",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"magic",
|
|
7
|
+
"typechecking",
|
|
8
|
+
"types"
|
|
9
|
+
],
|
|
5
10
|
"homepage": "https://github.com/magic/types",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/magic/types/issues"
|
|
13
|
+
},
|
|
6
14
|
"license": "AGPL-3.0",
|
|
7
|
-
"
|
|
15
|
+
"author": "Wizards & Witches",
|
|
16
|
+
"contributors": [
|
|
17
|
+
{
|
|
18
|
+
"name": "jascha ehrenreich",
|
|
19
|
+
"github": "jaeh"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/magic/types.git"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"src",
|
|
28
|
+
"types"
|
|
29
|
+
],
|
|
30
|
+
"type": "module",
|
|
8
31
|
"main": "src/index.js",
|
|
9
32
|
"types": "./types/index.d.ts",
|
|
10
|
-
"type": "module",
|
|
11
33
|
"exports": {
|
|
12
34
|
".": {
|
|
13
35
|
"import": "./src/index.js",
|
|
@@ -16,7 +38,7 @@
|
|
|
16
38
|
},
|
|
17
39
|
"scripts": {
|
|
18
40
|
"start": "t",
|
|
19
|
-
"build": "tsc && npm run format",
|
|
41
|
+
"build": "tsc && node scripts/add-node-reference.mjs && npm run format",
|
|
20
42
|
"prepublishOnly": "npm run test && npm run build",
|
|
21
43
|
"build:docs": "NODE_ENV=production magic build",
|
|
22
44
|
"prod": "NODE_ENV=production magic build serve",
|
|
@@ -27,51 +49,30 @@
|
|
|
27
49
|
"format": "f -w --exclude docs",
|
|
28
50
|
"format:check": "f --exclude docs",
|
|
29
51
|
"calls": "calls",
|
|
30
|
-
"
|
|
31
|
-
"
|
|
52
|
+
"tsc": "tsc --noEmit",
|
|
53
|
+
"tsc:test": "tsc --noEmit -p tsconfig.test.json",
|
|
54
|
+
"lint": "lint",
|
|
55
|
+
"check": "npm run tsc && npm run tsc:test && npm run lint"
|
|
32
56
|
},
|
|
33
|
-
"engines": {
|
|
34
|
-
"node": ">=18"
|
|
35
|
-
},
|
|
36
|
-
"engineStrict": true,
|
|
37
|
-
"repository": {
|
|
38
|
-
"type": "git",
|
|
39
|
-
"url": "git+https://github.com/magic/types.git"
|
|
40
|
-
},
|
|
41
|
-
"bugs": {
|
|
42
|
-
"url": "https://github.com/magic/types/issues"
|
|
43
|
-
},
|
|
44
|
-
"files": [
|
|
45
|
-
"src",
|
|
46
|
-
"types"
|
|
47
|
-
],
|
|
48
57
|
"devDependencies": {
|
|
49
58
|
"@magic-modules/git-badges": "0.0.12",
|
|
50
59
|
"@magic-modules/light-switch": "0.0.12",
|
|
51
60
|
"@magic-modules/no-spy": "0.0.9",
|
|
52
61
|
"@magic-modules/pre": "0.0.12",
|
|
53
62
|
"@magic-themes/docs": "0.0.15",
|
|
54
|
-
"@magic/core": "0.0.
|
|
55
|
-
"@magic/format": "0.0.
|
|
56
|
-
"@magic/
|
|
63
|
+
"@magic/core": "0.0.161",
|
|
64
|
+
"@magic/format": "0.0.79",
|
|
65
|
+
"@magic/lint": "0.0.5",
|
|
66
|
+
"@magic/test": "0.3.55",
|
|
67
|
+
"@types/node": "26.6.6",
|
|
57
68
|
"typescript": "npm:@typescript/typescript6"
|
|
58
69
|
},
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"types",
|
|
62
|
-
"typechecking"
|
|
63
|
-
],
|
|
64
|
-
"contributors": [
|
|
65
|
-
{
|
|
66
|
-
"name": "jascha ehrenreich",
|
|
67
|
-
"github": "jaeh"
|
|
68
|
-
}
|
|
69
|
-
],
|
|
70
|
-
"dependencies": {
|
|
71
|
-
"@types/node": "26.6.3"
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=18"
|
|
72
72
|
},
|
|
73
|
+
"engineStrict": true,
|
|
73
74
|
"allowScripts": {
|
|
74
75
|
"canvas@3.2.3": true,
|
|
75
|
-
"@swc/core@1.15.
|
|
76
|
+
"@swc/core@1.15.47": true
|
|
76
77
|
}
|
|
77
78
|
}
|
package/src/fns.js
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
/**
|
|
2
3
|
* Check if a value is an Array
|
|
3
|
-
* @
|
|
4
|
-
* @returns {e is unknown[]} - true if value is an array
|
|
4
|
+
* @type {<P extends readonly ((e: unknown) => e is unknown)[]>(e: unknown, ...predicates: P) => e is P extends readonly [] ? unknown[] : (P[number] extends (e: unknown) => e is infer U ? U : never)[]}
|
|
5
5
|
*/
|
|
6
|
-
export const isArray = e =>
|
|
6
|
+
export const isArray = (e, ...predicates) => {
|
|
7
|
+
if (!Array.isArray(e)) {
|
|
8
|
+
return false
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// If no predicates provided, just check if it's an array
|
|
12
|
+
if (predicates.length === 0) {
|
|
13
|
+
return true
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Each element must pass at least one predicate
|
|
17
|
+
return e.every(element => predicates.some(predicate => predicate(element)))
|
|
18
|
+
}
|
|
7
19
|
|
|
8
20
|
/**
|
|
9
21
|
* Check if a value is a boolean
|
|
@@ -432,16 +444,26 @@ export const isArguments = e => Object.prototype.toString.call(e) === '[object A
|
|
|
432
444
|
* @returns {boolean}
|
|
433
445
|
*/
|
|
434
446
|
export const isUUID = e => {
|
|
435
|
-
if (!isDefined(e))
|
|
436
|
-
|
|
447
|
+
if (!isDefined(e)) {
|
|
448
|
+
return false
|
|
449
|
+
}
|
|
450
|
+
if (!isString(e)) {
|
|
451
|
+
return false
|
|
452
|
+
}
|
|
437
453
|
|
|
438
454
|
const split = e.split('-')
|
|
439
|
-
if (!isLengthEqual(split, 5))
|
|
455
|
+
if (!isLengthEqual(split, 5)) {
|
|
456
|
+
return false
|
|
457
|
+
}
|
|
440
458
|
|
|
441
459
|
const lengths = [8, 4, 4, 4, 12]
|
|
442
|
-
if (lengths.some((l, i) => split[i].length !== l))
|
|
460
|
+
if (lengths.some((l, i) => split[i].length !== l)) {
|
|
461
|
+
return false
|
|
462
|
+
}
|
|
443
463
|
|
|
444
|
-
if (Object.values(e).some(s => s > 'f'))
|
|
464
|
+
if (Object.values(e).some(s => s > 'f')) {
|
|
465
|
+
return false
|
|
466
|
+
}
|
|
445
467
|
|
|
446
468
|
return true
|
|
447
469
|
}
|
|
@@ -638,9 +660,13 @@ isCase.lower = isLowerCase
|
|
|
638
660
|
* @returns {boolean} - true if value is an IPv4 address
|
|
639
661
|
*/
|
|
640
662
|
export const isIPv4 = a => {
|
|
641
|
-
if (!isString(a))
|
|
663
|
+
if (!isString(a)) {
|
|
664
|
+
return false
|
|
665
|
+
}
|
|
642
666
|
const parts = a.split('.')
|
|
643
|
-
if (parts.length !== 4)
|
|
667
|
+
if (parts.length !== 4) {
|
|
668
|
+
return false
|
|
669
|
+
}
|
|
644
670
|
return parts.every(part => {
|
|
645
671
|
const num = Number(part)
|
|
646
672
|
return /^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/.test(part) && String(num) === part
|
package/src/lib.js
CHANGED
|
@@ -373,7 +373,9 @@ const addNotFunctions = (obj, target) => {
|
|
|
373
373
|
const skipKeys = new Set(['length', 'name', 'prototype', 'caller', 'callee', 'arguments'])
|
|
374
374
|
|
|
375
375
|
for (const [key, value] of Object.entries(obj)) {
|
|
376
|
-
if (key === 'not' || skipKeys.has(key))
|
|
376
|
+
if (key === 'not' || skipKeys.has(key)) {
|
|
377
|
+
continue
|
|
378
|
+
}
|
|
377
379
|
if (fns.isFunction(value)) {
|
|
378
380
|
target[key] = negate(value)
|
|
379
381
|
// Handle function sub-properties (e.g., isCase.upper, isIp.v4)
|
package/types/fns.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/**
|
|
3
|
+
* Check if a value is an Array
|
|
4
|
+
* @type {<P extends readonly ((e: unknown) => e is unknown)[]>(e: unknown, ...predicates: P) => e is P extends readonly [] ? unknown[] : (P[number] extends (e: unknown) => e is infer U ? U : never)[]}
|
|
5
|
+
*/
|
|
6
|
+
export const isArray: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
7
|
+
e: unknown,
|
|
8
|
+
...predicates: P
|
|
9
|
+
) => e is P extends readonly []
|
|
10
|
+
? unknown[]
|
|
11
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
2
12
|
export function isBoolean(e: unknown): e is boolean
|
|
3
13
|
export function isDefined(e: unknown): e is NonNullable<unknown>
|
|
4
14
|
export function isUndefined(e: unknown): e is undefined
|
package/types/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
export * from './fns.js'
|
|
2
3
|
export * as deep from './deep/index.js'
|
|
3
4
|
export const is: {
|
|
@@ -237,10 +238,30 @@ export const is: {
|
|
|
237
238
|
not: import('./lib.js').NotNamespace
|
|
238
239
|
isNeq: (e: unknown, ...types: string[]) => boolean
|
|
239
240
|
neq: (e: unknown, ...types: string[]) => boolean
|
|
240
|
-
isArray: (e: unknown) => e is unknown[]
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
isArray: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
242
|
+
e: unknown,
|
|
243
|
+
...predicates: P
|
|
244
|
+
) => e is P extends readonly []
|
|
245
|
+
? unknown[]
|
|
246
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
247
|
+
isArr: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
248
|
+
e: unknown,
|
|
249
|
+
...predicates: P
|
|
250
|
+
) => e is P extends readonly []
|
|
251
|
+
? unknown[]
|
|
252
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
253
|
+
array: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
254
|
+
e: unknown,
|
|
255
|
+
...predicates: P
|
|
256
|
+
) => e is P extends readonly []
|
|
257
|
+
? unknown[]
|
|
258
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
259
|
+
arr: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
260
|
+
e: unknown,
|
|
261
|
+
...predicates: P
|
|
262
|
+
) => e is P extends readonly []
|
|
263
|
+
? unknown[]
|
|
264
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
244
265
|
isBoolean: (e: unknown) => e is boolean
|
|
245
266
|
isBool: (e: unknown) => e is boolean
|
|
246
267
|
boolean: (e: unknown) => e is boolean
|
package/types/lib.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
export const is: {
|
|
2
3
|
isDeepEqual: {
|
|
3
4
|
/**
|
|
@@ -235,10 +236,30 @@ export const is: {
|
|
|
235
236
|
not: NotNamespace
|
|
236
237
|
isNeq: (e: unknown, ...types: string[]) => boolean
|
|
237
238
|
neq: (e: unknown, ...types: string[]) => boolean
|
|
238
|
-
isArray: (e: unknown) => e is unknown[]
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
239
|
+
isArray: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
240
|
+
e: unknown,
|
|
241
|
+
...predicates: P
|
|
242
|
+
) => e is P extends readonly []
|
|
243
|
+
? unknown[]
|
|
244
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
245
|
+
isArr: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
246
|
+
e: unknown,
|
|
247
|
+
...predicates: P
|
|
248
|
+
) => e is P extends readonly []
|
|
249
|
+
? unknown[]
|
|
250
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
251
|
+
array: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
252
|
+
e: unknown,
|
|
253
|
+
...predicates: P
|
|
254
|
+
) => e is P extends readonly []
|
|
255
|
+
? unknown[]
|
|
256
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
257
|
+
arr: <P extends readonly ((e: unknown) => e is unknown)[]>(
|
|
258
|
+
e: unknown,
|
|
259
|
+
...predicates: P
|
|
260
|
+
) => e is P extends readonly []
|
|
261
|
+
? unknown[]
|
|
262
|
+
: (P[number] extends ((e: unknown) => e is infer U) ? U : never)[]
|
|
242
263
|
isBoolean: (e: unknown) => e is boolean
|
|
243
264
|
isBool: (e: unknown) => e is boolean
|
|
244
265
|
boolean: (e: unknown) => e is boolean
|