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.
Files changed (63) hide show
  1. package/dist/constants.d.ts +20 -0
  2. package/dist/constants.d.ts.map +1 -0
  3. package/dist/constants.js +22 -0
  4. package/dist/constants.js.map +1 -0
  5. package/dist/index.d.ts +10 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +9 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/parse.d.ts +5 -0
  10. package/dist/parse.d.ts.map +1 -0
  11. package/dist/parse.js +328 -0
  12. package/dist/parse.js.map +1 -0
  13. package/dist/struct.d.ts +48 -0
  14. package/dist/struct.d.ts.map +1 -0
  15. package/dist/struct.js +111 -0
  16. package/dist/struct.js.map +1 -0
  17. package/dist/types/extensions.d.ts +13 -0
  18. package/dist/types/extensions.d.ts.map +1 -0
  19. package/dist/types/extensions.js +2 -0
  20. package/dist/types/extensions.js.map +1 -0
  21. package/dist/types/infer.d.ts +35 -0
  22. package/dist/types/infer.d.ts.map +1 -0
  23. package/dist/types/infer.js +2 -0
  24. package/dist/types/infer.js.map +1 -0
  25. package/dist/types/schema.d.ts +93 -0
  26. package/dist/types/schema.d.ts.map +1 -0
  27. package/dist/types/schema.js +2 -0
  28. package/dist/types/schema.js.map +1 -0
  29. package/dist/types/standard-schema.d.ts +35 -0
  30. package/dist/types/standard-schema.d.ts.map +1 -0
  31. package/dist/types/standard-schema.js +2 -0
  32. package/dist/types/standard-schema.js.map +1 -0
  33. package/dist/types/struct.d.ts +52 -0
  34. package/dist/types/struct.d.ts.map +1 -0
  35. package/dist/types/struct.js +2 -0
  36. package/dist/types/struct.js.map +1 -0
  37. package/dist/types/utils.d.ts +41 -0
  38. package/dist/types/utils.d.ts.map +1 -0
  39. package/dist/types/utils.js +2 -0
  40. package/dist/types/utils.js.map +1 -0
  41. package/dist/utils.d.ts +9 -0
  42. package/dist/utils.d.ts.map +1 -0
  43. package/dist/utils.js +14 -0
  44. package/dist/utils.js.map +1 -0
  45. package/package.json +15 -5
  46. package/src/tests/README.md +390 -0
  47. package/src/tests/by-struct/array.test.ts +1684 -0
  48. package/src/tests/by-struct/boolean.test.ts +741 -0
  49. package/src/tests/by-struct/literal.test.ts +755 -0
  50. package/src/tests/by-struct/number.test.ts +1234 -0
  51. package/src/tests/by-struct/object.test.ts +1484 -0
  52. package/src/tests/by-struct/record.test.ts +1802 -0
  53. package/src/tests/by-struct/string.test.ts +1252 -0
  54. package/src/tests/by-struct/tuple.test.ts +1341 -0
  55. package/src/tests/by-struct/union.test.ts +1284 -0
  56. package/src/tests/fixtures.ts +53 -0
  57. package/src/tests/fold-constants.ts +247 -0
  58. package/src/tests/fold-morph.ts +49 -0
  59. package/src/tests/type.ts +1 -0
  60. package/src/tests/types/extensions.test.ts +117 -0
  61. package/src/tests/types/infer.test.ts +1413 -0
  62. package/src/tests/utils.test.ts +191 -0
  63. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=infer.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=standard-schema.js.map
@@ -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":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,KAAK,EACV,MAAM,EAEN,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EAEX,WAAW,EAEX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACb,MAAM,UAAU,CAAA;AAEjB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI,IAAI,CACzC,IAAI,CACF;IACE,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAC,CAAA;IAC9C,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAC,CAAA;IAE9C,KAAK,EAAE,CACL,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAErE,GAAG,IAAI,EAAE,CAAC,KACP,MAAM,CACT,CAAC,GAAG;QACF,KAAK,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAC/B,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GACjB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GACtC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GACjB,KAAK,CAAA;KACZ,CACF,CAAA;IAED,SAAS,EAAE,CAAC,CAAC,SAAS,MAAM,EAC1B,SAAS,EAAE,CAAC,KACT,MAAM,CAAC,CAAC,GAAG;QAAE,SAAS,EAAE,CAAC,CAAA;KAAE,CAAC,CAAA;IACjC,SAAS,EAAE,CAAC,CAAC,SAAS,MAAM,EAC1B,SAAS,EAAE,CAAC,KACT,MAAM,CAAC,CAAC,GAAG;QAAE,SAAS,EAAE,CAAC,CAAA;KAAE,CAAC,CAAA;IAEjC,GAAG,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG;QAAE,GAAG,EAAE,CAAC,CAAA;KAAE,CAAC,CAAA;IACzD,GAAG,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG;QAAE,GAAG,EAAE,CAAC,CAAA;KAAE,CAAC,CAAA;IAEzD,WAAW,EAAE,CAAC,CAAC,SAAS,MAAM,EAC5B,WAAW,EAAE,CAAC,KACX,MAAM,CAAC,CAAC,GAAG;QAAE,WAAW,EAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CACpC,EACD,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAC9B,EACD,MAAM,CAAC,CACR,GAAG;IACF,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IACrB,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;CACnD,GAAG,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAE7C,KAAK,YAAY,GACb,OAAO,GACP,MAAM,GACN,MAAM,GACN,aAAa,CAAC,OAAO,CAAC,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3B,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAAE,QAAQ,EAAE,CAAC,CAAA;CAAE,CAAA;AAE5C,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACrC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACrC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IACnC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAEnC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IACjC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IACnC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAA;IACnD,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IACjC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;CAClC,CAAA;AAED,KAAK,aAAa,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;AAEvD,MAAM,MAAM,YAAY,GACtB,kBAAkB,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=struct.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/types/utils.ts"],"names":[],"mappings":""}
@@ -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.1",
3
+ "version": "1.2.2",
4
4
  "scripts": {
5
- "prepublishOnly": "bash release-check.sh",
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": "src/index.ts",
48
+ "main": "./dist/index.js",
49
+ "types": "./dist/index.d.ts",
49
50
  "type": "module",
50
- "types": "src/index.ts"
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
  }