fogui-common 0.0.1 → 0.0.3
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/dist/examples/parse-json-config/index.js.map +1 -1
- package/dist/model/base/Model.d.ts +5 -4
- package/dist/model/base/Model.js +23 -1
- package/dist/model/base/Model.js.map +1 -1
- package/dist/model/base/Model.spec.js +26 -1
- package/dist/model/base/Model.spec.js.map +1 -1
- package/dist/types/base/ArrayType.d.ts +9 -8
- package/dist/types/base/ArrayType.js +2 -0
- package/dist/types/base/ArrayType.js.map +1 -1
- package/dist/types/base/ArrayType.spec.js +3 -1
- package/dist/types/base/ArrayType.spec.js.map +1 -1
- package/dist/types/base/AttributeType.d.ts +4 -3
- package/dist/types/base/AttributeType.js +5 -1
- package/dist/types/base/AttributeType.js.map +1 -1
- package/dist/types/base/BooleanType.d.ts +2 -2
- package/dist/types/base/BooleanType.js.map +1 -1
- package/dist/types/base/NumberType.d.ts +4 -2
- package/dist/types/base/NumberType.js +6 -1
- package/dist/types/base/NumberType.js.map +1 -1
- package/dist/types/base/StringArrayType.d.ts +1 -1
- package/dist/types/base/StringArrayType.js.map +1 -1
- package/dist/types/base/StringType.d.ts +7 -2
- package/dist/types/base/StringType.js +9 -1
- package/dist/types/base/StringType.js.map +1 -1
- package/dist/util/InferType.d.ts +16 -4
- package/dist/util/InferType.js +2 -0
- package/dist/util/InferType.js.map +1 -1
- package/package.json +4 -6
- package/src/examples/parse-json-config/index.ts +1 -0
- package/src/model/base/Model.spec.ts +31 -1
- package/src/model/base/Model.ts +26 -4
- package/src/types/base/ArrayType.spec.ts +4 -2
- package/src/types/base/ArrayType.ts +13 -11
- package/src/types/base/AttributeType.ts +8 -4
- package/src/types/base/BooleanType.ts +2 -2
- package/src/types/base/NumberType.ts +8 -3
- package/src/types/base/StringArrayType.ts +7 -2
- package/src/types/base/StringType.ts +11 -2
- package/src/util/InferType.ts +41 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/examples/parse-json-config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAA4B,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/examples/parse-json-config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAA4B,MAAM,mCAAmC,CAAC;AAE5G,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,aAAa,GAAG;;;;;;;;;;;;EAYpB,CAAA;AAGF,MAAM,eAAe,GAAG;;;;;;;;;;;;EAYtB,CAAA;AAEF,KAAK,UAAU,sBAAsB,CAAC,OAAe;IAEjD,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAEpC,IAAI,WAAW,GAAG,IAAI,MAAM,EAAE,CAAA;IAC9B,IAAI,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC/C,IAAI,MAAM,GAAG,WAAW,CAAC,KAAK,CAAA;IAC9B,gEAAgE;IAChE,IAAI,WAAW,CAAC,UAAU,CAAC,WAAW,KAAK,6BAA6B,CAAC,EAAE,EAAE,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;QACrD,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IACvC,CAAC;IACD,IAAG,MAAM,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAM;IACV,CAAC;IACD,IAAI,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAAC,IAAI,CAAC,CAAA,CAAC,6BAA6B;IACjH,oEAAoE;IACpE,IAAI,MAAM,CAAC,WAAW,KAAK,6BAA6B,CAAC,EAAE,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IAC1C,CAAC;SACI,IAAI,MAAM,CAAC,WAAW,IAAI,6BAA6B,CAAC,IAAI,EAAE,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QAC5C,WAAW,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC;SACI,IAAI,MAAM,CAAC,WAAW,IAAI,6BAA6B,CAAC,IAAI,EAAE,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;QACvC,WAAW,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC;SACG,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;QAChD,WAAW,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC;AACL,CAAC;AACD,SAAS,WAAW,CAAC,gBAA0C,EAAE,OAAc,GAAG;IAC9E,KAAK,IAAI,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,WAAW,IAAI,6BAA6B,CAAC,KAAK,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;IACD,IAAI,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;QACxC,KAAK,IAAI,GAAG,IAAI,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;YACpD,WAAW,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;QAC9E,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAA;AAC3C,MAAM,sBAAsB,CAAC,eAAe,CAAC,CAAA","sourcesContent":["import { ParseAndValidationCriticality, ParseAndValidationResult } from '../../types/base/AttributeType.js';\nimport { InferSearchType } from '../../util/InferType.js';\nimport { Config } from './model/Config.js';\n\nconst rawDataValide = `{\n \"server\": {\n \"host\": \"localhost\",\n \"port\": 8080\n },\n \"database\": {\n \"host\": \"127.0.0.1\",\n \"port\": 5432,\n \"database\": \"SAMPLE_DB\",\n \"username\": \"admin\",\n \"password\": \"password123\"\n }\n}`\n\n\nconst rawDataInvalide = `{\n \"server\": {\n \"host\": \"Sörver\",\n \"port\": 65536\n },\n \"database\": {\n \"host\": \"999.0.0.1\",\n \"port\": 0,\n \"name\": \"SAMPLE_DB\",\n \"user\": \"admin\",\n \"password\": \"password123\"\n }\n}`\n\nasync function parseAndValidateConfig(rawData: string) {\n\n let configData = JSON.parse(rawData)\n\n let configModel = new Config()\n let parseResult = configModel.parse(configData)\n let config = parseResult.value\n //console.log(\"Parsed config:\", JSON.stringify(config, null, 2))\n if (parseResult.deepResult.criticality !== ParseAndValidationCriticality.Ok) {\n console.log(\"There were some issues during parsing:\")\n printErrors(parseResult.deepResult)\n }\n if(config === undefined) {\n console.log(\"Parsed config is undefined, cannot validate.\")\n return\n }\n let result = await configModel.validate(config, ParseAndValidationCriticality.Info) //NO Debug and Silly messages\n //console.log(\"Validation result:\", JSON.stringify(result, null, 2))\n if (result.criticality === ParseAndValidationCriticality.Ok) {\n console.log(\"Configuration is valid.\")\n }\n else if( result.criticality <= ParseAndValidationCriticality.Info ){\n console.log(\"There are some info messages:\")\n printErrors(result)\n }\n else if( result.criticality <= ParseAndValidationCriticality.Warn ){\n console.log(\"There are some warnings:\")\n printErrors(result)\n }\n else{\n console.log(\"Configuration is invalid. Errors:\")\n printErrors(result)\n }\n}\nfunction printErrors(validationObject: ParseAndValidationResult, path:string = \"/\") {\n for (let message of validationObject.messages) {\n if (message.criticality >= ParseAndValidationCriticality.Error) {\n console.log(`- ${path}: ${message.message}`);\n }\n }\n if (validationObject.subValidationResults) {\n for (let key in validationObject.subValidationResults) {\n printErrors(validationObject.subValidationResults[key], `${path}${key}/`);\n }\n }\n}\n\nawait parseAndValidateConfig(rawDataValide)\nawait parseAndValidateConfig(rawDataInvalide)\n"]}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { AttributeType, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from "../../types/base/AttributeType.js";
|
|
2
|
-
import { InferType } from "../../util/InferType.js";
|
|
2
|
+
import { InferExternalType, InferType } from "../../util/InferType.js";
|
|
3
3
|
export declare const required: true;
|
|
4
|
-
interface PropertyOptions {
|
|
4
|
+
export interface PropertyOptions {
|
|
5
5
|
required?: boolean;
|
|
6
6
|
type: AttributeType<any, any>;
|
|
7
7
|
}
|
|
8
8
|
export declare class Model extends AttributeType<object, Record<string, any>> {
|
|
9
9
|
properties: Record<string, PropertyOptions>;
|
|
10
|
+
get defaultValue(): InferType<this>;
|
|
11
|
+
format(value: InferType<this>): InferExternalType<this>;
|
|
10
12
|
parse(value: Record<string, any>): parseResult<InferType<this>>;
|
|
11
13
|
validate(value: {
|
|
12
14
|
[key: string]: any;
|
|
13
|
-
}, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult>;
|
|
15
|
+
} | null, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult>;
|
|
14
16
|
}
|
|
15
|
-
export {};
|
package/dist/model/base/Model.js
CHANGED
|
@@ -2,6 +2,28 @@ import { AttributeType, ParseAndValidationCriticality } from "../../types/base/A
|
|
|
2
2
|
export const required = true;
|
|
3
3
|
export class Model extends AttributeType {
|
|
4
4
|
properties = {};
|
|
5
|
+
get defaultValue() {
|
|
6
|
+
const obj = {};
|
|
7
|
+
for (const key in this.properties) {
|
|
8
|
+
let defaultValue = this.properties[key].type.defaultValue;
|
|
9
|
+
if (!this.properties[key].required && defaultValue === undefined) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
obj[key] = defaultValue;
|
|
13
|
+
}
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
format(value) {
|
|
17
|
+
const obj = {};
|
|
18
|
+
if (!value)
|
|
19
|
+
throw new Error("Cannot format undefined value");
|
|
20
|
+
for (const key in this.properties) {
|
|
21
|
+
if (value[key] !== undefined) {
|
|
22
|
+
obj[key] = this.properties[key].type.format(value[key]);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
5
27
|
parse(value) {
|
|
6
28
|
const obj = {};
|
|
7
29
|
let validationObject = { criticality: ParseAndValidationCriticality.Ok, messages: [] };
|
|
@@ -25,7 +47,7 @@ export class Model extends AttributeType {
|
|
|
25
47
|
validationObject.subValidationResults = {};
|
|
26
48
|
for (let propertyName in this.properties) {
|
|
27
49
|
let property = this.properties[propertyName];
|
|
28
|
-
if (value[propertyName] === undefined) {
|
|
50
|
+
if (value == null || value[propertyName] === undefined) {
|
|
29
51
|
if (property.required) {
|
|
30
52
|
validationObject.messages.push({ criticality: ParseAndValidationCriticality.Error, message: `Property "${propertyName}" is required.` });
|
|
31
53
|
validationObject.criticality = Math.max(validationObject.criticality, ParseAndValidationCriticality.Error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Model.js","sourceRoot":"","sources":["../../../src/model/base/Model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAyC,MAAM,mCAAmC,CAAC;AAGxI,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAa,CAAA;AASrC,MAAM,OAAO,KAAM,SAAQ,aAAyC;IAChE,UAAU,GAAoC,EAAE,CAAC;IACjD,KAAK,CAAC,KAA0B;QAC5B,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,IAAI,gBAAgB,GAA4B,EAAC,WAAW,EAAC,6BAA6B,CAAC,EAAE,EAAC,QAAQ,EAAC,EAAE,EAAC,CAAA;QAC1G,gBAAgB,CAAC,oBAAoB,GAAC,EAAE,CAAA;QACxC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC5D,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzD,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;gBACxB,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAC,MAAM,CAAC,UAAU,CAAA;gBAC5D,gBAAgB,CAAC,WAAW,GAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;YACrG,CAAC;QACL,CAAC;QACD,KAAI,IAAI,cAAc,IAAI,KAAK,EAAC,CAAC;YAC7B,IAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,KAAG,SAAS;gBAC1C,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAC,WAAW,EAAC,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAC,aAAa,cAAc,kBAAkB,EAAE,CAAC,CAAA;QACjJ,CAAC;QACD,OAAO,EAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAC,CAAC;IACtD,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"Model.js","sourceRoot":"","sources":["../../../src/model/base/Model.ts"],"names":[],"mappings":"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","sourcesContent":["import { AttributeType, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from \"../../types/base/AttributeType.js\";\nimport { InferExternalType, InferType } from \"../../util/InferType.js\";\n\nexport const required = true as const\n\n\nexport interface PropertyOptions {\n required?: boolean;\n type: AttributeType<any, any>;\n}\n\n\nexport class Model extends AttributeType<object,Record<string, any>> {\n properties: Record<string, PropertyOptions> = {};\n get defaultValue(): InferType<this> {\n const obj: any = {};\n for (const key in this.properties) {\n let defaultValue = this.properties[key].type.defaultValue;\n if (\n !this.properties[key].required && defaultValue === undefined) {\n continue\n }\n obj[key] = defaultValue;\n }\n return obj;\n }\n format(value: InferType<this>): InferExternalType<this> {\n const obj: any = {};\n if(!value) throw new Error(\"Cannot format undefined value\")\n for (const key in this.properties) {\n if (value[key] !== undefined) {\n obj[key] = this.properties[key].type.format(value[key]);\n }\n }\n return obj;\n }\n parse(value: Record<string, any>): parseResult<InferType<this>> {\n const obj: any = {};\n let validationObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok,messages:[]}\n validationObject.subValidationResults={}\n for (const key in this.properties) {\n if (this.properties[key].required || value[key] !== undefined) {\n let result = this.properties[key].type.parse(value[key]);\n obj[key] = result.value;\n validationObject.subValidationResults[key]=result.deepResult\n validationObject.criticality=Math.max(validationObject.criticality,result.deepResult.criticality)\n }\n }\n for(let objectProperty in value){\n if(this.properties[objectProperty]===undefined)\n validationObject.messages.push({criticality:ParseAndValidationCriticality.Error, message:`Property \"${objectProperty}\" nicht erlaubt.` })\n }\n return {value: obj, deepResult: validationObject};\n }\n async validate(value: { [key: string]: any} | null, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult> {\n let validationObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok,messages:[]}\n validationObject.subValidationResults={}\n for(let propertyName in this.properties){\n let property = this.properties[propertyName]\n if(value == null || value[propertyName]===undefined ){\n if(property.required){\n validationObject.messages.push({criticality:ParseAndValidationCriticality.Error, message:`Property \"${propertyName}\" is required.`})\n validationObject.criticality=Math.max(validationObject.criticality,ParseAndValidationCriticality.Error)\n }\n continue\n }\n let validationResult = await property.type.validate(value[propertyName])\n validationObject.subValidationResults[propertyName]=validationResult\n validationObject.criticality=Math.max(validationObject.criticality,validationResult.criticality)\n }\n for(let objectProperty in value){\n if(this.properties[objectProperty]===undefined)\n validationObject.messages.push({criticality:ParseAndValidationCriticality.Error, message:`Property \"${objectProperty}\" nicht erlaubt.` })\n }\n return validationObject\n }\n}"]}
|
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
import { assert } from "chai";
|
|
2
|
-
import {
|
|
2
|
+
import { Model } from "./Model.js";
|
|
3
|
+
import { BooleanType, NumberType, required, StringType } from "../../index.js";
|
|
3
4
|
import { StringArrayType } from "../../types/base/StringArrayType.js";
|
|
4
5
|
describe("Model", () => {
|
|
6
|
+
it("should get default values from model", () => {
|
|
7
|
+
class Person extends Model {
|
|
8
|
+
properties = {
|
|
9
|
+
name: { required, type: new StringType({ defaultValue: "" }) },
|
|
10
|
+
//@ts-expect-error
|
|
11
|
+
age: { type: new NumberType({ defaultValue: null }) },
|
|
12
|
+
isActive: { required, type: new BooleanType({ defaultValue: false }) },
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
let bla = new StringType({ defaultValue: "test" });
|
|
16
|
+
const personModel = new Person();
|
|
17
|
+
let defaultValue = personModel.defaultValue;
|
|
18
|
+
assert.deepEqual(defaultValue, {
|
|
19
|
+
name: "",
|
|
20
|
+
age: null,
|
|
21
|
+
isActive: false,
|
|
22
|
+
});
|
|
23
|
+
let externalDefaultValue = personModel.format(defaultValue);
|
|
24
|
+
assert.deepEqual(externalDefaultValue, {
|
|
25
|
+
name: "",
|
|
26
|
+
age: "",
|
|
27
|
+
isActive: "false"
|
|
28
|
+
});
|
|
29
|
+
});
|
|
5
30
|
it("should parse a model with required and optional properties", () => {
|
|
6
31
|
class AddressType extends Model {
|
|
7
32
|
properties = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Model.spec.js","sourceRoot":"","sources":["../../../src/model/base/Model.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"Model.spec.js","sourceRoot":"","sources":["../../../src/model/base/Model.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from \"chai\"\nimport { Model } from \"./Model.js\";\nimport { ArrayType, AttributeType, BooleanType, InferExternalType, InferModelProperties, InferType, NumberType, required, StringType } from \"../../index.js\"\nimport { StringArrayType } from \"../../types/base/StringArrayType.js\";\n\n\ndescribe(\"Model\", () => {\n it(\"should get default values from model\", ()=>{\n class Person extends Model {\n properties = {\n name: { required, type: new StringType({defaultValue: \"\"}) },\n //@ts-expect-error\n age: { type: new NumberType({defaultValue: null}) },\n isActive: { required, type: new BooleanType({defaultValue: false}) },\n }\n }\n \n let bla = new StringType({defaultValue:\"test\"})\n\n const personModel = new Person()\n let defaultValue:InferType<Person> = personModel.defaultValue\n\n assert.deepEqual(defaultValue, {\n name: \"\", \n age: null,\n isActive: false,\n })\n\n let externalDefaultValue:InferExternalType<Person> = personModel.format(defaultValue)\n\n assert.deepEqual(externalDefaultValue, {\n name: \"\", \n age: \"\",\n isActive: \"false\"\n })\n })\n it(\"should parse a model with required and optional properties\", () => {\n class AddressType extends Model {\n properties = {\n street: { required, type: new StringType() },\n city: { required, type: new StringType() },\n };\n }\n\n class Person extends Model {\n properties = {\n name: { required, type: new StringType() },\n age: { type: new NumberType() },\n isActive: { required, type: new BooleanType() },\n address: { type: new AddressType() },\n hobbies: { required, type: new StringArrayType()}\n }\n }\n const personModel = new Person()\n const person = personModel.parse({\n name: \"John Doe\",\n age: \"30\",\n isActive: \"true\",\n address: {\n street: \"123 Main St\",\n city: \"Anytown\"\n },\n hobbies: [\"reading\", \"traveling\"]\n })\n assert.deepEqual(person.value, {\n name: \"John Doe\",\n age: 30,\n isActive: true,\n address: {\n street: \"123 Main St\",\n city: \"Anytown\"\n },\n hobbies: [\"reading\", \"traveling\"]\n })\n })\n it(\"should parse a model with missing optional properties\", () => {\n class Person extends Model {\n properties = {\n name: { required, type: new StringType() },\n age: { type: new NumberType() },\n isActive: { required, type: new BooleanType() },\n }\n }\n const personModel = new Person()\n const person = personModel.parse({\n name: \"John Doe\",\n isActive: \"false\",\n })\n assert.deepEqual(person.value, {\n name: \"John Doe\",\n isActive: false,\n })\n })\n it(\"should parse a model with missing required properties\", () => {\n // Missing required properties should be set to undefined or default values\n // Is this a good idea?\n class Person extends Model {\n properties = {\n name: { required, type: new StringType() },\n age: { required, type: new NumberType({defaultValue: 10}) },\n isActive: { required, type: new BooleanType({defaultValue: false}) },\n }\n }\n const personModel = new Person()\n const person = personModel.parse({\n name: \"John Doe\"\n })\n assert.deepEqual(person.value, {\n age: 10,\n isActive: false,\n name: \"John Doe\"\n })\n })\n})"]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { InferExternalType, InferType } from "../../util/InferType.js";
|
|
1
2
|
import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from "./AttributeType.js";
|
|
2
|
-
export type ArrayTypeOptions = AttributeTypeOptions<any[]> & {
|
|
3
|
-
type:
|
|
3
|
+
export type ArrayTypeOptions<T> = AttributeTypeOptions<any[]> & {
|
|
4
|
+
type: T;
|
|
4
5
|
};
|
|
5
|
-
export declare
|
|
6
|
-
|
|
7
|
-
constructor(options?: ArrayTypeOptions);
|
|
8
|
-
parse(value:
|
|
9
|
-
validate(value:
|
|
10
|
-
format(value:
|
|
6
|
+
export declare class ArrayType<T extends AttributeType<any, any>> extends AttributeType<InferType<T>[], InferExternalType<T>[]> {
|
|
7
|
+
type: T;
|
|
8
|
+
constructor(options?: ArrayTypeOptions<T>);
|
|
9
|
+
parse(value: InferExternalType<T>[]): parseResult<InferType<T>[]>;
|
|
10
|
+
validate(value: InferType<T>[], level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult>;
|
|
11
|
+
format(value: InferType<T>[]): InferExternalType<T>[];
|
|
11
12
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { AttributeType, ParseAndValidationCriticality } from "./AttributeType.js";
|
|
2
2
|
export class ArrayType extends AttributeType {
|
|
3
|
+
type;
|
|
3
4
|
constructor(options) {
|
|
4
5
|
super(options);
|
|
6
|
+
this.type = options?.type ? options.type : new AttributeType();
|
|
5
7
|
}
|
|
6
8
|
parse(value) {
|
|
7
9
|
let resultObject = { criticality: ParseAndValidationCriticality.Ok, messages: [] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArrayType.js","sourceRoot":"","sources":["../../../src/types/base/ArrayType.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ArrayType.js","sourceRoot":"","sources":["../../../src/types/base/ArrayType.ts"],"names":[],"mappings":"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","sourcesContent":["import { InferExternalType, InferType } from \"../../util/InferType.js\";\nimport { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from \"./AttributeType.js\";\n\n\nexport type ArrayTypeOptions<T> = AttributeTypeOptions<any[]> &{\n type: T \n} \n\n\nexport class ArrayType<T extends AttributeType<any, any>> extends AttributeType<InferType<T>[],InferExternalType<T>[]> {\n type: T \n constructor(options?: ArrayTypeOptions<T>) {\n super(options)\n this.type = options?.type ? options.type : new AttributeType() as T\n }\n parse(value: InferExternalType<T>[]): parseResult<InferType<T>[]> {\n let resultObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok,messages:[]}\n resultObject.subValidationResults={}\n let returnObject:InferType<T>[] = []\n if(!value) return {value: this.defaultValue, deepResult: { criticality: ParseAndValidationCriticality.Info, messages: [{criticality: ParseAndValidationCriticality.Info, message:'No value given using default Value!'}] }}\n if(!Array.isArray(value)) return {value: this.defaultValue, deepResult: { criticality: ParseAndValidationCriticality.Error, messages: [{criticality: ParseAndValidationCriticality.Error, message:'Value is not an array'}] }}\n for(let i=0; i< value.length; i++){\n const result = this.type.parse(value[i])\n resultObject.criticality = Math.max(resultObject.criticality, result.deepResult.criticality)\n resultObject.subValidationResults[i] = resultObject\n returnObject.push(result.value as InferType<T>)\n }\n return {value: returnObject, deepResult: resultObject} \n }\n async validate(value: InferType<T>[], level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult> {\n let validationObject:ParseAndValidationResult = {\n criticality: ParseAndValidationCriticality.Ok, messages: [], subValidationResults: {}\n }\n validationObject.subValidationResults = {}\n for(let i=0; i< value.length; i++){\n const validationResult = await this.type.validate(value[i], level)\n validationObject.criticality = Math.max(validationObject.criticality, validationResult.criticality)\n validationObject.subValidationResults[i] = validationResult\n }\n return validationObject\n }\n format(value: InferType<T>[]): InferExternalType<T>[] {\n if(!value) return []\n return value.map(v=>this.type.format(v) as InferExternalType<T>)\n }\n}"]}
|
|
@@ -3,7 +3,9 @@ import { ArrayType } from "./ArrayType.js";
|
|
|
3
3
|
import { ParseAndValidationCriticality } from "./AttributeType.js";
|
|
4
4
|
import { NumberType } from "./NumberType.js";
|
|
5
5
|
class NumberArrayType extends ArrayType {
|
|
6
|
-
|
|
6
|
+
constructor() {
|
|
7
|
+
super({ type: new NumberType() });
|
|
8
|
+
}
|
|
7
9
|
}
|
|
8
10
|
describe("ArrayType", () => {
|
|
9
11
|
let arrayType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArrayType.spec.js","sourceRoot":"","sources":["../../../src/types/base/ArrayType.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAiB,6BAA6B,EAA4B,MAAM,oBAAoB,CAAC;AAC5G,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,MAAM,eAAgB,SAAQ,
|
|
1
|
+
{"version":3,"file":"ArrayType.spec.js","sourceRoot":"","sources":["../../../src/types/base/ArrayType.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from \"chai\";\nimport { ArrayType } from \"./ArrayType.js\";\nimport { AttributeType, ParseAndValidationCriticality, ParseAndValidationResult } from \"./AttributeType.js\";\nimport { NumberType } from \"./NumberType.js\";\n\n\n\nclass NumberArrayType extends ArrayType<NumberType> {\n constructor() {\n super({type: new NumberType()})\n }\n}\n\ndescribe(\"ArrayType\", () => {\n let arrayType: NumberArrayType;\n\n beforeEach(() => {\n arrayType = new NumberArrayType();\n });\n\n describe(\"parse\", () => {\n it(\"should parse an array of numbers\", () => {\n const result = arrayType.parse([\"1\", \"2\", \"3\"]).value;\n expect(result).to.deep.equal([1, 2, 3]);\n });\n\n it(\"should return defaultValue if value is undefined\", () => {\n const result = arrayType.parse(undefined as any).value;\n expect(result).to.equal(arrayType.defaultValue);\n });\n\n it(\"should return error result if value is not an array\", () => {\n const result = arrayType.parse(123 as any);\n expect(result.deepResult.criticality).to.equal(ParseAndValidationCriticality.Error);\n expect(result.deepResult.messages).to.deep.include({ criticality: ParseAndValidationCriticality.Error, message: \"Value is not an array\" });\n });\n });\n\n describe(\"validate\", () => {\n it(\"should validate all elements and aggregate criticality\", async () => {\n const result = await arrayType.validate([1, NaN, 3]);\n result.subValidationResults = result.subValidationResults || {};\n expect(result.criticality).to.equal(ParseAndValidationCriticality.Error);\n expect(result.subValidationResults[1].messages).to.deep.include({ criticality: ParseAndValidationCriticality.Error, message: \"Not a number\" });\n });\n\n it(\"should return Ok for valid array\", async () => {\n const result = await arrayType.validate([1, 2, 3]);\n expect(result.criticality).to.equal(ParseAndValidationCriticality.Ok);\n });\n });\n\n describe(\"format\", () => {\n it(\"should format an array of numbers\", () => {\n const result = arrayType.format([1, 2, 3]);\n expect(result).to.deep.equal([\"1\", \"2\", \"3\"]);\n });\n\n it(\"should return empty array if value is undefined\", () => {\n const result = arrayType.format(undefined as any);\n expect(result).to.deep.equal([]);\n });\n });\n});"]}
|
|
@@ -23,17 +23,18 @@ export type AttributeTypeOptions<InternalType> = {
|
|
|
23
23
|
extensionConfigurations?: ExtensionConfiguration[];
|
|
24
24
|
};
|
|
25
25
|
export type parseResult<T> = {
|
|
26
|
-
value: T | undefined;
|
|
26
|
+
value: T | undefined | null;
|
|
27
27
|
deepResult: ParseAndValidationResult;
|
|
28
28
|
};
|
|
29
29
|
export interface ExtensionConfiguration {
|
|
30
30
|
extensionName: string;
|
|
31
31
|
}
|
|
32
32
|
export declare function registerGlobalExtensionConfiguration(typeName: string, config: ExtensionConfiguration): void;
|
|
33
|
-
export declare class AttributeType<InternalType, ExternalType = string> {
|
|
33
|
+
export declare class AttributeType<InternalType = string, ExternalType = string> {
|
|
34
34
|
value?: InternalType;
|
|
35
|
+
searchType?: AttributeType<any, any>;
|
|
35
36
|
extensionsConfigurations: Record<string, ExtensionConfiguration>;
|
|
36
|
-
get defaultValue(): InternalType | undefined;
|
|
37
|
+
get defaultValue(): InternalType | undefined | null;
|
|
37
38
|
_defaultValue?: InternalType | undefined;
|
|
38
39
|
allowNull?: boolean;
|
|
39
40
|
constructor(options?: AttributeTypeOptions<InternalType>);
|
|
@@ -16,9 +16,10 @@ export function registerGlobalExtensionConfiguration(typeName, config) {
|
|
|
16
16
|
}
|
|
17
17
|
export class AttributeType {
|
|
18
18
|
value;
|
|
19
|
+
searchType;
|
|
19
20
|
extensionsConfigurations = {};
|
|
20
21
|
get defaultValue() {
|
|
21
|
-
return this._defaultValue;
|
|
22
|
+
return this._defaultValue ?? (this.allowNull ? null : undefined);
|
|
22
23
|
}
|
|
23
24
|
_defaultValue;
|
|
24
25
|
allowNull = true;
|
|
@@ -26,6 +27,9 @@ export class AttributeType {
|
|
|
26
27
|
options = options || {};
|
|
27
28
|
this._defaultValue = options.defaultValue;
|
|
28
29
|
this.allowNull = options.allowNull !== undefined ? options.allowNull : true;
|
|
30
|
+
if (!this.allowNull && !options.defaultValue) {
|
|
31
|
+
throw new Error("If allowNull is false, a defaultValue must be provided!");
|
|
32
|
+
}
|
|
29
33
|
if (options.extensionConfigurations) {
|
|
30
34
|
for (const extConfig of options.extensionConfigurations) {
|
|
31
35
|
this.extensionsConfigurations[extConfig.extensionName] = extConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttributeType.js","sourceRoot":"","sources":["../../../src/types/base/AttributeType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,6BAOX;AAPD,WAAY,6BAA6B;IACvC,6EAAM,CAAA;IACN,mFAAK,CAAA;IACL,mFAAK,CAAA;IACL,iFAAI,CAAA;IACJ,iFAAI,CAAA;IACJ,mFAAK,CAAA;AACP,CAAC,EAPW,6BAA6B,KAA7B,6BAA6B,QAOxC;AAuBD,IAAI,6BAA6B,GAA2D,EAAE,CAAA;AAE9F,MAAM,UAAU,oCAAoC,CAAC,QAAgB,EAAE,MAA8B;IACjG,IAAG,CAAC,6BAA6B,CAAC,QAAQ,CAAC,EAAC,CAAC;QACzC,6BAA6B,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;IAChD,CAAC;IACD,6BAA6B,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAA;AAC1E,CAAC;AAED,MAAM,OAAO,aAAa;IACtB,KAAK,CAAe;IACpB,wBAAwB,GAA2C,EAAE,CAAA;IACrE,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"AttributeType.js","sourceRoot":"","sources":["../../../src/types/base/AttributeType.ts"],"names":[],"mappings":"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","sourcesContent":["export enum ParseAndValidationCriticality {\n Ok = 0,\n Silly,\n Debug,\n Info,\n Warn,\n Error,\n}\nexport type ParseAndValidationResult = {\n criticality: ParseAndValidationCriticality\n messages: ParseAndValidationMessage[]\n subValidationResults?: {[key:string]:ParseAndValidationResult}\n}\nexport type ParseAndValidationMessage = {\n criticality: ParseAndValidationCriticality\n message: string\n}\n\nexport type AttributeTypeOptions<InternalType> = {\n defaultValue?: InternalType\n allowNull?: boolean\n extensionConfigurations?: ExtensionConfiguration[]\n}\n\nexport type parseResult<T>= {value: T|undefined|null, deepResult: ParseAndValidationResult}\n\nexport interface ExtensionConfiguration {\n extensionName: string\n}\n\nlet globalExtensionConfigurations: Record<string, Record<string, ExtensionConfiguration>> = {}\n\nexport function registerGlobalExtensionConfiguration(typeName: string, config: ExtensionConfiguration) {\n if(!globalExtensionConfigurations[typeName]){\n globalExtensionConfigurations[typeName] = {}\n }\n globalExtensionConfigurations[typeName][config.extensionName] = config\n}\n\nexport class AttributeType<InternalType = string, ExternalType = string> {\n value?: InternalType\n searchType?: AttributeType<any, any>\n extensionsConfigurations: Record<string, ExtensionConfiguration> = {}\n get defaultValue(): InternalType | undefined | null {\n return this._defaultValue ?? ( this.allowNull ? null : undefined )\n }\n _defaultValue?: InternalType | undefined\n allowNull?: boolean = true\n constructor(options?: AttributeTypeOptions<InternalType>) {\n options = options || {}\n this._defaultValue = options.defaultValue\n this.allowNull = options.allowNull !== undefined ? options.allowNull : true\n if(!this.allowNull && !options.defaultValue){ \n throw new Error(\"If allowNull is false, a defaultValue must be provided!\")\n }\n if (options.extensionConfigurations) {\n for (const extConfig of options.extensionConfigurations) {\n this.extensionsConfigurations[extConfig.extensionName] = extConfig\n }\n }\n }\n parse(value: ExternalType): parseResult<InternalType> {\n throw new Error(\"Method not implemented.\");\n }\n format(value: InternalType): ExternalType {\n throw new Error(\"Method not implemented.\");\n }\n async validate(value: InternalType, level: ParseAndValidationCriticality = ParseAndValidationCriticality.Info): Promise<ParseAndValidationResult> {\n let validateionObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok, messages:[]}\n if(!value && this.allowNull===false)\n validateionObject.messages.push({criticality:ParseAndValidationCriticality.Error, message:\"Feld darf nicht leer sein.\"})\n return validateionObject\n }\n getExtensionConfiguration(extensionName: string): ExtensionConfiguration | undefined {\n let obj = this as AttributeType<any, any>\n while(obj){\n if(obj.extensionsConfigurations && obj.extensionsConfigurations[extensionName]){\n return obj.extensionsConfigurations[extensionName]\n }\n if( globalExtensionConfigurations[obj.constructor.name] && globalExtensionConfigurations[obj.constructor.name][extensionName]){\n return globalExtensionConfigurations[obj.constructor.name][extensionName]\n }\n obj = Object.getPrototypeOf(obj)\n }\n return undefined\n }\n}"]}
|
|
@@ -2,9 +2,9 @@ import { AttributeType, AttributeTypeOptions, parseResult } from "./AttributeTyp
|
|
|
2
2
|
export type BooleanTypeOptions = AttributeTypeOptions<boolean> & {
|
|
3
3
|
truthyValues?: string[];
|
|
4
4
|
};
|
|
5
|
-
export declare class BooleanType extends AttributeType<boolean> {
|
|
5
|
+
export declare class BooleanType extends AttributeType<boolean | null | undefined> {
|
|
6
6
|
truthyValues: string[];
|
|
7
7
|
constructor(options?: BooleanTypeOptions);
|
|
8
8
|
parse(value: string): parseResult<boolean>;
|
|
9
|
-
format(value: boolean): string;
|
|
9
|
+
format(value: boolean | null | undefined): string;
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BooleanType.js","sourceRoot":"","sources":["../../../src/types/base/BooleanType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAwB,6BAA6B,EAAe,MAAM,oBAAoB,CAAC;AAMrH,MAAM,OAAO,WAAY,SAAQ,
|
|
1
|
+
{"version":3,"file":"BooleanType.js","sourceRoot":"","sources":["../../../src/types/base/BooleanType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAwB,6BAA6B,EAAe,MAAM,oBAAoB,CAAC;AAMrH,MAAM,OAAO,WAAY,SAAQ,aAAyC;IACtE,YAAY,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IAC9C,YAAY,OAA4B;QACpC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAA;QACvB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;QAC5C,CAAC;IACL,CAAC;IACD,KAAK,CAAC,KAAa;QACf,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,EAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,6BAA6B,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAC,WAAW,EAAE,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAC,qCAAqC,EAAC,CAAC,EAAE,EAAC,CAAA;QACpN,CAAC;aACI,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACvD,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAA;QACtG,CAAC;QACD,OAAO,EAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAA;IACvG,CAAC;IACD,MAAM,CAAC,KAAiC;QACpC,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACpC,CAAC;CACJ","sourcesContent":["import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, parseResult } from \"./AttributeType.js\";\n\nexport type BooleanTypeOptions = AttributeTypeOptions<boolean> & {\n truthyValues?: string[]\n} \n\nexport class BooleanType extends AttributeType<boolean | null | undefined> {\n truthyValues = [\"true\", \"1\", \"yes\", \"on\", \"x\"]\n constructor(options?: BooleanTypeOptions) {\n options = options || {}\n super(options)\n if (options.truthyValues) {\n this.truthyValues = options.truthyValues\n }\n }\n parse(value: string): parseResult<boolean> {\n if (value === undefined || value === null) {\n return {value: this.defaultValue, deepResult: { criticality: ParseAndValidationCriticality.Info, messages: [{criticality: ParseAndValidationCriticality.Info, message:'No value given using default Value!'}] }}\n }\n else if (this.truthyValues.includes(value.toLowerCase())) {\n return {value: true, deepResult: { criticality: ParseAndValidationCriticality.Ok, messages: [] } }\n }\n return {value: false, deepResult: { criticality: ParseAndValidationCriticality.Ok, messages: [] } }\n }\n format(value: boolean | null | undefined): string {\n return value ? \"true\" : \"false\";\n }\n}"]}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from "./AttributeType.js";
|
|
2
|
+
import { StringType } from "./StringType.js";
|
|
2
3
|
export type NumberTypeOptions = {
|
|
3
4
|
max?: number;
|
|
4
5
|
min?: number;
|
|
5
6
|
} & AttributeTypeOptions<number>;
|
|
6
|
-
export declare class NumberType extends AttributeType<number> {
|
|
7
|
+
export declare class NumberType extends AttributeType<number | null | undefined> {
|
|
8
|
+
searchType: StringType<string>;
|
|
7
9
|
max: number;
|
|
8
10
|
min: number;
|
|
9
11
|
constructor(options?: NumberTypeOptions);
|
|
10
12
|
parse(value: string): parseResult<number>;
|
|
11
13
|
validate(value: number, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult>;
|
|
12
|
-
format(value: number): string;
|
|
14
|
+
format(value: number | undefined | null): string;
|
|
13
15
|
}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { AttributeType, ParseAndValidationCriticality } from "./AttributeType.js";
|
|
2
|
+
import { StringType } from "./StringType.js";
|
|
2
3
|
export class NumberType extends AttributeType {
|
|
4
|
+
searchType = new StringType({
|
|
5
|
+
parsePattern: /^[=<>]{0,2}-?\d+(\.\,\d+)?$/,
|
|
6
|
+
parsePatternMessage: 'Number search pattern not matched. Use e.g. "=10", "<=20", ">15"',
|
|
7
|
+
});
|
|
3
8
|
max;
|
|
4
9
|
min;
|
|
5
10
|
constructor(options) {
|
|
@@ -32,7 +37,7 @@ export class NumberType extends AttributeType {
|
|
|
32
37
|
return Promise.resolve(validationObject);
|
|
33
38
|
}
|
|
34
39
|
format(value) {
|
|
35
|
-
return value
|
|
40
|
+
return value?.toString() ?? "";
|
|
36
41
|
}
|
|
37
42
|
}
|
|
38
43
|
//# sourceMappingURL=NumberType.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberType.js","sourceRoot":"","sources":["../../../src/types/base/NumberType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAwB,6BAA6B,EAAyC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"NumberType.js","sourceRoot":"","sources":["../../../src/types/base/NumberType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAwB,6BAA6B,EAAyC,MAAM,oBAAoB,CAAC;AAC/I,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAO7C,MAAM,OAAO,UAAW,SAAQ,aAAwC;IACpE,UAAU,GAAG,IAAI,UAAU,CAAC;QACxB,YAAY,EAAE,6BAA6B;QAC3C,mBAAmB,EAAE,kEAAkE;KAC1F,CAAC,CAAA;IACF,GAAG,CAAQ;IACX,GAAG,CAAQ;IACX,YAAY,OAA2B;QACnC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAA;QACvB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAA;QAClC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;IACvC,CAAC;IACD,KAAK,CAAC,KAAa;QACf,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAChC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAChB,OAAO,EAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,6BAA6B,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,EAAE,EAAC,CAAA;QACrN,CAAC;QACD,OAAO,EAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAA;IACxG,CAAC;IACD,QAAQ,CAAC,KAAa,EAAE,KAAqC;QACzD,IAAI,gBAAgB,GAA6B,EAAE,WAAW,EAAE,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QAChH,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACf,gBAAgB,CAAC,WAAW,GAAG,6BAA6B,CAAC,KAAK,CAAA;YAClE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;QACjH,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,gBAAgB,CAAC,WAAW,GAAG,6BAA6B,CAAC,KAAK,CAAA;YAClE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,8BAA8B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC3I,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,gBAAgB,CAAC,WAAW,GAAG,6BAA6B,CAAC,KAAK,CAAA;YAClE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,iCAAiC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC9I,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC5C,CAAC;IACD,MAAM,CAAC,KAAgC;QACnC,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClC,CAAC;CACJ","sourcesContent":["import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from \"./AttributeType.js\";\nimport { StringType } from \"./StringType.js\";\n\nexport type NumberTypeOptions = {\n max?: number,\n min?: number\n} & AttributeTypeOptions<number>\n\nexport class NumberType extends AttributeType<number | null | undefined> {\n searchType = new StringType({\n parsePattern: /^[=<>]{0,2}-?\\d+(\\.\\,\\d+)?$/,\n parsePatternMessage: 'Number search pattern not matched. Use e.g. \"=10\", \"<=20\", \">15\"',\n })\n max: number \n min: number \n constructor(options?: NumberTypeOptions) {\n options = options || {}\n super(options)\n this.max = options.max || Infinity\n this.min = options.min || -Infinity\n }\n parse(value: string): parseResult<number> {\n const number = parseFloat(value)\n if (isNaN(number)) {\n return {value: this.defaultValue, deepResult: { criticality: ParseAndValidationCriticality.Warn, messages: [{ criticality: ParseAndValidationCriticality.Warn, message: \"Not a number useing default Value\" }] }}\n }\n return {value: number, deepResult: { criticality: ParseAndValidationCriticality.Ok, messages: [] } }\n }\n validate(value: number, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult> {\n let validationObject: ParseAndValidationResult = { criticality: ParseAndValidationCriticality.Ok, messages: [] }\n if (isNaN(value)) {\n validationObject.criticality = ParseAndValidationCriticality.Error\n validationObject.messages.push({ criticality: ParseAndValidationCriticality.Error, message: \"Not a number\" })\n }\n if (value < this.min) {\n validationObject.criticality = ParseAndValidationCriticality.Error\n validationObject.messages.push({ criticality: ParseAndValidationCriticality.Error, message: `Value is less than minimum ${this.min}` })\n }\n if (value > this.max) {\n validationObject.criticality = ParseAndValidationCriticality.Error\n validationObject.messages.push({ criticality: ParseAndValidationCriticality.Error, message: `Value is greater than maximum ${this.max}` })\n }\n return Promise.resolve(validationObject)\n }\n format(value: number | undefined | null): string {\n return value?.toString() ?? \"\"\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StringArrayType.js","sourceRoot":"","sources":["../../../src/types/base/StringArrayType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"StringArrayType.js","sourceRoot":"","sources":["../../../src/types/base/StringArrayType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,eAAgB,SAAQ,SAAqB;IACtD,IAAI,GAAG,IAAI,UAAU,EAAE,CAAA;CAM1B","sourcesContent":["import { ArrayType, ArrayTypeOptions } from \"./ArrayType.js\";\nimport { StringType } from \"./StringType.js\";\n\nexport class StringArrayType extends ArrayType<StringType>{\n type = new StringType()\n /*constructor(options?:ArrayTypeOptions<StringType>) {\n options = options || {type: new StringType()}\n options.type = options.type || new StringType()\n super({type: new StringType()})\n }*/\n}"]}
|
|
@@ -10,7 +10,7 @@ export type StringTypeOptions = AttributeTypeOptions<string> & {
|
|
|
10
10
|
formatPattern?: RegExp;
|
|
11
11
|
formatReplacement?: string;
|
|
12
12
|
};
|
|
13
|
-
|
|
13
|
+
declare class StringHelperType<ExternalType extends string = string> extends AttributeType<string | null | undefined, ExternalType> {
|
|
14
14
|
maxLength: number;
|
|
15
15
|
minLength: number;
|
|
16
16
|
parsePattern: RegExp | null;
|
|
@@ -23,5 +23,10 @@ export declare class StringType<ExternalType extends string = string> extends At
|
|
|
23
23
|
constructor(options?: StringTypeOptions);
|
|
24
24
|
parse(value: ExternalType): parseResult<string>;
|
|
25
25
|
validate(value: string, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult>;
|
|
26
|
-
format(value: string): ExternalType;
|
|
26
|
+
format(value: string | null | undefined): ExternalType;
|
|
27
27
|
}
|
|
28
|
+
export declare class StringType<ExternalType extends string = string> extends StringHelperType<ExternalType> {
|
|
29
|
+
searchType: StringHelperType<string>;
|
|
30
|
+
constructor(options?: StringTypeOptions);
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AttributeType, ParseAndValidationCriticality } from "./AttributeType.js";
|
|
2
|
-
|
|
2
|
+
class StringHelperType extends AttributeType {
|
|
3
3
|
maxLength;
|
|
4
4
|
minLength;
|
|
5
5
|
parsePattern;
|
|
@@ -50,10 +50,18 @@ export class StringType extends AttributeType {
|
|
|
50
50
|
return validationObject;
|
|
51
51
|
}
|
|
52
52
|
format(value) {
|
|
53
|
+
if (!value)
|
|
54
|
+
return "";
|
|
53
55
|
if (this.formatPattern && this.formatReplacement) {
|
|
54
56
|
value = value.replace(this.formatPattern, this.formatReplacement);
|
|
55
57
|
}
|
|
56
58
|
return value;
|
|
57
59
|
}
|
|
58
60
|
}
|
|
61
|
+
export class StringType extends StringHelperType {
|
|
62
|
+
searchType = new StringHelperType();
|
|
63
|
+
constructor(options) {
|
|
64
|
+
super(options);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
59
67
|
//# sourceMappingURL=StringType.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StringType.js","sourceRoot":"","sources":["../../../src/types/base/StringType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAwB,6BAA6B,EAAyC,MAAM,oBAAoB,CAAC;AAc/I,MAAM,
|
|
1
|
+
{"version":3,"file":"StringType.js","sourceRoot":"","sources":["../../../src/types/base/StringType.ts"],"names":[],"mappings":"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","sourcesContent":["import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from \"./AttributeType.js\";\n\nexport type StringTypeOptions = AttributeTypeOptions<string> & {\n maxLength?: number\n minLength?: number\n matchPattern?: RegExp\n matchPatternMessage?: string\n parsePattern?: RegExp\n parseReplacement?: string\n parsePatternMessage?: string\n formatPattern?: RegExp\n formatReplacement?: string\n}\n\nclass StringHelperType<ExternalType extends string = string> extends AttributeType<string | null | undefined, ExternalType> {\n maxLength: number\n minLength: number\n parsePattern: RegExp | null\n parseReplacement: string | null\n parsePatternMessage: string \n matchPattern: RegExp | null\n matchPatternMessage: string | null\n formatPattern: RegExp | null \n formatReplacement: string | null \n constructor(options?: StringTypeOptions) {\n options = options || {}\n super(options)\n this.maxLength = options.maxLength || 255\n this.minLength = options.minLength || 0\n this.parsePattern = options.parsePattern || null\n this.parseReplacement = options.parseReplacement || null\n this.parsePatternMessage = options.parsePatternMessage || `Parse pattern not matched: \"${this.parsePattern}\"`\n this.matchPattern = options.matchPattern || null\n this.matchPatternMessage = options.matchPatternMessage || null\n this.formatPattern = options.formatPattern || null\n this.formatReplacement = options.formatReplacement || null\n }\n parse(value: ExternalType): parseResult<string> {\n if(!value) return {value: this.defaultValue, deepResult: { criticality: ParseAndValidationCriticality.Info, messages: [{criticality: ParseAndValidationCriticality.Info, message:'No value given using default Value!'}] }}\n if(this.parsePattern && this.parseReplacement){\n if(!this.parsePattern.test(value)) throw new Error(this.parsePatternMessage)\n value = value.replace(this.parsePattern, this.parseReplacement) as ExternalType\n }\n return {value, deepResult: { criticality: ParseAndValidationCriticality.Ok, messages: [] } } \n }\n async validate(value: string, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult> {\n console.log(\"Validating string:\", value)\n let validationObject = await super.validate(value, level)\n if(value && this.matchPattern && !this.matchPattern.test(value)){\n validationObject.messages.push({criticality:ParseAndValidationCriticality.Error, message: this.matchPatternMessage || `Validierungsmuster nicht erfüllt: \"${this.matchPattern}\"`})\n validationObject.criticality=Math.max(validationObject.criticality,ParseAndValidationCriticality.Error)\n }\n if(value && value.length < this.minLength){\n validationObject.messages.push({criticality:ParseAndValidationCriticality.Error, message: `Es müssen mindesten ${this.minLength} Zeichen eingegeben werden.`})\n validationObject.criticality=Math.max(validationObject.criticality,ParseAndValidationCriticality.Error)\n }\n if(value && value.length > this.maxLength){\n validationObject.messages.push({criticality:ParseAndValidationCriticality.Error, message: `Es dürfen maximal ${this.maxLength} Zeichen eingegeben werden.`})\n validationObject.criticality=Math.max(validationObject.criticality,ParseAndValidationCriticality.Error)\n }\n return validationObject\n }\n format(value: string | null | undefined): ExternalType {\n if(!value) return \"\" as ExternalType\n if(this.formatPattern && this.formatReplacement){\n value = value.replace(this.formatPattern, this.formatReplacement)\n }\n return value as ExternalType;\n }\n}\n\n\nexport class StringType<ExternalType extends string = string> extends StringHelperType<ExternalType> {\n searchType = new StringHelperType()\n constructor(options?: StringTypeOptions) {\n super(options)\n }\n}"]}
|
package/dist/util/InferType.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Model } from "../model/base/Model.js";
|
|
1
|
+
import { Model, PropertyOptions } from "../model/base/Model.js";
|
|
2
2
|
import { ArrayType } from "../types/base/ArrayType.js";
|
|
3
3
|
import { AttributeType } from "../types/base/AttributeType.js";
|
|
4
4
|
type OptionalKeys<T> = {
|
|
@@ -9,7 +9,19 @@ type OptionalKeys<T> = {
|
|
|
9
9
|
type PartialPartial<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K> extends infer O ? {
|
|
10
10
|
[P in keyof O]: O[P];
|
|
11
11
|
} : never;
|
|
12
|
-
export type
|
|
13
|
-
[K in keyof T
|
|
14
|
-
}, OptionalKeys<T
|
|
12
|
+
export type InferModelProperties<T extends Record<string, PropertyOptions>> = PartialPartial<{
|
|
13
|
+
[K in keyof T]: InferType<T[K]["type"]>;
|
|
14
|
+
}, OptionalKeys<T>>;
|
|
15
|
+
export type InferExternalModelProperties<T extends Record<string, PropertyOptions>> = PartialPartial<{
|
|
16
|
+
[K in keyof T]: InferExternalType<T[K]["type"]>;
|
|
17
|
+
}, OptionalKeys<T>>;
|
|
18
|
+
export type InferType<T> = T extends {
|
|
19
|
+
properties: infer U extends Record<string, PropertyOptions>;
|
|
20
|
+
} ? InferModelProperties<U> : T extends ArrayType<infer U> ? InferType<T["type"]>[] : T extends AttributeType<infer U> ? U : never;
|
|
21
|
+
export type InferExternalType<T> = T extends {
|
|
22
|
+
properties: infer U extends Record<string, PropertyOptions>;
|
|
23
|
+
} ? InferExternalModelProperties<U> : T extends ArrayType<infer U> ? InferExternalType<T["type"]>[] : T extends AttributeType<any, infer U> ? U : never;
|
|
24
|
+
export type InferSearchType<T> = T extends Model ? PartialPartial<{
|
|
25
|
+
[K in keyof T["properties"]]: InferSearchType<T["properties"][K]["type"]>;
|
|
26
|
+
}, OptionalKeys<T["properties"]>> : T extends ArrayType<infer U> ? InferSearchType<T["type"]> : T extends AttributeType<any, any> ? InferType<T["searchType"]> : never;
|
|
15
27
|
export {};
|
package/dist/util/InferType.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InferType.js","sourceRoot":"","sources":["../../src/util/InferType.ts"],"names":[],"mappings":"","sourcesContent":["import { Model } from \"../model/base/Model.js\";\nimport { ArrayType } from \"../types/base/ArrayType.js\";\nimport { AttributeType } from \"../types/base/AttributeType.js\";\n\n\ntype RequriedKeys<T> = {\n [K in keyof T]: T[K] extends { required: true } ? K : never;\n}[keyof T];\n\ntype OptionalKeys<T> = {\n [K in keyof T]: T[K] extends { required: true } ? never : K;\n}[keyof T];\n\ntype PartialPartial<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K> extends\n infer O ? { [P in keyof O]: O[P] } : never;\n\nexport type InferType<T> = T extends
|
|
1
|
+
{"version":3,"file":"InferType.js","sourceRoot":"","sources":["../../src/util/InferType.ts"],"names":[],"mappings":";AA2DA,wCAAwC;AACxC,yCAAyC","sourcesContent":["import { Model, PropertyOptions } from \"../model/base/Model.js\";\nimport { ArrayType } from \"../types/base/ArrayType.js\";\nimport { AttributeType } from \"../types/base/AttributeType.js\";\n\n\ntype RequriedKeys<T> = {\n [K in keyof T]: T[K] extends { required: true } ? K : never;\n}[keyof T];\n\n\n\ntype OptionalKeys<T> = {\n [K in keyof T]: T[K] extends { required: true } ? never : K;\n}[keyof T];\n\ntype PartialPartial<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K> extends\n infer O ? { [P in keyof O]: O[P] } : never;\n\nexport type InferModelProperties<T extends Record<string, PropertyOptions>> = \n PartialPartial<{[K in keyof T]: InferType<T[K][\"type\"]>},\n OptionalKeys<T>>\n\nexport type InferExternalModelProperties<T extends Record<string, PropertyOptions>> = \n PartialPartial<{[K in keyof T]: InferExternalType<T[K][\"type\"]>},\n OptionalKeys<T>>\n\nexport type InferType<T> = T extends {properties: infer U extends Record<string, PropertyOptions>}\n ? InferModelProperties<U> \n // PartialPartial<{[K in keyof T[\"properties\"]]: InferType<T[\"properties\"][K][\"type\"]>},\n // OptionalKeys<T[\"properties\"]>>\n \n : T extends ArrayType<infer U>\n ? InferType<T[\"type\"]>[]\n : \n T extends AttributeType<infer U>\n ? U\n : never;\n\nexport type InferExternalType<T> = T extends {properties: infer U extends Record<string, PropertyOptions>}\n ? InferExternalModelProperties<U>\n \n : T extends ArrayType<infer U>\n ? InferExternalType<T[\"type\"]>[]\n : \n T extends AttributeType<any, infer U>\n ? U\n : never;\n\nexport type InferSearchType<T> = T extends Model\n ? \n PartialPartial<{[K in keyof T[\"properties\"]]: InferSearchType<T[\"properties\"][K][\"type\"]>},\n OptionalKeys<T[\"properties\"]>>\n \n : T extends ArrayType<infer U>\n ? InferSearchType<T[\"type\"]>\n : \n T extends AttributeType<any, any>\n ? InferType<T[\"searchType\"]>\n : never;\n// type Test = InferInternalType<Config>\n// type Test2 = InferExternalType<Config>"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fogui-common",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "FogUi common files",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fogui"
|
|
@@ -22,12 +22,10 @@
|
|
|
22
22
|
"build": "tsc"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"mocha": "^11.7.2",
|
|
26
|
-
"typescript": "^5.9.2",
|
|
27
25
|
"@types/chai": "^5.2.2",
|
|
28
26
|
"@types/mocha": "^10.0.10",
|
|
29
|
-
"chai": "^6.0.1"
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
"chai": "^6.0.1",
|
|
28
|
+
"mocha": "^11.7.2",
|
|
29
|
+
"typescript": "^5.9.3"
|
|
32
30
|
}
|
|
33
31
|
}
|
|
@@ -1,9 +1,39 @@
|
|
|
1
1
|
import { assert } from "chai"
|
|
2
|
-
import {
|
|
2
|
+
import { Model } from "./Model.js";
|
|
3
|
+
import { ArrayType, AttributeType, BooleanType, InferExternalType, InferModelProperties, InferType, NumberType, required, StringType } from "../../index.js"
|
|
3
4
|
import { StringArrayType } from "../../types/base/StringArrayType.js";
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
describe("Model", () => {
|
|
8
|
+
it("should get default values from model", ()=>{
|
|
9
|
+
class Person extends Model {
|
|
10
|
+
properties = {
|
|
11
|
+
name: { required, type: new StringType({defaultValue: ""}) },
|
|
12
|
+
//@ts-expect-error
|
|
13
|
+
age: { type: new NumberType({defaultValue: null}) },
|
|
14
|
+
isActive: { required, type: new BooleanType({defaultValue: false}) },
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let bla = new StringType({defaultValue:"test"})
|
|
19
|
+
|
|
20
|
+
const personModel = new Person()
|
|
21
|
+
let defaultValue:InferType<Person> = personModel.defaultValue
|
|
22
|
+
|
|
23
|
+
assert.deepEqual(defaultValue, {
|
|
24
|
+
name: "",
|
|
25
|
+
age: null,
|
|
26
|
+
isActive: false,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
let externalDefaultValue:InferExternalType<Person> = personModel.format(defaultValue)
|
|
30
|
+
|
|
31
|
+
assert.deepEqual(externalDefaultValue, {
|
|
32
|
+
name: "",
|
|
33
|
+
age: "",
|
|
34
|
+
isActive: "false"
|
|
35
|
+
})
|
|
36
|
+
})
|
|
7
37
|
it("should parse a model with required and optional properties", () => {
|
|
8
38
|
class AddressType extends Model {
|
|
9
39
|
properties = {
|
package/src/model/base/Model.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { AttributeType, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from "../../types/base/AttributeType.js";
|
|
2
|
-
import { InferType } from "../../util/InferType.js";
|
|
2
|
+
import { InferExternalType, InferType } from "../../util/InferType.js";
|
|
3
3
|
|
|
4
4
|
export const required = true as const
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
interface PropertyOptions {
|
|
7
|
+
export interface PropertyOptions {
|
|
8
8
|
required?: boolean;
|
|
9
9
|
type: AttributeType<any, any>;
|
|
10
10
|
}
|
|
@@ -12,6 +12,28 @@ interface PropertyOptions {
|
|
|
12
12
|
|
|
13
13
|
export class Model extends AttributeType<object,Record<string, any>> {
|
|
14
14
|
properties: Record<string, PropertyOptions> = {};
|
|
15
|
+
get defaultValue(): InferType<this> {
|
|
16
|
+
const obj: any = {};
|
|
17
|
+
for (const key in this.properties) {
|
|
18
|
+
let defaultValue = this.properties[key].type.defaultValue;
|
|
19
|
+
if (
|
|
20
|
+
!this.properties[key].required && defaultValue === undefined) {
|
|
21
|
+
continue
|
|
22
|
+
}
|
|
23
|
+
obj[key] = defaultValue;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
format(value: InferType<this>): InferExternalType<this> {
|
|
28
|
+
const obj: any = {};
|
|
29
|
+
if(!value) throw new Error("Cannot format undefined value")
|
|
30
|
+
for (const key in this.properties) {
|
|
31
|
+
if (value[key] !== undefined) {
|
|
32
|
+
obj[key] = this.properties[key].type.format(value[key]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return obj;
|
|
36
|
+
}
|
|
15
37
|
parse(value: Record<string, any>): parseResult<InferType<this>> {
|
|
16
38
|
const obj: any = {};
|
|
17
39
|
let validationObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok,messages:[]}
|
|
@@ -30,12 +52,12 @@ export class Model extends AttributeType<object,Record<string, any>> {
|
|
|
30
52
|
}
|
|
31
53
|
return {value: obj, deepResult: validationObject};
|
|
32
54
|
}
|
|
33
|
-
async validate(value: { [key: string]: any}, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult> {
|
|
55
|
+
async validate(value: { [key: string]: any} | null, level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult> {
|
|
34
56
|
let validationObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok,messages:[]}
|
|
35
57
|
validationObject.subValidationResults={}
|
|
36
58
|
for(let propertyName in this.properties){
|
|
37
59
|
let property = this.properties[propertyName]
|
|
38
|
-
if(value[propertyName]===undefined ){
|
|
60
|
+
if(value == null || value[propertyName]===undefined ){
|
|
39
61
|
if(property.required){
|
|
40
62
|
validationObject.messages.push({criticality:ParseAndValidationCriticality.Error, message:`Property "${propertyName}" is required.`})
|
|
41
63
|
validationObject.criticality=Math.max(validationObject.criticality,ParseAndValidationCriticality.Error)
|
|
@@ -5,8 +5,10 @@ import { NumberType } from "./NumberType.js";
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class NumberArrayType extends ArrayType<
|
|
9
|
-
|
|
8
|
+
class NumberArrayType extends ArrayType<NumberType> {
|
|
9
|
+
constructor() {
|
|
10
|
+
super({type: new NumberType()})
|
|
11
|
+
}
|
|
10
12
|
}
|
|
11
13
|
|
|
12
14
|
describe("ArrayType", () => {
|
|
@@ -1,31 +1,33 @@
|
|
|
1
|
+
import { InferExternalType, InferType } from "../../util/InferType.js";
|
|
1
2
|
import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from "./AttributeType.js";
|
|
2
3
|
|
|
3
4
|
|
|
4
|
-
export type ArrayTypeOptions = AttributeTypeOptions<any[]> &{
|
|
5
|
-
type:
|
|
5
|
+
export type ArrayTypeOptions<T> = AttributeTypeOptions<any[]> &{
|
|
6
|
+
type: T
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
constructor(options?: ArrayTypeOptions) {
|
|
10
|
+
export class ArrayType<T extends AttributeType<any, any>> extends AttributeType<InferType<T>[],InferExternalType<T>[]> {
|
|
11
|
+
type: T
|
|
12
|
+
constructor(options?: ArrayTypeOptions<T>) {
|
|
12
13
|
super(options)
|
|
14
|
+
this.type = options?.type ? options.type : new AttributeType() as T
|
|
13
15
|
}
|
|
14
|
-
parse(value:
|
|
16
|
+
parse(value: InferExternalType<T>[]): parseResult<InferType<T>[]> {
|
|
15
17
|
let resultObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok,messages:[]}
|
|
16
18
|
resultObject.subValidationResults={}
|
|
17
|
-
let returnObject:
|
|
19
|
+
let returnObject:InferType<T>[] = []
|
|
18
20
|
if(!value) return {value: this.defaultValue, deepResult: { criticality: ParseAndValidationCriticality.Info, messages: [{criticality: ParseAndValidationCriticality.Info, message:'No value given using default Value!'}] }}
|
|
19
21
|
if(!Array.isArray(value)) return {value: this.defaultValue, deepResult: { criticality: ParseAndValidationCriticality.Error, messages: [{criticality: ParseAndValidationCriticality.Error, message:'Value is not an array'}] }}
|
|
20
22
|
for(let i=0; i< value.length; i++){
|
|
21
23
|
const result = this.type.parse(value[i])
|
|
22
24
|
resultObject.criticality = Math.max(resultObject.criticality, result.deepResult.criticality)
|
|
23
25
|
resultObject.subValidationResults[i] = resultObject
|
|
24
|
-
returnObject.push(result.value as
|
|
26
|
+
returnObject.push(result.value as InferType<T>)
|
|
25
27
|
}
|
|
26
28
|
return {value: returnObject, deepResult: resultObject}
|
|
27
29
|
}
|
|
28
|
-
async validate(value:
|
|
30
|
+
async validate(value: InferType<T>[], level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult> {
|
|
29
31
|
let validationObject:ParseAndValidationResult = {
|
|
30
32
|
criticality: ParseAndValidationCriticality.Ok, messages: [], subValidationResults: {}
|
|
31
33
|
}
|
|
@@ -37,8 +39,8 @@ export abstract class ArrayType<InternalType,ExternalType> extends AttributeType
|
|
|
37
39
|
}
|
|
38
40
|
return validationObject
|
|
39
41
|
}
|
|
40
|
-
format(value:
|
|
42
|
+
format(value: InferType<T>[]): InferExternalType<T>[] {
|
|
41
43
|
if(!value) return []
|
|
42
|
-
return value.map(v=>this.type.format(v) as
|
|
44
|
+
return value.map(v=>this.type.format(v) as InferExternalType<T>)
|
|
43
45
|
}
|
|
44
46
|
}
|
|
@@ -22,7 +22,7 @@ export type AttributeTypeOptions<InternalType> = {
|
|
|
22
22
|
extensionConfigurations?: ExtensionConfiguration[]
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export type parseResult<T>= {value: T|undefined, deepResult: ParseAndValidationResult}
|
|
25
|
+
export type parseResult<T>= {value: T|undefined|null, deepResult: ParseAndValidationResult}
|
|
26
26
|
|
|
27
27
|
export interface ExtensionConfiguration {
|
|
28
28
|
extensionName: string
|
|
@@ -37,11 +37,12 @@ export function registerGlobalExtensionConfiguration(typeName: string, config: E
|
|
|
37
37
|
globalExtensionConfigurations[typeName][config.extensionName] = config
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
export class AttributeType<InternalType, ExternalType = string> {
|
|
40
|
+
export class AttributeType<InternalType = string, ExternalType = string> {
|
|
41
41
|
value?: InternalType
|
|
42
|
+
searchType?: AttributeType<any, any>
|
|
42
43
|
extensionsConfigurations: Record<string, ExtensionConfiguration> = {}
|
|
43
|
-
get defaultValue(): InternalType | undefined {
|
|
44
|
-
return this._defaultValue
|
|
44
|
+
get defaultValue(): InternalType | undefined | null {
|
|
45
|
+
return this._defaultValue ?? ( this.allowNull ? null : undefined )
|
|
45
46
|
}
|
|
46
47
|
_defaultValue?: InternalType | undefined
|
|
47
48
|
allowNull?: boolean = true
|
|
@@ -49,6 +50,9 @@ export class AttributeType<InternalType, ExternalType = string> {
|
|
|
49
50
|
options = options || {}
|
|
50
51
|
this._defaultValue = options.defaultValue
|
|
51
52
|
this.allowNull = options.allowNull !== undefined ? options.allowNull : true
|
|
53
|
+
if(!this.allowNull && !options.defaultValue){
|
|
54
|
+
throw new Error("If allowNull is false, a defaultValue must be provided!")
|
|
55
|
+
}
|
|
52
56
|
if (options.extensionConfigurations) {
|
|
53
57
|
for (const extConfig of options.extensionConfigurations) {
|
|
54
58
|
this.extensionsConfigurations[extConfig.extensionName] = extConfig
|
|
@@ -4,7 +4,7 @@ export type BooleanTypeOptions = AttributeTypeOptions<boolean> & {
|
|
|
4
4
|
truthyValues?: string[]
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
export class BooleanType extends AttributeType<boolean> {
|
|
7
|
+
export class BooleanType extends AttributeType<boolean | null | undefined> {
|
|
8
8
|
truthyValues = ["true", "1", "yes", "on", "x"]
|
|
9
9
|
constructor(options?: BooleanTypeOptions) {
|
|
10
10
|
options = options || {}
|
|
@@ -22,7 +22,7 @@ export class BooleanType extends AttributeType<boolean> {
|
|
|
22
22
|
}
|
|
23
23
|
return {value: false, deepResult: { criticality: ParseAndValidationCriticality.Ok, messages: [] } }
|
|
24
24
|
}
|
|
25
|
-
format(value: boolean): string {
|
|
25
|
+
format(value: boolean | null | undefined): string {
|
|
26
26
|
return value ? "true" : "false";
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from "./AttributeType.js";
|
|
2
|
+
import { StringType } from "./StringType.js";
|
|
2
3
|
|
|
3
4
|
export type NumberTypeOptions = {
|
|
4
5
|
max?: number,
|
|
5
6
|
min?: number
|
|
6
7
|
} & AttributeTypeOptions<number>
|
|
7
8
|
|
|
8
|
-
export class NumberType extends AttributeType<number> {
|
|
9
|
+
export class NumberType extends AttributeType<number | null | undefined> {
|
|
10
|
+
searchType = new StringType({
|
|
11
|
+
parsePattern: /^[=<>]{0,2}-?\d+(\.\,\d+)?$/,
|
|
12
|
+
parsePatternMessage: 'Number search pattern not matched. Use e.g. "=10", "<=20", ">15"',
|
|
13
|
+
})
|
|
9
14
|
max: number
|
|
10
15
|
min: number
|
|
11
16
|
constructor(options?: NumberTypeOptions) {
|
|
@@ -37,7 +42,7 @@ export class NumberType extends AttributeType<number> {
|
|
|
37
42
|
}
|
|
38
43
|
return Promise.resolve(validationObject)
|
|
39
44
|
}
|
|
40
|
-
format(value: number): string {
|
|
41
|
-
return value
|
|
45
|
+
format(value: number | undefined | null): string {
|
|
46
|
+
return value?.toString() ?? ""
|
|
42
47
|
}
|
|
43
48
|
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import { ArrayType } from "./ArrayType.js";
|
|
1
|
+
import { ArrayType, ArrayTypeOptions } from "./ArrayType.js";
|
|
2
2
|
import { StringType } from "./StringType.js";
|
|
3
3
|
|
|
4
|
-
export class StringArrayType extends ArrayType<
|
|
4
|
+
export class StringArrayType extends ArrayType<StringType>{
|
|
5
5
|
type = new StringType()
|
|
6
|
+
/*constructor(options?:ArrayTypeOptions<StringType>) {
|
|
7
|
+
options = options || {type: new StringType()}
|
|
8
|
+
options.type = options.type || new StringType()
|
|
9
|
+
super({type: new StringType()})
|
|
10
|
+
}*/
|
|
6
11
|
}
|
|
@@ -12,7 +12,7 @@ export type StringTypeOptions = AttributeTypeOptions<string> & {
|
|
|
12
12
|
formatReplacement?: string
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
class StringHelperType<ExternalType extends string = string> extends AttributeType<string | null | undefined, ExternalType> {
|
|
16
16
|
maxLength: number
|
|
17
17
|
minLength: number
|
|
18
18
|
parsePattern: RegExp | null
|
|
@@ -60,10 +60,19 @@ export class StringType<ExternalType extends string = string> extends AttributeT
|
|
|
60
60
|
}
|
|
61
61
|
return validationObject
|
|
62
62
|
}
|
|
63
|
-
format(value: string): ExternalType {
|
|
63
|
+
format(value: string | null | undefined): ExternalType {
|
|
64
|
+
if(!value) return "" as ExternalType
|
|
64
65
|
if(this.formatPattern && this.formatReplacement){
|
|
65
66
|
value = value.replace(this.formatPattern, this.formatReplacement)
|
|
66
67
|
}
|
|
67
68
|
return value as ExternalType;
|
|
68
69
|
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
export class StringType<ExternalType extends string = string> extends StringHelperType<ExternalType> {
|
|
74
|
+
searchType = new StringHelperType()
|
|
75
|
+
constructor(options?: StringTypeOptions) {
|
|
76
|
+
super(options)
|
|
77
|
+
}
|
|
69
78
|
}
|
package/src/util/InferType.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Model } from "../model/base/Model.js";
|
|
1
|
+
import { Model, PropertyOptions } from "../model/base/Model.js";
|
|
2
2
|
import { ArrayType } from "../types/base/ArrayType.js";
|
|
3
3
|
import { AttributeType } from "../types/base/AttributeType.js";
|
|
4
4
|
|
|
@@ -7,6 +7,8 @@ type RequriedKeys<T> = {
|
|
|
7
7
|
[K in keyof T]: T[K] extends { required: true } ? K : never;
|
|
8
8
|
}[keyof T];
|
|
9
9
|
|
|
10
|
+
|
|
11
|
+
|
|
10
12
|
type OptionalKeys<T> = {
|
|
11
13
|
[K in keyof T]: T[K] extends { required: true } ? never : K;
|
|
12
14
|
}[keyof T];
|
|
@@ -14,14 +16,46 @@ type OptionalKeys<T> = {
|
|
|
14
16
|
type PartialPartial<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K> extends
|
|
15
17
|
infer O ? { [P in keyof O]: O[P] } : never;
|
|
16
18
|
|
|
17
|
-
export type
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
export type InferModelProperties<T extends Record<string, PropertyOptions>> =
|
|
20
|
+
PartialPartial<{[K in keyof T]: InferType<T[K]["type"]>},
|
|
21
|
+
OptionalKeys<T>>
|
|
22
|
+
|
|
23
|
+
export type InferExternalModelProperties<T extends Record<string, PropertyOptions>> =
|
|
24
|
+
PartialPartial<{[K in keyof T]: InferExternalType<T[K]["type"]>},
|
|
25
|
+
OptionalKeys<T>>
|
|
26
|
+
|
|
27
|
+
export type InferType<T> = T extends {properties: infer U extends Record<string, PropertyOptions>}
|
|
28
|
+
? InferModelProperties<U>
|
|
29
|
+
// PartialPartial<{[K in keyof T["properties"]]: InferType<T["properties"][K]["type"]>},
|
|
30
|
+
// OptionalKeys<T["properties"]>>
|
|
21
31
|
|
|
22
|
-
: T extends ArrayType<infer U
|
|
32
|
+
: T extends ArrayType<infer U>
|
|
23
33
|
? InferType<T["type"]>[]
|
|
24
34
|
:
|
|
25
35
|
T extends AttributeType<infer U>
|
|
26
36
|
? U
|
|
27
|
-
: never;
|
|
37
|
+
: never;
|
|
38
|
+
|
|
39
|
+
export type InferExternalType<T> = T extends {properties: infer U extends Record<string, PropertyOptions>}
|
|
40
|
+
? InferExternalModelProperties<U>
|
|
41
|
+
|
|
42
|
+
: T extends ArrayType<infer U>
|
|
43
|
+
? InferExternalType<T["type"]>[]
|
|
44
|
+
:
|
|
45
|
+
T extends AttributeType<any, infer U>
|
|
46
|
+
? U
|
|
47
|
+
: never;
|
|
48
|
+
|
|
49
|
+
export type InferSearchType<T> = T extends Model
|
|
50
|
+
?
|
|
51
|
+
PartialPartial<{[K in keyof T["properties"]]: InferSearchType<T["properties"][K]["type"]>},
|
|
52
|
+
OptionalKeys<T["properties"]>>
|
|
53
|
+
|
|
54
|
+
: T extends ArrayType<infer U>
|
|
55
|
+
? InferSearchType<T["type"]>
|
|
56
|
+
:
|
|
57
|
+
T extends AttributeType<any, any>
|
|
58
|
+
? InferType<T["searchType"]>
|
|
59
|
+
: never;
|
|
60
|
+
// type Test = InferInternalType<Config>
|
|
61
|
+
// type Test2 = InferExternalType<Config>
|