@lytjs/plugin-form 6.4.0 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -424,4 +424,3 @@ var index_default = pluginForm;
424
424
  0 && (module.exports = {
425
425
  createFormManager
426
426
  });
427
- //# sourceMappingURL=index.cjs.map
@@ -399,4 +399,3 @@ export {
399
399
  createFormManager,
400
400
  index_default as default
401
401
  };
402
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,52 +1,52 @@
1
- {
2
- "name": "@lytjs/plugin-form",
3
- "version": "6.4.0",
4
- "description": "LytJS official form plugin for form state management, validation, and submission",
5
- "type": "module",
6
- "main": "./dist/index.cjs",
7
- "module": "./dist/index.mjs",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.mjs",
13
- "require": "./dist/index.cjs"
14
- },
15
- "./package.json": "./package.json"
16
- },
17
- "files": [
18
- "dist"
19
- ],
20
- "sideEffects": false,
21
- "scripts": {
22
- "build": "tsup",
23
- "dev": "tsup --watch",
24
- "test": "vitest run",
25
- "test:watch": "vitest",
26
- "test:coverage": "vitest run --coverage",
27
- "type-check": "tsc --noEmit",
28
- "lint": "eslint \"src/**/*.ts\"",
29
- "clean": "rm -rf dist"
30
- },
31
- "dependencies": {
32
- "@lytjs/core": "^6.4.0",
33
- "@lytjs/reactivity": "^6.4.0"
34
- },
35
- "devDependencies": {
36
- "tsup": "^8.0.0",
37
- "typescript": "^5.4.0",
38
- "vitest": "^3.0.0"
39
- },
40
- "license": "MIT",
41
- "repository": {
42
- "type": "git",
43
- "url": "https://gitee.com/lytjs/lytjs.git",
44
- "directory": "packages/plugins/packages/plugin-form"
45
- },
46
- "keywords": [
47
- "lytjs",
48
- "form",
49
- "validation",
50
- "form-state"
51
- ]
52
- }
1
+ {
2
+ "name": "@lytjs/plugin-form",
3
+ "version": "6.5.0",
4
+ "description": "LytJS official form plugin for form state management, validation, and submission",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "sideEffects": false,
21
+ "scripts": {
22
+ "build": "tsup",
23
+ "dev": "tsup --watch",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "test:coverage": "vitest run --coverage",
27
+ "type-check": "tsc --noEmit",
28
+ "lint": "eslint \"src/**/*.ts\"",
29
+ "clean": "rm -rf dist"
30
+ },
31
+ "dependencies": {
32
+ "@lytjs/core": "workspace:*",
33
+ "@lytjs/reactivity": "workspace:*"
34
+ },
35
+ "devDependencies": {
36
+ "tsup": "^8.0.0",
37
+ "typescript": "^5.4.0",
38
+ "vitest": "^3.0.0"
39
+ },
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://gitee.com/lytjs/lytjs.git",
44
+ "directory": "packages/plugins/packages/plugin-form"
45
+ },
46
+ "keywords": [
47
+ "lytjs",
48
+ "form",
49
+ "validation",
50
+ "form-state"
51
+ ]
52
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * @lytjs/plugin-form\r\n *\r\n * LytJS official form plugin for form state management, validation, and submission.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport { signal, signalComputed as computed } from '@lytjs/reactivity';\r\nimport type {\r\n FormOptions,\r\n FormInstance,\r\n FormState,\r\n FieldState,\r\n FieldConfig,\r\n FieldValidationRule,\r\n} from './types';\r\nimport type { ComputedSignal } from '@lytjs/reactivity';\r\n\r\nconst defaultMessages: Record<string, string> = {\r\n required: '此字段为必填项',\r\n email: '请输入有效的邮箱地址',\r\n phone: '请输入有效的手机号码',\r\n number: '请输入数字',\r\n min: '值不能小于 {min}',\r\n max: '值不能大于 {max}',\r\n minLength: '长度不能小于 {minLength}',\r\n maxLength: '长度不能大于 {maxLength}',\r\n pattern: '格式不正确',\r\n custom: '校验失败',\r\n};\r\n\r\nfunction validateRequired(value: unknown): boolean {\r\n if (value == null) return false;\r\n if (typeof value === 'string') return value.trim() !== '';\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === 'object' && value !== null) {\r\n return Object.keys(value).length > 0;\r\n }\r\n return true;\r\n}\r\n\r\nfunction validateEmail(value: unknown): boolean {\r\n if (!value) return true;\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(String(value));\r\n}\r\n\r\nfunction validatePhone(value: unknown): boolean {\r\n if (!value) return true;\r\n const phoneRegex = /^1[3-9]\\d{9}$/;\r\n return phoneRegex.test(String(value));\r\n}\r\n\r\nfunction validateNumber(value: unknown): boolean {\r\n if (value == null || value === '') return true;\r\n return !isNaN(Number(value));\r\n}\r\n\r\nfunction validateMin(value: unknown, min: number): boolean {\r\n if (value == null || value === '') return true;\r\n return Number(value) >= min;\r\n}\r\n\r\nfunction validateMax(value: unknown, max: number): boolean {\r\n if (value == null || value === '') return true;\r\n return Number(value) <= max;\r\n}\r\n\r\nfunction validateMinLength(value: unknown, minLength: number): boolean {\r\n if (value == null || value === '') return true;\r\n const str = String(value);\r\n return str.length >= minLength;\r\n}\r\n\r\nfunction validateMaxLength(value: unknown, maxLength: number): boolean {\r\n if (value == null || value === '') return true;\r\n const str = String(value);\r\n return str.length <= maxLength;\r\n}\r\n\r\nfunction validatePattern(value: unknown, pattern: RegExp | string): boolean {\r\n if (value == null || value === '') return true;\r\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\r\n return regex.test(String(value));\r\n}\r\n\r\nasync function validateFieldValue(\r\n name: string,\r\n value: unknown,\r\n rules: FieldValidationRule[],\r\n allValues: Record<string, unknown>,\r\n): Promise<string[]> {\r\n const errors: string[] = [];\r\n\r\n for (const rule of rules) {\r\n let isValid = true;\r\n\r\n switch (rule.type) {\r\n case 'required':\r\n isValid = validateRequired(value);\r\n break;\r\n case 'email':\r\n isValid = validateEmail(value);\r\n break;\r\n case 'phone':\r\n isValid = validatePhone(value);\r\n break;\r\n case 'number':\r\n isValid = validateNumber(value);\r\n break;\r\n case 'min':\r\n isValid = validateMin(value, rule.value as number);\r\n break;\r\n case 'max':\r\n isValid = validateMax(value, rule.value as number);\r\n break;\r\n case 'minLength':\r\n isValid = validateMinLength(value, rule.value as number);\r\n break;\r\n case 'maxLength':\r\n isValid = validateMaxLength(value, rule.value as number);\r\n break;\r\n case 'pattern':\r\n isValid = validatePattern(value, rule.value as RegExp | string);\r\n break;\r\n case 'custom':\r\n if (rule.validator) {\r\n isValid = await rule.validator(value, allValues);\r\n }\r\n break;\r\n }\r\n\r\n if (!isValid) {\r\n let message = rule.message || defaultMessages[rule.type];\r\n if (rule.type === 'min' && rule.value != null) {\r\n message = message.replace('{min}', String(rule.value));\r\n }\r\n if (rule.type === 'max' && rule.value != null) {\r\n message = message.replace('{max}', String(rule.value));\r\n }\r\n if (rule.type === 'minLength' && rule.value != null) {\r\n message = message.replace('{minLength}', String(rule.value));\r\n }\r\n if (rule.type === 'maxLength' && rule.value != null) {\r\n message = message.replace('{maxLength}', String(rule.value));\r\n }\r\n errors.push(message);\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nfunction createFormManager(options: FormOptions = {}): FormInstance {\r\n const {\r\n fields = {},\r\n initialValues = {},\r\n validateOnSubmit = true,\r\n validateOnChange = false,\r\n validateOnBlur = false,\r\n } = options;\r\n\r\n const fieldConfigs = new Map<string, FieldConfig>();\r\n const initialFieldValues = new Map<string, unknown>();\r\n const fieldStates = new Map<string, ReturnType<typeof createFieldState>>();\r\n const isSubmittingSignal = signal<boolean>(false);\r\n const isValidatingSignal = signal<boolean>(false);\r\n\r\n function createFieldState(name: string, config: FieldConfig = {}) {\r\n const initialValue = config.initialValue ?? initialValues[name];\r\n initialFieldValues.set(name, initialValue);\r\n const valueSignal = signal<unknown>(initialValue);\r\n const errorsSignal = signal<string[]>([]);\r\n const touchedSignal = signal<boolean>(false);\r\n const disabledSignal = signal<boolean>(config.disabled ?? false);\r\n const readOnlySignal = signal<boolean>(config.readOnly ?? false);\r\n const validatingSignal = signal<boolean>(false);\r\n const validSignal: ComputedSignal<boolean> = computed<boolean>(() => errorsSignal().length === 0);\r\n\r\n return {\r\n get value() {\r\n return valueSignal();\r\n },\r\n set value(val: unknown) {\r\n valueSignal.set(val);\r\n },\r\n get errors() {\r\n return errorsSignal();\r\n },\r\n set errors(errs: string[]) {\r\n errorsSignal.set(errs);\r\n },\r\n get touched() {\r\n return touchedSignal();\r\n },\r\n set touched(val: boolean) {\r\n touchedSignal.set(val);\r\n },\r\n get disabled() {\r\n return disabledSignal();\r\n },\r\n set disabled(val: boolean) {\r\n disabledSignal.set(val);\r\n },\r\n get readOnly() {\r\n return readOnlySignal();\r\n },\r\n set readOnly(val: boolean) {\r\n readOnlySignal.set(val);\r\n },\r\n get validating() {\r\n return validatingSignal();\r\n },\r\n set validating(val: boolean) {\r\n validatingSignal.set(val);\r\n },\r\n get valid() {\r\n return validSignal();\r\n },\r\n valueSignal,\r\n errorsSignal,\r\n touchedSignal,\r\n disabledSignal,\r\n readOnlySignal,\r\n validatingSignal,\r\n };\r\n }\r\n\r\n function registerField(name: string, config: FieldConfig = {}) {\r\n fieldConfigs.set(name, config);\r\n if (!fieldStates.has(name)) {\r\n fieldStates.set(name, createFieldState(name, config));\r\n }\r\n }\r\n\r\n function unregisterField(name: string) {\r\n fieldConfigs.delete(name);\r\n fieldStates.delete(name);\r\n }\r\n\r\n function initialize() {\r\n for (const [name, config] of Object.entries(fields)) {\r\n registerField(name, config);\r\n }\r\n }\r\n\r\n const stateSignal: ComputedSignal<FormState> = computed<FormState>(() => {\r\n const fieldsState: Record<string, FieldState> = {};\r\n let isTouched = false;\r\n let hasDirty = false;\r\n let isValid = true;\r\n\r\n for (const [name, fieldState] of fieldStates) {\r\n const initialValue = initialFieldValues.get(name);\r\n fieldsState[name] = {\r\n value: fieldState.value,\r\n errors: fieldState.errors,\r\n touched: fieldState.touched,\r\n disabled: fieldState.disabled,\r\n readOnly: fieldState.readOnly,\r\n validating: fieldState.validating,\r\n valid: fieldState.valid,\r\n };\r\n\r\n if (fieldState.touched) isTouched = true;\r\n if (fieldState.value !== initialValue) hasDirty = true;\r\n if (!fieldState.valid) isValid = false;\r\n }\r\n\r\n return {\r\n fields: fieldsState,\r\n isSubmitting: isSubmittingSignal(),\r\n isValid,\r\n isTouched,\r\n isValidating: isValidatingSignal(),\r\n isDirty: hasDirty,\r\n };\r\n });\r\n\r\n function getValue(name: string): unknown {\r\n const fieldState = fieldStates.get(name);\r\n return fieldState?.value;\r\n }\r\n\r\n function setValue(name: string, value: unknown) {\r\n const fieldState = fieldStates.get(name);\r\n if (!fieldState) return;\r\n fieldState.value = value;\r\n\r\n if (validateOnChange) {\r\n validateField(name).catch(() => {});\r\n }\r\n }\r\n\r\n function getValues(): Record<string, unknown> {\r\n const values: Record<string, unknown> = {};\r\n for (const [name, fieldState] of fieldStates) {\r\n values[name] = fieldState.value;\r\n }\r\n return values;\r\n }\r\n\r\n function setValues(values: Record<string, unknown>) {\r\n for (const [name, value] of Object.entries(values)) {\r\n setValue(name, value);\r\n }\r\n }\r\n\r\n function getErrors(name: string): string[] {\r\n const fieldState = fieldStates.get(name);\r\n return fieldState?.errors ?? [];\r\n }\r\n\r\n function setErrors(name: string, errors: string[]) {\r\n const fieldState = fieldStates.get(name);\r\n if (fieldState) {\r\n fieldState.errors = errors;\r\n }\r\n }\r\n\r\n function touchField(name: string) {\r\n const fieldState = fieldStates.get(name);\r\n if (fieldState) {\r\n fieldState.touched = true;\r\n if (validateOnBlur) {\r\n validateField(name).catch(() => {});\r\n }\r\n }\r\n }\r\n\r\n function touchAllFields() {\r\n for (const [, fieldState] of fieldStates) {\r\n fieldState.touched = true;\r\n }\r\n }\r\n\r\n function reset() {\r\n for (const [, fieldState] of fieldStates) {\r\n fieldState.errors = [];\r\n fieldState.touched = false;\r\n }\r\n }\r\n\r\n function resetToInitial() {\r\n for (const [name, fieldState] of fieldStates) {\r\n const initialValue = initialFieldValues.get(name);\r\n fieldState.value = initialValue;\r\n fieldState.errors = [];\r\n fieldState.touched = false;\r\n }\r\n }\r\n\r\n async function validateField(name: string): Promise<boolean> {\r\n const fieldState = fieldStates.get(name);\r\n const config = fieldConfigs.get(name);\r\n if (!fieldState || !config?.rules) return true;\r\n\r\n fieldState.validating = true;\r\n const errors = await validateFieldValue(name, fieldState.value, config.rules, getValues());\r\n fieldState.errors = errors;\r\n fieldState.validating = false;\r\n return errors.length === 0;\r\n }\r\n\r\n async function validate(): Promise<boolean> {\r\n isValidatingSignal.set(true);\r\n\r\n let allValid = true;\r\n for (const name of fieldStates.keys()) {\r\n const valid = await validateField(name);\r\n if (!valid) allValid = false;\r\n }\r\n\r\n isValidatingSignal.set(false);\r\n return allValid;\r\n }\r\n\r\n async function submit(callback?: (values: Record<string, unknown>) => void | Promise<void>): Promise<boolean> {\r\n isSubmittingSignal.set(true);\r\n\r\n try {\r\n let isValid = true;\r\n if (validateOnSubmit) {\r\n isValid = await validate();\r\n }\r\n\r\n if (isValid && callback) {\r\n await callback(getValues());\r\n }\r\n\r\n return isValid;\r\n } finally {\r\n isSubmittingSignal.set(false);\r\n }\r\n }\r\n\r\n function setFieldDisabled(name: string, disabled: boolean) {\r\n const fieldState = fieldStates.get(name);\r\n if (fieldState) {\r\n fieldState.disabled = disabled;\r\n }\r\n }\r\n\r\n function setFieldReadOnly(name: string, readOnly: boolean) {\r\n const fieldState = fieldStates.get(name);\r\n if (fieldState) {\r\n fieldState.readOnly = readOnly;\r\n }\r\n }\r\n\r\n function getFieldConfig(name: string): FieldConfig | undefined {\r\n return fieldConfigs.get(name);\r\n }\r\n\r\n initialize();\r\n\r\n return {\r\n get state() {\r\n return stateSignal();\r\n },\r\n getValue,\r\n setValue,\r\n getValues,\r\n setValues,\r\n getErrors,\r\n setErrors,\r\n touchField,\r\n touchAllFields,\r\n reset,\r\n resetToInitial,\r\n validateField,\r\n validate,\r\n submit,\r\n setFieldDisabled,\r\n setFieldReadOnly,\r\n getFieldConfig,\r\n registerField,\r\n unregisterField,\r\n };\r\n}\r\n\r\nconst pluginForm = definePlugin({\r\n name: 'form',\r\n version: '6.0.0',\r\n description: 'LytJS official form plugin for form state management, validation, and submission',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'form', 'validation', 'form-state'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n fields: { type: 'object', default: {} },\r\n initialValues: { type: 'object', default: {} },\r\n validateOnSubmit: { type: 'boolean', default: true },\r\n validateOnChange: { type: 'boolean', default: false },\r\n validateOnBlur: { type: 'boolean', default: false },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const formManager = createFormManager(options as FormOptions);\r\n\r\n app.config.globalProperties.$form = formManager;\r\n\r\n app.provide('lyt-form', formManager);\r\n },\r\n});\r\n\r\nexport default pluginForm;\r\nexport type {\r\n FormOptions,\r\n FormInstance,\r\n FormState,\r\n FieldState,\r\n FieldConfig,\r\n FieldValidationRule,\r\n};\r\nexport { createFormManager };\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,kBAA6B;AAC7B,wBAAmD;AAWnD,IAAM,kBAA0C;AAAA,EAC9C,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,SAAS,iBAAiB,OAAyB;AACjD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,MAAM;AACvD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO,OAAO,KAAK,KAAK,EAAE,SAAS;AAAA,EACrC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAyB;AAC9C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa;AACnB,SAAO,WAAW,KAAK,OAAO,KAAK,CAAC;AACtC;AAEA,SAAS,cAAc,OAAyB;AAC9C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa;AACnB,SAAO,WAAW,KAAK,OAAO,KAAK,CAAC;AACtC;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,SAAO,CAAC,MAAM,OAAO,KAAK,CAAC;AAC7B;AAEA,SAAS,YAAY,OAAgB,KAAsB;AACzD,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,SAAO,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,YAAY,OAAgB,KAAsB;AACzD,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,SAAO,OAAO,KAAK,KAAK;AAC1B;AAEA,SAAS,kBAAkB,OAAgB,WAA4B;AACrE,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,MAAM,OAAO,KAAK;AACxB,SAAO,IAAI,UAAU;AACvB;AAEA,SAAS,kBAAkB,OAAgB,WAA4B;AACrE,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,MAAM,OAAO,KAAK;AACxB,SAAO,IAAI,UAAU;AACvB;AAEA,SAAS,gBAAgB,OAAgB,SAAmC;AAC1E,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,QAAM,QAAQ,OAAO,YAAY,WAAW,IAAI,OAAO,OAAO,IAAI;AAClE,SAAO,MAAM,KAAK,OAAO,KAAK,CAAC;AACjC;AAEA,eAAe,mBACb,MACA,OACA,OACA,WACmB;AACnB,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,QAAI,UAAU;AAEd,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,kBAAU,iBAAiB,KAAK;AAChC;AAAA,MACF,KAAK;AACH,kBAAU,cAAc,KAAK;AAC7B;AAAA,MACF,KAAK;AACH,kBAAU,cAAc,KAAK;AAC7B;AAAA,MACF,KAAK;AACH,kBAAU,eAAe,KAAK;AAC9B;AAAA,MACF,KAAK;AACH,kBAAU,YAAY,OAAO,KAAK,KAAe;AACjD;AAAA,MACF,KAAK;AACH,kBAAU,YAAY,OAAO,KAAK,KAAe;AACjD;AAAA,MACF,KAAK;AACH,kBAAU,kBAAkB,OAAO,KAAK,KAAe;AACvD;AAAA,MACF,KAAK;AACH,kBAAU,kBAAkB,OAAO,KAAK,KAAe;AACvD;AAAA,MACF,KAAK;AACH,kBAAU,gBAAgB,OAAO,KAAK,KAAwB;AAC9D;AAAA,MACF,KAAK;AACH,YAAI,KAAK,WAAW;AAClB,oBAAU,MAAM,KAAK,UAAU,OAAO,SAAS;AAAA,QACjD;AACA;AAAA,IACJ;AAEA,QAAI,CAAC,SAAS;AACZ,UAAI,UAAU,KAAK,WAAW,gBAAgB,KAAK,IAAI;AACvD,UAAI,KAAK,SAAS,SAAS,KAAK,SAAS,MAAM;AAC7C,kBAAU,QAAQ,QAAQ,SAAS,OAAO,KAAK,KAAK,CAAC;AAAA,MACvD;AACA,UAAI,KAAK,SAAS,SAAS,KAAK,SAAS,MAAM;AAC7C,kBAAU,QAAQ,QAAQ,SAAS,OAAO,KAAK,KAAK,CAAC;AAAA,MACvD;AACA,UAAI,KAAK,SAAS,eAAe,KAAK,SAAS,MAAM;AACnD,kBAAU,QAAQ,QAAQ,eAAe,OAAO,KAAK,KAAK,CAAC;AAAA,MAC7D;AACA,UAAI,KAAK,SAAS,eAAe,KAAK,SAAS,MAAM;AACnD,kBAAU,QAAQ,QAAQ,eAAe,OAAO,KAAK,KAAK,CAAC;AAAA,MAC7D;AACA,aAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAuB,CAAC,GAAiB;AAClE,QAAM;AAAA,IACJ,SAAS,CAAC;AAAA,IACV,gBAAgB,CAAC;AAAA,IACjB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,EACnB,IAAI;AAEJ,QAAM,eAAe,oBAAI,IAAyB;AAClD,QAAM,qBAAqB,oBAAI,IAAqB;AACpD,QAAM,cAAc,oBAAI,IAAiD;AACzE,QAAM,yBAAqB,0BAAgB,KAAK;AAChD,QAAM,yBAAqB,0BAAgB,KAAK;AAEhD,WAAS,iBAAiB,MAAc,SAAsB,CAAC,GAAG;AAChE,UAAM,eAAe,OAAO,gBAAgB,cAAc,IAAI;AAC9D,uBAAmB,IAAI,MAAM,YAAY;AACzC,UAAM,kBAAc,0BAAgB,YAAY;AAChD,UAAM,mBAAe,0BAAiB,CAAC,CAAC;AACxC,UAAM,oBAAgB,0BAAgB,KAAK;AAC3C,UAAM,qBAAiB,0BAAgB,OAAO,YAAY,KAAK;AAC/D,UAAM,qBAAiB,0BAAgB,OAAO,YAAY,KAAK;AAC/D,UAAM,uBAAmB,0BAAgB,KAAK;AAC9C,UAAM,kBAAuC,kBAAAA,gBAAkB,MAAM,aAAa,EAAE,WAAW,CAAC;AAEhG,WAAO;AAAA,MACL,IAAI,QAAQ;AACV,eAAO,YAAY;AAAA,MACrB;AAAA,MACA,IAAI,MAAM,KAAc;AACtB,oBAAY,IAAI,GAAG;AAAA,MACrB;AAAA,MACA,IAAI,SAAS;AACX,eAAO,aAAa;AAAA,MACtB;AAAA,MACA,IAAI,OAAO,MAAgB;AACzB,qBAAa,IAAI,IAAI;AAAA,MACvB;AAAA,MACA,IAAI,UAAU;AACZ,eAAO,cAAc;AAAA,MACvB;AAAA,MACA,IAAI,QAAQ,KAAc;AACxB,sBAAc,IAAI,GAAG;AAAA,MACvB;AAAA,MACA,IAAI,WAAW;AACb,eAAO,eAAe;AAAA,MACxB;AAAA,MACA,IAAI,SAAS,KAAc;AACzB,uBAAe,IAAI,GAAG;AAAA,MACxB;AAAA,MACA,IAAI,WAAW;AACb,eAAO,eAAe;AAAA,MACxB;AAAA,MACA,IAAI,SAAS,KAAc;AACzB,uBAAe,IAAI,GAAG;AAAA,MACxB;AAAA,MACA,IAAI,aAAa;AACf,eAAO,iBAAiB;AAAA,MAC1B;AAAA,MACA,IAAI,WAAW,KAAc;AAC3B,yBAAiB,IAAI,GAAG;AAAA,MAC1B;AAAA,MACA,IAAI,QAAQ;AACV,eAAO,YAAY;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,cAAc,MAAc,SAAsB,CAAC,GAAG;AAC7D,iBAAa,IAAI,MAAM,MAAM;AAC7B,QAAI,CAAC,YAAY,IAAI,IAAI,GAAG;AAC1B,kBAAY,IAAI,MAAM,iBAAiB,MAAM,MAAM,CAAC;AAAA,IACtD;AAAA,EACF;AAEA,WAAS,gBAAgB,MAAc;AACrC,iBAAa,OAAO,IAAI;AACxB,gBAAY,OAAO,IAAI;AAAA,EACzB;AAEA,WAAS,aAAa;AACpB,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACnD,oBAAc,MAAM,MAAM;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,kBAAyC,kBAAAA,gBAAoB,MAAM;AACvE,UAAM,cAA0C,CAAC;AACjD,QAAI,YAAY;AAChB,QAAI,WAAW;AACf,QAAI,UAAU;AAEd,eAAW,CAAC,MAAM,UAAU,KAAK,aAAa;AAC5C,YAAM,eAAe,mBAAmB,IAAI,IAAI;AAChD,kBAAY,IAAI,IAAI;AAAA,QAClB,OAAO,WAAW;AAAA,QAClB,QAAQ,WAAW;AAAA,QACnB,SAAS,WAAW;AAAA,QACpB,UAAU,WAAW;AAAA,QACrB,UAAU,WAAW;AAAA,QACrB,YAAY,WAAW;AAAA,QACvB,OAAO,WAAW;AAAA,MACpB;AAEA,UAAI,WAAW,QAAS,aAAY;AACpC,UAAI,WAAW,UAAU,aAAc,YAAW;AAClD,UAAI,CAAC,WAAW,MAAO,WAAU;AAAA,IACnC;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,cAAc,mBAAmB;AAAA,MACjC;AAAA,MACA;AAAA,MACA,cAAc,mBAAmB;AAAA,MACjC,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,WAAS,SAAS,MAAuB;AACvC,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,WAAO,YAAY;AAAA,EACrB;AAEA,WAAS,SAAS,MAAc,OAAgB;AAC9C,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,QAAI,CAAC,WAAY;AACjB,eAAW,QAAQ;AAEnB,QAAI,kBAAkB;AACpB,oBAAc,IAAI,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,WAAS,YAAqC;AAC5C,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,MAAM,UAAU,KAAK,aAAa;AAC5C,aAAO,IAAI,IAAI,WAAW;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAEA,WAAS,UAAU,QAAiC;AAClD,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,eAAS,MAAM,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,WAAS,UAAU,MAAwB;AACzC,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,WAAO,YAAY,UAAU,CAAC;AAAA,EAChC;AAEA,WAAS,UAAU,MAAc,QAAkB;AACjD,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,QAAI,YAAY;AACd,iBAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAEA,WAAS,WAAW,MAAc;AAChC,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,QAAI,YAAY;AACd,iBAAW,UAAU;AACrB,UAAI,gBAAgB;AAClB,sBAAc,IAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,WAAS,iBAAiB;AACxB,eAAW,CAAC,EAAE,UAAU,KAAK,aAAa;AACxC,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,WAAS,QAAQ;AACf,eAAW,CAAC,EAAE,UAAU,KAAK,aAAa;AACxC,iBAAW,SAAS,CAAC;AACrB,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,WAAS,iBAAiB;AACxB,eAAW,CAAC,MAAM,UAAU,KAAK,aAAa;AAC5C,YAAM,eAAe,mBAAmB,IAAI,IAAI;AAChD,iBAAW,QAAQ;AACnB,iBAAW,SAAS,CAAC;AACrB,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,iBAAe,cAAc,MAAgC;AAC3D,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,UAAM,SAAS,aAAa,IAAI,IAAI;AACpC,QAAI,CAAC,cAAc,CAAC,QAAQ,MAAO,QAAO;AAE1C,eAAW,aAAa;AACxB,UAAM,SAAS,MAAM,mBAAmB,MAAM,WAAW,OAAO,OAAO,OAAO,UAAU,CAAC;AACzF,eAAW,SAAS;AACpB,eAAW,aAAa;AACxB,WAAO,OAAO,WAAW;AAAA,EAC3B;AAEA,iBAAe,WAA6B;AAC1C,uBAAmB,IAAI,IAAI;AAE3B,QAAI,WAAW;AACf,eAAW,QAAQ,YAAY,KAAK,GAAG;AACrC,YAAM,QAAQ,MAAM,cAAc,IAAI;AACtC,UAAI,CAAC,MAAO,YAAW;AAAA,IACzB;AAEA,uBAAmB,IAAI,KAAK;AAC5B,WAAO;AAAA,EACT;AAEA,iBAAe,OAAO,UAAwF;AAC5G,uBAAmB,IAAI,IAAI;AAE3B,QAAI;AACF,UAAI,UAAU;AACd,UAAI,kBAAkB;AACpB,kBAAU,MAAM,SAAS;AAAA,MAC3B;AAEA,UAAI,WAAW,UAAU;AACvB,cAAM,SAAS,UAAU,CAAC;AAAA,MAC5B;AAEA,aAAO;AAAA,IACT,UAAE;AACA,yBAAmB,IAAI,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,WAAS,iBAAiB,MAAc,UAAmB;AACzD,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,QAAI,YAAY;AACd,iBAAW,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,WAAS,iBAAiB,MAAc,UAAmB;AACzD,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,QAAI,YAAY;AACd,iBAAW,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,WAAS,eAAe,MAAuC;AAC7D,WAAO,aAAa,IAAI,IAAI;AAAA,EAC9B;AAEA,aAAW;AAEX,SAAO;AAAA,IACL,IAAI,QAAQ;AACV,aAAO,YAAY;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,iBAAa,0BAAa;AAAA,EAC9B,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU,CAAC,SAAS,QAAQ,cAAc,YAAY;AAAA,EACtD,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE;AAAA,QACtC,eAAe,EAAE,MAAM,UAAU,SAAS,CAAC,EAAE;AAAA,QAC7C,kBAAkB,EAAE,MAAM,WAAW,SAAS,KAAK;AAAA,QACnD,kBAAkB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,QACpD,gBAAgB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ,KAAK,SAAS;AACpB,UAAM,cAAc,kBAAkB,OAAsB;AAE5D,QAAI,OAAO,iBAAiB,QAAQ;AAEpC,QAAI,QAAQ,YAAY,WAAW;AAAA,EACrC;AACF,CAAC;AAED,IAAO,gBAAQ;","names":["computed"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * @lytjs/plugin-form\r\n *\r\n * LytJS official form plugin for form state management, validation, and submission.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport { signal, signalComputed as computed } from '@lytjs/reactivity';\r\nimport type {\r\n FormOptions,\r\n FormInstance,\r\n FormState,\r\n FieldState,\r\n FieldConfig,\r\n FieldValidationRule,\r\n} from './types';\r\nimport type { ComputedSignal } from '@lytjs/reactivity';\r\n\r\nconst defaultMessages: Record<string, string> = {\r\n required: '此字段为必填项',\r\n email: '请输入有效的邮箱地址',\r\n phone: '请输入有效的手机号码',\r\n number: '请输入数字',\r\n min: '值不能小于 {min}',\r\n max: '值不能大于 {max}',\r\n minLength: '长度不能小于 {minLength}',\r\n maxLength: '长度不能大于 {maxLength}',\r\n pattern: '格式不正确',\r\n custom: '校验失败',\r\n};\r\n\r\nfunction validateRequired(value: unknown): boolean {\r\n if (value == null) return false;\r\n if (typeof value === 'string') return value.trim() !== '';\r\n if (Array.isArray(value)) return value.length > 0;\r\n if (typeof value === 'object' && value !== null) {\r\n return Object.keys(value).length > 0;\r\n }\r\n return true;\r\n}\r\n\r\nfunction validateEmail(value: unknown): boolean {\r\n if (!value) return true;\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(String(value));\r\n}\r\n\r\nfunction validatePhone(value: unknown): boolean {\r\n if (!value) return true;\r\n const phoneRegex = /^1[3-9]\\d{9}$/;\r\n return phoneRegex.test(String(value));\r\n}\r\n\r\nfunction validateNumber(value: unknown): boolean {\r\n if (value == null || value === '') return true;\r\n return !isNaN(Number(value));\r\n}\r\n\r\nfunction validateMin(value: unknown, min: number): boolean {\r\n if (value == null || value === '') return true;\r\n return Number(value) >= min;\r\n}\r\n\r\nfunction validateMax(value: unknown, max: number): boolean {\r\n if (value == null || value === '') return true;\r\n return Number(value) <= max;\r\n}\r\n\r\nfunction validateMinLength(value: unknown, minLength: number): boolean {\r\n if (value == null || value === '') return true;\r\n const str = String(value);\r\n return str.length >= minLength;\r\n}\r\n\r\nfunction validateMaxLength(value: unknown, maxLength: number): boolean {\r\n if (value == null || value === '') return true;\r\n const str = String(value);\r\n return str.length <= maxLength;\r\n}\r\n\r\nfunction validatePattern(value: unknown, pattern: RegExp | string): boolean {\r\n if (value == null || value === '') return true;\r\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\r\n return regex.test(String(value));\r\n}\r\n\r\nasync function validateFieldValue(\r\n name: string,\r\n value: unknown,\r\n rules: FieldValidationRule[],\r\n allValues: Record<string, unknown>,\r\n): Promise<string[]> {\r\n const errors: string[] = [];\r\n\r\n for (const rule of rules) {\r\n let isValid = true;\r\n\r\n switch (rule.type) {\r\n case 'required':\r\n isValid = validateRequired(value);\r\n break;\r\n case 'email':\r\n isValid = validateEmail(value);\r\n break;\r\n case 'phone':\r\n isValid = validatePhone(value);\r\n break;\r\n case 'number':\r\n isValid = validateNumber(value);\r\n break;\r\n case 'min':\r\n isValid = validateMin(value, rule.value as number);\r\n break;\r\n case 'max':\r\n isValid = validateMax(value, rule.value as number);\r\n break;\r\n case 'minLength':\r\n isValid = validateMinLength(value, rule.value as number);\r\n break;\r\n case 'maxLength':\r\n isValid = validateMaxLength(value, rule.value as number);\r\n break;\r\n case 'pattern':\r\n isValid = validatePattern(value, rule.value as RegExp | string);\r\n break;\r\n case 'custom':\r\n if (rule.validator) {\r\n isValid = await rule.validator(value, allValues);\r\n }\r\n break;\r\n }\r\n\r\n if (!isValid) {\r\n let message = rule.message || defaultMessages[rule.type];\r\n if (rule.type === 'min' && rule.value != null) {\r\n message = message.replace('{min}', String(rule.value));\r\n }\r\n if (rule.type === 'max' && rule.value != null) {\r\n message = message.replace('{max}', String(rule.value));\r\n }\r\n if (rule.type === 'minLength' && rule.value != null) {\r\n message = message.replace('{minLength}', String(rule.value));\r\n }\r\n if (rule.type === 'maxLength' && rule.value != null) {\r\n message = message.replace('{maxLength}', String(rule.value));\r\n }\r\n errors.push(message);\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nfunction createFormManager(options: FormOptions = {}): FormInstance {\r\n const {\r\n fields = {},\r\n initialValues = {},\r\n validateOnSubmit = true,\r\n validateOnChange = false,\r\n validateOnBlur = false,\r\n } = options;\r\n\r\n const fieldConfigs = new Map<string, FieldConfig>();\r\n const initialFieldValues = new Map<string, unknown>();\r\n const fieldStates = new Map<string, ReturnType<typeof createFieldState>>();\r\n const isSubmittingSignal = signal<boolean>(false);\r\n const isValidatingSignal = signal<boolean>(false);\r\n\r\n function createFieldState(name: string, config: FieldConfig = {}) {\r\n const initialValue = config.initialValue ?? initialValues[name];\r\n initialFieldValues.set(name, initialValue);\r\n const valueSignal = signal<unknown>(initialValue);\r\n const errorsSignal = signal<string[]>([]);\r\n const touchedSignal = signal<boolean>(false);\r\n const disabledSignal = signal<boolean>(config.disabled ?? false);\r\n const readOnlySignal = signal<boolean>(config.readOnly ?? false);\r\n const validatingSignal = signal<boolean>(false);\r\n const validSignal: ComputedSignal<boolean> = computed<boolean>(() => errorsSignal().length === 0);\r\n\r\n return {\r\n get value() {\r\n return valueSignal();\r\n },\r\n set value(val: unknown) {\r\n valueSignal.set(val);\r\n },\r\n get errors() {\r\n return errorsSignal();\r\n },\r\n set errors(errs: string[]) {\r\n errorsSignal.set(errs);\r\n },\r\n get touched() {\r\n return touchedSignal();\r\n },\r\n set touched(val: boolean) {\r\n touchedSignal.set(val);\r\n },\r\n get disabled() {\r\n return disabledSignal();\r\n },\r\n set disabled(val: boolean) {\r\n disabledSignal.set(val);\r\n },\r\n get readOnly() {\r\n return readOnlySignal();\r\n },\r\n set readOnly(val: boolean) {\r\n readOnlySignal.set(val);\r\n },\r\n get validating() {\r\n return validatingSignal();\r\n },\r\n set validating(val: boolean) {\r\n validatingSignal.set(val);\r\n },\r\n get valid() {\r\n return validSignal();\r\n },\r\n valueSignal,\r\n errorsSignal,\r\n touchedSignal,\r\n disabledSignal,\r\n readOnlySignal,\r\n validatingSignal,\r\n };\r\n }\r\n\r\n function registerField(name: string, config: FieldConfig = {}) {\r\n fieldConfigs.set(name, config);\r\n if (!fieldStates.has(name)) {\r\n fieldStates.set(name, createFieldState(name, config));\r\n }\r\n }\r\n\r\n function unregisterField(name: string) {\r\n fieldConfigs.delete(name);\r\n fieldStates.delete(name);\r\n }\r\n\r\n function initialize() {\r\n for (const [name, config] of Object.entries(fields)) {\r\n registerField(name, config);\r\n }\r\n }\r\n\r\n const stateSignal: ComputedSignal<FormState> = computed<FormState>(() => {\r\n const fieldsState: Record<string, FieldState> = {};\r\n let isTouched = false;\r\n let hasDirty = false;\r\n let isValid = true;\r\n\r\n for (const [name, fieldState] of fieldStates) {\r\n const initialValue = initialFieldValues.get(name);\r\n fieldsState[name] = {\r\n value: fieldState.value,\r\n errors: fieldState.errors,\r\n touched: fieldState.touched,\r\n disabled: fieldState.disabled,\r\n readOnly: fieldState.readOnly,\r\n validating: fieldState.validating,\r\n valid: fieldState.valid,\r\n };\r\n\r\n if (fieldState.touched) isTouched = true;\r\n if (fieldState.value !== initialValue) hasDirty = true;\r\n if (!fieldState.valid) isValid = false;\r\n }\r\n\r\n return {\r\n fields: fieldsState,\r\n isSubmitting: isSubmittingSignal(),\r\n isValid,\r\n isTouched,\r\n isValidating: isValidatingSignal(),\r\n isDirty: hasDirty,\r\n };\r\n });\r\n\r\n function getValue(name: string): unknown {\r\n const fieldState = fieldStates.get(name);\r\n return fieldState?.value;\r\n }\r\n\r\n function setValue(name: string, value: unknown) {\r\n const fieldState = fieldStates.get(name);\r\n if (!fieldState) return;\r\n fieldState.value = value;\r\n\r\n if (validateOnChange) {\r\n validateField(name).catch(() => {});\r\n }\r\n }\r\n\r\n function getValues(): Record<string, unknown> {\r\n const values: Record<string, unknown> = {};\r\n for (const [name, fieldState] of fieldStates) {\r\n values[name] = fieldState.value;\r\n }\r\n return values;\r\n }\r\n\r\n function setValues(values: Record<string, unknown>) {\r\n for (const [name, value] of Object.entries(values)) {\r\n setValue(name, value);\r\n }\r\n }\r\n\r\n function getErrors(name: string): string[] {\r\n const fieldState = fieldStates.get(name);\r\n return fieldState?.errors ?? [];\r\n }\r\n\r\n function setErrors(name: string, errors: string[]) {\r\n const fieldState = fieldStates.get(name);\r\n if (fieldState) {\r\n fieldState.errors = errors;\r\n }\r\n }\r\n\r\n function touchField(name: string) {\r\n const fieldState = fieldStates.get(name);\r\n if (fieldState) {\r\n fieldState.touched = true;\r\n if (validateOnBlur) {\r\n validateField(name).catch(() => {});\r\n }\r\n }\r\n }\r\n\r\n function touchAllFields() {\r\n for (const [, fieldState] of fieldStates) {\r\n fieldState.touched = true;\r\n }\r\n }\r\n\r\n function reset() {\r\n for (const [, fieldState] of fieldStates) {\r\n fieldState.errors = [];\r\n fieldState.touched = false;\r\n }\r\n }\r\n\r\n function resetToInitial() {\r\n for (const [name, fieldState] of fieldStates) {\r\n const initialValue = initialFieldValues.get(name);\r\n fieldState.value = initialValue;\r\n fieldState.errors = [];\r\n fieldState.touched = false;\r\n }\r\n }\r\n\r\n async function validateField(name: string): Promise<boolean> {\r\n const fieldState = fieldStates.get(name);\r\n const config = fieldConfigs.get(name);\r\n if (!fieldState || !config?.rules) return true;\r\n\r\n fieldState.validating = true;\r\n const errors = await validateFieldValue(name, fieldState.value, config.rules, getValues());\r\n fieldState.errors = errors;\r\n fieldState.validating = false;\r\n return errors.length === 0;\r\n }\r\n\r\n async function validate(): Promise<boolean> {\r\n isValidatingSignal.set(true);\r\n\r\n let allValid = true;\r\n for (const name of fieldStates.keys()) {\r\n const valid = await validateField(name);\r\n if (!valid) allValid = false;\r\n }\r\n\r\n isValidatingSignal.set(false);\r\n return allValid;\r\n }\r\n\r\n async function submit(callback?: (values: Record<string, unknown>) => void | Promise<void>): Promise<boolean> {\r\n isSubmittingSignal.set(true);\r\n\r\n try {\r\n let isValid = true;\r\n if (validateOnSubmit) {\r\n isValid = await validate();\r\n }\r\n\r\n if (isValid && callback) {\r\n await callback(getValues());\r\n }\r\n\r\n return isValid;\r\n } finally {\r\n isSubmittingSignal.set(false);\r\n }\r\n }\r\n\r\n function setFieldDisabled(name: string, disabled: boolean) {\r\n const fieldState = fieldStates.get(name);\r\n if (fieldState) {\r\n fieldState.disabled = disabled;\r\n }\r\n }\r\n\r\n function setFieldReadOnly(name: string, readOnly: boolean) {\r\n const fieldState = fieldStates.get(name);\r\n if (fieldState) {\r\n fieldState.readOnly = readOnly;\r\n }\r\n }\r\n\r\n function getFieldConfig(name: string): FieldConfig | undefined {\r\n return fieldConfigs.get(name);\r\n }\r\n\r\n initialize();\r\n\r\n return {\r\n get state() {\r\n return stateSignal();\r\n },\r\n getValue,\r\n setValue,\r\n getValues,\r\n setValues,\r\n getErrors,\r\n setErrors,\r\n touchField,\r\n touchAllFields,\r\n reset,\r\n resetToInitial,\r\n validateField,\r\n validate,\r\n submit,\r\n setFieldDisabled,\r\n setFieldReadOnly,\r\n getFieldConfig,\r\n registerField,\r\n unregisterField,\r\n };\r\n}\r\n\r\nconst pluginForm = definePlugin({\r\n name: 'form',\r\n version: '6.0.0',\r\n description: 'LytJS official form plugin for form state management, validation, and submission',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'form', 'validation', 'form-state'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n fields: { type: 'object', default: {} },\r\n initialValues: { type: 'object', default: {} },\r\n validateOnSubmit: { type: 'boolean', default: true },\r\n validateOnChange: { type: 'boolean', default: false },\r\n validateOnBlur: { type: 'boolean', default: false },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const formManager = createFormManager(options as FormOptions);\r\n\r\n app.config.globalProperties.$form = formManager;\r\n\r\n app.provide('lyt-form', formManager);\r\n },\r\n});\r\n\r\nexport default pluginForm;\r\nexport type {\r\n FormOptions,\r\n FormInstance,\r\n FormState,\r\n FieldState,\r\n FieldConfig,\r\n FieldValidationRule,\r\n};\r\nexport { createFormManager };\r\n"],"mappings":"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","names":[]}