@cleverbrush/schema 0.0.17 → 1.0.0-beta.0

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 (75) hide show
  1. package/README.md +213 -163
  2. package/dist/builders/AliasSchemaBuilder.d.ts +14 -0
  3. package/dist/builders/AliasSchemaBuilder.js +91 -0
  4. package/dist/builders/ArraySchemaBuilder.d.ts +15 -0
  5. package/dist/builders/ArraySchemaBuilder.js +141 -0
  6. package/dist/builders/BooleanSchemaBuilder.d.ts +31 -0
  7. package/dist/builders/BooleanSchemaBuilder.js +90 -0
  8. package/dist/builders/FunctionSchemaBuilder.d.ts +25 -0
  9. package/dist/builders/FunctionSchemaBuilder.js +66 -0
  10. package/dist/builders/NumberSchemaBuilder.d.ts +61 -0
  11. package/dist/builders/NumberSchemaBuilder.js +206 -0
  12. package/dist/builders/ObjectSchemaBuilder.d.ts +83 -0
  13. package/dist/builders/ObjectSchemaBuilder.js +344 -0
  14. package/dist/builders/SchemaBuilder.d.ts +36 -0
  15. package/dist/builders/SchemaBuilder.js +88 -0
  16. package/dist/builders/StringSchemaBuilder.d.ts +14 -0
  17. package/dist/builders/StringSchemaBuilder.js +140 -0
  18. package/dist/builders/UnionSchemaBuilder.d.ts +10 -0
  19. package/dist/builders/UnionSchemaBuilder.js +100 -0
  20. package/dist/defaultSchemas.d.ts +4 -0
  21. package/dist/defaultSchemas.js +45 -0
  22. package/dist/index.d.ts +38 -90
  23. package/dist/index.js +30 -4
  24. package/dist/schema.d.ts +242 -0
  25. package/dist/schema.js +2 -0
  26. package/dist/schemaRegistry.d.ts +54 -0
  27. package/dist/schemaRegistry.js +301 -0
  28. package/dist/validators/validateArray.d.ts +3 -2
  29. package/dist/validators/validateBoolean.d.ts +2 -2
  30. package/dist/validators/validateBoolean.js +1 -4
  31. package/dist/validators/validateFunction.d.ts +2 -0
  32. package/dist/validators/validateFunction.js +21 -0
  33. package/dist/validators/validateNumber.d.ts +2 -2
  34. package/dist/validators/validateNumber.js +1 -1
  35. package/dist/validators/validateObject.d.ts +3 -2
  36. package/dist/validators/validateObject.js +33 -11
  37. package/dist/validators/validateString.d.ts +2 -2
  38. package/dist/validators/validateString.js +1 -1
  39. package/dist/validators/validateUnion.d.ts +3 -0
  40. package/dist/validators/validateUnion.js +30 -0
  41. package/package.json +3 -3
  42. package/src/builders/AliasSchemaBuilder.test.ts +124 -0
  43. package/src/builders/AliasSchemaBuilder.ts +250 -0
  44. package/src/builders/ArraySchemaBuilder.test.ts +270 -0
  45. package/src/builders/ArraySchemaBuilder.ts +381 -0
  46. package/src/builders/BooleanSchemaBuilder.test.ts +196 -0
  47. package/src/builders/BooleanSchemaBuilder.ts +155 -0
  48. package/src/builders/FunctionSchemaBuilder.test.ts +134 -0
  49. package/src/builders/FunctionSchemaBuilder.ts +109 -0
  50. package/src/builders/NumberSchemaBuilder.test.ts +493 -0
  51. package/src/builders/NumberSchemaBuilder.ts +789 -0
  52. package/src/builders/ObjectSchemaBuilder.test.ts +657 -0
  53. package/src/builders/ObjectSchemaBuilder.ts +794 -0
  54. package/src/builders/SchemaBuilder.test.ts +73 -0
  55. package/src/builders/SchemaBuilder.ts +135 -0
  56. package/src/builders/StringSchemaBuilder.test.ts +318 -0
  57. package/src/builders/StringSchemaBuilder.ts +392 -0
  58. package/src/builders/UnionSchemaBuilder.test.ts +162 -0
  59. package/src/builders/UnionSchemaBuilder.ts +159 -0
  60. package/src/defaultSchemas.ts +44 -0
  61. package/src/index.ts +70 -190
  62. package/src/schema.ts +922 -0
  63. package/src/schemaRegistry.builders.test.ts +1438 -0
  64. package/src/{schemaValidator.test.ts → schemaRegistry.test.ts} +561 -185
  65. package/src/schemaRegistry.ts +532 -0
  66. package/src/validators/validateArray.ts +4 -7
  67. package/src/validators/validateBoolean.ts +2 -11
  68. package/src/validators/validateFunction.ts +25 -0
  69. package/src/validators/validateNumber.ts +2 -7
  70. package/src/validators/validateObject.ts +32 -21
  71. package/src/validators/validateString.ts +2 -7
  72. package/src/validators/validateUnion.ts +36 -0
  73. package/dist/schemaValidator.d.ts +0 -16
  74. package/dist/schemaValidator.js +0 -234
  75. 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,78 @@
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>;
23
- };
24
-
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;
1
+ import {
2
+ InferType,
3
+ ExpandSchemaBuilder,
4
+ ValidationResultWithObject
5
+ } from './schema.js';
6
+ import SchemaRegistry from './schemaRegistry.js';
7
+
8
+ import { alias } from './builders/AliasSchemaBuilder.js';
9
+ import { array } from './builders/ArraySchemaBuilder.js';
10
+ import { boolean } from './builders/BooleanSchemaBuilder.js';
11
+ import { number } from './builders/NumberSchemaBuilder.js';
12
+ import { object } from './builders/ObjectSchemaBuilder.js';
13
+ import { string } from './builders/StringSchemaBuilder.js';
14
+ import { union } from './builders/UnionSchemaBuilder.js';
15
+ import { func } from './builders/FunctionSchemaBuilder.js';
16
+
17
+ export type GetNodes<
18
+ T extends Record<string, any>,
19
+ TPrefix extends string = ''
20
+ > = {
21
+ [k in keyof T]: k extends `${TPrefix}${infer F}.${infer S}` ? F : never;
22
+ }[keyof T];
23
+
24
+ export type GetLeafs<
25
+ T extends Record<string, any>,
26
+ TPrefix extends string = ''
27
+ > = {
28
+ [k in keyof T]: k extends `${TPrefix}${infer F}`
29
+ ? F extends `${infer S}.${infer G}`
30
+ ? never
31
+ : F
32
+ : never;
33
+ }[keyof T];
34
+
35
+ export type Unfold<
36
+ TBag extends Record<string, any>,
37
+ TPrefix extends string = ''
38
+ > = {
39
+ [k in GetLeafs<TBag, TPrefix>]: ISchemaActions<TBag[`${TPrefix}${k}`]>;
40
+ } & {
41
+ [k in GetNodes<TBag, TPrefix>]: Unfold<TBag, `${TPrefix}${k}.`>;
106
42
  };
107
43
 
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
44
  export interface ISchemaActions<S> {
148
- validate(value: any): Promise<ValidationResult>;
149
- schema: S;
45
+ validate(
46
+ value: any
47
+ ): Promise<ValidationResultWithObject<InferType<ExpandSchemaBuilder<S>>>>;
48
+ schema: ExpandSchemaBuilder<S>;
150
49
  }
151
50
 
152
- export interface ISchemasProvider<T extends unknown[]> {
153
- schemas: Merge<T>;
51
+ export interface ISchemaRegistry<T extends Record<string, any>> {
52
+ schemas: Unfold<T>;
154
53
  }
155
54
 
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;
55
+ export { SchemaRegistry };
56
+ export default {
57
+ SchemaRegistry,
58
+ alias,
59
+ array,
60
+ boolean,
61
+ number,
62
+ object,
63
+ string,
64
+ union,
65
+ func
66
+ };
196
67
 
197
- export { SchemaValidator };
198
- export default SchemaValidator;
68
+ export {
69
+ alias,
70
+ array,
71
+ boolean,
72
+ number,
73
+ object,
74
+ string,
75
+ union,
76
+ func,
77
+ InferType
78
+ };