@ngutil/common 0.0.7 → 0.0.8

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.
@@ -0,0 +1,9 @@
1
+ import { Eval } from "./util";
2
+ type AllKeys<T> = T extends any ? keyof T : never;
3
+ type TypeOfKey<T, TK extends AllKeys<T>> = T extends {
4
+ [K in TK]?: any;
5
+ } ? T[TK] : never;
6
+ export type MergeUnion<T> = Eval<{
7
+ [K in AllKeys<T>]: TypeOfKey<T, K>;
8
+ }>;
9
+ export {};
@@ -0,0 +1,23 @@
1
+ import { isPrimitive, Primitive } from "utility-types";
2
+ import { IsAny } from "./util";
3
+ export { Primitive, isPrimitive };
4
+ export type Builtins = Primitive | Function | Date;
5
+ export type ToPrimitiveMap = {
6
+ string: string;
7
+ default: string;
8
+ number: number;
9
+ bigint: bigint;
10
+ boolean: boolean;
11
+ symbol: symbol;
12
+ };
13
+ type AsString<T, P, F = never> = P extends string ? (T extends Primitive ? P : F) : never;
14
+ type HasValueOf<T, P, F = never> = T extends {
15
+ valueOf(): P;
16
+ } ? P : F;
17
+ type HasToPrimitive<T, P, F = never> = T extends {
18
+ [Symbol.toPrimitive](hint: string): P;
19
+ } ? P : F;
20
+ type _AsPrimitive<T, P> = HasToPrimitive<T, P, HasValueOf<T, P, AsString<T, P>>>;
21
+ export type AsPrimitive<T> = IsAny<T> extends true ? ToPrimitiveMap[keyof ToPrimitiveMap] : {
22
+ [K in keyof ToPrimitiveMap]: _AsPrimitive<T, ToPrimitiveMap[K]>;
23
+ }[keyof ToPrimitiveMap];
@@ -0,0 +1,14 @@
1
+ import { Primitive } from "./primitive";
2
+ import { IsAny, IsTuple, MaxRecursion } from "./util";
3
+ export type DeepReadonly<T, D extends number = MaxRecursion> = _DeepReadonly<T, [], D>;
4
+ type _DeepReadonly<T, P extends number[], D extends number> = P["length"] extends D ? never : IsAny<T> extends true ? any : T extends Primitive | ((...args: any[]) => any) ? T : T extends Date ? ReadonlyDate : T extends Array<infer V> ? IsTuple<T> extends true ? _DeepReadonlyTuple<T, P, D> : _DeepReadonlyArray<V, P, D> : T extends Map<infer MK, infer MV> ? _DeepReadonlyMap<MK, MV, P, D> : T extends Set<infer V> ? _DeepReadonlySet<V, P, D> : T extends object ? _DeepReadonlyObject<T, P, D> : T;
5
+ type _DeepReadonlyTuple<T extends any[], P extends number[], D extends number> = _ReadonlyTuple<T, [], [], P, D>;
6
+ type _ReadonlyTuple<T extends any[], K extends number[], R extends readonly any[], P extends number[], D extends number> = T["length"] extends K["length"] ? R : _ReadonlyTuple<T, [...K, K["length"]], readonly [...R, _DeepReadonly<T[K["length"]], [...P, 0], D>], P, D>;
7
+ type _DeepReadonlyArray<T, P extends number[], D extends number> = ReadonlyArray<IsAny<T> extends true ? any : _DeepReadonly<T, [...P, 0], D>>;
8
+ type _DeepReadonlyObject<T extends object, P extends number[], D extends number> = {
9
+ readonly [K in keyof T]: IsAny<T[K]> extends true ? any : _DeepReadonly<T[K], [...P, 0], D>;
10
+ };
11
+ type _DeepReadonlyMap<K, V, P extends number[], D extends number> = ReadonlyMap<K, _DeepReadonly<V, [...P, 0], D>>;
12
+ type _DeepReadonlySet<V, P extends number[], D extends number> = ReadonlySet<_DeepReadonly<V, [...P, 0], D>>;
13
+ export type ReadonlyDate = Omit<Date, "setTime" | "setMilliseconds" | "setUTCMilliseconds" | "setSeconds" | "setUTCSeconds" | "setMinutes" | "setUTCMinutes" | "setHours" | "setUTCHours" | "setDate" | "setUTCDate" | "setMonth" | "setUTCMonth" | "setFullYear" | "setUTCFullYear">;
14
+ export {};
@@ -0,0 +1,29 @@
1
+ import { MergeUnion } from "./merge-union";
2
+ export type MaxRecursion = 10;
3
+ export type IfAny<O, T, F> = 0 extends 1 & O ? T : F;
4
+ export type IsAny<T> = IfAny<T, true, false>;
5
+ export type IfTuple<O, T, F, E = never> = O extends Array<any> ? (-1 extends O["length"] ? F : O["length"] extends 0 ? E : T) : F;
6
+ export type IsTuple<T, E = never> = IfTuple<T, true, false, E>;
7
+ /**
8
+ * @example
9
+ * ```ts
10
+ * type Tuple = TupleEntries<[1, "ok", false]>
11
+ * Tuple = {0: 1, 1: "ok", 2: false}
12
+ * ```
13
+ */
14
+ export type TupleItems<T> = T extends Array<any> ? MergeUnion<_TupleItems<T>> : never;
15
+ type _TupleItems<T extends any[], K extends number[] = [], O extends {
16
+ [key: string]: number;
17
+ } = never> = T["length"] extends K["length"] ? O : _TupleItems<T, [...K, K["length"]], O | {
18
+ [key in K["length"]]: T[K["length"]];
19
+ }>;
20
+ export type ObjectKey = string | number | symbol;
21
+ /**
22
+ * Evaulate type expressions
23
+ *
24
+ * ```ts
25
+ * export type KeyOf<T> = Eval<{ [K in keyof T]: T[K] extends never ? never : K }[keyof T]>
26
+ * ```
27
+ */
28
+ export type Eval<T> = Array<T>[number];
29
+ export {};
package/util.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { DeepReadonly } from "./types/readonly";
2
+ export declare const deepClone: <T>(obj: T) => T;
3
+ export declare const isPlainObject: (arg: any) => arg is {
4
+ [key: string]: any;
5
+ };
6
+ export declare function deepFreeze<T>(obj: T): DeepReadonly<T>;
7
+ /**
8
+ * @example
9
+ * ```ts
10
+ * toSorted([{id: 1}, {id: 2}, {id: 3}], sortBy([{id: "desc"}]))
11
+ * ```
12
+ */
13
+ export declare function toSorted<T>(items: readonly T[], fn: (a: T, b: T) => number): T[];