@flowgram.ai/form 0.2.21 → 0.2.23
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/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -1033,7 +1033,7 @@ var FieldArrayModel = class extends FieldModel {
|
|
|
1033
1033
|
const p1 = f1.path.value;
|
|
1034
1034
|
const p2 = f2.path.value;
|
|
1035
1035
|
const i1 = parseInt(p1[p1.length - 1]);
|
|
1036
|
-
const i2 = parseInt(
|
|
1036
|
+
const i2 = parseInt(p2[p2.length - 1]);
|
|
1037
1037
|
return i1 - i2;
|
|
1038
1038
|
});
|
|
1039
1039
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/react/field.tsx","../src/utils/object.ts","../src/utils/dom.ts","../src/utils/glob.ts","../src/types/validate.ts","../src/core/utils.ts","../src/core/path.ts","../src/core/to-field.ts","../src/core/to-form.ts","../src/react/utils.ts","../src/react/context.ts","../src/react/form.tsx","../src/core/to-field-array.ts","../src/core/form-model.ts","../src/utils/validate.ts","../src/constants.ts","../src/core/store.ts","../src/core/field-model.ts","../src/core/field-array-model.ts","../src/core/create-form.ts","../src/react/use-form.ts","../src/react/use-watch.ts","../src/react/field-array.tsx","../src/react/use-field.ts","../src/react/use-form-state.ts","../src/react/use-field-validate.ts","../src/react/use-current-field.ts","../src/react/use-current-field-state.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './react';\nexport type {\n FormRenderProps,\n FieldRenderProps,\n FieldArrayRenderProps,\n FieldState,\n FormState,\n Validate,\n FormControl,\n FieldName,\n FieldError,\n FieldWarning,\n FormValidateReturn,\n FieldValue,\n FieldArray as IFieldArray,\n Field as IField,\n Form as IForm,\n Errors,\n Warnings,\n} from './types';\n\nexport { ValidateTrigger, FeedbackLevel } from './types';\nexport { createForm, type CreateFormOptions } from './core/create-form';\nexport { Glob } from './utils';\nexport * from './core';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport * as React from 'react';\n\nimport { isFunction } from 'lodash';\nimport { DisposableCollection, useRefresh } from '@flowgram.ai/utils';\nimport { useReadonlyReactiveState } from '@flowgram.ai/reactive';\n\nimport { toField, toFieldState } from 'src/core/to-field';\nimport { FieldModelState, FieldName, FieldOptions, FieldRenderProps } from '../types/field';\nimport { FormModelState } from '../types';\nimport { toFormState } from '../core/to-form';\nimport { useFormModel } from './utils';\nimport { FieldModelContext } from './context';\n\nexport type FieldProps<TValue> = FieldOptions<TValue> & {\n /**\n * A React element or a render prop\n */\n children?: ((props: FieldRenderProps<TValue>) => React.ReactElement) | React.ReactElement;\n /**\n * Dependencies of the current field. If a field name is given in deps, current field will re-render if the given field name data is updated\n */\n deps?: FieldName[];\n};\n\n/**\n * HOC That declare a field, an Field model will be created it's rendered. Multiple Field rendering with a same name will link to the same model, which means they shared data、 status and methods\n */\nexport function Field<TValue>({\n name,\n defaultValue,\n render,\n children,\n deps,\n}: FieldProps<TValue>): React.ReactElement {\n const formModel = useFormModel();\n\n const fieldModel = formModel.getField(name) || formModel.createField(name);\n const field = React.useMemo(() => toField<TValue>(fieldModel), [fieldModel]);\n\n const fieldModelState = useReadonlyReactiveState<FieldModelState>(fieldModel.reactiveState);\n const formModelState = useReadonlyReactiveState<FormModelState>(formModel.reactiveState);\n\n const fieldState = React.useMemo(() => toFieldState(fieldModelState), [fieldModelState]);\n const formState = toFormState(formModelState);\n\n const refresh = useRefresh();\n\n React.useEffect(() => {\n fieldModel.renderCount = fieldModel.renderCount + 1;\n\n if (!formModel.getValueIn(name) !== undefined && defaultValue !== undefined) {\n formModel.setInitValueIn(name, defaultValue);\n refresh();\n }\n\n const disposableCollection = new DisposableCollection();\n\n disposableCollection.push(\n fieldModel.onValueChange(() => {\n refresh();\n })\n );\n\n if (deps) {\n deps.forEach((dep) => {\n const disposable = formModel.getField(dep)?.onValueChange(() => {\n refresh();\n });\n if (disposable) {\n disposableCollection.push(disposable);\n }\n });\n }\n return () => {\n disposableCollection.dispose();\n\n if (fieldModel.renderCount > 1) {\n fieldModel.renderCount = fieldModel.renderCount - 1;\n } else {\n const newFieldModel = formModel.getField(fieldModel.name);\n if (newFieldModel === fieldModel) fieldModel.dispose();\n }\n };\n }, [fieldModel]);\n\n const renderInner = () => {\n if (render) {\n return render({ field, fieldState, formState });\n }\n\n if (isFunction(children)) {\n return children({ field, fieldState, formState });\n }\n\n return React.cloneElement(children as React.ReactElement, { ...field });\n };\n\n return (\n <FieldModelContext.Provider value={fieldModel}>{renderInner()}</FieldModelContext.Provider>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { clone, toPath } from 'lodash';\n\n/**\n * These functions are copied from Formik.\n * @see https://github.com/jaredpalmer/formik\n */\n\nexport const isEmptyArray = (value?: any) => Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: any): obj is Function => typeof obj === 'function';\n\n/** @private is the given object an Object? */\nexport const isObject = (obj: any): obj is Object => obj !== null && typeof obj === 'object';\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: any): boolean => String(Math.floor(Number(obj))) === obj;\n\n/** @private is the given object a string? */\nexport const isString = (obj: any): obj is string =>\n Object.prototype.toString.call(obj) === '[object String]';\n\n/** @private is the given object a NaN? */\n// eslint-disable-next-line no-self-compare\nexport const isNaN = (obj: any): boolean => obj !== obj;\n\n/** @private is the given object/value a promise? */\nexport const isPromise = (value: any): value is PromiseLike<any> =>\n isObject(value) && isFunction(value.then);\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(obj: any, key: string | string[], def?: any, p: number = 0) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = obj[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\n/**\n * Deeply set a value from in object via its path. If the value at `path`\n * has changed, return a shallow copy of obj with `value` set at `path`.\n * If `value` has not changed, return the original `obj`.\n *\n * Existing objects / arrays along `path` are also shallow copied. Sibling\n * objects along path retain the same internal js reference. Since new\n * objects / arrays are only created along `path`, we can test if anything\n * changed in a nested structure by comparing the object's reference in\n * the old and new object, similar to how russian doll cache invalidation\n * works.\n */\nexport function shallowSetIn(obj: any, path: string, value: any): any {\n let res: any = clone(obj); // this keeps inheritance when obj is a class\n let resVal: any = res;\n let i = 0;\n let pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n let currentObj: any = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj);\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n /**\n * In Formik, they delete the key if the value is undefined. but here we keep the key with the undefined value.\n * The reason that Formik tackle in this way is to fix the issue https://github.com/jaredpalmer/formik/issues/727\n * Their fix is https://github.com/jaredpalmer/formik/issues/727, and we roll back to the code before this PR.\n */\n resVal[pathArray[i]] = value;\n return res;\n}\n\nexport function keepValidKeys(obj: Record<string, any>, validKeys: string[]) {\n const validKeysSet = new Set(validKeys);\n const newObj: Record<string, any> = {};\n Object.keys(obj).forEach((key) => {\n if (validKeysSet.has(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport function isReactChangeEvent(e: unknown): e is React.ChangeEvent<HTMLInputElement> {\n return (\n typeof e === 'object' &&\n e !== null &&\n 'target' in e &&\n typeof (e as React.ChangeEvent<any>).target === 'object'\n );\n}\n\nexport function isCheckBoxEvent(e: unknown): e is React.ChangeEvent<HTMLInputElement> {\n return (\n typeof e === 'object' &&\n e !== null &&\n 'target' in e &&\n typeof (e as React.ChangeEvent<HTMLInputElement>).target === 'object' &&\n (e as React.ChangeEvent<HTMLInputElement>).target.type === 'checkbox'\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { flatten, get, isArray, isObject } from 'lodash';\n\nexport namespace Glob {\n export const DIVIDER = '.';\n export const ALL = '*';\n\n // 仅支持一个通配符\n export function isMatch(pattern: string, path: string) {\n const patternArr = pattern.split(DIVIDER);\n const pathArr = path.split(DIVIDER);\n if (patternArr.length !== pathArr.length) {\n return false;\n }\n return patternArr.every((pattern, index) => {\n if (pattern === ALL) {\n return true;\n }\n return pattern === pathArr[index];\n });\n }\n\n /**\n * 判断pattern 是否match pattern 或其parent\n * @param pattern\n * @param path\n */\n export function isMatchOrParent(pattern: string, path: string) {\n if (pattern === '') {\n return true;\n }\n const patternArr = pattern.split(DIVIDER);\n const pathArr = path.split(DIVIDER);\n\n if (patternArr.length > pathArr.length) {\n return false;\n }\n\n for (let i = 0; i < patternArr.length; i++) {\n if (patternArr[i] !== ALL && patternArr[i] !== pathArr[i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 从 path 中提取出匹配pattern 的 parent path,包括是 path 自身\n * 该方法默认 isMatchOrParent(pattern, path) 为 true, 不做为false 的错误处理。\n * @param pattern\n * @param path\n */\n export function getParentPathByPattern(pattern: string, path: string) {\n const patternArr = pattern.split(DIVIDER);\n const pathArr = path.split(DIVIDER);\n\n return pathArr.slice(0, patternArr.length).join(DIVIDER);\n }\n\n function concatPath(p1: string | number, ...pathArr: (string | number)[]): string {\n const p2 = pathArr.shift();\n if (p2 === undefined) return p1.toString();\n let resultPath = '';\n if (p1 === '' && p2 === '') {\n resultPath = '';\n } else if (p1 !== '' && p2 === '') {\n resultPath = p1.toString();\n } else if (p1 === '' && p2 !== '') {\n resultPath = p2.toString();\n } else {\n resultPath = `${p1}${DIVIDER}${p2}`;\n }\n if (pathArr.length > 0) {\n return concatPath(resultPath, ...pathArr);\n }\n return resultPath;\n }\n\n /**\n * 找到 obj 在给与 paths 下所有子path\n * @param paths\n * @param obj\n * @private\n */\n export function getSubPaths(paths: string[], obj: any): string[] {\n if (!obj || typeof obj !== 'object') {\n return [];\n }\n\n return flatten(\n paths.map((path) => {\n const value = path === '' ? obj : get(obj, path);\n if (isArray(value)) {\n return value.map((_: any, index: number) => concatPath(path, index));\n } else if (isObject(value)) {\n return Object.keys(value).map((key) => concatPath(path, key));\n }\n return [];\n })\n );\n }\n\n /**\n * 将带有通配符的 path pattern 分割。如 a.b.*.c.*.d, 会被分割成['a.b','*','c','*','d']\n * @param pattern\n * @private\n */\n export function splitPattern(pattern: string): string[] {\n const parts = pattern.split(DIVIDER);\n const res: string[] = [];\n\n let i = 0;\n let curPath: string[] = [];\n\n while (i < parts.length) {\n if (parts[i] === ALL) {\n if (curPath.length) {\n res.push(curPath.join(DIVIDER));\n }\n res.push(ALL);\n curPath = [];\n } else {\n curPath.push(parts[i]);\n }\n i += 1;\n }\n if (curPath.length) {\n res.push(curPath.join(DIVIDER));\n }\n return res;\n }\n\n /**\n * Find all paths matched pattern in object. If withEmptyValue is true, it will include\n * paths whoes value is undefined.\n * @param obj\n * @param pattern\n * @param withEmptyValue\n */\n\n export function findMatchPaths(obj: any, pattern: string, withEmptyValue?: boolean): string[] {\n if (!obj || !pattern) {\n return [];\n }\n const nextPaths: string[] = pattern.split(DIVIDER);\n let curKey: string | undefined = nextPaths.shift();\n let curPaths: string[] = [];\n let curValue = obj;\n while (curKey) {\n let isObject = typeof curValue === 'object' && curValue !== null;\n if (!isObject) return [];\n // 匹配 *\n if (curKey === ALL) {\n const parentPath = curPaths.join(DIVIDER);\n return flatten(\n Object.keys(curValue).map((key) => {\n if (nextPaths.length === 0) {\n return concatPath(parentPath, key);\n }\n return findMatchPaths(curValue[key], `${nextPaths.join(DIVIDER)}`, withEmptyValue).map(\n (p) => concatPath(parentPath, key, p)\n );\n })\n );\n }\n // 找不到对应 key 则不匹配\n if (!(curKey in curValue) && !withEmptyValue) {\n return [];\n }\n curValue = curValue[curKey!];\n curPaths.push(curKey);\n curKey = nextPaths.shift();\n }\n\n return [pattern];\n\n // const parts = splitPattern(pattern);\n //\n // let prePaths: string[] = [''];\n // let curPath: string = '';\n //\n // for (let i in parts) {\n // const part = parts[i];\n // if (part === ALL) {\n // prePaths = getSubPaths(\n // prePaths.map(p => concatPath(p, curPath)),\n // obj,\n // );\n // curPath = '';\n // } else {\n // curPath = part;\n //\n // /**\n // * 过滤掉后续path 值不存在的prePath\n // * 为什么: prePaths 是返回前一个通配符下所有的路径,但每个路径下的数据的field 可能不同\n // * 这会导致一些prePath 不存在后面所需的路径。如以下场景\n // * const obj = {\n // * a: { b: { c: 1 } },\n // * x: { y: { z: 2 } },\n // * };\n // * expect(Glob.findMatchPaths(obj, '*.y')).toEqual(['x.y']);\n // */\n //\n // prePaths = prePaths.filter(p => {\n // const preValue = p ? get(obj, p) : obj;\n // if (typeof preValue === 'object') {\n // return curPath in preValue;\n // }\n // return true;\n // });\n // }\n // }\n //\n // if (curPath) {\n // return prePaths.map(p => [p, curPath].join(DIVIDER));\n // }\n // return prePaths;\n }\n\n /**\n * Find all paths matched pattern in object, including paths whoes value is undefined.\n * @param obj\n * @param pattern\n */\n export function findMatchPathsWithEmptyValue(obj: any, pattern: string): string[] {\n if (!pattern.includes('*')) {\n return [pattern];\n }\n return findMatchPaths(obj, pattern, true);\n }\n\n // export function findMatchPathsWithEmptyValue(obj: any, pattern: string) {\n // const parts = splitPattern(pattern);\n //\n // let prePaths: string[] = [''];\n // let curPath: string = '';\n //\n // for (let i in parts) {\n // const part = parts[i];\n // if (part === ALL) {\n // prePaths = getSubPaths(\n // prePaths.map(p => concatPath(p, curPath)),\n // obj,\n // );\n // curPath = '';\n // } else {\n // curPath = part;\n //\n // /**\n // * 过滤掉后续path 值不存在的prePath\n // * 为什么: prePaths 是返回前一个通配符下所有的路径,但每个路径下的数据的field 可能不同\n // * 这会导致一些prePath 不存在后面所需的路径。如以下场景\n // * const obj = {\n // * a: { b: { c: 1 } },\n // * x: { y: { z: 2 } },\n // * };\n // * expect(Glob.findMatchPaths(obj, '*.y')).toEqual(['x.y']);\n // */\n //\n // // prePaths = prePaths.filter(p => {\n // // const preValue = p ? get(obj, p) : obj;\n // // if (typeof preValue === 'object') {\n // // return curPath in preValue;\n // // }\n // // return true;\n // // });\n // }\n // }\n //\n // if (curPath) {\n // return prePaths.map(p => [p, curPath].join(DIVIDER));\n // }\n // return prePaths;\n // }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { MaybePromise } from '@flowgram.ai/utils';\n\nimport { FieldName } from './field';\nimport { Context } from './common';\n\nexport enum FeedbackLevel {\n Error = 'error',\n Warning = 'warning',\n}\n\nexport interface Feedback<FeedbackLevel> {\n /**\n * The data path (or field path) that generate this feedback\n */\n name: string;\n /**\n * The type of the feedback\n */\n type?: string;\n /**\n * Feedback level\n */\n level: FeedbackLevel;\n /**\n * Feedback message\n */\n message: string | React.ReactNode;\n}\n\nexport type FieldError = Feedback<FeedbackLevel.Error>;\nexport type FieldWarning = Feedback<FeedbackLevel.Warning>;\n\nexport type FormErrorOptions = Omit<FieldError, 'name'>;\nexport type FormWarningOptions = Omit<FieldWarning, 'name'>;\nexport type FeedbackOptions<FeedbackLevel> = Omit<Feedback<FeedbackLevel>, 'name'>;\n\nexport type Validate<TFieldValue = any, TFormValues = any> = (props: {\n /**\n * Value of the data to validate\n */\n value: TFieldValue;\n /**\n * Complete form values\n */\n formValues: TFormValues;\n /**\n * The path of the data we are validating\n */\n name: FieldName;\n /**\n * The custom context set when init form\n */\n context: Context;\n}) =>\n | MaybePromise<string>\n | MaybePromise<FormErrorOptions>\n | MaybePromise<FormWarningOptions>\n | MaybePromise<undefined>;\n\nexport function isFieldError(f: Feedback<any>): f is FieldError {\n if (f.level === FeedbackLevel.Error) {\n return true;\n }\n return false;\n}\n\nexport function isFieldWarning(f: Feedback<any>): f is FieldWarning {\n if (f.level === FeedbackLevel.Warning) {\n return true;\n }\n return false;\n}\n\nexport type Errors = Record<FieldName, FieldError[]>;\nexport type Warnings = Record<FieldName, FieldWarning[]>;\n\nexport enum ValidateTrigger {\n onChange = 'onChange',\n onBlur = 'onBlur',\n}\n\nexport type FormValidateReturn = (FieldError | FieldWarning)[];\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { isEmpty, isEqual } from 'lodash';\n\nimport { Glob } from '../utils';\nimport { Errors, Feedback, OnFormValuesChangePayload, ValidateTrigger, Warnings } from '../types';\nimport { Path } from './path';\n\nexport function updateFeedbacksName(feedbacks: Feedback<any>[], name: string) {\n return (feedbacks || []).map((f) => ({\n ...f,\n name,\n }));\n}\n\nexport function mergeFeedbacks<T extends Errors | Warnings>(origin?: T, source?: T) {\n if (!source) {\n return origin;\n }\n if (!origin) {\n return { ...source };\n }\n const changed = Object.keys(source).some(\n (sourceKey) => !isEqual(origin[sourceKey], source[sourceKey])\n );\n\n if (changed) {\n return {\n ...origin,\n ...source,\n };\n }\n return origin;\n}\n\nexport function clearFeedbacks<T extends Errors | Warnings>(name: string, origin?: T) {\n if (!origin) {\n return origin;\n }\n if (name in origin) {\n delete origin[name];\n }\n return origin;\n}\n\nexport function shouldValidate(currentTrigger: ValidateTrigger, formTrigger?: ValidateTrigger) {\n return currentTrigger === formTrigger;\n}\n\nexport function getValidByErrors(errors: Errors | undefined) {\n return errors ? Object.keys(errors).every((name) => isEmpty(errors[name])) : true;\n}\n\nexport namespace FieldEventUtils {\n export function shouldTriggerFieldChangeEvent(\n payload: OnFormValuesChangePayload,\n fieldName: string\n ) {\n const { name: changedName, options } = payload;\n\n // 如果 Field 是 变更path 的 ancestor 则触发\n if (Glob.isMatchOrParent(fieldName, changedName)) {\n return true;\n }\n\n // 如果 Field 是 变更path 的 child 或 grandchild 有条件触发\n if (new Path(changedName).isChildOrGrandChild(fieldName)) {\n // 数组情况下部分子项不触发变更\n\n // 1. 数组 append 触发的FormValuesChange 不需要触发其子 Field 的 onValueChange\n if (options?.action === 'array-append') {\n return !new Path(changedName).isChildOrGrandChild(fieldName);\n }\n // 2. 数组 splice 触发的FormValuesChange 无需触发第一个删除项前的所有子 Field 的 onValueChange\n else if (options?.action === 'array-splice' && options?.indexes?.length) {\n return (\n (Path.compareArrayPath(\n new Path(fieldName),\n new Path(changedName).concat(options.indexes[0])\n ) as number) >= 0\n );\n }\n\n // 其余情况都需要触发\n return true;\n }\n return false;\n }\n\n export function shouldTriggerFieldValidateWhenChange(\n payload: OnFormValuesChangePayload,\n fieldName: string\n ) {\n const { name: changedName, options } = payload;\n\n if (options?.action === 'array-splice' || options?.action === 'array-swap') {\n // const splicedIndexes = options?.indexes || [];\n //\n // const splicedPaths = splicedIndexes.map(index => new Path(changedName).concat(index));\n // const removedPaths = Array.from({ length: splicedIndexes.length }, (_, i) =>\n // new Path(changedName).concat(prevValues[changedName].length - i - 1),\n // );\n //\n // const ignoredPathOrParentPaths = [...splicedPaths, ...removedPaths];\n // // const ignoredPathOrParentPaths = splicedPaths;\n // if (\n // ignoredPathOrParentPaths.some(\n // path => path.toString() === fieldName || path.isChildOrGrandChild(fieldName),\n // )\n // ) {\n // return false;\n // }\n\n // splice 和 swap 都属于数组跟级别的变更,仅需触发数组field的校验, 无需校验子项\n return fieldName === changedName;\n }\n\n return FieldEventUtils.shouldTriggerFieldChangeEvent(payload, fieldName);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { toPath } from 'lodash';\n\nexport class Path {\n protected _path: string[] = [];\n\n constructor(path: string | string[]) {\n this._path = toPath(path);\n }\n\n get parent(): Path | undefined {\n if (this._path.length < 2) {\n return undefined;\n }\n return new Path(this._path.slice(0, -1));\n }\n\n toString(): string {\n return this._path.join('.');\n }\n\n get value(): string[] {\n return this._path;\n }\n\n /**\n * 仅计直系child\n * @param path\n */\n isChild(path: string) {\n const target = new Path(path).value;\n const self = this.value;\n\n if (target.length - self.length !== 1) {\n return false;\n }\n\n for (let i = 0; i < self.length; i++) {\n if (target[i] !== self[i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 比较两个数组path大小\n * 返回小于0则path1<path2, 大于0 则path1>path2, 等于0则相等\n * @param path1\n * @param path2\n */\n static compareArrayPath(path1: Path, path2: Path): number | void {\n let i = 0;\n while (path1.value[i] && path2.value[i]) {\n const index1 = parseInt(path1.value[i]);\n const index2 = parseInt(path2.value[i]);\n\n if (!isNaN(index1) && !isNaN(index2)) {\n return index1 - index2;\n } else if (path1.value[i] !== path2.value[i]) {\n throw new Error(\n `[Form] Path.compareArrayPath invalid input Error: two path should refers to the same array, but got path1: ${path1.toString()}, path2: ${path2.toString()}`\n );\n }\n i++;\n }\n throw new Error(\n `[Form] Path.compareArrayPath invalid input Error: got path1: ${path1.toString()}, path2: ${path2.toString()}`\n );\n }\n\n isChildOrGrandChild(path: string) {\n const target = new Path(path).value;\n const self = this.value;\n\n if (target.length - self.length < 1) {\n return false;\n }\n\n for (let i = 0; i < self.length; i++) {\n if (target[i] !== self[i]) {\n return false;\n }\n }\n return true;\n }\n\n getArrayIndex(parent: Path) {\n return parseInt(this._path[parent.value.length]);\n }\n\n concat(name: number | string) {\n if (typeof name === 'string' || typeof name === 'number') {\n return new Path(this._path.concat(new Path(name.toString())._path));\n }\n throw new Error(\n `[Form] Error in Path.concat: invalid param type, require number or string, but got ${typeof name}`\n );\n }\n\n replaceParent(parent: Path, newParent: Path) {\n if (parent.value.length > this.value.length) {\n throw new Error(\n `[Form] Error in Path.replaceParent: invalid parent param: ${parent}, parent length should not greater than current length.`\n );\n }\n const rest = [];\n for (let i = 0; i < this.value.length; i++) {\n if (i < parent.value.length && parent.value[i] !== this.value[i]) {\n throw new Error(\n `[Form] Error in Path.replaceParent: invalid parent param: '${parent}' is not a parent of '${this.toString()}'`\n );\n }\n if (i >= parent.value.length) {\n rest.push(this.value[i]);\n }\n }\n\n return new Path(newParent.value.concat(rest));\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport * as React from 'react';\n\nimport { isCheckBoxEvent, isReactChangeEvent } from '../utils';\nimport { Field, FieldModelState } from '../types/field';\nimport { ValidateTrigger } from '../types';\nimport { shouldValidate } from './utils';\nimport { FieldModel } from './field-model';\n\nexport function toField<TValue>(model: FieldModel): Field<TValue> {\n const res: Field<TValue> = {\n get name() {\n return model.name;\n },\n get value() {\n return model.value;\n },\n onChange: (e: unknown) => {\n if (isReactChangeEvent(e)) {\n model.value = isCheckBoxEvent(e)\n ? e.target.checked\n : (e as React.ChangeEvent<HTMLInputElement>).target.value;\n } else {\n model.value = e;\n }\n },\n onBlur() {\n if (shouldValidate(ValidateTrigger.onBlur, model.form.validationTrigger)) {\n model.validate();\n }\n },\n onFocus() {\n model.state.isTouched = true;\n },\n } as Field<TValue>;\n\n Object.defineProperty(res, 'key', {\n enumerable: false,\n get() {\n return model.id;\n },\n });\n\n Object.defineProperty(res, '_fieldModel', {\n enumerable: false,\n get() {\n return model;\n },\n });\n return res;\n}\n\nexport function toFieldState(modelState: FieldModelState) {\n return {\n get isTouched() {\n return modelState.isTouched;\n },\n get invalid() {\n return modelState.invalid;\n },\n get isDirty() {\n return modelState.isDirty;\n },\n get isValidating() {\n return modelState.isValidating;\n },\n get errors() {\n if (modelState.errors) {\n return Object.values(modelState.errors).reduce((acc, arr) => acc.concat(arr), []);\n }\n return;\n },\n get warnings() {\n if (modelState.warnings) {\n return Object.values(modelState.warnings).reduce((acc, arr) => acc.concat(arr), []);\n }\n return;\n },\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Form, FormModelState, FormState } from '../types/form';\nimport { FieldName, FieldValue } from '../types/field';\nimport { FormModel } from './form-model';\n\nexport function toForm<TValue>(model: FormModel): Form<TValue> {\n const res = {\n initialValues: model.initialValues,\n get values() {\n return model.values;\n },\n set values(v) {\n model.values = v;\n },\n state: toFormState(model.state),\n getValueIn: <TValue = FieldValue>(name: FieldName) => model.getValueIn(name),\n setValueIn: <TValue>(name: FieldName, value: TValue) => model.setValueIn(name, value),\n validate: model.validate.bind(model),\n };\n\n Object.defineProperty(res, '_formModel', {\n enumerable: false,\n get() {\n return model;\n },\n });\n return res as Form<TValue>;\n}\n\nexport function toFormState(modelState: FormModelState): FormState {\n return {\n get isTouched() {\n return modelState.isTouched;\n },\n get invalid() {\n return modelState.invalid;\n },\n get isDirty() {\n return modelState.isDirty;\n },\n get isValidating() {\n return modelState.isValidating;\n },\n // get dirtyFields() {\n // return modelState.dirtyFields;\n // },\n // get isLoading() {\n // return modelState.isLoading;\n // },\n // get touchedFields() {\n // return modelState.touchedFields;\n // },\n get errors() {\n return modelState.errors;\n },\n get warnings() {\n return modelState.warnings;\n },\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext } from 'react';\n\nimport { FormModel } from '../core/form-model';\nimport { FormModelContext } from './context';\n\nexport function useFormModel(): FormModel {\n return useContext<FormModel>(FormModelContext);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nexport const FormModelContext = React.createContext<any>({});\nexport const FieldModelContext = React.createContext<any>({});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { Children, useEffect, useMemo } from 'react';\n\nimport { isFunction } from 'lodash';\n\nimport { toForm } from 'src/core/to-form';\nimport { FormControl, FormOptions, FormRenderProps } from '../types/form';\nimport { createForm } from '../core/create-form';\nimport { FormModelContext } from './context';\n\nexport type FormProps<TValues> = FormOptions & {\n /**\n * React children or child render prop\n */\n children?: ((props: FormRenderProps<TValues>) => React.ReactNode) | React.ReactNode;\n\n /**\n * If this prop is set to true, Form instance will be kept event thought<Form /> is destroyed.\n * This means you can still use some form's api such as Form.validate and Form.setValueIn to handle pure data logic.\n * @default false\n */\n keepModelOnUnMount?: boolean;\n\n /**\n * provide form instance from outside. if control is given Form will use the form instance in the control instead of creating one.\n */\n control?: FormControl<TValues>;\n};\n\n/**\n * Hoc That init and provide Form instance. You can also provide form instance from outside by using control prop\n * @param props\n */\nexport function Form<TValues>(props: FormProps<TValues>) {\n const { children, keepModelOnUnMount = false, control, ...restOptions } = props;\n const { _formModel: formModel } = useMemo(\n () => (control ? control : createForm(restOptions).control),\n [control]\n );\n\n useEffect(\n () => () => {\n // 组件销毁时,销毁formModel\n if (!keepModelOnUnMount) {\n formModel.dispose();\n }\n },\n []\n );\n\n const form = useMemo(() => toForm<TValues>(formModel), [formModel]);\n\n return (\n <FormModelContext.Provider value={formModel}>\n {children ? (isFunction(children) ? children({ form }) : Children.only(children)) : null}\n </FormModelContext.Provider>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Field, FieldArray } from '../types/field';\nimport { toField } from './to-field';\nimport { FieldArrayModel } from './field-array-model';\n\nexport function toFieldArray<TValue>(model: FieldArrayModel<TValue>): FieldArray<TValue> {\n const res: FieldArray<TValue> = {\n get key() {\n return model.id;\n },\n get name() {\n return model.path.toString();\n },\n get value() {\n return model.value;\n },\n onChange: (value) => {\n model.value = value;\n },\n map: <T = any>(cb: (f: Field<TValue>, index: number) => T) =>\n model.map<T>((f, index) => cb(toField(f), index)),\n append: (value) => toField<TValue>(model.append(value)),\n /**\n * @deprecated: use remove instead\n * @param index\n */\n delete: (index: number) => model.delete(index),\n remove: (index: number) => model.delete(index),\n swap: (from: number, to: number) => model.swap(from, to),\n move: (from: number, to: number) => model.move(from, to),\n } as FieldArray<TValue>;\n\n // Object.defineProperty(res, 'validate', {\n // enumerable: false,\n // get() {\n // return model.validate.bind(model);\n // },\n // });\n\n // 隐藏属性\n Object.defineProperty(res, '_fieldModel', {\n enumerable: false,\n get() {\n return model;\n },\n });\n return res;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { flatten, get } from 'lodash';\nimport { deepEqual } from 'fast-equals';\nimport { Disposable, Emitter } from '@flowgram.ai/utils';\nimport { ReactiveState } from '@flowgram.ai/reactive';\n\nimport { feedbackToFieldErrorsOrWarnings, hasError, toFeedback } from '../utils/validate';\nimport { Glob } from '../utils/glob';\nimport { keepValidKeys } from '../utils';\nimport {\n FormModelState,\n FormOptions,\n FormState,\n OnFormValuesChangePayload,\n OnFormValuesInitPayload,\n OnFormValuesUpdatedPayload,\n} from '../types/form';\nimport { FieldName, FieldValue } from '../types/field';\nimport { Errors, FeedbackLevel, FormValidateReturn, Warnings } from '../types';\nimport { createFormModelState } from '../constants';\nimport { getValidByErrors, mergeFeedbacks } from './utils';\nimport { Store } from './store';\nimport { Path } from './path';\nimport { FieldModel } from './field-model';\nimport { FieldArrayModel } from './field-array-model';\n\nexport class FormModel<TValues = any> implements Disposable {\n protected _fieldMap: Map<string, FieldModel> = new Map();\n\n readonly store = new Store();\n\n protected _options: FormOptions = {};\n\n protected onFieldModelCreateEmitter = new Emitter<FieldModel>();\n\n readonly onFieldModelCreate = this.onFieldModelCreateEmitter.event;\n\n readonly onFormValuesChangeEmitter = new Emitter<OnFormValuesChangePayload>();\n\n readonly onFormValuesChange = this.onFormValuesChangeEmitter.event;\n\n readonly onFormValuesInitEmitter = new Emitter<OnFormValuesInitPayload>();\n\n readonly onFormValuesInit = this.onFormValuesInitEmitter.event;\n\n readonly onFormValuesUpdatedEmitter = new Emitter<OnFormValuesUpdatedPayload>();\n\n readonly onFormValuesUpdated = this.onFormValuesUpdatedEmitter.event;\n\n readonly onValidateEmitter = new Emitter<FormModelState>();\n\n readonly onValidate = this.onValidateEmitter.event;\n\n protected _state: ReactiveState<FormModelState> = new ReactiveState<FormModelState>(\n createFormModelState()\n );\n\n protected _initialized = false;\n\n set fieldMap(map) {\n this._fieldMap = map;\n }\n\n /**\n * 表单初始值,初始化设置后不可修改\n * @protected\n */\n // protected _initialValues?: TValues;\n\n get fieldMap() {\n return this._fieldMap;\n }\n\n get context() {\n return this._options.context;\n }\n\n get initialValues() {\n return this._options.initialValues;\n }\n\n get values() {\n return this.store.values;\n }\n\n set values(v) {\n const prevValues = this.values;\n if (deepEqual(prevValues, v)) {\n return;\n }\n this.store.values = v;\n this.fireOnFormValuesChange({\n values: this.values,\n prevValues,\n name: '',\n });\n }\n\n get validationTrigger() {\n return this._options.validateTrigger;\n }\n\n get state() {\n return this._state.value;\n }\n\n get reactiveState() {\n return this._state;\n }\n\n get fields(): FieldModel[] {\n return Array.from(this.fieldMap.values());\n }\n\n updateState(state: Partial<FormState>) {\n // todo\n }\n\n get initialized() {\n return this._initialized;\n }\n\n fireOnFormValuesChange(payload: OnFormValuesChangePayload) {\n this.onFormValuesChangeEmitter.fire(payload);\n this.onFormValuesUpdatedEmitter.fire(payload);\n }\n\n fireOnFormValuesInit(payload: OnFormValuesInitPayload) {\n this.onFormValuesInitEmitter.fire(payload);\n this.onFormValuesUpdatedEmitter.fire(payload);\n }\n\n init(options: FormOptions<TValues>) {\n this._options = options;\n if (options.initialValues) {\n const prevValues = this.store.values;\n this.store.values = options.initialValues;\n this.fireOnFormValuesInit({\n values: options.initialValues,\n prevValues,\n name: '',\n });\n }\n this._initialized = true;\n }\n\n createField<TValue = FieldValue>(name: FieldName, isArray?: boolean): FieldModel<TValue> {\n const path = new Path(name);\n const pathString = path.toString();\n\n if (this.fieldMap.get(pathString)) {\n return this.fieldMap.get(pathString)!;\n }\n\n // const fieldValue = value || get(this.initialValues, pathString);\n\n const field: FieldModel = isArray\n ? new FieldArrayModel(path, this)\n : new FieldModel(path, this);\n\n this.fieldMap.set(pathString, field);\n field.onDispose(() => {\n this.fieldMap.delete(pathString);\n });\n this.onFieldModelCreateEmitter.fire(field);\n\n return field;\n }\n\n createFieldArray<TValue = FieldValue>(\n name: FieldName,\n value?: Array<TValue>\n ): FieldArrayModel<TValue> {\n return this.createField<Array<TValue>>(name, true) as FieldArrayModel<TValue>;\n }\n\n /**\n * 销毁Field 模型和子模型,但不会删除field的值\n * @param name\n */\n disposeField(name: string) {\n const field = this.fieldMap.get(name);\n if (field) {\n field.dispose();\n }\n }\n\n /**\n * 删除field, 会删除值和 Field 模型, 以及对应的子模型\n * @param name\n */\n deleteField(name: string) {\n const field = this.fieldMap.get(name);\n if (field) {\n // 销毁值\n field.clear();\n // 销毁模型\n field.dispose();\n }\n }\n\n getField<TFieldModel extends FieldModel | FieldArrayModel = FieldModel>(\n name: FieldName\n ): TFieldModel | undefined {\n return this.fieldMap.get(new Path(name).toString()) as TFieldModel | undefined;\n }\n\n getValueIn<TValue>(name: FieldName): TValue {\n return this.store.getIn<TValue>(new Path(name));\n }\n\n setValueIn<TValue>(name: FieldName, value: TValue): void {\n const prevValues = this.values;\n\n this.store.setIn(new Path(name), value);\n\n this.fireOnFormValuesChange({\n values: this.values,\n prevValues,\n name,\n });\n }\n\n setInitValueIn<TValue = any>(name: FieldName, value: TValue): void {\n const path = new Path(name);\n const prevValue = this.store.getIn(path);\n if (prevValue === undefined) {\n const prevValues = this.values;\n this.store.setIn(new Path(name), value);\n this.fireOnFormValuesInit({\n values: this.values,\n prevValues,\n name,\n });\n }\n }\n\n clearValueIn(name: FieldName) {\n this.setValueIn(name, undefined);\n }\n\n async validateIn(name: FieldName) {\n if (!this._options.validate) {\n return;\n }\n\n const validateKeys = Object.keys(this._options.validate).filter((pattern) =>\n Glob.isMatch(pattern, name)\n );\n\n const validatePromises = validateKeys.map(async (validateKey) => {\n const validate = this._options.validate![validateKey];\n\n return validate({\n value: this.getValueIn(name),\n formValues: this.values,\n context: this.context,\n name,\n });\n });\n\n return Promise.all(validatePromises);\n }\n\n async validate(): Promise<FormValidateReturn> {\n if (!this._options.validate) {\n return [];\n }\n\n const feedbacksArrPromises = Object.keys(this._options.validate).map(async (nameRule) => {\n const validate = this._options.validate![nameRule];\n const paths = Glob.findMatchPathsWithEmptyValue(this.values, nameRule);\n return Promise.all(\n paths.map(async (path) => {\n const result = await validate({\n value: get(this.values, path),\n formValues: this.values,\n context: this.context,\n name: path,\n });\n\n const feedback = toFeedback(result, path);\n const field = this.getField(path);\n\n const errors = feedbackToFieldErrorsOrWarnings<Errors>(\n path,\n feedback?.level === FeedbackLevel.Error ? feedback : undefined\n );\n const warnings = feedbackToFieldErrorsOrWarnings<Warnings>(\n path,\n feedback?.level === FeedbackLevel.Warning ? feedback : undefined\n );\n\n if (field) {\n field.state.errors = errors;\n field.state.warnings = warnings;\n field.state.invalid = hasError(errors);\n field.bubbleState();\n }\n\n // 无论是否存在 field 都要保证 form 的state 被更新\n this.state.errors = mergeFeedbacks(this.state.errors, errors);\n this.state.warnings = mergeFeedbacks(this.state.warnings, warnings);\n\n this.state.invalid = !getValidByErrors(this.state.errors);\n return feedback;\n })\n );\n });\n\n this.state.isValidating = true;\n const feedbacksArr = await Promise.all(feedbacksArrPromises);\n this.state.isValidating = false;\n this.onValidateEmitter.fire(this.state);\n\n return flatten(feedbacksArr).filter(Boolean) as FormValidateReturn;\n }\n\n alignStateWithFieldMap() {\n const keys = Array.from(this.fieldMap.keys());\n\n if (this.state.errors) {\n this.state.errors = keepValidKeys(this.state.errors, keys);\n }\n if (this.state.warnings) {\n this.state.warnings = keepValidKeys(this.state.warnings, keys);\n }\n this.fieldMap.forEach((f) => {\n if (f.state.errors) {\n f.state.errors = keepValidKeys(f.state.errors, keys);\n }\n if (f.state.warnings) {\n f.state.warnings = keepValidKeys(f.state.warnings, keys);\n }\n });\n }\n\n dispose() {\n this.fieldMap.forEach((f) => f.dispose());\n this.store.dispose();\n this._initialized = false;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n Errors,\n Feedback,\n FeedbackLevel,\n FieldError,\n FieldName,\n FieldWarning,\n FormErrorOptions,\n FormWarningOptions,\n} from '../types';\n\nexport function toFeedback(\n result: string | FormErrorOptions | FormWarningOptions | undefined,\n name: FieldName\n): FieldError | FieldWarning | undefined {\n if (typeof result === 'string') {\n return {\n name,\n message: result,\n level: FeedbackLevel.Error,\n };\n } else if (result?.message) {\n return {\n ...result,\n name,\n };\n }\n}\n\nexport function feedbackToFieldErrorsOrWarnings<T>(name: string, feedback?: Feedback<any>) {\n return {\n [name]: feedback ? [feedback] : [],\n } as T;\n}\n\nexport const hasError = (errors: Errors) =>\n Object.keys(errors).some((key) => errors[key]?.length > 0);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FieldModelState } from './types/field';\nimport { FormModelState } from './types';\n\nexport const DEFAULT_FIELD_STATE: FieldModelState = {\n invalid: false,\n isDirty: false,\n isTouched: false,\n isValidating: false,\n};\nexport const DEFAULT_FORM_STATE: FormModelState = {\n invalid: false,\n isDirty: false,\n isTouched: false,\n isValidating: false,\n};\n\nexport function createFormModelState(initialState?: Partial<FormModelState>) {\n if (!initialState) {\n return { ...DEFAULT_FORM_STATE };\n }\n return { ...DEFAULT_FORM_STATE, ...initialState };\n}\n\nexport function createFieldModelState(initialState?: Partial<FieldModelState>): FieldModelState {\n if (!initialState) {\n return { ...DEFAULT_FIELD_STATE };\n }\n return { ...DEFAULT_FIELD_STATE, ...initialState };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { get, clone, cloneDeep } from 'lodash';\n\nimport { shallowSetIn } from '../utils';\nimport { FieldValue } from '../types/field';\nimport { Path } from './path';\n\nexport class Store<TValues = FieldValue> {\n protected _values: TValues;\n\n get values(): TValues {\n return clone(this._values);\n }\n\n set values(v) {\n this._values = cloneDeep(v);\n }\n\n setIn<TValue = FieldValue>(path: Path, value: TValue): void {\n // shallow clone set\n this._values = shallowSetIn(this._values || {}, path.toString(), value);\n }\n\n getIn<TValue = FieldValue>(path: Path): TValue {\n return get(this.values, path.value);\n }\n\n dispose() {}\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { nanoid } from 'nanoid';\nimport { get, groupBy, some } from 'lodash';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram.ai/utils';\nimport { ReactiveState } from '@flowgram.ai/reactive';\n\nimport { toFeedback } from '../utils/validate';\nimport { FieldModelState, FieldName, FieldValue, Ref } from '../types/field';\nimport {\n Errors,\n FeedbackLevel,\n FieldError,\n FieldWarning,\n Validate,\n ValidateTrigger,\n Warnings,\n} from '../types';\nimport { createFieldModelState, DEFAULT_FIELD_STATE } from '../constants';\nimport {\n clearFeedbacks,\n FieldEventUtils,\n mergeFeedbacks,\n shouldValidate,\n updateFeedbacksName,\n} from './utils';\nimport { Path } from './path';\nimport { FormModel } from './form-model';\n\ninterface OnValueChangePayload<TValue> {\n value: TValue | undefined;\n prevValue: TValue | undefined;\n formValues: any;\n prevFormValues: any;\n}\n\nexport class FieldModel<TValue extends FieldValue = FieldValue> implements Disposable {\n readonly onValueChangeEmitter = new Emitter<OnValueChangePayload<TValue>>();\n\n readonly form: FormModel;\n\n readonly id: string;\n\n readonly onValueChange = this.onValueChangeEmitter.event;\n\n protected toDispose = new DisposableCollection();\n\n protected _ref?: Ref;\n\n protected _path: Path;\n\n protected _state: ReactiveState<FieldModelState> = new ReactiveState<FieldModelState>(\n createFieldModelState()\n );\n\n /**\n * @deprecated\n * 原用于直接给field 设置validate 逻辑,现将该逻辑放到form._options.validate 中设置,该字段暂时弃用\n */\n originalValidate?: Validate;\n\n protected _renderCount: number = 0;\n\n constructor(path: Path, form: FormModel) {\n this._path = path;\n this.form = form;\n this.id = nanoid();\n\n const changeDisposable = this.form.onFormValuesChange((payload) => {\n const { values, prevValues } = payload;\n if (FieldEventUtils.shouldTriggerFieldChangeEvent(payload, this.name)) {\n this.onValueChangeEmitter.fire({\n value: get(values, this.name),\n prevValue: get(prevValues, this.name),\n formValues: values,\n prevFormValues: prevValues,\n });\n if (\n shouldValidate(ValidateTrigger.onChange, this.form.validationTrigger) &&\n FieldEventUtils.shouldTriggerFieldValidateWhenChange(payload, this.name)\n ) {\n this.validate();\n }\n }\n });\n this.toDispose.push(changeDisposable);\n\n // if (shouldValidate(ValidateTrigger.onChange, this.form.validationTrigger)) {\n // const validateDisposable = this.form.onFormValuesChange(({ name, values, prevValues }) => {\n // /**\n // * Field 值变更时,所有 ancestor 以及所有child 和 grand child 的校验都要触发\n // */\n // if (Glob.isMatchOrParent(this.name, name) || Glob.isMatchOrParent(name, this.name)) {\n // this.validate();\n // }\n // });\n // this.toDispose.push(validateDisposable);\n // }\n\n this.toDispose.push(this.onValueChangeEmitter);\n\n this.initState();\n }\n\n protected _mount: boolean = false;\n\n get renderCount() {\n return this._renderCount;\n }\n\n set renderCount(n: number) {\n this._renderCount = n;\n }\n\n private initState() {\n const initialErrors = get(this.form.state.errors, this.name);\n const initialWarnings = get(this.form.state.warnings, this.name);\n\n if (initialErrors) {\n this.state.errors = {\n [this.name]: initialErrors,\n };\n }\n if (initialWarnings) {\n this.state.warnings = {\n [this.name]: initialWarnings,\n };\n }\n }\n\n get path() {\n return this._path;\n }\n\n get name() {\n return this._path.toString();\n }\n\n set name(name: FieldName) {\n this._path = new Path(name);\n }\n\n get ref() {\n return this._ref;\n }\n\n set ref(ref: Ref | undefined) {\n this._ref = ref;\n }\n\n get state() {\n return this._state.value;\n }\n\n get reactiveState() {\n return this._state;\n }\n\n get value() {\n return this.form.getValueIn(this.name);\n }\n\n set value(value: TValue | undefined) {\n this.form.setValueIn(this.name, value);\n if (!this.state.isTouched) {\n this.state.isTouched = true;\n this.bubbleState();\n }\n }\n\n updateNameForLeafState(newName: string) {\n const { errors, warnings } = this.state;\n const nameInErrors = errors ? Object.keys(errors)?.[0] : undefined;\n if (nameInErrors && errors?.[nameInErrors] && nameInErrors !== newName) {\n this.state.errors = {\n [newName]: errors?.[nameInErrors]\n ? updateFeedbacksName(errors?.[nameInErrors], newName)\n : errors?.[nameInErrors],\n };\n }\n const nameInWarnings = warnings ? Object.keys(warnings)?.[0] : undefined;\n if (nameInWarnings && warnings?.[nameInWarnings] && nameInWarnings !== newName) {\n this.state.warnings = {\n [newName]: warnings?.[nameInWarnings]\n ? updateFeedbacksName(warnings?.[nameInWarnings], newName)\n : warnings?.[nameInWarnings],\n };\n }\n }\n\n // recursiveUpdateName(name: FieldName) {\n // if (this.children?.length) {\n // this.children.forEach(c => {\n // c.recursiveUpdateName(c.path.replaceParent(this.path, new Path(name)).toString());\n // });\n // } else {\n // this.updateNameForLeafState(name);\n // this.bubbleState();\n // }\n // this.name = name;\n // }\n\n /**\n * @deprecated\n * @param validate\n * @param from\n */\n updateValidate(validate: Validate | undefined, from?: 'ui') {\n if (from === 'ui') {\n // todo(heyuan):暂时逻辑: 只在没有全局配置校验时来自ui 的validate 才生效。 后续需要支持多validate合并, ui 和全局的都需要生效\n if (!this.originalValidate) {\n this.originalValidate = validate;\n }\n } else {\n this.originalValidate = validate;\n }\n }\n\n bubbleState() {\n const { errors, warnings } = this.state;\n\n if (this.parent) {\n this.parent.state.isTouched = some(\n this.parent.children.map((c) => c.state.isTouched),\n Boolean\n );\n this.parent.state.invalid = some(\n this.parent.children.map((c) => c.state.invalid),\n Boolean\n );\n this.parent.state.isDirty = some(\n this.parent.children.map((c) => c.state.isDirty),\n Boolean\n );\n this.parent.state.isValidating = some(\n this.parent.children.map((c) => c.state.isValidating),\n Boolean\n );\n this.parent.state.errors = errors\n ? mergeFeedbacks<Errors>(this.parent.state.errors, errors)\n : clearFeedbacks(this.name, this.parent.state.errors);\n this.parent.state.warnings = warnings\n ? mergeFeedbacks<Warnings>(this.parent.state.warnings, warnings)\n : clearFeedbacks(this.name, this.parent.state.warnings);\n\n this.parent.bubbleState();\n return;\n }\n // parent 不存在,则更新form state\n this.form.state.isTouched = some(\n this.form.fields.map((f) => f.state.isTouched),\n Boolean\n );\n this.form.state.invalid = some(\n this.form.fields.map((f) => f.state.invalid),\n Boolean\n );\n this.form.state.isDirty = some(\n this.form.fields.map((f) => f.state.isDirty),\n Boolean\n );\n this.form.state.isValidating = some(\n this.form.fields.map((f) => f.state.isValidating),\n Boolean\n );\n this.form.state.errors = errors\n ? mergeFeedbacks<Errors>(this.form.state.errors, errors)\n : clearFeedbacks(this.name, this.form.state.errors);\n this.form.state.warnings = warnings\n ? mergeFeedbacks<Warnings>(this.form.state.warnings, warnings)\n : clearFeedbacks(this.name, this.form.state.warnings);\n // console.log('>>>> bubble state: ', this.form.state.errors, this.form.state.invalid, this.form.fields.map(f => f.state.invalid))\n }\n\n clearState() {\n this.state.errors = DEFAULT_FIELD_STATE.errors;\n this.state.warnings = DEFAULT_FIELD_STATE.warnings;\n this.state.isTouched = DEFAULT_FIELD_STATE.isTouched;\n this.state.isDirty = DEFAULT_FIELD_STATE.isDirty;\n this.bubbleState();\n }\n\n get children(): FieldModel[] {\n const res: FieldModel[] = [];\n this.form.fieldMap.forEach((field, path: string) => {\n if (this.path.isChild(path)) {\n res.push(field);\n }\n });\n return res;\n }\n\n get parent(): FieldModel | undefined {\n const parentPath = this.path.parent;\n if (!parentPath) {\n return undefined;\n }\n return this.form.fieldMap.get(parentPath.toString());\n }\n\n clear() {\n if (!this.value) {\n return;\n }\n this.value = undefined;\n }\n\n async validate() {\n // 以下代码由于导致arr 配置的校验不触发,暂时注释,支持对父节点配置校验逻辑\n // const children = this.children;\n\n // 如果是非叶子field, 执行children的校验。暂不支持在父级上配校验器\n // if (children?.length) {\n // await Promise.all(this.children.map(c => c.validate()));\n // return;\n // }\n await this.validateSelf();\n }\n\n async validateSelf() {\n this.state.isValidating = true;\n this.bubbleState();\n const { errors, warnings } = await this._runAsyncValidate();\n\n if (errors?.length) {\n this.state.errors = groupBy(errors, 'name');\n this.state.invalid = true;\n } else {\n this.state.errors = { [this.name]: [] };\n this.state.invalid = false;\n }\n\n if (warnings?.length) {\n this.state.warnings = groupBy(warnings, 'name');\n } else {\n this.state.warnings = { [this.name]: [] };\n }\n\n this.state.isValidating = false;\n this.bubbleState();\n this.form.onValidateEmitter.fire(this.form.state);\n }\n\n protected async _runAsyncValidate(): Promise<{\n errors?: FieldError[];\n warnings?: FieldWarning[];\n }> {\n let errors: FieldError[] = [];\n let warnings: FieldWarning[] = [];\n\n const results = await this.form.validateIn(this.name);\n if (!results?.length) {\n return {};\n } else {\n const feedbacks = results.map((result) => toFeedback(result, this.name)).filter(Boolean) as (\n | FieldError\n | FieldWarning\n )[];\n\n if (!feedbacks?.length) {\n return {};\n }\n\n const groupedFeedbacks = groupBy(feedbacks, 'level');\n\n warnings = warnings.concat((groupedFeedbacks[FeedbackLevel.Warning] as FieldWarning[]) || []);\n errors = errors.concat((groupedFeedbacks[FeedbackLevel.Error] as FieldError[]) || []);\n }\n\n return { errors, warnings };\n }\n\n updateState(s: Partial<FieldModel>) {\n // todo\n }\n\n dispose() {\n this.children.map((c) => c.dispose());\n // Do not reset state when field disposed, since it will clear errors and warnings in form model as well.\n // todo: remove following line and related ut after a few weeks test online\n // this.clearState();\n this.toDispose.dispose();\n this.form.fieldMap.delete(this.path.toString());\n }\n\n onDispose(fn: () => void) {\n this.toDispose.onDispose(fn);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport { FieldValue } from '../types';\nimport { Path } from './path';\nimport { FieldModel } from './field-model';\n\nexport class FieldArrayModel<TValue = FieldValue> extends FieldModel<Array<TValue>> {\n protected onAppendEmitter = new Emitter<{\n index: number;\n value: TValue | undefined;\n arrayValue: Array<TValue>;\n }>();\n\n readonly onAppend = this.onAppendEmitter.event;\n\n protected onDeleteEmitter = new Emitter<{\n arrayValue: Array<TValue> | undefined;\n index: number;\n }>();\n\n readonly onDelete = this.onDeleteEmitter.event;\n\n get children() {\n const fields: FieldModel[] = [];\n this.form.fieldMap.forEach((field, name: string) => {\n if (this.path.isChild(name)) {\n fields.push(field);\n }\n });\n\n // 按 index 排序\n return fields.sort((f1, f2) => {\n const p1 = f1.path.value;\n const p2 = f2.path.value;\n const i1 = parseInt(p1[p1.length - 1]);\n const i2 = parseInt(p1[p2.length - 1]);\n return i1 - i2;\n });\n }\n\n map<T>(cb: (f: FieldModel, index: number, arr: FieldModel[]) => T) {\n const fields = (this.value || []).map((v: TValue, i: number) => {\n const pathString = this.path.concat(i).toString();\n let field = this.form.getField(pathString);\n if (!field) {\n field = this.form.createField(pathString);\n }\n return field;\n });\n return fields.map(cb);\n }\n\n append(value?: TValue) {\n const curLength = this.value?.length || 0;\n const newElemPath = this.path.concat(curLength).toString();\n const newElemField = this.form.createField(newElemPath);\n const newArrayValue = this.value ? [...this.value, value] : [value];\n\n const prevFormValues = this.form.values;\n\n // 设置新的数组值并触发事件\n this.form.store.setIn(new Path(this.name), newArrayValue);\n this.form.fireOnFormValuesChange({\n values: this.form.values,\n prevValues: prevFormValues,\n name: this.name,\n options: {\n action: 'array-append',\n indexes: [curLength],\n },\n });\n // 触发新元素的初始值变更\n this.form.fireOnFormValuesInit({\n values: this.form.values,\n prevValues: prevFormValues,\n name: newElemPath,\n });\n\n this.onAppendEmitter.fire({\n value,\n arrayValue: this.value as Array<TValue>,\n index: this.value!.length - 1,\n });\n return newElemField;\n }\n\n /**\n * Delete the element in given index and delete the corresponding FieldModel as well\n * @param index\n */\n delete(index: number) {\n // const field = this.form.getField(name);\n // if (!field) {\n // throw new Error(\n // `[Form] Error in FieldArrayModel.delete: delete failed, no field found for name ${name}`,\n // );\n // }\n // const index = field.path.getArrayIndex(this.path);\n this._splice(index, 1);\n\n this.onDeleteEmitter.fire({ arrayValue: this.value, index });\n }\n\n _splice(start: number, deleteCount = 1) {\n if (start < 0 || deleteCount < 0) {\n throw new Error(\n `[Form] Error in FieldArrayModel.splice: Invalid Params, start and deleteCount should > 0`\n );\n }\n\n if (!this.value || this.value.length === 0 || deleteCount > this.value.length) {\n throw new Error(\n `[Form] Error in FieldArrayModel.splice: delete count exceeds array length, tried to delete ${deleteCount} elements, but array length is ${\n this.value?.length || 0\n }`\n );\n }\n const oldFormValues = this.form.values;\n\n const tempValue = [...this.value];\n tempValue.splice(start, deleteCount);\n\n // 设置数组值并触发事件\n this.form.store.setIn(new Path(this.name), tempValue);\n\n this.form.fireOnFormValuesChange({\n values: this.form.values,\n prevValues: oldFormValues,\n name: this.name,\n options: {\n action: 'array-splice',\n indexes: Array.from({ length: deleteCount }, (_, i) => i + start),\n },\n });\n\n const children = this.children;\n\n // 如果要删除的元素都在数组末端, 直接删除\n if (start + deleteCount >= children.length) {\n for (let i = start; i < children.length; i++) {\n this.form.disposeField(children[i].name);\n }\n }\n\n const toDispose: FieldModel[] = [];\n const newFieldMap = new Map<string, FieldModel>(this.form.fieldMap);\n\n const recursiveHandleChildField = (field: FieldModel, index: number) => {\n if (field.children?.length) {\n field.children.forEach((cField) => {\n recursiveHandleChildField(cField, index);\n });\n }\n // start 以前的项不变\n if (index < start) {\n newFieldMap.set(field.name, field);\n }\n // 要删除的项, 放入toDispose\n else if (index < start + deleteCount) {\n toDispose.push(field);\n }\n // 剩余的项 index 向前移动 {deleteCount} 位, 并触发变更事件\n else {\n const originName = field.name;\n const targetName = field.path\n .replaceParent(this.path.concat(index), this.path.concat(index - deleteCount))\n .toString();\n newFieldMap.set(targetName, field);\n if (!field.children.length) {\n field.updateNameForLeafState(targetName);\n field.bubbleState();\n }\n field.name = targetName;\n\n // 最后 {deleteCount} 项,需要fire 被变更为undefined, 并从 newMap 中删除\n if (index > children.length - deleteCount - 1) {\n newFieldMap.delete(originName);\n }\n }\n };\n\n // 对数组所有子项做删除或 index 移动操作\n children.map((field, index) => {\n recursiveHandleChildField(field, index);\n });\n\n toDispose.forEach((f) => {\n f.dispose();\n });\n this.form.fieldMap = newFieldMap;\n this.form.alignStateWithFieldMap();\n }\n\n swap(from: number, to: number) {\n if (!this.value) {\n return;\n }\n\n if (from < 0 || to < 0 || from > this.value.length - 1 || to > this.value.length - 1) {\n throw new Error(\n `[Form]: FieldArrayModel.swap Error: invalid params 'form' and 'to', form=${from} to=${to}. expect the value between 0 to ${\n length - 1\n }`\n );\n }\n\n const oldFormValues = this.form.values;\n const tempValue = [...this.value];\n\n const fromValue = tempValue[from];\n const toValue = tempValue[to];\n\n tempValue[to] = fromValue;\n tempValue[from] = toValue;\n\n this.form.store.setIn(this.path, tempValue);\n this.form.fireOnFormValuesChange({\n values: this.form.values,\n prevValues: oldFormValues,\n name: this.name,\n options: {\n action: 'array-swap',\n indexes: [from, to],\n },\n });\n\n // swap related FieldModels\n const newFieldMap = new Map<string, FieldModel>(this.form.fieldMap);\n\n const fromFields = this.findAllFieldsAt(from);\n const toFields = this.findAllFieldsAt(to);\n const fromRootPath = this.getPathAt(from);\n const toRootPath = this.getPathAt(to);\n const leafFieldsModified: FieldModel[] = [];\n fromFields.forEach((f) => {\n const newName = f.path.replaceParent(fromRootPath, toRootPath).toString();\n f.name = newName;\n if (!f.children.length) {\n f.updateNameForLeafState(newName);\n leafFieldsModified.push(f);\n }\n newFieldMap.set(newName, f);\n });\n toFields.forEach((f) => {\n const newName = f.path.replaceParent(toRootPath, fromRootPath).toString();\n f.name = newName;\n if (!f.children.length) {\n f.updateNameForLeafState(newName);\n }\n newFieldMap.set(newName, f);\n leafFieldsModified.push(f);\n });\n this.form.fieldMap = newFieldMap;\n leafFieldsModified.forEach((f) => f.bubbleState());\n this.form.alignStateWithFieldMap();\n }\n\n move(from: number, to: number) {\n if (!this.value) {\n return;\n }\n\n if (from < 0 || to < 0 || from > this.value.length - 1 || to > this.value.length - 1) {\n throw new Error(\n `[Form]: FieldArrayModel.move Error: invalid params 'form' and 'to', form=${from} to=${to}. expect the value between 0 to ${\n length - 1\n }`\n );\n }\n\n const tempValue = [...this.value];\n\n const fromValue = tempValue[from];\n\n tempValue.splice(from, 1);\n tempValue.splice(to, 0, fromValue);\n\n this.form.setValueIn(this.name, tempValue);\n\n // todo(fix): should move fields in order to make sure fields' state is also moved\n }\n\n protected insertAt(index: number, value: TValue) {\n if (!this.value) {\n return;\n }\n\n if (index < 0 || index > this.value.length) {\n throw new Error(`[Form]: FieldArrayModel.insertAt Error: index exceeds array boundary`);\n }\n\n const tempValue = [...this.value];\n tempValue.splice(index, 0, value);\n this.form.setValueIn(this.name, tempValue);\n\n // todo: should move field in order to make sure field state is also moved\n }\n\n /**\n * get element path at given index\n * @param index\n * @protected\n */\n protected getPathAt(index: number) {\n return this.path.concat(index);\n }\n\n /**\n * find all fields including child and grandchild fields at given index.\n * @param index\n * @protected\n */\n protected findAllFieldsAt(index: number) {\n const rootPath = this.getPathAt(index);\n const rootPathString = rootPath.toString();\n\n const res: FieldModel[] = this.form.fieldMap.get(rootPathString)\n ? [this.form.fieldMap.get(rootPathString)!]\n : [];\n\n this.form.fieldMap.forEach((field, fieldName) => {\n if (rootPath.isChildOrGrandChild(fieldName)) {\n res.push(field);\n }\n });\n return res;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { CreateFormReturn, FormOptions } from '../types/form';\nimport { Field, FieldArray, FieldName, FieldValue } from '../types';\nimport { toForm } from './to-form';\nimport { toFieldArray } from './to-field-array';\nimport { toField } from './to-field';\nimport { FormModel } from './form-model';\nimport { FieldModel } from './field-model';\nimport { FieldArrayModel } from './field-array-model';\n\n// export interface CreateFormOptions<TValues = any> extends FormOptions<TValues> {\n// parentContainer?: interfaces.Container;\n// }\n\nexport type CreateFormOptions<T = any> = FormOptions<T> & {\n /**\n * 为 true 时,createForm 不会对form 初始化, 用户需要手动调用 control.init()\n * 该配置主要为了解决,用户需要去监听一些form 的初始化事件,那么他需要再配置完监听后再初始化。\n * 该配置默认为 false\n **/\n disableAutoInit?: boolean;\n};\n\nexport function createForm<TValues>(\n options?: CreateFormOptions<TValues>\n): CreateFormReturn<TValues> {\n const { disableAutoInit = false, ...formOptions } = options || {};\n const formModel = new FormModel();\n\n if (!disableAutoInit) {\n formModel.init(formOptions || {});\n }\n\n return {\n form: toForm(formModel),\n control: {\n _formModel: formModel,\n getField: <\n TFieldValue = FieldValue,\n TFieldModel extends Field<TFieldValue> | FieldArray<TFieldValue> = Field\n >(\n name: FieldName\n ) => {\n const fieldModel = formModel.getField(name);\n if (fieldModel) {\n return fieldModel instanceof FieldArrayModel\n ? toFieldArray<TFieldValue>(fieldModel as unknown as FieldArrayModel<TFieldValue>)\n : toField<TFieldValue>(fieldModel as unknown as FieldModel<TFieldValue>);\n }\n },\n init: () => formModel.init(formOptions || {}),\n },\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Form } from '../types';\nimport { toForm } from '../core/to-form';\nimport { useFormModel } from './utils';\n\n/**\n * Get Form instance. It should be use in a child component of <Form />\n */\nexport function useForm(): Form {\n const formModel = useFormModel();\n return toForm(formModel);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/utils';\n\nimport { FieldName, FieldValue } from '../types';\nimport { useFormModel } from './utils';\n\n/**\n * Listen to the field data change and refresh the React component.\n * @param name the field's uniq name (path)\n */\nexport function useWatch<TValue = FieldValue>(name: FieldName): TValue {\n const refresh = useRefresh();\n\n const formModel = useFormModel();\n\n if (!formModel) {\n throw new Error('[Form] error in useWatch, formModel not found');\n }\n\n const value = formModel.getValueIn<TValue>(name);\n\n useEffect(() => {\n const disposable = formModel.onFormValuesUpdated(({ name: updatedName }) => {\n if (updatedName === name) {\n refresh();\n }\n });\n return () => disposable.dispose();\n }, [name, formModel]);\n\n return value;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport * as React from 'react';\n\nimport { isFunction } from 'lodash';\nimport { DisposableCollection, useRefresh } from '@flowgram.ai/utils';\nimport { useReadonlyReactiveState } from '@flowgram.ai/reactive';\n\nimport {\n FieldArrayOptions,\n FieldArrayRenderProps,\n FieldModelState,\n FieldName,\n FieldValue,\n} from '../types/field';\nimport { FormModelState } from '../types';\nimport { toFieldArray } from '../core/to-field-array';\nimport { FieldArrayModel } from '../core/field-array-model';\nimport { toFieldState, toFormState } from '../core';\nimport { useFormModel } from './utils';\nimport { FieldModelContext } from './context';\n\nexport type FieldArrayProps<TValue> = FieldArrayOptions<TValue> & {\n /**\n * A React element or a render prop\n */\n children?: ((props: FieldArrayRenderProps<TValue>) => React.ReactElement) | React.ReactElement;\n /**\n * Dependencies of the current field. If a field name is given in deps, current field will re-render if the given field name data is updated\n */\n deps?: FieldName[];\n};\n\n/**\n * HOC That declare an array field, an FieldArray model will be created when it's rendered. Multiple FieldArray rendering with a same name will link to the same model, which means they shared data、 status and methods\n */\nexport function FieldArray<TValue extends FieldValue>({\n name,\n defaultValue,\n deps,\n render,\n children,\n}: FieldArrayProps<TValue>): React.ReactElement {\n const formModel = useFormModel();\n const fieldModel = React.useMemo(\n () =>\n formModel.getField<FieldArrayModel<TValue>>(name) ||\n (formModel.createFieldArray(name) as FieldArrayModel<any>),\n [name]\n );\n\n const field = React.useMemo(() => toFieldArray<TValue>(fieldModel), [fieldModel]);\n\n const refresh = useRefresh();\n\n const fieldModelState = useReadonlyReactiveState<FieldModelState>(fieldModel.reactiveState);\n const formModelState = useReadonlyReactiveState<FormModelState>(formModel.reactiveState);\n\n const fieldState = toFieldState(fieldModelState);\n const formState = React.useMemo(() => toFormState(formModelState), [formModelState]);\n\n React.useEffect(() => {\n fieldModel.renderCount = fieldModel.renderCount + 1;\n\n if (!formModel.getValueIn(name) !== undefined && defaultValue !== undefined) {\n formModel.setInitValueIn(name, defaultValue);\n refresh();\n }\n\n const disposableCollection = new DisposableCollection();\n\n disposableCollection.push(\n fieldModel.onValueChange(() => {\n refresh();\n })\n );\n\n if (deps) {\n deps.forEach((dep) => {\n const disposable = formModel.getField(dep)?.onValueChange(() => {\n refresh();\n });\n if (disposable) {\n disposableCollection.push(disposable);\n }\n });\n }\n return () => {\n disposableCollection.dispose();\n\n if (fieldModel.renderCount > 1) {\n fieldModel.renderCount = fieldModel.renderCount - 1;\n } else {\n const newFieldModel = formModel.getField(fieldModel.name);\n if (newFieldModel === fieldModel) fieldModel.dispose();\n }\n };\n }, [fieldModel]);\n\n const renderInner = () => {\n if (render && isFunction(render)) {\n // @ts-ignore\n return render({ field, fieldState, formState });\n }\n\n if (isFunction(children)) {\n return children({ field, fieldState, formState });\n }\n return <>Invalid Array render</>;\n };\n\n return (\n <FieldModelContext.Provider value={fieldModel}>{renderInner()}</FieldModelContext.Provider>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext, useEffect } from 'react';\n\nimport { Disposable, useRefresh } from '@flowgram.ai/utils';\n\nimport { Field, FieldArray, FieldName, FieldValue } from '../types';\nimport { toField } from '../core/to-field';\nimport { toFieldArray } from '../core';\nimport { useFormModel } from './utils';\nimport { FieldModelContext } from './context';\n\n/**\n * @deprecated\n * `useField` is deprecated because its return relies on React render. if the Field is not rendered, the return would be\n * undefined. If you simply want to monitor the change of the value of a certain path, please use `useWatch(fieldName)`\n * @param name\n */\nexport function useField<\n TFieldValue = FieldValue,\n TField extends Field<TFieldValue> | FieldArray<TFieldValue> = Field<TFieldValue>\n>(name?: FieldName): TField | undefined {\n const currentFieldModel = useContext(FieldModelContext);\n const formModel = useFormModel();\n const refresh = useRefresh();\n const fieldModel = name ? formModel.getField(name!) : currentFieldModel;\n\n useEffect(() => {\n let disposable: Disposable;\n if (fieldModel) {\n disposable = fieldModel.onValueChange(() => refresh());\n }\n return () => {\n disposable?.dispose();\n };\n }, [fieldModel]);\n\n if (!fieldModel) {\n return undefined;\n }\n\n if (fieldModel.map) {\n return toFieldArray<TFieldValue>(fieldModel) as unknown as TField;\n }\n\n return toField(fieldModel) as unknown as TField;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useObserve } from '@flowgram.ai/reactive';\n\nimport { Form, FormControl, FormState } from '../types';\n\nexport function useFormState(control?: FormControl<any> | Form) {\n // @ts-ignore\n return useObserve<FormState>(control?._formModel.reactiveState.value || ({} as FormState));\n}\n\nexport function useFormErrors(control?: FormControl<any> | Form) {\n // @ts-ignore\n return useObserve<FormState>(control?._formModel.reactiveState.value || ({} as FormState))\n ?.errors;\n}\n\nexport function useFormWarnings(control?: FormControl<any> | Form) {\n // @ts-ignore\n return useObserve<FormState>(control?._formModel.reactiveState.value || ({} as FormState))\n ?.warnings;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useContext } from 'react';\n\nimport { FieldName } from '../types';\nimport { useFormModel } from './utils';\nimport { FieldModelContext } from './context';\n\n/**\n * Get validate method of a field with given name. the returned function could possibly do nothing if the field is not found.\n * The reason could be that the field is not rendered yet or the name given is wrong.\n * @param name\n */\nexport function useFieldValidate(name?: FieldName): () => void {\n const currentFieldModel = useContext(FieldModelContext);\n const formModel = useFormModel();\n\n return useCallback(() => {\n const fieldModel = name ? formModel.getField(name!) : currentFieldModel;\n fieldModel?.validate();\n }, [currentFieldModel]);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext } from 'react';\n\nimport { Field, FieldArray, FieldValue } from '../types';\nimport { toField } from '../core/to-field';\nimport { toFieldArray } from '../core';\nimport { FieldModelContext } from './context';\n\n/**\n * Get the current Field. It should be used in a child component of <Field />, otherwise it throws an error\n */\nexport function useCurrentField<\n TFieldValue = FieldValue,\n TField extends Field<TFieldValue> | FieldArray<TFieldValue> = Field<TFieldValue>\n>(): Field<TFieldValue> | FieldArray<TFieldValue> {\n const fieldModel = useContext(FieldModelContext);\n\n if (!fieldModel) {\n throw new Error(\n `[Form] useCurrentField Error: field not found, make sure that you are using this hook in a child Component of a Field`\n );\n }\n\n return fieldModel.map\n ? (toFieldArray<TFieldValue>(fieldModel) as unknown as FieldArray<TFieldValue>)\n : (toField(fieldModel) as unknown as TField);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext, useMemo } from 'react';\n\nimport { useReadonlyReactiveState } from '@flowgram.ai/reactive';\n\nimport { FieldModelState, FieldState } from '../types';\nimport { toFieldState } from '../core';\nimport { FieldModelContext } from './context';\n\n/**\n * Get the current field state. It should be used in a child component of <Field />, otherwise it throws an error\n */\nexport function useCurrentFieldState(): FieldState {\n const fieldModel = useContext(FieldModelContext);\n\n if (!fieldModel) {\n throw new Error(\n `[Form] useCurrentField Error: field not found, make sure that you are using this hook in a child Component of a Field`\n );\n }\n\n const fieldModelState = useReadonlyReactiveState<FieldModelState>(fieldModel.reactiveState);\n\n return useMemo(() => toFieldState(fieldModelState), [fieldModelState]);\n}\n"],"mappings":"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","names":["React","import_lodash","import_utils","import_lodash","Glob","pattern","isObject","FeedbackLevel","ValidateTrigger","import_lodash","import_lodash","FieldEventUtils","import_react","React","import_react","import_lodash","import_lodash","import_utils","import_reactive","import_lodash","import_lodash","import_utils","import_reactive","import_utils","isArray","React","import_react","import_utils","React","import_lodash","import_utils","import_reactive","import_react","import_utils","import_reactive","import_react","import_react","import_react","import_reactive"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/react/field.tsx","../src/utils/object.ts","../src/utils/dom.ts","../src/utils/glob.ts","../src/types/validate.ts","../src/core/utils.ts","../src/core/path.ts","../src/core/to-field.ts","../src/core/to-form.ts","../src/react/utils.ts","../src/react/context.ts","../src/react/form.tsx","../src/core/to-field-array.ts","../src/core/form-model.ts","../src/utils/validate.ts","../src/constants.ts","../src/core/store.ts","../src/core/field-model.ts","../src/core/field-array-model.ts","../src/core/create-form.ts","../src/react/use-form.ts","../src/react/use-watch.ts","../src/react/field-array.tsx","../src/react/use-field.ts","../src/react/use-form-state.ts","../src/react/use-field-validate.ts","../src/react/use-current-field.ts","../src/react/use-current-field-state.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './react';\nexport type {\n FormRenderProps,\n FieldRenderProps,\n FieldArrayRenderProps,\n FieldState,\n FormState,\n Validate,\n FormControl,\n FieldName,\n FieldError,\n FieldWarning,\n FormValidateReturn,\n FieldValue,\n FieldArray as IFieldArray,\n Field as IField,\n Form as IForm,\n Errors,\n Warnings,\n} from './types';\n\nexport { ValidateTrigger, FeedbackLevel } from './types';\nexport { createForm, type CreateFormOptions } from './core/create-form';\nexport { Glob } from './utils';\nexport * from './core';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport * as React from 'react';\n\nimport { isFunction } from 'lodash';\nimport { DisposableCollection, useRefresh } from '@flowgram.ai/utils';\nimport { useReadonlyReactiveState } from '@flowgram.ai/reactive';\n\nimport { toField, toFieldState } from 'src/core/to-field';\nimport { FieldModelState, FieldName, FieldOptions, FieldRenderProps } from '../types/field';\nimport { FormModelState } from '../types';\nimport { toFormState } from '../core/to-form';\nimport { useFormModel } from './utils';\nimport { FieldModelContext } from './context';\n\nexport type FieldProps<TValue> = FieldOptions<TValue> & {\n /**\n * A React element or a render prop\n */\n children?: ((props: FieldRenderProps<TValue>) => React.ReactElement) | React.ReactElement;\n /**\n * Dependencies of the current field. If a field name is given in deps, current field will re-render if the given field name data is updated\n */\n deps?: FieldName[];\n};\n\n/**\n * HOC That declare a field, an Field model will be created it's rendered. Multiple Field rendering with a same name will link to the same model, which means they shared data、 status and methods\n */\nexport function Field<TValue>({\n name,\n defaultValue,\n render,\n children,\n deps,\n}: FieldProps<TValue>): React.ReactElement {\n const formModel = useFormModel();\n\n const fieldModel = formModel.getField(name) || formModel.createField(name);\n const field = React.useMemo(() => toField<TValue>(fieldModel), [fieldModel]);\n\n const fieldModelState = useReadonlyReactiveState<FieldModelState>(fieldModel.reactiveState);\n const formModelState = useReadonlyReactiveState<FormModelState>(formModel.reactiveState);\n\n const fieldState = React.useMemo(() => toFieldState(fieldModelState), [fieldModelState]);\n const formState = toFormState(formModelState);\n\n const refresh = useRefresh();\n\n React.useEffect(() => {\n fieldModel.renderCount = fieldModel.renderCount + 1;\n\n if (!formModel.getValueIn(name) !== undefined && defaultValue !== undefined) {\n formModel.setInitValueIn(name, defaultValue);\n refresh();\n }\n\n const disposableCollection = new DisposableCollection();\n\n disposableCollection.push(\n fieldModel.onValueChange(() => {\n refresh();\n })\n );\n\n if (deps) {\n deps.forEach((dep) => {\n const disposable = formModel.getField(dep)?.onValueChange(() => {\n refresh();\n });\n if (disposable) {\n disposableCollection.push(disposable);\n }\n });\n }\n return () => {\n disposableCollection.dispose();\n\n if (fieldModel.renderCount > 1) {\n fieldModel.renderCount = fieldModel.renderCount - 1;\n } else {\n const newFieldModel = formModel.getField(fieldModel.name);\n if (newFieldModel === fieldModel) fieldModel.dispose();\n }\n };\n }, [fieldModel]);\n\n const renderInner = () => {\n if (render) {\n return render({ field, fieldState, formState });\n }\n\n if (isFunction(children)) {\n return children({ field, fieldState, formState });\n }\n\n return React.cloneElement(children as React.ReactElement, { ...field });\n };\n\n return (\n <FieldModelContext.Provider value={fieldModel}>{renderInner()}</FieldModelContext.Provider>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { clone, toPath } from 'lodash';\n\n/**\n * These functions are copied from Formik.\n * @see https://github.com/jaredpalmer/formik\n */\n\nexport const isEmptyArray = (value?: any) => Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: any): obj is Function => typeof obj === 'function';\n\n/** @private is the given object an Object? */\nexport const isObject = (obj: any): obj is Object => obj !== null && typeof obj === 'object';\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: any): boolean => String(Math.floor(Number(obj))) === obj;\n\n/** @private is the given object a string? */\nexport const isString = (obj: any): obj is string =>\n Object.prototype.toString.call(obj) === '[object String]';\n\n/** @private is the given object a NaN? */\n// eslint-disable-next-line no-self-compare\nexport const isNaN = (obj: any): boolean => obj !== obj;\n\n/** @private is the given object/value a promise? */\nexport const isPromise = (value: any): value is PromiseLike<any> =>\n isObject(value) && isFunction(value.then);\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(obj: any, key: string | string[], def?: any, p: number = 0) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = obj[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\n/**\n * Deeply set a value from in object via its path. If the value at `path`\n * has changed, return a shallow copy of obj with `value` set at `path`.\n * If `value` has not changed, return the original `obj`.\n *\n * Existing objects / arrays along `path` are also shallow copied. Sibling\n * objects along path retain the same internal js reference. Since new\n * objects / arrays are only created along `path`, we can test if anything\n * changed in a nested structure by comparing the object's reference in\n * the old and new object, similar to how russian doll cache invalidation\n * works.\n */\nexport function shallowSetIn(obj: any, path: string, value: any): any {\n let res: any = clone(obj); // this keeps inheritance when obj is a class\n let resVal: any = res;\n let i = 0;\n let pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n let currentObj: any = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj);\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n /**\n * In Formik, they delete the key if the value is undefined. but here we keep the key with the undefined value.\n * The reason that Formik tackle in this way is to fix the issue https://github.com/jaredpalmer/formik/issues/727\n * Their fix is https://github.com/jaredpalmer/formik/issues/727, and we roll back to the code before this PR.\n */\n resVal[pathArray[i]] = value;\n return res;\n}\n\nexport function keepValidKeys(obj: Record<string, any>, validKeys: string[]) {\n const validKeysSet = new Set(validKeys);\n const newObj: Record<string, any> = {};\n Object.keys(obj).forEach((key) => {\n if (validKeysSet.has(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport function isReactChangeEvent(e: unknown): e is React.ChangeEvent<HTMLInputElement> {\n return (\n typeof e === 'object' &&\n e !== null &&\n 'target' in e &&\n typeof (e as React.ChangeEvent<any>).target === 'object'\n );\n}\n\nexport function isCheckBoxEvent(e: unknown): e is React.ChangeEvent<HTMLInputElement> {\n return (\n typeof e === 'object' &&\n e !== null &&\n 'target' in e &&\n typeof (e as React.ChangeEvent<HTMLInputElement>).target === 'object' &&\n (e as React.ChangeEvent<HTMLInputElement>).target.type === 'checkbox'\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { flatten, get, isArray, isObject } from 'lodash';\n\nexport namespace Glob {\n export const DIVIDER = '.';\n export const ALL = '*';\n\n // 仅支持一个通配符\n export function isMatch(pattern: string, path: string) {\n const patternArr = pattern.split(DIVIDER);\n const pathArr = path.split(DIVIDER);\n if (patternArr.length !== pathArr.length) {\n return false;\n }\n return patternArr.every((pattern, index) => {\n if (pattern === ALL) {\n return true;\n }\n return pattern === pathArr[index];\n });\n }\n\n /**\n * 判断pattern 是否match pattern 或其parent\n * @param pattern\n * @param path\n */\n export function isMatchOrParent(pattern: string, path: string) {\n if (pattern === '') {\n return true;\n }\n const patternArr = pattern.split(DIVIDER);\n const pathArr = path.split(DIVIDER);\n\n if (patternArr.length > pathArr.length) {\n return false;\n }\n\n for (let i = 0; i < patternArr.length; i++) {\n if (patternArr[i] !== ALL && patternArr[i] !== pathArr[i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 从 path 中提取出匹配pattern 的 parent path,包括是 path 自身\n * 该方法默认 isMatchOrParent(pattern, path) 为 true, 不做为false 的错误处理。\n * @param pattern\n * @param path\n */\n export function getParentPathByPattern(pattern: string, path: string) {\n const patternArr = pattern.split(DIVIDER);\n const pathArr = path.split(DIVIDER);\n\n return pathArr.slice(0, patternArr.length).join(DIVIDER);\n }\n\n function concatPath(p1: string | number, ...pathArr: (string | number)[]): string {\n const p2 = pathArr.shift();\n if (p2 === undefined) return p1.toString();\n let resultPath = '';\n if (p1 === '' && p2 === '') {\n resultPath = '';\n } else if (p1 !== '' && p2 === '') {\n resultPath = p1.toString();\n } else if (p1 === '' && p2 !== '') {\n resultPath = p2.toString();\n } else {\n resultPath = `${p1}${DIVIDER}${p2}`;\n }\n if (pathArr.length > 0) {\n return concatPath(resultPath, ...pathArr);\n }\n return resultPath;\n }\n\n /**\n * 找到 obj 在给与 paths 下所有子path\n * @param paths\n * @param obj\n * @private\n */\n export function getSubPaths(paths: string[], obj: any): string[] {\n if (!obj || typeof obj !== 'object') {\n return [];\n }\n\n return flatten(\n paths.map((path) => {\n const value = path === '' ? obj : get(obj, path);\n if (isArray(value)) {\n return value.map((_: any, index: number) => concatPath(path, index));\n } else if (isObject(value)) {\n return Object.keys(value).map((key) => concatPath(path, key));\n }\n return [];\n })\n );\n }\n\n /**\n * 将带有通配符的 path pattern 分割。如 a.b.*.c.*.d, 会被分割成['a.b','*','c','*','d']\n * @param pattern\n * @private\n */\n export function splitPattern(pattern: string): string[] {\n const parts = pattern.split(DIVIDER);\n const res: string[] = [];\n\n let i = 0;\n let curPath: string[] = [];\n\n while (i < parts.length) {\n if (parts[i] === ALL) {\n if (curPath.length) {\n res.push(curPath.join(DIVIDER));\n }\n res.push(ALL);\n curPath = [];\n } else {\n curPath.push(parts[i]);\n }\n i += 1;\n }\n if (curPath.length) {\n res.push(curPath.join(DIVIDER));\n }\n return res;\n }\n\n /**\n * Find all paths matched pattern in object. If withEmptyValue is true, it will include\n * paths whoes value is undefined.\n * @param obj\n * @param pattern\n * @param withEmptyValue\n */\n\n export function findMatchPaths(obj: any, pattern: string, withEmptyValue?: boolean): string[] {\n if (!obj || !pattern) {\n return [];\n }\n const nextPaths: string[] = pattern.split(DIVIDER);\n let curKey: string | undefined = nextPaths.shift();\n let curPaths: string[] = [];\n let curValue = obj;\n while (curKey) {\n let isObject = typeof curValue === 'object' && curValue !== null;\n if (!isObject) return [];\n // 匹配 *\n if (curKey === ALL) {\n const parentPath = curPaths.join(DIVIDER);\n return flatten(\n Object.keys(curValue).map((key) => {\n if (nextPaths.length === 0) {\n return concatPath(parentPath, key);\n }\n return findMatchPaths(curValue[key], `${nextPaths.join(DIVIDER)}`, withEmptyValue).map(\n (p) => concatPath(parentPath, key, p)\n );\n })\n );\n }\n // 找不到对应 key 则不匹配\n if (!(curKey in curValue) && !withEmptyValue) {\n return [];\n }\n curValue = curValue[curKey!];\n curPaths.push(curKey);\n curKey = nextPaths.shift();\n }\n\n return [pattern];\n\n // const parts = splitPattern(pattern);\n //\n // let prePaths: string[] = [''];\n // let curPath: string = '';\n //\n // for (let i in parts) {\n // const part = parts[i];\n // if (part === ALL) {\n // prePaths = getSubPaths(\n // prePaths.map(p => concatPath(p, curPath)),\n // obj,\n // );\n // curPath = '';\n // } else {\n // curPath = part;\n //\n // /**\n // * 过滤掉后续path 值不存在的prePath\n // * 为什么: prePaths 是返回前一个通配符下所有的路径,但每个路径下的数据的field 可能不同\n // * 这会导致一些prePath 不存在后面所需的路径。如以下场景\n // * const obj = {\n // * a: { b: { c: 1 } },\n // * x: { y: { z: 2 } },\n // * };\n // * expect(Glob.findMatchPaths(obj, '*.y')).toEqual(['x.y']);\n // */\n //\n // prePaths = prePaths.filter(p => {\n // const preValue = p ? get(obj, p) : obj;\n // if (typeof preValue === 'object') {\n // return curPath in preValue;\n // }\n // return true;\n // });\n // }\n // }\n //\n // if (curPath) {\n // return prePaths.map(p => [p, curPath].join(DIVIDER));\n // }\n // return prePaths;\n }\n\n /**\n * Find all paths matched pattern in object, including paths whoes value is undefined.\n * @param obj\n * @param pattern\n */\n export function findMatchPathsWithEmptyValue(obj: any, pattern: string): string[] {\n if (!pattern.includes('*')) {\n return [pattern];\n }\n return findMatchPaths(obj, pattern, true);\n }\n\n // export function findMatchPathsWithEmptyValue(obj: any, pattern: string) {\n // const parts = splitPattern(pattern);\n //\n // let prePaths: string[] = [''];\n // let curPath: string = '';\n //\n // for (let i in parts) {\n // const part = parts[i];\n // if (part === ALL) {\n // prePaths = getSubPaths(\n // prePaths.map(p => concatPath(p, curPath)),\n // obj,\n // );\n // curPath = '';\n // } else {\n // curPath = part;\n //\n // /**\n // * 过滤掉后续path 值不存在的prePath\n // * 为什么: prePaths 是返回前一个通配符下所有的路径,但每个路径下的数据的field 可能不同\n // * 这会导致一些prePath 不存在后面所需的路径。如以下场景\n // * const obj = {\n // * a: { b: { c: 1 } },\n // * x: { y: { z: 2 } },\n // * };\n // * expect(Glob.findMatchPaths(obj, '*.y')).toEqual(['x.y']);\n // */\n //\n // // prePaths = prePaths.filter(p => {\n // // const preValue = p ? get(obj, p) : obj;\n // // if (typeof preValue === 'object') {\n // // return curPath in preValue;\n // // }\n // // return true;\n // // });\n // }\n // }\n //\n // if (curPath) {\n // return prePaths.map(p => [p, curPath].join(DIVIDER));\n // }\n // return prePaths;\n // }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { MaybePromise } from '@flowgram.ai/utils';\n\nimport { FieldName } from './field';\nimport { Context } from './common';\n\nexport enum FeedbackLevel {\n Error = 'error',\n Warning = 'warning',\n}\n\nexport interface Feedback<FeedbackLevel> {\n /**\n * The data path (or field path) that generate this feedback\n */\n name: string;\n /**\n * The type of the feedback\n */\n type?: string;\n /**\n * Feedback level\n */\n level: FeedbackLevel;\n /**\n * Feedback message\n */\n message: string | React.ReactNode;\n}\n\nexport type FieldError = Feedback<FeedbackLevel.Error>;\nexport type FieldWarning = Feedback<FeedbackLevel.Warning>;\n\nexport type FormErrorOptions = Omit<FieldError, 'name'>;\nexport type FormWarningOptions = Omit<FieldWarning, 'name'>;\nexport type FeedbackOptions<FeedbackLevel> = Omit<Feedback<FeedbackLevel>, 'name'>;\n\nexport type Validate<TFieldValue = any, TFormValues = any> = (props: {\n /**\n * Value of the data to validate\n */\n value: TFieldValue;\n /**\n * Complete form values\n */\n formValues: TFormValues;\n /**\n * The path of the data we are validating\n */\n name: FieldName;\n /**\n * The custom context set when init form\n */\n context: Context;\n}) =>\n | MaybePromise<string>\n | MaybePromise<FormErrorOptions>\n | MaybePromise<FormWarningOptions>\n | MaybePromise<undefined>;\n\nexport function isFieldError(f: Feedback<any>): f is FieldError {\n if (f.level === FeedbackLevel.Error) {\n return true;\n }\n return false;\n}\n\nexport function isFieldWarning(f: Feedback<any>): f is FieldWarning {\n if (f.level === FeedbackLevel.Warning) {\n return true;\n }\n return false;\n}\n\nexport type Errors = Record<FieldName, FieldError[]>;\nexport type Warnings = Record<FieldName, FieldWarning[]>;\n\nexport enum ValidateTrigger {\n onChange = 'onChange',\n onBlur = 'onBlur',\n}\n\nexport type FormValidateReturn = (FieldError | FieldWarning)[];\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { isEmpty, isEqual } from 'lodash';\n\nimport { Glob } from '../utils';\nimport { Errors, Feedback, OnFormValuesChangePayload, ValidateTrigger, Warnings } from '../types';\nimport { Path } from './path';\n\nexport function updateFeedbacksName(feedbacks: Feedback<any>[], name: string) {\n return (feedbacks || []).map((f) => ({\n ...f,\n name,\n }));\n}\n\nexport function mergeFeedbacks<T extends Errors | Warnings>(origin?: T, source?: T) {\n if (!source) {\n return origin;\n }\n if (!origin) {\n return { ...source };\n }\n const changed = Object.keys(source).some(\n (sourceKey) => !isEqual(origin[sourceKey], source[sourceKey])\n );\n\n if (changed) {\n return {\n ...origin,\n ...source,\n };\n }\n return origin;\n}\n\nexport function clearFeedbacks<T extends Errors | Warnings>(name: string, origin?: T) {\n if (!origin) {\n return origin;\n }\n if (name in origin) {\n delete origin[name];\n }\n return origin;\n}\n\nexport function shouldValidate(currentTrigger: ValidateTrigger, formTrigger?: ValidateTrigger) {\n return currentTrigger === formTrigger;\n}\n\nexport function getValidByErrors(errors: Errors | undefined) {\n return errors ? Object.keys(errors).every((name) => isEmpty(errors[name])) : true;\n}\n\nexport namespace FieldEventUtils {\n export function shouldTriggerFieldChangeEvent(\n payload: OnFormValuesChangePayload,\n fieldName: string\n ) {\n const { name: changedName, options } = payload;\n\n // 如果 Field 是 变更path 的 ancestor 则触发\n if (Glob.isMatchOrParent(fieldName, changedName)) {\n return true;\n }\n\n // 如果 Field 是 变更path 的 child 或 grandchild 有条件触发\n if (new Path(changedName).isChildOrGrandChild(fieldName)) {\n // 数组情况下部分子项不触发变更\n\n // 1. 数组 append 触发的FormValuesChange 不需要触发其子 Field 的 onValueChange\n if (options?.action === 'array-append') {\n return !new Path(changedName).isChildOrGrandChild(fieldName);\n }\n // 2. 数组 splice 触发的FormValuesChange 无需触发第一个删除项前的所有子 Field 的 onValueChange\n else if (options?.action === 'array-splice' && options?.indexes?.length) {\n return (\n (Path.compareArrayPath(\n new Path(fieldName),\n new Path(changedName).concat(options.indexes[0])\n ) as number) >= 0\n );\n }\n\n // 其余情况都需要触发\n return true;\n }\n return false;\n }\n\n export function shouldTriggerFieldValidateWhenChange(\n payload: OnFormValuesChangePayload,\n fieldName: string\n ) {\n const { name: changedName, options } = payload;\n\n if (options?.action === 'array-splice' || options?.action === 'array-swap') {\n // const splicedIndexes = options?.indexes || [];\n //\n // const splicedPaths = splicedIndexes.map(index => new Path(changedName).concat(index));\n // const removedPaths = Array.from({ length: splicedIndexes.length }, (_, i) =>\n // new Path(changedName).concat(prevValues[changedName].length - i - 1),\n // );\n //\n // const ignoredPathOrParentPaths = [...splicedPaths, ...removedPaths];\n // // const ignoredPathOrParentPaths = splicedPaths;\n // if (\n // ignoredPathOrParentPaths.some(\n // path => path.toString() === fieldName || path.isChildOrGrandChild(fieldName),\n // )\n // ) {\n // return false;\n // }\n\n // splice 和 swap 都属于数组跟级别的变更,仅需触发数组field的校验, 无需校验子项\n return fieldName === changedName;\n }\n\n return FieldEventUtils.shouldTriggerFieldChangeEvent(payload, fieldName);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { toPath } from 'lodash';\n\nexport class Path {\n protected _path: string[] = [];\n\n constructor(path: string | string[]) {\n this._path = toPath(path);\n }\n\n get parent(): Path | undefined {\n if (this._path.length < 2) {\n return undefined;\n }\n return new Path(this._path.slice(0, -1));\n }\n\n toString(): string {\n return this._path.join('.');\n }\n\n get value(): string[] {\n return this._path;\n }\n\n /**\n * 仅计直系child\n * @param path\n */\n isChild(path: string) {\n const target = new Path(path).value;\n const self = this.value;\n\n if (target.length - self.length !== 1) {\n return false;\n }\n\n for (let i = 0; i < self.length; i++) {\n if (target[i] !== self[i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 比较两个数组path大小\n * 返回小于0则path1<path2, 大于0 则path1>path2, 等于0则相等\n * @param path1\n * @param path2\n */\n static compareArrayPath(path1: Path, path2: Path): number | void {\n let i = 0;\n while (path1.value[i] && path2.value[i]) {\n const index1 = parseInt(path1.value[i]);\n const index2 = parseInt(path2.value[i]);\n\n if (!isNaN(index1) && !isNaN(index2)) {\n return index1 - index2;\n } else if (path1.value[i] !== path2.value[i]) {\n throw new Error(\n `[Form] Path.compareArrayPath invalid input Error: two path should refers to the same array, but got path1: ${path1.toString()}, path2: ${path2.toString()}`\n );\n }\n i++;\n }\n throw new Error(\n `[Form] Path.compareArrayPath invalid input Error: got path1: ${path1.toString()}, path2: ${path2.toString()}`\n );\n }\n\n isChildOrGrandChild(path: string) {\n const target = new Path(path).value;\n const self = this.value;\n\n if (target.length - self.length < 1) {\n return false;\n }\n\n for (let i = 0; i < self.length; i++) {\n if (target[i] !== self[i]) {\n return false;\n }\n }\n return true;\n }\n\n getArrayIndex(parent: Path) {\n return parseInt(this._path[parent.value.length]);\n }\n\n concat(name: number | string) {\n if (typeof name === 'string' || typeof name === 'number') {\n return new Path(this._path.concat(new Path(name.toString())._path));\n }\n throw new Error(\n `[Form] Error in Path.concat: invalid param type, require number or string, but got ${typeof name}`\n );\n }\n\n replaceParent(parent: Path, newParent: Path) {\n if (parent.value.length > this.value.length) {\n throw new Error(\n `[Form] Error in Path.replaceParent: invalid parent param: ${parent}, parent length should not greater than current length.`\n );\n }\n const rest = [];\n for (let i = 0; i < this.value.length; i++) {\n if (i < parent.value.length && parent.value[i] !== this.value[i]) {\n throw new Error(\n `[Form] Error in Path.replaceParent: invalid parent param: '${parent}' is not a parent of '${this.toString()}'`\n );\n }\n if (i >= parent.value.length) {\n rest.push(this.value[i]);\n }\n }\n\n return new Path(newParent.value.concat(rest));\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport * as React from 'react';\n\nimport { isCheckBoxEvent, isReactChangeEvent } from '../utils';\nimport { Field, FieldModelState } from '../types/field';\nimport { ValidateTrigger } from '../types';\nimport { shouldValidate } from './utils';\nimport { FieldModel } from './field-model';\n\nexport function toField<TValue>(model: FieldModel): Field<TValue> {\n const res: Field<TValue> = {\n get name() {\n return model.name;\n },\n get value() {\n return model.value;\n },\n onChange: (e: unknown) => {\n if (isReactChangeEvent(e)) {\n model.value = isCheckBoxEvent(e)\n ? e.target.checked\n : (e as React.ChangeEvent<HTMLInputElement>).target.value;\n } else {\n model.value = e;\n }\n },\n onBlur() {\n if (shouldValidate(ValidateTrigger.onBlur, model.form.validationTrigger)) {\n model.validate();\n }\n },\n onFocus() {\n model.state.isTouched = true;\n },\n } as Field<TValue>;\n\n Object.defineProperty(res, 'key', {\n enumerable: false,\n get() {\n return model.id;\n },\n });\n\n Object.defineProperty(res, '_fieldModel', {\n enumerable: false,\n get() {\n return model;\n },\n });\n return res;\n}\n\nexport function toFieldState(modelState: FieldModelState) {\n return {\n get isTouched() {\n return modelState.isTouched;\n },\n get invalid() {\n return modelState.invalid;\n },\n get isDirty() {\n return modelState.isDirty;\n },\n get isValidating() {\n return modelState.isValidating;\n },\n get errors() {\n if (modelState.errors) {\n return Object.values(modelState.errors).reduce((acc, arr) => acc.concat(arr), []);\n }\n return;\n },\n get warnings() {\n if (modelState.warnings) {\n return Object.values(modelState.warnings).reduce((acc, arr) => acc.concat(arr), []);\n }\n return;\n },\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Form, FormModelState, FormState } from '../types/form';\nimport { FieldName, FieldValue } from '../types/field';\nimport { FormModel } from './form-model';\n\nexport function toForm<TValue>(model: FormModel): Form<TValue> {\n const res = {\n initialValues: model.initialValues,\n get values() {\n return model.values;\n },\n set values(v) {\n model.values = v;\n },\n state: toFormState(model.state),\n getValueIn: <TValue = FieldValue>(name: FieldName) => model.getValueIn(name),\n setValueIn: <TValue>(name: FieldName, value: TValue) => model.setValueIn(name, value),\n validate: model.validate.bind(model),\n };\n\n Object.defineProperty(res, '_formModel', {\n enumerable: false,\n get() {\n return model;\n },\n });\n return res as Form<TValue>;\n}\n\nexport function toFormState(modelState: FormModelState): FormState {\n return {\n get isTouched() {\n return modelState.isTouched;\n },\n get invalid() {\n return modelState.invalid;\n },\n get isDirty() {\n return modelState.isDirty;\n },\n get isValidating() {\n return modelState.isValidating;\n },\n // get dirtyFields() {\n // return modelState.dirtyFields;\n // },\n // get isLoading() {\n // return modelState.isLoading;\n // },\n // get touchedFields() {\n // return modelState.touchedFields;\n // },\n get errors() {\n return modelState.errors;\n },\n get warnings() {\n return modelState.warnings;\n },\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext } from 'react';\n\nimport { FormModel } from '../core/form-model';\nimport { FormModelContext } from './context';\n\nexport function useFormModel(): FormModel {\n return useContext<FormModel>(FormModelContext);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nexport const FormModelContext = React.createContext<any>({});\nexport const FieldModelContext = React.createContext<any>({});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { Children, useEffect, useMemo } from 'react';\n\nimport { isFunction } from 'lodash';\n\nimport { toForm } from 'src/core/to-form';\nimport { FormControl, FormOptions, FormRenderProps } from '../types/form';\nimport { createForm } from '../core/create-form';\nimport { FormModelContext } from './context';\n\nexport type FormProps<TValues> = FormOptions & {\n /**\n * React children or child render prop\n */\n children?: ((props: FormRenderProps<TValues>) => React.ReactNode) | React.ReactNode;\n\n /**\n * If this prop is set to true, Form instance will be kept event thought<Form /> is destroyed.\n * This means you can still use some form's api such as Form.validate and Form.setValueIn to handle pure data logic.\n * @default false\n */\n keepModelOnUnMount?: boolean;\n\n /**\n * provide form instance from outside. if control is given Form will use the form instance in the control instead of creating one.\n */\n control?: FormControl<TValues>;\n};\n\n/**\n * Hoc That init and provide Form instance. You can also provide form instance from outside by using control prop\n * @param props\n */\nexport function Form<TValues>(props: FormProps<TValues>) {\n const { children, keepModelOnUnMount = false, control, ...restOptions } = props;\n const { _formModel: formModel } = useMemo(\n () => (control ? control : createForm(restOptions).control),\n [control]\n );\n\n useEffect(\n () => () => {\n // 组件销毁时,销毁formModel\n if (!keepModelOnUnMount) {\n formModel.dispose();\n }\n },\n []\n );\n\n const form = useMemo(() => toForm<TValues>(formModel), [formModel]);\n\n return (\n <FormModelContext.Provider value={formModel}>\n {children ? (isFunction(children) ? children({ form }) : Children.only(children)) : null}\n </FormModelContext.Provider>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Field, FieldArray } from '../types/field';\nimport { toField } from './to-field';\nimport { FieldArrayModel } from './field-array-model';\n\nexport function toFieldArray<TValue>(model: FieldArrayModel<TValue>): FieldArray<TValue> {\n const res: FieldArray<TValue> = {\n get key() {\n return model.id;\n },\n get name() {\n return model.path.toString();\n },\n get value() {\n return model.value;\n },\n onChange: (value) => {\n model.value = value;\n },\n map: <T = any>(cb: (f: Field<TValue>, index: number) => T) =>\n model.map<T>((f, index) => cb(toField(f), index)),\n append: (value) => toField<TValue>(model.append(value)),\n /**\n * @deprecated: use remove instead\n * @param index\n */\n delete: (index: number) => model.delete(index),\n remove: (index: number) => model.delete(index),\n swap: (from: number, to: number) => model.swap(from, to),\n move: (from: number, to: number) => model.move(from, to),\n } as FieldArray<TValue>;\n\n // Object.defineProperty(res, 'validate', {\n // enumerable: false,\n // get() {\n // return model.validate.bind(model);\n // },\n // });\n\n // 隐藏属性\n Object.defineProperty(res, '_fieldModel', {\n enumerable: false,\n get() {\n return model;\n },\n });\n return res;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { flatten, get } from 'lodash';\nimport { deepEqual } from 'fast-equals';\nimport { Disposable, Emitter } from '@flowgram.ai/utils';\nimport { ReactiveState } from '@flowgram.ai/reactive';\n\nimport { feedbackToFieldErrorsOrWarnings, hasError, toFeedback } from '../utils/validate';\nimport { Glob } from '../utils/glob';\nimport { keepValidKeys } from '../utils';\nimport {\n FormModelState,\n FormOptions,\n FormState,\n OnFormValuesChangePayload,\n OnFormValuesInitPayload,\n OnFormValuesUpdatedPayload,\n} from '../types/form';\nimport { FieldName, FieldValue } from '../types/field';\nimport { Errors, FeedbackLevel, FormValidateReturn, Warnings } from '../types';\nimport { createFormModelState } from '../constants';\nimport { getValidByErrors, mergeFeedbacks } from './utils';\nimport { Store } from './store';\nimport { Path } from './path';\nimport { FieldModel } from './field-model';\nimport { FieldArrayModel } from './field-array-model';\n\nexport class FormModel<TValues = any> implements Disposable {\n protected _fieldMap: Map<string, FieldModel> = new Map();\n\n readonly store = new Store();\n\n protected _options: FormOptions = {};\n\n protected onFieldModelCreateEmitter = new Emitter<FieldModel>();\n\n readonly onFieldModelCreate = this.onFieldModelCreateEmitter.event;\n\n readonly onFormValuesChangeEmitter = new Emitter<OnFormValuesChangePayload>();\n\n readonly onFormValuesChange = this.onFormValuesChangeEmitter.event;\n\n readonly onFormValuesInitEmitter = new Emitter<OnFormValuesInitPayload>();\n\n readonly onFormValuesInit = this.onFormValuesInitEmitter.event;\n\n readonly onFormValuesUpdatedEmitter = new Emitter<OnFormValuesUpdatedPayload>();\n\n readonly onFormValuesUpdated = this.onFormValuesUpdatedEmitter.event;\n\n readonly onValidateEmitter = new Emitter<FormModelState>();\n\n readonly onValidate = this.onValidateEmitter.event;\n\n protected _state: ReactiveState<FormModelState> = new ReactiveState<FormModelState>(\n createFormModelState()\n );\n\n protected _initialized = false;\n\n set fieldMap(map) {\n this._fieldMap = map;\n }\n\n /**\n * 表单初始值,初始化设置后不可修改\n * @protected\n */\n // protected _initialValues?: TValues;\n\n get fieldMap() {\n return this._fieldMap;\n }\n\n get context() {\n return this._options.context;\n }\n\n get initialValues() {\n return this._options.initialValues;\n }\n\n get values() {\n return this.store.values;\n }\n\n set values(v) {\n const prevValues = this.values;\n if (deepEqual(prevValues, v)) {\n return;\n }\n this.store.values = v;\n this.fireOnFormValuesChange({\n values: this.values,\n prevValues,\n name: '',\n });\n }\n\n get validationTrigger() {\n return this._options.validateTrigger;\n }\n\n get state() {\n return this._state.value;\n }\n\n get reactiveState() {\n return this._state;\n }\n\n get fields(): FieldModel[] {\n return Array.from(this.fieldMap.values());\n }\n\n updateState(state: Partial<FormState>) {\n // todo\n }\n\n get initialized() {\n return this._initialized;\n }\n\n fireOnFormValuesChange(payload: OnFormValuesChangePayload) {\n this.onFormValuesChangeEmitter.fire(payload);\n this.onFormValuesUpdatedEmitter.fire(payload);\n }\n\n fireOnFormValuesInit(payload: OnFormValuesInitPayload) {\n this.onFormValuesInitEmitter.fire(payload);\n this.onFormValuesUpdatedEmitter.fire(payload);\n }\n\n init(options: FormOptions<TValues>) {\n this._options = options;\n if (options.initialValues) {\n const prevValues = this.store.values;\n this.store.values = options.initialValues;\n this.fireOnFormValuesInit({\n values: options.initialValues,\n prevValues,\n name: '',\n });\n }\n this._initialized = true;\n }\n\n createField<TValue = FieldValue>(name: FieldName, isArray?: boolean): FieldModel<TValue> {\n const path = new Path(name);\n const pathString = path.toString();\n\n if (this.fieldMap.get(pathString)) {\n return this.fieldMap.get(pathString)!;\n }\n\n // const fieldValue = value || get(this.initialValues, pathString);\n\n const field: FieldModel = isArray\n ? new FieldArrayModel(path, this)\n : new FieldModel(path, this);\n\n this.fieldMap.set(pathString, field);\n field.onDispose(() => {\n this.fieldMap.delete(pathString);\n });\n this.onFieldModelCreateEmitter.fire(field);\n\n return field;\n }\n\n createFieldArray<TValue = FieldValue>(\n name: FieldName,\n value?: Array<TValue>\n ): FieldArrayModel<TValue> {\n return this.createField<Array<TValue>>(name, true) as FieldArrayModel<TValue>;\n }\n\n /**\n * 销毁Field 模型和子模型,但不会删除field的值\n * @param name\n */\n disposeField(name: string) {\n const field = this.fieldMap.get(name);\n if (field) {\n field.dispose();\n }\n }\n\n /**\n * 删除field, 会删除值和 Field 模型, 以及对应的子模型\n * @param name\n */\n deleteField(name: string) {\n const field = this.fieldMap.get(name);\n if (field) {\n // 销毁值\n field.clear();\n // 销毁模型\n field.dispose();\n }\n }\n\n getField<TFieldModel extends FieldModel | FieldArrayModel = FieldModel>(\n name: FieldName\n ): TFieldModel | undefined {\n return this.fieldMap.get(new Path(name).toString()) as TFieldModel | undefined;\n }\n\n getValueIn<TValue>(name: FieldName): TValue {\n return this.store.getIn<TValue>(new Path(name));\n }\n\n setValueIn<TValue>(name: FieldName, value: TValue): void {\n const prevValues = this.values;\n\n this.store.setIn(new Path(name), value);\n\n this.fireOnFormValuesChange({\n values: this.values,\n prevValues,\n name,\n });\n }\n\n setInitValueIn<TValue = any>(name: FieldName, value: TValue): void {\n const path = new Path(name);\n const prevValue = this.store.getIn(path);\n if (prevValue === undefined) {\n const prevValues = this.values;\n this.store.setIn(new Path(name), value);\n this.fireOnFormValuesInit({\n values: this.values,\n prevValues,\n name,\n });\n }\n }\n\n clearValueIn(name: FieldName) {\n this.setValueIn(name, undefined);\n }\n\n async validateIn(name: FieldName) {\n if (!this._options.validate) {\n return;\n }\n\n const validateKeys = Object.keys(this._options.validate).filter((pattern) =>\n Glob.isMatch(pattern, name)\n );\n\n const validatePromises = validateKeys.map(async (validateKey) => {\n const validate = this._options.validate![validateKey];\n\n return validate({\n value: this.getValueIn(name),\n formValues: this.values,\n context: this.context,\n name,\n });\n });\n\n return Promise.all(validatePromises);\n }\n\n async validate(): Promise<FormValidateReturn> {\n if (!this._options.validate) {\n return [];\n }\n\n const feedbacksArrPromises = Object.keys(this._options.validate).map(async (nameRule) => {\n const validate = this._options.validate![nameRule];\n const paths = Glob.findMatchPathsWithEmptyValue(this.values, nameRule);\n return Promise.all(\n paths.map(async (path) => {\n const result = await validate({\n value: get(this.values, path),\n formValues: this.values,\n context: this.context,\n name: path,\n });\n\n const feedback = toFeedback(result, path);\n const field = this.getField(path);\n\n const errors = feedbackToFieldErrorsOrWarnings<Errors>(\n path,\n feedback?.level === FeedbackLevel.Error ? feedback : undefined\n );\n const warnings = feedbackToFieldErrorsOrWarnings<Warnings>(\n path,\n feedback?.level === FeedbackLevel.Warning ? feedback : undefined\n );\n\n if (field) {\n field.state.errors = errors;\n field.state.warnings = warnings;\n field.state.invalid = hasError(errors);\n field.bubbleState();\n }\n\n // 无论是否存在 field 都要保证 form 的state 被更新\n this.state.errors = mergeFeedbacks(this.state.errors, errors);\n this.state.warnings = mergeFeedbacks(this.state.warnings, warnings);\n\n this.state.invalid = !getValidByErrors(this.state.errors);\n return feedback;\n })\n );\n });\n\n this.state.isValidating = true;\n const feedbacksArr = await Promise.all(feedbacksArrPromises);\n this.state.isValidating = false;\n this.onValidateEmitter.fire(this.state);\n\n return flatten(feedbacksArr).filter(Boolean) as FormValidateReturn;\n }\n\n alignStateWithFieldMap() {\n const keys = Array.from(this.fieldMap.keys());\n\n if (this.state.errors) {\n this.state.errors = keepValidKeys(this.state.errors, keys);\n }\n if (this.state.warnings) {\n this.state.warnings = keepValidKeys(this.state.warnings, keys);\n }\n this.fieldMap.forEach((f) => {\n if (f.state.errors) {\n f.state.errors = keepValidKeys(f.state.errors, keys);\n }\n if (f.state.warnings) {\n f.state.warnings = keepValidKeys(f.state.warnings, keys);\n }\n });\n }\n\n dispose() {\n this.fieldMap.forEach((f) => f.dispose());\n this.store.dispose();\n this._initialized = false;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n Errors,\n Feedback,\n FeedbackLevel,\n FieldError,\n FieldName,\n FieldWarning,\n FormErrorOptions,\n FormWarningOptions,\n} from '../types';\n\nexport function toFeedback(\n result: string | FormErrorOptions | FormWarningOptions | undefined,\n name: FieldName\n): FieldError | FieldWarning | undefined {\n if (typeof result === 'string') {\n return {\n name,\n message: result,\n level: FeedbackLevel.Error,\n };\n } else if (result?.message) {\n return {\n ...result,\n name,\n };\n }\n}\n\nexport function feedbackToFieldErrorsOrWarnings<T>(name: string, feedback?: Feedback<any>) {\n return {\n [name]: feedback ? [feedback] : [],\n } as T;\n}\n\nexport const hasError = (errors: Errors) =>\n Object.keys(errors).some((key) => errors[key]?.length > 0);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FieldModelState } from './types/field';\nimport { FormModelState } from './types';\n\nexport const DEFAULT_FIELD_STATE: FieldModelState = {\n invalid: false,\n isDirty: false,\n isTouched: false,\n isValidating: false,\n};\nexport const DEFAULT_FORM_STATE: FormModelState = {\n invalid: false,\n isDirty: false,\n isTouched: false,\n isValidating: false,\n};\n\nexport function createFormModelState(initialState?: Partial<FormModelState>) {\n if (!initialState) {\n return { ...DEFAULT_FORM_STATE };\n }\n return { ...DEFAULT_FORM_STATE, ...initialState };\n}\n\nexport function createFieldModelState(initialState?: Partial<FieldModelState>): FieldModelState {\n if (!initialState) {\n return { ...DEFAULT_FIELD_STATE };\n }\n return { ...DEFAULT_FIELD_STATE, ...initialState };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { get, clone, cloneDeep } from 'lodash';\n\nimport { shallowSetIn } from '../utils';\nimport { FieldValue } from '../types/field';\nimport { Path } from './path';\n\nexport class Store<TValues = FieldValue> {\n protected _values: TValues;\n\n get values(): TValues {\n return clone(this._values);\n }\n\n set values(v) {\n this._values = cloneDeep(v);\n }\n\n setIn<TValue = FieldValue>(path: Path, value: TValue): void {\n // shallow clone set\n this._values = shallowSetIn(this._values || {}, path.toString(), value);\n }\n\n getIn<TValue = FieldValue>(path: Path): TValue {\n return get(this.values, path.value);\n }\n\n dispose() {}\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { nanoid } from 'nanoid';\nimport { get, groupBy, some } from 'lodash';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram.ai/utils';\nimport { ReactiveState } from '@flowgram.ai/reactive';\n\nimport { toFeedback } from '../utils/validate';\nimport { FieldModelState, FieldName, FieldValue, Ref } from '../types/field';\nimport {\n Errors,\n FeedbackLevel,\n FieldError,\n FieldWarning,\n Validate,\n ValidateTrigger,\n Warnings,\n} from '../types';\nimport { createFieldModelState, DEFAULT_FIELD_STATE } from '../constants';\nimport {\n clearFeedbacks,\n FieldEventUtils,\n mergeFeedbacks,\n shouldValidate,\n updateFeedbacksName,\n} from './utils';\nimport { Path } from './path';\nimport { FormModel } from './form-model';\n\ninterface OnValueChangePayload<TValue> {\n value: TValue | undefined;\n prevValue: TValue | undefined;\n formValues: any;\n prevFormValues: any;\n}\n\nexport class FieldModel<TValue extends FieldValue = FieldValue> implements Disposable {\n readonly onValueChangeEmitter = new Emitter<OnValueChangePayload<TValue>>();\n\n readonly form: FormModel;\n\n readonly id: string;\n\n readonly onValueChange = this.onValueChangeEmitter.event;\n\n protected toDispose = new DisposableCollection();\n\n protected _ref?: Ref;\n\n protected _path: Path;\n\n protected _state: ReactiveState<FieldModelState> = new ReactiveState<FieldModelState>(\n createFieldModelState()\n );\n\n /**\n * @deprecated\n * 原用于直接给field 设置validate 逻辑,现将该逻辑放到form._options.validate 中设置,该字段暂时弃用\n */\n originalValidate?: Validate;\n\n protected _renderCount: number = 0;\n\n constructor(path: Path, form: FormModel) {\n this._path = path;\n this.form = form;\n this.id = nanoid();\n\n const changeDisposable = this.form.onFormValuesChange((payload) => {\n const { values, prevValues } = payload;\n if (FieldEventUtils.shouldTriggerFieldChangeEvent(payload, this.name)) {\n this.onValueChangeEmitter.fire({\n value: get(values, this.name),\n prevValue: get(prevValues, this.name),\n formValues: values,\n prevFormValues: prevValues,\n });\n if (\n shouldValidate(ValidateTrigger.onChange, this.form.validationTrigger) &&\n FieldEventUtils.shouldTriggerFieldValidateWhenChange(payload, this.name)\n ) {\n this.validate();\n }\n }\n });\n this.toDispose.push(changeDisposable);\n\n // if (shouldValidate(ValidateTrigger.onChange, this.form.validationTrigger)) {\n // const validateDisposable = this.form.onFormValuesChange(({ name, values, prevValues }) => {\n // /**\n // * Field 值变更时,所有 ancestor 以及所有child 和 grand child 的校验都要触发\n // */\n // if (Glob.isMatchOrParent(this.name, name) || Glob.isMatchOrParent(name, this.name)) {\n // this.validate();\n // }\n // });\n // this.toDispose.push(validateDisposable);\n // }\n\n this.toDispose.push(this.onValueChangeEmitter);\n\n this.initState();\n }\n\n protected _mount: boolean = false;\n\n get renderCount() {\n return this._renderCount;\n }\n\n set renderCount(n: number) {\n this._renderCount = n;\n }\n\n private initState() {\n const initialErrors = get(this.form.state.errors, this.name);\n const initialWarnings = get(this.form.state.warnings, this.name);\n\n if (initialErrors) {\n this.state.errors = {\n [this.name]: initialErrors,\n };\n }\n if (initialWarnings) {\n this.state.warnings = {\n [this.name]: initialWarnings,\n };\n }\n }\n\n get path() {\n return this._path;\n }\n\n get name() {\n return this._path.toString();\n }\n\n set name(name: FieldName) {\n this._path = new Path(name);\n }\n\n get ref() {\n return this._ref;\n }\n\n set ref(ref: Ref | undefined) {\n this._ref = ref;\n }\n\n get state() {\n return this._state.value;\n }\n\n get reactiveState() {\n return this._state;\n }\n\n get value() {\n return this.form.getValueIn(this.name);\n }\n\n set value(value: TValue | undefined) {\n this.form.setValueIn(this.name, value);\n if (!this.state.isTouched) {\n this.state.isTouched = true;\n this.bubbleState();\n }\n }\n\n updateNameForLeafState(newName: string) {\n const { errors, warnings } = this.state;\n const nameInErrors = errors ? Object.keys(errors)?.[0] : undefined;\n if (nameInErrors && errors?.[nameInErrors] && nameInErrors !== newName) {\n this.state.errors = {\n [newName]: errors?.[nameInErrors]\n ? updateFeedbacksName(errors?.[nameInErrors], newName)\n : errors?.[nameInErrors],\n };\n }\n const nameInWarnings = warnings ? Object.keys(warnings)?.[0] : undefined;\n if (nameInWarnings && warnings?.[nameInWarnings] && nameInWarnings !== newName) {\n this.state.warnings = {\n [newName]: warnings?.[nameInWarnings]\n ? updateFeedbacksName(warnings?.[nameInWarnings], newName)\n : warnings?.[nameInWarnings],\n };\n }\n }\n\n // recursiveUpdateName(name: FieldName) {\n // if (this.children?.length) {\n // this.children.forEach(c => {\n // c.recursiveUpdateName(c.path.replaceParent(this.path, new Path(name)).toString());\n // });\n // } else {\n // this.updateNameForLeafState(name);\n // this.bubbleState();\n // }\n // this.name = name;\n // }\n\n /**\n * @deprecated\n * @param validate\n * @param from\n */\n updateValidate(validate: Validate | undefined, from?: 'ui') {\n if (from === 'ui') {\n // todo(heyuan):暂时逻辑: 只在没有全局配置校验时来自ui 的validate 才生效。 后续需要支持多validate合并, ui 和全局的都需要生效\n if (!this.originalValidate) {\n this.originalValidate = validate;\n }\n } else {\n this.originalValidate = validate;\n }\n }\n\n bubbleState() {\n const { errors, warnings } = this.state;\n\n if (this.parent) {\n this.parent.state.isTouched = some(\n this.parent.children.map((c) => c.state.isTouched),\n Boolean\n );\n this.parent.state.invalid = some(\n this.parent.children.map((c) => c.state.invalid),\n Boolean\n );\n this.parent.state.isDirty = some(\n this.parent.children.map((c) => c.state.isDirty),\n Boolean\n );\n this.parent.state.isValidating = some(\n this.parent.children.map((c) => c.state.isValidating),\n Boolean\n );\n this.parent.state.errors = errors\n ? mergeFeedbacks<Errors>(this.parent.state.errors, errors)\n : clearFeedbacks(this.name, this.parent.state.errors);\n this.parent.state.warnings = warnings\n ? mergeFeedbacks<Warnings>(this.parent.state.warnings, warnings)\n : clearFeedbacks(this.name, this.parent.state.warnings);\n\n this.parent.bubbleState();\n return;\n }\n // parent 不存在,则更新form state\n this.form.state.isTouched = some(\n this.form.fields.map((f) => f.state.isTouched),\n Boolean\n );\n this.form.state.invalid = some(\n this.form.fields.map((f) => f.state.invalid),\n Boolean\n );\n this.form.state.isDirty = some(\n this.form.fields.map((f) => f.state.isDirty),\n Boolean\n );\n this.form.state.isValidating = some(\n this.form.fields.map((f) => f.state.isValidating),\n Boolean\n );\n this.form.state.errors = errors\n ? mergeFeedbacks<Errors>(this.form.state.errors, errors)\n : clearFeedbacks(this.name, this.form.state.errors);\n this.form.state.warnings = warnings\n ? mergeFeedbacks<Warnings>(this.form.state.warnings, warnings)\n : clearFeedbacks(this.name, this.form.state.warnings);\n // console.log('>>>> bubble state: ', this.form.state.errors, this.form.state.invalid, this.form.fields.map(f => f.state.invalid))\n }\n\n clearState() {\n this.state.errors = DEFAULT_FIELD_STATE.errors;\n this.state.warnings = DEFAULT_FIELD_STATE.warnings;\n this.state.isTouched = DEFAULT_FIELD_STATE.isTouched;\n this.state.isDirty = DEFAULT_FIELD_STATE.isDirty;\n this.bubbleState();\n }\n\n get children(): FieldModel[] {\n const res: FieldModel[] = [];\n this.form.fieldMap.forEach((field, path: string) => {\n if (this.path.isChild(path)) {\n res.push(field);\n }\n });\n return res;\n }\n\n get parent(): FieldModel | undefined {\n const parentPath = this.path.parent;\n if (!parentPath) {\n return undefined;\n }\n return this.form.fieldMap.get(parentPath.toString());\n }\n\n clear() {\n if (!this.value) {\n return;\n }\n this.value = undefined;\n }\n\n async validate() {\n // 以下代码由于导致arr 配置的校验不触发,暂时注释,支持对父节点配置校验逻辑\n // const children = this.children;\n\n // 如果是非叶子field, 执行children的校验。暂不支持在父级上配校验器\n // if (children?.length) {\n // await Promise.all(this.children.map(c => c.validate()));\n // return;\n // }\n await this.validateSelf();\n }\n\n async validateSelf() {\n this.state.isValidating = true;\n this.bubbleState();\n const { errors, warnings } = await this._runAsyncValidate();\n\n if (errors?.length) {\n this.state.errors = groupBy(errors, 'name');\n this.state.invalid = true;\n } else {\n this.state.errors = { [this.name]: [] };\n this.state.invalid = false;\n }\n\n if (warnings?.length) {\n this.state.warnings = groupBy(warnings, 'name');\n } else {\n this.state.warnings = { [this.name]: [] };\n }\n\n this.state.isValidating = false;\n this.bubbleState();\n this.form.onValidateEmitter.fire(this.form.state);\n }\n\n protected async _runAsyncValidate(): Promise<{\n errors?: FieldError[];\n warnings?: FieldWarning[];\n }> {\n let errors: FieldError[] = [];\n let warnings: FieldWarning[] = [];\n\n const results = await this.form.validateIn(this.name);\n if (!results?.length) {\n return {};\n } else {\n const feedbacks = results.map((result) => toFeedback(result, this.name)).filter(Boolean) as (\n | FieldError\n | FieldWarning\n )[];\n\n if (!feedbacks?.length) {\n return {};\n }\n\n const groupedFeedbacks = groupBy(feedbacks, 'level');\n\n warnings = warnings.concat((groupedFeedbacks[FeedbackLevel.Warning] as FieldWarning[]) || []);\n errors = errors.concat((groupedFeedbacks[FeedbackLevel.Error] as FieldError[]) || []);\n }\n\n return { errors, warnings };\n }\n\n updateState(s: Partial<FieldModel>) {\n // todo\n }\n\n dispose() {\n this.children.map((c) => c.dispose());\n // Do not reset state when field disposed, since it will clear errors and warnings in form model as well.\n // todo: remove following line and related ut after a few weeks test online\n // this.clearState();\n this.toDispose.dispose();\n this.form.fieldMap.delete(this.path.toString());\n }\n\n onDispose(fn: () => void) {\n this.toDispose.onDispose(fn);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport { FieldValue } from '../types';\nimport { Path } from './path';\nimport { FieldModel } from './field-model';\n\nexport class FieldArrayModel<TValue = FieldValue> extends FieldModel<Array<TValue>> {\n protected onAppendEmitter = new Emitter<{\n index: number;\n value: TValue | undefined;\n arrayValue: Array<TValue>;\n }>();\n\n readonly onAppend = this.onAppendEmitter.event;\n\n protected onDeleteEmitter = new Emitter<{\n arrayValue: Array<TValue> | undefined;\n index: number;\n }>();\n\n readonly onDelete = this.onDeleteEmitter.event;\n\n get children() {\n const fields: FieldModel[] = [];\n this.form.fieldMap.forEach((field, name: string) => {\n if (this.path.isChild(name)) {\n fields.push(field);\n }\n });\n\n // 按 index 排序\n return fields.sort((f1, f2) => {\n const p1 = f1.path.value;\n const p2 = f2.path.value;\n const i1 = parseInt(p1[p1.length - 1]);\n const i2 = parseInt(p2[p2.length - 1]);\n return i1 - i2;\n });\n }\n\n map<T>(cb: (f: FieldModel, index: number, arr: FieldModel[]) => T) {\n const fields = (this.value || []).map((v: TValue, i: number) => {\n const pathString = this.path.concat(i).toString();\n let field = this.form.getField(pathString);\n if (!field) {\n field = this.form.createField(pathString);\n }\n return field;\n });\n return fields.map(cb);\n }\n\n append(value?: TValue) {\n const curLength = this.value?.length || 0;\n const newElemPath = this.path.concat(curLength).toString();\n const newElemField = this.form.createField(newElemPath);\n const newArrayValue = this.value ? [...this.value, value] : [value];\n\n const prevFormValues = this.form.values;\n\n // 设置新的数组值并触发事件\n this.form.store.setIn(new Path(this.name), newArrayValue);\n this.form.fireOnFormValuesChange({\n values: this.form.values,\n prevValues: prevFormValues,\n name: this.name,\n options: {\n action: 'array-append',\n indexes: [curLength],\n },\n });\n // 触发新元素的初始值变更\n this.form.fireOnFormValuesInit({\n values: this.form.values,\n prevValues: prevFormValues,\n name: newElemPath,\n });\n\n this.onAppendEmitter.fire({\n value,\n arrayValue: this.value as Array<TValue>,\n index: this.value!.length - 1,\n });\n return newElemField;\n }\n\n /**\n * Delete the element in given index and delete the corresponding FieldModel as well\n * @param index\n */\n delete(index: number) {\n // const field = this.form.getField(name);\n // if (!field) {\n // throw new Error(\n // `[Form] Error in FieldArrayModel.delete: delete failed, no field found for name ${name}`,\n // );\n // }\n // const index = field.path.getArrayIndex(this.path);\n this._splice(index, 1);\n\n this.onDeleteEmitter.fire({ arrayValue: this.value, index });\n }\n\n _splice(start: number, deleteCount = 1) {\n if (start < 0 || deleteCount < 0) {\n throw new Error(\n `[Form] Error in FieldArrayModel.splice: Invalid Params, start and deleteCount should > 0`\n );\n }\n\n if (!this.value || this.value.length === 0 || deleteCount > this.value.length) {\n throw new Error(\n `[Form] Error in FieldArrayModel.splice: delete count exceeds array length, tried to delete ${deleteCount} elements, but array length is ${\n this.value?.length || 0\n }`\n );\n }\n const oldFormValues = this.form.values;\n\n const tempValue = [...this.value];\n tempValue.splice(start, deleteCount);\n\n // 设置数组值并触发事件\n this.form.store.setIn(new Path(this.name), tempValue);\n\n this.form.fireOnFormValuesChange({\n values: this.form.values,\n prevValues: oldFormValues,\n name: this.name,\n options: {\n action: 'array-splice',\n indexes: Array.from({ length: deleteCount }, (_, i) => i + start),\n },\n });\n\n const children = this.children;\n\n // 如果要删除的元素都在数组末端, 直接删除\n if (start + deleteCount >= children.length) {\n for (let i = start; i < children.length; i++) {\n this.form.disposeField(children[i].name);\n }\n }\n\n const toDispose: FieldModel[] = [];\n const newFieldMap = new Map<string, FieldModel>(this.form.fieldMap);\n\n const recursiveHandleChildField = (field: FieldModel, index: number) => {\n if (field.children?.length) {\n field.children.forEach((cField) => {\n recursiveHandleChildField(cField, index);\n });\n }\n // start 以前的项不变\n if (index < start) {\n newFieldMap.set(field.name, field);\n }\n // 要删除的项, 放入toDispose\n else if (index < start + deleteCount) {\n toDispose.push(field);\n }\n // 剩余的项 index 向前移动 {deleteCount} 位, 并触发变更事件\n else {\n const originName = field.name;\n const targetName = field.path\n .replaceParent(this.path.concat(index), this.path.concat(index - deleteCount))\n .toString();\n newFieldMap.set(targetName, field);\n if (!field.children.length) {\n field.updateNameForLeafState(targetName);\n field.bubbleState();\n }\n field.name = targetName;\n\n // 最后 {deleteCount} 项,需要fire 被变更为undefined, 并从 newMap 中删除\n if (index > children.length - deleteCount - 1) {\n newFieldMap.delete(originName);\n }\n }\n };\n\n // 对数组所有子项做删除或 index 移动操作\n children.map((field, index) => {\n recursiveHandleChildField(field, index);\n });\n\n toDispose.forEach((f) => {\n f.dispose();\n });\n this.form.fieldMap = newFieldMap;\n this.form.alignStateWithFieldMap();\n }\n\n swap(from: number, to: number) {\n if (!this.value) {\n return;\n }\n\n if (from < 0 || to < 0 || from > this.value.length - 1 || to > this.value.length - 1) {\n throw new Error(\n `[Form]: FieldArrayModel.swap Error: invalid params 'form' and 'to', form=${from} to=${to}. expect the value between 0 to ${\n length - 1\n }`\n );\n }\n\n const oldFormValues = this.form.values;\n const tempValue = [...this.value];\n\n const fromValue = tempValue[from];\n const toValue = tempValue[to];\n\n tempValue[to] = fromValue;\n tempValue[from] = toValue;\n\n this.form.store.setIn(this.path, tempValue);\n this.form.fireOnFormValuesChange({\n values: this.form.values,\n prevValues: oldFormValues,\n name: this.name,\n options: {\n action: 'array-swap',\n indexes: [from, to],\n },\n });\n\n // swap related FieldModels\n const newFieldMap = new Map<string, FieldModel>(this.form.fieldMap);\n\n const fromFields = this.findAllFieldsAt(from);\n const toFields = this.findAllFieldsAt(to);\n const fromRootPath = this.getPathAt(from);\n const toRootPath = this.getPathAt(to);\n const leafFieldsModified: FieldModel[] = [];\n fromFields.forEach((f) => {\n const newName = f.path.replaceParent(fromRootPath, toRootPath).toString();\n f.name = newName;\n if (!f.children.length) {\n f.updateNameForLeafState(newName);\n leafFieldsModified.push(f);\n }\n newFieldMap.set(newName, f);\n });\n toFields.forEach((f) => {\n const newName = f.path.replaceParent(toRootPath, fromRootPath).toString();\n f.name = newName;\n if (!f.children.length) {\n f.updateNameForLeafState(newName);\n }\n newFieldMap.set(newName, f);\n leafFieldsModified.push(f);\n });\n this.form.fieldMap = newFieldMap;\n leafFieldsModified.forEach((f) => f.bubbleState());\n this.form.alignStateWithFieldMap();\n }\n\n move(from: number, to: number) {\n if (!this.value) {\n return;\n }\n\n if (from < 0 || to < 0 || from > this.value.length - 1 || to > this.value.length - 1) {\n throw new Error(\n `[Form]: FieldArrayModel.move Error: invalid params 'form' and 'to', form=${from} to=${to}. expect the value between 0 to ${\n length - 1\n }`\n );\n }\n\n const tempValue = [...this.value];\n\n const fromValue = tempValue[from];\n\n tempValue.splice(from, 1);\n tempValue.splice(to, 0, fromValue);\n\n this.form.setValueIn(this.name, tempValue);\n\n // todo(fix): should move fields in order to make sure fields' state is also moved\n }\n\n protected insertAt(index: number, value: TValue) {\n if (!this.value) {\n return;\n }\n\n if (index < 0 || index > this.value.length) {\n throw new Error(`[Form]: FieldArrayModel.insertAt Error: index exceeds array boundary`);\n }\n\n const tempValue = [...this.value];\n tempValue.splice(index, 0, value);\n this.form.setValueIn(this.name, tempValue);\n\n // todo: should move field in order to make sure field state is also moved\n }\n\n /**\n * get element path at given index\n * @param index\n * @protected\n */\n protected getPathAt(index: number) {\n return this.path.concat(index);\n }\n\n /**\n * find all fields including child and grandchild fields at given index.\n * @param index\n * @protected\n */\n protected findAllFieldsAt(index: number) {\n const rootPath = this.getPathAt(index);\n const rootPathString = rootPath.toString();\n\n const res: FieldModel[] = this.form.fieldMap.get(rootPathString)\n ? [this.form.fieldMap.get(rootPathString)!]\n : [];\n\n this.form.fieldMap.forEach((field, fieldName) => {\n if (rootPath.isChildOrGrandChild(fieldName)) {\n res.push(field);\n }\n });\n return res;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { CreateFormReturn, FormOptions } from '../types/form';\nimport { Field, FieldArray, FieldName, FieldValue } from '../types';\nimport { toForm } from './to-form';\nimport { toFieldArray } from './to-field-array';\nimport { toField } from './to-field';\nimport { FormModel } from './form-model';\nimport { FieldModel } from './field-model';\nimport { FieldArrayModel } from './field-array-model';\n\n// export interface CreateFormOptions<TValues = any> extends FormOptions<TValues> {\n// parentContainer?: interfaces.Container;\n// }\n\nexport type CreateFormOptions<T = any> = FormOptions<T> & {\n /**\n * 为 true 时,createForm 不会对form 初始化, 用户需要手动调用 control.init()\n * 该配置主要为了解决,用户需要去监听一些form 的初始化事件,那么他需要再配置完监听后再初始化。\n * 该配置默认为 false\n **/\n disableAutoInit?: boolean;\n};\n\nexport function createForm<TValues>(\n options?: CreateFormOptions<TValues>\n): CreateFormReturn<TValues> {\n const { disableAutoInit = false, ...formOptions } = options || {};\n const formModel = new FormModel();\n\n if (!disableAutoInit) {\n formModel.init(formOptions || {});\n }\n\n return {\n form: toForm(formModel),\n control: {\n _formModel: formModel,\n getField: <\n TFieldValue = FieldValue,\n TFieldModel extends Field<TFieldValue> | FieldArray<TFieldValue> = Field\n >(\n name: FieldName\n ) => {\n const fieldModel = formModel.getField(name);\n if (fieldModel) {\n return fieldModel instanceof FieldArrayModel\n ? toFieldArray<TFieldValue>(fieldModel as unknown as FieldArrayModel<TFieldValue>)\n : toField<TFieldValue>(fieldModel as unknown as FieldModel<TFieldValue>);\n }\n },\n init: () => formModel.init(formOptions || {}),\n },\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Form } from '../types';\nimport { toForm } from '../core/to-form';\nimport { useFormModel } from './utils';\n\n/**\n * Get Form instance. It should be use in a child component of <Form />\n */\nexport function useForm(): Form {\n const formModel = useFormModel();\n return toForm(formModel);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/utils';\n\nimport { FieldName, FieldValue } from '../types';\nimport { useFormModel } from './utils';\n\n/**\n * Listen to the field data change and refresh the React component.\n * @param name the field's uniq name (path)\n */\nexport function useWatch<TValue = FieldValue>(name: FieldName): TValue {\n const refresh = useRefresh();\n\n const formModel = useFormModel();\n\n if (!formModel) {\n throw new Error('[Form] error in useWatch, formModel not found');\n }\n\n const value = formModel.getValueIn<TValue>(name);\n\n useEffect(() => {\n const disposable = formModel.onFormValuesUpdated(({ name: updatedName }) => {\n if (updatedName === name) {\n refresh();\n }\n });\n return () => disposable.dispose();\n }, [name, formModel]);\n\n return value;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport * as React from 'react';\n\nimport { isFunction } from 'lodash';\nimport { DisposableCollection, useRefresh } from '@flowgram.ai/utils';\nimport { useReadonlyReactiveState } from '@flowgram.ai/reactive';\n\nimport {\n FieldArrayOptions,\n FieldArrayRenderProps,\n FieldModelState,\n FieldName,\n FieldValue,\n} from '../types/field';\nimport { FormModelState } from '../types';\nimport { toFieldArray } from '../core/to-field-array';\nimport { FieldArrayModel } from '../core/field-array-model';\nimport { toFieldState, toFormState } from '../core';\nimport { useFormModel } from './utils';\nimport { FieldModelContext } from './context';\n\nexport type FieldArrayProps<TValue> = FieldArrayOptions<TValue> & {\n /**\n * A React element or a render prop\n */\n children?: ((props: FieldArrayRenderProps<TValue>) => React.ReactElement) | React.ReactElement;\n /**\n * Dependencies of the current field. If a field name is given in deps, current field will re-render if the given field name data is updated\n */\n deps?: FieldName[];\n};\n\n/**\n * HOC That declare an array field, an FieldArray model will be created when it's rendered. Multiple FieldArray rendering with a same name will link to the same model, which means they shared data、 status and methods\n */\nexport function FieldArray<TValue extends FieldValue>({\n name,\n defaultValue,\n deps,\n render,\n children,\n}: FieldArrayProps<TValue>): React.ReactElement {\n const formModel = useFormModel();\n const fieldModel = React.useMemo(\n () =>\n formModel.getField<FieldArrayModel<TValue>>(name) ||\n (formModel.createFieldArray(name) as FieldArrayModel<any>),\n [name]\n );\n\n const field = React.useMemo(() => toFieldArray<TValue>(fieldModel), [fieldModel]);\n\n const refresh = useRefresh();\n\n const fieldModelState = useReadonlyReactiveState<FieldModelState>(fieldModel.reactiveState);\n const formModelState = useReadonlyReactiveState<FormModelState>(formModel.reactiveState);\n\n const fieldState = toFieldState(fieldModelState);\n const formState = React.useMemo(() => toFormState(formModelState), [formModelState]);\n\n React.useEffect(() => {\n fieldModel.renderCount = fieldModel.renderCount + 1;\n\n if (!formModel.getValueIn(name) !== undefined && defaultValue !== undefined) {\n formModel.setInitValueIn(name, defaultValue);\n refresh();\n }\n\n const disposableCollection = new DisposableCollection();\n\n disposableCollection.push(\n fieldModel.onValueChange(() => {\n refresh();\n })\n );\n\n if (deps) {\n deps.forEach((dep) => {\n const disposable = formModel.getField(dep)?.onValueChange(() => {\n refresh();\n });\n if (disposable) {\n disposableCollection.push(disposable);\n }\n });\n }\n return () => {\n disposableCollection.dispose();\n\n if (fieldModel.renderCount > 1) {\n fieldModel.renderCount = fieldModel.renderCount - 1;\n } else {\n const newFieldModel = formModel.getField(fieldModel.name);\n if (newFieldModel === fieldModel) fieldModel.dispose();\n }\n };\n }, [fieldModel]);\n\n const renderInner = () => {\n if (render && isFunction(render)) {\n // @ts-ignore\n return render({ field, fieldState, formState });\n }\n\n if (isFunction(children)) {\n return children({ field, fieldState, formState });\n }\n return <>Invalid Array render</>;\n };\n\n return (\n <FieldModelContext.Provider value={fieldModel}>{renderInner()}</FieldModelContext.Provider>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext, useEffect } from 'react';\n\nimport { Disposable, useRefresh } from '@flowgram.ai/utils';\n\nimport { Field, FieldArray, FieldName, FieldValue } from '../types';\nimport { toField } from '../core/to-field';\nimport { toFieldArray } from '../core';\nimport { useFormModel } from './utils';\nimport { FieldModelContext } from './context';\n\n/**\n * @deprecated\n * `useField` is deprecated because its return relies on React render. if the Field is not rendered, the return would be\n * undefined. If you simply want to monitor the change of the value of a certain path, please use `useWatch(fieldName)`\n * @param name\n */\nexport function useField<\n TFieldValue = FieldValue,\n TField extends Field<TFieldValue> | FieldArray<TFieldValue> = Field<TFieldValue>\n>(name?: FieldName): TField | undefined {\n const currentFieldModel = useContext(FieldModelContext);\n const formModel = useFormModel();\n const refresh = useRefresh();\n const fieldModel = name ? formModel.getField(name!) : currentFieldModel;\n\n useEffect(() => {\n let disposable: Disposable;\n if (fieldModel) {\n disposable = fieldModel.onValueChange(() => refresh());\n }\n return () => {\n disposable?.dispose();\n };\n }, [fieldModel]);\n\n if (!fieldModel) {\n return undefined;\n }\n\n if (fieldModel.map) {\n return toFieldArray<TFieldValue>(fieldModel) as unknown as TField;\n }\n\n return toField(fieldModel) as unknown as TField;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useObserve } from '@flowgram.ai/reactive';\n\nimport { Form, FormControl, FormState } from '../types';\n\nexport function useFormState(control?: FormControl<any> | Form) {\n // @ts-ignore\n return useObserve<FormState>(control?._formModel.reactiveState.value || ({} as FormState));\n}\n\nexport function useFormErrors(control?: FormControl<any> | Form) {\n // @ts-ignore\n return useObserve<FormState>(control?._formModel.reactiveState.value || ({} as FormState))\n ?.errors;\n}\n\nexport function useFormWarnings(control?: FormControl<any> | Form) {\n // @ts-ignore\n return useObserve<FormState>(control?._formModel.reactiveState.value || ({} as FormState))\n ?.warnings;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useContext } from 'react';\n\nimport { FieldName } from '../types';\nimport { useFormModel } from './utils';\nimport { FieldModelContext } from './context';\n\n/**\n * Get validate method of a field with given name. the returned function could possibly do nothing if the field is not found.\n * The reason could be that the field is not rendered yet or the name given is wrong.\n * @param name\n */\nexport function useFieldValidate(name?: FieldName): () => void {\n const currentFieldModel = useContext(FieldModelContext);\n const formModel = useFormModel();\n\n return useCallback(() => {\n const fieldModel = name ? formModel.getField(name!) : currentFieldModel;\n fieldModel?.validate();\n }, [currentFieldModel]);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext } from 'react';\n\nimport { Field, FieldArray, FieldValue } from '../types';\nimport { toField } from '../core/to-field';\nimport { toFieldArray } from '../core';\nimport { FieldModelContext } from './context';\n\n/**\n * Get the current Field. It should be used in a child component of <Field />, otherwise it throws an error\n */\nexport function useCurrentField<\n TFieldValue = FieldValue,\n TField extends Field<TFieldValue> | FieldArray<TFieldValue> = Field<TFieldValue>\n>(): Field<TFieldValue> | FieldArray<TFieldValue> {\n const fieldModel = useContext(FieldModelContext);\n\n if (!fieldModel) {\n throw new Error(\n `[Form] useCurrentField Error: field not found, make sure that you are using this hook in a child Component of a Field`\n );\n }\n\n return fieldModel.map\n ? (toFieldArray<TFieldValue>(fieldModel) as unknown as FieldArray<TFieldValue>)\n : (toField(fieldModel) as unknown as TField);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext, useMemo } from 'react';\n\nimport { useReadonlyReactiveState } from '@flowgram.ai/reactive';\n\nimport { FieldModelState, FieldState } from '../types';\nimport { toFieldState } from '../core';\nimport { FieldModelContext } from './context';\n\n/**\n * Get the current field state. It should be used in a child component of <Field />, otherwise it throws an error\n */\nexport function useCurrentFieldState(): FieldState {\n const fieldModel = useContext(FieldModelContext);\n\n if (!fieldModel) {\n throw new Error(\n `[Form] useCurrentField Error: field not found, make sure that you are using this hook in a child Component of a Field`\n );\n }\n\n const fieldModelState = useReadonlyReactiveState<FieldModelState>(fieldModel.reactiveState);\n\n return useMemo(() => toFieldState(fieldModelState), [fieldModelState]);\n}\n"],"mappings":"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","names":["React","import_lodash","import_utils","import_lodash","Glob","pattern","isObject","FeedbackLevel","ValidateTrigger","import_lodash","import_lodash","FieldEventUtils","import_react","React","import_react","import_lodash","import_lodash","import_utils","import_reactive","import_lodash","import_lodash","import_utils","import_reactive","import_utils","isArray","React","import_react","import_utils","React","import_lodash","import_utils","import_reactive","import_react","import_utils","import_reactive","import_react","import_react","import_react","import_reactive"]}
|