silentium-validation 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/silentium_validation.cjs.map +1 -1
- package/dist/silentium_validation.d.ts +12 -0
- package/dist/silentium_validation.js.map +1 -1
- package/dist/silentium_validation.min.mjs.map +1 -1
- package/dist/silentium_validation.mjs.map +1 -1
- package/package.json +3 -3
- package/src/models/Validated.test.ts +2 -2
- package/src/models/Validated.ts +2 -0
- package/src/models/ValidationErrors.test.ts +0 -15
- package/src/models/ValidationErrors.ts +2 -0
- package/src/models/ValidationErrorsHappened.ts +2 -0
- package/src/models/ValidationErrorsSummary.test.ts +2 -2
- package/src/models/ValidationErrorsSummary.ts +2 -0
- package/src/models/ValidationErrorsTouched.test.ts +2 -2
- package/src/models/ValidationErrorsTouched.ts +2 -0
- package/src/models/ValidationItems.test.ts +2 -2
- package/src/models/ValidationItems.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.0.5](https://github.com/silentium-lab/silentium-validation/compare/v0.0.4...v0.0.5) (2026-01-31)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* versions and doc urls ([a6074f6](https://github.com/silentium-lab/silentium-validation/commit/a6074f6990850d8c1e4e3a51b96e1ab04dcc3330))
|
|
11
|
+
|
|
12
|
+
### [0.0.4](https://github.com/silentium-lab/silentium-validation/compare/v0.0.3...v0.0.4) (2025-12-05)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* **main:** update deps ([8a6298c](https://github.com/silentium-lab/silentium-validation/commit/8a6298c00e24ef25382e02215ceaaccb8f4678e4))
|
|
18
|
+
|
|
5
19
|
### [0.0.3](https://github.com/silentium-lab/silentium-validation/compare/v0.0.2...v0.0.3) (2025-12-02)
|
|
6
20
|
|
|
7
21
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silentium_validation.cjs","sources":["../src/models/Validated.ts","../src/models/ValidationErrors.ts","../src/models/ValidationErrorsHappened.ts","../src/models/ValidationErrorsSummary.ts","../src/models/ValidationErrorsTouched.ts","../src/models/ValidationItems.ts","../src/rules.ts"],"sourcesContent":["import { ValidationErrorType } from \"@/types\";\n\n/**\n * Check if there are any errors in the errors object\n * Returns a boolean type\n */\nexport function Validated(errors: ValidationErrorType) {\n return !Object.values(errors).some(\n (errorValues: any) => errorValues.length > 0,\n );\n}\n","import {\n ActualMessage,\n All,\n Applied,\n DestroyContainer,\n MaybeMessage,\n Message,\n MessageType,\n} from \"silentium\";\nimport { ValidationErrorType, ValidationItem } from \"@/types\";\n\n/**\n * Accepts a set of items that need to be validated\n * and when rules produce values, returns the overall set\n * of errors for the given configuration\n */\nexport function ValidationErrors(\n form: MaybeMessage<ValidationItem[]>,\n): MessageType<ValidationErrorType> {\n const $form = ActualMessage(form);\n return Message((resolve, reject) => {\n const formDc = DestroyContainer();\n $form.then((form) => {\n formDc.destroy();\n const entries = form.map((i) => {\n return All(\n i.key,\n Applied(\n All(\n ...i.rules.map((rule) => {\n return formDc.add(rule(i.value));\n }),\n ),\n (items) => items.filter(ExcludeTrue).map(ErrorFormat),\n ) as MessageType<string[]>,\n );\n });\n Applied(All(...entries), (e: any) => Object.fromEntries(e))\n .catch(reject)\n .then(resolve);\n });\n });\n}\n\nfunction ErrorFormat(v: boolean | string) {\n return v === false ? \"Error!\" : v;\n}\n\nfunction ExcludeTrue(v: boolean | string) {\n return v !== true;\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Show only the errors that exist, fields without errors are not shown\n */\nexport function ValidationErrorsHappened(base: ValidationErrorType) {\n return Object.fromEntries(\n Object.entries(base).filter((entry) => entry[1].length > 0),\n );\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Overall array of all errors\n */\nexport function ValidationErrorsSummary(errors: ValidationErrorType) {\n return Object.values(errors).flat();\n}\n","import { All, Applied, Chainable, MessageType } from \"silentium\";\nimport { ValidationErrorType } from \"@/types\";\nimport { Dirty, MergeAccumulation } from \"silentium-components\";\n\n/**\n * Validation errors are only those that correspond to changed form fields\n */\nexport function ValidationErrorsTouched(\n $form: MessageType<Record<string, unknown>>,\n $errors: MessageType<ValidationErrorType>,\n) {\n const dirtyForm = Dirty($form);\n Chainable(dirtyForm).chain($form);\n const touchedForm = MergeAccumulation(dirtyForm);\n const errorsTouched = All(Applied(touchedForm, Object.keys), $errors);\n return Applied(errorsTouched, ([touched, errors]) => {\n return Object.fromEntries(\n Object.entries(errors).filter((entry) => touched.includes(entry[0])),\n );\n });\n}\n","import { ConstructorType } from \"silentium\";\nimport { ValidationRule } from \"@/types\";\n\nexport type FormType = Record<string, unknown>;\nexport type FormRulesType = Record<\n string,\n ConstructorType<any, ValidationRule>[]\n>;\n\n/**\n * Get a set of all validation rules\n * for each form field\n */\nexport function ValidationItems(form: FormType, rules: FormRulesType) {\n return Object.keys(form)\n .map((key) => {\n return {\n key,\n value: form[key],\n rules: rules[key],\n };\n })\n .filter((item) => !!item.rules);\n}\n","/**\n * Validation rule, what requires truthy value\n */\nexport const Required = (v: unknown) => !!v || \"Field required\";\n\n/**\n * Validation rule what requires integer value\n */\nexport const Integer = (v: unknown) => Number.isInteger(v) || \"Must be integer\";\n"],"names":["ActualMessage","Message","DestroyContainer","form","All","Applied","Dirty","Chainable","MergeAccumulation"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"silentium_validation.cjs","sources":["../src/models/Validated.ts","../src/models/ValidationErrors.ts","../src/models/ValidationErrorsHappened.ts","../src/models/ValidationErrorsSummary.ts","../src/models/ValidationErrorsTouched.ts","../src/models/ValidationItems.ts","../src/rules.ts"],"sourcesContent":["import { ValidationErrorType } from \"@/types\";\n\n/**\n * Check if there are any errors in the errors object\n * Returns a boolean type\n *\n * @url https://silentium.pw/article/validated/view\n */\nexport function Validated(errors: ValidationErrorType) {\n return !Object.values(errors).some(\n (errorValues: any) => errorValues.length > 0,\n );\n}\n","import {\n ActualMessage,\n All,\n Applied,\n DestroyContainer,\n MaybeMessage,\n Message,\n MessageType,\n} from \"silentium\";\nimport { ValidationErrorType, ValidationItem } from \"@/types\";\n\n/**\n * Accepts a set of items that need to be validated\n * and when rules produce values, returns the overall set\n * of errors for the given configuration\n *\n * @url https://silentium.pw/article/validation-errors/view\n */\nexport function ValidationErrors(\n form: MaybeMessage<ValidationItem[]>,\n): MessageType<ValidationErrorType> {\n const $form = ActualMessage(form);\n return Message((resolve, reject) => {\n const formDc = DestroyContainer();\n $form.then((form) => {\n formDc.destroy();\n const entries = form.map((i) => {\n return All(\n i.key,\n Applied(\n All(\n ...i.rules.map((rule) => {\n return formDc.add(rule(i.value));\n }),\n ),\n (items) => items.filter(ExcludeTrue).map(ErrorFormat),\n ) as MessageType<string[]>,\n );\n });\n Applied(All(...entries), (e: any) => Object.fromEntries(e))\n .catch(reject)\n .then(resolve);\n });\n });\n}\n\nfunction ErrorFormat(v: boolean | string) {\n return v === false ? \"Error!\" : v;\n}\n\nfunction ExcludeTrue(v: boolean | string) {\n return v !== true;\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Show only the errors that exist, fields without errors are not shown\n *\n * @url https://silentium.pw/article/validation-errors-happened/view\n */\nexport function ValidationErrorsHappened(base: ValidationErrorType) {\n return Object.fromEntries(\n Object.entries(base).filter((entry) => entry[1].length > 0),\n );\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Overall array of all errors\n *\n * @url https://silentium.pw/article/validation-errors-summary/view\n */\nexport function ValidationErrorsSummary(errors: ValidationErrorType) {\n return Object.values(errors).flat();\n}\n","import { All, Applied, Chainable, MessageType } from \"silentium\";\nimport { ValidationErrorType } from \"@/types\";\nimport { Dirty, MergeAccumulation } from \"silentium-components\";\n\n/**\n * Validation errors are only those that correspond to changed form fields\n *\n * @url https://silentium.pw/article/validation-errors-touched/view\n */\nexport function ValidationErrorsTouched(\n $form: MessageType<Record<string, unknown>>,\n $errors: MessageType<ValidationErrorType>,\n) {\n const dirtyForm = Dirty($form);\n Chainable(dirtyForm).chain($form);\n const touchedForm = MergeAccumulation(dirtyForm);\n const errorsTouched = All(Applied(touchedForm, Object.keys), $errors);\n return Applied(errorsTouched, ([touched, errors]) => {\n return Object.fromEntries(\n Object.entries(errors).filter((entry) => touched.includes(entry[0])),\n );\n });\n}\n","import { ConstructorType } from \"silentium\";\nimport { ValidationRule } from \"@/types\";\n\nexport type FormType = Record<string, unknown>;\nexport type FormRulesType = Record<\n string,\n ConstructorType<any, ValidationRule>[]\n>;\n\n/**\n * Get a set of all validation rules\n * for each form field\n *\n * @url https://silentium.pw/article/validation-items/view\n */\nexport function ValidationItems(form: FormType, rules: FormRulesType) {\n return Object.keys(form)\n .map((key) => {\n return {\n key,\n value: form[key],\n rules: rules[key],\n };\n })\n .filter((item) => !!item.rules);\n}\n","/**\n * Validation rule, what requires truthy value\n */\nexport const Required = (v: unknown) => !!v || \"Field required\";\n\n/**\n * Validation rule what requires integer value\n */\nexport const Integer = (v: unknown) => Number.isInteger(v) || \"Must be integer\";\n"],"names":["ActualMessage","Message","DestroyContainer","form","All","Applied","Dirty","Chainable","MergeAccumulation"],"mappings":";;;;;AAQO,SAAS,UAAU,MAAA,EAA6B;AACrD,EAAA,OAAO,CAAC,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAAA,IAC5B,CAAC,WAAA,KAAqB,WAAA,CAAY,MAAA,GAAS;AAAA,GAC7C;AACF;;ACMO,SAAS,iBACd,IAAA,EACkC;AAClC,EAAA,MAAM,KAAA,GAAQA,wBAAc,IAAI,CAAA;AAChC,EAAA,OAAOC,iBAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAClC,IAAA,MAAM,SAASC,0BAAA,EAAiB;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,CAACC,KAAAA,KAAS;AACnB,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AAC9B,QAAA,OAAOC,aAAA;AAAA,UACL,CAAA,CAAE,GAAA;AAAA,UACFC,iBAAA;AAAA,YACED,aAAA;AAAA,cACE,GAAG,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACvB,gBAAA,OAAO,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,cACjC,CAAC;AAAA,aACH;AAAA,YACA,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,WAAW,CAAA,CAAE,IAAI,WAAW;AAAA;AACtD,SACF;AAAA,MACF,CAAC,CAAA;AACD,MAAAC,iBAAA,CAAQD,aAAA,CAAI,GAAG,OAAO,CAAA,EAAG,CAAC,CAAA,KAAW,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC,CAAA,CACvD,KAAA,CAAM,MAAM,CAAA,CACZ,KAAK,OAAO,CAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,SAAS,YAAY,CAAA,EAAqB;AACxC,EAAA,OAAO,CAAA,KAAM,QAAQ,QAAA,GAAW,CAAA;AAClC;AAEA,SAAS,YAAY,CAAA,EAAqB;AACxC,EAAA,OAAO,CAAA,KAAM,IAAA;AACf;;AC7CO,SAAS,yBAAyB,IAAA,EAA2B;AAClE,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAC;AAAA,GAC5D;AACF;;ACJO,SAAS,wBAAwB,MAAA,EAA6B;AACnE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,EAAK;AACpC;;ACAO,SAAS,uBAAA,CACd,OACA,OAAA,EACA;AACA,EAAA,MAAM,SAAA,GAAYE,0BAAM,KAAK,CAAA;AAC7B,EAAAC,mBAAA,CAAU,SAAS,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAChC,EAAA,MAAM,WAAA,GAAcC,sCAAkB,SAAS,CAAA;AAC/C,EAAA,MAAM,gBAAgBJ,aAAA,CAAIC,iBAAA,CAAQ,aAAa,MAAA,CAAO,IAAI,GAAG,OAAO,CAAA;AACpE,EAAA,OAAOA,kBAAQ,aAAA,EAAe,CAAC,CAAC,OAAA,EAAS,MAAM,CAAA,KAAM;AACnD,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAC;AAAA,KACrE;AAAA,EACF,CAAC,CAAA;AACH;;ACPO,SAAS,eAAA,CAAgB,MAAgB,KAAA,EAAsB;AACpE,EAAA,OAAO,OAAO,IAAA,CAAK,IAAI,CAAA,CACpB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,MACf,KAAA,EAAO,MAAM,GAAG;AAAA,KAClB;AAAA,EACF,CAAC,EACA,MAAA,CAAO,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,CAAA;AAClC;;ACtBO,MAAM,QAAA,GAAW,CAAC,CAAA,KAAe,CAAC,CAAC,CAAA,IAAK;AAKxC,MAAM,UAAU,CAAC,CAAA,KAAe,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK;;;;;;;;;;;"}
|
|
@@ -12,6 +12,8 @@ interface ValidationItem {
|
|
|
12
12
|
/**
|
|
13
13
|
* Check if there are any errors in the errors object
|
|
14
14
|
* Returns a boolean type
|
|
15
|
+
*
|
|
16
|
+
* @url https://silentium.pw/article/validated/view
|
|
15
17
|
*/
|
|
16
18
|
declare function Validated(errors: ValidationErrorType): boolean;
|
|
17
19
|
|
|
@@ -19,11 +21,15 @@ declare function Validated(errors: ValidationErrorType): boolean;
|
|
|
19
21
|
* Accepts a set of items that need to be validated
|
|
20
22
|
* and when rules produce values, returns the overall set
|
|
21
23
|
* of errors for the given configuration
|
|
24
|
+
*
|
|
25
|
+
* @url https://silentium.pw/article/validation-errors/view
|
|
22
26
|
*/
|
|
23
27
|
declare function ValidationErrors(form: MaybeMessage<ValidationItem[]>): MessageType<ValidationErrorType>;
|
|
24
28
|
|
|
25
29
|
/**
|
|
26
30
|
* Show only the errors that exist, fields without errors are not shown
|
|
31
|
+
*
|
|
32
|
+
* @url https://silentium.pw/article/validation-errors-happened/view
|
|
27
33
|
*/
|
|
28
34
|
declare function ValidationErrorsHappened(base: ValidationErrorType): {
|
|
29
35
|
[k: string]: string[];
|
|
@@ -31,11 +37,15 @@ declare function ValidationErrorsHappened(base: ValidationErrorType): {
|
|
|
31
37
|
|
|
32
38
|
/**
|
|
33
39
|
* Overall array of all errors
|
|
40
|
+
*
|
|
41
|
+
* @url https://silentium.pw/article/validation-errors-summary/view
|
|
34
42
|
*/
|
|
35
43
|
declare function ValidationErrorsSummary(errors: ValidationErrorType): string[];
|
|
36
44
|
|
|
37
45
|
/**
|
|
38
46
|
* Validation errors are only those that correspond to changed form fields
|
|
47
|
+
*
|
|
48
|
+
* @url https://silentium.pw/article/validation-errors-touched/view
|
|
39
49
|
*/
|
|
40
50
|
declare function ValidationErrorsTouched($form: MessageType<Record<string, unknown>>, $errors: MessageType<ValidationErrorType>): silentium.MessageRx<{
|
|
41
51
|
[k: string]: string[];
|
|
@@ -46,6 +56,8 @@ type FormRulesType = Record<string, ConstructorType<any, ValidationRule>[]>;
|
|
|
46
56
|
/**
|
|
47
57
|
* Get a set of all validation rules
|
|
48
58
|
* for each form field
|
|
59
|
+
*
|
|
60
|
+
* @url https://silentium.pw/article/validation-items/view
|
|
49
61
|
*/
|
|
50
62
|
declare function ValidationItems(form: FormType, rules: FormRulesType): {
|
|
51
63
|
key: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silentium_validation.js","sources":["../src/models/Validated.ts","../src/models/ValidationErrors.ts","../src/models/ValidationErrorsHappened.ts","../src/models/ValidationErrorsSummary.ts","../src/models/ValidationErrorsTouched.ts","../src/models/ValidationItems.ts","../src/rules.ts"],"sourcesContent":["import { ValidationErrorType } from \"@/types\";\n\n/**\n * Check if there are any errors in the errors object\n * Returns a boolean type\n */\nexport function Validated(errors: ValidationErrorType) {\n return !Object.values(errors).some(\n (errorValues: any) => errorValues.length > 0,\n );\n}\n","import {\n ActualMessage,\n All,\n Applied,\n DestroyContainer,\n MaybeMessage,\n Message,\n MessageType,\n} from \"silentium\";\nimport { ValidationErrorType, ValidationItem } from \"@/types\";\n\n/**\n * Accepts a set of items that need to be validated\n * and when rules produce values, returns the overall set\n * of errors for the given configuration\n */\nexport function ValidationErrors(\n form: MaybeMessage<ValidationItem[]>,\n): MessageType<ValidationErrorType> {\n const $form = ActualMessage(form);\n return Message((resolve, reject) => {\n const formDc = DestroyContainer();\n $form.then((form) => {\n formDc.destroy();\n const entries = form.map((i) => {\n return All(\n i.key,\n Applied(\n All(\n ...i.rules.map((rule) => {\n return formDc.add(rule(i.value));\n }),\n ),\n (items) => items.filter(ExcludeTrue).map(ErrorFormat),\n ) as MessageType<string[]>,\n );\n });\n Applied(All(...entries), (e: any) => Object.fromEntries(e))\n .catch(reject)\n .then(resolve);\n });\n });\n}\n\nfunction ErrorFormat(v: boolean | string) {\n return v === false ? \"Error!\" : v;\n}\n\nfunction ExcludeTrue(v: boolean | string) {\n return v !== true;\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Show only the errors that exist, fields without errors are not shown\n */\nexport function ValidationErrorsHappened(base: ValidationErrorType) {\n return Object.fromEntries(\n Object.entries(base).filter((entry) => entry[1].length > 0),\n );\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Overall array of all errors\n */\nexport function ValidationErrorsSummary(errors: ValidationErrorType) {\n return Object.values(errors).flat();\n}\n","import { All, Applied, Chainable, MessageType } from \"silentium\";\nimport { ValidationErrorType } from \"@/types\";\nimport { Dirty, MergeAccumulation } from \"silentium-components\";\n\n/**\n * Validation errors are only those that correspond to changed form fields\n */\nexport function ValidationErrorsTouched(\n $form: MessageType<Record<string, unknown>>,\n $errors: MessageType<ValidationErrorType>,\n) {\n const dirtyForm = Dirty($form);\n Chainable(dirtyForm).chain($form);\n const touchedForm = MergeAccumulation(dirtyForm);\n const errorsTouched = All(Applied(touchedForm, Object.keys), $errors);\n return Applied(errorsTouched, ([touched, errors]) => {\n return Object.fromEntries(\n Object.entries(errors).filter((entry) => touched.includes(entry[0])),\n );\n });\n}\n","import { ConstructorType } from \"silentium\";\nimport { ValidationRule } from \"@/types\";\n\nexport type FormType = Record<string, unknown>;\nexport type FormRulesType = Record<\n string,\n ConstructorType<any, ValidationRule>[]\n>;\n\n/**\n * Get a set of all validation rules\n * for each form field\n */\nexport function ValidationItems(form: FormType, rules: FormRulesType) {\n return Object.keys(form)\n .map((key) => {\n return {\n key,\n value: form[key],\n rules: rules[key],\n };\n })\n .filter((item) => !!item.rules);\n}\n","/**\n * Validation rule, what requires truthy value\n */\nexport const Required = (v: unknown) => !!v || \"Field required\";\n\n/**\n * Validation rule what requires integer value\n */\nexport const Integer = (v: unknown) => Number.isInteger(v) || \"Must be integer\";\n"],"names":["form"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"silentium_validation.js","sources":["../src/models/Validated.ts","../src/models/ValidationErrors.ts","../src/models/ValidationErrorsHappened.ts","../src/models/ValidationErrorsSummary.ts","../src/models/ValidationErrorsTouched.ts","../src/models/ValidationItems.ts","../src/rules.ts"],"sourcesContent":["import { ValidationErrorType } from \"@/types\";\n\n/**\n * Check if there are any errors in the errors object\n * Returns a boolean type\n *\n * @url https://silentium.pw/article/validated/view\n */\nexport function Validated(errors: ValidationErrorType) {\n return !Object.values(errors).some(\n (errorValues: any) => errorValues.length > 0,\n );\n}\n","import {\n ActualMessage,\n All,\n Applied,\n DestroyContainer,\n MaybeMessage,\n Message,\n MessageType,\n} from \"silentium\";\nimport { ValidationErrorType, ValidationItem } from \"@/types\";\n\n/**\n * Accepts a set of items that need to be validated\n * and when rules produce values, returns the overall set\n * of errors for the given configuration\n *\n * @url https://silentium.pw/article/validation-errors/view\n */\nexport function ValidationErrors(\n form: MaybeMessage<ValidationItem[]>,\n): MessageType<ValidationErrorType> {\n const $form = ActualMessage(form);\n return Message((resolve, reject) => {\n const formDc = DestroyContainer();\n $form.then((form) => {\n formDc.destroy();\n const entries = form.map((i) => {\n return All(\n i.key,\n Applied(\n All(\n ...i.rules.map((rule) => {\n return formDc.add(rule(i.value));\n }),\n ),\n (items) => items.filter(ExcludeTrue).map(ErrorFormat),\n ) as MessageType<string[]>,\n );\n });\n Applied(All(...entries), (e: any) => Object.fromEntries(e))\n .catch(reject)\n .then(resolve);\n });\n });\n}\n\nfunction ErrorFormat(v: boolean | string) {\n return v === false ? \"Error!\" : v;\n}\n\nfunction ExcludeTrue(v: boolean | string) {\n return v !== true;\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Show only the errors that exist, fields without errors are not shown\n *\n * @url https://silentium.pw/article/validation-errors-happened/view\n */\nexport function ValidationErrorsHappened(base: ValidationErrorType) {\n return Object.fromEntries(\n Object.entries(base).filter((entry) => entry[1].length > 0),\n );\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Overall array of all errors\n *\n * @url https://silentium.pw/article/validation-errors-summary/view\n */\nexport function ValidationErrorsSummary(errors: ValidationErrorType) {\n return Object.values(errors).flat();\n}\n","import { All, Applied, Chainable, MessageType } from \"silentium\";\nimport { ValidationErrorType } from \"@/types\";\nimport { Dirty, MergeAccumulation } from \"silentium-components\";\n\n/**\n * Validation errors are only those that correspond to changed form fields\n *\n * @url https://silentium.pw/article/validation-errors-touched/view\n */\nexport function ValidationErrorsTouched(\n $form: MessageType<Record<string, unknown>>,\n $errors: MessageType<ValidationErrorType>,\n) {\n const dirtyForm = Dirty($form);\n Chainable(dirtyForm).chain($form);\n const touchedForm = MergeAccumulation(dirtyForm);\n const errorsTouched = All(Applied(touchedForm, Object.keys), $errors);\n return Applied(errorsTouched, ([touched, errors]) => {\n return Object.fromEntries(\n Object.entries(errors).filter((entry) => touched.includes(entry[0])),\n );\n });\n}\n","import { ConstructorType } from \"silentium\";\nimport { ValidationRule } from \"@/types\";\n\nexport type FormType = Record<string, unknown>;\nexport type FormRulesType = Record<\n string,\n ConstructorType<any, ValidationRule>[]\n>;\n\n/**\n * Get a set of all validation rules\n * for each form field\n *\n * @url https://silentium.pw/article/validation-items/view\n */\nexport function ValidationItems(form: FormType, rules: FormRulesType) {\n return Object.keys(form)\n .map((key) => {\n return {\n key,\n value: form[key],\n rules: rules[key],\n };\n })\n .filter((item) => !!item.rules);\n}\n","/**\n * Validation rule, what requires truthy value\n */\nexport const Required = (v: unknown) => !!v || \"Field required\";\n\n/**\n * Validation rule what requires integer value\n */\nexport const Integer = (v: unknown) => Number.isInteger(v) || \"Must be integer\";\n"],"names":["form"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silentium_validation.min.mjs","sources":["../src/models/Validated.ts","../src/models/ValidationErrors.ts","../src/models/ValidationErrorsHappened.ts","../src/models/ValidationErrorsSummary.ts","../src/models/ValidationErrorsTouched.ts","../src/models/ValidationItems.ts","../src/rules.ts"],"sourcesContent":["import { ValidationErrorType } from \"@/types\";\n\n/**\n * Check if there are any errors in the errors object\n * Returns a boolean type\n */\nexport function Validated(errors: ValidationErrorType) {\n return !Object.values(errors).some(\n (errorValues: any) => errorValues.length > 0,\n );\n}\n","import {\n ActualMessage,\n All,\n Applied,\n DestroyContainer,\n MaybeMessage,\n Message,\n MessageType,\n} from \"silentium\";\nimport { ValidationErrorType, ValidationItem } from \"@/types\";\n\n/**\n * Accepts a set of items that need to be validated\n * and when rules produce values, returns the overall set\n * of errors for the given configuration\n */\nexport function ValidationErrors(\n form: MaybeMessage<ValidationItem[]>,\n): MessageType<ValidationErrorType> {\n const $form = ActualMessage(form);\n return Message((resolve, reject) => {\n const formDc = DestroyContainer();\n $form.then((form) => {\n formDc.destroy();\n const entries = form.map((i) => {\n return All(\n i.key,\n Applied(\n All(\n ...i.rules.map((rule) => {\n return formDc.add(rule(i.value));\n }),\n ),\n (items) => items.filter(ExcludeTrue).map(ErrorFormat),\n ) as MessageType<string[]>,\n );\n });\n Applied(All(...entries), (e: any) => Object.fromEntries(e))\n .catch(reject)\n .then(resolve);\n });\n });\n}\n\nfunction ErrorFormat(v: boolean | string) {\n return v === false ? \"Error!\" : v;\n}\n\nfunction ExcludeTrue(v: boolean | string) {\n return v !== true;\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Show only the errors that exist, fields without errors are not shown\n */\nexport function ValidationErrorsHappened(base: ValidationErrorType) {\n return Object.fromEntries(\n Object.entries(base).filter((entry) => entry[1].length > 0),\n );\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Overall array of all errors\n */\nexport function ValidationErrorsSummary(errors: ValidationErrorType) {\n return Object.values(errors).flat();\n}\n","import { All, Applied, Chainable, MessageType } from \"silentium\";\nimport { ValidationErrorType } from \"@/types\";\nimport { Dirty, MergeAccumulation } from \"silentium-components\";\n\n/**\n * Validation errors are only those that correspond to changed form fields\n */\nexport function ValidationErrorsTouched(\n $form: MessageType<Record<string, unknown>>,\n $errors: MessageType<ValidationErrorType>,\n) {\n const dirtyForm = Dirty($form);\n Chainable(dirtyForm).chain($form);\n const touchedForm = MergeAccumulation(dirtyForm);\n const errorsTouched = All(Applied(touchedForm, Object.keys), $errors);\n return Applied(errorsTouched, ([touched, errors]) => {\n return Object.fromEntries(\n Object.entries(errors).filter((entry) => touched.includes(entry[0])),\n );\n });\n}\n","import { ConstructorType } from \"silentium\";\nimport { ValidationRule } from \"@/types\";\n\nexport type FormType = Record<string, unknown>;\nexport type FormRulesType = Record<\n string,\n ConstructorType<any, ValidationRule>[]\n>;\n\n/**\n * Get a set of all validation rules\n * for each form field\n */\nexport function ValidationItems(form: FormType, rules: FormRulesType) {\n return Object.keys(form)\n .map((key) => {\n return {\n key,\n value: form[key],\n rules: rules[key],\n };\n })\n .filter((item) => !!item.rules);\n}\n","/**\n * Validation rule, what requires truthy value\n */\nexport const Required = (v: unknown) => !!v || \"Field required\";\n\n/**\n * Validation rule what requires integer value\n */\nexport const Integer = (v: unknown) => Number.isInteger(v) || \"Must be integer\";\n"],"names":["Validated","errors","Object","values","some","errorValues","length","ValidationErrors","form","$form","ActualMessage","Message","resolve","reject","formDc","DestroyContainer","then","destroy","entries","map","i","All","key","Applied","rules","rule","add","value","items","filter","ExcludeTrue","ErrorFormat","e","fromEntries","catch","v","ValidationErrorsHappened","base","entry","ValidationErrorsSummary","flat","ValidationErrorsTouched","$errors","dirtyForm","Dirty","Chainable","chain","touchedForm","MergeAccumulation","errorsTouched","keys","touched","includes","ValidationItems","item","Required","Integer","Number","isInteger"],"mappings":"
|
|
1
|
+
{"version":3,"file":"silentium_validation.min.mjs","sources":["../src/models/Validated.ts","../src/models/ValidationErrors.ts","../src/models/ValidationErrorsHappened.ts","../src/models/ValidationErrorsSummary.ts","../src/models/ValidationErrorsTouched.ts","../src/models/ValidationItems.ts","../src/rules.ts"],"sourcesContent":["import { ValidationErrorType } from \"@/types\";\n\n/**\n * Check if there are any errors in the errors object\n * Returns a boolean type\n *\n * @url https://silentium.pw/article/validated/view\n */\nexport function Validated(errors: ValidationErrorType) {\n return !Object.values(errors).some(\n (errorValues: any) => errorValues.length > 0,\n );\n}\n","import {\n ActualMessage,\n All,\n Applied,\n DestroyContainer,\n MaybeMessage,\n Message,\n MessageType,\n} from \"silentium\";\nimport { ValidationErrorType, ValidationItem } from \"@/types\";\n\n/**\n * Accepts a set of items that need to be validated\n * and when rules produce values, returns the overall set\n * of errors for the given configuration\n *\n * @url https://silentium.pw/article/validation-errors/view\n */\nexport function ValidationErrors(\n form: MaybeMessage<ValidationItem[]>,\n): MessageType<ValidationErrorType> {\n const $form = ActualMessage(form);\n return Message((resolve, reject) => {\n const formDc = DestroyContainer();\n $form.then((form) => {\n formDc.destroy();\n const entries = form.map((i) => {\n return All(\n i.key,\n Applied(\n All(\n ...i.rules.map((rule) => {\n return formDc.add(rule(i.value));\n }),\n ),\n (items) => items.filter(ExcludeTrue).map(ErrorFormat),\n ) as MessageType<string[]>,\n );\n });\n Applied(All(...entries), (e: any) => Object.fromEntries(e))\n .catch(reject)\n .then(resolve);\n });\n });\n}\n\nfunction ErrorFormat(v: boolean | string) {\n return v === false ? \"Error!\" : v;\n}\n\nfunction ExcludeTrue(v: boolean | string) {\n return v !== true;\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Show only the errors that exist, fields without errors are not shown\n *\n * @url https://silentium.pw/article/validation-errors-happened/view\n */\nexport function ValidationErrorsHappened(base: ValidationErrorType) {\n return Object.fromEntries(\n Object.entries(base).filter((entry) => entry[1].length > 0),\n );\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Overall array of all errors\n *\n * @url https://silentium.pw/article/validation-errors-summary/view\n */\nexport function ValidationErrorsSummary(errors: ValidationErrorType) {\n return Object.values(errors).flat();\n}\n","import { All, Applied, Chainable, MessageType } from \"silentium\";\nimport { ValidationErrorType } from \"@/types\";\nimport { Dirty, MergeAccumulation } from \"silentium-components\";\n\n/**\n * Validation errors are only those that correspond to changed form fields\n *\n * @url https://silentium.pw/article/validation-errors-touched/view\n */\nexport function ValidationErrorsTouched(\n $form: MessageType<Record<string, unknown>>,\n $errors: MessageType<ValidationErrorType>,\n) {\n const dirtyForm = Dirty($form);\n Chainable(dirtyForm).chain($form);\n const touchedForm = MergeAccumulation(dirtyForm);\n const errorsTouched = All(Applied(touchedForm, Object.keys), $errors);\n return Applied(errorsTouched, ([touched, errors]) => {\n return Object.fromEntries(\n Object.entries(errors).filter((entry) => touched.includes(entry[0])),\n );\n });\n}\n","import { ConstructorType } from \"silentium\";\nimport { ValidationRule } from \"@/types\";\n\nexport type FormType = Record<string, unknown>;\nexport type FormRulesType = Record<\n string,\n ConstructorType<any, ValidationRule>[]\n>;\n\n/**\n * Get a set of all validation rules\n * for each form field\n *\n * @url https://silentium.pw/article/validation-items/view\n */\nexport function ValidationItems(form: FormType, rules: FormRulesType) {\n return Object.keys(form)\n .map((key) => {\n return {\n key,\n value: form[key],\n rules: rules[key],\n };\n })\n .filter((item) => !!item.rules);\n}\n","/**\n * Validation rule, what requires truthy value\n */\nexport const Required = (v: unknown) => !!v || \"Field required\";\n\n/**\n * Validation rule what requires integer value\n */\nexport const Integer = (v: unknown) => Number.isInteger(v) || \"Must be integer\";\n"],"names":["Validated","errors","Object","values","some","errorValues","length","ValidationErrors","form","$form","ActualMessage","Message","resolve","reject","formDc","DestroyContainer","then","destroy","entries","map","i","All","key","Applied","rules","rule","add","value","items","filter","ExcludeTrue","ErrorFormat","e","fromEntries","catch","v","ValidationErrorsHappened","base","entry","ValidationErrorsSummary","flat","ValidationErrorsTouched","$errors","dirtyForm","Dirty","Chainable","chain","touchedForm","MergeAccumulation","errorsTouched","keys","touched","includes","ValidationItems","item","Required","Integer","Number","isInteger"],"mappings":"sLAQO,SAASA,EAAUC,GACxB,OAAQC,OAAOC,OAAOF,GAAQG,KAC3BC,GAAqBA,EAAYC,OAAS,EAE/C,CCMO,SAASC,EACdC,GAEA,MAAMC,EAAQC,EAAcF,GAC5B,OAAOG,EAAQ,CAACC,EAASC,KACvB,MAAMC,EAASC,IACfN,EAAMO,KAAMR,IACVM,EAAOG,UACP,MAAMC,EAAUV,EAAKW,IAAKC,GACjBC,EACLD,EAAEE,IACFC,EACEF,KACKD,EAAEI,MAAML,IAAKM,GACPX,EAAOY,IAAID,EAAKL,EAAEO,UAG5BC,GAAUA,EAAMC,OAAOC,GAAaX,IAAIY,MAI/CR,EAAQF,KAAOH,GAAWc,GAAW9B,OAAO+B,YAAYD,IACrDE,MAAMrB,GACNG,KAAKJ,MAGd,CAEA,SAASmB,EAAYI,GACnB,OAAa,IAANA,EAAc,SAAWA,CAClC,CAEA,SAASL,EAAYK,GACnB,OAAa,IAANA,CACT,CC7CO,SAASC,EAAyBC,GACvC,OAAOnC,OAAO+B,YACZ/B,OAAOgB,QAAQmB,GAAMR,OAAQS,GAAUA,EAAM,GAAGhC,OAAS,GAE7D,CCJO,SAASiC,EAAwBtC,GACtC,OAAOC,OAAOC,OAAOF,GAAQuC,MAC/B,CCAO,SAASC,EACdhC,EACAiC,GAEA,MAAMC,EAAYC,EAAMnC,GACxBoC,EAAUF,GAAWG,MAAMrC,GAC3B,MAAMsC,EAAcC,EAAkBL,GAChCM,EAAgB5B,EAAIE,EAAQwB,EAAa7C,OAAOgD,MAAOR,GAC7D,OAAOnB,EAAQ0B,EAAe,EAAEE,EAASlD,KAChCC,OAAO+B,YACZ/B,OAAOgB,QAAQjB,GAAQ4B,OAAQS,GAAUa,EAAQC,SAASd,EAAM,MAGtE,CCPO,SAASe,EAAgB7C,EAAgBgB,GAC9C,OAAOtB,OAAOgD,KAAK1C,GAChBW,IAAKG,IACG,CACLA,MACAK,MAAOnB,EAAKc,GACZE,MAAOA,EAAMF,MAGhBO,OAAQyB,KAAWA,EAAK9B,MAC7B,CCtBO,MAAM+B,EAAYpB,KAAiBA,GAAK,iBAKlCqB,EAAWrB,GAAesB,OAAOC,UAAUvB,IAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silentium_validation.mjs","sources":["../src/models/Validated.ts","../src/models/ValidationErrors.ts","../src/models/ValidationErrorsHappened.ts","../src/models/ValidationErrorsSummary.ts","../src/models/ValidationErrorsTouched.ts","../src/models/ValidationItems.ts","../src/rules.ts"],"sourcesContent":["import { ValidationErrorType } from \"@/types\";\n\n/**\n * Check if there are any errors in the errors object\n * Returns a boolean type\n */\nexport function Validated(errors: ValidationErrorType) {\n return !Object.values(errors).some(\n (errorValues: any) => errorValues.length > 0,\n );\n}\n","import {\n ActualMessage,\n All,\n Applied,\n DestroyContainer,\n MaybeMessage,\n Message,\n MessageType,\n} from \"silentium\";\nimport { ValidationErrorType, ValidationItem } from \"@/types\";\n\n/**\n * Accepts a set of items that need to be validated\n * and when rules produce values, returns the overall set\n * of errors for the given configuration\n */\nexport function ValidationErrors(\n form: MaybeMessage<ValidationItem[]>,\n): MessageType<ValidationErrorType> {\n const $form = ActualMessage(form);\n return Message((resolve, reject) => {\n const formDc = DestroyContainer();\n $form.then((form) => {\n formDc.destroy();\n const entries = form.map((i) => {\n return All(\n i.key,\n Applied(\n All(\n ...i.rules.map((rule) => {\n return formDc.add(rule(i.value));\n }),\n ),\n (items) => items.filter(ExcludeTrue).map(ErrorFormat),\n ) as MessageType<string[]>,\n );\n });\n Applied(All(...entries), (e: any) => Object.fromEntries(e))\n .catch(reject)\n .then(resolve);\n });\n });\n}\n\nfunction ErrorFormat(v: boolean | string) {\n return v === false ? \"Error!\" : v;\n}\n\nfunction ExcludeTrue(v: boolean | string) {\n return v !== true;\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Show only the errors that exist, fields without errors are not shown\n */\nexport function ValidationErrorsHappened(base: ValidationErrorType) {\n return Object.fromEntries(\n Object.entries(base).filter((entry) => entry[1].length > 0),\n );\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Overall array of all errors\n */\nexport function ValidationErrorsSummary(errors: ValidationErrorType) {\n return Object.values(errors).flat();\n}\n","import { All, Applied, Chainable, MessageType } from \"silentium\";\nimport { ValidationErrorType } from \"@/types\";\nimport { Dirty, MergeAccumulation } from \"silentium-components\";\n\n/**\n * Validation errors are only those that correspond to changed form fields\n */\nexport function ValidationErrorsTouched(\n $form: MessageType<Record<string, unknown>>,\n $errors: MessageType<ValidationErrorType>,\n) {\n const dirtyForm = Dirty($form);\n Chainable(dirtyForm).chain($form);\n const touchedForm = MergeAccumulation(dirtyForm);\n const errorsTouched = All(Applied(touchedForm, Object.keys), $errors);\n return Applied(errorsTouched, ([touched, errors]) => {\n return Object.fromEntries(\n Object.entries(errors).filter((entry) => touched.includes(entry[0])),\n );\n });\n}\n","import { ConstructorType } from \"silentium\";\nimport { ValidationRule } from \"@/types\";\n\nexport type FormType = Record<string, unknown>;\nexport type FormRulesType = Record<\n string,\n ConstructorType<any, ValidationRule>[]\n>;\n\n/**\n * Get a set of all validation rules\n * for each form field\n */\nexport function ValidationItems(form: FormType, rules: FormRulesType) {\n return Object.keys(form)\n .map((key) => {\n return {\n key,\n value: form[key],\n rules: rules[key],\n };\n })\n .filter((item) => !!item.rules);\n}\n","/**\n * Validation rule, what requires truthy value\n */\nexport const Required = (v: unknown) => !!v || \"Field required\";\n\n/**\n * Validation rule what requires integer value\n */\nexport const Integer = (v: unknown) => Number.isInteger(v) || \"Must be integer\";\n"],"names":["form"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"silentium_validation.mjs","sources":["../src/models/Validated.ts","../src/models/ValidationErrors.ts","../src/models/ValidationErrorsHappened.ts","../src/models/ValidationErrorsSummary.ts","../src/models/ValidationErrorsTouched.ts","../src/models/ValidationItems.ts","../src/rules.ts"],"sourcesContent":["import { ValidationErrorType } from \"@/types\";\n\n/**\n * Check if there are any errors in the errors object\n * Returns a boolean type\n *\n * @url https://silentium.pw/article/validated/view\n */\nexport function Validated(errors: ValidationErrorType) {\n return !Object.values(errors).some(\n (errorValues: any) => errorValues.length > 0,\n );\n}\n","import {\n ActualMessage,\n All,\n Applied,\n DestroyContainer,\n MaybeMessage,\n Message,\n MessageType,\n} from \"silentium\";\nimport { ValidationErrorType, ValidationItem } from \"@/types\";\n\n/**\n * Accepts a set of items that need to be validated\n * and when rules produce values, returns the overall set\n * of errors for the given configuration\n *\n * @url https://silentium.pw/article/validation-errors/view\n */\nexport function ValidationErrors(\n form: MaybeMessage<ValidationItem[]>,\n): MessageType<ValidationErrorType> {\n const $form = ActualMessage(form);\n return Message((resolve, reject) => {\n const formDc = DestroyContainer();\n $form.then((form) => {\n formDc.destroy();\n const entries = form.map((i) => {\n return All(\n i.key,\n Applied(\n All(\n ...i.rules.map((rule) => {\n return formDc.add(rule(i.value));\n }),\n ),\n (items) => items.filter(ExcludeTrue).map(ErrorFormat),\n ) as MessageType<string[]>,\n );\n });\n Applied(All(...entries), (e: any) => Object.fromEntries(e))\n .catch(reject)\n .then(resolve);\n });\n });\n}\n\nfunction ErrorFormat(v: boolean | string) {\n return v === false ? \"Error!\" : v;\n}\n\nfunction ExcludeTrue(v: boolean | string) {\n return v !== true;\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Show only the errors that exist, fields without errors are not shown\n *\n * @url https://silentium.pw/article/validation-errors-happened/view\n */\nexport function ValidationErrorsHappened(base: ValidationErrorType) {\n return Object.fromEntries(\n Object.entries(base).filter((entry) => entry[1].length > 0),\n );\n}\n","import { ValidationErrorType } from \"@/types\";\n\n/**\n * Overall array of all errors\n *\n * @url https://silentium.pw/article/validation-errors-summary/view\n */\nexport function ValidationErrorsSummary(errors: ValidationErrorType) {\n return Object.values(errors).flat();\n}\n","import { All, Applied, Chainable, MessageType } from \"silentium\";\nimport { ValidationErrorType } from \"@/types\";\nimport { Dirty, MergeAccumulation } from \"silentium-components\";\n\n/**\n * Validation errors are only those that correspond to changed form fields\n *\n * @url https://silentium.pw/article/validation-errors-touched/view\n */\nexport function ValidationErrorsTouched(\n $form: MessageType<Record<string, unknown>>,\n $errors: MessageType<ValidationErrorType>,\n) {\n const dirtyForm = Dirty($form);\n Chainable(dirtyForm).chain($form);\n const touchedForm = MergeAccumulation(dirtyForm);\n const errorsTouched = All(Applied(touchedForm, Object.keys), $errors);\n return Applied(errorsTouched, ([touched, errors]) => {\n return Object.fromEntries(\n Object.entries(errors).filter((entry) => touched.includes(entry[0])),\n );\n });\n}\n","import { ConstructorType } from \"silentium\";\nimport { ValidationRule } from \"@/types\";\n\nexport type FormType = Record<string, unknown>;\nexport type FormRulesType = Record<\n string,\n ConstructorType<any, ValidationRule>[]\n>;\n\n/**\n * Get a set of all validation rules\n * for each form field\n *\n * @url https://silentium.pw/article/validation-items/view\n */\nexport function ValidationItems(form: FormType, rules: FormRulesType) {\n return Object.keys(form)\n .map((key) => {\n return {\n key,\n value: form[key],\n rules: rules[key],\n };\n })\n .filter((item) => !!item.rules);\n}\n","/**\n * Validation rule, what requires truthy value\n */\nexport const Required = (v: unknown) => !!v || \"Field required\";\n\n/**\n * Validation rule what requires integer value\n */\nexport const Integer = (v: unknown) => Number.isInteger(v) || \"Must be integer\";\n"],"names":["form"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "silentium-validation",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Validation library based on silentium",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Silentium Lab",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"vitest": "^4.0.14"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"silentium": "^0.0.
|
|
51
|
-
"silentium-components": "^0.0.
|
|
50
|
+
"silentium": "^0.0.205",
|
|
51
|
+
"silentium-components": "^0.0.111"
|
|
52
52
|
},
|
|
53
53
|
"config": {
|
|
54
54
|
"commitizen": {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Computed,
|
|
1
|
+
import { Computed, Late } from "silentium";
|
|
2
2
|
import { describe, expect, test } from "vitest";
|
|
3
3
|
import { Validated } from "@/models/Validated";
|
|
4
4
|
|
|
5
5
|
describe("Validated.test", () => {
|
|
6
6
|
test("should handle empty form", async () => {
|
|
7
|
-
const $errors =
|
|
7
|
+
const $errors = Late<any>({
|
|
8
8
|
name: ["too long"],
|
|
9
9
|
});
|
|
10
10
|
const $validated = Computed(Validated, $errors);
|
package/src/models/Validated.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { ValidationErrorType } from "@/types";
|
|
|
3
3
|
/**
|
|
4
4
|
* Check if there are any errors in the errors object
|
|
5
5
|
* Returns a boolean type
|
|
6
|
+
*
|
|
7
|
+
* @url https://silentium.pw/article/validated/view
|
|
6
8
|
*/
|
|
7
9
|
export function Validated(errors: ValidationErrorType) {
|
|
8
10
|
return !Object.values(errors).some(
|
|
@@ -90,21 +90,6 @@ describe("ValidationErrors", () => {
|
|
|
90
90
|
});
|
|
91
91
|
});
|
|
92
92
|
|
|
93
|
-
it("should handle undefined results from rules", async () => {
|
|
94
|
-
const mockForm: ValidationItem[] = [
|
|
95
|
-
{
|
|
96
|
-
key: "test",
|
|
97
|
-
value: "value",
|
|
98
|
-
rules: [() => undefined as any],
|
|
99
|
-
},
|
|
100
|
-
];
|
|
101
|
-
const $errors = ValidationErrors(mockForm);
|
|
102
|
-
const errors = await $errors;
|
|
103
|
-
expect(errors).toStrictEqual({
|
|
104
|
-
test: [undefined],
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
|
|
108
93
|
it("should handle duplicate keys, keeping the last", async () => {
|
|
109
94
|
const mockForm: ValidationItem[] = [
|
|
110
95
|
{
|
|
@@ -13,6 +13,8 @@ import { ValidationErrorType, ValidationItem } from "@/types";
|
|
|
13
13
|
* Accepts a set of items that need to be validated
|
|
14
14
|
* and when rules produce values, returns the overall set
|
|
15
15
|
* of errors for the given configuration
|
|
16
|
+
*
|
|
17
|
+
* @url https://silentium.pw/article/validation-errors/view
|
|
16
18
|
*/
|
|
17
19
|
export function ValidationErrors(
|
|
18
20
|
form: MaybeMessage<ValidationItem[]>,
|
|
@@ -2,6 +2,8 @@ import { ValidationErrorType } from "@/types";
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Show only the errors that exist, fields without errors are not shown
|
|
5
|
+
*
|
|
6
|
+
* @url https://silentium.pw/article/validation-errors-happened/view
|
|
5
7
|
*/
|
|
6
8
|
export function ValidationErrorsHappened(base: ValidationErrorType) {
|
|
7
9
|
return Object.fromEntries(
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { Computed,
|
|
1
|
+
import { Computed, Late } from "silentium";
|
|
2
2
|
import { describe, expect, test } from "vitest";
|
|
3
3
|
import { ValidationErrorType } from "@/types";
|
|
4
4
|
import { ValidationErrorsSummary } from "@/models/ValidationErrorsSummary";
|
|
5
5
|
|
|
6
6
|
describe("ValidationErrorsSummary.test", () => {
|
|
7
7
|
test("regular", async () => {
|
|
8
|
-
const $errors =
|
|
8
|
+
const $errors = Late<ValidationErrorType>({});
|
|
9
9
|
const $summary = Computed(ValidationErrorsSummary, $errors);
|
|
10
10
|
expect(await $summary).toStrictEqual([]);
|
|
11
11
|
|
|
@@ -2,6 +2,8 @@ import { ValidationErrorType } from "@/types";
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Overall array of all errors
|
|
5
|
+
*
|
|
6
|
+
* @url https://silentium.pw/article/validation-errors-summary/view
|
|
5
7
|
*/
|
|
6
8
|
export function ValidationErrorsSummary(errors: ValidationErrorType) {
|
|
7
9
|
return Object.values(errors).flat();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
2
|
import { ValidationErrorsTouched } from "@/models/ValidationErrorsTouched";
|
|
3
|
-
import { Computed,
|
|
3
|
+
import { Computed, Late } from "silentium";
|
|
4
4
|
import { ValidationErrors } from "@/models/ValidationErrors";
|
|
5
5
|
import { ValidationItems } from "@/models/ValidationItems";
|
|
6
6
|
import { Integer, Required } from "@/rules";
|
|
@@ -9,7 +9,7 @@ describe("ValidationErrorsTouched.test", () => {
|
|
|
9
9
|
test("regular", async () => {
|
|
10
10
|
expect(true).toBe(true);
|
|
11
11
|
|
|
12
|
-
const $form =
|
|
12
|
+
const $form = Late<any>({
|
|
13
13
|
name: "",
|
|
14
14
|
age: 0,
|
|
15
15
|
});
|
|
@@ -4,6 +4,8 @@ import { Dirty, MergeAccumulation } from "silentium-components";
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Validation errors are only those that correspond to changed form fields
|
|
7
|
+
*
|
|
8
|
+
* @url https://silentium.pw/article/validation-errors-touched/view
|
|
7
9
|
*/
|
|
8
10
|
export function ValidationErrorsTouched(
|
|
9
11
|
$form: MessageType<Record<string, unknown>>,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ValidationErrors } from "@/models/ValidationErrors";
|
|
2
2
|
import { ValidationItems } from "@/models/ValidationItems";
|
|
3
3
|
import { Integer, Required } from "@/rules";
|
|
4
|
-
import { Computed,
|
|
4
|
+
import { Computed, Late } from "silentium";
|
|
5
5
|
import { describe, expect, test } from "vitest";
|
|
6
6
|
|
|
7
7
|
describe("ValidationItems", () => {
|
|
@@ -29,7 +29,7 @@ describe("ValidationItems", () => {
|
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
test("reactive variant", async () => {
|
|
32
|
-
const form =
|
|
32
|
+
const form = Late({ name: "John", age: 30 });
|
|
33
33
|
const rules = {
|
|
34
34
|
name: [Required],
|
|
35
35
|
age: [Integer],
|
|
@@ -10,6 +10,8 @@ export type FormRulesType = Record<
|
|
|
10
10
|
/**
|
|
11
11
|
* Get a set of all validation rules
|
|
12
12
|
* for each form field
|
|
13
|
+
*
|
|
14
|
+
* @url https://silentium.pw/article/validation-items/view
|
|
13
15
|
*/
|
|
14
16
|
export function ValidationItems(form: FormType, rules: FormRulesType) {
|
|
15
17
|
return Object.keys(form)
|