Skip to content

Commit

Permalink
V 1.8.10 async validation
Browse files Browse the repository at this point in the history
  • Loading branch information
hrgdavor committed Jul 21, 2024
1 parent 7b38136 commit 1addaf8
Show file tree
Hide file tree
Showing 14 changed files with 263 additions and 91 deletions.
7 changes: 6 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,10 @@
},
"files.associations": {
"*.js": "javascriptreact"
}
},
"typescript.inlayHints.propertyDeclarationTypes.enabled": false,
"typescript.inlayHints.parameterTypes.enabled": false,
"typescript.inlayHints.variableTypes.enabled": false,
"typescript.inlayHints.parameterNames.enabled": "none",
"typescript.inlayHints.variableTypes.suppressWhenTypeMatchesName": false
}
2 changes: 1 addition & 1 deletion apps/repl/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@jsx6/repl",
"version": "1.8.9",
"version": "1.8.10",
"type": "module",
"description": "JSX6 REPL engine",
"main": "index.js",
Expand Down
2 changes: 1 addition & 1 deletion common/config/rush/version-policies.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@
{
"policyName": "jsx6",
"definitionName": "lockStepVersion",
"version": "1.8.9",
"version": "1.8.10",
"nextBump": "patch",
"mainProject": "@jsx6/jsx6"
},
Expand Down
4 changes: 2 additions & 2 deletions libs/jsx-dev-runtime/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@jsx6/jsx-dev-runtime",
"version": "1.8.9",
"version": "1.8.10",
"type": "module",
"sideEffects": false,
"description": "JSX dev runtime for jsx6",
Expand Down Expand Up @@ -49,7 +49,7 @@
},
"homepage": "https://github.com/hrgdavor/jsx6/blob/master/lib/jsx-dev-runtime/README.md",
"dependencies": {
"@jsx6/jsx6": "1.8.9"
"@jsx6/jsx6": "1.8.10"
},
"devDependencies": {
"esbuild": "^0.17.18"
Expand Down
4 changes: 2 additions & 2 deletions libs/jsx-runtime/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@jsx6/jsx-runtime",
"version": "1.8.9",
"version": "1.8.10",
"type": "module",
"sideEffects": false,
"description": "jsx runtime for jsx6",
Expand Down Expand Up @@ -48,7 +48,7 @@
},
"homepage": "https://github.com/hrgdavor/jsx6/blob/master/lib/jsx-runtime/README.md",
"dependencies": {
"@jsx6/jsx6": "1.8.9"
"@jsx6/jsx6": "1.8.10"
},
"devDependencies": {
"esbuild": "^0.17.18"
Expand Down
6 changes: 6 additions & 0 deletions libs/jsx6/CHANGELOG.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
{
"name": "@jsx6/jsx6",
"entries": [
{
"version": "1.8.10",
"tag": "@jsx6/jsx6_v1.8.10",
"date": "Sun, 21 Jul 2024 13:31:17 GMT",
"comments": {}
},
{
"version": "1.8.9",
"tag": "@jsx6/jsx6_v1.8.9",
Expand Down
7 changes: 6 additions & 1 deletion libs/jsx6/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
# Change Log - @jsx6/jsx6

This log was last generated on Fri, 19 Jul 2024 18:45:50 GMT and should not be manually modified.
This log was last generated on Sun, 21 Jul 2024 13:31:17 GMT and should not be manually modified.

## 1.8.10
Sun, 21 Jul 2024 13:31:17 GMT

_Version update only_

## 1.8.9
Fri, 19 Jul 2024 18:45:50 GMT
Expand Down
6 changes: 3 additions & 3 deletions libs/jsx6/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@jsx6/jsx6",
"version": "1.8.9",
"version": "1.8.10",
"type": "module",
"sideEffects": false,
"description": "JSX and ES6+ UI library",
Expand Down Expand Up @@ -50,12 +50,12 @@
"devDependencies": {
"@jsx6/build": "^0.2.4",
"esbuild": "^0.17.18",
"@jsx6/jsx-dev-runtime": "1.8.9",
"@jsx6/jsx-dev-runtime": "1.8.10",
"typescript": "^5.0.4",
"@happy-dom/global-registrator": "~14.7.1",
"happy-dom": "~14.7.1"
},
"dependencies": {
"@jsx6/signal": "1.8.9"
"@jsx6/signal": "1.8.10"
}
}
178 changes: 107 additions & 71 deletions libs/jsx6/src/validate.js
Original file line number Diff line number Diff line change
@@ -1,97 +1,134 @@

/**
* @typedef ValidationRule
* @prop {booelan|string} required - truthy means required, shoud be string
* @prop {string} message - message when fails
* @prop {number} min
* @prop {number} max
* @prop {string} type
* @prop {string} example
* @prop {Object.<string,ValidationRule>} items - if has subdocument
* @prop {string|RegExp|function} pattern
*
* @prop {undefined|boolean|string} [required] - truthy means required, shoud be string
* @prop {string} [message] - message when fails, if not specified, type is returned in validation result
* @prop {number} [min]
* @prop {number} [max]
* @prop {string} [type]
* @prop {string} [example]
* @prop {Object.<string,ValidationRule>|Array.<ValidationRule>} [items] - if has subdocument
* @prop {string|RegExp} [pattern]
* @prop {function} [validate]
*
* @typedef ValidationResult
* @prop {string} message - message if failed
* @prop {string} type
* @prop {string} message - message if failed
* @prop {string} [type]
* @prop {string} field
* @prop {ValidationRule} rule
* @prop {Object.<string,ValidationRule>} items - if has subdocument
*/
* @prop {ValidationRule} rule - original rule that caused this validation error
* @prop {Object.<string,ValidationRule>|Array.<ValidationResult>} items - if has subdocument
*/

/**
*
* @param {any} v
* @param {ValidationRule} rule
* @returns
*/
export function validate(v, rule, field) {
const { required, message = 'invalid_value', type = 'pattern', min, max, example, pattern, items } = rule
// if(field == 'name2') debugger
if(items){
let out = {}
for(let p in items){
out[p] = validate(v?.[p], items[p], p)
*
* @param {any} v
* @param {ValidationRule} rule
* @param {string} field
* @returns
*/
export async function validate(v, rule = {}, field = '') {
const { validate: _validate, items } = rule

// rule uses a custom validation function
if (_validate) return await _validate(v, rule, field)

// simple validation is called for leaf values
let result = validateSimple(v, rule, field)
//console.trace('field', field, result)
if (items) {
if (!result) result = { field }
let out
if (items instanceof Array) {
// array items declare validation rule as single element of array
out = []
if (v)
for (let p = 0; p < v.length; p++) {
out[p] = await validate(v?.[p], items[0], p)
}
} else {
// object items declare validation rule string:ValidationRule
out = {}
for (let p in items) {
out[p] = await validate(v?.[p], items[p], p)
}
}
return {items:out, field}
result.items = out
}

if (typeof pattern == 'function') {
return pattern(v, rule)
return result
// no return means undefined, means valid
}

export const genRequired = (field, rule) => {
const required = rule ? rule.required : 'required'
return {
field,
rule,
message: typeof required === 'string' ? required : 'required',
type: 'required',
}
}

if(v && v instanceof Array){
return {items: v.map(checkOne), field}
}else{
return checkOne(v, field)
/** Sync validation of only synchronous rules from ValidationRule.
* It ignores `validate` function in the rule, as that function could be async.
* if `validate` function is present you should
*
* @param {any} v
* @param {ValidationRule} rule
* @param {string} field
* @returns
*/
function validateSimple(v, rule = {}, field) {
const { required, message = 'invalid_value', type = 'pattern', min, max, example, pattern } = rule
//console.log('field', field, v)
if (v === null || v === undefined || v === '' || (required && v && v instanceof Array && !v.length)) {
return required ? genRequired(field, rule) : undefined // undefined means valid
}

function checkOne(v2, field){
if (v2 === null || v2 === void 0 || v2 === '' || v2 === false || (v2 && v2 instanceof Array && !v2.length)) {
return required ? { type: 'required', message: typeof required === 'string' ? required: 'required', rule, field } : undefined
}

if (!pattern) return // undefined means valid
if (!pattern) return // undefined means valid

var reg = pattern instanceof RegExp ? pattern : new RegExp(pattern)
if (!reg.test(v2)) {
return { type, message, value, example, min, max, rule, field }
}

var hasMin = min !== void 0 && min !== null
var hasMax = max !== void 0 && max !== null
if (hasMin || hasMax) {
v2 = parseFloat(v2)
var prep = { type: 'invalid_range', min, max, field }
if (hasMax && hasMin) {
if (v2 < min || v2 > max) prep.message = 'must_be_between'
} else if (hasMax) {
if (v2 > max) prep.message = 'max_allowed_value'
} else if (hasMin) {
if (v2 < min) prep.message = 'min_allowed_value'
}
if (prep.message) return prep
var reg = pattern instanceof RegExp ? pattern : new RegExp(pattern)
if (!reg.test(v)) {
return { type, message, value, example, min, max, rule, field }
}

var hasMin = min !== void 0 && min !== null
var hasMax = max !== void 0 && max !== null
if (hasMin || hasMax) {
v = parseFloat(v)
var prep = { type: 'invalid_range', min, max, field }
if (hasMax && hasMin) {
if (v < min || v > max) prep.message = 'must_be_between'
} else if (hasMax) {
if (v > max) prep.message = 'max_allowed_value'
} else if (hasMin) {
if (v < min) prep.message = 'min_allowed_value'
}
if (prep.message) return prep
}
// no return means undefined, means valid
}

export function isAllValid(result){
if(!result) return true
const {items,message} = result
if(message) return false
if(items instanceof Array){
for(let i=0; i<items.length; i++){
if(!isAllValid(items[i])) return false
/**
*
* @param {ValidationResult} result
* @returns
*/
export function isAllValid(result) {
if (!result) return true
const { items, message } = result
if (message) return false
if (items instanceof Array) {
for (let i = 0; i < items.length; i++) {
if (!isAllValid(items[i])) return false
}
}else{
for(let i in items){
if(!isAllValid(items[i])) return false
} else {
for (let i in items) {
if (!isAllValid(items[i])) return false
}
}
return true
}

export const requiredRule = (message='required') => ({required:message})
export const requiredRule = (message = 'required') => ({ required: message })

export const intRule = (required, min, max) => ({
required,
Expand All @@ -110,4 +147,3 @@ export const floatRule = (required, min, max) => ({
example: '11.45',
message: 'must_be_decimal',
})

Loading

0 comments on commit 1addaf8

Please sign in to comment.