@drunkcod/argis 0.0.15 → 0.0.17
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/lib/Json.d.ts +17 -9
- package/lib/Json.js +1 -1
- package/lib/TypeUtils.d.ts +21 -10
- package/lib/cjs/Json.d.ts +17 -9
- package/lib/cjs/Json.js +1 -1
- package/lib/cjs/TypeUtils.d.ts +21 -10
- package/package.json +1 -1
package/lib/Json.d.ts
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
|
+
import { AnyFn, IfOptional, Pretty, TagCycle, TagCycles } from './TypeUtils.js';
|
|
1
2
|
export interface Jsonable<Json> {
|
|
2
3
|
toJSON(): Json;
|
|
3
4
|
}
|
|
4
|
-
type AnyFn = (...args: any[]) => any;
|
|
5
5
|
type NeverJson = undefined | symbol | AnyFn;
|
|
6
6
|
type EmptyJson = Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any> | RegExp;
|
|
7
|
-
declare const
|
|
8
|
-
export type JsonError<T> = {
|
|
9
|
-
[
|
|
7
|
+
declare const JsonError: unique symbol;
|
|
8
|
+
export type JsonError<T, Data = never> = [Data] extends [never] ? {
|
|
9
|
+
[JsonError]: T;
|
|
10
|
+
} : {
|
|
11
|
+
[JsonError]: T;
|
|
12
|
+
data: Data;
|
|
10
13
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
type JsonProperty<T, P extends keyof T> = P extends string | number ? (Json<T[P]> extends never ? never : P) : never;
|
|
15
|
+
type JsonObject<T> = {
|
|
16
|
+
[P in keyof T as IfOptional<T, P, never, JsonProperty<T, P>>]: Pretty<_Json<T[P]>>;
|
|
17
|
+
} & {
|
|
18
|
+
[P in keyof T as IfOptional<T, P, JsonProperty<T, P>, never>]?: Pretty<_Json<T[P]>>;
|
|
19
|
+
};
|
|
20
|
+
type _Json<T, IsRoot = true> = T extends TagCycle<infer X> ? (X extends Jsonable<infer J> ? _Json<TagCycles<J>, false> : JsonError<'cycle-detected', X>) : T extends Jsonable<infer J> ? (IsRoot extends true ? _Json<TagCycles<J>, false> : _Json<Omit<T, 'toJSON'>>) : T extends NeverJson ? never : T extends EmptyJson ? Record<string, never> : T extends bigint ? JsonError<'bigint-not-serializeable'> : T extends readonly any[] ? {
|
|
21
|
+
[I in keyof T]: [_Json<T[I]>] extends [never] ? null : Pretty<_Json<T[I]>>;
|
|
22
|
+
} : T extends object ? JsonObject<T> : T;
|
|
23
|
+
export type Json<T, IsRoot = true> = Pretty<_Json<TagCycles<T>, IsRoot>>;
|
|
16
24
|
export {};
|
package/lib/Json.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
1
|
+
const JsonError = Symbol('JsonError');
|
|
2
2
|
export {};
|
package/lib/TypeUtils.d.ts
CHANGED
|
@@ -2,28 +2,39 @@ export type Pretty<T> = {
|
|
|
2
2
|
[P in keyof T]: T[P];
|
|
3
3
|
} & {};
|
|
4
4
|
declare const SPECIAL_TAG: unique symbol;
|
|
5
|
-
type SpecialTag<T> = {
|
|
5
|
+
type SpecialTag<T, Data = never> = {
|
|
6
6
|
readonly [SPECIAL_TAG]: T;
|
|
7
|
+
data: Data;
|
|
7
8
|
};
|
|
8
9
|
type TagAny = SpecialTag<'any'>;
|
|
9
10
|
type TagOptional = SpecialTag<'?'>;
|
|
10
11
|
type TagUnknown = SpecialTag<'unknown'>;
|
|
12
|
+
export type TagCycle<T> = SpecialTag<'cycle', T>;
|
|
13
|
+
export type AnyFn = (...args: any[]) => any;
|
|
11
14
|
export type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
15
|
+
export type IsFn<T> = T extends AnyFn ? true : false;
|
|
12
16
|
export type IsUnknown<T> = unknown extends T ? (IsAny<T> extends true ? false : true) : false;
|
|
13
|
-
export type IsOptional<T, K extends keyof T> =
|
|
17
|
+
export type IsOptional<T, K extends keyof T> = IfOptional<T, K, true, false>;
|
|
18
|
+
export type IfOptional<T, K extends keyof T, True, False> = {
|
|
14
19
|
[P in K]?: T[K];
|
|
15
|
-
} extends Pick<T, K> ?
|
|
16
|
-
type TagSpecial<T> = {
|
|
17
|
-
[P in keyof T]:
|
|
20
|
+
} extends Pick<T, K> ? True : False;
|
|
21
|
+
export type TagSpecial<T> = {
|
|
22
|
+
[P in keyof T]: IfOptional<T, P, TagOptional, never> | (IsAny<T[P]> extends true ? TagAny : IsUnknown<T[P]> extends true ? TagUnknown : T[P]);
|
|
18
23
|
};
|
|
19
|
-
type
|
|
24
|
+
export type IsIdentical<T, V> = IsAny<T> extends true ? IsAny<V> : [T] extends [V] ? ([V] extends [T] ? true : false) : false;
|
|
25
|
+
export type HasIdentical<T, U> = true extends (U extends any ? IsIdentical<T, U> : false) ? true : false;
|
|
26
|
+
export type IsVisited<T, Visited> = [NonNullable<T>] extends [Visited] ? HasIdentical<T, Visited> : false;
|
|
27
|
+
export type TagCycles<T, Visited = never> = T extends SpecialTag<any> ? T : IsFn<T> extends true ? T : T extends undefined ? undefined : IsVisited<T, Visited> extends true ? TagCycle<NonNullable<T>> : T extends object ? {
|
|
28
|
+
[P in keyof T]: TagCycles<T[P], Visited | NonNullable<T>>;
|
|
29
|
+
} : T;
|
|
30
|
+
type IfTagged<T, X extends SpecialTag<any>, True, False> = [Extract<T, X>] extends [never] ? False : True;
|
|
20
31
|
type UnwrapOptional<T> = {
|
|
21
|
-
[P in keyof T as
|
|
32
|
+
[P in keyof T as IfTagged<T[P], TagOptional, never, P>]: T[P];
|
|
22
33
|
} & {
|
|
23
|
-
[P in keyof T as
|
|
34
|
+
[P in keyof T as IfTagged<T[P], TagOptional, P, never>]?: Exclude<T[P], TagOptional>;
|
|
24
35
|
};
|
|
25
36
|
type UnwrapTagsCore<T> = {
|
|
26
|
-
[P in keyof T]:
|
|
37
|
+
[P in keyof T]: IfTagged<T[P], TagAny, any, IfTagged<T[P], TagUnknown, unknown, T[P]>>;
|
|
27
38
|
};
|
|
28
39
|
type UnwrapTags<T> = UnwrapTagsCore<UnwrapOptional<T>>;
|
|
29
40
|
type UnionMergeCore<A, B> = {
|
|
@@ -32,6 +43,6 @@ type UnionMergeCore<A, B> = {
|
|
|
32
43
|
export type Assign<Target, Source> = Omit<Target, keyof Source> & Source;
|
|
33
44
|
export type UnionMerge<A, B> = Pretty<UnwrapTags<UnionMergeCore<TagSpecial<A>, TagSpecial<B>>>>;
|
|
34
45
|
export type PickRequired<T> = {
|
|
35
|
-
[P in keyof T as
|
|
46
|
+
[P in keyof T as IfOptional<T, P, never, P>]: T[P];
|
|
36
47
|
};
|
|
37
48
|
export {};
|
package/lib/cjs/Json.d.ts
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
|
+
import { AnyFn, IfOptional, Pretty, TagCycle, TagCycles } from './TypeUtils.js';
|
|
1
2
|
export interface Jsonable<Json> {
|
|
2
3
|
toJSON(): Json;
|
|
3
4
|
}
|
|
4
|
-
type AnyFn = (...args: any[]) => any;
|
|
5
5
|
type NeverJson = undefined | symbol | AnyFn;
|
|
6
6
|
type EmptyJson = Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any> | RegExp;
|
|
7
|
-
declare const
|
|
8
|
-
export type JsonError<T> = {
|
|
9
|
-
[
|
|
7
|
+
declare const JsonError: unique symbol;
|
|
8
|
+
export type JsonError<T, Data = never> = [Data] extends [never] ? {
|
|
9
|
+
[JsonError]: T;
|
|
10
|
+
} : {
|
|
11
|
+
[JsonError]: T;
|
|
12
|
+
data: Data;
|
|
10
13
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
type JsonProperty<T, P extends keyof T> = P extends string | number ? (Json<T[P]> extends never ? never : P) : never;
|
|
15
|
+
type JsonObject<T> = {
|
|
16
|
+
[P in keyof T as IfOptional<T, P, never, JsonProperty<T, P>>]: Pretty<_Json<T[P]>>;
|
|
17
|
+
} & {
|
|
18
|
+
[P in keyof T as IfOptional<T, P, JsonProperty<T, P>, never>]?: Pretty<_Json<T[P]>>;
|
|
19
|
+
};
|
|
20
|
+
type _Json<T, IsRoot = true> = T extends TagCycle<infer X> ? (X extends Jsonable<infer J> ? _Json<TagCycles<J>, false> : JsonError<'cycle-detected', X>) : T extends Jsonable<infer J> ? (IsRoot extends true ? _Json<TagCycles<J>, false> : _Json<Omit<T, 'toJSON'>>) : T extends NeverJson ? never : T extends EmptyJson ? Record<string, never> : T extends bigint ? JsonError<'bigint-not-serializeable'> : T extends readonly any[] ? {
|
|
21
|
+
[I in keyof T]: [_Json<T[I]>] extends [never] ? null : Pretty<_Json<T[I]>>;
|
|
22
|
+
} : T extends object ? JsonObject<T> : T;
|
|
23
|
+
export type Json<T, IsRoot = true> = Pretty<_Json<TagCycles<T>, IsRoot>>;
|
|
16
24
|
export {};
|
package/lib/cjs/Json.js
CHANGED
package/lib/cjs/TypeUtils.d.ts
CHANGED
|
@@ -2,28 +2,39 @@ export type Pretty<T> = {
|
|
|
2
2
|
[P in keyof T]: T[P];
|
|
3
3
|
} & {};
|
|
4
4
|
declare const SPECIAL_TAG: unique symbol;
|
|
5
|
-
type SpecialTag<T> = {
|
|
5
|
+
type SpecialTag<T, Data = never> = {
|
|
6
6
|
readonly [SPECIAL_TAG]: T;
|
|
7
|
+
data: Data;
|
|
7
8
|
};
|
|
8
9
|
type TagAny = SpecialTag<'any'>;
|
|
9
10
|
type TagOptional = SpecialTag<'?'>;
|
|
10
11
|
type TagUnknown = SpecialTag<'unknown'>;
|
|
12
|
+
export type TagCycle<T> = SpecialTag<'cycle', T>;
|
|
13
|
+
export type AnyFn = (...args: any[]) => any;
|
|
11
14
|
export type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
15
|
+
export type IsFn<T> = T extends AnyFn ? true : false;
|
|
12
16
|
export type IsUnknown<T> = unknown extends T ? (IsAny<T> extends true ? false : true) : false;
|
|
13
|
-
export type IsOptional<T, K extends keyof T> =
|
|
17
|
+
export type IsOptional<T, K extends keyof T> = IfOptional<T, K, true, false>;
|
|
18
|
+
export type IfOptional<T, K extends keyof T, True, False> = {
|
|
14
19
|
[P in K]?: T[K];
|
|
15
|
-
} extends Pick<T, K> ?
|
|
16
|
-
type TagSpecial<T> = {
|
|
17
|
-
[P in keyof T]:
|
|
20
|
+
} extends Pick<T, K> ? True : False;
|
|
21
|
+
export type TagSpecial<T> = {
|
|
22
|
+
[P in keyof T]: IfOptional<T, P, TagOptional, never> | (IsAny<T[P]> extends true ? TagAny : IsUnknown<T[P]> extends true ? TagUnknown : T[P]);
|
|
18
23
|
};
|
|
19
|
-
type
|
|
24
|
+
export type IsIdentical<T, V> = IsAny<T> extends true ? IsAny<V> : [T] extends [V] ? ([V] extends [T] ? true : false) : false;
|
|
25
|
+
export type HasIdentical<T, U> = true extends (U extends any ? IsIdentical<T, U> : false) ? true : false;
|
|
26
|
+
export type IsVisited<T, Visited> = [NonNullable<T>] extends [Visited] ? HasIdentical<T, Visited> : false;
|
|
27
|
+
export type TagCycles<T, Visited = never> = T extends SpecialTag<any> ? T : IsFn<T> extends true ? T : T extends undefined ? undefined : IsVisited<T, Visited> extends true ? TagCycle<NonNullable<T>> : T extends object ? {
|
|
28
|
+
[P in keyof T]: TagCycles<T[P], Visited | NonNullable<T>>;
|
|
29
|
+
} : T;
|
|
30
|
+
type IfTagged<T, X extends SpecialTag<any>, True, False> = [Extract<T, X>] extends [never] ? False : True;
|
|
20
31
|
type UnwrapOptional<T> = {
|
|
21
|
-
[P in keyof T as
|
|
32
|
+
[P in keyof T as IfTagged<T[P], TagOptional, never, P>]: T[P];
|
|
22
33
|
} & {
|
|
23
|
-
[P in keyof T as
|
|
34
|
+
[P in keyof T as IfTagged<T[P], TagOptional, P, never>]?: Exclude<T[P], TagOptional>;
|
|
24
35
|
};
|
|
25
36
|
type UnwrapTagsCore<T> = {
|
|
26
|
-
[P in keyof T]:
|
|
37
|
+
[P in keyof T]: IfTagged<T[P], TagAny, any, IfTagged<T[P], TagUnknown, unknown, T[P]>>;
|
|
27
38
|
};
|
|
28
39
|
type UnwrapTags<T> = UnwrapTagsCore<UnwrapOptional<T>>;
|
|
29
40
|
type UnionMergeCore<A, B> = {
|
|
@@ -32,6 +43,6 @@ type UnionMergeCore<A, B> = {
|
|
|
32
43
|
export type Assign<Target, Source> = Omit<Target, keyof Source> & Source;
|
|
33
44
|
export type UnionMerge<A, B> = Pretty<UnwrapTags<UnionMergeCore<TagSpecial<A>, TagSpecial<B>>>>;
|
|
34
45
|
export type PickRequired<T> = {
|
|
35
|
-
[P in keyof T as
|
|
46
|
+
[P in keyof T as IfOptional<T, P, never, P>]: T[P];
|
|
36
47
|
};
|
|
37
48
|
export {};
|
package/package.json
CHANGED