Socket
Socket
Sign inDemoInstall

type-fest

Package Overview
Dependencies
Maintainers
1
Versions
154
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

type-fest - npm Package Compare versions

Comparing version 4.7.1 to 4.8.0

2

package.json
{
"name": "type-fest",
"version": "4.7.1",
"version": "4.8.0",
"description": "A collection of essential TypeScript types",

@@ -5,0 +5,0 @@ "license": "(MIT OR CC0-1.0)",

@@ -7,3 +7,3 @@ /**

export type Class<T, Arguments extends unknown[] = any[]> = {
prototype: T;
prototype: Pick<T, keyof T>;
new(...arguments_: Arguments): T;

@@ -29,3 +29,3 @@ };

export interface AbstractClass<T, Arguments extends unknown[] = any[]> extends AbstractConstructor<T, Arguments> {
prototype: T;
prototype: Pick<T, keyof T>;
}

@@ -32,0 +32,0 @@

import type {DelimiterCase} from './delimiter-case';
import type {UnknownArray} from './unknown-array';

@@ -52,10 +53,32 @@ /**

? Value
: Value extends Array<infer U>
? Array<DelimiterCasedPropertiesDeep<U, Delimiter>>
: Value extends Set<infer U>
? Set<DelimiterCasedPropertiesDeep<U, Delimiter>> : {
[K in keyof Value as DelimiterCase<
K,
Delimiter
>]: DelimiterCasedPropertiesDeep<Value[K], Delimiter>;
};
: Value extends string
? DelimiterCase<Value, Delimiter>
: Value extends UnknownArray
? DelimiterCasedPropertiesArrayDeep<Value, Delimiter>
: Value extends Set<infer U>
? Set<DelimiterCasedPropertiesDeep<U, Delimiter>> : {
[K in keyof Value as DelimiterCase<
K,
Delimiter
>]: DelimiterCasedPropertiesDeep<Value[K], Delimiter>;
};
type DelimiterCasedPropertiesArrayDeep<Value extends UnknownArray, Delimiter extends string> =
Value extends []
? []
// Tailing spread array
: Value extends [infer U, ...infer V]
? [DelimiterCasedPropertiesDeep<U, Delimiter>, ...DelimiterCasedPropertiesDeep<V, Delimiter>]
: Value extends readonly [infer U, ...infer V]
? readonly [DelimiterCasedPropertiesDeep<U, Delimiter>, ...DelimiterCasedPropertiesDeep<V, Delimiter>]
// Leading spread array
: Value extends readonly [...infer U, infer V]
? [...DelimiterCasedPropertiesDeep<U, Delimiter>, DelimiterCasedPropertiesDeep<V, Delimiter>]
: Value extends readonly [...infer U, infer V]
? readonly [...DelimiterCasedPropertiesDeep<U, Delimiter>, DelimiterCasedPropertiesDeep<V, Delimiter>]
// Array
: Value extends Array<infer U>
? Array<DelimiterCasedPropertiesDeep<U, Delimiter>>
: Value extends ReadonlyArray<infer U>
? ReadonlyArray<DelimiterCasedPropertiesDeep<U, Delimiter>>
: never;

@@ -43,3 +43,3 @@ import type {Primitive} from './primitive';

*/
export type BuildObject<Key extends PropertyKey, Value, CopiedFrom extends UnknownRecord = {}> =
export type BuildObject<Key extends PropertyKey, Value, CopiedFrom extends object = {}> =
Key extends keyof CopiedFrom

@@ -71,6 +71,11 @@ ? Pick<{[_ in keyof CopiedFrom]: Value}, Key>

/**
Matches any primitive, `Date`, or `RegExp` value.
Matches any primitive, `Date`, `RegExp`, `Element` value.
*/
export type BuiltIns = Primitive | Date | RegExp;
export type BuiltIns = Primitive | Date | RegExp | Element;
/**
Matches non-recursive types.
*/
export type NonRecursiveType = BuiltIns | Function | (new (...args: any[]) => unknown);
export type UpperCaseCharacters = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z';

@@ -155,3 +160,12 @@

*/
export type ObjectValue<T, K> = K extends keyof T ? T[K] : never;
export type ObjectValue<T, K> =
K extends keyof T
? T[K]
: ToString<K> extends keyof T
? T[ToString<K>]
: K extends `${infer NumberK extends number}`
? NumberK extends keyof T
? T[NumberK]
: never
: never;

@@ -158,0 +172,0 @@ /**

@@ -1,2 +0,2 @@

import type {JsonPrimitive, JsonValue} from './basic';
import type {JsonPrimitive} from './basic';

@@ -3,0 +3,0 @@ type JsonifiableObject = {[Key in string]?: Jsonifiable} | {toJSON: () => Jsonifiable};

@@ -1,2 +0,2 @@

import type {CamelCase} from './camel-case';
import type {CamelCase, CamelCaseOptions} from './camel-case';

@@ -36,4 +36,4 @@ /**

*/
export type PascalCase<Value> = CamelCase<Value> extends string
? Capitalize<CamelCase<Value>>
: CamelCase<Value>;
export type PascalCase<Value, Options extends CamelCaseOptions = {preserveConsecutiveUppercase: true}> = CamelCase<Value, Options> extends string
? Capitalize<CamelCase<Value, Options>>
: CamelCase<Value, Options>;

@@ -0,1 +1,2 @@

import type {CamelCaseOptions} from './camel-case';
import type {PascalCase} from './pascal-case';

@@ -47,9 +48,9 @@

*/
export type PascalCasedPropertiesDeep<Value> = Value extends Function | Date | RegExp
export type PascalCasedPropertiesDeep<Value, Options extends CamelCaseOptions = {preserveConsecutiveUppercase: true}> = Value extends Function | Date | RegExp
? Value
: Value extends Array<infer U>
? Array<PascalCasedPropertiesDeep<U>>
? Array<PascalCasedPropertiesDeep<U, Options>>
: Value extends Set<infer U>
? Set<PascalCasedPropertiesDeep<U>> : {
[K in keyof Value as PascalCase<K>]: PascalCasedPropertiesDeep<Value[K]>;
? Set<PascalCasedPropertiesDeep<U, Options>> : {
[K in keyof Value as PascalCase<K, Options>]: PascalCasedPropertiesDeep<Value[K], Options>;
};

@@ -0,1 +1,2 @@

import type {CamelCaseOptions} from './camel-case';
import type {PascalCase} from './pascal-case';

@@ -30,6 +31,6 @@

*/
export type PascalCasedProperties<Value> = Value extends Function
export type PascalCasedProperties<Value, Options extends CamelCaseOptions = {preserveConsecutiveUppercase: true}> = Value extends Function
? Value
: Value extends Array<infer U>
? Value
: {[K in keyof Value as PascalCase<K>]: Value[K]};
: {[K in keyof Value as PascalCase<K, Options>]: Value[K]};

@@ -1,2 +0,2 @@

import type {ToString} from './internal';
import type {NonRecursiveType, ToString} from './internal';
import type {EmptyObject} from './empty-object';

@@ -6,3 +6,2 @@ import type {IsAny} from './is-any';

import type {UnknownArray} from './unknown-array';
import type {UnknownRecord} from './unknown-record';

@@ -82,14 +81,18 @@ /**

*/
export type Paths<T extends UnknownRecord | UnknownArray> =
IsAny<T> extends true
export type Paths<T> =
T extends NonRecursiveType
? never
: T extends UnknownArray
? number extends T['length']
// We need to handle the fixed and non-fixed index part of the array separately.
? InternalPaths<FilterFixedIndexArray<T>>
| InternalPaths<Array<FilterNotFixedIndexArray<T>[number]>>
: InternalPaths<T>
: InternalPaths<T>;
: IsAny<T> extends true
? never
: T extends UnknownArray
? number extends T['length']
// We need to handle the fixed and non-fixed index part of the array separately.
? InternalPaths<FilterFixedIndexArray<T>>
| InternalPaths<Array<FilterNotFixedIndexArray<T>[number]>>
: InternalPaths<T>
: T extends object
? InternalPaths<T>
: never;
export type InternalPaths<_T extends UnknownRecord | UnknownArray, T = Required<_T>> =
export type InternalPaths<_T, T = Required<_T>> =
T extends EmptyObject | readonly []

@@ -100,11 +103,12 @@ ? never

Key extends string | number // Limit `Key` to string or number.
? T[Key] extends UnknownRecord | UnknownArray
? (
IsNever<Paths<T[Key]>> extends false
// If `Key` is a number, return `Key | `${Key}``, because both `array[0]` and `array['0']` work.
? Key | ToString<Key> | `${Key}.${Paths<T[Key]>}`
: Key | ToString<Key>
)
: Key | ToString<Key>
// If `Key` is a number, return `Key | `${Key}``, because both `array[0]` and `array['0']` work.
?
| Key
| ToString<Key>
| (
IsNever<Paths<T[Key]>> extends false
? `${Key}.${Paths<T[Key]>}`
: never
)
: never
}[keyof T & (T extends UnknownArray ? number : unknown)];

@@ -1,2 +0,3 @@

import type {BuildObject, BuildTuple, ToString} from './internal';
import type {BuildObject, BuildTuple, NonRecursiveType, ObjectValue} from './internal';
import type {IsNever} from './is-never';
import type {Paths} from './paths';

@@ -6,3 +7,2 @@ import type {Simplify} from './simplify.d';

import type {UnknownArray} from './unknown-array';
import type {UnknownRecord} from './unknown-record.d';

@@ -80,7 +80,5 @@ /**

*/
export type PickDeep<T extends UnknownRecord | UnknownArray, PathUnion extends Paths<T>> =
T extends UnknownRecord
? Simplify<UnionToIntersection<{
[P in PathUnion]: InternalPickDeep<T, P>;
}[PathUnion]>>
export type PickDeep<T, PathUnion extends Paths<T>> =
T extends NonRecursiveType
? never
: T extends UnknownArray

@@ -91,3 +89,7 @@ ? UnionToIntersection<{

>
: never;
: T extends object
? Simplify<UnionToIntersection<{
[P in PathUnion]: InternalPickDeep<T, P>;
}[PathUnion]>>
: never;

@@ -97,9 +99,8 @@ /**

*/
type InternalPickDeep<
T extends UnknownRecord | UnknownArray,
Path extends string | number, // Checked paths, extracted from unchecked paths
> =
T extends UnknownArray ? PickDeepArray<T, Path>
: T extends UnknownRecord ? Simplify<PickDeepObject<T, Path>>
: never;
type InternalPickDeep<T, Path extends string | number> =
T extends NonRecursiveType
? never
: T extends UnknownArray ? PickDeepArray<T, Path>
: T extends object ? Simplify<PickDeepObject<T, Path>>
: never;

@@ -109,7 +110,13 @@ /**

*/
type PickDeepObject<RecordType extends UnknownRecord, P extends string | number> =
type PickDeepObject<RecordType extends object, P extends string | number> =
P extends `${infer RecordKeyInPath}.${infer SubPath}`
? BuildObject<RecordKeyInPath, InternalPickDeep<NonNullable<RecordType[RecordKeyInPath]>, SubPath>, RecordType>
: P extends keyof RecordType | ToString<keyof RecordType> // Handle number keys
? BuildObject<P, RecordType[P], RecordType>
? ObjectValue<RecordType, RecordKeyInPath> extends infer ObjectV
? IsNever<ObjectV> extends false
? BuildObject<RecordKeyInPath, InternalPickDeep<NonNullable<ObjectV>, SubPath>, RecordType>
: never
: never
: ObjectValue<RecordType, P> extends infer ObjectV
? IsNever<ObjectV> extends false
? BuildObject<P, ObjectV, RecordType>
: never
: never;

@@ -116,0 +123,0 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc