Compare commits

..

7 Commits

@ -1,4 +1,4 @@
# Tiny Validator # Tiny Components - Validator
Created with [Riot.js](https://riot.js.org) Created with [Riot.js](https://riot.js.org)
@ -10,13 +10,13 @@ For Validation this Component uses [Validate.js](https://validatejs.org/)
## Install ## Install
```bash ```bash
npm install tiny-validator --save npm install @tiny-components/validator --save
``` ```
## How to use ## You can use it like this
```javascript ```javascript
<form onsubmit={ (event) => { state.validator.handle(event) }} novalidate> <form class="form" onsubmit={ (event) => ( state.validator.submit(event) ) }>>
<div class="field"> <div class="field">
<label> <label>
email email
@ -38,17 +38,51 @@ npm install tiny-validator --save
import Validator from './validator.js' import Validator from './validator.js'
export default { export default {
state: {
validator: { }
},
onBeforeMount() { onBeforeMount() {
this.state.validator = new Validator({ // creating formValidator
email: { this.state.validator = new FormValidator(this.$('.form'), {
presence: true 'email': {
email: true 'presence': true,
'email': true
}, },
password: { 'password': {
presence: true 'presence': true
} }
}, this) })
// adding on success
this.state.validator.onSuccess((event, data) => {
this.handleSuccess(event, data)
})
// adding on error
this.state.validator.onError((event, errors, data) => {
this.handleError(event, errors, data)
})
},
/**
*
*/
handleSuccess(event, data)
{
event.preventDefault()
this.update()
},
/**
*
*/
handleError(event, errors, data)
{
this.update()
} }
} }
</script> </script>
``` ```

@ -1 +0,0 @@
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}

File diff suppressed because one or more lines are too long

@ -1,29 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Demo | Tiny Validator</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
<link href="styles.css" rel="stylesheet" type="text/css">
</head>
<body>
<form class="form" novalidate>
<div class="field">
<label>
email
<input type="email" name="email" />
</label>
<field-error name="email"></field-error>
</div>
<div class="field">
<label>
password
<input type="password" name="password" />
</label>
<field-error name="password"></field-error>
</div>
<button type="submit">Send</button>
</form>
<script type="text/javascript" src="demo.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Tiny Components | Validator</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
<link href="/example.css" rel="stylesheet" type="text/css">
</head>
<body>
<header class="header">
<div class="bar">
<div class="bar__start">
<h1 class="m-top-4 m-bottom-4 h4">
@tiny-components/validator
</h1>
</div>
<div class="bar__main justify-end">
<a class="button button--small m-left-sm-3 m-bottom-0" href="https://gitea.node001.net/tiny-components/validator" rel="noopener" target="_blank">
Gitea
<svg class="m-left-3 icon fill-text" aria-hidden="true">
<use xlink:href="symbol-defs.svg#icon-gitea"></use>
</svg>
</a>
</div>
</div>
</header>
<div class="container">
<div class="grid">
<div class="col-12">
<h2>
Form
</h2>
<form class="form-html" novalidate method="post">
<div class="field-group">
<label class="field-label">
email
<input type="email" class="field-text" name="email" />
</label>
<field-error name="email"></field-error>
</div>
<div class="field-group">
<label class="field-label">
password
<input type="password" class="field-text" name="password" />
</label>
<field-error name="password"></field-error>
</div>
<button class="button" type="submit">
Send
</button>
</form>
<div id="result" class="panel color-text-contrast background-color-success hidden">
<div class="panel__body">
<div class="content m-bottom-last-child-0">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="grid">
<div class="col-12">
<h2>
Form - Inside a Riot Component
</h2>
<form-component></form-component>
</div>
</div>
</div>
<script type="text/javascript" src="/example.js"></script>
</body>
</html>

@ -1,4 +1,4 @@
{ {
"/demo/demo.js": "/demo/demo.js", "/example/example.js": "/example/example.js",
"/demo/demo.css": "/demo/demo.css" "/example/example.css": "/example/example.css"
} }

386
package-lock.json generated

@ -1,26 +1,27 @@
{ {
"name": "@tentakelfabrik/tiny-validator", "name": "@tiny-components/validator",
"version": "1.0.0", "version": "0.2.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@tentakelfabrik/tiny-validator", "name": "@tiny-components/validator",
"version": "1.0.0", "version": "0.2.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tiny-components/plain-ui": "^0.5.0",
"form-serialize": "^0.7.2", "form-serialize": "^0.7.2",
"riot": "^5.1.2", "riot": "^6.1.2",
"validate.js": "^0.13.1" "validate.js": "^0.13.1"
}, },
"devDependencies": { "devDependencies": {
"@riotjs/compiler": "^5.1.3", "@riotjs/compiler": "^6.1.3",
"@riotjs/webpack-loader": "^5.0.0", "@riotjs/webpack-loader": "^6.0.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"laravel-mix": "^6.0.5", "laravel-mix": "^6.0.5",
"postcss": "^8.2.1", "postcss": "^8.4.12",
"sass": "^1.32.0", "sass": "^1.32.0",
"sass-loader": "^8.0.2" "sass-loader": "^12.4.0"
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
@ -357,10 +358,9 @@
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.12.11", "version": "7.17.9",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz",
"integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==",
"dev": true,
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
}, },
@ -1125,28 +1125,28 @@
} }
}, },
"node_modules/@riotjs/compiler": { "node_modules/@riotjs/compiler": {
"version": "5.1.3", "version": "6.1.3",
"resolved": "https://registry.npmjs.org/@riotjs/compiler/-/compiler-5.1.3.tgz", "resolved": "https://registry.npmjs.org/@riotjs/compiler/-/compiler-6.1.3.tgz",
"integrity": "sha512-YPOgwqpzs7LeA9JZV2qK2qW6o1iQ+6XEpqTopIC2V21hMwA4/9onGFOIzHf0MF0SX0NLzaou1zD6wY5w+G/+ug==", "integrity": "sha512-88974LTsuEOXQ07l9tJctyGtaLXy9LCcuiMbxJ0sEdQAS0OYP9SefBnW2a/7oWqrt5HQBxeOQ5zpSdSbs1LJeA==",
"dependencies": { "dependencies": {
"@babel/parser": "^7.16.4",
"@riotjs/parser": "^4.3.1", "@riotjs/parser": "^4.3.1",
"@riotjs/util": "2.0.0", "@riotjs/util": "2.0.4",
"acorn": "^8.0.4",
"cssesc": "^3.0.0", "cssesc": "^3.0.0",
"cumpa": "^1.0.1", "cumpa": "^1.0.1",
"curri": "^1.0.1", "curri": "^1.0.1",
"dom-nodes": "^1.1.3", "dom-nodes": "^1.1.3",
"globals": "^13.3.0", "globals": "^13.12.0",
"recast": "^0.20.4", "recast": "^0.20.5",
"source-map": "^0.7.3" "source-map": "^0.7.3"
} }
}, },
"node_modules/@riotjs/dom-bindings": { "node_modules/@riotjs/dom-bindings": {
"version": "5.0.1", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/@riotjs/dom-bindings/-/dom-bindings-5.0.1.tgz", "resolved": "https://registry.npmjs.org/@riotjs/dom-bindings/-/dom-bindings-6.0.3.tgz",
"integrity": "sha512-YDlGYnlZZc7aAhJ+GffyMxyDeR78U7yaKo+NDuoIL2pAceY3KYWXwmZS/3KdjenARxo0h/xZRvJrv77+jkx5Jw==", "integrity": "sha512-ajBgXquwkj8ZaGDhGWJc8n74dCZxvxzoE2hT26T+aAfHVAz5Nhk6jWjmggZ42nN4AX9CQJUMEGY9KJeHDj1ABg==",
"dependencies": { "dependencies": {
"@riotjs/util": "^2.0.0" "@riotjs/util": "^2.0.4"
} }
}, },
"node_modules/@riotjs/parser": { "node_modules/@riotjs/parser": {
@ -1163,17 +1163,20 @@
} }
}, },
"node_modules/@riotjs/util": { "node_modules/@riotjs/util": {
"version": "2.0.0", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/@riotjs/util/-/util-2.0.0.tgz", "resolved": "https://registry.npmjs.org/@riotjs/util/-/util-2.0.4.tgz",
"integrity": "sha512-+FtbujwoRT/Gi2/tarL0I30GIBCFFLUGtuhEJbosT09cUcP839oML871Yc7w5Zxb/IHFV1GS0p1ZGWe3JeeEjw==" "integrity": "sha512-C+YpN8p30T1+qtuPaHS2uobRHG+EpQhtXsu+Ul7sOStb1PnqptXut2YHSffQ6Xlu+FoOlP/BcMu+RVYvzWPmkg=="
}, },
"node_modules/@riotjs/webpack-loader": { "node_modules/@riotjs/webpack-loader": {
"version": "5.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/@riotjs/webpack-loader/-/webpack-loader-5.0.0.tgz", "resolved": "https://registry.npmjs.org/@riotjs/webpack-loader/-/webpack-loader-6.0.0.tgz",
"integrity": "sha512-Bko2jXcXY5YyfE41P/7HvMxpN8oa/oyaYWMVKmGzldHjVPmCD3VLhnh7YK3VMG04cdxIEHuBag8/WWsqAg1LRQ==", "integrity": "sha512-ktmbHSexRKPK7QEymAPJq3v/S6aQcmfB0OX2p8zUoKYKlfzEYmdCRjAg4vo9Xw82r4ueYDW5GIdMvoLGWqovIA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"loader-utils": "^2.0.0" "loader-utils": "^2.0.0"
},
"peerDependencies": {
"@riotjs/compiler": "^6.0.0"
} }
}, },
"node_modules/@riotjs/webpack-loader/node_modules/loader-utils": { "node_modules/@riotjs/webpack-loader/node_modules/loader-utils": {
@ -1190,6 +1193,14 @@
"node": ">=8.9.0" "node": ">=8.9.0"
} }
}, },
"node_modules/@tiny-components/plain-ui": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@tiny-components/plain-ui/-/plain-ui-0.5.0.tgz",
"integrity": "sha512-he2chVLtq3KV7yWgFIfPKi5UuHEwmNyoegpjKSByYWHK+/3fH/kK+0UCmmiJd6ZbuvBTaJKtYikpJYZhkVfaFQ==",
"dependencies": {
"normalize.css": "^8.0.1"
}
},
"node_modules/@types/autoprefixer": { "node_modules/@types/autoprefixer": {
"version": "9.7.2", "version": "9.7.2",
"resolved": "https://registry.npmjs.org/@types/autoprefixer/-/autoprefixer-9.7.2.tgz", "resolved": "https://registry.npmjs.org/@types/autoprefixer/-/autoprefixer-9.7.2.tgz",
@ -1829,6 +1840,7 @@
"version": "8.0.4", "version": "8.0.4",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
"integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
"dev": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
}, },
@ -3585,20 +3597,6 @@
"node": ">=8.9.0" "node": ">=8.9.0"
} }
}, },
"node_modules/css-loader/node_modules/postcss": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.1.tgz",
"integrity": "sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA==",
"dev": true,
"dependencies": {
"colorette": "^1.2.1",
"nanoid": "^3.1.20",
"source-map": "^0.6.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/css-loader/node_modules/schema-utils": { "node_modules/css-loader/node_modules/schema-utils": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
@ -3628,15 +3626,6 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/css-loader/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/css-select": { "node_modules/css-select": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
@ -5389,14 +5378,17 @@
"dev": true "dev": true
}, },
"node_modules/globals": { "node_modules/globals": {
"version": "13.5.0", "version": "13.13.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.5.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
"integrity": "sha512-TMJe2Iu/qCIEFnG7IQ62C9N/iKdgX5wSvmGOVuk75+UAGDW+Yv/hH5+Ky6d/8UMqo4WCzhFCy+pHsvv09zhBoQ==", "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
"dependencies": { "dependencies": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/globby": { "node_modules/globby": {
@ -7247,9 +7239,9 @@
"optional": true "optional": true
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.1.20", "version": "3.3.2",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz",
"integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==",
"dev": true, "dev": true,
"bin": { "bin": {
"nanoid": "bin/nanoid.cjs" "nanoid": "bin/nanoid.cjs"
@ -7422,6 +7414,11 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/normalize.css": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
"integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
},
"node_modules/npm-run-path": { "node_modules/npm-run-path": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@ -7962,6 +7959,12 @@
"node": ">=0.12" "node": ">=0.12"
} }
}, },
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.2.2", "version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
@ -8016,14 +8019,24 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.2.1", "version": "8.4.12",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.1.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz",
"integrity": "sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA==", "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==",
"dev": true, "dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
}
],
"dependencies": { "dependencies": {
"colorette": "^1.2.1", "nanoid": "^3.3.1",
"nanoid": "^3.1.20", "picocolors": "^1.0.0",
"source-map": "^0.6.1" "source-map-js": "^1.0.2"
}, },
"engines": { "engines": {
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
@ -10431,15 +10444,6 @@
"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
"dev": true "dev": true
}, },
"node_modules/postcss/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/process": { "node_modules/process": {
"version": "0.11.10", "version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@ -10632,9 +10636,9 @@
} }
}, },
"node_modules/recast": { "node_modules/recast": {
"version": "0.20.4", "version": "0.20.5",
"resolved": "https://registry.npmjs.org/recast/-/recast-0.20.4.tgz", "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz",
"integrity": "sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==", "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==",
"dependencies": { "dependencies": {
"ast-types": "0.14.2", "ast-types": "0.14.2",
"esprima": "~4.0.0", "esprima": "~4.0.0",
@ -10955,13 +10959,13 @@
} }
}, },
"node_modules/riot": { "node_modules/riot": {
"version": "5.1.2", "version": "6.1.2",
"resolved": "https://registry.npmjs.org/riot/-/riot-5.1.2.tgz", "resolved": "https://registry.npmjs.org/riot/-/riot-6.1.2.tgz",
"integrity": "sha512-6ztxtDt/Vl78Qzm0N370sqU+wVSmqVKzCOMPKTxObqXvCGTi+qnzLe7aPIfZPPWYwr7O5gA8Lt396MIR3SKxcA==", "integrity": "sha512-JYGKN6D2FwNP+eH2suh13jhQPXnaAeXdwCIWH0vz2UvhLBY9mTFZv6/dPAyEluHTf9bjAJOriFc4PDXox5Fjqw==",
"dependencies": { "dependencies": {
"@riotjs/compiler": "^5.1.3", "@riotjs/compiler": "^6.1.3",
"@riotjs/dom-bindings": "5.0.1", "@riotjs/dom-bindings": "6.0.3",
"@riotjs/util": "^2.0.0", "@riotjs/util": "^2.0.4",
"bianco.attr": "^1.0.0", "bianco.attr": "^1.0.0",
"bianco.query": "^1.0.0", "bianco.query": "^1.0.0",
"cumpa": "^1.0.1", "cumpa": "^1.0.1",
@ -11024,28 +11028,41 @@
} }
}, },
"node_modules/sass-loader": { "node_modules/sass-loader": {
"version": "8.0.2", "version": "12.6.0",
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
"integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"clone-deep": "^4.0.1", "klona": "^2.0.4",
"loader-utils": "^1.2.3", "neo-async": "^2.6.2"
"neo-async": "^2.6.1",
"schema-utils": "^2.6.1",
"semver": "^6.3.0"
}, },
"engines": { "engines": {
"node": ">= 8.9.0" "node": ">= 12.13.0"
}
}, },
"node_modules/sass-loader/node_modules/semver": { "funding": {
"version": "6.3.0", "type": "opencollective",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "url": "https://opencollective.com/webpack"
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", },
"dev": true, "peerDependencies": {
"bin": { "fibers": ">= 3.1.0",
"semver": "bin/semver.js" "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
"sass": "^1.3.0",
"sass-embedded": "*",
"webpack": "^5.0.0"
},
"peerDependenciesMeta": {
"fibers": {
"optional": true
},
"node-sass": {
"optional": true
},
"sass": {
"optional": true
},
"sass-embedded": {
"optional": true
}
} }
}, },
"node_modules/sax": { "node_modules/sax": {
@ -11545,6 +11562,15 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-resolve": { "node_modules/source-map-resolve": {
"version": "0.5.3", "version": "0.5.3",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
@ -12171,6 +12197,9 @@
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"engines": { "engines": {
"node": ">=10" "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/type-is": { "node_modules/type-is": {
@ -13377,10 +13406,9 @@
} }
}, },
"@babel/parser": { "@babel/parser": {
"version": "7.12.11", "version": "7.17.9",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz",
"integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg=="
"dev": true
}, },
"@babel/plugin-proposal-async-generator-functions": { "@babel/plugin-proposal-async-generator-functions": {
"version": "7.12.12", "version": "7.12.12",
@ -14125,28 +14153,28 @@
} }
}, },
"@riotjs/compiler": { "@riotjs/compiler": {
"version": "5.1.3", "version": "6.1.3",
"resolved": "https://registry.npmjs.org/@riotjs/compiler/-/compiler-5.1.3.tgz", "resolved": "https://registry.npmjs.org/@riotjs/compiler/-/compiler-6.1.3.tgz",
"integrity": "sha512-YPOgwqpzs7LeA9JZV2qK2qW6o1iQ+6XEpqTopIC2V21hMwA4/9onGFOIzHf0MF0SX0NLzaou1zD6wY5w+G/+ug==", "integrity": "sha512-88974LTsuEOXQ07l9tJctyGtaLXy9LCcuiMbxJ0sEdQAS0OYP9SefBnW2a/7oWqrt5HQBxeOQ5zpSdSbs1LJeA==",
"requires": { "requires": {
"@babel/parser": "^7.16.4",
"@riotjs/parser": "^4.3.1", "@riotjs/parser": "^4.3.1",
"@riotjs/util": "2.0.0", "@riotjs/util": "2.0.4",
"acorn": "^8.0.4",
"cssesc": "^3.0.0", "cssesc": "^3.0.0",
"cumpa": "^1.0.1", "cumpa": "^1.0.1",
"curri": "^1.0.1", "curri": "^1.0.1",
"dom-nodes": "^1.1.3", "dom-nodes": "^1.1.3",
"globals": "^13.3.0", "globals": "^13.12.0",
"recast": "^0.20.4", "recast": "^0.20.5",
"source-map": "^0.7.3" "source-map": "^0.7.3"
} }
}, },
"@riotjs/dom-bindings": { "@riotjs/dom-bindings": {
"version": "5.0.1", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/@riotjs/dom-bindings/-/dom-bindings-5.0.1.tgz", "resolved": "https://registry.npmjs.org/@riotjs/dom-bindings/-/dom-bindings-6.0.3.tgz",
"integrity": "sha512-YDlGYnlZZc7aAhJ+GffyMxyDeR78U7yaKo+NDuoIL2pAceY3KYWXwmZS/3KdjenARxo0h/xZRvJrv77+jkx5Jw==", "integrity": "sha512-ajBgXquwkj8ZaGDhGWJc8n74dCZxvxzoE2hT26T+aAfHVAz5Nhk6jWjmggZ42nN4AX9CQJUMEGY9KJeHDj1ABg==",
"requires": { "requires": {
"@riotjs/util": "^2.0.0" "@riotjs/util": "^2.0.4"
} }
}, },
"@riotjs/parser": { "@riotjs/parser": {
@ -14159,14 +14187,14 @@
} }
}, },
"@riotjs/util": { "@riotjs/util": {
"version": "2.0.0", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/@riotjs/util/-/util-2.0.0.tgz", "resolved": "https://registry.npmjs.org/@riotjs/util/-/util-2.0.4.tgz",
"integrity": "sha512-+FtbujwoRT/Gi2/tarL0I30GIBCFFLUGtuhEJbosT09cUcP839oML871Yc7w5Zxb/IHFV1GS0p1ZGWe3JeeEjw==" "integrity": "sha512-C+YpN8p30T1+qtuPaHS2uobRHG+EpQhtXsu+Ul7sOStb1PnqptXut2YHSffQ6Xlu+FoOlP/BcMu+RVYvzWPmkg=="
}, },
"@riotjs/webpack-loader": { "@riotjs/webpack-loader": {
"version": "5.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/@riotjs/webpack-loader/-/webpack-loader-5.0.0.tgz", "resolved": "https://registry.npmjs.org/@riotjs/webpack-loader/-/webpack-loader-6.0.0.tgz",
"integrity": "sha512-Bko2jXcXY5YyfE41P/7HvMxpN8oa/oyaYWMVKmGzldHjVPmCD3VLhnh7YK3VMG04cdxIEHuBag8/WWsqAg1LRQ==", "integrity": "sha512-ktmbHSexRKPK7QEymAPJq3v/S6aQcmfB0OX2p8zUoKYKlfzEYmdCRjAg4vo9Xw82r4ueYDW5GIdMvoLGWqovIA==",
"dev": true, "dev": true,
"requires": { "requires": {
"loader-utils": "^2.0.0" "loader-utils": "^2.0.0"
@ -14185,6 +14213,14 @@
} }
} }
}, },
"@tiny-components/plain-ui": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@tiny-components/plain-ui/-/plain-ui-0.5.0.tgz",
"integrity": "sha512-he2chVLtq3KV7yWgFIfPKi5UuHEwmNyoegpjKSByYWHK+/3fH/kK+0UCmmiJd6ZbuvBTaJKtYikpJYZhkVfaFQ==",
"requires": {
"normalize.css": "^8.0.1"
}
},
"@types/autoprefixer": { "@types/autoprefixer": {
"version": "9.7.2", "version": "9.7.2",
"resolved": "https://registry.npmjs.org/@types/autoprefixer/-/autoprefixer-9.7.2.tgz", "resolved": "https://registry.npmjs.org/@types/autoprefixer/-/autoprefixer-9.7.2.tgz",
@ -14797,7 +14833,8 @@
"acorn": { "acorn": {
"version": "8.0.4", "version": "8.0.4",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
"integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==" "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
"dev": true
}, },
"aggregate-error": { "aggregate-error": {
"version": "3.1.0", "version": "3.1.0",
@ -16281,17 +16318,6 @@
"json5": "^2.1.2" "json5": "^2.1.2"
} }
}, },
"postcss": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.1.tgz",
"integrity": "sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA==",
"dev": true,
"requires": {
"colorette": "^1.2.1",
"nanoid": "^3.1.20",
"source-map": "^0.6.1"
}
},
"schema-utils": { "schema-utils": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
@ -16311,12 +16337,6 @@
"requires": { "requires": {
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
} }
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
} }
} }
}, },
@ -17781,9 +17801,9 @@
"dev": true "dev": true
}, },
"globals": { "globals": {
"version": "13.5.0", "version": "13.13.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.5.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
"integrity": "sha512-TMJe2Iu/qCIEFnG7IQ62C9N/iKdgX5wSvmGOVuk75+UAGDW+Yv/hH5+Ky6d/8UMqo4WCzhFCy+pHsvv09zhBoQ==", "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
"requires": { "requires": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
} }
@ -19303,9 +19323,9 @@
"optional": true "optional": true
}, },
"nanoid": { "nanoid": {
"version": "3.1.20", "version": "3.3.2",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz",
"integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==",
"dev": true "dev": true
}, },
"nanomatch": { "nanomatch": {
@ -19449,6 +19469,11 @@
"integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
"dev": true "dev": true
}, },
"normalize.css": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
"integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
},
"npm-run-path": { "npm-run-path": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@ -19881,6 +19906,12 @@
"sha.js": "^2.4.8" "sha.js": "^2.4.8"
} }
}, },
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"picomatch": { "picomatch": {
"version": "2.2.2", "version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
@ -19925,22 +19956,14 @@
"dev": true "dev": true
}, },
"postcss": { "postcss": {
"version": "8.2.1", "version": "8.4.12",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.1.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz",
"integrity": "sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA==", "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==",
"dev": true, "dev": true,
"requires": { "requires": {
"colorette": "^1.2.1", "nanoid": "^3.3.1",
"nanoid": "^3.1.20", "picocolors": "^1.0.0",
"source-map": "^0.6.1" "source-map-js": "^1.0.2"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
} }
}, },
"postcss-calc": { "postcss-calc": {
@ -22073,9 +22096,9 @@
} }
}, },
"recast": { "recast": {
"version": "0.20.4", "version": "0.20.5",
"resolved": "https://registry.npmjs.org/recast/-/recast-0.20.4.tgz", "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz",
"integrity": "sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==", "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==",
"requires": { "requires": {
"ast-types": "0.14.2", "ast-types": "0.14.2",
"esprima": "~4.0.0", "esprima": "~4.0.0",
@ -22334,13 +22357,13 @@
} }
}, },
"riot": { "riot": {
"version": "5.1.2", "version": "6.1.2",
"resolved": "https://registry.npmjs.org/riot/-/riot-5.1.2.tgz", "resolved": "https://registry.npmjs.org/riot/-/riot-6.1.2.tgz",
"integrity": "sha512-6ztxtDt/Vl78Qzm0N370sqU+wVSmqVKzCOMPKTxObqXvCGTi+qnzLe7aPIfZPPWYwr7O5gA8Lt396MIR3SKxcA==", "integrity": "sha512-JYGKN6D2FwNP+eH2suh13jhQPXnaAeXdwCIWH0vz2UvhLBY9mTFZv6/dPAyEluHTf9bjAJOriFc4PDXox5Fjqw==",
"requires": { "requires": {
"@riotjs/compiler": "^5.1.3", "@riotjs/compiler": "^6.1.3",
"@riotjs/dom-bindings": "5.0.1", "@riotjs/dom-bindings": "6.0.3",
"@riotjs/util": "^2.0.0", "@riotjs/util": "^2.0.4",
"bianco.attr": "^1.0.0", "bianco.attr": "^1.0.0",
"bianco.query": "^1.0.0", "bianco.query": "^1.0.0",
"cumpa": "^1.0.1", "cumpa": "^1.0.1",
@ -22394,24 +22417,13 @@
} }
}, },
"sass-loader": { "sass-loader": {
"version": "8.0.2", "version": "12.6.0",
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
"integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
"dev": true, "dev": true,
"requires": { "requires": {
"clone-deep": "^4.0.1", "klona": "^2.0.4",
"loader-utils": "^1.2.3", "neo-async": "^2.6.2"
"neo-async": "^2.6.1",
"schema-utils": "^2.6.1",
"semver": "^6.3.0"
},
"dependencies": {
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
} }
}, },
"sax": { "sax": {
@ -22854,6 +22866,12 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
}, },
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"dev": true
},
"source-map-resolve": { "source-map-resolve": {
"version": "0.5.3", "version": "0.5.3",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",

@ -1,25 +1,26 @@
{ {
"name": "@tentakelfabrik/tiny-validator", "name": "@tiny-components/validator",
"version": "1.0.0", "version": "0.2.0",
"description": "Form Validator with validator.js for riotjs", "description": "Form Validation with Riotjs",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git@github.com:tentakelfabrik/tiny-validator.git" "url": "git@github.com:node001-net/tiny-components-validator.git"
}, },
"author": "Björn Hase", "author": "Björn Hase",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tiny-components/plain-ui": "^0.5.0",
"form-serialize": "^0.7.2", "form-serialize": "^0.7.2",
"riot": "^5.1.2", "riot": "^6.1.2",
"validate.js": "^0.13.1" "validate.js": "^0.13.1"
}, },
"devDependencies": { "devDependencies": {
"@riotjs/compiler": "^5.1.3", "@riotjs/compiler": "^6.1.3",
"@riotjs/webpack-loader": "^5.0.0", "@riotjs/webpack-loader": "^6.0.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"laravel-mix": "^6.0.5", "laravel-mix": "^6.0.5",
"postcss": "^8.2.1", "postcss": "^8.4.12",
"sass": "^1.32.0", "sass": "^1.32.0",
"sass-loader": "^8.0.2" "sass-loader": "^12.4.0"
} }
} }

@ -1,117 +0,0 @@
import validate from 'validate.js'
import serialize from 'form-serialize'
/**
* Form Validator with RiotJS Components
*
*
*
*
*/
class FormValidator
{
/**
*
* @param {[type]} formSelector [description]
* @param {[type]} constraits [description]
*/
constructor(formSelector, constraits)
{
// getting selector to find form-element
this.formSelector = formSelector
// constraits for validate.js
this.constraits = constraits
// get form and elements
this.form = document.querySelector(this.formSelector)
this.elements = this.form.querySelectorAll('field-error')
// adding submit event
this.form.addEventListener('submit', (event) => {
this.onSubmit(event)
})
// adding event if a element is updated
this.form.addEventListener('field-update', (event) => {
this.onFieldUpdate(event)
})
}
/**
*
* @param {[type]} event [description]
* @return {[type]} [description]
*/
onSubmit(event)
{
let errors = validate(serialize(event.target, {
hash: true
}), this.constraits, {
fullMessages: false
})
if (errors) {
event.preventDefault()
// send each element a event
this.elements.forEach((element) => {
let elementErrors = false
// check for errors by name
if (errors[element.attributes.name.nodeValue]) {
elementErrors = errors[element.attributes.name.nodeValue]
}
this.dispatchCustomEvent(elementErrors, element)
})
}
}
/**
*
*
* @param {Event} event
*
*/
onFieldUpdate(event)
{
// workaround, make sure that value for single is undefined if it is empty
if (event.detail.value == '') {
event.detail.value = undefined
}
let errors = validate.single(event.detail.value, this.constraits[event.detail.name])
// search for element by name and dispatch event
this.elements.forEach((element) => {
if (element.attributes.name.nodeValue == event.detail.name) {
this.dispatchCustomEvent(errors, element)
}
})
}
/**
* dispatch event to single element
*
* @param {Array} errors
* @param {Element} element
*
*/
dispatchCustomEvent(errors, element)
{
let detail = false
if (errors) {
detail = errors
}
const formValidationEvent = new CustomEvent('form-validation', {
'detail': detail
})
element.dispatchEvent(formValidationEvent)
}
}
export default FormValidator

@ -1,17 +0,0 @@
import * as riot from 'riot'
import FormValidator from './../FormValidator'
import FieldError from './../field-error.riot'
riot.register('field-error', FieldError)
riot.mount('field-error')
const formValidation = new FormValidator('form', {
'email': {
'presence': true,
'email': true
},
'password': {
'presence': true
}
})

@ -1,6 +0,0 @@
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}
/*# sourceMappingURL=normalize.min.css.map */
body {
}

@ -0,0 +1,31 @@
import * as riot from 'riot'
import FormValidator from './formValidator'
import FieldError from './fieldError.riot'
import FormComponent from './formComponent.riot'
// register & mount riot component
riot.register('field-error', FieldError)
riot.mount('field-error')
// creating formValidation
const formValidation = new FormValidator(document.querySelector('.form-html'), {
'email': {
'presence': true,
'email': true
},
'password': {
'presence': true
}
}, true)
formValidation.onSuccess((event, data) => {
event.preventDefault()
// show message and content of data from form
document.querySelector('#result .content').innerHTML = '<p>' + JSON.stringify(data) + '</p>'
document.querySelector('#result').classList.remove('hidden')
})
riot.register('form-component', FormComponent)
riot.mount('form-component')

@ -0,0 +1,6 @@
@import
'../node_modules/@tiny-components/plain-ui/src/scss/plain-ui';
.hidden {
display: none;
}

@ -1,5 +1,5 @@
<field-error> <field-error>
<div class="field__error" if={ state.errors.length > 0 }> <div class="field-error" if={ state.errors.length > 0 }>
<ul> <ul>
<li each={ error in state.errors }> <li each={ error in state.errors }>
{ error } { error }
@ -9,12 +9,13 @@
<script> <script>
/** /**
*
* Shows errors of Validation and raise a element to * Shows errors of Validation and raise a element to
* trigger single validation of field * trigger single validation of field
* *
* <field-error name="name" nofieldupdate></field-error> * <field-error name="name" closest="<optional>" nofieldupdate></field-error>
* *
* @author Björn Hase, Tentakelfabrik, me@tentakelfabrik.de * @author Björn Hase, me@herr-hase.wtf
* *
*/ */
@ -24,22 +25,39 @@
errors: [ errors: [
], ],
// css class for
closest: '.field-group',
},
/**
*
*
* @param {Object} props
* @param {Object} state
*
*/
onBeforeMounted(props, state)
{
if (props.closest) {
state.closest = props.closest
}
}, },
/** /**
* *
* *
* @param {Object} props [description] * @param {Object} props
* @param {Object} state [description] * @param {Object} state
* *
*/ */
onMounted(props, state) onMounted(props, state)
{ {
// getting parent element for entire field // getting parent element for entire field
const parent = this.root.closest('.field') const parent = this.root.closest(state.closest)
// getting current element by name // getting current element by name
const element = document.querySelector('[name="' + props.name + '"]') const element = parent.querySelector('[name="' + props.name + '"]')
// getting form // getting form
const form = element.closest('form') const form = element.closest('form')

@ -0,0 +1,108 @@
<form-component>
<div>
<form class="form" novalidate method="post" onsubmit={ (event) => ( state.validator.submit(event) ) }>
<div class="field-group">
<label class="field-label">
email
<input type="email" class="field-text" name="email" />
</label>
<field-error name="email"></field-error>
</div>
<div class="field-group">
<label class="field-label">
password
<input type="password" class="field-text" name="password" />
</label>
<field-error name="password"></field-error>
</div>
<button class="button" type="submit">
Send
</button>
</form>
<div class="loading" if={ state.isLoading }>
<span></span>
<span></span>
<span></span>
</div>
<div if={ state.result } class="panel color-text-contrast { state.class }">
<div class="panel__body">
<div class="content m-bottom-last-child-0">
{ state.result }
</div>
</div>
</div>
</div>
<script>
import * as riot from 'riot'
import FormValidator from './formValidator.js'
export default {
state:
{
result: undefined,
validator: undefined,
class: undefined
},
onMounted()
{
// creating formValidator
this.state.validator = new FormValidator(this.$('.form'), {
'email': {
'presence': true,
'email': true
},
'password': {
'presence': true
}
})
// adding on success
this.state.validator.onSuccess((event, data) => {
this.handleSuccess(event, data)
})
// adding on error
this.state.validator.onError((event, errors, data) => {
this.handleError(event, errors, data)
})
},
/**
*
* @param {object} event
* @param {array} data
*
*/
handleSuccess(event, data)
{
event.preventDefault()
this.state.class = 'background-color-success'
this.state.result = JSON.stringify(data)
this.update()
},
/**
*
*
* @param {object} event
* @param {array} errors
* @param {array} data
*
*/
handleError(event, errors, data)
{
this.state.class = 'background-color-danger'
this.state.result = JSON.stringify(errors)
this.update()
}
}
</script>
</form-component>

@ -0,0 +1,189 @@
import validate from 'validate.js'
import serialize from 'form-serialize'
/**
* Form Validator with RiotJS Components
*
*
* @author HerrHase
*
*/
class FormValidator
{
/**
*
* @param {[type]} formSelector [description]
* @param {[type]} constraits [description]
*/
constructor(formElement, constraits, addSubmitEvent = false)
{
// constraits for validate.js
this.constraits = constraits
// get form and elements
this.formElement = formElement
// if form not found
if (!this.formElement) {
console.error('FormValidator: form not found!')
}
this.elements = this.formElement.querySelectorAll('field-error')
// adding event if a element is updated
this.formElement.addEventListener('field-update', (event) => {
this._onFieldUpdate(event)
})
// adding submit event
if (addSubmitEvent) {
this.formElement.addEventListener('submit', (event) => {
this._onSubmit(event)
})
}
}
/**
* trigger submit
*
* @param {object} event
*
*/
submit(event)
{
this._onSubmit(event)
}
/**
*
* @param {function} onError
*
*/
onError(onError)
{
this._onError = onError
}
/**
* settin onSuccess callback and add submit-event on form
*
* @param {function} onSuccess
*
*/
onSuccess(onSuccess)
{
// adding onSuccess
this._onSuccess = onSuccess
}
/**
*
* @param {function} onError
*
*/
onBeforeSubmit(onBeforeSubmit)
{
this._onBeforeSubmit = onBeforeSubmit
}
/**
* handle submit
*
*
* @param {Event} event
*
*/
_onSubmit(event)
{
// getting data from target of submit event
const data = serialize(event.target, {
hash: true
})
// options for validate.js
const options = {
fullMessages: false
}
if (this._onBeforeSubmit) {
this._onBeforeSubmit()
}
// check form and getting errors
validate.async(data, this.constraits, options).then(
() => {
this._onSuccess(event, data)
},
(errors) => {
event.preventDefault()
// if onError is set, tha
if (this._onError) {
this._onError(event, errors, data)
}
// send each element a event
this.elements.forEach((element) => {
let elementErrors = false
// check for errors by name
if (errors[element.attributes.name.nodeValue]) {
elementErrors = errors[element.attributes.name.nodeValue]
}
this._dispatchCustomEvent(elementErrors, element)
})
}
)
}
/**
* send update to fields
*
*
* @param {Event} event
*
*/
_onFieldUpdate(event)
{
// workaround, make sure that value for single is undefined if it is empty
if (event.detail.value == '') {
event.detail.value = undefined
}
let errors = validate.single(event.detail.value, this.constraits[event.detail.name])
// search for element by name and dispatch event
this.elements.forEach((element) => {
if (element.attributes.name.nodeValue == event.detail.name) {
this._dispatchCustomEvent(errors, element)
}
})
}
/**
* dispatch event to single element
*
* @param {Array} errors
* @param {Element} element
*
*/
_dispatchCustomEvent(errors, element)
{
let detail = false
if (errors) {
detail = errors
}
const formValidationEvent = new CustomEvent('form-validation', {
'detail': detail
})
element.dispatchEvent(formValidationEvent)
}
}
export default FormValidator

@ -26,8 +26,8 @@ mix.webpackConfig({
} }
}) })
mix.js('src/demo/demo.js', 'demo') mix.js('src/example.js', 'example')
.sass('src/demo/demo.scss', 'demo') .sass('src/example.scss', 'example')
.options({ .options({
terser: { terser: {
extractComments: false, extractComments: false,

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save