Skip to content

Commit 5a37412

Browse files
committed
Release 0.13.31
1 parent 0f185e2 commit 5a37412

3 files changed

Lines changed: 75 additions & 107 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "pave",
33
"type": "module",
4-
"version": "0.13.30",
4+
"version": "0.13.31",
55
"author": "Casey Foster <c@sey.me>",
66
"license": "MIT",
77
"repository": {

src/index.js

Lines changed: 41 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -8,76 +8,56 @@
88
* @typedef {Recursive<T>[]} RecursiveArray
99
*/
1010

11+
/**
12+
* @template Value
13+
* @template Fallback
14+
* @typedef {undefined extends Value ? Fallback : Value} Get
15+
*/
16+
1117
/**
1218
* @typedef {{
1319
* context?: any;
14-
* extensions?: { [K: string]: any };
20+
* extensions?: {};
1521
* input?: any;
1622
* object?: any;
1723
* resolvedValue?: {};
18-
* typeName?: string | unknown;
24+
* typeName?: string;
1925
* value?: any;
2026
* }} TypeOptions
2127
*/
2228

23-
/**
24-
* @typedef {{
25-
* context: unknown;
26-
* extensions: {};
27-
* input: unknown;
28-
* object: unknown;
29-
* resolvedValue: {};
30-
* typeName: unknown;
31-
* value: unknown;
32-
* }} DefaultTypeOptions
33-
*/
34-
35-
/**
36-
* @template {TypeOptions} Obj
37-
* @template {keyof TypeOptions} Key
38-
* @typedef {undefined extends Obj[Key] ? DefaultTypeOptions[Key] : Obj[Key]} GetTypeOption
39-
*/
40-
4129
/**
4230
* @template {TypeOptions} O
43-
* @typedef {Pick<O, 'context' | 'extensions' | 'typeName'>} SharedTypeOptions
31+
* @typedef {Type<Pick<O, 'context' | 'extensions' | 'typeName'>>} SubType
4432
*/
4533

4634
/**
47-
* @template {TypeOptions} [O=DefaultTypeOptions] Default is
48-
* `DefaultTypeOptions`
35+
* @template {TypeOptions} [O={}] Default is `{}`
4936
* @typedef {Recursive<
50-
* | GetTypeOption<O, 'typeName'>
37+
* | Get<O['typeName'], never>
5138
* | ((
52-
* | { optional: Type<SharedTypeOptions<O>> }
53-
* | { nullable: Type<SharedTypeOptions<O>> }
39+
* | { optional: SubType<O> }
40+
* | { nullable: SubType<O> }
41+
* | { arrayOf: SubType<O>; minLength?: number; maxLength?: number }
5442
* | {
55-
* arrayOf: Type<SharedTypeOptions<O>>;
56-
* minLength?: number;
57-
* maxLength?: number;
58-
* }
59-
* | {
60-
* oneOf: { [K: string]: Type<SharedTypeOptions<O>> };
43+
* oneOf: { [K: string]: SubType<O> };
6144
* resolveType: (value: {}) => string;
6245
* }
46+
* | { object: { [K: string]: SubType<O> }; defaultType?: SubType<O> }
6347
* | {
64-
* object: { [K: string]: Type<SharedTypeOptions<O>> };
65-
* defaultType?: Type<SharedTypeOptions<O>>;
66-
* }
67-
* | {
68-
* input?: Type<SharedTypeOptions<O>>;
69-
* type?: Type<SharedTypeOptions<O>>;
48+
* input?: SubType<O>;
49+
* type?: SubType<O>;
7050
* typeInput?: any;
7151
* resolve?:
7252
* | ((options: {
73-
* context: GetTypeOption<O, 'context'>;
74-
* input: GetTypeOption<O, 'input'>;
75-
* object: GetTypeOption<O, 'object'>;
53+
* context: Get<O['context'], any>;
54+
* input: Get<O['input'], any>;
55+
* object: Get<O['object'], any>;
7656
* path: string[];
7757
* query: Query;
78-
* schema: Schema<SharedTypeOptions<O>>;
79-
* type: Type<SharedTypeOptions<O>>;
80-
* value: GetTypeOption<O, 'typeName'>;
58+
* schema: Schema<O>;
59+
* type: SubType<O>;
60+
* value: Get<O['value'], any>;
8161
* }) => any)
8262
* | {}
8363
* | null;
@@ -86,37 +66,36 @@
8666
* cost?:
8767
* | number
8868
* | ((options: {
89-
* context: GetTypeOption<O, 'context'>;
69+
* context: Get<O['context'], any>;
9070
* cost: number;
91-
* input: GetTypeOption<O, 'input'>;
92-
* object: GetTypeOption<O, 'object'>;
71+
* input: Get<O['input'], any>;
72+
* object: Get<O['object'], any>;
9373
* path: string[];
9474
* query: Query;
95-
* schema: Schema<SharedTypeOptions<O>>;
96-
* type: Type<SharedTypeOptions<O>>;
97-
* value: GetTypeOption<O, 'typeName'>;
75+
* schema: Schema<O>;
76+
* type: SubType<O>;
77+
* value: Get<O['value'], any>;
9878
* }) => number);
9979
* defaultValue?: any;
10080
* validate?: (options: {
101-
* context: GetTypeOption<O, 'context'>;
102-
* input: GetTypeOption<O, 'input'>;
103-
* object: GetTypeOption<O, 'object'>;
81+
* context: Get<O['context'], any>;
82+
* input: Get<O['input'], any>;
83+
* object: Get<O['object'], any>;
10484
* path: string[];
10585
* query: Query;
106-
* schema: Schema<SharedTypeOptions<O>>;
107-
* type: Type<SharedTypeOptions<O>>;
108-
* value: GetTypeOption<O, 'resolvedValue'>;
86+
* schema: Schema<O>;
87+
* type: SubType<O>;
88+
* value: Get<O['resolvedValue'], any>;
10989
* }) => any;
110-
* } & GetTypeOption<O, 'extensions'>)
90+
* } & Get<O['extensions'], {}>)
11191
* >} Type
11292
*/
11393

11494
/**
115-
* @template {TypeOptions} [O=DefaultTypeOptions] Default is
116-
* `DefaultTypeOptions`
117-
* @typedef {GetTypeOption<O, 'typeName'> extends string
118-
* ? { [K in GetTypeOption<O, 'typeName'>]: Type<SharedTypeOptions<O>> }
119-
* : { [K in keyof any]: never }} Schema
95+
* @template {TypeOptions} [O={}] Default is `{}`
96+
* @typedef {O['typeName'] extends string
97+
* ? { [K in O['typeName']]: SubType<O> }
98+
* : { [K in keyof any]: never }} Schema
12099
*/
121100

122101
/**

types/index.d.ts

Lines changed: 33 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,85 +11,74 @@ export { validateSchema } from "#types/validate-schema.js";
1111
export { validateValue } from "#types/validate-value.js";
1212
export type Recursive<T> = T | RecursiveArray<T>;
1313
export type RecursiveArray<T> = Recursive<T>[];
14+
export type Get<Value, Fallback> = undefined extends Value ? Fallback : Value;
1415
export type TypeOptions = {
1516
context?: any;
16-
extensions?: {
17-
[K: string]: any;
18-
};
17+
extensions?: {};
1918
input?: any;
2019
object?: any;
2120
resolvedValue?: {};
22-
typeName?: string | unknown;
21+
typeName?: string;
2322
value?: any;
2423
};
25-
export type DefaultTypeOptions = {
26-
context: unknown;
27-
extensions: {};
28-
input: unknown;
29-
object: unknown;
30-
resolvedValue: {};
31-
typeName: unknown;
32-
value: unknown;
33-
};
34-
export type GetTypeOption<Obj extends TypeOptions, Key extends keyof TypeOptions> = undefined extends Obj[Key] ? DefaultTypeOptions[Key] : Obj[Key];
35-
export type SharedTypeOptions<O extends TypeOptions> = Pick<O, "context" | "extensions" | "typeName">;
36-
export type Type<O extends TypeOptions = DefaultTypeOptions> = Recursive<GetTypeOption<O, "typeName"> | (({
37-
optional: Type<SharedTypeOptions<O>>;
24+
export type SubType<O extends TypeOptions> = Type<Pick<O, "context" | "extensions" | "typeName">>;
25+
export type Type<O extends TypeOptions = {}> = Recursive<Get<O["typeName"], never> | (({
26+
optional: SubType<O>;
3827
} | {
39-
nullable: Type<SharedTypeOptions<O>>;
28+
nullable: SubType<O>;
4029
} | {
41-
arrayOf: Type<SharedTypeOptions<O>>;
30+
arrayOf: SubType<O>;
4231
minLength?: number;
4332
maxLength?: number;
4433
} | {
4534
oneOf: {
46-
[K: string]: Type<SharedTypeOptions<O>>;
35+
[K: string]: SubType<O>;
4736
};
4837
resolveType: (value: {}) => string;
4938
} | {
5039
object: {
51-
[K: string]: Type<SharedTypeOptions<O>>;
40+
[K: string]: SubType<O>;
5241
};
53-
defaultType?: Type<SharedTypeOptions<O>>;
42+
defaultType?: SubType<O>;
5443
} | {
55-
input?: Type<SharedTypeOptions<O>>;
56-
type?: Type<SharedTypeOptions<O>>;
44+
input?: SubType<O>;
45+
type?: SubType<O>;
5746
typeInput?: any;
5847
resolve?: ((options: {
59-
context: GetTypeOption<O, "context">;
60-
input: GetTypeOption<O, "input">;
61-
object: GetTypeOption<O, "object">;
48+
context: Get<O["context"], any>;
49+
input: Get<O["input"], any>;
50+
object: Get<O["object"], any>;
6251
path: string[];
6352
query: Query;
64-
schema: Schema<SharedTypeOptions<O>>;
65-
type: Type<SharedTypeOptions<O>>;
66-
value: GetTypeOption<O, "typeName">;
53+
schema: Schema<O>;
54+
type: SubType<O>;
55+
value: Get<O["value"], any>;
6756
}) => any) | {} | null;
6857
}) & {
6958
cost?: number | ((options: {
70-
context: GetTypeOption<O, "context">;
59+
context: Get<O["context"], any>;
7160
cost: number;
72-
input: GetTypeOption<O, "input">;
73-
object: GetTypeOption<O, "object">;
61+
input: Get<O["input"], any>;
62+
object: Get<O["object"], any>;
7463
path: string[];
7564
query: Query;
76-
schema: Schema<SharedTypeOptions<O>>;
77-
type: Type<SharedTypeOptions<O>>;
78-
value: GetTypeOption<O, "typeName">;
65+
schema: Schema<O>;
66+
type: SubType<O>;
67+
value: Get<O["value"], any>;
7968
}) => number);
8069
defaultValue?: any;
8170
validate?: (options: {
82-
context: GetTypeOption<O, "context">;
83-
input: GetTypeOption<O, "input">;
84-
object: GetTypeOption<O, "object">;
71+
context: Get<O["context"], any>;
72+
input: Get<O["input"], any>;
73+
object: Get<O["object"], any>;
8574
path: string[];
8675
query: Query;
87-
schema: Schema<SharedTypeOptions<O>>;
88-
type: Type<SharedTypeOptions<O>>;
89-
value: GetTypeOption<O, "resolvedValue">;
76+
schema: Schema<O>;
77+
type: SubType<O>;
78+
value: Get<O["resolvedValue"], any>;
9079
}) => any;
91-
} & GetTypeOption<O, "extensions">)>;
92-
export type Schema<O extends TypeOptions = DefaultTypeOptions> = GetTypeOption<O, "typeName"> extends string ? { [K in GetTypeOption<O, "typeName">]: Type<SharedTypeOptions<O>>; } : { [K in keyof any]: never; };
80+
} & Get<O["extensions"], {}>)>;
81+
export type Schema<O extends TypeOptions = {}> = O["typeName"] extends string ? { [K in O["typeName"]]: SubType<O>; } : { [K in keyof any]: never; };
9382
export type Query<T = any> = {
9483
_?: string;
9584
$?: any;

0 commit comments

Comments
 (0)