schematox 1.2.1 → 1.2.2
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/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/parse.d.ts +5 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +328 -0
- package/dist/parse.js.map +1 -0
- package/dist/struct.d.ts +48 -0
- package/dist/struct.d.ts.map +1 -0
- package/dist/struct.js +111 -0
- package/dist/struct.js.map +1 -0
- package/dist/types/extensions.d.ts +13 -0
- package/dist/types/extensions.d.ts.map +1 -0
- package/dist/types/extensions.js +2 -0
- package/dist/types/extensions.js.map +1 -0
- package/dist/types/infer.d.ts +35 -0
- package/dist/types/infer.d.ts.map +1 -0
- package/dist/types/infer.js +2 -0
- package/dist/types/infer.js.map +1 -0
- package/dist/types/schema.d.ts +93 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +2 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/types/standard-schema.d.ts +35 -0
- package/dist/types/standard-schema.d.ts.map +1 -0
- package/dist/types/standard-schema.js +2 -0
- package/dist/types/standard-schema.js.map +1 -0
- package/dist/types/struct.d.ts +52 -0
- package/dist/types/struct.d.ts.map +1 -0
- package/dist/types/struct.js +2 -0
- package/dist/types/struct.js.map +1 -0
- package/dist/types/utils.d.ts +41 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utils.js +2 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +14 -0
- package/dist/utils.js.map +1 -0
- package/package.json +15 -5
- package/src/tests/README.md +390 -0
- package/src/tests/by-struct/array.test.ts +1684 -0
- package/src/tests/by-struct/boolean.test.ts +741 -0
- package/src/tests/by-struct/literal.test.ts +755 -0
- package/src/tests/by-struct/number.test.ts +1234 -0
- package/src/tests/by-struct/object.test.ts +1484 -0
- package/src/tests/by-struct/record.test.ts +1802 -0
- package/src/tests/by-struct/string.test.ts +1252 -0
- package/src/tests/by-struct/tuple.test.ts +1341 -0
- package/src/tests/by-struct/union.test.ts +1284 -0
- package/src/tests/fixtures.ts +53 -0
- package/src/tests/fold-constants.ts +247 -0
- package/src/tests/fold-morph.ts +49 -0
- package/src/tests/type.ts +1 -0
- package/src/tests/types/extensions.test.ts +117 -0
- package/src/tests/types/infer.test.ts +1413 -0
- package/src/tests/utils.test.ts +191 -0
- package/CHANGELOG.md +0 -52
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Schema, ArraySchema, ObjectSchema, RecordSchema, TupleSchema, UnionSchema, PrimitiveSchema, BooleanSchema, LiteralSchema, NumberSchema, StringSchema, BrandSchema } from './schema';
|
|
2
|
+
import type { StructShape } from './struct';
|
|
3
|
+
import type { PrettifyObject } from './utils';
|
|
4
|
+
import type { ExtendParams, ExtendBrand } from './extensions';
|
|
5
|
+
/**
|
|
6
|
+
* @example Infer<typeof struct> | Infer<typeof schema>
|
|
7
|
+
**/
|
|
8
|
+
export type Infer<T> = T extends StructShape<infer U> ? InferSchema<U> : InferSchema<T>;
|
|
9
|
+
export type InferSchema<T> = ExtendParams<T, T extends PrimitiveSchema ? InferPrimitive<T> : T extends ArraySchema ? InferArray<T> : T extends ObjectSchema ? InferObject<T> : T extends RecordSchema ? InferRecord<T> : T extends TupleSchema ? InferTuple<T> : T extends UnionSchema ? InferUnion<T> : never>;
|
|
10
|
+
export type InferBrand<T extends BrandSchema> = T extends BrandSchema<infer Category, infer SubCategory> ? Category extends string ? {
|
|
11
|
+
[K in `__${Category}`]: SubCategory;
|
|
12
|
+
} : never : never;
|
|
13
|
+
export type InferPrimitive<T> = T extends StringSchema ? string : T extends NumberSchema ? number : T extends BooleanSchema ? boolean : T extends LiteralSchema<infer U> ? U : never;
|
|
14
|
+
export type InferArray<T> = T extends ArraySchema<infer U> ? Array<InferSchema<U>> : never;
|
|
15
|
+
export type InferObject<T> = T extends ObjectSchema<infer U> ? PrettifyObject<{
|
|
16
|
+
[K in keyof U as U[K] extends {
|
|
17
|
+
optional: true;
|
|
18
|
+
} ? K : never]?: InferSchema<U[K]>;
|
|
19
|
+
} & {
|
|
20
|
+
[K in keyof U as U[K] extends {
|
|
21
|
+
optional: true;
|
|
22
|
+
} ? never : K]: InferSchema<U[K]>;
|
|
23
|
+
}> : never;
|
|
24
|
+
export type InferRecord<T> = T extends {
|
|
25
|
+
key?: infer U;
|
|
26
|
+
of: infer V;
|
|
27
|
+
} ? Record<U extends StringSchema ? ExtendBrand<U, InferPrimitive<U>> : string, V extends Schema ? InferSchema<V> : never> : never;
|
|
28
|
+
export type InferTuple<T> = T extends TupleSchema<infer U> ? U extends [...infer V] ? {
|
|
29
|
+
[K in keyof V]: InferSchema<V[K]>;
|
|
30
|
+
} : never : never;
|
|
31
|
+
export type InferUnion<T> = T extends {
|
|
32
|
+
type: 'union';
|
|
33
|
+
of: Readonly<Array<infer U>>;
|
|
34
|
+
} ? U extends Schema ? InferSchema<U> : never : never;
|
|
35
|
+
//# sourceMappingURL=infer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../src/types/infer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infer.js","sourceRoot":"","sources":["../../src/types/infer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export type Schema = PrimitiveSchema | {
|
|
2
|
+
type: 'array';
|
|
3
|
+
of: Schema;
|
|
4
|
+
minLength?: number;
|
|
5
|
+
maxLength?: number;
|
|
6
|
+
} & SchemaShared | {
|
|
7
|
+
type: 'object';
|
|
8
|
+
of: Record<string, Schema>;
|
|
9
|
+
} & SchemaShared | {
|
|
10
|
+
type: 'record';
|
|
11
|
+
of: Schema;
|
|
12
|
+
key?: StringSchema;
|
|
13
|
+
minLength?: number;
|
|
14
|
+
maxLength?: number;
|
|
15
|
+
} & SchemaShared | {
|
|
16
|
+
type: 'tuple';
|
|
17
|
+
of: Array<Schema>;
|
|
18
|
+
} & SchemaShared | {
|
|
19
|
+
type: 'union';
|
|
20
|
+
of: Array<Schema>;
|
|
21
|
+
} & SchemaShared;
|
|
22
|
+
export type BrandSchema<T = string, U = unknown> = Readonly<[T, U]>;
|
|
23
|
+
export type SchemaShared = {
|
|
24
|
+
/**
|
|
25
|
+
* T -> T | undefined
|
|
26
|
+
**/
|
|
27
|
+
optional?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* T -> T | null
|
|
30
|
+
**/
|
|
31
|
+
nullable?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Optional description for documentation purposes.
|
|
34
|
+
* This field has no impact on validation or type inference.
|
|
35
|
+
**/
|
|
36
|
+
description?: string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Compound schema
|
|
40
|
+
**/
|
|
41
|
+
export type ArraySchema<T = unknown> = SchemaShared & {
|
|
42
|
+
type: 'array';
|
|
43
|
+
of: T;
|
|
44
|
+
minLength?: number;
|
|
45
|
+
maxLength?: number;
|
|
46
|
+
};
|
|
47
|
+
export type ObjectSchema<T = unknown> = SchemaShared & {
|
|
48
|
+
type: 'object';
|
|
49
|
+
of: T;
|
|
50
|
+
};
|
|
51
|
+
export type RecordSchema<T = unknown> = SchemaShared & {
|
|
52
|
+
type: 'record';
|
|
53
|
+
of: T;
|
|
54
|
+
key?: StringSchema;
|
|
55
|
+
minLength?: number;
|
|
56
|
+
maxLength?: number;
|
|
57
|
+
};
|
|
58
|
+
export type TupleSchema<T = unknown> = SchemaShared & {
|
|
59
|
+
type: 'tuple';
|
|
60
|
+
of: T;
|
|
61
|
+
};
|
|
62
|
+
export type UnionSchema<T = unknown> = SchemaShared & {
|
|
63
|
+
type: 'union';
|
|
64
|
+
of: T;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Primitive schema
|
|
68
|
+
**/
|
|
69
|
+
export type PrimitiveSchemaShared = SchemaShared & {
|
|
70
|
+
/**
|
|
71
|
+
* @example ['idFor', 'User'] -> T & { __idFor: 'User' }
|
|
72
|
+
**/
|
|
73
|
+
brand?: BrandSchema;
|
|
74
|
+
};
|
|
75
|
+
export type PrimitiveSchema = StringSchema | NumberSchema | BooleanSchema | LiteralSchema;
|
|
76
|
+
export type BooleanSchema = PrimitiveSchemaShared & {
|
|
77
|
+
type: 'boolean';
|
|
78
|
+
};
|
|
79
|
+
export type StringSchema = PrimitiveSchemaShared & {
|
|
80
|
+
type: 'string';
|
|
81
|
+
minLength?: number;
|
|
82
|
+
maxLength?: number;
|
|
83
|
+
};
|
|
84
|
+
export type NumberSchema = PrimitiveSchemaShared & {
|
|
85
|
+
type: 'number';
|
|
86
|
+
min?: number;
|
|
87
|
+
max?: number;
|
|
88
|
+
};
|
|
89
|
+
export type LiteralSchema<T extends string | number | boolean = string | number | boolean> = PrimitiveSchemaShared & {
|
|
90
|
+
type: 'literal';
|
|
91
|
+
of: T;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/types/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/types/schema.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface StandardSchemaV1<Input = unknown, Output = Input> {
|
|
2
|
+
/** Source: https://github.com/standard-schema/standard-schema/blob/main/packages/spec/src/index.ts */
|
|
3
|
+
readonly '~standard': StandardSchemaV1.Props<Input, Output>;
|
|
4
|
+
}
|
|
5
|
+
export declare namespace StandardSchemaV1 {
|
|
6
|
+
export interface Props<Input = unknown, Output = Input> {
|
|
7
|
+
readonly version: 1;
|
|
8
|
+
readonly vendor: string;
|
|
9
|
+
readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;
|
|
10
|
+
readonly types?: Types<Input, Output> | undefined;
|
|
11
|
+
}
|
|
12
|
+
export type Result<Output> = SuccessResult<Output> | FailureResult;
|
|
13
|
+
export interface SuccessResult<Output> {
|
|
14
|
+
readonly value: Output;
|
|
15
|
+
readonly issues?: undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface FailureResult {
|
|
18
|
+
readonly issues: ReadonlyArray<Issue>;
|
|
19
|
+
}
|
|
20
|
+
export interface Issue {
|
|
21
|
+
readonly message: string;
|
|
22
|
+
readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
|
|
23
|
+
}
|
|
24
|
+
export interface PathSegment {
|
|
25
|
+
readonly key: PropertyKey;
|
|
26
|
+
}
|
|
27
|
+
export interface Types<Input = unknown, Output = Input> {
|
|
28
|
+
readonly input: Input;
|
|
29
|
+
readonly output: Output;
|
|
30
|
+
}
|
|
31
|
+
export type InferInput<Schema extends StandardSchemaV1> = NonNullable<Schema['~standard']['types']>['input'];
|
|
32
|
+
export type InferOutput<Schema extends StandardSchemaV1> = NonNullable<Schema['~standard']['types']>['output'];
|
|
33
|
+
export {};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=standard-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-schema.d.ts","sourceRoot":"","sources":["../../src/types/standard-schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAC/D,sGAAsG;IACtG,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;CAC5D;AAED,MAAM,CAAC,OAAO,WAAW,gBAAgB,CAAC;IACxC,MAAM,WAAW,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QACpD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;QACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,OAAO,KACX,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAClD;IAED,MAAM,MAAM,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAA;IAElE,MAAM,WAAW,aAAa,CAAC,MAAM;QACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAC5B;IAED,MAAM,WAAW,aAAa;QAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;KACtC;IAED,MAAM,WAAW,KAAK;QACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,SAAS,CAAA;KACrE;IAED,MAAM,WAAW,WAAW;QAC1B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;KAC1B;IAED,MAAM,WAAW,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QACpD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KACxB;IAED,MAAM,MAAM,UAAU,CAAC,MAAM,SAAS,gBAAgB,IAAI,WAAW,CACnE,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAC7B,CAAC,OAAO,CAAC,CAAA;IAEV,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,gBAAgB,IAAI,WAAW,CACpE,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAC7B,CAAC,QAAQ,CAAC,CAAA;IAEX,OAAO,EAAE,CAAA;CACV"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../../src/types/standard-schema.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ParseResult } from './utils';
|
|
2
|
+
import type { StandardSchemaV1 } from './standard-schema';
|
|
3
|
+
import type { Schema, ArraySchema, ObjectSchema, RecordSchema, TupleSchema, UnionSchema, BrandSchema, BooleanSchema, LiteralSchema, NumberSchema, StringSchema } from './schema';
|
|
4
|
+
import type { InferSchema } from './infer';
|
|
5
|
+
export type Struct<T extends Schema> = Omit<Pick<{
|
|
6
|
+
optional: () => Struct<T & {
|
|
7
|
+
optional: true;
|
|
8
|
+
}>;
|
|
9
|
+
nullable: () => Struct<T & {
|
|
10
|
+
nullable: true;
|
|
11
|
+
}>;
|
|
12
|
+
brand: <U extends [string, BrandSubType] | [Readonly<[string, BrandSubType]>]>(...args: U) => Struct<T & {
|
|
13
|
+
brand: U extends [infer V, infer W] ? BrandSchema<V, W> : U extends [Readonly<[infer V, infer W]>] ? BrandSchema<V, W> : never;
|
|
14
|
+
}>;
|
|
15
|
+
minLength: <U extends number>(minLength: U) => Struct<T & {
|
|
16
|
+
minLength: U;
|
|
17
|
+
}>;
|
|
18
|
+
maxLength: <U extends number>(maxLength: U) => Struct<T & {
|
|
19
|
+
maxLength: U;
|
|
20
|
+
}>;
|
|
21
|
+
min: <U extends number>(min: U) => Struct<T & {
|
|
22
|
+
min: U;
|
|
23
|
+
}>;
|
|
24
|
+
max: <U extends number>(max: U) => Struct<T & {
|
|
25
|
+
max: U;
|
|
26
|
+
}>;
|
|
27
|
+
description: <U extends string>(description: U) => Struct<T & {
|
|
28
|
+
description: U;
|
|
29
|
+
}>;
|
|
30
|
+
}, ParamsBySchemaType[T['type']]>, keyof T> & {
|
|
31
|
+
__schema: Readonly<T>;
|
|
32
|
+
parse: (s: unknown) => ParseResult<InferSchema<T>>;
|
|
33
|
+
} & StandardSchemaV1<unknown, InferSchema<T>>;
|
|
34
|
+
type BrandSubType = boolean | number | string | ReadonlyArray<unknown> | Record<string, unknown>;
|
|
35
|
+
export type StructShape<T> = {
|
|
36
|
+
__schema: T;
|
|
37
|
+
};
|
|
38
|
+
type ParamsBySchemaType = {
|
|
39
|
+
boolean: ExtractParams<BooleanSchema>;
|
|
40
|
+
literal: ExtractParams<LiteralSchema>;
|
|
41
|
+
number: ExtractParams<NumberSchema>;
|
|
42
|
+
string: ExtractParams<StringSchema>;
|
|
43
|
+
array: ExtractParams<ArraySchema>;
|
|
44
|
+
object: ExtractParams<ObjectSchema>;
|
|
45
|
+
record: Exclude<ExtractParams<RecordSchema>, 'key'>;
|
|
46
|
+
tuple: ExtractParams<TupleSchema>;
|
|
47
|
+
union: ExtractParams<UnionSchema>;
|
|
48
|
+
};
|
|
49
|
+
type ExtractParams<T> = Exclude<keyof T, 'type' | 'of'>;
|
|
50
|
+
export type StructParams = ParamsBySchemaType extends Record<string, infer U> ? U : never;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=struct.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"struct.d.ts","sourceRoot":"","sources":["../../src/types/struct.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"struct.js","sourceRoot":"","sources":["../../src/types/struct.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Schema } from './schema';
|
|
2
|
+
export type ParseResult<T> = ParseError | ParseSuccess<T>;
|
|
3
|
+
export type ParseError = {
|
|
4
|
+
success: false;
|
|
5
|
+
error: InvalidSubject[];
|
|
6
|
+
data?: never;
|
|
7
|
+
};
|
|
8
|
+
export type ParseSuccess<T> = {
|
|
9
|
+
success: true;
|
|
10
|
+
error?: never;
|
|
11
|
+
data: T;
|
|
12
|
+
};
|
|
13
|
+
export type InvalidSubject = {
|
|
14
|
+
code: ErrorCode;
|
|
15
|
+
/**
|
|
16
|
+
* Path to the invalid data, represented as an array of object keys (strings)
|
|
17
|
+
* and array indices (numbers) that can be used to navigate to the specific
|
|
18
|
+
* location where validation failed
|
|
19
|
+
**/
|
|
20
|
+
path: ErrorPath;
|
|
21
|
+
/**
|
|
22
|
+
* The specific part of the schema definition that was used to validate
|
|
23
|
+
* the subject data (not necessarily the overall schema, but the schema
|
|
24
|
+
* fragment that caused the validation failure)
|
|
25
|
+
**/
|
|
26
|
+
schema: Schema;
|
|
27
|
+
/**
|
|
28
|
+
* The specific data value that failed validation (not necessarily the
|
|
29
|
+
* entire input, but the particular piece of data that caused the issue)
|
|
30
|
+
**/
|
|
31
|
+
subject: unknown;
|
|
32
|
+
};
|
|
33
|
+
export type ErrorCode = 'INVALID_TYPE' | 'INVALID_RANGE';
|
|
34
|
+
export type ErrorPath = Array<string | number>;
|
|
35
|
+
/**
|
|
36
|
+
* Flattens complex types into their resolved object form
|
|
37
|
+
*/
|
|
38
|
+
export type PrettifyObject<T extends Record<string, unknown>> = {
|
|
39
|
+
[K in keyof T]: T[K];
|
|
40
|
+
} & {};
|
|
41
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/types/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEtC,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;AAEzD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,KAAK,CAAA;IACd,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,IAAI,CAAC,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,OAAO,EAAE,IAAI,CAAA;IACb,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,IAAI,EAAE,CAAC,CAAA;CACR,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,SAAS,CAAA;IAEf;;;;QAII;IACJ,IAAI,EAAE,SAAS,CAAA;IAEf;;;;QAII;IACJ,MAAM,EAAE,MAAM,CAAA;IAEd;;;QAGI;IACJ,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe,CAAA;AAExD,MAAM,MAAM,SAAS,GAAG,KAAK,CAC3B,MAAM,GAAoB,MAAM,CACjC,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;KAC7D,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,GAAG,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/types/utils.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ParseError, ParseSuccess, InvalidSubject } from './types/utils';
|
|
2
|
+
/**
|
|
3
|
+
* Type equivalence check utility
|
|
4
|
+
* @example tCh<TypeA, TypeB>(); tCh<TypeB, TypeA>()
|
|
5
|
+
**/
|
|
6
|
+
export declare const tCh: <T, U extends T = T>(...x: T[]) => U[];
|
|
7
|
+
export declare const error: (error: InvalidSubject[]) => ParseError;
|
|
8
|
+
export declare const success: <T>(data: T) => ParseSuccess<T>;
|
|
9
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE7E;;;IAGI;AACJ,eAAO,MAAM,GAAG,wCAAmD,CAAA;AAEnE,eAAO,MAAM,KAAK,UAAW,cAAc,EAAE,KAAG,UAG9C,CAAA;AAEF,eAAO,MAAM,OAAO,iCAGlB,CAAA"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type equivalence check utility
|
|
3
|
+
* @example tCh<TypeA, TypeB>(); tCh<TypeB, TypeA>()
|
|
4
|
+
**/
|
|
5
|
+
export const tCh = (...x) => x;
|
|
6
|
+
export const error = (error) => ({
|
|
7
|
+
success: false,
|
|
8
|
+
error,
|
|
9
|
+
});
|
|
10
|
+
export const success = (data) => ({
|
|
11
|
+
success: true,
|
|
12
|
+
data,
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA;;;IAGI;AACJ,MAAM,CAAC,MAAM,GAAG,GAAG,CAAqB,GAAG,CAAM,EAAO,EAAE,CAAC,CAAQ,CAAA;AAEnE,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAuB,EAAc,EAAE,CAAC,CAAC;IAC7D,OAAO,EAAE,KAAK;IACd,KAAK;CACN,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAI,IAAO,EAAmB,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,IAAI;IACb,IAAI;CACL,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "schematox",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"scripts": {
|
|
5
|
-
"
|
|
5
|
+
"build": "tsc",
|
|
6
|
+
"prepublishOnly": "npm run build && bash release-check.sh",
|
|
6
7
|
"test": "jest",
|
|
7
8
|
"test:watch": "jest --watch",
|
|
8
9
|
"test:coverage": "jest --coverage",
|
|
@@ -33,7 +34,6 @@
|
|
|
33
34
|
"typescript",
|
|
34
35
|
"schema",
|
|
35
36
|
"parser",
|
|
36
|
-
"typeguard",
|
|
37
37
|
"static schema definition",
|
|
38
38
|
"programmatic schema definition",
|
|
39
39
|
"branded primitives",
|
|
@@ -45,7 +45,17 @@
|
|
|
45
45
|
"type": "git",
|
|
46
46
|
"url": "git://github.com/incerta/schematox.git"
|
|
47
47
|
},
|
|
48
|
-
"main": "
|
|
48
|
+
"main": "./dist/index.js",
|
|
49
|
+
"types": "./dist/index.d.ts",
|
|
49
50
|
"type": "module",
|
|
50
|
-
"
|
|
51
|
+
"exports": {
|
|
52
|
+
".": {
|
|
53
|
+
"types": "./dist/index.d.ts",
|
|
54
|
+
"import": "./dist/index.js"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"files": [
|
|
58
|
+
"dist",
|
|
59
|
+
"src"
|
|
60
|
+
]
|
|
51
61
|
}
|