is-kit 1.1.3 → 1.1.5

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/dist/index.d.mts CHANGED
@@ -136,8 +136,8 @@ declare function equals<const T>(target: T): Predicate<T>;
136
136
  * @param selector Optional selector to project the comparable key; if omitted, returns a function to supply it later.
137
137
  * @returns Function that accepts a target and returns a predicate over the original value.
138
138
  */
139
- declare function equalsBy<F extends (value: unknown) => value is unknown>(guard: F): <K>(selector: (value: GuardedOf<F>) => K) => <const T extends K>(target: T) => Predicate<GuardedOf<F>>;
140
- declare function equalsBy<F extends (value: unknown) => value is unknown, K>(guard: F, selector: (value: GuardedOf<F>) => K): <const T extends K>(target: T) => Predicate<GuardedOf<F>>;
139
+ declare function equalsBy<F extends Predicate<unknown>>(guard: F): <K>(selector: (value: GuardedOf<F>) => K) => <const T extends K>(target: T) => Predicate<GuardedOf<F>>;
140
+ declare function equalsBy<F extends Predicate<unknown>, K>(guard: F, selector: (value: GuardedOf<F>) => K): <const T extends K>(target: T) => Predicate<GuardedOf<F>>;
141
141
  /**
142
142
  * Creates a guard that matches objects having a key equal to the target value.
143
143
  *
@@ -278,12 +278,15 @@ declare function struct<S extends Schema>(schema: S, options?: {
278
278
 
279
279
  /**
280
280
  * Creates a guard that matches when the input is one of the provided literal values.
281
- * Uses `Object.is` for exact value semantics.
281
+ * Uses `Object.is` for exact value semantics. For large sets, keeps O(1) lookups while
282
+ * preserving `+0` vs `-0` by tracking zero variants explicitly in addition to a `Set`.
282
283
  *
283
- * @param values Literal primitives to compare against.
284
+ * @param values Literal primitives to compare against (varargs or single readonly tuple array).
284
285
  * @returns Predicate narrowing to the union of the provided literal values.
285
286
  */
286
287
  declare function oneOfValues<const T extends ReadonlyArray<Primitive>>(...values: T): Predicate<T[number]>;
288
+ declare function oneOfValues<const T extends ReadonlyArray<Primitive>>(values: T): Predicate<T[number]>;
289
+ declare function oneOfValues<const T extends ReadonlyArray<Primitive>>(...valuesOrArray: T | [T]): Predicate<T[number]>;
287
290
 
288
291
  /**
289
292
  * Checks whether a value is a function.
package/dist/index.d.ts CHANGED
@@ -136,8 +136,8 @@ declare function equals<const T>(target: T): Predicate<T>;
136
136
  * @param selector Optional selector to project the comparable key; if omitted, returns a function to supply it later.
137
137
  * @returns Function that accepts a target and returns a predicate over the original value.
138
138
  */
139
- declare function equalsBy<F extends (value: unknown) => value is unknown>(guard: F): <K>(selector: (value: GuardedOf<F>) => K) => <const T extends K>(target: T) => Predicate<GuardedOf<F>>;
140
- declare function equalsBy<F extends (value: unknown) => value is unknown, K>(guard: F, selector: (value: GuardedOf<F>) => K): <const T extends K>(target: T) => Predicate<GuardedOf<F>>;
139
+ declare function equalsBy<F extends Predicate<unknown>>(guard: F): <K>(selector: (value: GuardedOf<F>) => K) => <const T extends K>(target: T) => Predicate<GuardedOf<F>>;
140
+ declare function equalsBy<F extends Predicate<unknown>, K>(guard: F, selector: (value: GuardedOf<F>) => K): <const T extends K>(target: T) => Predicate<GuardedOf<F>>;
141
141
  /**
142
142
  * Creates a guard that matches objects having a key equal to the target value.
143
143
  *
@@ -278,12 +278,15 @@ declare function struct<S extends Schema>(schema: S, options?: {
278
278
 
279
279
  /**
280
280
  * Creates a guard that matches when the input is one of the provided literal values.
281
- * Uses `Object.is` for exact value semantics.
281
+ * Uses `Object.is` for exact value semantics. For large sets, keeps O(1) lookups while
282
+ * preserving `+0` vs `-0` by tracking zero variants explicitly in addition to a `Set`.
282
283
  *
283
- * @param values Literal primitives to compare against.
284
+ * @param values Literal primitives to compare against (varargs or single readonly tuple array).
284
285
  * @returns Predicate narrowing to the union of the provided literal values.
285
286
  */
286
287
  declare function oneOfValues<const T extends ReadonlyArray<Primitive>>(...values: T): Predicate<T[number]>;
288
+ declare function oneOfValues<const T extends ReadonlyArray<Primitive>>(values: T): Predicate<T[number]>;
289
+ declare function oneOfValues<const T extends ReadonlyArray<Primitive>>(...valuesOrArray: T | [T]): Predicate<T[number]>;
287
290
 
288
291
  /**
289
292
  * Checks whether a value is a function.
package/dist/index.js CHANGED
@@ -85,7 +85,7 @@ function define(fn) {
85
85
  // src/core/predicate.ts
86
86
  var predicateToRefine = (fn) => (value) => fn(value);
87
87
 
88
- // src/utils/util.ts
88
+ // src/utils/to-boolean-predicates.ts
89
89
  var toBooleanPredicates = (guards) => guards;
90
90
 
91
91
  // src/core/logic.ts
@@ -269,7 +269,7 @@ function tupleOf(...guards) {
269
269
  };
270
270
  }
271
271
 
272
- // src/core/combinators/one.ts
272
+ // src/core/combinators/one-of.ts
273
273
  function oneOf(...guards) {
274
274
  return (input) => guards.some((guard) => guard(input));
275
275
  }
@@ -311,15 +311,32 @@ function struct(schema, options) {
311
311
 
312
312
  // src/core/combinators/one-of-values.ts
313
313
  var ONE_OF_VALUES_LINEAR_SCAN_MAX = 8;
314
- function oneOfValues(...values) {
315
- if (values.length <= ONE_OF_VALUES_LINEAR_SCAN_MAX) {
316
- const items = values;
314
+ function oneOfValues(...args) {
315
+ const isSingleArrayArg = define((value) => {
316
+ if (!Array.isArray(value)) return false;
317
+ return value.length === 1 && Array.isArray(value[0]);
318
+ });
319
+ const items = isSingleArrayArg(args) ? args[0] : args;
320
+ if (items.length <= ONE_OF_VALUES_LINEAR_SCAN_MAX) {
317
321
  return function(input) {
318
322
  return items.some((value) => Object.is(value, input));
319
323
  };
320
324
  }
321
- const valueSet = new Set(values);
325
+ let hasPositiveZero = false;
326
+ let hasNegativeZero = false;
327
+ const valueSet = /* @__PURE__ */ new Set();
328
+ for (const literalValue of items) {
329
+ if (typeof literalValue === "number" && (Object.is(literalValue, 0) || Object.is(literalValue, -0))) {
330
+ if (Object.is(literalValue, -0)) hasNegativeZero = true;
331
+ else hasPositiveZero = true;
332
+ } else {
333
+ valueSet.add(literalValue);
334
+ }
335
+ }
322
336
  return function(input) {
337
+ if (typeof input === "number" && (Object.is(input, 0) || Object.is(input, -0))) {
338
+ return Object.is(input, -0) ? hasNegativeZero : hasPositiveZero;
339
+ }
323
340
  return valueSet.has(input);
324
341
  };
325
342
  }
package/dist/index.mjs CHANGED
@@ -6,7 +6,7 @@ function define(fn) {
6
6
  // src/core/predicate.ts
7
7
  var predicateToRefine = (fn) => (value) => fn(value);
8
8
 
9
- // src/utils/util.ts
9
+ // src/utils/to-boolean-predicates.ts
10
10
  var toBooleanPredicates = (guards) => guards;
11
11
 
12
12
  // src/core/logic.ts
@@ -190,7 +190,7 @@ function tupleOf(...guards) {
190
190
  };
191
191
  }
192
192
 
193
- // src/core/combinators/one.ts
193
+ // src/core/combinators/one-of.ts
194
194
  function oneOf(...guards) {
195
195
  return (input) => guards.some((guard) => guard(input));
196
196
  }
@@ -232,15 +232,32 @@ function struct(schema, options) {
232
232
 
233
233
  // src/core/combinators/one-of-values.ts
234
234
  var ONE_OF_VALUES_LINEAR_SCAN_MAX = 8;
235
- function oneOfValues(...values) {
236
- if (values.length <= ONE_OF_VALUES_LINEAR_SCAN_MAX) {
237
- const items = values;
235
+ function oneOfValues(...args) {
236
+ const isSingleArrayArg = define((value) => {
237
+ if (!Array.isArray(value)) return false;
238
+ return value.length === 1 && Array.isArray(value[0]);
239
+ });
240
+ const items = isSingleArrayArg(args) ? args[0] : args;
241
+ if (items.length <= ONE_OF_VALUES_LINEAR_SCAN_MAX) {
238
242
  return function(input) {
239
243
  return items.some((value) => Object.is(value, input));
240
244
  };
241
245
  }
242
- const valueSet = new Set(values);
246
+ let hasPositiveZero = false;
247
+ let hasNegativeZero = false;
248
+ const valueSet = /* @__PURE__ */ new Set();
249
+ for (const literalValue of items) {
250
+ if (typeof literalValue === "number" && (Object.is(literalValue, 0) || Object.is(literalValue, -0))) {
251
+ if (Object.is(literalValue, -0)) hasNegativeZero = true;
252
+ else hasPositiveZero = true;
253
+ } else {
254
+ valueSet.add(literalValue);
255
+ }
256
+ }
243
257
  return function(input) {
258
+ if (typeof input === "number" && (Object.is(input, 0) || Object.is(input, -0))) {
259
+ return Object.is(input, -0) ? hasNegativeZero : hasPositiveZero;
260
+ }
244
261
  return valueSet.has(input);
245
262
  };
246
263
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "is-kit",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "Make 'isXXX' easier. Let's make your code type safe and more readable!",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",