
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
riot-action-forms
Advanced tools
Binds form with Riot Observable and implements validation based on element attributes. Serializes inputs using form-serialize and passes payload to submit event.
You can configure the forms using the RiotActionForms.configure() function. This will append to or override the default configurations.
The default configurations are
{
// Regular expressions used to validate
regexes: {
alphanum: /^[a-z0-9]+$/i,
alphanumspace: /^[a-z0-9\s]+$/i,
name: /^[a-z\s\-\,\.]+$/i,
username: /^[a-z0-9][a-z0-9\s\-\_\+\.]+[a-z0-9]$/i,
fqdn: /^[a-z0-9][a-z0-9\-\_\.]+[a-z0-9]{2,20}$/i,
tld: /^[a-z]{2,20}/i,
phone: /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/,
email: /.+@.+\..+/i
},
// Feedback, state, and container classes
classes: {
container: 'field',
error: 'error',
help: 'help',
hide: 'hide',
info: 'info',
success: 'success',
warning: 'warning'
},
// Field formatting functions
format: {
creditcard: function (value) {
const formatted = value.match(/([0-9]{4})|([0-9]+)/ig);
return formatted ? formatted.join(' ') : '';
}
},
// Serialization options for `form-serialize`
serialize: {
hash: true
}
}
For example, you could do:
RiotActionForms.configure({
// Add new regular expressions
regexes: {
strongPassword: /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^0-9a-zA-Z])(?=.{8,})/,
confirmationCode: /[0-9a-f]/i,
hexColor: /[0-9A-Fa-f]{6}/g,
// Overwrite the builtin ones
phone: /^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/,
email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
},
// Add new formatting functions. These will replace the field's value with the formatted value
format: {
phone: function (value) {
const m = value.match(RiotActionForms.config.regexes.phone);
if (!m) {
return value;
}
let val = `(${m[1] || m[2]}) ${m[3]}-${m[4]}`
if (m[5]) {
val += ` extension ${m5}`;
}
return val;
}
}
// If you wanted RiotActionForms to work with Twitter Bootstrap
classes: {
container: 'form-group',
error: 'has-error',
help: 'help-block',
hide: 'hidden',
info: 'has-info',
success: 'has-success',
warning: 'has-warning'
},
serialize: {
// If you want the payload to serialize a query string instead of a JSON object
hash: false,
// If true, disabled fields will also be serialized
disabled: true,
// If true, empty fields will also be serialized
empty: true
}
})
Form will be Riot Observable and have on one off trigger functions appended to it. You can hook into the form's events as needed.
| Event | Description | Data Passed |
|---|---|---|
| 'validate' | Validates all fields in the form | Event: native onsubmit |
| 'validated' | After form has been validated | Same as validate |
| 'invalid' | If validation fails | String: Message noting the invalid fields Array: list of invalid fields |
| 'submit' | After validation is successful | Event: native onsubmit Object|String: Serialized payload (type based on configuration) |
| 'submitted' | After submit event | Same as submit |
| 'rebind' | Triggers binding of elements for if new fields are added | N/A |
| 'rebinded' | After new elements have been binded | N/A |
| 'reset' | Resets the validity status of each element | N/A |
| 'ready' | After form has been binded and is ready to use | N/A |
Fields will be Riot Observable and have on one off trigger functions appended to it. You can hook into the fields' events as needed.
| Event | Description |
|---|---|
| 'validate' | Validates field |
| 'validated' | After field has been validated |
my-form.tag
<myform>
<form ref='testForm'>
<div class="field">
<label for='alphanum'>Alphanumerical</label>
<input type='text' name='alphanum' validate='alphanum' on='keyup blur' required />
<small class='help hide'>Help for alphanum regex</small>
</div>
<div class="field">
<label for='alphanum'>Alphanumerical Spaces</label>
<input type='text' name='alphanumspace' validate='alphanumspace' on='keyup blur' required />
<small class='help hide'>Help for alphanumspace regex</small>
</div>
<div class="field">
<label for='name'>Name</label>
<input type='text' name='name' validate='name' on='keyup blur' required />
<small class='help hide'>Help for name regex</small>
</div>
<div class="field">
<label for='username'>Username</label>
<input type='text' name='username' validate='username' on='keyup blur' required />
<small class='help hide'>Help for username regex</small>
</div>
<div class="field">
<label for='fqdn'>FQDN</label>
<input type='text' name='fqdn' validate='fqdn' on='keyup blur' required />
<small class='help hide'>Help for fqdn regex</small>
</div>
<div class="field">
<label for='tld'>TLD</label>
<input type='text' name='tld' validate='tld' on='keyup blur' required />
<small class='help hide'>Help for tld regex</small>
</div>
<div class="field">
<label for='phone'>Phone</label>
<input type='text' name='phone' validate='phone' on='keyup blur' required />
<small class='help hide'>Help for phone regex</small>
</div>
<div class="field">
<label for='email'>Email</label>
<input type='text' name='email' validate='email' on='keyup blur' required />
<small class='help hide'>Help for email regex</small>
</div>
<div class="field">
<label for='equals1'>Equals 1</label>
<input type='text' name='equals1' on='keyup blur' required />
<small class='help hide'>Help for equals1 regex</small>
</div>
<div class="field">
<label for='equals2'>Equals 2</label>
<input type='text' name='equals2' equals='[name=equals1' on='keyup blur' required />
<small class='help hide'>Help for equals2 regex</small>
</div>
<div class="field">
<label for='regex'>Regex</label>
<input type='text' name='regex' regex='regex' on='keyup blur' required />
<small class='help hide'>Help for regex regex</small>
</div>
<div class="field">
<label for='creditcard'>Format Credit Card</label>
<input type='text' name='creditcard' format='creditcard' on='keyup blur' required />
<small class='help hide'>Help for regex regex</small>
</div>
<div class='field'>
<button>Submit</button>
</div>
</form>
<script>
this.mixin('actionForms');
this.on('mount', () => {
this.actionForms.bindForm(this.refs.testForm);
console.log(this.refs.testForm);
});
</script>
</myform>
app.js
riot.mixin('actionForms', { actionForms: RiotActionForms });
riot.mount('*');
FAQs
Makes forms observable and binds field validations.
The npm package riot-action-forms receives a total of 6 weekly downloads. As such, riot-action-forms popularity was classified as not popular.
We found that riot-action-forms demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.