@muziehdesign/forms 0.0.1-alpha.36 → 0.0.1-alpha.55
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.
- package/esm2020/lib/constants.mjs +2 -2
- package/esm2020/lib/model-schema.factory.mjs +24 -24
- package/esm2020/lib/ng-form-model-state.service.mjs +59 -0
- package/esm2020/lib/type-annotations.mjs +42 -0
- package/esm2020/public-api.mjs +3 -2
- package/fesm2015/muziehdesign-forms.mjs +123 -56
- package/fesm2015/muziehdesign-forms.mjs.map +1 -1
- package/fesm2020/muziehdesign-forms.mjs +120 -56
- package/fesm2020/muziehdesign-forms.mjs.map +1 -1
- package/lib/constants.d.ts +1 -1
- package/lib/ng-form-model-state.service.d.ts +24 -0
- package/lib/type-annotations.d.ts +45 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -1
- package/esm2020/lib/string-schema.mjs +0 -27
- package/lib/string-schema.d.ts +0 -15
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:annotations';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXV6aWVoZGVzaWduL2Zvcm1zL3NyYy9saWIvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFNDSEVNQV9NRVRBREFUQV9OQU1FU1BBQ0UgPSAnY3VzdG9tOm11emllaGRlc2lnbjphbm5vdGF0aW9ucyc7XG4iXX0=
|
|
@@ -1,50 +1,50 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { object } from 'yup';
|
|
3
3
|
import { ModelValidator } from './model-validator';
|
|
4
4
|
import { SCHEMA_METADATA_NAMESPACE } from './constants';
|
|
5
|
-
import {
|
|
5
|
+
import { BooleanType, StringType } from './type-annotations';
|
|
6
|
+
import * as Yup from 'yup';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export class ModelSchemaFactory {
|
|
8
9
|
constructor() { }
|
|
9
10
|
build(model) {
|
|
10
11
|
const metadata = Reflect.getMetadata(SCHEMA_METADATA_NAMESPACE, model);
|
|
11
12
|
let shape = {};
|
|
12
|
-
metadata.forEach((
|
|
13
|
-
if (
|
|
14
|
-
shape[
|
|
13
|
+
metadata.forEach((value, key) => {
|
|
14
|
+
if (value.constraintType == StringType.name) {
|
|
15
|
+
shape[key] = this.buildStringSchema(value);
|
|
15
16
|
}
|
|
16
|
-
else if (
|
|
17
|
-
shape[
|
|
17
|
+
else if (value.constraintType == BooleanType.name) {
|
|
18
|
+
shape[key] = this.buildBooleanSchema(value);
|
|
18
19
|
}
|
|
19
20
|
});
|
|
20
21
|
const schema = object(shape);
|
|
21
22
|
return new ModelValidator(schema);
|
|
22
23
|
}
|
|
23
24
|
buildStringSchema(options) {
|
|
24
|
-
let
|
|
25
|
+
let schema = Yup.string();
|
|
25
26
|
if (options.required) {
|
|
26
|
-
|
|
27
|
+
schema = schema.required(options.required.message);
|
|
27
28
|
}
|
|
28
29
|
if (options.length) {
|
|
29
|
-
|
|
30
|
+
schema = schema.length(options.length.length, options.length.message);
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
stringSchema = stringSchema.min(options.minimum);
|
|
33
|
-
}
|
|
34
|
-
if (options.maximum) {
|
|
35
|
-
stringSchema = stringSchema.max(options.maximum);
|
|
36
|
-
}
|
|
37
|
-
return stringSchema;
|
|
32
|
+
return schema;
|
|
38
33
|
}
|
|
39
34
|
buildBooleanSchema(options) {
|
|
40
|
-
let
|
|
35
|
+
let schema = Yup.boolean();
|
|
36
|
+
if (options.required) {
|
|
37
|
+
schema = schema.required(options.required.message);
|
|
38
|
+
}
|
|
41
39
|
if (options.equals) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
if (options.equals.equals) {
|
|
41
|
+
schema = schema.isTrue(options.equals.message);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
schema = schema.isFalse(options.equals.message);
|
|
45
|
+
}
|
|
46
46
|
}
|
|
47
|
-
return
|
|
47
|
+
return schema;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
ModelSchemaFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: ModelSchemaFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -55,4 +55,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImpor
|
|
|
55
55
|
providedIn: 'root',
|
|
56
56
|
}]
|
|
57
57
|
}], ctorParameters: function () { return []; } });
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtc2NoZW1hLmZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tdXppZWhkZXNpZ24vZm9ybXMvc3JjL2xpYi9tb2RlbC1zY2hlbWEuZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQVksTUFBTSxLQUFLLENBQUM7QUFDdkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4RCxPQUFPLEVBQUUsV0FBVyxFQUFpRCxVQUFVLEVBQXlCLE1BQU0sb0JBQW9CLENBQUM7QUFDbkksT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7O0FBSzNCLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsZ0JBQWUsQ0FBQztJQUVoQixLQUFLLENBQUksS0FBUTtRQUNmLE1BQU0sUUFBUSxHQUF1QyxPQUFPLENBQUMsV0FBVyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNHLElBQUksS0FBSyxHQUFnQixFQUFFLENBQUM7UUFDNUIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUM5QixJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksVUFBVSxDQUFDLElBQUksRUFBRTtnQkFDM0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUE4QixDQUFDLENBQUM7YUFDckU7aUJBQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ25ELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBK0IsQ0FBQyxDQUFDO2FBQ3ZFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFnQixDQUFDO1FBQzVDLE9BQU8sSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQThCO1FBQ3RELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDcEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwRDtRQUNELElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE9BQStCO1FBQ3hELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDcEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwRDtRQUNELElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUN6QixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDakQ7U0FDRjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7OytHQTNDVSxrQkFBa0I7bUhBQWxCLGtCQUFrQixjQUZqQixNQUFNOzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBvYmplY3QsIFNjaGVtYU9mIH0gZnJvbSAneXVwJztcbmltcG9ydCB7IE1vZGVsVmFsaWRhdG9yIH0gZnJvbSAnLi9tb2RlbC12YWxpZGF0b3InO1xuaW1wb3J0IHsgU0NIRU1BX01FVEFEQVRBX05BTUVTUEFDRSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9iamVjdFNoYXBlIH0gZnJvbSAneXVwL2xpYi9vYmplY3QnO1xuaW1wb3J0IHsgQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlQW5ub3RhdGlvbnMsIENvbnN0cmFpbnRBbm5vdGF0aW9ucywgU3RyaW5nVHlwZSwgU3RyaW5nVHlwZUFubm90YXRpb25zIH0gZnJvbSAnLi90eXBlLWFubm90YXRpb25zJztcbmltcG9ydCAqIGFzIFl1cCBmcm9tICd5dXAnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTW9kZWxTY2hlbWFGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGJ1aWxkPFQ+KG1vZGVsOiBUKTogTW9kZWxWYWxpZGF0b3I8VD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBNYXA8c3RyaW5nLCBDb25zdHJhaW50QW5ub3RhdGlvbnM+ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShTQ0hFTUFfTUVUQURBVEFfTkFNRVNQQUNFLCBtb2RlbCk7XG4gICAgbGV0IHNoYXBlOiBPYmplY3RTaGFwZSA9IHt9O1xuICAgIG1ldGFkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmICh2YWx1ZS5jb25zdHJhaW50VHlwZSA9PSBTdHJpbmdUeXBlLm5hbWUpIHtcbiAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuYnVpbGRTdHJpbmdTY2hlbWEodmFsdWUgYXMgU3RyaW5nVHlwZUFubm90YXRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RyYWludFR5cGUgPT0gQm9vbGVhblR5cGUubmFtZSkge1xuICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5idWlsZEJvb2xlYW5TY2hlbWEodmFsdWUgYXMgQm9vbGVhblR5cGVBbm5vdGF0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2NoZW1hID0gb2JqZWN0KHNoYXBlKSBhcyBTY2hlbWFPZjxUPjtcbiAgICByZXR1cm4gbmV3IE1vZGVsVmFsaWRhdG9yKHNjaGVtYSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RyaW5nU2NoZW1hKG9wdGlvbnM6IFN0cmluZ1R5cGVBbm5vdGF0aW9ucykge1xuICAgIGxldCBzY2hlbWEgPSBZdXAuc3RyaW5nKCk7XG4gICAgaWYgKG9wdGlvbnMucmVxdWlyZWQpIHtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYS5yZXF1aXJlZChvcHRpb25zLnJlcXVpcmVkLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYS5sZW5ndGgob3B0aW9ucy5sZW5ndGgubGVuZ3RoLCBvcHRpb25zLmxlbmd0aC5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEJvb2xlYW5TY2hlbWEob3B0aW9uczogQm9vbGVhblR5cGVBbm5vdGF0aW9ucykge1xuICAgIGxldCBzY2hlbWEgPSBZdXAuYm9vbGVhbigpO1xuICAgIGlmIChvcHRpb25zLnJlcXVpcmVkKSB7XG4gICAgICBzY2hlbWEgPSBzY2hlbWEucmVxdWlyZWQob3B0aW9ucy5yZXF1aXJlZC5tZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZXF1YWxzKSB7XG4gICAgICBpZiAob3B0aW9ucy5lcXVhbHMuZXF1YWxzKSB7XG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYS5pc1RydWUob3B0aW9ucy5lcXVhbHMubWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSBzY2hlbWEuaXNGYWxzZShvcHRpb25zLmVxdWFscy5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, from, switchMap } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./model-schema.factory";
|
|
5
|
+
export class NgFormModelStateFactory {
|
|
6
|
+
constructor(factory) {
|
|
7
|
+
this.factory = factory;
|
|
8
|
+
}
|
|
9
|
+
create(form, model) {
|
|
10
|
+
const modelState = new NgFormModelState(form, this.factory.build(model), model);
|
|
11
|
+
return modelState;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
NgFormModelStateFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, deps: [{ token: i1.ModelSchemaFactory }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
15
|
+
NgFormModelStateFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, providedIn: 'root' });
|
|
16
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, decorators: [{
|
|
17
|
+
type: Injectable,
|
|
18
|
+
args: [{
|
|
19
|
+
providedIn: 'root',
|
|
20
|
+
}]
|
|
21
|
+
}], ctorParameters: function () { return [{ type: i1.ModelSchemaFactory }]; } });
|
|
22
|
+
export class NgFormModelState {
|
|
23
|
+
constructor(form, modelValidator, model) {
|
|
24
|
+
this.form = form;
|
|
25
|
+
this.modelValidator = modelValidator;
|
|
26
|
+
this.model = model;
|
|
27
|
+
this.errors = new BehaviorSubject([]);
|
|
28
|
+
this.errors$ = this.errors.asObservable();
|
|
29
|
+
this.form.form.valueChanges
|
|
30
|
+
.pipe(switchMap(async (x) => {
|
|
31
|
+
return from(this.runValidations());
|
|
32
|
+
}))
|
|
33
|
+
.subscribe();
|
|
34
|
+
this.errors$.subscribe((list) => {
|
|
35
|
+
console.log('all errors', list);
|
|
36
|
+
const grouped = list.reduce((grouped, v) => grouped.set(v.path, [...(grouped.get(v.path) || []), v]), new Map());
|
|
37
|
+
grouped.forEach((value, key) => {
|
|
38
|
+
let validationErrors = {};
|
|
39
|
+
value.forEach((v) => (validationErrors[v.type] = v.message));
|
|
40
|
+
this.form.controls[key].setErrors(validationErrors);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
isValid() {
|
|
45
|
+
return this.errors.value.length == 0;
|
|
46
|
+
}
|
|
47
|
+
setErrors(errors) {
|
|
48
|
+
this.errors.next(errors);
|
|
49
|
+
}
|
|
50
|
+
validate() {
|
|
51
|
+
return this.runValidations().then((x) => true);
|
|
52
|
+
}
|
|
53
|
+
async runValidations() {
|
|
54
|
+
console.log('validating', this.model);
|
|
55
|
+
const errors = await this.modelValidator.validate(this.model);
|
|
56
|
+
this.errors.next(errors);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybS1tb2RlbC1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXV6aWVoZGVzaWduL2Zvcm1zL3NyYy9saWIvbmctZm9ybS1tb2RlbC1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQVUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBUWhFLE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFBb0IsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7SUFBRyxDQUFDO0lBRW5ELE1BQU0sQ0FBSSxJQUFZLEVBQUUsS0FBUTtRQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLGdCQUFnQixDQUFJLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDOztvSEFOVSx1QkFBdUI7d0hBQXZCLHVCQUF1QixjQUZ0QixNQUFNOzJGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBVUQsTUFBTSxPQUFPLGdCQUFnQjtJQUkzQixZQUFvQixJQUFZLEVBQVUsY0FBaUMsRUFBVSxLQUFRO1FBQXpFLFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFHO1FBSHJGLFdBQU0sR0FBa0MsSUFBSSxlQUFlLENBQWUsRUFBRSxDQUFDLENBQUM7UUFDL0UsWUFBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFHMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTthQUN4QixJQUFJLENBQ0gsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsRUFBRSxDQUFDO1FBRWYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQXdCLENBQUMsQ0FBQztZQUV2SSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUM3QixJQUFJLGdCQUFnQixHQUFxQixFQUFFLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFvQjtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjO1FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOT19FUlJPUlNfU0NIRU1BIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0Zvcm0sIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZpbHRlciwgZnJvbSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGaWVsZEVycm9yIH0gZnJvbSAnLi9maWVsZC1lcnJvcic7XG5pbXBvcnQgeyBNb2RlbFNjaGVtYUZhY3RvcnkgfSBmcm9tICcuL21vZGVsLXNjaGVtYS5mYWN0b3J5JztcbmltcG9ydCB7IE1vZGVsVmFsaWRhdG9yIH0gZnJvbSAnLi9tb2RlbC12YWxpZGF0b3InO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmdGb3JtTW9kZWxTdGF0ZUZhY3Rvcnkge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZhY3Rvcnk6IE1vZGVsU2NoZW1hRmFjdG9yeSkge31cblxuICBjcmVhdGU8VD4oZm9ybTogTmdGb3JtLCBtb2RlbDogVCkge1xuICAgIGNvbnN0IG1vZGVsU3RhdGUgPSBuZXcgTmdGb3JtTW9kZWxTdGF0ZTxUPihmb3JtLCB0aGlzLmZhY3RvcnkuYnVpbGQobW9kZWwpLCBtb2RlbCk7XG4gICAgcmV0dXJuIG1vZGVsU3RhdGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5nRm9ybU1vZGVsU3RhdGU8VD4ge1xuICBwcml2YXRlIGVycm9yczogQmVoYXZpb3JTdWJqZWN0PEZpZWxkRXJyb3JbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpZWxkRXJyb3JbXT4oW10pO1xuICBwdWJsaWMgZXJyb3JzJCA9IHRoaXMuZXJyb3JzLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybTogTmdGb3JtLCBwcml2YXRlIG1vZGVsVmFsaWRhdG9yOiBNb2RlbFZhbGlkYXRvcjxUPiwgcHJpdmF0ZSBtb2RlbDogVCkge1xuICAgIHRoaXMuZm9ybS5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChhc3luYyAoeCkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMucnVuVmFsaWRhdGlvbnMoKSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmVycm9ycyQuc3Vic2NyaWJlKChsaXN0KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnYWxsIGVycm9ycycsIGxpc3QpO1xuXG4gICAgICBjb25zdCBncm91cGVkID0gbGlzdC5yZWR1Y2UoKGdyb3VwZWQsIHYpID0+IGdyb3VwZWQuc2V0KHYucGF0aCwgWy4uLihncm91cGVkLmdldCh2LnBhdGgpIHx8IFtdKSwgdl0pLCBuZXcgTWFwPHN0cmluZywgRmllbGRFcnJvcltdPigpKTtcblxuICAgICAgZ3JvdXBlZC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGxldCB2YWxpZGF0aW9uRXJyb3JzID0gPFZhbGlkYXRpb25FcnJvcnM+e307XG4gICAgICAgIHZhbHVlLmZvckVhY2goKHYpID0+ICh2YWxpZGF0aW9uRXJyb3JzW3YudHlwZV0gPSB2Lm1lc3NhZ2UpKTtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2tleV0uc2V0RXJyb3JzKHZhbGlkYXRpb25FcnJvcnMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy52YWx1ZS5sZW5ndGggPT0gMDtcbiAgfVxuXG4gIHNldEVycm9ycyhlcnJvcnM6IEZpZWxkRXJyb3JbXSkge1xuICAgIHRoaXMuZXJyb3JzLm5leHQoZXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJ1blZhbGlkYXRpb25zKCkudGhlbigoeCkgPT4gdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blZhbGlkYXRpb25zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCd2YWxpZGF0aW5nJywgdGhpcy5tb2RlbCk7XG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgdGhpcy5tb2RlbFZhbGlkYXRvci52YWxpZGF0ZSh0aGlzLm1vZGVsKTtcbiAgICB0aGlzLmVycm9ycy5uZXh0KGVycm9ycyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
const METADATA_KEY = 'custom:muziehdesign:annotations';
|
|
3
|
+
const registerMetadata = (target, propertyKey, constraint) => {
|
|
4
|
+
const metadata = Reflect.getMetadata(METADATA_KEY, target) || new Map();
|
|
5
|
+
metadata.set(propertyKey, constraint);
|
|
6
|
+
Reflect.defineMetadata(METADATA_KEY, metadata, target);
|
|
7
|
+
};
|
|
8
|
+
/*
|
|
9
|
+
export function OfValues<T>(values: T[], message?: string) {
|
|
10
|
+
return function (target: Object, propertyKey: string) {
|
|
11
|
+
const o = { values: values, message: message } as OfValuesAnnotations;
|
|
12
|
+
o.constraintType = OfValues.name;
|
|
13
|
+
registerMetadata(target, propertyKey, o);
|
|
14
|
+
};
|
|
15
|
+
}*/
|
|
16
|
+
export function StringType(...annotations) {
|
|
17
|
+
return function (target, propertyKey) {
|
|
18
|
+
const o = Object.assign({}, ...annotations);
|
|
19
|
+
o.constraintType = StringType.name;
|
|
20
|
+
registerMetadata(target, propertyKey, o);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function BooleanType(...annotations) {
|
|
24
|
+
return function (target, propertyKey) {
|
|
25
|
+
const o = Object.assign({}, ...annotations);
|
|
26
|
+
o.constraintType = BooleanType.name;
|
|
27
|
+
registerMetadata(target, propertyKey, o);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function required(message) {
|
|
31
|
+
return { required: { required: true, message: message } };
|
|
32
|
+
}
|
|
33
|
+
export function length(length, message) {
|
|
34
|
+
return { length: { length: length, message: message } };
|
|
35
|
+
}
|
|
36
|
+
export function ofValues(values, message) {
|
|
37
|
+
return { ofValues: { values: values, message: message } };
|
|
38
|
+
}
|
|
39
|
+
export function equals(value, message) {
|
|
40
|
+
return { equals: { equals: value, message: message } };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1hbm5vdGF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL211emllaGRlc2lnbi9mb3Jtcy9zcmMvbGliL3R5cGUtYW5ub3RhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQUsxQixNQUFNLFlBQVksR0FBRyxpQ0FBaUMsQ0FBQztBQTBDdkQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQWMsRUFBRSxXQUFtQixFQUFFLFVBQWlDLEVBQUUsRUFBRTtJQUNsRyxNQUFNLFFBQVEsR0FBcUIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQWUsQ0FBQztJQUN2RyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QyxPQUFPLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekQsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUVILE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBRyxXQUFzRDtJQUNsRixPQUFPLFVBQVUsTUFBYyxFQUFFLFdBQW1CO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsV0FBVyxDQUEwQixDQUFDO1FBQ3JFLENBQUMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUNuQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQUcsV0FBc0Q7SUFDbkYsT0FBTyxVQUFVLE1BQWMsRUFBRSxXQUFtQjtRQUNsRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBMkIsQ0FBQztRQUN0RSxDQUFDLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDcEMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxPQUFnQjtJQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztBQUM1RCxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUFjLEVBQUUsT0FBZ0I7SUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBVSxFQUFFLE9BQWdCO0lBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUFJLEtBQVEsRUFBRSxPQUFnQjtJQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7IEJvb2xlYW5TY2hlbWEsIFNjaGVtYU9mLCBTdHJpbmdTY2hlbWEgfSBmcm9tICd5dXAnO1xuaW1wb3J0IHsgUHJvcGVydHlTY2hlbWFNZXRhZGF0YSB9IGZyb20gJy4vcHJvcGVydHktc2NoZW1hLW1ldGFkYXRhJztcbmltcG9ydCB7IFByb3BlcnR5VHlwZSB9IGZyb20gJy4vcHJvcGVydHktdHlwZS5lbnVtJztcblxuY29uc3QgTUVUQURBVEFfS0VZID0gJ2N1c3RvbTptdXppZWhkZXNpZ246YW5ub3RhdGlvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cmFpbnRBbm5vdGF0aW9ucyB7XG4gIGNvbnN0cmFpbnRUeXBlOiBzdHJpbmc7XG59XG5cbi8qXG5leHBvcnQgaW50ZXJmYWNlIE9mVmFsdWVzQW5ub3RhdGlvbnMgZXh0ZW5kcyBDb25zdHJhaW50QW5ub3RhdGlvbnMge1xuICB2YWx1ZXM6IFtdO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufSovXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nVHlwZUFubm90YXRpb25zIGV4dGVuZHMgQ29uc3RyYWludEFubm90YXRpb25zIHtcbiAgcmVxdWlyZWQ/OiBSZXF1aXJlZEFubm90YXRpb247XG4gIGxlbmd0aDogTGVuZ3RoQW5ub3RhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb29sZWFuVHlwZUFubm90YXRpb25zIGV4dGVuZHMgQ29uc3RyYWludEFubm90YXRpb25zIHtcbiAgcmVxdWlyZWQ/OiBSZXF1aXJlZEFubm90YXRpb247XG4gIGVxdWFscz86IEVxdWFsc0Fubm90YXRpb248Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkFubm90YXRpb24ge1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVkQW5ub3RhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25Bbm5vdGF0aW9uIHtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGVuZ3RoQW5ub3RhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25Bbm5vdGF0aW9uIHtcbiAgbGVuZ3RoOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2ZWYWx1ZXNBbm5vdGF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvbkFubm90YXRpb24ge1xuICB2YWx1ZXM6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVxdWFsc0Fubm90YXRpb248VD4gZXh0ZW5kcyBWYWxpZGF0aW9uQW5ub3RhdGlvbiB7XG4gIGVxdWFsczogVDtcbn1cblxuY29uc3QgcmVnaXN0ZXJNZXRhZGF0YSA9ICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZywgY29uc3RyYWludDogQ29uc3RyYWludEFubm90YXRpb25zKSA9PiB7XG4gIGNvbnN0IG1ldGFkYXRhOiBNYXA8c3RyaW5nLCBhbnk+ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVksIHRhcmdldCkgfHwgbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgbWV0YWRhdGEuc2V0KHByb3BlcnR5S2V5LCBjb25zdHJhaW50KTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShNRVRBREFUQV9LRVksIG1ldGFkYXRhLCB0YXJnZXQpO1xufTtcblxuLypcbmV4cG9ydCBmdW5jdGlvbiBPZlZhbHVlczxUPih2YWx1ZXM6IFRbXSwgbWVzc2FnZT86IHN0cmluZykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgbyA9IHsgdmFsdWVzOiB2YWx1ZXMsIG1lc3NhZ2U6IG1lc3NhZ2UgfSBhcyBPZlZhbHVlc0Fubm90YXRpb25zO1xuICAgIG8uY29uc3RyYWludFR5cGUgPSBPZlZhbHVlcy5uYW1lO1xuICAgIHJlZ2lzdGVyTWV0YWRhdGEodGFyZ2V0LCBwcm9wZXJ0eUtleSwgbyk7XG4gIH07XG59Ki9cblxuZXhwb3J0IGZ1bmN0aW9uIFN0cmluZ1R5cGUoLi4uYW5ub3RhdGlvbnM6IHsgW2tleTogc3RyaW5nXTogVmFsaWRhdGlvbkFubm90YXRpb24gfVtdKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBvID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uYW5ub3RhdGlvbnMpIGFzIFN0cmluZ1R5cGVBbm5vdGF0aW9ucztcbiAgICBvLmNvbnN0cmFpbnRUeXBlID0gU3RyaW5nVHlwZS5uYW1lO1xuICAgIHJlZ2lzdGVyTWV0YWRhdGEodGFyZ2V0LCBwcm9wZXJ0eUtleSwgbyk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBCb29sZWFuVHlwZSguLi5hbm5vdGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBWYWxpZGF0aW9uQW5ub3RhdGlvbiB9W10pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykge1xuICAgIGNvbnN0IG8gPSBPYmplY3QuYXNzaWduKHt9LCAuLi5hbm5vdGF0aW9ucykgYXMgQm9vbGVhblR5cGVBbm5vdGF0aW9ucztcbiAgICBvLmNvbnN0cmFpbnRUeXBlID0gQm9vbGVhblR5cGUubmFtZTtcbiAgICByZWdpc3Rlck1ldGFkYXRhKHRhcmdldCwgcHJvcGVydHlLZXksIG8pO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQobWVzc2FnZT86IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogUmVxdWlyZWRBbm5vdGF0aW9uIH0ge1xuICByZXR1cm4geyByZXF1aXJlZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogbWVzc2FnZSB9IH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgobGVuZ3RoOiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IExlbmd0aEFubm90YXRpb24gfSB7XG4gIHJldHVybiB7IGxlbmd0aDogeyBsZW5ndGg6IGxlbmd0aCwgbWVzc2FnZTogbWVzc2FnZSB9IH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvZlZhbHVlcyh2YWx1ZXM6IFtdLCBtZXNzYWdlPzogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBPZlZhbHVlc0Fubm90YXRpb24gfSB7XG4gIHJldHVybiB7IG9mVmFsdWVzOiB7IHZhbHVlczogdmFsdWVzLCBtZXNzYWdlOiBtZXNzYWdlIH0gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsczxUPih2YWx1ZTogVCwgbWVzc2FnZT86IHN0cmluZykgOiB7IFtrZXk6IHN0cmluZ106IEVxdWFsc0Fubm90YXRpb248VD4gfSB7XG4gIHJldHVybiB7IGVxdWFsczogeyBlcXVhbHM6IHZhbHVlLCBtZXNzYWdlOiBtZXNzYWdlIH0gfTtcbn1cbiJdfQ==
|
package/esm2020/public-api.mjs
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
export * from './lib/field-error';
|
|
5
5
|
export * from './lib/model-schema.factory';
|
|
6
6
|
export * from './lib/model-validator';
|
|
7
|
-
export * from './lib/
|
|
7
|
+
export * from './lib/type-annotations';
|
|
8
8
|
export * from './lib/forms.module';
|
|
9
|
-
|
|
9
|
+
export * from './lib/ng-form-model-state.service';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL211emllaGRlc2lnbi9mb3Jtcy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBmb3Jtc1xuICovXG5leHBvcnQgKiBmcm9tICcuL2xpYi9maWVsZC1lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbC1zY2hlbWEuZmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbC12YWxpZGF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHlwZS1hbm5vdGF0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9mb3Jtcy5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbmctZm9ybS1tb2RlbC1zdGF0ZS5zZXJ2aWNlJztcbiJdfQ==
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, NgModule } from '@angular/core';
|
|
3
|
-
import
|
|
3
|
+
import * as Yup from 'yup';
|
|
4
|
+
import { object } from 'yup';
|
|
4
5
|
import 'reflect-metadata';
|
|
6
|
+
import { __awaiter } from 'tslib';
|
|
7
|
+
import { BehaviorSubject, switchMap, from } from 'rxjs';
|
|
5
8
|
|
|
6
9
|
class ModelValidator {
|
|
7
10
|
constructor(modelSchema) {
|
|
@@ -19,57 +22,89 @@ class ModelValidator {
|
|
|
19
22
|
}
|
|
20
23
|
}
|
|
21
24
|
|
|
22
|
-
const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:
|
|
25
|
+
const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:annotations';
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
const METADATA_KEY = 'custom:muziehdesign:annotations';
|
|
28
|
+
const registerMetadata = (target, propertyKey, constraint) => {
|
|
29
|
+
const metadata = Reflect.getMetadata(METADATA_KEY, target) || new Map();
|
|
30
|
+
metadata.set(propertyKey, constraint);
|
|
31
|
+
Reflect.defineMetadata(METADATA_KEY, metadata, target);
|
|
32
|
+
};
|
|
33
|
+
/*
|
|
34
|
+
export function OfValues<T>(values: T[], message?: string) {
|
|
35
|
+
return function (target: Object, propertyKey: string) {
|
|
36
|
+
const o = { values: values, message: message } as OfValuesAnnotations;
|
|
37
|
+
o.constraintType = OfValues.name;
|
|
38
|
+
registerMetadata(target, propertyKey, o);
|
|
39
|
+
};
|
|
40
|
+
}*/
|
|
41
|
+
function StringType(...annotations) {
|
|
42
|
+
return function (target, propertyKey) {
|
|
43
|
+
const o = Object.assign({}, ...annotations);
|
|
44
|
+
o.constraintType = StringType.name;
|
|
45
|
+
registerMetadata(target, propertyKey, o);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function BooleanType(...annotations) {
|
|
49
|
+
return function (target, propertyKey) {
|
|
50
|
+
const o = Object.assign({}, ...annotations);
|
|
51
|
+
o.constraintType = BooleanType.name;
|
|
52
|
+
registerMetadata(target, propertyKey, o);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function required(message) {
|
|
56
|
+
return { required: { required: true, message: message } };
|
|
57
|
+
}
|
|
58
|
+
function length(length, message) {
|
|
59
|
+
return { length: { length: length, message: message } };
|
|
60
|
+
}
|
|
61
|
+
function ofValues(values, message) {
|
|
62
|
+
return { ofValues: { values: values, message: message } };
|
|
63
|
+
}
|
|
64
|
+
function equals(value, message) {
|
|
65
|
+
return { equals: { equals: value, message: message } };
|
|
66
|
+
}
|
|
31
67
|
|
|
32
68
|
class ModelSchemaFactory {
|
|
33
69
|
constructor() { }
|
|
34
70
|
build(model) {
|
|
35
71
|
const metadata = Reflect.getMetadata(SCHEMA_METADATA_NAMESPACE, model);
|
|
36
72
|
let shape = {};
|
|
37
|
-
metadata.forEach((
|
|
38
|
-
if (
|
|
39
|
-
shape[
|
|
73
|
+
metadata.forEach((value, key) => {
|
|
74
|
+
if (value.constraintType == StringType.name) {
|
|
75
|
+
shape[key] = this.buildStringSchema(value);
|
|
40
76
|
}
|
|
41
|
-
else if (
|
|
42
|
-
shape[
|
|
77
|
+
else if (value.constraintType == BooleanType.name) {
|
|
78
|
+
shape[key] = this.buildBooleanSchema(value);
|
|
43
79
|
}
|
|
44
80
|
});
|
|
45
81
|
const schema = object(shape);
|
|
46
82
|
return new ModelValidator(schema);
|
|
47
83
|
}
|
|
48
84
|
buildStringSchema(options) {
|
|
49
|
-
let
|
|
85
|
+
let schema = Yup.string();
|
|
50
86
|
if (options.required) {
|
|
51
|
-
|
|
87
|
+
schema = schema.required(options.required.message);
|
|
52
88
|
}
|
|
53
89
|
if (options.length) {
|
|
54
|
-
|
|
90
|
+
schema = schema.length(options.length.length, options.length.message);
|
|
55
91
|
}
|
|
56
|
-
|
|
57
|
-
stringSchema = stringSchema.min(options.minimum);
|
|
58
|
-
}
|
|
59
|
-
if (options.maximum) {
|
|
60
|
-
stringSchema = stringSchema.max(options.maximum);
|
|
61
|
-
}
|
|
62
|
-
return stringSchema;
|
|
92
|
+
return schema;
|
|
63
93
|
}
|
|
64
94
|
buildBooleanSchema(options) {
|
|
65
|
-
let
|
|
95
|
+
let schema = Yup.boolean();
|
|
96
|
+
if (options.required) {
|
|
97
|
+
schema = schema.required(options.required.message);
|
|
98
|
+
}
|
|
66
99
|
if (options.equals) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
100
|
+
if (options.equals.equals) {
|
|
101
|
+
schema = schema.isTrue(options.equals.message);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
schema = schema.isFalse(options.equals.message);
|
|
105
|
+
}
|
|
71
106
|
}
|
|
72
|
-
return
|
|
107
|
+
return schema;
|
|
73
108
|
}
|
|
74
109
|
}
|
|
75
110
|
ModelSchemaFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: ModelSchemaFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -81,31 +116,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImpor
|
|
|
81
116
|
}]
|
|
82
117
|
}], ctorParameters: function () { return []; } });
|
|
83
118
|
|
|
84
|
-
function StringSchema(options) {
|
|
85
|
-
return function (target, propertyKey) {
|
|
86
|
-
const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];
|
|
87
|
-
metadata.push({
|
|
88
|
-
name: propertyKey,
|
|
89
|
-
type: PropertyType.string,
|
|
90
|
-
options: options,
|
|
91
|
-
});
|
|
92
|
-
// TODO: define on property
|
|
93
|
-
Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
function BooleanSchema(options) {
|
|
97
|
-
return function (target, propertyKey) {
|
|
98
|
-
const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];
|
|
99
|
-
metadata.push({
|
|
100
|
-
name: propertyKey,
|
|
101
|
-
type: PropertyType.boolean,
|
|
102
|
-
options: options,
|
|
103
|
-
});
|
|
104
|
-
// TODO: define on property
|
|
105
|
-
Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
|
|
109
119
|
class FormsModule {
|
|
110
120
|
}
|
|
111
121
|
FormsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: FormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
@@ -118,6 +128,63 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImpor
|
|
|
118
128
|
}]
|
|
119
129
|
}] });
|
|
120
130
|
|
|
131
|
+
class NgFormModelStateFactory {
|
|
132
|
+
constructor(factory) {
|
|
133
|
+
this.factory = factory;
|
|
134
|
+
}
|
|
135
|
+
create(form, model) {
|
|
136
|
+
const modelState = new NgFormModelState(form, this.factory.build(model), model);
|
|
137
|
+
return modelState;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
NgFormModelStateFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, deps: [{ token: ModelSchemaFactory }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
141
|
+
NgFormModelStateFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, providedIn: 'root' });
|
|
142
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, decorators: [{
|
|
143
|
+
type: Injectable,
|
|
144
|
+
args: [{
|
|
145
|
+
providedIn: 'root',
|
|
146
|
+
}]
|
|
147
|
+
}], ctorParameters: function () { return [{ type: ModelSchemaFactory }]; } });
|
|
148
|
+
class NgFormModelState {
|
|
149
|
+
constructor(form, modelValidator, model) {
|
|
150
|
+
this.form = form;
|
|
151
|
+
this.modelValidator = modelValidator;
|
|
152
|
+
this.model = model;
|
|
153
|
+
this.errors = new BehaviorSubject([]);
|
|
154
|
+
this.errors$ = this.errors.asObservable();
|
|
155
|
+
this.form.form.valueChanges
|
|
156
|
+
.pipe(switchMap((x) => __awaiter(this, void 0, void 0, function* () {
|
|
157
|
+
return from(this.runValidations());
|
|
158
|
+
})))
|
|
159
|
+
.subscribe();
|
|
160
|
+
this.errors$.subscribe((list) => {
|
|
161
|
+
console.log('all errors', list);
|
|
162
|
+
const grouped = list.reduce((grouped, v) => grouped.set(v.path, [...(grouped.get(v.path) || []), v]), new Map());
|
|
163
|
+
grouped.forEach((value, key) => {
|
|
164
|
+
let validationErrors = {};
|
|
165
|
+
value.forEach((v) => (validationErrors[v.type] = v.message));
|
|
166
|
+
this.form.controls[key].setErrors(validationErrors);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
isValid() {
|
|
171
|
+
return this.errors.value.length == 0;
|
|
172
|
+
}
|
|
173
|
+
setErrors(errors) {
|
|
174
|
+
this.errors.next(errors);
|
|
175
|
+
}
|
|
176
|
+
validate() {
|
|
177
|
+
return this.runValidations().then((x) => true);
|
|
178
|
+
}
|
|
179
|
+
runValidations() {
|
|
180
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
181
|
+
console.log('validating', this.model);
|
|
182
|
+
const errors = yield this.modelValidator.validate(this.model);
|
|
183
|
+
this.errors.next(errors);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
121
188
|
/*
|
|
122
189
|
* Public API Surface of forms
|
|
123
190
|
*/
|
|
@@ -126,5 +193,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImpor
|
|
|
126
193
|
* Generated bundle index. Do not edit.
|
|
127
194
|
*/
|
|
128
195
|
|
|
129
|
-
export {
|
|
196
|
+
export { BooleanType, FormsModule, ModelSchemaFactory, ModelValidator, NgFormModelState, NgFormModelStateFactory, StringType, equals, length, ofValues, required };
|
|
130
197
|
//# sourceMappingURL=muziehdesign-forms.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muziehdesign-forms.mjs","sources":["../../../../projects/muziehdesign/forms/src/lib/model-validator.ts","../../../../projects/muziehdesign/forms/src/lib/constants.ts","../../../../projects/muziehdesign/forms/src/lib/property-type.enum.ts","../../../../projects/muziehdesign/forms/src/lib/model-schema.factory.ts","../../../../projects/muziehdesign/forms/src/lib/string-schema.ts","../../../../projects/muziehdesign/forms/src/lib/forms.module.ts","../../../../projects/muziehdesign/forms/src/public-api.ts","../../../../projects/muziehdesign/forms/src/muziehdesign-forms.ts"],"sourcesContent":["import { SchemaOf, ValidationError } from 'yup';\nimport { FieldError } from './field-error';\n\nexport class ModelValidator<T> {\n private schema: SchemaOf<T>;\n constructor(modelSchema: SchemaOf<T>) {\n this.schema = modelSchema;\n }\n\n validate<T>(model: T): Promise<FieldError[]> {\n return this.schema\n .validate(model, { abortEarly: false })\n .then(() => {\n return [];\n })\n .catch((e: ValidationError) => {\n return e.inner.map((error) => <FieldError>{ path: error.path, type: error.type, message: error.message });\n });\n }\n}\n","export const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:schema';\n","export enum PropertyType {\n string,\n number,\n array,\n boolean\n}\n","import { Injectable } from '@angular/core';\nimport { boolean, object, SchemaOf, string } from 'yup';\nimport { ModelValidator } from './model-validator';\nimport { BooleanSchemaOptions, SchemaOptions, StringSchemaOptions } from './string-schema';\nimport { SCHEMA_METADATA_NAMESPACE } from './constants';\nimport { ObjectShape } from 'yup/lib/object';\nimport { PropertySchemaMetadata } from './property-schema-metadata';\nimport { PropertyType } from './property-type.enum';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ModelSchemaFactory {\n constructor() {}\n\n build<T>(model: T): ModelValidator<T> {\n const metadata: PropertySchemaMetadata<SchemaOptions>[] = Reflect.getMetadata(SCHEMA_METADATA_NAMESPACE, model);\n let shape: ObjectShape = {};\n metadata.forEach((element) => {\n if (element.type == PropertyType.string) {\n shape[element.name] = this.buildStringSchema(element.options || {});\n } else if(element.type == PropertyType.boolean) {\n shape[element.name] = this.buildBooleanSchema(element.options || {});\n }\n });\n const schema = object(shape) as SchemaOf<T>;\n return new ModelValidator(schema);\n }\n\n private buildStringSchema(options: StringSchemaOptions) {\n let stringSchema = string();\n if (options.required) {\n stringSchema = stringSchema.required();\n }\n if (options.length) {\n stringSchema = stringSchema.length(options.length);\n }\n if (options.minimum) {\n stringSchema = stringSchema.min(options.minimum);\n }\n if (options.maximum) {\n stringSchema = stringSchema.max(options.maximum);\n }\n\n return stringSchema;\n }\n\n private buildBooleanSchema(options: BooleanSchemaOptions) {\n let booleanSchema = boolean();\n if(options.equals) {\n return booleanSchema.test({\n name: 'mustBe',\n test: (value)=> value == options.equals\n });\n }\n\n return booleanSchema;\n }\n}\n","import 'reflect-metadata';\nimport { PropertySchemaMetadata } from './property-schema-metadata';\nimport { PropertyType } from './property-type.enum';\n\nexport interface StringSchemaOptions extends SchemaOptions {\n length?: number;\n minimum?: number;\n maximum?: number;\n pattern?: RegExp;\n}\nexport interface SchemaOptions {\n required?: boolean;\n}\n\nexport function StringSchema(options?: StringSchemaOptions) {\n return function (target: Object, propertyKey: string | Symbol) {\n const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];\n metadata.push(<PropertySchemaMetadata<StringSchemaOptions>>{\n name: propertyKey,\n type: PropertyType.string,\n options: options,\n });\n // TODO: define on property\n Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);\n };\n}\n\nexport interface BooleanSchemaOptions extends SchemaOptions {\n equals?: boolean;\n}\n\nexport function BooleanSchema(options?: BooleanSchemaOptions) {\n return function (target: Object, propertyKey: string | Symbol) {\n const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];\n metadata.push(<PropertySchemaMetadata<StringSchemaOptions>>{\n name: propertyKey,\n type: PropertyType.boolean,\n options: options,\n });\n // TODO: define on property\n Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);\n };\n}\n","import { NgModule } from '@angular/core';\n\n\n\n@NgModule({\n providers: []\n})\nexport class FormsModule { }\n","/*\n * Public API Surface of forms\n */\nexport * from './lib/field-error';\nexport * from './lib/model-schema.factory';\nexport * from './lib/model-validator';\nexport * from './lib/string-schema';\nexport * from './lib/forms.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"muziehdesign-forms.mjs","sources":["../../../../projects/muziehdesign/forms/src/lib/model-validator.ts","../../../../projects/muziehdesign/forms/src/lib/constants.ts","../../../../projects/muziehdesign/forms/src/lib/type-annotations.ts","../../../../projects/muziehdesign/forms/src/lib/model-schema.factory.ts","../../../../projects/muziehdesign/forms/src/lib/forms.module.ts","../../../../projects/muziehdesign/forms/src/lib/ng-form-model-state.service.ts","../../../../projects/muziehdesign/forms/src/public-api.ts","../../../../projects/muziehdesign/forms/src/muziehdesign-forms.ts"],"sourcesContent":["import { SchemaOf, ValidationError } from 'yup';\nimport { FieldError } from './field-error';\n\nexport class ModelValidator<T> {\n private schema: SchemaOf<T>;\n constructor(modelSchema: SchemaOf<T>) {\n this.schema = modelSchema;\n }\n\n validate<T>(model: T): Promise<FieldError[]> {\n return this.schema\n .validate(model, { abortEarly: false })\n .then(() => {\n return [];\n })\n .catch((e: ValidationError) => {\n return e.inner.map((error) => <FieldError>{ path: error.path, type: error.type, message: error.message });\n });\n }\n}\n","export const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:annotations';\n","import 'reflect-metadata';\nimport { BooleanSchema, SchemaOf, StringSchema } from 'yup';\nimport { PropertySchemaMetadata } from './property-schema-metadata';\nimport { PropertyType } from './property-type.enum';\n\nconst METADATA_KEY = 'custom:muziehdesign:annotations';\n\nexport interface ConstraintAnnotations {\n constraintType: string;\n}\n\n/*\nexport interface OfValuesAnnotations extends ConstraintAnnotations {\n values: [];\n message?: string;\n}*/\n\nexport interface StringTypeAnnotations extends ConstraintAnnotations {\n required?: RequiredAnnotation;\n length: LengthAnnotation;\n}\n\nexport interface BooleanTypeAnnotations extends ConstraintAnnotations {\n required?: RequiredAnnotation;\n equals?: EqualsAnnotation<boolean>;\n}\n\nexport interface ValidationAnnotation {\n message?: string;\n}\n\nexport interface RequiredAnnotation extends ValidationAnnotation {\n required: boolean;\n}\n\nexport interface LengthAnnotation extends ValidationAnnotation {\n length: number;\n}\n\nexport interface OfValuesAnnotation extends ValidationAnnotation {\n values: [];\n}\n\nexport interface EqualsAnnotation<T> extends ValidationAnnotation {\n equals: T;\n}\n\nconst registerMetadata = (target: Object, propertyKey: string, constraint: ConstraintAnnotations) => {\n const metadata: Map<string, any> = Reflect.getMetadata(METADATA_KEY, target) || new Map<string, any>();\n metadata.set(propertyKey, constraint);\n Reflect.defineMetadata(METADATA_KEY, metadata, target);\n};\n\n/*\nexport function OfValues<T>(values: T[], message?: string) {\n return function (target: Object, propertyKey: string) {\n const o = { values: values, message: message } as OfValuesAnnotations;\n o.constraintType = OfValues.name;\n registerMetadata(target, propertyKey, o);\n };\n}*/\n\nexport function StringType(...annotations: { [key: string]: ValidationAnnotation }[]) {\n return function (target: Object, propertyKey: string) {\n const o = Object.assign({}, ...annotations) as StringTypeAnnotations;\n o.constraintType = StringType.name;\n registerMetadata(target, propertyKey, o);\n };\n}\n\nexport function BooleanType(...annotations: { [key: string]: ValidationAnnotation }[]) {\n return function (target: Object, propertyKey: string) {\n const o = Object.assign({}, ...annotations) as BooleanTypeAnnotations;\n o.constraintType = BooleanType.name;\n registerMetadata(target, propertyKey, o);\n };\n}\n\nexport function required(message?: string): { [key: string]: RequiredAnnotation } {\n return { required: { required: true, message: message } };\n}\n\nexport function length(length: number, message?: string): { [key: string]: LengthAnnotation } {\n return { length: { length: length, message: message } };\n}\n\nexport function ofValues(values: [], message?: string): { [key: string]: OfValuesAnnotation } {\n return { ofValues: { values: values, message: message } };\n}\n\nexport function equals<T>(value: T, message?: string) : { [key: string]: EqualsAnnotation<T> } {\n return { equals: { equals: value, message: message } };\n}\n","import { Injectable } from '@angular/core';\nimport { object, SchemaOf } from 'yup';\nimport { ModelValidator } from './model-validator';\nimport { SCHEMA_METADATA_NAMESPACE } from './constants';\nimport { ObjectShape } from 'yup/lib/object';\nimport { BooleanType, BooleanTypeAnnotations, ConstraintAnnotations, StringType, StringTypeAnnotations } from './type-annotations';\nimport * as Yup from 'yup';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ModelSchemaFactory {\n constructor() {}\n\n build<T>(model: T): ModelValidator<T> {\n const metadata: Map<string, ConstraintAnnotations> = Reflect.getMetadata(SCHEMA_METADATA_NAMESPACE, model);\n let shape: ObjectShape = {};\n metadata.forEach((value, key) => {\n if (value.constraintType == StringType.name) {\n shape[key] = this.buildStringSchema(value as StringTypeAnnotations);\n } else if (value.constraintType == BooleanType.name) {\n shape[key] = this.buildBooleanSchema(value as BooleanTypeAnnotations);\n }\n });\n const schema = object(shape) as SchemaOf<T>;\n return new ModelValidator(schema);\n }\n\n private buildStringSchema(options: StringTypeAnnotations) {\n let schema = Yup.string();\n if (options.required) {\n schema = schema.required(options.required.message);\n }\n if (options.length) {\n schema = schema.length(options.length.length, options.length.message);\n }\n\n return schema;\n }\n\n private buildBooleanSchema(options: BooleanTypeAnnotations) {\n let schema = Yup.boolean();\n if (options.required) {\n schema = schema.required(options.required.message);\n }\n if (options.equals) {\n if (options.equals.equals) {\n schema = schema.isTrue(options.equals.message);\n } else {\n schema = schema.isFalse(options.equals.message);\n }\n }\n\n return schema;\n }\n}\n","import { NgModule } from '@angular/core';\n\n\n\n@NgModule({\n providers: []\n})\nexport class FormsModule { }\n","import { Injectable, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { NgForm, ValidationErrors } from '@angular/forms';\nimport { BehaviorSubject, filter, from, switchMap } from 'rxjs';\nimport { FieldError } from './field-error';\nimport { ModelSchemaFactory } from './model-schema.factory';\nimport { ModelValidator } from './model-validator';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgFormModelStateFactory {\n constructor(private factory: ModelSchemaFactory) {}\n\n create<T>(form: NgForm, model: T) {\n const modelState = new NgFormModelState<T>(form, this.factory.build(model), model);\n return modelState;\n }\n}\n\nexport class NgFormModelState<T> {\n private errors: BehaviorSubject<FieldError[]> = new BehaviorSubject<FieldError[]>([]);\n public errors$ = this.errors.asObservable();\n\n constructor(private form: NgForm, private modelValidator: ModelValidator<T>, private model: T) {\n this.form.form.valueChanges\n .pipe(\n switchMap(async (x) => {\n return from(this.runValidations());\n })\n )\n .subscribe();\n\n this.errors$.subscribe((list) => {\n console.log('all errors', list);\n\n const grouped = list.reduce((grouped, v) => grouped.set(v.path, [...(grouped.get(v.path) || []), v]), new Map<string, FieldError[]>());\n\n grouped.forEach((value, key) => {\n let validationErrors = <ValidationErrors>{};\n value.forEach((v) => (validationErrors[v.type] = v.message));\n this.form.controls[key].setErrors(validationErrors);\n });\n });\n }\n\n isValid(): boolean {\n return this.errors.value.length == 0;\n }\n\n setErrors(errors: FieldError[]) {\n this.errors.next(errors);\n }\n\n validate(): Promise<boolean> {\n return this.runValidations().then((x) => true);\n }\n\n private async runValidations(): Promise<void> {\n console.log('validating', this.model);\n const errors = await this.modelValidator.validate(this.model);\n this.errors.next(errors);\n }\n}\n","/*\n * Public API Surface of forms\n */\nexport * from './lib/field-error';\nexport * from './lib/model-schema.factory';\nexport * from './lib/model-validator';\nexport * from './lib/type-annotations';\nexport * from './lib/forms.module';\nexport * from './lib/ng-form-model-state.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ModelSchemaFactory"],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Injectable, NgModule } from '@angular/core';
|
|
3
|
-
import
|
|
3
|
+
import * as Yup from 'yup';
|
|
4
|
+
import { object } from 'yup';
|
|
4
5
|
import 'reflect-metadata';
|
|
6
|
+
import { BehaviorSubject, switchMap, from } from 'rxjs';
|
|
5
7
|
|
|
6
8
|
class ModelValidator {
|
|
7
9
|
constructor(modelSchema) {
|
|
@@ -19,57 +21,89 @@ class ModelValidator {
|
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:
|
|
24
|
+
const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:annotations';
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
const METADATA_KEY = 'custom:muziehdesign:annotations';
|
|
27
|
+
const registerMetadata = (target, propertyKey, constraint) => {
|
|
28
|
+
const metadata = Reflect.getMetadata(METADATA_KEY, target) || new Map();
|
|
29
|
+
metadata.set(propertyKey, constraint);
|
|
30
|
+
Reflect.defineMetadata(METADATA_KEY, metadata, target);
|
|
31
|
+
};
|
|
32
|
+
/*
|
|
33
|
+
export function OfValues<T>(values: T[], message?: string) {
|
|
34
|
+
return function (target: Object, propertyKey: string) {
|
|
35
|
+
const o = { values: values, message: message } as OfValuesAnnotations;
|
|
36
|
+
o.constraintType = OfValues.name;
|
|
37
|
+
registerMetadata(target, propertyKey, o);
|
|
38
|
+
};
|
|
39
|
+
}*/
|
|
40
|
+
function StringType(...annotations) {
|
|
41
|
+
return function (target, propertyKey) {
|
|
42
|
+
const o = Object.assign({}, ...annotations);
|
|
43
|
+
o.constraintType = StringType.name;
|
|
44
|
+
registerMetadata(target, propertyKey, o);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function BooleanType(...annotations) {
|
|
48
|
+
return function (target, propertyKey) {
|
|
49
|
+
const o = Object.assign({}, ...annotations);
|
|
50
|
+
o.constraintType = BooleanType.name;
|
|
51
|
+
registerMetadata(target, propertyKey, o);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function required(message) {
|
|
55
|
+
return { required: { required: true, message: message } };
|
|
56
|
+
}
|
|
57
|
+
function length(length, message) {
|
|
58
|
+
return { length: { length: length, message: message } };
|
|
59
|
+
}
|
|
60
|
+
function ofValues(values, message) {
|
|
61
|
+
return { ofValues: { values: values, message: message } };
|
|
62
|
+
}
|
|
63
|
+
function equals(value, message) {
|
|
64
|
+
return { equals: { equals: value, message: message } };
|
|
65
|
+
}
|
|
31
66
|
|
|
32
67
|
class ModelSchemaFactory {
|
|
33
68
|
constructor() { }
|
|
34
69
|
build(model) {
|
|
35
70
|
const metadata = Reflect.getMetadata(SCHEMA_METADATA_NAMESPACE, model);
|
|
36
71
|
let shape = {};
|
|
37
|
-
metadata.forEach((
|
|
38
|
-
if (
|
|
39
|
-
shape[
|
|
72
|
+
metadata.forEach((value, key) => {
|
|
73
|
+
if (value.constraintType == StringType.name) {
|
|
74
|
+
shape[key] = this.buildStringSchema(value);
|
|
40
75
|
}
|
|
41
|
-
else if (
|
|
42
|
-
shape[
|
|
76
|
+
else if (value.constraintType == BooleanType.name) {
|
|
77
|
+
shape[key] = this.buildBooleanSchema(value);
|
|
43
78
|
}
|
|
44
79
|
});
|
|
45
80
|
const schema = object(shape);
|
|
46
81
|
return new ModelValidator(schema);
|
|
47
82
|
}
|
|
48
83
|
buildStringSchema(options) {
|
|
49
|
-
let
|
|
84
|
+
let schema = Yup.string();
|
|
50
85
|
if (options.required) {
|
|
51
|
-
|
|
86
|
+
schema = schema.required(options.required.message);
|
|
52
87
|
}
|
|
53
88
|
if (options.length) {
|
|
54
|
-
|
|
89
|
+
schema = schema.length(options.length.length, options.length.message);
|
|
55
90
|
}
|
|
56
|
-
|
|
57
|
-
stringSchema = stringSchema.min(options.minimum);
|
|
58
|
-
}
|
|
59
|
-
if (options.maximum) {
|
|
60
|
-
stringSchema = stringSchema.max(options.maximum);
|
|
61
|
-
}
|
|
62
|
-
return stringSchema;
|
|
91
|
+
return schema;
|
|
63
92
|
}
|
|
64
93
|
buildBooleanSchema(options) {
|
|
65
|
-
let
|
|
94
|
+
let schema = Yup.boolean();
|
|
95
|
+
if (options.required) {
|
|
96
|
+
schema = schema.required(options.required.message);
|
|
97
|
+
}
|
|
66
98
|
if (options.equals) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
99
|
+
if (options.equals.equals) {
|
|
100
|
+
schema = schema.isTrue(options.equals.message);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
schema = schema.isFalse(options.equals.message);
|
|
104
|
+
}
|
|
71
105
|
}
|
|
72
|
-
return
|
|
106
|
+
return schema;
|
|
73
107
|
}
|
|
74
108
|
}
|
|
75
109
|
ModelSchemaFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: ModelSchemaFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -81,31 +115,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImpor
|
|
|
81
115
|
}]
|
|
82
116
|
}], ctorParameters: function () { return []; } });
|
|
83
117
|
|
|
84
|
-
function StringSchema(options) {
|
|
85
|
-
return function (target, propertyKey) {
|
|
86
|
-
const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];
|
|
87
|
-
metadata.push({
|
|
88
|
-
name: propertyKey,
|
|
89
|
-
type: PropertyType.string,
|
|
90
|
-
options: options,
|
|
91
|
-
});
|
|
92
|
-
// TODO: define on property
|
|
93
|
-
Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
function BooleanSchema(options) {
|
|
97
|
-
return function (target, propertyKey) {
|
|
98
|
-
const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];
|
|
99
|
-
metadata.push({
|
|
100
|
-
name: propertyKey,
|
|
101
|
-
type: PropertyType.boolean,
|
|
102
|
-
options: options,
|
|
103
|
-
});
|
|
104
|
-
// TODO: define on property
|
|
105
|
-
Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
|
|
109
118
|
class FormsModule {
|
|
110
119
|
}
|
|
111
120
|
FormsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: FormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
@@ -118,6 +127,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImpor
|
|
|
118
127
|
}]
|
|
119
128
|
}] });
|
|
120
129
|
|
|
130
|
+
class NgFormModelStateFactory {
|
|
131
|
+
constructor(factory) {
|
|
132
|
+
this.factory = factory;
|
|
133
|
+
}
|
|
134
|
+
create(form, model) {
|
|
135
|
+
const modelState = new NgFormModelState(form, this.factory.build(model), model);
|
|
136
|
+
return modelState;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
NgFormModelStateFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, deps: [{ token: ModelSchemaFactory }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
140
|
+
NgFormModelStateFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, providedIn: 'root' });
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: NgFormModelStateFactory, decorators: [{
|
|
142
|
+
type: Injectable,
|
|
143
|
+
args: [{
|
|
144
|
+
providedIn: 'root',
|
|
145
|
+
}]
|
|
146
|
+
}], ctorParameters: function () { return [{ type: ModelSchemaFactory }]; } });
|
|
147
|
+
class NgFormModelState {
|
|
148
|
+
constructor(form, modelValidator, model) {
|
|
149
|
+
this.form = form;
|
|
150
|
+
this.modelValidator = modelValidator;
|
|
151
|
+
this.model = model;
|
|
152
|
+
this.errors = new BehaviorSubject([]);
|
|
153
|
+
this.errors$ = this.errors.asObservable();
|
|
154
|
+
this.form.form.valueChanges
|
|
155
|
+
.pipe(switchMap(async (x) => {
|
|
156
|
+
return from(this.runValidations());
|
|
157
|
+
}))
|
|
158
|
+
.subscribe();
|
|
159
|
+
this.errors$.subscribe((list) => {
|
|
160
|
+
console.log('all errors', list);
|
|
161
|
+
const grouped = list.reduce((grouped, v) => grouped.set(v.path, [...(grouped.get(v.path) || []), v]), new Map());
|
|
162
|
+
grouped.forEach((value, key) => {
|
|
163
|
+
let validationErrors = {};
|
|
164
|
+
value.forEach((v) => (validationErrors[v.type] = v.message));
|
|
165
|
+
this.form.controls[key].setErrors(validationErrors);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
isValid() {
|
|
170
|
+
return this.errors.value.length == 0;
|
|
171
|
+
}
|
|
172
|
+
setErrors(errors) {
|
|
173
|
+
this.errors.next(errors);
|
|
174
|
+
}
|
|
175
|
+
validate() {
|
|
176
|
+
return this.runValidations().then((x) => true);
|
|
177
|
+
}
|
|
178
|
+
async runValidations() {
|
|
179
|
+
console.log('validating', this.model);
|
|
180
|
+
const errors = await this.modelValidator.validate(this.model);
|
|
181
|
+
this.errors.next(errors);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
121
185
|
/*
|
|
122
186
|
* Public API Surface of forms
|
|
123
187
|
*/
|
|
@@ -126,5 +190,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImpor
|
|
|
126
190
|
* Generated bundle index. Do not edit.
|
|
127
191
|
*/
|
|
128
192
|
|
|
129
|
-
export {
|
|
193
|
+
export { BooleanType, FormsModule, ModelSchemaFactory, ModelValidator, NgFormModelState, NgFormModelStateFactory, StringType, equals, length, ofValues, required };
|
|
130
194
|
//# sourceMappingURL=muziehdesign-forms.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muziehdesign-forms.mjs","sources":["../../../../projects/muziehdesign/forms/src/lib/model-validator.ts","../../../../projects/muziehdesign/forms/src/lib/constants.ts","../../../../projects/muziehdesign/forms/src/lib/property-type.enum.ts","../../../../projects/muziehdesign/forms/src/lib/model-schema.factory.ts","../../../../projects/muziehdesign/forms/src/lib/string-schema.ts","../../../../projects/muziehdesign/forms/src/lib/forms.module.ts","../../../../projects/muziehdesign/forms/src/public-api.ts","../../../../projects/muziehdesign/forms/src/muziehdesign-forms.ts"],"sourcesContent":["import { SchemaOf, ValidationError } from 'yup';\nimport { FieldError } from './field-error';\n\nexport class ModelValidator<T> {\n private schema: SchemaOf<T>;\n constructor(modelSchema: SchemaOf<T>) {\n this.schema = modelSchema;\n }\n\n validate<T>(model: T): Promise<FieldError[]> {\n return this.schema\n .validate(model, { abortEarly: false })\n .then(() => {\n return [];\n })\n .catch((e: ValidationError) => {\n return e.inner.map((error) => <FieldError>{ path: error.path, type: error.type, message: error.message });\n });\n }\n}\n","export const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:schema';\n","export enum PropertyType {\n string,\n number,\n array,\n boolean\n}\n","import { Injectable } from '@angular/core';\nimport { boolean, object, SchemaOf, string } from 'yup';\nimport { ModelValidator } from './model-validator';\nimport { BooleanSchemaOptions, SchemaOptions, StringSchemaOptions } from './string-schema';\nimport { SCHEMA_METADATA_NAMESPACE } from './constants';\nimport { ObjectShape } from 'yup/lib/object';\nimport { PropertySchemaMetadata } from './property-schema-metadata';\nimport { PropertyType } from './property-type.enum';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ModelSchemaFactory {\n constructor() {}\n\n build<T>(model: T): ModelValidator<T> {\n const metadata: PropertySchemaMetadata<SchemaOptions>[] = Reflect.getMetadata(SCHEMA_METADATA_NAMESPACE, model);\n let shape: ObjectShape = {};\n metadata.forEach((element) => {\n if (element.type == PropertyType.string) {\n shape[element.name] = this.buildStringSchema(element.options || {});\n } else if(element.type == PropertyType.boolean) {\n shape[element.name] = this.buildBooleanSchema(element.options || {});\n }\n });\n const schema = object(shape) as SchemaOf<T>;\n return new ModelValidator(schema);\n }\n\n private buildStringSchema(options: StringSchemaOptions) {\n let stringSchema = string();\n if (options.required) {\n stringSchema = stringSchema.required();\n }\n if (options.length) {\n stringSchema = stringSchema.length(options.length);\n }\n if (options.minimum) {\n stringSchema = stringSchema.min(options.minimum);\n }\n if (options.maximum) {\n stringSchema = stringSchema.max(options.maximum);\n }\n\n return stringSchema;\n }\n\n private buildBooleanSchema(options: BooleanSchemaOptions) {\n let booleanSchema = boolean();\n if(options.equals) {\n return booleanSchema.test({\n name: 'mustBe',\n test: (value)=> value == options.equals\n });\n }\n\n return booleanSchema;\n }\n}\n","import 'reflect-metadata';\nimport { PropertySchemaMetadata } from './property-schema-metadata';\nimport { PropertyType } from './property-type.enum';\n\nexport interface StringSchemaOptions extends SchemaOptions {\n length?: number;\n minimum?: number;\n maximum?: number;\n pattern?: RegExp;\n}\nexport interface SchemaOptions {\n required?: boolean;\n}\n\nexport function StringSchema(options?: StringSchemaOptions) {\n return function (target: Object, propertyKey: string | Symbol) {\n const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];\n metadata.push(<PropertySchemaMetadata<StringSchemaOptions>>{\n name: propertyKey,\n type: PropertyType.string,\n options: options,\n });\n // TODO: define on property\n Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);\n };\n}\n\nexport interface BooleanSchemaOptions extends SchemaOptions {\n equals?: boolean;\n}\n\nexport function BooleanSchema(options?: BooleanSchemaOptions) {\n return function (target: Object, propertyKey: string | Symbol) {\n const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];\n metadata.push(<PropertySchemaMetadata<StringSchemaOptions>>{\n name: propertyKey,\n type: PropertyType.boolean,\n options: options,\n });\n // TODO: define on property\n Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);\n };\n}\n","import { NgModule } from '@angular/core';\n\n\n\n@NgModule({\n providers: []\n})\nexport class FormsModule { }\n","/*\n * Public API Surface of forms\n */\nexport * from './lib/field-error';\nexport * from './lib/model-schema.factory';\nexport * from './lib/model-validator';\nexport * from './lib/string-schema';\nexport * from './lib/forms.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"muziehdesign-forms.mjs","sources":["../../../../projects/muziehdesign/forms/src/lib/model-validator.ts","../../../../projects/muziehdesign/forms/src/lib/constants.ts","../../../../projects/muziehdesign/forms/src/lib/type-annotations.ts","../../../../projects/muziehdesign/forms/src/lib/model-schema.factory.ts","../../../../projects/muziehdesign/forms/src/lib/forms.module.ts","../../../../projects/muziehdesign/forms/src/lib/ng-form-model-state.service.ts","../../../../projects/muziehdesign/forms/src/public-api.ts","../../../../projects/muziehdesign/forms/src/muziehdesign-forms.ts"],"sourcesContent":["import { SchemaOf, ValidationError } from 'yup';\nimport { FieldError } from './field-error';\n\nexport class ModelValidator<T> {\n private schema: SchemaOf<T>;\n constructor(modelSchema: SchemaOf<T>) {\n this.schema = modelSchema;\n }\n\n validate<T>(model: T): Promise<FieldError[]> {\n return this.schema\n .validate(model, { abortEarly: false })\n .then(() => {\n return [];\n })\n .catch((e: ValidationError) => {\n return e.inner.map((error) => <FieldError>{ path: error.path, type: error.type, message: error.message });\n });\n }\n}\n","export const SCHEMA_METADATA_NAMESPACE = 'custom:muziehdesign:annotations';\n","import 'reflect-metadata';\nimport { BooleanSchema, SchemaOf, StringSchema } from 'yup';\nimport { PropertySchemaMetadata } from './property-schema-metadata';\nimport { PropertyType } from './property-type.enum';\n\nconst METADATA_KEY = 'custom:muziehdesign:annotations';\n\nexport interface ConstraintAnnotations {\n constraintType: string;\n}\n\n/*\nexport interface OfValuesAnnotations extends ConstraintAnnotations {\n values: [];\n message?: string;\n}*/\n\nexport interface StringTypeAnnotations extends ConstraintAnnotations {\n required?: RequiredAnnotation;\n length: LengthAnnotation;\n}\n\nexport interface BooleanTypeAnnotations extends ConstraintAnnotations {\n required?: RequiredAnnotation;\n equals?: EqualsAnnotation<boolean>;\n}\n\nexport interface ValidationAnnotation {\n message?: string;\n}\n\nexport interface RequiredAnnotation extends ValidationAnnotation {\n required: boolean;\n}\n\nexport interface LengthAnnotation extends ValidationAnnotation {\n length: number;\n}\n\nexport interface OfValuesAnnotation extends ValidationAnnotation {\n values: [];\n}\n\nexport interface EqualsAnnotation<T> extends ValidationAnnotation {\n equals: T;\n}\n\nconst registerMetadata = (target: Object, propertyKey: string, constraint: ConstraintAnnotations) => {\n const metadata: Map<string, any> = Reflect.getMetadata(METADATA_KEY, target) || new Map<string, any>();\n metadata.set(propertyKey, constraint);\n Reflect.defineMetadata(METADATA_KEY, metadata, target);\n};\n\n/*\nexport function OfValues<T>(values: T[], message?: string) {\n return function (target: Object, propertyKey: string) {\n const o = { values: values, message: message } as OfValuesAnnotations;\n o.constraintType = OfValues.name;\n registerMetadata(target, propertyKey, o);\n };\n}*/\n\nexport function StringType(...annotations: { [key: string]: ValidationAnnotation }[]) {\n return function (target: Object, propertyKey: string) {\n const o = Object.assign({}, ...annotations) as StringTypeAnnotations;\n o.constraintType = StringType.name;\n registerMetadata(target, propertyKey, o);\n };\n}\n\nexport function BooleanType(...annotations: { [key: string]: ValidationAnnotation }[]) {\n return function (target: Object, propertyKey: string) {\n const o = Object.assign({}, ...annotations) as BooleanTypeAnnotations;\n o.constraintType = BooleanType.name;\n registerMetadata(target, propertyKey, o);\n };\n}\n\nexport function required(message?: string): { [key: string]: RequiredAnnotation } {\n return { required: { required: true, message: message } };\n}\n\nexport function length(length: number, message?: string): { [key: string]: LengthAnnotation } {\n return { length: { length: length, message: message } };\n}\n\nexport function ofValues(values: [], message?: string): { [key: string]: OfValuesAnnotation } {\n return { ofValues: { values: values, message: message } };\n}\n\nexport function equals<T>(value: T, message?: string) : { [key: string]: EqualsAnnotation<T> } {\n return { equals: { equals: value, message: message } };\n}\n","import { Injectable } from '@angular/core';\nimport { object, SchemaOf } from 'yup';\nimport { ModelValidator } from './model-validator';\nimport { SCHEMA_METADATA_NAMESPACE } from './constants';\nimport { ObjectShape } from 'yup/lib/object';\nimport { BooleanType, BooleanTypeAnnotations, ConstraintAnnotations, StringType, StringTypeAnnotations } from './type-annotations';\nimport * as Yup from 'yup';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ModelSchemaFactory {\n constructor() {}\n\n build<T>(model: T): ModelValidator<T> {\n const metadata: Map<string, ConstraintAnnotations> = Reflect.getMetadata(SCHEMA_METADATA_NAMESPACE, model);\n let shape: ObjectShape = {};\n metadata.forEach((value, key) => {\n if (value.constraintType == StringType.name) {\n shape[key] = this.buildStringSchema(value as StringTypeAnnotations);\n } else if (value.constraintType == BooleanType.name) {\n shape[key] = this.buildBooleanSchema(value as BooleanTypeAnnotations);\n }\n });\n const schema = object(shape) as SchemaOf<T>;\n return new ModelValidator(schema);\n }\n\n private buildStringSchema(options: StringTypeAnnotations) {\n let schema = Yup.string();\n if (options.required) {\n schema = schema.required(options.required.message);\n }\n if (options.length) {\n schema = schema.length(options.length.length, options.length.message);\n }\n\n return schema;\n }\n\n private buildBooleanSchema(options: BooleanTypeAnnotations) {\n let schema = Yup.boolean();\n if (options.required) {\n schema = schema.required(options.required.message);\n }\n if (options.equals) {\n if (options.equals.equals) {\n schema = schema.isTrue(options.equals.message);\n } else {\n schema = schema.isFalse(options.equals.message);\n }\n }\n\n return schema;\n }\n}\n","import { NgModule } from '@angular/core';\n\n\n\n@NgModule({\n providers: []\n})\nexport class FormsModule { }\n","import { Injectable, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { NgForm, ValidationErrors } from '@angular/forms';\nimport { BehaviorSubject, filter, from, switchMap } from 'rxjs';\nimport { FieldError } from './field-error';\nimport { ModelSchemaFactory } from './model-schema.factory';\nimport { ModelValidator } from './model-validator';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgFormModelStateFactory {\n constructor(private factory: ModelSchemaFactory) {}\n\n create<T>(form: NgForm, model: T) {\n const modelState = new NgFormModelState<T>(form, this.factory.build(model), model);\n return modelState;\n }\n}\n\nexport class NgFormModelState<T> {\n private errors: BehaviorSubject<FieldError[]> = new BehaviorSubject<FieldError[]>([]);\n public errors$ = this.errors.asObservable();\n\n constructor(private form: NgForm, private modelValidator: ModelValidator<T>, private model: T) {\n this.form.form.valueChanges\n .pipe(\n switchMap(async (x) => {\n return from(this.runValidations());\n })\n )\n .subscribe();\n\n this.errors$.subscribe((list) => {\n console.log('all errors', list);\n\n const grouped = list.reduce((grouped, v) => grouped.set(v.path, [...(grouped.get(v.path) || []), v]), new Map<string, FieldError[]>());\n\n grouped.forEach((value, key) => {\n let validationErrors = <ValidationErrors>{};\n value.forEach((v) => (validationErrors[v.type] = v.message));\n this.form.controls[key].setErrors(validationErrors);\n });\n });\n }\n\n isValid(): boolean {\n return this.errors.value.length == 0;\n }\n\n setErrors(errors: FieldError[]) {\n this.errors.next(errors);\n }\n\n validate(): Promise<boolean> {\n return this.runValidations().then((x) => true);\n }\n\n private async runValidations(): Promise<void> {\n console.log('validating', this.model);\n const errors = await this.modelValidator.validate(this.model);\n this.errors.next(errors);\n }\n}\n","/*\n * Public API Surface of forms\n */\nexport * from './lib/field-error';\nexport * from './lib/model-schema.factory';\nexport * from './lib/model-validator';\nexport * from './lib/type-annotations';\nexport * from './lib/forms.module';\nexport * from './lib/ng-form-model-state.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ModelSchemaFactory"],"mappings":"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"}
|
package/lib/constants.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SCHEMA_METADATA_NAMESPACE = "custom:muziehdesign:
|
|
1
|
+
export declare const SCHEMA_METADATA_NAMESPACE = "custom:muziehdesign:annotations";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { NgForm } from '@angular/forms';
|
|
2
|
+
import { FieldError } from './field-error';
|
|
3
|
+
import { ModelSchemaFactory } from './model-schema.factory';
|
|
4
|
+
import { ModelValidator } from './model-validator';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class NgFormModelStateFactory {
|
|
7
|
+
private factory;
|
|
8
|
+
constructor(factory: ModelSchemaFactory);
|
|
9
|
+
create<T>(form: NgForm, model: T): NgFormModelState<T>;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgFormModelStateFactory, never>;
|
|
11
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<NgFormModelStateFactory>;
|
|
12
|
+
}
|
|
13
|
+
export declare class NgFormModelState<T> {
|
|
14
|
+
private form;
|
|
15
|
+
private modelValidator;
|
|
16
|
+
private model;
|
|
17
|
+
private errors;
|
|
18
|
+
errors$: import("rxjs").Observable<FieldError[]>;
|
|
19
|
+
constructor(form: NgForm, modelValidator: ModelValidator<T>, model: T);
|
|
20
|
+
isValid(): boolean;
|
|
21
|
+
setErrors(errors: FieldError[]): void;
|
|
22
|
+
validate(): Promise<boolean>;
|
|
23
|
+
private runValidations;
|
|
24
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface ConstraintAnnotations {
|
|
3
|
+
constraintType: string;
|
|
4
|
+
}
|
|
5
|
+
export interface StringTypeAnnotations extends ConstraintAnnotations {
|
|
6
|
+
required?: RequiredAnnotation;
|
|
7
|
+
length: LengthAnnotation;
|
|
8
|
+
}
|
|
9
|
+
export interface BooleanTypeAnnotations extends ConstraintAnnotations {
|
|
10
|
+
required?: RequiredAnnotation;
|
|
11
|
+
equals?: EqualsAnnotation<boolean>;
|
|
12
|
+
}
|
|
13
|
+
export interface ValidationAnnotation {
|
|
14
|
+
message?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RequiredAnnotation extends ValidationAnnotation {
|
|
17
|
+
required: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface LengthAnnotation extends ValidationAnnotation {
|
|
20
|
+
length: number;
|
|
21
|
+
}
|
|
22
|
+
export interface OfValuesAnnotation extends ValidationAnnotation {
|
|
23
|
+
values: [];
|
|
24
|
+
}
|
|
25
|
+
export interface EqualsAnnotation<T> extends ValidationAnnotation {
|
|
26
|
+
equals: T;
|
|
27
|
+
}
|
|
28
|
+
export declare function StringType(...annotations: {
|
|
29
|
+
[key: string]: ValidationAnnotation;
|
|
30
|
+
}[]): (target: Object, propertyKey: string) => void;
|
|
31
|
+
export declare function BooleanType(...annotations: {
|
|
32
|
+
[key: string]: ValidationAnnotation;
|
|
33
|
+
}[]): (target: Object, propertyKey: string) => void;
|
|
34
|
+
export declare function required(message?: string): {
|
|
35
|
+
[key: string]: RequiredAnnotation;
|
|
36
|
+
};
|
|
37
|
+
export declare function length(length: number, message?: string): {
|
|
38
|
+
[key: string]: LengthAnnotation;
|
|
39
|
+
};
|
|
40
|
+
export declare function ofValues(values: [], message?: string): {
|
|
41
|
+
[key: string]: OfValuesAnnotation;
|
|
42
|
+
};
|
|
43
|
+
export declare function equals<T>(value: T, message?: string): {
|
|
44
|
+
[key: string]: EqualsAnnotation<T>;
|
|
45
|
+
};
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './lib/field-error';
|
|
2
2
|
export * from './lib/model-schema.factory';
|
|
3
3
|
export * from './lib/model-validator';
|
|
4
|
-
export * from './lib/
|
|
4
|
+
export * from './lib/type-annotations';
|
|
5
5
|
export * from './lib/forms.module';
|
|
6
|
+
export * from './lib/ng-form-model-state.service';
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
|
-
import { PropertyType } from './property-type.enum';
|
|
3
|
-
export function StringSchema(options) {
|
|
4
|
-
return function (target, propertyKey) {
|
|
5
|
-
const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];
|
|
6
|
-
metadata.push({
|
|
7
|
-
name: propertyKey,
|
|
8
|
-
type: PropertyType.string,
|
|
9
|
-
options: options,
|
|
10
|
-
});
|
|
11
|
-
// TODO: define on property
|
|
12
|
-
Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
export function BooleanSchema(options) {
|
|
16
|
-
return function (target, propertyKey) {
|
|
17
|
-
const metadata = Reflect.getMetadata('custom:muziehdesign:schema', target) || [];
|
|
18
|
-
metadata.push({
|
|
19
|
-
name: propertyKey,
|
|
20
|
-
type: PropertyType.boolean,
|
|
21
|
-
options: options,
|
|
22
|
-
});
|
|
23
|
-
// TODO: define on property
|
|
24
|
-
Reflect.defineMetadata('custom:muziehdesign:schema', metadata, target);
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL211emllaGRlc2lnbi9mb3Jtcy9zcmMvbGliL3N0cmluZy1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFZcEQsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUE2QjtJQUN4RCxPQUFPLFVBQVUsTUFBYyxFQUFFLFdBQTRCO1FBQzNELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsNEJBQTRCLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pGLFFBQVEsQ0FBQyxJQUFJLENBQThDO1lBQ3pELElBQUksRUFBRSxXQUFXO1lBQ2pCLElBQUksRUFBRSxZQUFZLENBQUMsTUFBTTtZQUN6QixPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDLENBQUM7UUFDSCwyQkFBMkI7UUFDM0IsT0FBTyxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekUsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQU1ELE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBOEI7SUFDMUQsT0FBTyxVQUFVLE1BQWMsRUFBRSxXQUE0QjtRQUMzRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLDRCQUE0QixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRixRQUFRLENBQUMsSUFBSSxDQUE4QztZQUN6RCxJQUFJLEVBQUUsV0FBVztZQUNqQixJQUFJLEVBQUUsWUFBWSxDQUFDLE9BQU87WUFDMUIsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQyxDQUFDO1FBQ0gsMkJBQTJCO1FBQzNCLE9BQU8sQ0FBQyxjQUFjLENBQUMsNEJBQTRCLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pFLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuaW1wb3J0IHsgUHJvcGVydHlTY2hlbWFNZXRhZGF0YSB9IGZyb20gJy4vcHJvcGVydHktc2NoZW1hLW1ldGFkYXRhJztcbmltcG9ydCB7IFByb3BlcnR5VHlwZSB9IGZyb20gJy4vcHJvcGVydHktdHlwZS5lbnVtJztcblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdTY2hlbWFPcHRpb25zIGV4dGVuZHMgU2NoZW1hT3B0aW9ucyB7XG4gIGxlbmd0aD86IG51bWJlcjtcbiAgbWluaW11bT86IG51bWJlcjtcbiAgbWF4aW11bT86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hT3B0aW9ucyB7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFN0cmluZ1NjaGVtYShvcHRpb25zPzogU3RyaW5nU2NoZW1hT3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nIHwgU3ltYm9sKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKCdjdXN0b206bXV6aWVoZGVzaWduOnNjaGVtYScsIHRhcmdldCkgfHwgW107XG4gICAgbWV0YWRhdGEucHVzaCg8UHJvcGVydHlTY2hlbWFNZXRhZGF0YTxTdHJpbmdTY2hlbWFPcHRpb25zPj57XG4gICAgICBuYW1lOiBwcm9wZXJ0eUtleSxcbiAgICAgIHR5cGU6IFByb3BlcnR5VHlwZS5zdHJpbmcsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0pO1xuICAgIC8vIFRPRE86IGRlZmluZSBvbiBwcm9wZXJ0eVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoJ2N1c3RvbTptdXppZWhkZXNpZ246c2NoZW1hJywgbWV0YWRhdGEsIHRhcmdldCk7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vbGVhblNjaGVtYU9wdGlvbnMgZXh0ZW5kcyBTY2hlbWFPcHRpb25zIHtcbiAgZXF1YWxzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJvb2xlYW5TY2hlbWEob3B0aW9ucz86IEJvb2xlYW5TY2hlbWFPcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBTeW1ib2wpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoJ2N1c3RvbTptdXppZWhkZXNpZ246c2NoZW1hJywgdGFyZ2V0KSB8fCBbXTtcbiAgICBtZXRhZGF0YS5wdXNoKDxQcm9wZXJ0eVNjaGVtYU1ldGFkYXRhPFN0cmluZ1NjaGVtYU9wdGlvbnM+PntcbiAgICAgIG5hbWU6IHByb3BlcnR5S2V5LFxuICAgICAgdHlwZTogUHJvcGVydHlUeXBlLmJvb2xlYW4sXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0pO1xuICAgIC8vIFRPRE86IGRlZmluZSBvbiBwcm9wZXJ0eVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoJ2N1c3RvbTptdXppZWhkZXNpZ246c2NoZW1hJywgbWV0YWRhdGEsIHRhcmdldCk7XG4gIH07XG59XG4iXX0=
|
package/lib/string-schema.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
|
-
export interface StringSchemaOptions extends SchemaOptions {
|
|
3
|
-
length?: number;
|
|
4
|
-
minimum?: number;
|
|
5
|
-
maximum?: number;
|
|
6
|
-
pattern?: RegExp;
|
|
7
|
-
}
|
|
8
|
-
export interface SchemaOptions {
|
|
9
|
-
required?: boolean;
|
|
10
|
-
}
|
|
11
|
-
export declare function StringSchema(options?: StringSchemaOptions): (target: Object, propertyKey: string | Symbol) => void;
|
|
12
|
-
export interface BooleanSchemaOptions extends SchemaOptions {
|
|
13
|
-
equals?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export declare function BooleanSchema(options?: BooleanSchemaOptions): (target: Object, propertyKey: string | Symbol) => void;
|