@cleverbrush/schema 0.0.17 → 1.0.0-beta.1

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 (47) hide show
  1. package/README.md +213 -163
  2. package/package.json +3 -3
  3. package/src/builders/ArraySchemaBuilder.test.ts +270 -0
  4. package/src/builders/ArraySchemaBuilder.ts +381 -0
  5. package/src/builders/BooleanSchemaBuilder.test.ts +196 -0
  6. package/src/builders/BooleanSchemaBuilder.ts +155 -0
  7. package/src/builders/FunctionSchemaBuilder.test.ts +134 -0
  8. package/src/builders/FunctionSchemaBuilder.ts +109 -0
  9. package/src/builders/NumberSchemaBuilder.test.ts +493 -0
  10. package/src/builders/NumberSchemaBuilder.ts +789 -0
  11. package/src/builders/ObjectSchemaBuilder.test.ts +657 -0
  12. package/src/builders/ObjectSchemaBuilder.ts +794 -0
  13. package/src/builders/SchemaBuilder.test.ts +73 -0
  14. package/src/builders/SchemaBuilder.ts +135 -0
  15. package/src/builders/StringSchemaBuilder.test.ts +318 -0
  16. package/src/builders/StringSchemaBuilder.ts +392 -0
  17. package/src/builders/UnionSchemaBuilder.test.ts +162 -0
  18. package/src/builders/UnionSchemaBuilder.ts +154 -0
  19. package/src/defaultSchemas.ts +44 -0
  20. package/src/index.ts +58 -190
  21. package/src/schema.ts +827 -0
  22. package/src/schemaRegistry.builders.test.ts +1393 -0
  23. package/src/schemaRegistry.test.ts +118 -0
  24. package/src/schemaRegistry.ts +461 -0
  25. package/src/validators/validateArray.ts +4 -7
  26. package/src/validators/validateBoolean.ts +2 -11
  27. package/src/validators/validateFunction.ts +25 -0
  28. package/src/validators/validateNumber.ts +2 -7
  29. package/src/validators/validateObject.ts +32 -21
  30. package/src/validators/validateString.ts +2 -7
  31. package/src/validators/validateUnion.ts +36 -0
  32. package/dist/index.d.ts +0 -94
  33. package/dist/index.js +0 -9
  34. package/dist/schemaValidator.d.ts +0 -16
  35. package/dist/schemaValidator.js +0 -234
  36. package/dist/validators/validateArray.d.ts +0 -2
  37. package/dist/validators/validateArray.js +0 -60
  38. package/dist/validators/validateBoolean.d.ts +0 -2
  39. package/dist/validators/validateBoolean.js +0 -33
  40. package/dist/validators/validateNumber.d.ts +0 -2
  41. package/dist/validators/validateNumber.js +0 -69
  42. package/dist/validators/validateObject.d.ts +0 -2
  43. package/dist/validators/validateObject.js +0 -73
  44. package/dist/validators/validateString.d.ts +0 -2
  45. package/dist/validators/validateString.js +0 -50
  46. package/src/schemaValidator.test.ts +0 -1656
  47. package/src/schemaValidator.ts +0 -367
@@ -0,0 +1,44 @@
1
+ import { DefaultSchemaType, Schema } from './schema.js';
2
+
3
+ export const defaultSchemas: { [key in DefaultSchemaType]?: Schema } = {
4
+ alias: {
5
+ type: 'alias',
6
+ // TODO: remove
7
+ schemaName: '',
8
+ isRequired: true,
9
+ isNullable: false
10
+ },
11
+ number: {
12
+ type: 'number',
13
+ isRequired: true,
14
+ isNullable: false,
15
+ ensureNotNaN: true,
16
+ ensureIsFinite: true
17
+ },
18
+ boolean: {
19
+ type: 'boolean',
20
+ isRequired: true,
21
+ isNullable: false
22
+ },
23
+ string: {
24
+ type: 'string',
25
+ isRequired: true,
26
+ isNullable: false
27
+ },
28
+ array: {
29
+ type: 'array',
30
+ isRequired: true,
31
+ isNullable: false
32
+ },
33
+ object: {
34
+ type: 'object',
35
+ noUnknownProperties: true,
36
+ isNullable: false,
37
+ isRequired: true
38
+ },
39
+ function: {
40
+ type: 'function',
41
+ isRequired: true,
42
+ isNullable: false
43
+ }
44
+ };
package/src/index.ts CHANGED
@@ -1,198 +1,66 @@
1
- import { Merge } from '@cleverbrush/deep';
2
- import SchemaValidator from './schemaValidator';
3
-
4
- export type DefaultSchemaType =
5
- | 'object'
6
- | 'boolean'
7
- | 'function'
8
- | 'number'
9
- | 'string'
10
- | 'array'
11
- | 'alias';
12
-
13
- export type PropType<TObj, TProp extends keyof TObj> = TObj[TProp];
14
-
15
- export type DefaultPropertyDefinition = {
16
- isRequired: boolean;
17
- isNullable: boolean;
18
- };
19
-
20
- export type ValidationResultRaw = {
21
- valid: boolean;
22
- errors?: Array<string>;
1
+ import {
2
+ InferType,
3
+ ExpandSchemaBuilder,
4
+ ValidationResultWithObject
5
+ } from './schema.js';
6
+ import SchemaRegistry from './schemaRegistry.js';
7
+
8
+ import { array } from './builders/ArraySchemaBuilder.js';
9
+ import { boolean } from './builders/BooleanSchemaBuilder.js';
10
+ import { number } from './builders/NumberSchemaBuilder.js';
11
+ import { object } from './builders/ObjectSchemaBuilder.js';
12
+ import { string } from './builders/StringSchemaBuilder.js';
13
+ import { union } from './builders/UnionSchemaBuilder.js';
14
+ import { func } from './builders/FunctionSchemaBuilder.js';
15
+
16
+ export type GetNodes<
17
+ T extends Record<string, any>,
18
+ TPrefix extends string = ''
19
+ > = {
20
+ [k in keyof T]: k extends `${TPrefix}${infer F}.${infer S}` ? F : never;
21
+ }[keyof T];
22
+
23
+ export type GetLeafs<
24
+ T extends Record<string, any>,
25
+ TPrefix extends string = ''
26
+ > = {
27
+ [k in keyof T]: k extends `${TPrefix}${infer F}`
28
+ ? F extends `${infer S}.${infer G}`
29
+ ? never
30
+ : F
31
+ : never;
32
+ }[keyof T];
33
+
34
+ export type Unfold<
35
+ TBag extends Record<string, any>,
36
+ TPrefix extends string = ''
37
+ > = {
38
+ [k in GetLeafs<TBag, TPrefix>]: ISchemaActions<TBag[`${TPrefix}${k}`]>;
39
+ } & {
40
+ [k in GetNodes<TBag, TPrefix>]: Unfold<TBag, `${TPrefix}${k}.`>;
23
41
  };
24
42
 
25
- export type ValidationResult =
26
- | ValidationResultRaw
27
- | Promise<ValidationResultRaw>;
28
-
29
- export type Validator<TObj> = (value: TObj) => ValidationResult;
30
-
31
- export type SchemaDefintion<TObj> = {
32
- type: DefaultSchemaType;
33
- isRequired?: boolean;
34
- isNullable?: boolean;
35
- validators?: Array<Validator<TObj>>;
36
- };
37
-
38
- export type ObjectSchemaDefinition<T> = Omit<SchemaDefintion<T>, 'type'> & {
39
- type: 'object';
40
- extends?: string;
41
- properties?: Partial<{
42
- [S in keyof T]: Schema<PropType<T, S>>;
43
- }>;
44
- preprocessors?: Partial<{
45
- [S in keyof T | '*']: S extends keyof T
46
- ?
47
- | ((
48
- value: unknown
49
- ) => undefined | PropType<T, S> | Promise<PropType<T, S>>)
50
- | string
51
- : (value: T) => void | Promise<void>;
52
- }>;
53
- };
54
-
55
- export type AliasSchemaDefinition<T> = Omit<SchemaDefintion<T>, 'type'> & {
56
- type: 'alias';
57
- schemaName: string;
58
- };
59
-
60
- export type ObjectSchemaDefinitionParam<T> = Omit<
61
- ObjectSchemaDefinition<T>,
62
- 'type'
63
- >;
64
-
65
- export type ParamsValidators<TFunc extends (...args: any) => any> = {
66
- [S in keyof Parameters<TFunc>]: SingleSchema<Parameters<TFunc>[S]>;
67
- };
68
-
69
- export type FunctionSchemaDefinition<T extends (...args: any) => any> = Omit<
70
- SchemaDefintion<T>,
71
- 'type'
72
- > & {
73
- type: 'function';
74
- params?: ParamsValidators<T>;
75
- };
76
-
77
- export type BooleanSchemaDefinition<TObj> = Omit<
78
- SchemaDefintion<TObj>,
79
- 'type'
80
- > & {
81
- type: 'boolean';
82
- equals?: boolean;
83
- };
84
-
85
- export type NumberSchemaDefinition<TObj> = Omit<
86
- SchemaDefintion<TObj>,
87
- 'type'
88
- > & {
89
- type: 'number';
90
- min?: number;
91
- max?: number;
92
- equals?: number;
93
- isInteger?: boolean;
94
- ensureNotNaN?: boolean;
95
- ensureIsFinite?: boolean;
96
- };
97
-
98
- export type StringSchemaDefinition<TObj> = Omit<
99
- SchemaDefintion<TObj>,
100
- 'type'
101
- > & {
102
- type: 'string';
103
- equals?: string;
104
- minLength?: number;
105
- maxLength?: number;
106
- };
107
-
108
- export type ArraySchemaDefinition<TObj> = Omit<
109
- SchemaDefintion<TObj>,
110
- 'type'
111
- > & {
112
- type: 'array';
113
- preprocessor?: ((value: unknown) => unknown | Promise<unknown>) | string;
114
- ofType?: Schema<any>;
115
- minLength?: number;
116
- maxLength?: number;
117
- };
118
-
119
- export type CompositeSchema<TObj> = TObj extends (...args: any) => any
120
- ? FunctionSchemaDefinition<TObj>
121
- : TObj extends number
122
- ? NumberSchemaDefinition<TObj>
123
- : TObj extends string
124
- ? StringSchemaDefinition<TObj> | 'string'
125
- :
126
- | BooleanSchemaDefinition<TObj>
127
- | NumberSchemaDefinition<TObj>
128
- | StringSchemaDefinition<TObj>
129
- | ArraySchemaDefinition<TObj>
130
- | ObjectSchemaDefinition<TObj>
131
- | AliasSchemaDefinition<TObj>;
132
-
133
- export type SingleSchema<TObj = Record<string, never>> =
134
- | number
135
- | string
136
- | DefaultSchemaType
137
- | CompositeSchema<TObj>;
138
-
139
- export type Schema<TObj> = SingleSchema<TObj> | Array<SingleSchema<TObj>>;
140
-
141
- export type Cons<H, T extends unknown[] = []> = T['length'] extends 0
142
- ? [H]
143
- : ((h: H, ...t: T) => void) extends (...r: infer R) => void
144
- ? R
145
- : never;
146
-
147
43
  export interface ISchemaActions<S> {
148
- validate(value: any): Promise<ValidationResult>;
149
- schema: S;
44
+ validate(
45
+ value: any
46
+ ): Promise<ValidationResultWithObject<InferType<ExpandSchemaBuilder<S>>>>;
47
+ schema: ExpandSchemaBuilder<S>;
150
48
  }
151
49
 
152
- export interface ISchemasProvider<T extends unknown[]> {
153
- schemas: Merge<T>;
50
+ export interface ISchemaRegistry<T extends Record<string, any>> {
51
+ schemas: Unfold<T>;
154
52
  }
155
53
 
156
- export interface ISchemaValidator<
157
- T extends Record<string, never> = Record<string, never>,
158
- SchemaTypesStructures extends unknown[] = []
159
- > {
160
- get preprocessors(): Map<
161
- string,
162
- (value: unknown) => unknown | Promise<unknown>
163
- >;
164
- addPreprocessor(
165
- name: string,
166
- preprocessor: (value: unknown) => unknown | Promise<unknown>
167
- ): SchemaValidator<T, SchemaTypesStructures>;
168
-
169
- addSchemaType<
170
- K,
171
- L extends ObjectSchemaDefinitionParam<M> | Array<Schema<any>>,
172
- M = any
173
- >(
174
- name: keyof K,
175
- schema: L
176
- ): SchemaValidator<
177
- T & { [key in keyof K]: typeof schema },
178
- Cons<Unfold<keyof K, ISchemaActions<L>>, SchemaTypesStructures>
179
- >;
180
-
181
- validate(
182
- schema: keyof T | DefaultSchemaType | Schema<any>,
183
- obj: any
184
- ): Promise<ValidationResult>;
185
- }
186
-
187
- export type Unfold<T, K> = T extends string
188
- ? T extends `${infer F}.${infer L}`
189
- ? {
190
- [k in F]: Unfold<L, K>;
191
- }
192
- : {
193
- [k in T]: K;
194
- }
195
- : never;
54
+ export { SchemaRegistry };
55
+ export default {
56
+ SchemaRegistry,
57
+ array,
58
+ boolean,
59
+ number,
60
+ object,
61
+ string,
62
+ union,
63
+ func
64
+ };
196
65
 
197
- export { SchemaValidator };
198
- export default SchemaValidator;
66
+ export { array, boolean, number, object, string, union, func, InferType };