1
0
mirror of synced 2024-11-22 21:36:04 +03:00
vue-formulario/src/Formulario.ts

117 lines
3.6 KiB
TypeScript
Raw Normal View History

import merge from '@/utils/merge'
import validationRules from '@/validation/rules'
import validationMessages from '@/validation/messages'
2020-10-09 22:58:28 +03:00
import {
ValidationContext,
2020-11-06 20:44:04 +03:00
ValidationRuleFn,
ValidationMessageFn,
ValidationMessageI18NFn,
ViolationsRecord,
} from '@/validation/validator'
import { FormularioFormInterface } from '@/types'
export interface FormularioOptions {
2020-11-10 09:53:13 +03:00
validationRules?: Record<string, ValidationRuleFn>;
validationMessages?: Record<string, ValidationMessageI18NFn|string>;
}
2020-05-22 14:22:56 +03:00
/**
* The base formulario library.
*/
export default class Formulario {
2020-11-06 20:44:04 +03:00
public validationRules: Record<string, ValidationRuleFn> = {}
2020-11-10 09:47:40 +03:00
public validationMessages: Record<string, ValidationMessageI18NFn|string> = {}
private readonly registry: Map<string, FormularioFormInterface>
public constructor (options?: FormularioOptions) {
this.registry = new Map()
this.validationRules = validationRules
this.validationMessages = validationMessages
2020-05-22 14:22:56 +03:00
this.extend(options || {})
}
/**
* Given a set of options, apply them to the pre-existing options.
*/
public extend (extendWith: FormularioOptions): Formulario {
2020-05-22 14:22:56 +03:00
if (typeof extendWith === 'object') {
this.validationRules = merge(this.validationRules, extendWith.validationRules || {})
this.validationMessages = merge(this.validationMessages, extendWith.validationMessages || {})
2020-05-22 14:22:56 +03:00
return this
}
throw new Error(`[Formulario]: Formulario.extend(): should be passed an object (was ${typeof extendWith})`)
}
public runValidation (id: string): Promise<ViolationsRecord> {
if (!this.registry.has(id)) {
throw new Error(`[Formulario]: Formulario.runValidation(): no forms with id "${id}"`)
}
const form = this.registry.get(id) as FormularioFormInterface
return form.runValidation()
}
public resetValidation (id: string): void {
if (!this.registry.has(id)) {
return
}
const form = this.registry.get(id) as FormularioFormInterface
form.resetValidation()
}
/**
* Used by forms instances to add themselves into a registry
* @internal
*/
public register (id: string, form: FormularioFormInterface): void {
if (this.registry.has(id)) {
throw new Error(`[Formulario]: Formulario.register(): id "${id}" is already in use`)
}
this.registry.set(id, form)
}
/**
* Used by forms instances to remove themselves from a registry
* @internal
*/
public unregister (id: string): void {
if (this.registry.has(id)) {
this.registry.delete(id)
}
2020-05-22 14:22:56 +03:00
}
/**
* Get validation rules by merging any passed in with global rules.
* @internal
2020-05-22 14:22:56 +03:00
*/
public getRules (extendWith: Record<string, ValidationRuleFn> = {}): Record<string, ValidationRuleFn> {
return merge(this.validationRules, extendWith)
2020-05-22 14:22:56 +03:00
}
/**
* Get validation messages by merging any passed in with global messages.
* @internal
*/
public getMessages (vm: Vue, extendWith: Record<string, ValidationMessageI18NFn|string>): Record<string, ValidationMessageFn> {
const raw = merge(this.validationMessages || {}, extendWith)
2020-11-06 20:44:04 +03:00
const messages: Record<string, ValidationMessageFn> = {}
for (const name in raw) {
messages[name] = (context: ValidationContext, ...args: any[]): string => {
return typeof raw[name] === 'string' ? raw[name] : raw[name](vm, context, ...args)
}
}
return messages
2020-05-22 14:22:56 +03:00
}
}