@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 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 - unreleased
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.40",
4
- "author": "Wizards & Witches",
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
- "description": "typechecking library",
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
- "lint": "tsc --noEmit",
31
- "lint:test": "tsc --noEmit -p tsconfig.test.json"
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.160",
55
- "@magic/format": "0.0.75",
56
- "@magic/test": "0.3.32",
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
- "keywords": [
60
- "magic",
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.46": true
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
- * @param {unknown} e - value to test
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 => Array.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)) return false
436
- if (!isString(e)) return false
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)) return false
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)) return false
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')) return false
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)) return false
663
+ if (!isString(a)) {
664
+ return false
665
+ }
642
666
  const parts = a.split('.')
643
- if (parts.length !== 4) return false
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)) continue
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
- export function isArray(e: unknown): e is unknown[]
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
- isArr: (e: unknown) => e is unknown[]
242
- array: (e: unknown) => e is unknown[]
243
- arr: (e: unknown) => e is unknown[]
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
- isArr: (e: unknown) => e is unknown[]
240
- array: (e: unknown) => e is unknown[]
241
- arr: (e: unknown) => e is unknown[]
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