type-fest
Advanced tools
Comparing version 4.7.1 to 4.8.0
{ | ||
"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 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
309601
7235