@cleverbrush/schema 1.0.0-beta.4 → 1.0.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 (76) hide show
  1. package/README.md +118 -320
  2. package/dist/builders/AnySchemaBuilder.d.ts +76 -0
  3. package/dist/builders/AnySchemaBuilder.js +112 -0
  4. package/dist/builders/ArraySchemaBuilder.d.ts +112 -14
  5. package/dist/builders/ArraySchemaBuilder.js +254 -111
  6. package/dist/builders/BooleanSchemaBuilder.d.ts +69 -29
  7. package/dist/builders/BooleanSchemaBuilder.js +134 -74
  8. package/dist/builders/DateSchemaBuilder.d.ts +177 -0
  9. package/dist/builders/DateSchemaBuilder.js +433 -0
  10. package/dist/builders/FunctionSchemaBuilder.d.ts +59 -23
  11. package/dist/builders/FunctionSchemaBuilder.js +103 -56
  12. package/dist/builders/NumberSchemaBuilder.d.ts +159 -59
  13. package/dist/builders/NumberSchemaBuilder.js +345 -165
  14. package/dist/builders/ObjectSchemaBuilder.d.ts +357 -81
  15. package/dist/builders/ObjectSchemaBuilder.js +519 -283
  16. package/dist/builders/SchemaBuilder.d.ts +158 -34
  17. package/dist/builders/SchemaBuilder.js +258 -71
  18. package/dist/builders/StringSchemaBuilder.d.ts +138 -13
  19. package/dist/builders/StringSchemaBuilder.js +261 -115
  20. package/dist/builders/UnionSchemaBuilder.d.ts +129 -9
  21. package/dist/builders/UnionSchemaBuilder.js +196 -75
  22. package/dist/index.d.ts +20 -40
  23. package/dist/index.js +19 -32
  24. package/dist/utils/transaction.d.ts +46 -0
  25. package/dist/utils/transaction.js +178 -0
  26. package/package.json +27 -14
  27. package/dist/defaultSchemas.d.ts +0 -4
  28. package/dist/defaultSchemas.js +0 -45
  29. package/dist/schema.d.ts +0 -230
  30. package/dist/schema.js +0 -2
  31. package/dist/schemaRegistry.d.ts +0 -49
  32. package/dist/schemaRegistry.js +0 -278
  33. package/dist/validators/validateArray.d.ts +0 -3
  34. package/dist/validators/validateArray.js +0 -60
  35. package/dist/validators/validateBoolean.d.ts +0 -2
  36. package/dist/validators/validateBoolean.js +0 -30
  37. package/dist/validators/validateFunction.d.ts +0 -2
  38. package/dist/validators/validateFunction.js +0 -21
  39. package/dist/validators/validateNumber.d.ts +0 -2
  40. package/dist/validators/validateNumber.js +0 -69
  41. package/dist/validators/validateObject.d.ts +0 -3
  42. package/dist/validators/validateObject.js +0 -95
  43. package/dist/validators/validateString.d.ts +0 -2
  44. package/dist/validators/validateString.js +0 -50
  45. package/dist/validators/validateUnion.d.ts +0 -3
  46. package/dist/validators/validateUnion.js +0 -30
  47. package/src/builders/ArraySchemaBuilder.test.ts +0 -270
  48. package/src/builders/ArraySchemaBuilder.ts +0 -381
  49. package/src/builders/BooleanSchemaBuilder.test.ts +0 -196
  50. package/src/builders/BooleanSchemaBuilder.ts +0 -155
  51. package/src/builders/FunctionSchemaBuilder.test.ts +0 -134
  52. package/src/builders/FunctionSchemaBuilder.ts +0 -109
  53. package/src/builders/NumberSchemaBuilder.test.ts +0 -493
  54. package/src/builders/NumberSchemaBuilder.ts +0 -789
  55. package/src/builders/ObjectSchemaBuilder.test.ts +0 -657
  56. package/src/builders/ObjectSchemaBuilder.ts +0 -794
  57. package/src/builders/SchemaBuilder.test.ts +0 -73
  58. package/src/builders/SchemaBuilder.ts +0 -135
  59. package/src/builders/StringSchemaBuilder.test.ts +0 -318
  60. package/src/builders/StringSchemaBuilder.ts +0 -392
  61. package/src/builders/UnionSchemaBuilder.test.ts +0 -162
  62. package/src/builders/UnionSchemaBuilder.ts +0 -154
  63. package/src/defaultSchemas.ts +0 -44
  64. package/src/index.ts +0 -66
  65. package/src/schema.ts +0 -827
  66. package/src/schemaRegistry.builders.test.ts +0 -1393
  67. package/src/schemaRegistry.test.ts +0 -118
  68. package/src/schemaRegistry.ts +0 -461
  69. package/src/validators/validateArray.ts +0 -76
  70. package/src/validators/validateBoolean.ts +0 -36
  71. package/src/validators/validateFunction.ts +0 -25
  72. package/src/validators/validateNumber.ts +0 -82
  73. package/src/validators/validateObject.ts +0 -119
  74. package/src/validators/validateString.ts +0 -59
  75. package/src/validators/validateUnion.ts +0 -36
  76. package/tsconfig.json +0 -16
@@ -0,0 +1,178 @@
1
+ const TRANSACTION_SYMBOL = Symbol('transaction');
2
+ const defaultNonTransactionalTypes = [Error, RegExp, Date];
3
+ const defaultTransactionOptions = {
4
+ shouldNotWrapWithTransaction: (child) => !!defaultNonTransactionalTypes.find((t) => child instanceof t)
5
+ };
6
+ /**
7
+ * Starts transaction over the `initial` object.
8
+ */
9
+ export const transaction = (initial, options) => {
10
+ let newProperties = {};
11
+ let deletedProperties = new Map();
12
+ options = Object.assign({}, defaultTransactionOptions, options || {});
13
+ const { shouldNotWrapWithTransaction } = options;
14
+ const isDirty = () => !!Object.keys(newProperties).find((key) => {
15
+ if (newProperties[key] && newProperties[key][TRANSACTION_SYMBOL]) {
16
+ return newProperties[key][TRANSACTION_SYMBOL].isDirty();
17
+ }
18
+ return true;
19
+ }) || (deletedProperties.size > 0);
20
+ const commit = () => {
21
+ const result = {};
22
+ Object.keys(initial).forEach((key) => {
23
+ result[key] = initial[key];
24
+ });
25
+ Object.keys(newProperties).forEach((key) => {
26
+ const value = newProperties[key];
27
+ if (value[TRANSACTION_SYMBOL]) {
28
+ const { commit: childCommit } = value[TRANSACTION_SYMBOL];
29
+ result[key] = childCommit();
30
+ }
31
+ else {
32
+ result[key] = newProperties[key];
33
+ }
34
+ });
35
+ for (const key of deletedProperties.keys()) {
36
+ delete result[key];
37
+ }
38
+ newProperties = {};
39
+ deletedProperties = new Map();
40
+ return result;
41
+ };
42
+ const rollback = () => {
43
+ for (const key in newProperties) {
44
+ const value = newProperties[key];
45
+ if (value &&
46
+ typeof value === 'object' &&
47
+ value[TRANSACTION_SYMBOL]) {
48
+ // this is nested transaction, let's rollback it as well
49
+ value[TRANSACTION_SYMBOL].rollback();
50
+ }
51
+ }
52
+ newProperties = {};
53
+ deletedProperties = new Map();
54
+ return initial;
55
+ };
56
+ if (Array.isArray(initial)) {
57
+ const result = initial.map((el) => typeof el === 'object' && el && !shouldNotWrapWithTransaction(el)
58
+ ? transaction(el).object
59
+ : el);
60
+ const commitArray = () => result.map((el) => el && typeof el[TRANSACTION_SYMBOL] === 'object'
61
+ ? el[TRANSACTION_SYMBOL].commit()
62
+ : el);
63
+ const isDirtyArray = () => {
64
+ return !!result.find((val, index) => {
65
+ if (val && typeof val[TRANSACTION_SYMBOL] === 'object') {
66
+ return val[TRANSACTION_SYMBOL].isDirty();
67
+ }
68
+ return result[index] !== initial[index];
69
+ });
70
+ };
71
+ Object.defineProperty(result, TRANSACTION_SYMBOL, {
72
+ writable: false,
73
+ configurable: false,
74
+ value: {
75
+ initial,
76
+ object: result,
77
+ commit: commitArray,
78
+ rollback: () => initial,
79
+ isDirty: isDirtyArray
80
+ }
81
+ });
82
+ return {
83
+ object: result,
84
+ commit: commitArray,
85
+ rollback: () => initial,
86
+ isDirty: isDirtyArray
87
+ };
88
+ }
89
+ const proxy = new Proxy(initial, {
90
+ set: (target, property, value) => {
91
+ if (target && target[property] === value) {
92
+ delete newProperties[property];
93
+ return true;
94
+ }
95
+ newProperties[property] = value;
96
+ deletedProperties.delete(property);
97
+ return true;
98
+ },
99
+ ownKeys: (target) => {
100
+ return [
101
+ ...Object.keys(target).filter((k) => !deletedProperties.has(k)),
102
+ ...Object.keys(newProperties).filter((k) => !(k in target))
103
+ ];
104
+ },
105
+ getOwnPropertyDescriptor: (target, prop) => {
106
+ if (deletedProperties.has(prop)) {
107
+ return undefined;
108
+ }
109
+ if (prop in newProperties) {
110
+ return Object.getOwnPropertyDescriptor(newProperties, prop);
111
+ }
112
+ return Object.getOwnPropertyDescriptor(target, prop);
113
+ },
114
+ has: (target, prop) => {
115
+ if (deletedProperties.has(prop)) {
116
+ return false;
117
+ }
118
+ if (prop in newProperties) {
119
+ return true;
120
+ }
121
+ return prop in target;
122
+ },
123
+ get: (target, prop) => {
124
+ if (typeof prop === 'symbol') {
125
+ if (prop === TRANSACTION_SYMBOL) {
126
+ return {
127
+ initial,
128
+ object: proxy,
129
+ commit,
130
+ rollback,
131
+ isDirty
132
+ };
133
+ }
134
+ return target[prop];
135
+ }
136
+ if (prop in newProperties) {
137
+ return newProperties[prop];
138
+ }
139
+ if (deletedProperties.has(prop)) {
140
+ return undefined;
141
+ }
142
+ if (!isTransaction(target[prop]) &&
143
+ typeof target[prop] === 'object' &&
144
+ target[prop] &&
145
+ !shouldNotWrapWithTransaction(target[prop])) {
146
+ const { object } = transaction(target[prop], options);
147
+ newProperties[prop] = object;
148
+ return object;
149
+ }
150
+ return target[prop];
151
+ },
152
+ deleteProperty: (target, p) => {
153
+ if (p in newProperties) {
154
+ if (newProperties[p] &&
155
+ typeof newProperties[p][TRANSACTION_SYMBOL] === 'object') {
156
+ newProperties[p][TRANSACTION_SYMBOL].rollback();
157
+ }
158
+ delete newProperties[p];
159
+ }
160
+ if (p in target) {
161
+ deletedProperties.set(p, true);
162
+ }
163
+ return true;
164
+ }
165
+ });
166
+ return {
167
+ object: proxy,
168
+ commit,
169
+ rollback,
170
+ isDirty
171
+ };
172
+ };
173
+ /**
174
+ * Checks if `obj` is instance of transaction
175
+ * @param obj object to check if it's a transaction
176
+ * @returns
177
+ */
178
+ export const isTransaction = (obj) => obj && typeof obj === 'object' && Object.hasOwn(obj, TRANSACTION_SYMBOL);
package/package.json CHANGED
@@ -1,29 +1,42 @@
1
1
  {
2
- "name": "@cleverbrush/schema",
3
- "version": "1.0.0-beta.4",
2
+ "author": "Andrew Zolotukhin <andrew_zol@cleverbrush.com>",
3
+ "bugs": {
4
+ "url": "https://github.com/cleverbrush/framework/issues",
5
+ "email": "andrew_zol@cleverbrush.com"
6
+ },
7
+ "description": "Schema Definition And Validation library, that allows to define and validate objects of any complexity",
8
+ "files": [
9
+ "dist/**/*"
10
+ ],
11
+ "homepage": "https://docs.cleverbrush.com/v1.0.0/modules/Schema_Definition_And_Validation.html",
4
12
  "keywords": [
5
13
  "object schema validator",
6
14
  "schema",
7
- "validate object"
8
- ],
9
- "author": "Andrew Zolotukhin <andrew_zol@cleverbrush.com>",
10
- "license": "BSD",
11
- "files": [
12
- "*",
13
- "dist/*"
15
+ "validate object",
16
+ "cleverbrush"
14
17
  ],
18
+ "license": "BSD 3-Clause",
15
19
  "main": "./dist/index.js",
16
- "readme": "https://github.com/cleverbrush/libs/tree/master/libs/schema#readme",
20
+ "name": "@cleverbrush/schema",
21
+ "readme": "https://github.com/cleverbrush/framework/tree/master/libs/schema#readme",
17
22
  "repository": {
18
23
  "type": "git",
19
- "url": "github:cleverbrush/libs"
24
+ "url": "github:cleverbrush/framework"
20
25
  },
21
26
  "scripts": {
22
27
  "watch": "tsc --watch",
23
28
  "build": "tsc"
24
29
  },
25
- "devDependencies": {
26
- "@cleverbrush/deep": "1.0.0-beta.4"
30
+ "type": "module",
31
+ "types": "./dist/index.d.ts",
32
+ "typedoc": {
33
+ "entryPoint": "./src/index.ts",
34
+ "readmeFile": "./README.md",
35
+ "displayName": "Schema Definition And Validation",
36
+ "tsconfig": "./tsconfig.json"
27
37
  },
28
- "types": "./dist/index.d.ts"
38
+ "version": "1.0.0",
39
+ "devDependencies": {
40
+ "@cleverbrush/deep": "1.0.0"
41
+ }
29
42
  }
@@ -1,4 +0,0 @@
1
- import { DefaultSchemaType, Schema } from './schema.js';
2
- export declare const defaultSchemas: {
3
- [key in DefaultSchemaType]?: Schema;
4
- };
@@ -1,45 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultSchemas = void 0;
4
- exports.defaultSchemas = {
5
- alias: {
6
- type: 'alias',
7
- // TODO: remove
8
- schemaName: '',
9
- isRequired: true,
10
- isNullable: false
11
- },
12
- number: {
13
- type: 'number',
14
- isRequired: true,
15
- isNullable: false,
16
- ensureNotNaN: true,
17
- ensureIsFinite: true
18
- },
19
- boolean: {
20
- type: 'boolean',
21
- isRequired: true,
22
- isNullable: false
23
- },
24
- string: {
25
- type: 'string',
26
- isRequired: true,
27
- isNullable: false
28
- },
29
- array: {
30
- type: 'array',
31
- isRequired: true,
32
- isNullable: false
33
- },
34
- object: {
35
- type: 'object',
36
- noUnknownProperties: true,
37
- isNullable: false,
38
- isRequired: true
39
- },
40
- function: {
41
- type: 'function',
42
- isRequired: true,
43
- isNullable: false
44
- }
45
- };
package/dist/schema.d.ts DELETED
@@ -1,230 +0,0 @@
1
- import { ISchemaBuilder } from './builders/SchemaBuilder.js';
2
- import { IUnionSchemaBuilder } from './builders/UnionSchemaBuilder.js';
3
- import { IStringSchemaBuilder } from './builders/StringSchemaBuilder.js';
4
- import { IObjectSchemaBuilder } from './builders/ObjectSchemaBuilder.js';
5
- import { INumberSchemaBuilder } from './builders/NumberSchemaBuilder.js';
6
- import { IArraySchemaBuilder } from './builders/ArraySchemaBuilder.js';
7
- import { IBooleanSchemaBuilder } from './builders/BooleanSchemaBuilder.js';
8
- import { IFunctionSchemaBuilder } from './builders/FunctionSchemaBuilder.js';
9
- import { ISchemaRegistry } from './index.js';
10
- export declare type DefaultSchemaType = 'alias' | 'boolean' | 'number' | 'string' | 'array' | 'object' | 'union' | 'function';
11
- export declare type KeysWithNoNever<T> = {
12
- [k in keyof T]: T[k] extends never ? never : k;
13
- }[keyof T];
14
- export declare type OmitNever<T> = {
15
- [k in KeysWithNoNever<T>]: T[k];
16
- };
17
- declare type MakePropOptional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
18
- export declare type Union<T1, T2> = {
19
- [k in keyof Omit<T1, keyof T2>]: T1[k];
20
- } & T2;
21
- export declare type DefaultCommonSchema = {
22
- isRequired: true;
23
- isNullable: false;
24
- };
25
- export declare type DefaultBooleanSchema = DefaultCommonSchema & {
26
- type: 'boolean';
27
- };
28
- export declare type DefaultNumberSchema = DefaultCommonSchema & {
29
- type: 'number';
30
- ensureNotNaN: true;
31
- ensureIsFinite: true;
32
- };
33
- export declare type DefaultStringSchema = DefaultCommonSchema & {
34
- type: 'string';
35
- };
36
- export declare type DefaultArraySchema = DefaultCommonSchema & {
37
- type: 'array';
38
- };
39
- export declare type DefaultUnionSchema = DefaultCommonSchema & {
40
- type: 'union';
41
- };
42
- export declare type DefaultObjectSchema = DefaultCommonSchema & {
43
- type: 'object';
44
- noUnknownProperties: true;
45
- };
46
- export declare type DefaultFunctionSchema = DefaultCommonSchema & {
47
- type: 'function';
48
- };
49
- export declare type ValidationResultRaw = {
50
- valid: boolean;
51
- errors?: Array<string>;
52
- };
53
- export declare type ValidationResult = ValidationResultRaw | Promise<ValidationResultRaw>;
54
- export declare type ValidationResultWithObject<T> = {
55
- valid: boolean;
56
- errors?: Array<string>;
57
- object?: T;
58
- };
59
- export declare type Validator = (value: any) => ValidationResult;
60
- export declare type CommonSchemaSpecification<TRequired extends boolean = true, TNullable extends boolean = false> = {
61
- isRequired?: TRequired;
62
- isNullable?: TNullable;
63
- validators?: Array<Validator>;
64
- };
65
- export declare type BooleanSchema = CommonSchemaSpecification<any, any> & {
66
- type: 'boolean';
67
- equals?: boolean;
68
- };
69
- export declare type NumberSchema = CommonSchemaSpecification<any, any> & {
70
- type: 'number';
71
- min?: number;
72
- max?: number;
73
- equals?: number;
74
- isInteger?: boolean;
75
- ensureNotNaN?: boolean;
76
- ensureIsFinite?: boolean;
77
- };
78
- export declare type ArraySchema<T> = CommonSchemaSpecification<any, any> & {
79
- type: 'array';
80
- preprocessor?: ((value: unknown) => unknown | Promise<unknown>) | string;
81
- ofType?: T;
82
- minLength?: number;
83
- maxLength?: number;
84
- };
85
- export declare type ObjectSchema<T extends Record<string, Schema> = never> = CommonSchemaSpecification<any, any> & {
86
- type: 'object';
87
- noUnknownProperties?: boolean;
88
- properties?: T;
89
- preprocessors?: {
90
- [S in keyof T | '*']?: S extends keyof T ? ((value: any) => undefined | InferType<T[S]> | Promise<InferType<T[S]>>) | string : (value: InferType<T>) => void | Promise<void>;
91
- };
92
- };
93
- export declare type AliasSchema = CommonSchemaSpecification<any, any> & {
94
- type: 'alias';
95
- schemaName: string;
96
- externalRegistry?: ISchemaRegistry<any>;
97
- };
98
- export declare type UnionSchema<T extends any[]> = CommonSchemaSpecification<any, any> & {
99
- type: 'union';
100
- variants: T;
101
- };
102
- export declare type StringSchema = CommonSchemaSpecification<any, any> & {
103
- type: 'string';
104
- equals?: string;
105
- minLength?: number;
106
- maxLength?: number;
107
- };
108
- export declare type FunctionSchema = CommonSchemaSpecification<any, any> & {
109
- type: 'function';
110
- };
111
- export declare type SchemaSpecification = ObjectSchema | BooleanSchema | NumberSchema | ArraySchema<any> | AliasSchema | UnionSchema<any> | StringSchema | FunctionSchema;
112
- export declare type Schema<T = any> = T extends Record<string, any> ? any : T extends number ? NumberSchema | number | 'number' : T extends string ? StringSchema | string | 'string' : T extends boolean ? BooleanSchema | boolean : number | DefaultSchemaType | SchemaSpecification | Schema[];
113
- export declare type MakeOptional<T> = T extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? IUnionSchemaBuilder<false, TNullable, TVariants> : T extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? IStringSchemaBuilder<false, TNullable, TMinLength, TMaxLength, TEqualsTo> : T extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? IObjectSchemaBuilder<false, TNullable, TNoUnknownProperties, TProperties, TMapToType> : T extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? INumberSchemaBuilder<false, TNullable, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : T extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? IArraySchemaBuilder<false, TNullable, TOfType, TMaxLength, TMinLength> : T extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? IBooleanSchemaBuilder<false, TNullable, TEqualsTo> : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? IFunctionSchemaBuilder<false, TNullable> : T & {
114
- isRequired: false;
115
- };
116
- export declare type MakeRequired<T> = T extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? IUnionSchemaBuilder<true, TNullable, TVariants> : T extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? IStringSchemaBuilder<true, TNullable, TMinLength, TMaxLength, TEqualsTo> : T extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? IObjectSchemaBuilder<true, TNullable, TNoUnknownProperties, TProperties, TMapToType> : T extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? INumberSchemaBuilder<true, TNullable, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : T extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? IArraySchemaBuilder<true, TNullable, TOfType, TMaxLength, TMinLength> : T extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? IBooleanSchemaBuilder<true, TNullable, TEqualsTo> : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? IFunctionSchemaBuilder<true, TNullable> : T & {
117
- isRequired: true;
118
- };
119
- export declare type MakeNullable<T> = T extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? IUnionSchemaBuilder<TRequired, true, TVariants> : T extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? IStringSchemaBuilder<TRequired, true, TMinLength, TMaxLength, TEqualsTo> : T extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? IObjectSchemaBuilder<TRequired, true, TNoUnknownProperties, TProperties, TMapToType> : T extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? INumberSchemaBuilder<TRequired, true, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : T extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? IArraySchemaBuilder<TRequired, true, TOfType, TMaxLength, TMinLength> : T extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? IBooleanSchemaBuilder<TRequired, true, TEqualsTo> : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? IFunctionSchemaBuilder<TRequired, true> : T & {
120
- isNullable: true;
121
- };
122
- export declare type MakeNotNullable<T> = T extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? IUnionSchemaBuilder<TRequired, false, TVariants> : T extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? IStringSchemaBuilder<TRequired, false, TMinLength, TMaxLength, TEqualsTo> : T extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? IObjectSchemaBuilder<TRequired, false, TNoUnknownProperties, TProperties, TMapToType> : T extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? INumberSchemaBuilder<TRequired, false, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : T extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? IArraySchemaBuilder<TRequired, false, TOfType, TMaxLength, TMinLength> : T extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? IBooleanSchemaBuilder<TRequired, false, TEqualsTo> : T extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? IFunctionSchemaBuilder<TRequired, false> : T & {
123
- isNullable: false;
124
- };
125
- export declare type ExpandUnionVariants<TVariants extends any[]> = TVariants extends [
126
- infer T
127
- ] ? [ExpandSchemaBuilder<T>] : TVariants extends [infer T, ...infer Rest] ? [ExpandSchemaBuilder<T>, ...ExpandUnionVariants<[...Rest]>] : never;
128
- export declare type ExpandSchemaBuilder<TSchema> = TSchema extends [
129
- infer TType,
130
- ...infer TParams
131
- ] ? TType extends 'object' ? TParams extends [
132
- infer TRequired extends boolean,
133
- infer TNullable extends boolean,
134
- infer TNoUnknownProperties extends boolean | undefined,
135
- infer TProperties,
136
- infer TMapToType
137
- ] ? IObjectSchemaBuilder<TRequired, TNullable, TNoUnknownProperties, {
138
- [k in keyof TProperties]: ExpandSchemaBuilder<TProperties[k]>;
139
- }, TMapToType> : IObjectSchemaBuilder : TType extends 'string' ? TParams extends [
140
- infer TRequired extends boolean,
141
- infer TNullable extends boolean,
142
- infer TMinLength extends number | undefined,
143
- infer TMaxLength extends number | undefined,
144
- infer TEqualsTo extends string | undefined
145
- ] ? TEqualsTo extends undefined ? IStringSchemaBuilder<TRequired, TNullable, TMinLength, TMaxLength, undefined> : IStringSchemaBuilder<TRequired, TNullable, TMinLength, TMaxLength, TEqualsTo> : IStringSchemaBuilder : TType extends 'number' ? TParams extends [
146
- infer TRequired extends boolean,
147
- infer TNullable extends boolean,
148
- infer TMin extends number | undefined,
149
- infer TMax extends number | undefined,
150
- infer TIsInteger extends boolean | undefined,
151
- infer TEnsureNotNaN extends boolean | undefined,
152
- infer TEnsureIsFinite extends boolean | undefined,
153
- infer TEqualsTo extends number | undefined
154
- ] ? TEqualsTo extends undefined ? INumberSchemaBuilder<TRequired, TNullable, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, TEqualsTo> : INumberSchemaBuilder<TRequired, TNullable, TMin, TMax, TIsInteger, TEnsureNotNaN, TEnsureIsFinite, undefined> : INumberSchemaBuilder : TType extends 'array' ? TParams extends [
155
- infer TRequired extends boolean,
156
- infer TNullable extends boolean,
157
- infer TOfType,
158
- infer TMaxLength extends number | undefined,
159
- infer TMinLength extends number | undefined
160
- ] ? IArraySchemaBuilder<TRequired, TNullable, ExpandSchemaBuilder<TOfType>, TMaxLength, TMinLength> : IArraySchemaBuilder : TType extends 'union' ? TParams extends [
161
- infer TRequired extends boolean,
162
- infer TNullable extends boolean,
163
- infer TVariants extends any[]
164
- ] ? IUnionSchemaBuilder<TRequired, TNullable, ExpandUnionVariants<TVariants>> : IUnionSchemaBuilder : TType extends 'boolean' ? TParams extends [
165
- infer TRequired extends boolean,
166
- infer TNullable extends boolean,
167
- infer TEqualsTo extends boolean | undefined
168
- ] ? IBooleanSchemaBuilder<TRequired, TNullable, TEqualsTo extends undefined ? undefined : boolean> : IBooleanSchemaBuilder : TType extends 'function' ? TParams extends [
169
- infer TRequired extends boolean,
170
- infer TNullable extends boolean
171
- ] ? IFunctionSchemaBuilder<TRequired, TNullable> : IFunctionSchemaBuilder : TSchema : TSchema;
172
- export declare type ReduceSchemaBuilder<TBuilder> = TBuilder extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? [
173
- 'object',
174
- TRequired,
175
- TNullable,
176
- TNoUnknownProperties,
177
- {
178
- [k in keyof TProperties]: ReduceSchemaBuilder<TProperties[k]>;
179
- },
180
- TMapToType
181
- ] : TBuilder extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? ['string', TRequired, TNullable, TMinLength, TMaxLength, TEqualsTo] : TBuilder extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? [
182
- 'number',
183
- TRequired,
184
- TNullable,
185
- TMin,
186
- TMax,
187
- TIsInteger,
188
- TEnsureNotNaN,
189
- TEnsureIsFinite,
190
- TEqualsTo
191
- ] : TBuilder extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? [
192
- 'array',
193
- TRequired,
194
- TNullable,
195
- ReduceSchemaBuilder<TOfType>,
196
- TMaxLength,
197
- TMinLength
198
- ] : TBuilder extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? ['union', TRequired, TNullable, ReduceSchemaBuilder<TVariants>] : TBuilder extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? ['boolean', TRequired, TNullable, TEqualsTo] : TBuilder extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? ['function', TRequired, TNullable] : TBuilder extends [infer F] ? [ReduceSchemaBuilder<F>] : TBuilder extends [infer F, ...infer Rest] ? [ReduceSchemaBuilder<F>, ...ReduceSchemaBuilder<Rest>] : TBuilder;
199
- export declare type InferType<S> = S extends DefaultSchemaType ? S extends 'string' ? string : S extends 'boolean' ? boolean : S extends 'number' ? number : S extends 'array' ? Array<any> : S extends 'object' ? Record<string, never> : S extends 'function' ? Function : never : S extends number ? S : S extends BooleanSchema ? S['equals'] extends undefined ? boolean : S['equals'] : S extends UnionSchema<infer K> ? InferType<K> : S extends {
200
- type: 'union';
201
- variants: infer K;
202
- } ? K extends any[] ? InferType<K> : any : S extends IObjectSchemaBuilder<infer TRequired, infer TNullable, infer TNoUnknownProperties, infer TProperties, infer TMapToType> ? TMapToType extends undefined ? InferType<CommonSchemaSpecification<TRequired, TNullable> & {
203
- type: 'object';
204
- } & (TNoUnknownProperties extends true ? {
205
- noUnknownProperties: true;
206
- } : {
207
- noUnknownProperties: false;
208
- }) & (TProperties extends Record<string, any> ? {
209
- properties: TProperties;
210
- } : {})> : TMapToType : S extends INumberSchemaBuilder<infer TRequired, infer TNullable, infer TMin, infer TMax, infer TIsInteger, infer TEnsureNotNaN, infer TEnsureIsFinite, infer TEqualsTo> ? TRequired extends true ? TEqualsTo extends undefined ? number : TEqualsTo : TEqualsTo extends undefined ? number | undefined : TEqualsTo | undefined : S extends IBooleanSchemaBuilder<infer TRequired, infer TNullable, infer TEqualsTo> ? TRequired extends true ? TEqualsTo extends undefined ? boolean : TEqualsTo : TEqualsTo extends undefined ? boolean | undefined : TEqualsTo | undefined : S extends IStringSchemaBuilder<infer TRequired, infer TNullable, infer TMinLength, infer TMaxLength, infer TEqualsTo> ? TRequired extends true ? TEqualsTo extends undefined ? string : TEqualsTo : TEqualsTo extends undefined ? string | undefined : TEqualsTo | undefined : S extends IUnionSchemaBuilder<infer TRequired, infer TNullable, infer TVariants> ? TRequired extends true ? InferType<TVariants> : InferType<TVariants> | undefined : S extends IArraySchemaBuilder<infer TRequired, infer TNullable, infer TOfType, infer TMaxLength, infer TMinLength> ? TRequired extends true ? TOfType extends undefined ? any[] : InferType<TOfType>[] : TOfType extends undefined ? any[] | undefined : InferType<TOfType>[] | undefined : S extends IFunctionSchemaBuilder<infer TRequired, infer TNullable> ? TRequired extends true ? Function : Function | undefined : S extends StringSchema ? S['equals'] extends undefined ? string : S['equals'] : S extends NumberSchema ? S['equals'] extends undefined ? number : S['equals'] : S extends ObjectSchema<infer K> ? OptionalPropertiesOf<K> extends never ? {
211
- [k in keyof K]: InferType<K[k]>;
212
- } : MakePropOptional<{
213
- [k in keyof K]: InferType<K[k]>;
214
- }, OptionalPropertiesOf<K>> : S extends {
215
- type: 'object';
216
- properties: infer K;
217
- } ? OptionalPropertiesOf<K> extends never ? {
218
- [k in keyof K]: InferType<K[k]>;
219
- } : MakePropOptional<{
220
- [k in keyof K]: InferType<K[k]>;
221
- }, OptionalPropertiesOf<K>> : S extends [infer F] ? InferType<F> : S extends [infer F, ...infer Rest] ? InferType<F> | InferType<Rest> : S extends ArraySchema<infer L> ? InferType<L> extends never ? Array<any> : InferType<L>[] : S extends {
222
- type: 'array';
223
- ofType: infer L;
224
- } ? InferType<L>[] : S extends {
225
- type: 'array';
226
- } ? Array<any> : any;
227
- declare type OptionalPropertiesOf<T> = {
228
- [k in keyof T]: T[k] extends ISchemaBuilder<infer TRequired, any> ? TRequired extends false ? k : never : never;
229
- }[keyof T];
230
- export {};
package/dist/schema.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,49 +0,0 @@
1
- import { ISchemaRegistry as ISchemaRegistry, Unfold } from './index.js';
2
- import { Schema, ReduceSchemaBuilder, ValidationResult, ExpandSchemaBuilder } from './schema.js';
3
- import { number } from './builders/NumberSchemaBuilder.js';
4
- import { union } from './builders/UnionSchemaBuilder.js';
5
- import { object } from './builders/ObjectSchemaBuilder.js';
6
- import { string } from './builders/StringSchemaBuilder.js';
7
- import { boolean } from './builders/BooleanSchemaBuilder.js';
8
- import { array } from './builders/ArraySchemaBuilder.js';
9
- import { func } from './builders/FunctionSchemaBuilder.js';
10
- import { ISchemaBuilder } from './builders/SchemaBuilder.js';
11
- export default class SchemaRegistry<T extends Record<string, Schema> = {}> implements ISchemaRegistry<T> {
12
- private _schemasMap;
13
- private _schemasCache;
14
- private _preprocessorsMap;
15
- get preprocessors(): Map<string, (value: unknown) => unknown>;
16
- addPreprocessor(name: string, preprocessor: (value: unknown) => unknown | Promise<unknown>): SchemaRegistry<T>;
17
- private _aliasBuilder;
18
- private _externalAlias;
19
- addSchemaFrom<TOldName extends keyof T, TName extends string, TParam extends Record<string, any> | ((params: {
20
- base: ExpandSchemaBuilder<T[TOldName]>;
21
- boolean: typeof boolean;
22
- func: typeof func;
23
- array: typeof array;
24
- string: typeof string;
25
- number: typeof number;
26
- union: typeof union;
27
- object: typeof object;
28
- alias: <TSchemaName extends keyof T>(schemaName: TSchemaName) => ExpandSchemaBuilder<T[TSchemaName]>;
29
- }) => TSchema), TSchema extends Schema | ISchemaBuilder>(oldName: TOldName, name: TName, param: TParam): SchemaRegistry<{
30
- [key in keyof T | TName]: key extends keyof T ? T[key] : TParam extends (...args: any[]) => any ? ReduceSchemaBuilder<ReturnType<TParam>> : TParam;
31
- }>;
32
- addSchema<TName extends string, TParam extends Record<string, any> | ((params: {
33
- boolean: typeof boolean;
34
- array: typeof array;
35
- string: typeof string;
36
- number: typeof number;
37
- union: typeof union;
38
- object: typeof object;
39
- func: typeof func;
40
- alias: <TSchemaName extends keyof T>(schemaName: TSchemaName) => ExpandSchemaBuilder<T[TSchemaName]>;
41
- external: <TRegistryKeys, TSchemaName extends keyof TRegistryKeys>(registry: SchemaRegistry<TRegistryKeys>, schemaName: TSchemaName) => ExpandSchemaBuilder<TRegistryKeys[TSchemaName]>;
42
- }) => TSchema), TSchema extends Schema | ISchemaBuilder>(name: TName, param: TParam): SchemaRegistry<{
43
- [key in keyof T | TName]: key extends keyof T ? T[key] : TParam extends (...args: any[]) => any ? ReduceSchemaBuilder<ReturnType<TParam>> : TParam;
44
- }>;
45
- get schemas(): Unfold<T>;
46
- private validateDefaultType;
47
- private checkValidators;
48
- validate(schemaToValidate: keyof T | Schema, obj: any): Promise<ValidationResult>;
49
- }