@lytjs/plugin-form 6.4.0 → 6.6.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
@@ -163,7 +163,9 @@ function createFormManager(options = {}) {
163
163
  const disabledSignal = (0, import_reactivity.signal)(config.disabled ?? false);
164
164
  const readOnlySignal = (0, import_reactivity.signal)(config.readOnly ?? false);
165
165
  const validatingSignal = (0, import_reactivity.signal)(false);
166
- const validSignal = (0, import_reactivity.signalComputed)(() => errorsSignal().length === 0);
166
+ const validSignal = (0, import_reactivity.signalComputed)(
167
+ () => errorsSignal().length === 0
168
+ );
167
169
  return {
168
170
  get value() {
169
171
  return valueSignal();
@@ -415,8 +417,12 @@ var pluginForm = (0, import_core.definePlugin)({
415
417
  },
416
418
  install(app, options) {
417
419
  const formManager = createFormManager(options);
418
- app.config.globalProperties.$form = formManager;
419
- app.provide("lyt-form", formManager);
420
+ if (app.config?.globalProperties) {
421
+ app.config.globalProperties.$form = formManager;
422
+ }
423
+ if (app.provide) {
424
+ app.provide("lyt-form", formManager);
425
+ }
420
426
  }
421
427
  });
422
428
  var index_default = pluginForm;
@@ -424,4 +430,3 @@ var index_default = pluginForm;
424
430
  0 && (module.exports = {
425
431
  createFormManager
426
432
  });
427
- //# sourceMappingURL=index.cjs.map
@@ -138,7 +138,9 @@ function createFormManager(options = {}) {
138
138
  const disabledSignal = signal(config.disabled ?? false);
139
139
  const readOnlySignal = signal(config.readOnly ?? false);
140
140
  const validatingSignal = signal(false);
141
- const validSignal = computed(() => errorsSignal().length === 0);
141
+ const validSignal = computed(
142
+ () => errorsSignal().length === 0
143
+ );
142
144
  return {
143
145
  get value() {
144
146
  return valueSignal();
@@ -390,8 +392,12 @@ var pluginForm = definePlugin({
390
392
  },
391
393
  install(app, options) {
392
394
  const formManager = createFormManager(options);
393
- app.config.globalProperties.$form = formManager;
394
- app.provide("lyt-form", formManager);
395
+ if (app.config?.globalProperties) {
396
+ app.config.globalProperties.$form = formManager;
397
+ }
398
+ if (app.provide) {
399
+ app.provide("lyt-form", formManager);
400
+ }
395
401
  }
396
402
  });
397
403
  var index_default = pluginForm;
@@ -399,4 +405,3 @@ export {
399
405
  createFormManager,
400
406
  index_default as default
401
407
  };
402
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lytjs/plugin-form",
3
- "version": "6.4.0",
3
+ "version": "6.6.0",
4
4
  "description": "LytJS official form plugin for form state management, validation, and submission",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -29,8 +29,8 @@
29
29
  "clean": "rm -rf dist"
30
30
  },
31
31
  "dependencies": {
32
- "@lytjs/core": "^6.4.0",
33
- "@lytjs/reactivity": "^6.4.0"
32
+ "@lytjs/core": "workspace:*",
33
+ "@lytjs/reactivity": "workspace:*"
34
34
  },
35
35
  "devDependencies": {
36
36
  "tsup": "^8.0.0",
@@ -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":["computed"]}
package/dist/index.d.cts DELETED
@@ -1,118 +0,0 @@
1
- import * as _lytjs_core from '@lytjs/core';
2
-
3
- /**
4
- * @lytjs/plugin-form - 类型定义
5
- */
6
- interface FieldValidationRule {
7
- /** 校验类型 */
8
- type: 'required' | 'email' | 'phone' | 'number' | 'min' | 'max' | 'minLength' | 'maxLength' | 'pattern' | 'custom';
9
- /** 错误消息 */
10
- message?: string;
11
- /** 校验值(如 min/max 值等) */
12
- value?: unknown;
13
- /** 自定义校验函数 */
14
- validator?: (value: unknown, allValues: Record<string, unknown>) => boolean | Promise<boolean>;
15
- }
16
- interface FieldConfig {
17
- /** 字段初始值 */
18
- initialValue?: unknown;
19
- /** 校验规则 */
20
- rules?: FieldValidationRule[];
21
- /** 字段标签 */
22
- label?: string;
23
- /** 字段是否禁用 */
24
- disabled?: boolean;
25
- /** 字段是否只读 */
26
- readOnly?: boolean;
27
- }
28
- interface FormConfig {
29
- /** 字段配置 */
30
- fields?: Record<string, FieldConfig>;
31
- /** 初始值 */
32
- initialValues?: Record<string, unknown>;
33
- /** 是否在提交时校验 */
34
- validateOnSubmit?: boolean;
35
- /** 是否在字段变化时校验 */
36
- validateOnChange?: boolean;
37
- /** 是否在字段失焦时校验 */
38
- validateOnBlur?: boolean;
39
- }
40
- interface FieldState {
41
- /** 字段值 */
42
- value: unknown;
43
- /** 字段错误 */
44
- errors: string[];
45
- /** 字段是否被触碰过 */
46
- touched: boolean;
47
- /** 字段是否禁用 */
48
- disabled: boolean;
49
- /** 字段是否只读 */
50
- readOnly: boolean;
51
- /** 字段是否正在校验中 */
52
- validating: boolean;
53
- /** 字段是否校验通过 */
54
- valid: boolean;
55
- }
56
- interface FormState {
57
- /** 所有字段状态 */
58
- fields: Record<string, FieldState>;
59
- /** 表单是否正在提交 */
60
- isSubmitting: boolean;
61
- /** 表单是否有效 */
62
- isValid: boolean;
63
- /** 表单是否被触碰过 */
64
- isTouched: boolean;
65
- /** 表单是否正在校验 */
66
- isValidating: boolean;
67
- /** 表单是否被修改过 */
68
- isDirty: boolean;
69
- }
70
- interface FormInstance {
71
- /** 表单当前状态 */
72
- readonly state: FormState;
73
- /** 获取字段值 */
74
- getValue: (name: string) => unknown;
75
- /** 设置字段值 */
76
- setValue: (name: string, value: unknown) => void;
77
- /** 获取所有值 */
78
- getValues: () => Record<string, unknown>;
79
- /** 设置多个字段值 */
80
- setValues: (values: Record<string, unknown>) => void;
81
- /** 获取字段错误 */
82
- getErrors: (name: string) => string[];
83
- /** 设置字段错误 */
84
- setErrors: (name: string, errors: string[]) => void;
85
- /** 标记字段为已触碰 */
86
- touchField: (name: string) => void;
87
- /** 触碰所有字段 */
88
- touchAllFields: () => void;
89
- /** 重置表单 */
90
- reset: () => void;
91
- /** 重置为初始值 */
92
- resetToInitial: () => void;
93
- /** 校验单个字段 */
94
- validateField: (name: string) => Promise<boolean>;
95
- /** 校验整个表单 */
96
- validate: () => Promise<boolean>;
97
- /** 提交表单 */
98
- submit: (callback?: (values: Record<string, unknown>) => void | Promise<void>) => Promise<boolean>;
99
- /** 设置字段禁用状态 */
100
- setFieldDisabled: (name: string, disabled: boolean) => void;
101
- /** 设置字段只读状态 */
102
- setFieldReadOnly: (name: string, readOnly: boolean) => void;
103
- /** 获取字段配置 */
104
- getFieldConfig: (name: string) => FieldConfig | undefined;
105
- /** 注册新字段 */
106
- registerField: (name: string, config?: FieldConfig) => void;
107
- /** 注销字段 */
108
- unregisterField: (name: string) => void;
109
- }
110
- interface FormOptions extends FormConfig {
111
- /** 插件名称 */
112
- name?: string;
113
- }
114
-
115
- declare function createFormManager(options?: FormOptions): FormInstance;
116
- declare const pluginForm: _lytjs_core.PluginDefinition<unknown>;
117
-
118
- export { type FieldConfig, type FieldState, type FieldValidationRule, type FormInstance, type FormOptions, type FormState, createFormManager, pluginForm as default };
package/dist/index.d.ts DELETED
@@ -1,118 +0,0 @@
1
- import * as _lytjs_core from '@lytjs/core';
2
-
3
- /**
4
- * @lytjs/plugin-form - 类型定义
5
- */
6
- interface FieldValidationRule {
7
- /** 校验类型 */
8
- type: 'required' | 'email' | 'phone' | 'number' | 'min' | 'max' | 'minLength' | 'maxLength' | 'pattern' | 'custom';
9
- /** 错误消息 */
10
- message?: string;
11
- /** 校验值(如 min/max 值等) */
12
- value?: unknown;
13
- /** 自定义校验函数 */
14
- validator?: (value: unknown, allValues: Record<string, unknown>) => boolean | Promise<boolean>;
15
- }
16
- interface FieldConfig {
17
- /** 字段初始值 */
18
- initialValue?: unknown;
19
- /** 校验规则 */
20
- rules?: FieldValidationRule[];
21
- /** 字段标签 */
22
- label?: string;
23
- /** 字段是否禁用 */
24
- disabled?: boolean;
25
- /** 字段是否只读 */
26
- readOnly?: boolean;
27
- }
28
- interface FormConfig {
29
- /** 字段配置 */
30
- fields?: Record<string, FieldConfig>;
31
- /** 初始值 */
32
- initialValues?: Record<string, unknown>;
33
- /** 是否在提交时校验 */
34
- validateOnSubmit?: boolean;
35
- /** 是否在字段变化时校验 */
36
- validateOnChange?: boolean;
37
- /** 是否在字段失焦时校验 */
38
- validateOnBlur?: boolean;
39
- }
40
- interface FieldState {
41
- /** 字段值 */
42
- value: unknown;
43
- /** 字段错误 */
44
- errors: string[];
45
- /** 字段是否被触碰过 */
46
- touched: boolean;
47
- /** 字段是否禁用 */
48
- disabled: boolean;
49
- /** 字段是否只读 */
50
- readOnly: boolean;
51
- /** 字段是否正在校验中 */
52
- validating: boolean;
53
- /** 字段是否校验通过 */
54
- valid: boolean;
55
- }
56
- interface FormState {
57
- /** 所有字段状态 */
58
- fields: Record<string, FieldState>;
59
- /** 表单是否正在提交 */
60
- isSubmitting: boolean;
61
- /** 表单是否有效 */
62
- isValid: boolean;
63
- /** 表单是否被触碰过 */
64
- isTouched: boolean;
65
- /** 表单是否正在校验 */
66
- isValidating: boolean;
67
- /** 表单是否被修改过 */
68
- isDirty: boolean;
69
- }
70
- interface FormInstance {
71
- /** 表单当前状态 */
72
- readonly state: FormState;
73
- /** 获取字段值 */
74
- getValue: (name: string) => unknown;
75
- /** 设置字段值 */
76
- setValue: (name: string, value: unknown) => void;
77
- /** 获取所有值 */
78
- getValues: () => Record<string, unknown>;
79
- /** 设置多个字段值 */
80
- setValues: (values: Record<string, unknown>) => void;
81
- /** 获取字段错误 */
82
- getErrors: (name: string) => string[];
83
- /** 设置字段错误 */
84
- setErrors: (name: string, errors: string[]) => void;
85
- /** 标记字段为已触碰 */
86
- touchField: (name: string) => void;
87
- /** 触碰所有字段 */
88
- touchAllFields: () => void;
89
- /** 重置表单 */
90
- reset: () => void;
91
- /** 重置为初始值 */
92
- resetToInitial: () => void;
93
- /** 校验单个字段 */
94
- validateField: (name: string) => Promise<boolean>;
95
- /** 校验整个表单 */
96
- validate: () => Promise<boolean>;
97
- /** 提交表单 */
98
- submit: (callback?: (values: Record<string, unknown>) => void | Promise<void>) => Promise<boolean>;
99
- /** 设置字段禁用状态 */
100
- setFieldDisabled: (name: string, disabled: boolean) => void;
101
- /** 设置字段只读状态 */
102
- setFieldReadOnly: (name: string, readOnly: boolean) => void;
103
- /** 获取字段配置 */
104
- getFieldConfig: (name: string) => FieldConfig | undefined;
105
- /** 注册新字段 */
106
- registerField: (name: string, config?: FieldConfig) => void;
107
- /** 注销字段 */
108
- unregisterField: (name: string) => void;
109
- }
110
- interface FormOptions extends FormConfig {
111
- /** 插件名称 */
112
- name?: string;
113
- }
114
-
115
- declare function createFormManager(options?: FormOptions): FormInstance;
116
- declare const pluginForm: _lytjs_core.PluginDefinition<unknown>;
117
-
118
- export { type FieldConfig, type FieldState, type FieldValidationRule, type FormInstance, type FormOptions, type FormState, createFormManager, pluginForm as default };
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":[]}