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.
Files changed (39) hide show
  1. package/dist/examples/parse-json-config/index.js.map +1 -1
  2. package/dist/model/base/Model.d.ts +5 -4
  3. package/dist/model/base/Model.js +23 -1
  4. package/dist/model/base/Model.js.map +1 -1
  5. package/dist/model/base/Model.spec.js +26 -1
  6. package/dist/model/base/Model.spec.js.map +1 -1
  7. package/dist/types/base/ArrayType.d.ts +9 -8
  8. package/dist/types/base/ArrayType.js +2 -0
  9. package/dist/types/base/ArrayType.js.map +1 -1
  10. package/dist/types/base/ArrayType.spec.js +3 -1
  11. package/dist/types/base/ArrayType.spec.js.map +1 -1
  12. package/dist/types/base/AttributeType.d.ts +4 -3
  13. package/dist/types/base/AttributeType.js +5 -1
  14. package/dist/types/base/AttributeType.js.map +1 -1
  15. package/dist/types/base/BooleanType.d.ts +2 -2
  16. package/dist/types/base/BooleanType.js.map +1 -1
  17. package/dist/types/base/NumberType.d.ts +4 -2
  18. package/dist/types/base/NumberType.js +6 -1
  19. package/dist/types/base/NumberType.js.map +1 -1
  20. package/dist/types/base/StringArrayType.d.ts +1 -1
  21. package/dist/types/base/StringArrayType.js.map +1 -1
  22. package/dist/types/base/StringType.d.ts +7 -2
  23. package/dist/types/base/StringType.js +9 -1
  24. package/dist/types/base/StringType.js.map +1 -1
  25. package/dist/util/InferType.d.ts +16 -4
  26. package/dist/util/InferType.js +2 -0
  27. package/dist/util/InferType.js.map +1 -1
  28. package/package.json +4 -6
  29. package/src/examples/parse-json-config/index.ts +1 -0
  30. package/src/model/base/Model.spec.ts +31 -1
  31. package/src/model/base/Model.ts +26 -4
  32. package/src/types/base/ArrayType.spec.ts +4 -2
  33. package/src/types/base/ArrayType.ts +13 -11
  34. package/src/types/base/AttributeType.ts +8 -4
  35. package/src/types/base/BooleanType.ts +2 -2
  36. package/src/types/base/NumberType.ts +8 -3
  37. package/src/types/base/StringArrayType.ts +7 -2
  38. package/src/types/base/StringType.ts +11 -2
  39. 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;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,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 {};
@@ -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\ninterface 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})"]}
@@ -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: AttributeType<any, any>;
3
+ export type ArrayTypeOptions<T> = AttributeTypeOptions<any[]> & {
4
+ type: T;
4
5
  };
5
- export declare abstract class ArrayType<InternalType, ExternalType> extends AttributeType<InternalType[], ExternalType[]> {
6
- abstract type: AttributeType<InternalType, ExternalType>;
7
- constructor(options?: ArrayTypeOptions);
8
- parse(value: ExternalType[]): parseResult<InternalType[]>;
9
- validate(value: InternalType[], level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult>;
10
- format(value: InternalType[]): ExternalType[];
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":"AAAA,OAAO,EAAE,aAAa,EAAwB,6BAA6B,EAAyC,MAAM,oBAAoB,CAAC;AAQ/I,MAAM,OAAgB,SAAqC,SAAQ,aAA4C;IAE3G,YAAY,OAA0B;QAClC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IACD,KAAK,CAAC,KAAqB;QACvB,IAAI,YAAY,GAA4B,EAAC,WAAW,EAAC,6BAA6B,CAAC,EAAE,EAAC,QAAQ,EAAC,EAAE,EAAC,CAAA;QACtG,YAAY,CAAC,oBAAoB,GAAC,EAAE,CAAA;QACpC,IAAI,YAAY,GAAkB,EAAE,CAAA;QACpC,IAAG,CAAC,KAAK;YAAE,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;QAC3N,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,EAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,6BAA6B,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAC,WAAW,EAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAC,uBAAuB,EAAC,CAAC,EAAE,EAAC,CAAA;QAC7N,KAAI,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAC,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACxC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;YAC5F,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAA;YACnD,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAqB,CAAC,CAAA;QACnD,CAAC;QACD,OAAO,EAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAC,CAAA;IAC1D,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAqB,EAAE,KAAqC;QACvE,IAAI,gBAAgB,GAA4B;YAC5C,WAAW,EAAE,6BAA6B,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE;SACxF,CAAA;QACD,gBAAgB,CAAC,oBAAoB,GAAG,EAAE,CAAA;QAC1C,KAAI,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAC,CAAC;YAC/B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YAClE,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAA;YACnG,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAA;QAC/D,CAAC;QACD,OAAO,gBAAgB,CAAA;IAC3B,CAAC;IACD,MAAM,CAAC,KAAqB;QACxB,IAAG,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QACpB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAiB,CAAC,CAAA;IAC5D,CAAC;CACJ","sourcesContent":["import { AttributeType, AttributeTypeOptions, ParseAndValidationCriticality, ParseAndValidationResult, parseResult } from \"./AttributeType.js\";\n\n\nexport type ArrayTypeOptions = AttributeTypeOptions<any[]> &{\n type: AttributeType<any, any>\n} \n\n\nexport abstract class ArrayType<InternalType,ExternalType> extends AttributeType<InternalType[],ExternalType[]> {\n abstract type: AttributeType<InternalType,ExternalType> \n constructor(options?: ArrayTypeOptions) {\n super(options)\n }\n parse(value: ExternalType[]): parseResult<InternalType[]> {\n let resultObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok,messages:[]}\n resultObject.subValidationResults={}\n let returnObject:InternalType[] = []\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 InternalType)\n }\n return {value: returnObject, deepResult: resultObject} \n }\n async validate(value: InternalType[], 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: InternalType[]): ExternalType[] {\n if(!value) return []\n return value.map(v=>this.type.format(v) as ExternalType)\n }\n}"]}
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
- type = new NumberType();
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,SAAyB;IACnD,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;CAC3B;AAED,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,IAAI,SAA0B,CAAC;IAE/B,UAAU,CAAC,GAAG,EAAE;QACZ,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YACxD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,SAAgB,CAAC,CAAC,KAAK,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAU,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAC/I,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACnJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YACzC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACvD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,SAAgB,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","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<number, string> {\n type = new NumberType();\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}"]}
@@ -1,5 +1,5 @@
1
1
  import { ArrayType } from "./ArrayType.js";
2
2
  import { StringType } from "./StringType.js";
3
- export declare class StringArrayType extends ArrayType<string, string> {
3
+ export declare class StringArrayType extends ArrayType<StringType> {
4
4
  type: StringType<string>;
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StringArrayType.js","sourceRoot":"","sources":["../../../src/types/base/StringArrayType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,eAAgB,SAAQ,SAAyB;IAC1D,IAAI,GAAG,IAAI,UAAU,EAAE,CAAA;CAC1B","sourcesContent":["import { ArrayType } from \"./ArrayType.js\";\nimport { StringType } from \"./StringType.js\";\n\nexport class StringArrayType extends ArrayType<string, string>{\n type = new StringType()\n}"]}
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
- 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,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 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, infer V> ? InferType<T["type"]>[] : T extends AttributeType<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;
15
27
  export {};
@@ -1,2 +1,4 @@
1
1
  export {};
2
+ // type Test = InferInternalType<Config>
3
+ // type Test2 = InferExternalType<Config>
2
4
  //# sourceMappingURL=InferType.js.map
@@ -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 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, infer V>\n ? InferType<T[\"type\"]>[]\n : \n T extends AttributeType<infer U>\n ? U\n : never;"]}
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.1",
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,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<number, string> {
9
- type = new NumberType();
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: AttributeType<any, any>
5
+ export type ArrayTypeOptions<T> = AttributeTypeOptions<any[]> &{
6
+ type: T
6
7
  }
7
8
 
8
9
 
9
- export abstract class ArrayType<InternalType,ExternalType> extends AttributeType<InternalType[],ExternalType[]> {
10
- abstract type: AttributeType<InternalType,ExternalType>
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: ExternalType[]): parseResult<InternalType[]> {
16
+ parse(value: InferExternalType<T>[]): parseResult<InferType<T>[]> {
15
17
  let resultObject:ParseAndValidationResult = {criticality:ParseAndValidationCriticality.Ok,messages:[]}
16
18
  resultObject.subValidationResults={}
17
- let returnObject:InternalType[] = []
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 InternalType)
26
+ returnObject.push(result.value as InferType<T>)
25
27
  }
26
28
  return {value: returnObject, deepResult: resultObject}
27
29
  }
28
- async validate(value: InternalType[], level?: ParseAndValidationCriticality): Promise<ParseAndValidationResult> {
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: InternalType[]): ExternalType[] {
42
+ format(value: InferType<T>[]): InferExternalType<T>[] {
41
43
  if(!value) return []
42
- return value.map(v=>this.type.format(v) as ExternalType)
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.toString()
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<string, string>{
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
- 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,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 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
- : T extends ArrayType<infer U, infer V>
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>