fogui-common 0.0.2 → 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.
@@ -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;AAC5G,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 { 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
+ {"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,5 +1,5 @@
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
4
  export interface PropertyOptions {
5
5
  required?: boolean;
@@ -7,8 +7,10 @@ export interface PropertyOptions {
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
  }
@@ -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":"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","sourcesContent":["import { AttributeType, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from \"../../types/base/AttributeType.js\";\nimport { 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 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}, 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[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
+ {"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 { BooleanType, Model, NumberType, required, StringType } from "../../index.js";
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":"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","sourcesContent":["import { assert } from \"chai\"\nimport { ArrayType, AttributeType, BooleanType, Model, NumberType, required, StringType } from \"../../index.js\"\nimport { StringArrayType } from \"../../types/base/StringArrayType.js\";\n\n\ndescribe(\"Model\", () => {\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
+ {"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})"]}
@@ -4,7 +4,7 @@ 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(), defaultValue: [] });
7
+ super({ type: new NumberType() });
8
8
  }
9
9
  }
10
10
  describe("ArrayType", () => {
@@ -1 +1 @@
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(), defaultValue: []})\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});"]}
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":"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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, 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, ExternalType = string> {\n value?: InternalType\n extensionsConfigurations: Record<string, ExtensionConfiguration> = {}\n get defaultValue(): InternalType | undefined {\n return this._defaultValue\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 (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}"]}
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,aAAsB;IACnD,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,KAAc;QACjB,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> {\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): string {\n return value ? \"true\" : \"false\";\n }\n}"]}
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.toString();
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;AAO/I,MAAM,OAAO,UAAW,SAAQ,aAAqB;IACjD,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,KAAa;QAChB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC;CACJ","sourcesContent":["import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from \"./AttributeType.js\";\n\nexport type NumberTypeOptions = {\n max?: number,\n min?: number\n} & AttributeTypeOptions<number>\n\nexport class NumberType extends AttributeType<number> {\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): string {\n return value.toString()\n }\n}"]}
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}"]}
@@ -10,7 +10,7 @@ export type StringTypeOptions = AttributeTypeOptions<string> & {
10
10
  formatPattern?: RegExp;
11
11
  formatReplacement?: string;
12
12
  };
13
- export declare class StringType<ExternalType extends string = string> extends AttributeType<string, ExternalType> {
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
- export class StringType extends AttributeType {
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":"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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\nexport class StringType<ExternalType extends string = string> extends AttributeType<string, 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): ExternalType {\n if(this.formatPattern && this.formatReplacement){\n value = value.replace(this.formatPattern, this.formatReplacement)\n }\n return value as ExternalType;\n }\n}"]}
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}"]}
@@ -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,10 +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 InferType<T> = T extends Model ? PartialPartial<{
13
- [K in keyof T["properties"]]: InferType<T["properties"][K]["type"]>;
14
- }, OptionalKeys<T["properties"]>> : T extends ArrayType<infer U> ? InferType<T["type"]>[] : T extends AttributeType<infer U> ? U : never;
15
- export type InferExternalType<T> = T extends Model ? PartialPartial<{
16
- [K in keyof T["properties"]]: InferExternalType<T["properties"][K]["type"]>;
17
- }, OptionalKeys<T["properties"]>> : T extends ArrayType<infer U> ? InferExternalType<T["type"]>[] : T extends AttributeType<any, infer U> ? U : never;
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;
18
27
  export {};
@@ -1,4 +1,4 @@
1
1
  export {};
2
- // type Test = InferType<Config>
2
+ // type Test = InferInternalType<Config>
3
3
  // type Test2 = InferExternalType<Config>
4
4
  //# sourceMappingURL=InferType.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InferType.js","sourceRoot":"","sources":["../../src/util/InferType.ts"],"names":[],"mappings":";AAwCA,gCAAgC;AAChC,yCAAyC","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 Model\n ? \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 Model\n ? \n PartialPartial<{[K in keyof T[\"properties\"]]: InferExternalType<T[\"properties\"][K][\"type\"]>},\n OptionalKeys<T[\"properties\"]>>\n \n : T extends ArrayType<infer U>\n ? InferExternalType<T[\"type\"]>[]\n : \n T extends AttributeType<any, infer U>\n ? U\n : never;\n\n// type Test = InferType<Config>\n// type Test2 = InferExternalType<Config>"]}
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.2",
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
- "dependencies": {
27
+ "chai": "^6.0.1",
28
+ "mocha": "^11.7.2",
29
+ "typescript": "^5.9.3"
32
30
  }
33
31
  }
@@ -1,4 +1,5 @@
1
1
  import { ParseAndValidationCriticality, ParseAndValidationResult } from '../../types/base/AttributeType.js';
2
+ import { InferSearchType } from '../../util/InferType.js';
2
3
  import { Config } from './model/Config.js';
3
4
 
4
5
  const rawDataValide = `{
@@ -1,9 +1,39 @@
1
1
  import { assert } from "chai"
2
- import { ArrayType, AttributeType, BooleanType, Model, NumberType, required, StringType } from "../../index.js"
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 = {
@@ -1,5 +1,5 @@
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
 
@@ -12,6 +12,28 @@ export 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)
@@ -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.toString()
45
+ format(value: number | undefined | null): string {
46
+ return value?.toString() ?? ""
42
47
  }
43
48
  }
@@ -12,7 +12,7 @@ export type StringTypeOptions = AttributeTypeOptions<string> & {
12
12
  formatReplacement?: string
13
13
  }
14
14
 
15
- export class StringType<ExternalType extends string = string> extends AttributeType<string, ExternalType> {
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
  }
@@ -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,10 +16,18 @@ 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 InferType<T> = T extends Model
18
- ?
19
- PartialPartial<{[K in keyof T["properties"]]: InferType<T["properties"][K]["type"]>},
20
- OptionalKeys<T["properties"]>>
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
32
  : T extends ArrayType<infer U>
23
33
  ? InferType<T["type"]>[]
@@ -26,10 +36,8 @@ export type InferType<T> = T extends Model
26
36
  ? U
27
37
  : never;
28
38
 
29
- export type InferExternalType<T> = T extends Model
30
- ?
31
- PartialPartial<{[K in keyof T["properties"]]: InferExternalType<T["properties"][K]["type"]>},
32
- OptionalKeys<T["properties"]>>
39
+ export type InferExternalType<T> = T extends {properties: infer U extends Record<string, PropertyOptions>}
40
+ ? InferExternalModelProperties<U>
33
41
 
34
42
  : T extends ArrayType<infer U>
35
43
  ? InferExternalType<T["type"]>[]
@@ -38,5 +46,16 @@ export type InferExternalType<T> = T extends Model
38
46
  ? U
39
47
  : never;
40
48
 
41
- // type Test = InferType<Config>
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>
42
61
  // type Test2 = InferExternalType<Config>