adria-forms
Advanced tools
Comparing version 0.2.0 to 0.2.1
@@ -1,48 +0,1 @@ | ||
import "./types.js"; | ||
declare class Field<Attributes extends { | ||
name: string; | ||
rules: Rule[]; | ||
isRequired: { | ||
error: string; | ||
} | false; | ||
}, FieldNames extends Readonly<string[]>> { | ||
name: Attributes["name"]; | ||
fieldNames: FieldNames; | ||
rules: Attributes["rules"]; | ||
isRequired: Attributes["isRequired"]; | ||
constructor(attributes: Attributes, fieldNames: FieldNames); | ||
value: <Rule_1 extends ValueRuleType | ValueFieldRuleType | ArrayRuleType, Value extends Rule_1 extends ValueRuleType ? string : Rule_1 extends ValueFieldRuleType ? FieldNames[number] : readonly string[], ErrorMessage extends string>(rule: Rule_1, value: Value, errorMessage: ErrorMessage) => this; | ||
number: <Rule_1 extends ArrayRuleType | NumberRuleType, Value extends Rule_1 extends NumberRuleType ? number : readonly number[], ErrorMessage extends string>(rule: Rule_1, value: Value, errorMessage: ErrorMessage) => this; | ||
length: <Rule_1 extends NumberRuleType, Value extends number, ErrorMessage extends string>(rule: Rule_1, value: Value, errorMessage: ErrorMessage) => this; | ||
type: <Rule_1 extends ArrayRuleType | TypeRuleType, Value extends Rule_1 extends TypeRuleType ? "string" | "number" : ("string" | "number")[], ErrorMessage extends string>(rule: Rule_1, value: Value, errorMessage: ErrorMessage) => this; | ||
required: (errorMessage: string) => this; | ||
} | ||
declare type SerializedForm<F extends Field<{ | ||
name: string; | ||
rules: any; | ||
isRequired: any; | ||
}, any>> = Partial<Record<F["name"], F["rules"]>>; | ||
declare class Form<Fields extends Readonly<Field<{ | ||
name: string; | ||
rules: Rule[]; | ||
isRequired: { | ||
error: string; | ||
} | false; | ||
}, Readonly<string[]>>[]>> { | ||
fields: Map<Fields[number]["name"], Fields[number]>; | ||
constructor(...fields: Fields); | ||
field: <Field_1 extends Fields[number]>(fieldName: Field_1["name"]) => Field_1; | ||
serialize: () => SerializedForm<Fields[number]>; | ||
validate: (formData: FormData) => Partial<Record<Fields[number]["name"], string>> | null; | ||
} | ||
export declare const createForm: <FieldNames extends readonly string[]>(...fieldNames: FieldNames) => Form<Field<{ | ||
name: FieldNames[number]; | ||
rules: []; | ||
isRequired: false; | ||
}, FieldNames>[]>; | ||
export declare const parseForm: <S extends Partial<Record<any, any>>>(serializedForm: S) => Form<Field<{ | ||
name: Extract<keyof S, string>; | ||
rules: []; | ||
isRequired: any; | ||
}, any>[]>; | ||
export {}; | ||
export { Form } from "./form.js"; |
@@ -1,153 +0,1 @@ | ||
import { validate } from "./validate.js"; | ||
import "./types.js"; | ||
class Field { | ||
name; | ||
fieldNames; | ||
rules; | ||
isRequired; | ||
constructor(attributes, fieldNames) { | ||
this.name = attributes.name; | ||
this.rules = attributes.rules; | ||
this.isRequired = attributes.isRequired; | ||
this.fieldNames = fieldNames; | ||
} | ||
value = (rule, value, errorMessage) => { | ||
if (rule === "isField" || rule === "!isField") { | ||
this.rules.push({ | ||
target: "value", | ||
type: rule, | ||
value: value, | ||
error: errorMessage, | ||
}); | ||
return this; | ||
} | ||
if (typeof value === "string") { | ||
this.rules.push({ | ||
target: "value", | ||
type: rule, | ||
value, | ||
error: errorMessage, | ||
}); | ||
return this; | ||
} | ||
else { | ||
this.rules.push({ | ||
target: "value", | ||
type: rule, | ||
value: value, | ||
error: errorMessage, | ||
}); | ||
return this; | ||
} | ||
}; | ||
number = (rule, value, errorMessage) => { | ||
if (typeof value === "number") { | ||
this.rules.push({ | ||
target: "number", | ||
type: rule, | ||
value, | ||
error: errorMessage, | ||
}); | ||
return this; | ||
} | ||
else { | ||
this.rules.push({ | ||
target: "number", | ||
type: rule, | ||
value: value, | ||
error: errorMessage, | ||
}); | ||
return this; | ||
} | ||
}; | ||
length = (rule, value, errorMessage) => { | ||
this.rules.push({ | ||
target: "length", | ||
type: rule, | ||
value, | ||
error: errorMessage, | ||
}); | ||
return this; | ||
}; | ||
type = (rule, value, errorMessage) => { | ||
if (value === "string" || value === "number") { | ||
this.rules.push({ | ||
target: "type", | ||
type: rule, | ||
value, | ||
error: errorMessage, | ||
}); | ||
return this; | ||
} | ||
else { | ||
this.rules.push({ | ||
target: "type", | ||
type: rule, | ||
value, | ||
error: errorMessage, | ||
}); | ||
return this; | ||
} | ||
}; | ||
required = (errorMessage) => { | ||
this.isRequired = { | ||
error: errorMessage, | ||
}; | ||
return this; | ||
}; | ||
} | ||
class Form { | ||
fields; | ||
constructor(...fields) { | ||
this.fields = new Map(fields.map((val) => [val.name, val])); | ||
} | ||
field = (fieldName) => { | ||
return this.fields.get(fieldName); | ||
}; | ||
serialize = () => { | ||
const entries = Array.from(this.fields.entries()); | ||
return Object.fromEntries(entries.map(([key, value]) => { | ||
return [key, value.rules]; | ||
})); | ||
}; | ||
validate = (formData) => { | ||
const errors = {}; | ||
this.fields.forEach((field, fieldName) => { | ||
const formValue = formData.get(fieldName)?.toString(); | ||
if (formValue === undefined || formValue === "") { | ||
if (field.isRequired !== false) { | ||
errors[fieldName] = field.isRequired.error; | ||
} | ||
return; | ||
} | ||
let errorMessage = null; | ||
field.rules.every((rule) => { | ||
const valid = validate(rule, formValue, formData); | ||
if (!valid) { | ||
errorMessage = rule.error; | ||
} | ||
return valid; | ||
}); | ||
if (!errorMessage) | ||
return; | ||
errors[fieldName] = errorMessage; | ||
}); | ||
return Object.keys(errors).length > 0 | ||
? errors | ||
: null; | ||
}; | ||
} | ||
export const createForm = (...fieldNames) => { | ||
return new Form(...fieldNames.map((val) => new Field({ | ||
name: val, | ||
rules: [], | ||
isRequired: false, | ||
}, fieldNames))); | ||
}; | ||
export const parseForm = (serializedForm) => { | ||
return new Form(...Object.entries(serializedForm).map(([key, value]) => new Field({ | ||
name: key, | ||
rules: value, | ||
isRequired: false, | ||
}, []))); | ||
}; | ||
export { Form } from "./form.js"; |
{ | ||
"name": "adria-forms", | ||
"version": "0.2.0", | ||
"version": "0.2.1", | ||
"description": "A super simple form validation library", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
11
11346
184