@lucania/schema 1.0.8 → 2.0.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.
@@ -0,0 +1,8 @@
1
+ import { DefaultValue } from "../typing/toolbox";
2
+ import { ValidationPass } from "../error/ValidationPass";
3
+ import { BaseSchema } from "./BaseSchema";
4
+ export declare class AnySchema<Required extends boolean, Default extends DefaultValue<any>> extends BaseSchema<any, any, Required, Default> {
5
+ constructor(required: Required, defaultValue: Default);
6
+ convert(value: any, pass: ValidationPass): any;
7
+ getJsonSchema(): object;
8
+ }
@@ -0,0 +1,13 @@
1
+ import { ValidationPass } from "../error/ValidationPass";
2
+ import { BaseSchemaAny } from "../typing/extended";
3
+ import type { DefaultValue, ModelValue, SourceValue } from "../typing/toolbox";
4
+ import { BaseSchema } from "./BaseSchema";
5
+ export type ArraySource<Subschema extends BaseSchemaAny> = (Subschema extends BaseSchema<infer Source, any, infer Required, infer Default> ? (SourceValue<Source, Required, Default>[]) : never);
6
+ export type ArrayModel<Subschema extends BaseSchemaAny> = (Subschema extends BaseSchema<infer Source, infer Model, infer Required, infer Default> ? (ModelValue<Source, Model, Required, Default>[]) : never);
7
+ export declare class ArraySchema<Subschema extends BaseSchemaAny, Required extends boolean, Default extends DefaultValue<ArraySource<Subschema>>> extends BaseSchema<ArraySource<Subschema>, ArrayModel<Subschema>, Required, Default> {
8
+ readonly subschema: Subschema;
9
+ constructor(subschema: Subschema, required: Required, defaultValue: Default);
10
+ validate(source: SourceValue<ArraySource<Subschema>, Required, Default>, pass?: ValidationPass): ModelValue<ArraySource<Subschema>, ArrayModel<Subschema>, Required, Default>;
11
+ convert(value: ArraySource<Subschema>, pass: ValidationPass): ArrayModel<Subschema>;
12
+ getJsonSchema(): object;
13
+ }
@@ -0,0 +1,32 @@
1
+ import { ValidationPass } from "../error/ValidationPass";
2
+ import type { AdditionalValidationPasses, AdditionalValidator, AdditionalValidatorAfterType, AdditionalValidatorBeforeType, DefaultValue, EnsureValidator, ModelValue, SourceValue } from "../typing/toolbox";
3
+ export declare abstract class BaseSchema<Source, Model, Required extends boolean, Default extends DefaultValue<Source>> {
4
+ readonly type: string;
5
+ protected readonly _required: Required;
6
+ protected readonly _default: Default;
7
+ protected readonly _additionalValidationPasses: AdditionalValidationPasses<Source, Model>;
8
+ constructor(type: string, required: Required, defaultValue: Default, additionalValidationPasses?: AdditionalValidationPasses<Source, Model>);
9
+ validate(source: SourceValue<Source, Required, Default>, pass?: ValidationPass): ModelValue<Source, Model, Required, Default>;
10
+ abstract convert(value: Source, pass: ValidationPass): Model;
11
+ custom(additionalValidator: AdditionalValidator<SourceValue<Source, Required, Default>>, type: AdditionalValidatorBeforeType): this;
12
+ custom(additionalValidator: AdditionalValidator<Model>, type: AdditionalValidatorAfterType): this;
13
+ custom(additionalValidator: AdditionalValidator<Model>): this;
14
+ ensure(ensureValidator: EnsureValidator<Model>, message?: string): this;
15
+ hasDefault(): boolean;
16
+ isDefaultRuntimeEvaluated(): this is {
17
+ _default: Function;
18
+ };
19
+ getDefault(pass: ValidationPass): Source;
20
+ protected _getValueDisplay(value: Model): string;
21
+ abstract getJsonSchema(): object;
22
+ protected _getJsonSchemaDescription(): string;
23
+ protected _ensurePass(source: SourceValue<Source, Required, Default>, pass?: ValidationPass): ValidationPass;
24
+ private _executeAdditionalValidator;
25
+ /**
26
+ * Checks to see if a value is present. (Not null or undefined)
27
+ * @param value The value to check the presence of.
28
+ * @returns true if value is not null or undefined, false otherwise.
29
+ */
30
+ static isPresent(value: any): value is Exclude<Exclude<any, null>, undefined>;
31
+ static getType(value: any): any;
32
+ }
@@ -0,0 +1,9 @@
1
+ import { DefaultValue } from "../typing/toolbox";
2
+ import { ValidationPass } from "../error/ValidationPass";
3
+ import { BaseSchema } from "./BaseSchema";
4
+ export type BooleanSource = boolean | number | string | null | undefined;
5
+ export declare class BooleanSchema<Required extends boolean, Default extends DefaultValue<BooleanSource>> extends BaseSchema<BooleanSource, boolean, Required, Default> {
6
+ constructor(required: Required, defaultValue: Default);
7
+ convert(value: BooleanSource, pass: ValidationPass): boolean;
8
+ getJsonSchema(): object;
9
+ }
@@ -0,0 +1,22 @@
1
+ import { DefaultValue } from "../typing/toolbox";
2
+ import { ValidationPass } from "../error/ValidationPass";
3
+ import { BaseSchema } from "./BaseSchema";
4
+ type StandardDate = globalThis.Date;
5
+ declare const StandardDate: DateConstructor;
6
+ export type DateSource = string | number | StandardDate;
7
+ export declare class DateSchema<Required extends boolean, Default extends DefaultValue<DateSource>> extends BaseSchema<DateSource, StandardDate, Required, Default> {
8
+ constructor(required: Required, defaultValue: Default);
9
+ convert(value: DateSource, pass: ValidationPass): StandardDate;
10
+ before(date: Date, message?: string): this;
11
+ after(date: Date, message?: string): this;
12
+ /**
13
+ * @param duration milliseconds
14
+ */
15
+ moreThanAgo(duration: number, message?: string): this;
16
+ /**
17
+ * @param duration milliseconds
18
+ */
19
+ lessThanAgo(duration: number, message?: string): this;
20
+ getJsonSchema(): object;
21
+ }
22
+ export {};
@@ -0,0 +1,17 @@
1
+ import type { DefaultValue, ModelValue, SourceValue } from "../typing/toolbox";
2
+ import { ValidationPass } from "../error/ValidationPass";
3
+ import { BaseSchemaAny } from "../typing/extended";
4
+ import { BaseSchema } from "./BaseSchema";
5
+ export type DynamicObjectSource<Subschema extends BaseSchemaAny> = ({
6
+ [Key: string]: (Subschema extends BaseSchema<infer Source, any, infer Required, infer Default> ? (SourceValue<Source, Required, Default>) : never);
7
+ });
8
+ export type DynamicObjectModel<Subschema extends BaseSchemaAny> = ({
9
+ [Key: string]: (Subschema extends BaseSchema<infer Source, infer Model, infer Required, infer Default> ? (ModelValue<Source, Model, Required, Default>) : never);
10
+ });
11
+ export declare class DynamicObjectSchema<Subschema extends BaseSchemaAny, Required extends boolean, Default extends DefaultValue<DynamicObjectSource<Subschema>>> extends BaseSchema<DynamicObjectSource<Subschema>, DynamicObjectModel<Subschema>, Required, Default> {
12
+ readonly subschema: Subschema;
13
+ constructor(subschema: Subschema, required: Required, defaultValue: Default);
14
+ validate(source: SourceValue<DynamicObjectSource<Subschema>, Required, Default>, pass?: ValidationPass): ModelValue<DynamicObjectSource<Subschema>, DynamicObjectModel<Subschema>, Required, Default>;
15
+ convert(source: DynamicObjectSource<Subschema>, pass: ValidationPass): DynamicObjectModel<Subschema>;
16
+ getJsonSchema(): object;
17
+ }
@@ -0,0 +1,10 @@
1
+ import { DefaultValue, ModelValue, SourceValue } from "../typing/toolbox";
2
+ import { ValidationPass } from "../error/ValidationPass";
3
+ import { BaseSchema } from "./BaseSchema";
4
+ export declare class EnumerationSchema<Members extends string[], Required extends boolean, Default extends DefaultValue<Members[number]>> extends BaseSchema<Members[number], Members[number], Required, Default> {
5
+ readonly members: Members;
6
+ constructor(members: Members, required: Required, defaultValue: Default);
7
+ validate(source: SourceValue<Members[number], Required, Default>, pass?: ValidationPass): ModelValue<Members[number], Members[number], Required, Default>;
8
+ convert(value: Members[number], pass: ValidationPass): Members[number];
9
+ getJsonSchema(): object;
10
+ }
@@ -0,0 +1,15 @@
1
+ import { DefaultValue } from "../typing/toolbox";
2
+ import { ValidationPass } from "../error/ValidationPass";
3
+ import { BaseSchema } from "./BaseSchema";
4
+ export type NumberSource = number | bigint | string | boolean | null | undefined | Date;
5
+ export declare class NumberSchema<Required extends boolean, Default extends DefaultValue<NumberSource>> extends BaseSchema<NumberSource, number, Required, Default> {
6
+ constructor(required: Required, defaultValue: Default);
7
+ convert(value: NumberSource, pass: ValidationPass): number;
8
+ min(minimum: number, message?: string): this;
9
+ max(maximum: number, message?: string): this;
10
+ clamp(minimum: number, maximum: number): this;
11
+ clamp(minimum: number, maximum: number, message: string): this;
12
+ clamp(minimum: number, maximum: number, tooShortMessage: string, tooLongMessage: string): this;
13
+ validNumber(notANumber?: boolean, message?: string): this;
14
+ getJsonSchema(): object;
15
+ }
@@ -0,0 +1,25 @@
1
+ import type { DefaultValue, Merge, ModelRequirement, ModelValue, SourceRequirement, SourceValue } from "../typing/toolbox";
2
+ import { ValidationPass } from "../error/ValidationPass";
3
+ import { BaseSchemaAny } from "../typing/extended";
4
+ import { BaseSchema } from "./BaseSchema";
5
+ export type ObjectSubschema = {
6
+ [Key: string]: BaseSchemaAny;
7
+ };
8
+ export type ObjectSource<Subschema extends ObjectSubschema> = (Merge<{
9
+ [Key in keyof Subschema as SourceRequirement<Subschema[Key]> extends true ? Key : never]: (Subschema[Key] extends BaseSchema<infer Source, any, infer Required, infer Default> ? (SourceValue<Source, Required, Default>) : never);
10
+ }, {
11
+ [Key in keyof Subschema as SourceRequirement<Subschema[Key]> extends false ? Key : never]?: (Subschema[Key] extends BaseSchema<infer Source, any, infer Required, infer Default> ? (SourceValue<Source, Required, Default>) : never);
12
+ }>);
13
+ export type ObjectModel<Subschema extends ObjectSubschema> = (Merge<{
14
+ [Key in keyof Subschema as ModelRequirement<Subschema[Key]> extends true ? Key : never]: (Subschema[Key] extends BaseSchema<infer Source, infer Model, infer Required, infer Default> ? (ModelValue<Source, Model, Required, Default>) : never);
15
+ }, {
16
+ [Key in keyof Subschema as ModelRequirement<Subschema[Key]> extends false ? Key : never]?: (Subschema[Key] extends BaseSchema<infer Source, infer Model, infer Required, infer Default> ? (ModelValue<Source, Model, Required, Default>) : never);
17
+ }>);
18
+ export declare class ObjectSchema<Subschema extends ObjectSubschema, Required extends boolean, Default extends DefaultValue<ObjectSource<Subschema>>> extends BaseSchema<ObjectSource<Subschema>, ObjectModel<Subschema>, Required, Default> {
19
+ readonly subschema: Subschema;
20
+ constructor(subschema: Subschema, required: Required, defaultValue: Default);
21
+ validate(source: SourceValue<ObjectSource<Subschema>, Required, Default>, pass?: ValidationPass): ModelValue<ObjectSource<Subschema>, ObjectModel<Subschema>, Required, Default>;
22
+ convert(value: ObjectSource<Subschema>, pass: ValidationPass): ObjectModel<Subschema>;
23
+ extend<ExtensionSubschema extends ObjectSubschema, ExtensionDefault extends DefaultValue<ObjectSource<ExtensionSubschema>>>(schema: ObjectSchema<ExtensionSubschema, Required, ExtensionDefault>): ObjectSchema<Subschema & ExtensionSubschema, Required, any>;
24
+ getJsonSchema(): object;
25
+ }
@@ -0,0 +1,17 @@
1
+ import { ValidationPass } from "../error/ValidationPass";
2
+ import { BaseSchemaAny } from "../typing/extended";
3
+ import { DefaultValue, ModelValue, SourceValue } from "../typing/toolbox";
4
+ import { BaseSchema } from "./BaseSchema";
5
+ export type OrSetSchemaSource<MemberSchemas extends BaseSchemaAny[]> = {
6
+ [Key in keyof MemberSchemas]: (MemberSchemas[Key] extends BaseSchema<infer Source, any, infer Required, infer Default> ? (SourceValue<Source, Required, Default>) : never);
7
+ }[number];
8
+ export type OrSetSchemaModel<MemberSchemas extends BaseSchemaAny[]> = ({
9
+ [Key in keyof MemberSchemas]: (MemberSchemas[Key] extends BaseSchema<infer Source, infer Model, infer Required, infer Default> ? (ModelValue<Source, Model, Required, Default>) : never);
10
+ })[number];
11
+ export declare class OrSetSchema<MemberSchemas extends BaseSchemaAny[], Required extends boolean, Default extends DefaultValue<OrSetSchemaSource<MemberSchemas>>> extends BaseSchema<OrSetSchemaSource<MemberSchemas>, OrSetSchemaModel<MemberSchemas>, Required, Default> {
12
+ readonly schemas: MemberSchemas;
13
+ constructor(schemas: MemberSchemas, required: Required, defaultValue: Default);
14
+ validate(source: SourceValue<OrSetSchemaSource<MemberSchemas>, Required, Default>, pass?: ValidationPass): ModelValue<OrSetSchemaSource<MemberSchemas>, OrSetSchemaModel<MemberSchemas>, Required, Default>;
15
+ convert(value: OrSetSchemaSource<MemberSchemas>, pass: ValidationPass): OrSetSchemaModel<MemberSchemas>;
16
+ getJsonSchema(): object;
17
+ }
@@ -0,0 +1,13 @@
1
+ import { ValidationPass } from "../error/ValidationPass";
2
+ import { AdditionalValidationPasses, DefaultValue } from "../typing/toolbox";
3
+ import { BaseSchema } from "./BaseSchema";
4
+ export type StringSource = string | number | boolean | null | undefined | Date;
5
+ export declare class StringSchema<Required extends boolean, Default extends DefaultValue<StringSource>> extends BaseSchema<StringSource, string, Required, Default> {
6
+ constructor(required: Required, defaultValue: Default, additionalValidationPasses?: AdditionalValidationPasses<StringSource, string>);
7
+ convert(value: StringSource, pass: ValidationPass): string;
8
+ length(minimum: number, maximum: number): this;
9
+ length(minimum: number, maximum: number, message: string): this;
10
+ length(minimum: number, maximum: number, tooShortMessage: string, tooLongMessage: string): this;
11
+ regex(expression: RegExp, message?: string): this;
12
+ getJsonSchema(): object;
13
+ }
@@ -0,0 +1,3 @@
1
+ import { BaseSchema } from "../schema/BaseSchema";
2
+ import { DefaultValue } from "./toolbox";
3
+ export type BaseSchemaAny = BaseSchema<any, any, boolean, DefaultValue<any>>;
@@ -0,0 +1,37 @@
1
+ import { ValidationPass } from "../error/ValidationPass";
2
+ import { BaseSchema } from "../schema/BaseSchema";
3
+ import { BaseSchemaAny } from "./extended";
4
+ export type SourceRequirement<Layout extends BaseSchemaAny> = (Layout extends BaseSchema<any, any, infer Required, infer Default> ? (Required extends true ? (Default extends undefined ? true : false) : (false)) : never);
5
+ export type SourceValue<Source, Required extends boolean, Default extends DefaultValue<Source>> = (Required extends true ? (undefined extends Default ? (Source) : (Source | undefined)) : Source | undefined);
6
+ export type ModelRequirement<Layout extends BaseSchemaAny> = (Layout extends BaseSchema<any, any, infer Required, infer Default> ? (Required extends true ? (true) : (Default extends undefined ? false : true)) : never);
7
+ export type ModelValue<Source, Model, Required extends boolean, Default extends DefaultValue<Source>> = (Required extends true ? Model : Default extends undefined ? Model | undefined : Model);
8
+ export type DefaultValue<Type> = undefined | Type | ((pass: ValidationPass) => Type);
9
+ export type TypedMembers<Members> = {
10
+ data: Members;
11
+ };
12
+ export type AdditionalValidatorBeforeType = ("beforeAll" | "beforeDefault" | "afterDefault");
13
+ export type AdditionalValidatorAfterType = ("beforeConversion" | "afterConversion" | "afterAll");
14
+ /**
15
+ * @note Types specifying when an additional validation pass is executed during the validation pipeline.
16
+ * - beforeAll: Validator executed directly on user's input, before default value evaluation and type conversions.
17
+ * - beforeDefault: Validator executed after "beforeAll" and right before default value evaluation.
18
+ * - afterDefault: Validator executed directly after default value evaluation and before type conversions.
19
+ * - beforeConversion: Validator executed after "afterDefault" and before type conversions.
20
+ * - afterConversion: Validator executed directly after type conversion.
21
+ * - afterAll: Validator executed after "afterConversion" and as the last task in the validation pipeline.
22
+ */
23
+ export type AdditionalValidatorType = AdditionalValidatorBeforeType | AdditionalValidatorAfterType;
24
+ export type AdditionalValidator<Type> = (data: Type, pass: ValidationPass) => Type;
25
+ /**
26
+ * Represents a pass to ensure that your data meets a condition. Return true if your data is ensured to meet condition, false otherwise.
27
+ */
28
+ export type EnsureValidator<Type> = (data: Type, pass: ValidationPass) => boolean;
29
+ export type AdditionalValidationPasses<Source, Model> = {
30
+ beforeAll: AdditionalValidator<Source>[];
31
+ beforeDefault: AdditionalValidator<Source>[];
32
+ afterDefault: AdditionalValidator<Source>[];
33
+ beforeConversion: AdditionalValidator<Model>[];
34
+ afterConversion: AdditionalValidator<Model>[];
35
+ afterAll: AdditionalValidator<Model>[];
36
+ };
37
+ export type Merge<ObjectA, ObjectB> = (keyof ObjectA extends never ? ObjectB : keyof ObjectB extends never ? ObjectA : ObjectA & ObjectB);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucania/schema",
3
- "version": "1.0.8",
3
+ "version": "2.0.1",
4
4
  "description": "A schema module for compile-time and runtime type checking.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -29,12 +29,12 @@
29
29
  },
30
30
  "homepage": "https://github.com/lucania-software/schema#readme",
31
31
  "devDependencies": {
32
- "@babel/preset-env": "^7.22.9",
33
- "@rollup/plugin-typescript": "^11.1.2",
34
- "@types/node": "^20.4.2",
35
- "nodemon": "^3.0.1",
36
- "rollup": "^3.26.3",
37
- "tslib": "^2.6.0",
38
- "typescript": "^5.1.6"
32
+ "@babel/preset-env": "^7.23.5",
33
+ "@rollup/plugin-typescript": "^11.1.5",
34
+ "@types/node": "^20.10.4",
35
+ "nodemon": "^3.0.2",
36
+ "rollup": "^4.6.1",
37
+ "tslib": "^2.6.2",
38
+ "typescript": "^5.3.3"
39
39
  }
40
40
  }