@schemx/vue 0.1.22 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.js","../../../node_modules/.pnpm/@preact+signals-core@1.14.3/node_modules/@preact/signals-core/dist/signals-core.module.js","../../core/src/reactivity/signal.ts","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/predicate/isSymbol.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/_internal/globalThis.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/function/debounce.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/function/noop.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/predicate/isPrimitive.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/predicate/isTypedArray.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/predicate/isBuffer.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/_internal/getSymbols.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/_internal/getTag.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/_internal/tags.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/object/cloneDeepWith.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/object/cloneDeep.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/object/omit.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/object/pick.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/_internal/isEqualsSameValueZero.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/predicate/isEqualWith.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/predicate/isEqual.mjs","../../core/src/reactivity/fieldSignal.ts","../../core/src/reactivity/fieldSignalMap.ts","../../core/src/reactivity/effect.ts","../../core/src/reactivity/batch.ts","../../core/src/reactivity/signalMap.ts","../../core/src/reactivity/computed.ts","../../core/src/utils/schema.ts","../../core/src/utils/normalize.ts","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/util/toString.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/_internal/toKey.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/util/toPath.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/_internal/isDeepKey.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/object/get.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/predicate/isObject.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/_internal/isIndex.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/_internal/isKey.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/_internal/assignValue.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/object/updateWith.mjs","../../../node_modules/.pnpm/es-toolkit@1.47.1/node_modules/es-toolkit/dist/compat/object/set.mjs","../../core/src/utils/path.ts","../../core/src/utils/async.ts","../../core/src/utils/diff.ts","../../core/src/defaultConfig.ts","../../core/src/validator/validator.ts","../../core/src/validator/defaultRules.ts","../../core/src/registry/rendererRegistry.ts","../../core/src/registry/validatorRegistry.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/polyfill/AsyncStack.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/polyfill/_lib.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/polyfill/Promise.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/polyfill/Events.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/polyfill/Polyfill.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/lib/utils/runInFork.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/lib/AsyncVariable.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/lib/AsyncSnapshot.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/lib/AsyncContext.js","../../../node_modules/.pnpm/simple-async-context@1.0.4/node_modules/simple-async-context/build/index.js","../../core/src/context/createContext.ts","../../core/src/schemxContext.ts","../../core/src/descriptor/createDescriptor.ts","../../core/src/descriptor/helper.ts","../../core/src/compiler/createCompile.ts","../../core/src/createSchemas.ts","../../core/src/scheduler/abortableTaskRunner.ts","../../core/src/field/runtimeState.ts","../../core/src/field/dependenciesEffect.ts","../../core/src/field/dependencyEffect.ts","../../core/src/field/registry.ts","../../core/src/field/validationEffect.ts","../../core/src/lifecycle/lifecycle.ts","../../core/src/node/scope.ts","../../core/src/node/runtimeNode.ts","../../core/src/node/resources.ts","../../core/src/node/runtimeNodeManager.ts","../../core/src/view/viewGraph.ts","../../core/src/view/createViewState.ts","../../core/src/node/runtimeLifecycle.ts","../../core/src/reconciler/commit.ts","../../core/src/reconciler/plan.ts","../../core/src/reconciler/create.ts","../../core/src/scheduler/scheduler.ts","../../core/src/store/store.ts","../../core/src/view/subscribeViewSchemas.ts","../../core/src/createForm.ts","../../core/src/createField.ts","../../core/src/createEffect.ts","../../core/src/createWatch.ts","../src/utils/rendererProvider.ts","../src/utils/rulesProvider.ts","../src/hooks/useForm.ts","../src/hooks/useField.ts","../src/hooks/useWatch.ts","../src/hooks/useEffect.ts","../src/hooks/useDictionary.ts","../src/hooks/useContext.ts","../src/utils/equal.ts","../src/hooks/useStableRef.ts","../src/hooks/useViewSchemas.ts","../src/utils/validation.ts","../src/utils/slot.ts","../src/components/FormGroup/index.tsx","../src/components/FormItem/index.tsx","../src/utils/helpers.ts","../src/form.vue","../src/form.ts","../src/hocs/withRemoteOptions.ts"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","var i=Symbol.for(\"preact-signals\");function t(){if(!(s>1)){var i,t=!1;!function(){var i=c;c=void 0;while(void 0!==i){if(i.S.v===i.v)i.S.i=i.i;i=i.o}}();while(void 0!==h){var n=h;h=void 0;v++;while(void 0!==n){var r=n.u;n.u=void 0;n.f&=-3;if(!(8&n.f)&&w(n))try{n.c()}catch(n){if(!t){i=n;t=!0}}n=r}}v=0;s--;if(t)throw i}else s--}function n(i){if(s>0)return i();e=++u;s++;try{return i()}finally{t()}}var r=void 0;function o(i){var t=r;r=void 0;try{return i()}finally{r=t}}var f,h=void 0,s=0,v=0,u=0,e=0,c=void 0,d=0;function a(i){if(void 0!==r){var t=i.n;if(void 0===t||t.t!==r){t={i:0,S:i,p:r.s,n:void 0,t:r,e:void 0,x:void 0,r:t};if(void 0!==r.s)r.s.n=t;r.s=t;i.n=t;if(32&r.f)i.S(t);return t}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=r.s;t.n=void 0;r.s.n=t;r.s=t}return t}}}function l(i,t){this.v=i;this.i=0;this.n=void 0;this.t=void 0;this.l=0;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}l.prototype.brand=i;l.prototype.h=function(){return!0};l.prototype.S=function(i){var t=this,n=this.t;if(n!==i&&void 0===i.e){i.x=n;this.t=i;if(void 0!==n)n.e=i;else o(function(){var i;null==(i=t.W)||i.call(t)})}};l.prototype.U=function(i){var t=this;if(void 0!==this.t){var n=i.e,r=i.x;if(void 0!==n){n.x=r;i.e=void 0}if(void 0!==r){r.e=n;i.x=void 0}if(i===this.t){this.t=r;if(void 0===r)o(function(){var i;null==(i=t.Z)||i.call(t)})}}};l.prototype.subscribe=function(i){var t=this;return j(function(){var n=t.value;o(function(){return i(n)})},{name:\"sub\"})};l.prototype.valueOf=function(){return this.value};l.prototype.toString=function(){return this.value+\"\"};l.prototype.toJSON=function(){return this.value};l.prototype.peek=function(){var i=this;return o(function(){return i.value})};Object.defineProperty(l.prototype,\"value\",{get:function(){var i=a(this);if(void 0!==i)i.i=this.i;return this.v},set:function(i){if(i!==this.v){if(v>100)throw new Error(\"Cycle detected\");!function(i){if(0!==s&&0===v)if(i.l!==e){i.l=e;c={S:i,v:i.v,i:i.i,o:c}}}(this);this.v=i;this.i++;d++;s++;try{for(var n=this.t;void 0!==n;n=n.x)n.t.N()}finally{t()}}}});function y(i,t){return new l(i,t)}function w(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function _(i){for(var t=i.s;void 0!==t;t=t.n){var n=t.S.n;if(void 0!==n)t.r=n;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break}}}function b(i){var t=i.s,n=void 0;while(void 0!==t){var r=t.p;if(-1===t.i){t.S.U(t);if(void 0!==r)r.n=t.n;if(void 0!==t.n)t.n.p=r}else n=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=r}i.s=n}function p(i,t){l.call(this,void 0,t);this.x=i;this.s=void 0;this.g=d-1;this.f=4}p.prototype=new l;p.prototype.h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===d)return!0;this.g=d;this.f|=1;if(this.i>0&&!w(this)){this.f&=-2;return!0}var i=r;try{_(this);r=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(i){this.v=i;this.f|=16;this.i++}r=i;b(this);this.f&=-2;return!0};p.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t)}l.prototype.S.call(this,i)};p.prototype.U=function(i){if(void 0!==this.t){l.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};p.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N()}};Object.defineProperty(p.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=a(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v}});function g(i,t){return new p(i,t)}function S(i){var n=i.m;i.m=void 0;if(\"function\"==typeof n){s++;var o=r;r=void 0;try{n()}catch(t){i.f&=-2;i.f|=8;m(i);throw t}finally{r=o;t()}}}function m(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;S(i)}function x(i){if(r!==this)throw new Error(\"Out-of-order effect\");b(this);r=i;this.f&=-2;if(8&this.f)m(this);t()}function E(i,t){this.x=i;this.m=void 0;this.s=void 0;this.u=void 0;this.f=32;this.name=null==t?void 0:t.name;if(f)f.push(this)}E.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.m=t}finally{i()}};E.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;S(this);_(this);s++;var i=r;r=this;return x.bind(this,i)};E.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.u=h;h=this}};E.prototype.d=function(){this.f|=8;if(!(1&this.f))m(this)};E.prototype.dispose=function(){this.d()};function j(i,t){var n=new E(i,t);try{n.c()}catch(i){n.d();throw i}var r=n.d.bind(n);r[Symbol.dispose]=r;return r}function C(i){return function(){var t=arguments,r=this;return n(function(){return o(function(){return i.apply(r,[].slice.call(t))})})}}function O(){var i=f;f=[];return function(){var t=f;if(f&&i)i=i.concat(f);f=i;return t}}var k=function(i){for(var t in i){var n=i[t];if(\"function\"==typeof n)i[t]=C(n);else if(\"object\"==typeof n&&null!==n&&!(\"brand\"in n))k(n)}};function T(i){return function(){var t,n,r=O();try{n=i.apply(void 0,[].slice.call(arguments))}catch(i){f=void 0;throw i}finally{t=r()}k(n);n[Symbol.dispose]=C(function(){if(t)for(var i=0;i<t.length;i++)t[i].dispose();t=void 0});return n}}export{p as Computed,E as Effect,l as Signal,C as action,n as batch,g as computed,T as createModel,j as effect,y as signal,o as untracked};//# sourceMappingURL=signals-core.module.js.map\n","/**\n * 框架无关的 reactive signal 门面。\n *\n * 这里完整暴露 `@preact/signals-core` 中 plain signal 的能力,同时保留\n * core 内部已经使用的 `createSignal` 命名。也就是说,调用方既能把它当作\n * 简单的 `{ value, peek() }` 使用,也能使用 signals-core 原生支持的:\n *\n * - `subscribe(fn)` 手动订阅\n * - `name` / `SignalOptions.name` 调试名称\n * - `watched` / `unwatched` 生命周期回调\n * - `valueOf()` / `toString()` / `toJSON()` 值转换\n * - `brand` 标识\n *\n * core 其他模块仍然只从本文件导入类型和工厂,避免直接耦合底层包路径。\n *\n * @module core/reactivity/signal\n */\n\nimport { signal, Signal } from \"@preact/signals-core\"\n\nimport type { DeepReadonly } from \"../types/utils\"\nimport type { ReadonlySignal, SignalOptions } from \"@preact/signals-core\"\n\n/**\n * 深层只读响应式 signal 类型。\n *\n * `DeepSignalReadonly<T>` 表示一个整体上仍然是 readonly signal 的值,\n * 且 `.value` 会通过 `DeepReadonly<T>` 暴露为深层只读数据;同时在对象、\n * 数组或 tuple 的子节点上暴露递归的只读 signal 视图。它是纯类型工具,\n * 不创建运行时代理,也不改变 `createSignal` 的行为。\n *\n * @example\n * ```typescript\n * type UserSignal = DeepSignalReadonly<{\n * name: string\n * profile: { age: number }\n * }>\n *\n * declare const user: UserSignal\n *\n * user.value // DeepReadonly<{ name: string; profile: { age: number } }>\n * user.name.value // string\n * user.profile.age.value // number\n * ```\n *\n * @typeParam T - 原始值类型\n */\nexport type DeepReadonlySignal<T> = ReadonlySignal<DeepReadonly<T>>\n\n/**\n * 创建 reactive signal。\n *\n * @typeParam T - signal 值类型\n * @param value - 初始值\n * @param options - signals-core 原生 signal 配置\n * @returns 可写 reactive signal\n */\nexport function createSignal<T>(value: T, options?: SignalOptions<T>): Signal<T>\n\n/**\n * 创建初始值为 undefined 的 reactive signal。\n *\n * @typeParam T - signal 值类型\n * @param value - 可选初始值\n * @param options - signals-core 原生 signal 配置\n * @returns 可写 reactive signal\n */\nexport function createSignal<T = undefined>(\n value?: T,\n options?: SignalOptions<T | undefined>\n): Signal<T | undefined>\n\n/**\n * `createSignal` overload 的运行时实现。\n *\n * @param value - 可选初始值。\n * @param options - signals-core 原生 signal 配置。\n * @returns 可写 reactive signal。\n */\nexport function createSignal<T>(\n value?: T,\n options?: SignalOptions<T | undefined>\n): Signal<T | undefined> {\n return signal(value, options)\n}\n\nexport { Signal }\nexport type { SignalOptions, ReadonlySignal }\n","//#region src/compat/predicate/isSymbol.ts\n/**\n* Check whether a value is a symbol.\n*\n* This function can also serve as a type predicate in TypeScript, narrowing the type of the argument to `symbol`.\n*\n* @param value The value to check.\n* @returns Returns `true` if `value` is a symbol, else `false`.\n* @example\n* isSymbol(Symbol.iterator);\n* // => true\n*\n* isSymbol('abc');\n* // => false\n*/\nfunction isSymbol(value) {\n\treturn typeof value === \"symbol\" || value instanceof Symbol;\n}\n//#endregion\nexport { isSymbol };\n","//#region src/_internal/globalThis.ts\nconst globalThis_ = typeof globalThis === \"object\" && globalThis || typeof window === \"object\" && window || typeof self === \"object\" && self || typeof global === \"object\" && global || (function() {\n\treturn this;\n})();\n//#endregion\nexport { globalThis_ };\n","//#region src/function/debounce.ts\n/**\n* Creates a debounced function that delays invoking the provided function until after `debounceMs` milliseconds\n* have elapsed since the last time the debounced function was invoked. The debounced function also has a `cancel`\n* method to cancel any pending execution.\n*\n* @template F - The type of function.\n* @param func - The function to debounce.\n* @param debounceMs - The number of milliseconds to delay.\n* @param options - The options object\n* @param options.signal - An optional AbortSignal to cancel the debounced function.\n* @returns A new debounced function with a `cancel` method.\n*\n* @example\n* const debouncedFunction = debounce(() => {\n* console.log('Function executed');\n* }, 1000);\n*\n* // Will log 'Function executed' after 1 second if not called again in that time\n* debouncedFunction();\n*\n* // Will not log anything as the previous call is canceled\n* debouncedFunction.cancel();\n*\n* // With AbortSignal\n* const controller = new AbortController();\n* const signal = controller.signal;\n* const debouncedWithSignal = debounce(() => {\n* console.log('Function executed');\n* }, 1000, { signal });\n*\n* debouncedWithSignal();\n*\n* // Will cancel the debounced function call\n* controller.abort();\n*/\nfunction debounce(func, debounceMs, { signal, edges } = {}) {\n\tlet pendingThis = void 0;\n\tlet pendingArgs = null;\n\tconst leading = edges != null && edges.includes(\"leading\");\n\tconst trailing = edges == null || edges.includes(\"trailing\");\n\tconst invoke = () => {\n\t\tif (pendingArgs !== null) {\n\t\t\tfunc.apply(pendingThis, pendingArgs);\n\t\t\tpendingThis = void 0;\n\t\t\tpendingArgs = null;\n\t\t}\n\t};\n\tconst onTimerEnd = () => {\n\t\tif (trailing) invoke();\n\t\tcancel();\n\t};\n\tlet timeoutId = null;\n\tconst schedule = () => {\n\t\tif (timeoutId != null) clearTimeout(timeoutId);\n\t\ttimeoutId = setTimeout(() => {\n\t\t\ttimeoutId = null;\n\t\t\tonTimerEnd();\n\t\t}, debounceMs);\n\t};\n\tconst cancelTimer = () => {\n\t\tif (timeoutId !== null) {\n\t\t\tclearTimeout(timeoutId);\n\t\t\ttimeoutId = null;\n\t\t}\n\t};\n\tconst cancel = () => {\n\t\tcancelTimer();\n\t\tpendingThis = void 0;\n\t\tpendingArgs = null;\n\t};\n\tconst flush = () => {\n\t\tinvoke();\n\t};\n\tconst debounced = function(...args) {\n\t\tif (signal?.aborted) return;\n\t\tpendingThis = this;\n\t\tpendingArgs = args;\n\t\tconst isFirstCall = timeoutId == null;\n\t\tschedule();\n\t\tif (leading && isFirstCall) invoke();\n\t};\n\tdebounced.schedule = schedule;\n\tdebounced.cancel = cancel;\n\tdebounced.flush = flush;\n\tsignal?.addEventListener(\"abort\", cancel, { once: true });\n\treturn debounced;\n}\n//#endregion\nexport { debounce };\n","//#region src/function/noop.ts\n/**\n* A no-operation function that does nothing.\n* This can be used as a placeholder or default function.\n*\n* @example\n* noop(); // Does nothing\n*\n* @returns This function does not return anything.\n*/\nfunction noop() {}\n//#endregion\nexport { noop };\n","//#region src/predicate/isPrimitive.ts\n/**\n* Checks whether a value is a JavaScript primitive.\n* JavaScript primitives include null, undefined, strings, numbers, booleans, symbols, and bigints.\n*\n* @param value The value to check.\n* @returns Returns true if `value` is a primitive, false otherwise.\n*\n* @example\n* isPrimitive(null); // true\n* isPrimitive(undefined); // true\n* isPrimitive('123'); // true\n* isPrimitive(false); // true\n* isPrimitive(true); // true\n* isPrimitive(Symbol('a')); // true\n* isPrimitive(123n); // true\n* isPrimitive({}); // false\n* isPrimitive(new Date()); // false\n* isPrimitive(new Map()); // false\n* isPrimitive(new Set()); // false\n* isPrimitive([1, 2, 3]); // false\n*/\nfunction isPrimitive(value) {\n\treturn value == null || typeof value !== \"object\" && typeof value !== \"function\";\n}\n//#endregion\nexport { isPrimitive };\n","//#region src/predicate/isTypedArray.ts\n/**\n* Checks if a value is a TypedArray.\n* @param x The value to check.\n* @returns Returns true if `x` is a TypedArray, false otherwise.\n*\n* @example\n* const arr = new Uint8Array([1, 2, 3]);\n* isTypedArray(arr); // true\n*\n* const regularArray = [1, 2, 3];\n* isTypedArray(regularArray); // false\n*\n* const buffer = new ArrayBuffer(16);\n* isTypedArray(buffer); // false\n*/\nfunction isTypedArray(x) {\n\treturn ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n//#endregion\nexport { isTypedArray };\n","import { globalThis_ } from \"../_internal/globalThis.mjs\";\n//#region src/predicate/isBuffer.ts\n/**\n* Checks if the given value is a Buffer instance.\n*\n* This function tests whether the provided value is an instance of Buffer.\n* It returns `true` if the value is a Buffer, and `false` otherwise.\n*\n* This function can also serve as a type predicate in TypeScript, narrowing the type of the argument to `Buffer`.\n*\n* @param x - The value to check if it is a Buffer.\n* @returns Returns `true` if `x` is a Buffer, else `false`.\n*\n* @example\n* const buffer = Buffer.from(\"test\");\n* console.log(isBuffer(buffer)); // true\n*\n* const notBuffer = \"not a buffer\";\n* console.log(isBuffer(notBuffer)); // false\n*/\nfunction isBuffer(x) {\n\treturn typeof globalThis_.Buffer !== \"undefined\" && globalThis_.Buffer.isBuffer(x);\n}\n//#endregion\nexport { isBuffer };\n","//#region src/compat/_internal/getSymbols.ts\nfunction getSymbols(object) {\n\treturn Object.getOwnPropertySymbols(object).filter((symbol) => Object.prototype.propertyIsEnumerable.call(object, symbol));\n}\n//#endregion\nexport { getSymbols };\n","//#region src/compat/_internal/getTag.ts\n/**\n* Gets the `toStringTag` of `value`.\n*\n* @private\n* @param {T} value The value to query.\n* @returns {string} Returns the `Object.prototype.toString.call` result.\n*/\nfunction getTag(value) {\n\tif (value == null) return value === void 0 ? \"[object Undefined]\" : \"[object Null]\";\n\treturn Object.prototype.toString.call(value);\n}\n//#endregion\nexport { getTag };\n","//#region src/compat/_internal/tags.ts\nconst regexpTag = \"[object RegExp]\";\nconst stringTag = \"[object String]\";\nconst numberTag = \"[object Number]\";\nconst booleanTag = \"[object Boolean]\";\nconst argumentsTag = \"[object Arguments]\";\nconst symbolTag = \"[object Symbol]\";\nconst dateTag = \"[object Date]\";\nconst mapTag = \"[object Map]\";\nconst setTag = \"[object Set]\";\nconst arrayTag = \"[object Array]\";\nconst functionTag = \"[object Function]\";\nconst arrayBufferTag = \"[object ArrayBuffer]\";\nconst objectTag = \"[object Object]\";\nconst errorTag = \"[object Error]\";\nconst dataViewTag = \"[object DataView]\";\nconst uint8ArrayTag = \"[object Uint8Array]\";\nconst uint8ClampedArrayTag = \"[object Uint8ClampedArray]\";\nconst uint16ArrayTag = \"[object Uint16Array]\";\nconst uint32ArrayTag = \"[object Uint32Array]\";\nconst bigUint64ArrayTag = \"[object BigUint64Array]\";\nconst int8ArrayTag = \"[object Int8Array]\";\nconst int16ArrayTag = \"[object Int16Array]\";\nconst int32ArrayTag = \"[object Int32Array]\";\nconst bigInt64ArrayTag = \"[object BigInt64Array]\";\nconst float32ArrayTag = \"[object Float32Array]\";\nconst float64ArrayTag = \"[object Float64Array]\";\n//#endregion\nexport { argumentsTag, arrayBufferTag, arrayTag, bigInt64ArrayTag, bigUint64ArrayTag, booleanTag, dataViewTag, dateTag, errorTag, float32ArrayTag, float64ArrayTag, functionTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag };\n","import { isPrimitive } from \"../predicate/isPrimitive.mjs\";\nimport { isTypedArray } from \"../predicate/isTypedArray.mjs\";\nimport { getSymbols } from \"../compat/_internal/getSymbols.mjs\";\nimport { getTag } from \"../compat/_internal/getTag.mjs\";\nimport { argumentsTag, arrayBufferTag, arrayTag, booleanTag, dataViewTag, dateTag, float32ArrayTag, float64ArrayTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag } from \"../compat/_internal/tags.mjs\";\nimport { isBuffer } from \"../predicate/isBuffer.mjs\";\n//#region src/object/cloneDeepWith.ts\n/**\n* Deeply clones the given object.\n*\n* You can customize the deep cloning process using the `cloneValue` function.\n* The function takes the current value `value`, the property name `key`, and the entire object `obj` as arguments.\n* If the function returns a value, that value is used;\n* if it returns `undefined`, the default cloning method is used.\n*\n* @template T - The type of the object.\n* @param obj - The object to clone.\n* @param [cloneValue] - A function to customize the cloning process.\n* @returns A deep clone of the given object.\n*\n* @example\n* // Clone a primitive value\n* const num = 29;\n* const clonedNum = cloneDeepWith(num);\n* console.log(clonedNum); // 29\n* console.log(clonedNum === num); // true\n*\n* @example\n* // Clone an object with a customizer\n* const obj = { a: 1, b: 2 };\n* const clonedObj = cloneDeepWith(obj, (value) => {\n* if (typeof value === 'number') {\n* return value * 2; // Double the number\n* }\n* });\n* console.log(clonedObj); // { a: 2, b: 4 }\n* console.log(clonedObj === obj); // false\n*\n* @example\n* // Clone an array with a customizer\n* const arr = [1, 2, 3];\n* const clonedArr = cloneDeepWith(arr, (value) => {\n* return value + 1; // Increment each value\n* });\n* console.log(clonedArr); // [2, 3, 4]\n* console.log(clonedArr === arr); // false\n*/\nfunction cloneDeepWith(obj, cloneValue) {\n\treturn cloneDeepWithImpl(obj, void 0, obj, /* @__PURE__ */ new Map(), cloneValue);\n}\nfunction cloneDeepWithImpl(valueToClone, keyToClone, objectToClone, stack = /* @__PURE__ */ new Map(), cloneValue = void 0) {\n\tconst cloned = cloneValue?.(valueToClone, keyToClone, objectToClone, stack);\n\tif (cloned !== void 0) return cloned;\n\tif (isPrimitive(valueToClone)) return valueToClone;\n\tif (stack.has(valueToClone)) return stack.get(valueToClone);\n\tif (Array.isArray(valueToClone)) {\n\t\tconst result = new Array(valueToClone.length);\n\t\tstack.set(valueToClone, result);\n\t\tfor (let i = 0; i < valueToClone.length; i++) result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n\t\tif (Object.hasOwn(valueToClone, \"index\")) result.index = valueToClone.index;\n\t\tif (Object.hasOwn(valueToClone, \"input\")) result.input = valueToClone.input;\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Date) return new Date(valueToClone.getTime());\n\tif (valueToClone instanceof RegExp) {\n\t\tconst result = new RegExp(valueToClone.source, valueToClone.flags);\n\t\tresult.lastIndex = valueToClone.lastIndex;\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Map) {\n\t\tconst result = /* @__PURE__ */ new Map();\n\t\tstack.set(valueToClone, result);\n\t\tfor (const [key, value] of valueToClone) result.set(key, cloneDeepWithImpl(value, key, objectToClone, stack, cloneValue));\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Set) {\n\t\tconst result = /* @__PURE__ */ new Set();\n\t\tstack.set(valueToClone, result);\n\t\tfor (const value of valueToClone) result.add(cloneDeepWithImpl(value, void 0, objectToClone, stack, cloneValue));\n\t\treturn result;\n\t}\n\tif (isBuffer(valueToClone)) return valueToClone.subarray();\n\tif (isTypedArray(valueToClone)) {\n\t\tconst result = new (Object.getPrototypeOf(valueToClone)).constructor(valueToClone.length);\n\t\tstack.set(valueToClone, result);\n\t\tfor (let i = 0; i < valueToClone.length; i++) result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof ArrayBuffer || typeof SharedArrayBuffer !== \"undefined\" && valueToClone instanceof SharedArrayBuffer) return valueToClone.slice(0);\n\tif (valueToClone instanceof DataView) {\n\t\tconst result = new DataView(valueToClone.buffer.slice(0), valueToClone.byteOffset, valueToClone.byteLength);\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (typeof File !== \"undefined\" && valueToClone instanceof File) {\n\t\tconst result = new File([valueToClone], valueToClone.name, { type: valueToClone.type });\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (typeof Blob !== \"undefined\" && valueToClone instanceof Blob) {\n\t\tconst result = new Blob([valueToClone], { type: valueToClone.type });\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Error) {\n\t\tconst result = structuredClone(valueToClone);\n\t\tstack.set(valueToClone, result);\n\t\tresult.message = valueToClone.message;\n\t\tresult.name = valueToClone.name;\n\t\tresult.stack = valueToClone.stack;\n\t\tresult.cause = valueToClone.cause;\n\t\tresult.constructor = valueToClone.constructor;\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Boolean) {\n\t\tconst result = new Boolean(valueToClone.valueOf());\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Number) {\n\t\tconst result = new Number(valueToClone.valueOf());\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof String) {\n\t\tconst result = new String(valueToClone.valueOf());\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (typeof valueToClone === \"object\" && isCloneableObject(valueToClone)) {\n\t\tconst result = Object.create(Object.getPrototypeOf(valueToClone));\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\treturn valueToClone;\n}\nfunction copyProperties(target, source, objectToClone = target, stack, cloneValue) {\n\tconst keys = [...Object.keys(source), ...getSymbols(source)];\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(target, key);\n\t\tif (descriptor == null || descriptor.writable) target[key] = cloneDeepWithImpl(source[key], key, objectToClone, stack, cloneValue);\n\t}\n}\nfunction isCloneableObject(object) {\n\tswitch (getTag(object)) {\n\t\tcase argumentsTag:\n\t\tcase arrayTag:\n\t\tcase arrayBufferTag:\n\t\tcase dataViewTag:\n\t\tcase booleanTag:\n\t\tcase dateTag:\n\t\tcase float32ArrayTag:\n\t\tcase float64ArrayTag:\n\t\tcase int8ArrayTag:\n\t\tcase int16ArrayTag:\n\t\tcase int32ArrayTag:\n\t\tcase mapTag:\n\t\tcase numberTag:\n\t\tcase objectTag:\n\t\tcase regexpTag:\n\t\tcase setTag:\n\t\tcase stringTag:\n\t\tcase symbolTag:\n\t\tcase uint8ArrayTag:\n\t\tcase uint8ClampedArrayTag:\n\t\tcase uint16ArrayTag:\n\t\tcase uint32ArrayTag: return true;\n\t\tdefault: return false;\n\t}\n}\n//#endregion\nexport { cloneDeepWith, cloneDeepWithImpl, copyProperties };\n","import { cloneDeepWithImpl } from \"./cloneDeepWith.mjs\";\n//#region src/object/cloneDeep.ts\n/**\n* Creates a deep clone of the given object.\n*\n* @template T - The type of the object.\n* @param obj - The object to clone.\n* @returns A deep clone of the given object.\n*\n* @example\n* // Clone a primitive value\n* const num = 29;\n* const clonedNum = cloneDeep(num);\n* console.log(clonedNum); // 29\n* console.log(clonedNum === num); // true\n*\n* @example\n* // Clone an array\n* const arr = [1, 2, 3];\n* const clonedArr = cloneDeep(arr);\n* console.log(clonedArr); // [1, 2, 3]\n* console.log(clonedArr === arr); // false\n*\n* @example\n* // Clone an array with nested objects\n* const arr = [1, { a: 1 }, [1, 2, 3]];\n* const clonedArr = cloneDeep(arr);\n* arr[1].a = 2;\n* console.log(arr); // [1, { a: 2 }, [1, 2, 3]]\n* console.log(clonedArr); // [1, { a: 1 }, [1, 2, 3]]\n* console.log(clonedArr === arr); // false\n*\n* @example\n* // Clone an object\n* const obj = { a: 1, b: 'es-toolkit', c: [1, 2, 3] };\n* const clonedObj = cloneDeep(obj);\n* console.log(clonedObj); // { a: 1, b: 'es-toolkit', c: [1, 2, 3] }\n* console.log(clonedObj === obj); // false\n*\n* @example\n* // Clone an object with nested objects\n* const obj = { a: 1, b: { c: 1 } };\n* const clonedObj = cloneDeep(obj);\n* obj.b.c = 2;\n* console.log(obj); // { a: 1, b: { c: 2 } }\n* console.log(clonedObj); // { a: 1, b: { c: 1 } }\n* console.log(clonedObj === obj); // false\n*/\nfunction cloneDeep(obj) {\n\treturn cloneDeepWithImpl(obj, void 0, obj, /* @__PURE__ */ new Map(), void 0);\n}\n//#endregion\nexport { cloneDeep };\n","//#region src/predicate/isPlainObject.ts\n/**\n* Checks if a given value is a plain object.\n*\n* @param value - The value to check.\n* @returns True if the value is a plain object, otherwise false.\n*\n* @example\n* ```typescript\n* // ✅👇 True\n*\n* isPlainObject({ }); // ✅\n* isPlainObject({ key: 'value' }); // ✅\n* isPlainObject({ key: new Date() }); // ✅\n* isPlainObject(new Object()); // ✅\n* isPlainObject(Object.create(null)); // ✅\n* isPlainObject({ nested: { key: true} }); // ✅\n* isPlainObject(new Proxy({}, {})); // ✅\n* isPlainObject({ [Symbol('tag')]: 'A' }); // ✅\n*\n* // ✅👇 (cross-realms, node context, workers, ...)\n* const runInNewContext = await import('node:vm').then(\n* (mod) => mod.runInNewContext\n* );\n* isPlainObject(runInNewContext('({})')); // ✅\n*\n* // ❌👇 False\n*\n* class Test { };\n* isPlainObject(new Test()) // ❌\n* isPlainObject(10); // ❌\n* isPlainObject(null); // ❌\n* isPlainObject('hello'); // ❌\n* isPlainObject([]); // ❌\n* isPlainObject(new Date()); // ❌\n* isPlainObject(new Uint8Array([1])); // ❌\n* isPlainObject(Buffer.from('ABC')); // ❌\n* isPlainObject(Promise.resolve({})); // ❌\n* isPlainObject(Object.create({})); // ❌\n* isPlainObject(new (class Cls {})); // ❌\n* isPlainObject(globalThis); // ❌,\n* ```\n*/\nfunction isPlainObject(value) {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst proto = Object.getPrototypeOf(value);\n\tif (!(proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null)) return false;\n\treturn Object.prototype.toString.call(value) === \"[object Object]\";\n}\n//#endregion\nexport { isPlainObject };\n","//#region src/_internal/isUnsafeProperty.ts\n/**\n* Checks if a property key is unsafe to modify directly.\n*\n* This function is used in functions like `merge` to prevent prototype pollution attacks\n* by identifying property keys that could modify the object's prototype chain or constructor.\n*\n* @param key - The property key to check\n* @returns `true` if the property is unsafe to modify directly, `false` otherwise\n* @internal\n*/\nfunction isUnsafeProperty(key) {\n\treturn key === \"__proto__\";\n}\n//#endregion\nexport { isUnsafeProperty };\n","//#region src/object/omit.ts\n/**\n* Creates a new object with specified keys omitted.\n*\n* This function takes an object and an array of keys, and returns a new object that\n* excludes the properties corresponding to the specified keys.\n*\n* @template T - The type of object.\n* @template K - The type of keys in object.\n* @param obj - The object to omit keys from.\n* @param keys - An array of keys to be omitted from the object.\n* @returns A new object with the specified keys omitted.\n*\n* @example\n* const obj = { a: 1, b: 2, c: 3 };\n* const result = omit(obj, ['b', 'c']);\n* // result will be { a: 1 }\n*/\nfunction omit(obj, keys) {\n\tconst result = { ...obj };\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tdelete result[key];\n\t}\n\treturn result;\n}\n//#endregion\nexport { omit };\n","//#region src/object/pick.ts\n/**\n* Creates a new object composed of the picked object properties.\n*\n* This function takes an object and an array of keys, and returns a new object that\n* includes only the properties corresponding to the specified keys.\n*\n* @template T - The type of object.\n* @template K - The type of keys in object.\n* @param obj - The object to pick keys from.\n* @param keys - An array of keys to be picked from the object.\n* @returns A new object with the specified keys picked.\n*\n* @example\n* const obj = { a: 1, b: 2, c: 3 };\n* const result = pick(obj, ['a', 'c']);\n* // result will be { a: 1, c: 3 }\n*/\nfunction pick(obj, keys) {\n\tconst result = {};\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tif (Object.hasOwn(obj, key)) result[key] = obj[key];\n\t}\n\treturn result;\n}\n//#endregion\nexport { pick };\n","//#region src/_internal/isEqualsSameValueZero.ts\n/**\n* Performs a `SameValueZero` comparison between two values to determine if they are equivalent.\n*\n* @param {any} value - The value to compare.\n* @param {any} other - The other value to compare.\n* @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n*\n* @example\n* eq(1, 1); // true\n* eq(0, -0); // true\n* eq(NaN, NaN); // true\n* eq('a', Object('a')); // false\n*/\nfunction isEqualsSameValueZero(value, other) {\n\treturn value === other || Number.isNaN(value) && Number.isNaN(other);\n}\n//#endregion\nexport { isEqualsSameValueZero };\n","import { getSymbols } from \"../compat/_internal/getSymbols.mjs\";\nimport { getTag } from \"../compat/_internal/getTag.mjs\";\nimport { arrayBufferTag, arrayTag, bigInt64ArrayTag, bigUint64ArrayTag, booleanTag, dataViewTag, dateTag, errorTag, float32ArrayTag, float64ArrayTag, functionTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag } from \"../compat/_internal/tags.mjs\";\nimport { isBuffer } from \"./isBuffer.mjs\";\nimport { isPlainObject } from \"./isPlainObject.mjs\";\nimport { isEqualsSameValueZero } from \"../_internal/isEqualsSameValueZero.mjs\";\nimport \"../compat/util/eq.mjs\";\n//#region src/predicate/isEqualWith.ts\n/**\n* Compares two values for equality using a custom comparison function.\n*\n* The custom function allows for fine-tuned control over the comparison process. If it returns a boolean, that result determines the equality. If it returns undefined, the function falls back to the default equality comparison.\n*\n* This function also uses the custom equality function to compare values inside objects,\n* arrays, maps, sets, and other complex structures, ensuring a deep comparison.\n*\n* This approach provides flexibility in handling complex comparisons while maintaining efficient default behavior for simpler cases.\n*\n* The custom comparison function can take up to six parameters:\n* - `x`: The value from the first object `a`.\n* - `y`: The value from the second object `b`.\n* - `property`: The property key used to get `x` and `y`.\n* - `xParent`: The parent of the first value `x`.\n* - `yParent`: The parent of the second value `y`.\n* - `stack`: An internal stack (Map) to handle circular references.\n*\n* @param a - The first value to compare.\n* @param b - The second value to compare.\n* @param areValuesEqual - A function to customize the comparison.\n* If it returns a boolean, that result will be used. If it returns undefined,\n* the default equality comparison will be used.\n* @returns `true` if the values are equal according to the customizer, otherwise `false`.\n*\n* @example\n* const customizer = (a, b) => {\n* if (typeof a === 'string' && typeof b === 'string') {\n* return a.toLowerCase() === b.toLowerCase();\n* }\n* };\n* isEqualWith('Hello', 'hello', customizer); // true\n* isEqualWith({ a: 'Hello' }, { a: 'hello' }, customizer); // true\n* isEqualWith([1, 2, 3], [1, 2, 3], customizer); // true\n*/\nfunction isEqualWith(a, b, areValuesEqual) {\n\treturn isEqualWithImpl(a, b, void 0, void 0, void 0, void 0, areValuesEqual);\n}\nfunction isEqualWithImpl(a, b, property, aParent, bParent, stack, areValuesEqual) {\n\tconst result = areValuesEqual(a, b, property, aParent, bParent, stack);\n\tif (result !== void 0) return result;\n\tif (typeof a === typeof b) switch (typeof a) {\n\t\tcase \"bigint\":\n\t\tcase \"string\":\n\t\tcase \"boolean\":\n\t\tcase \"symbol\":\n\t\tcase \"undefined\": return a === b;\n\t\tcase \"number\": return a === b || Object.is(a, b);\n\t\tcase \"function\": return a === b;\n\t\tcase \"object\": return areObjectsEqual(a, b, stack, areValuesEqual);\n\t}\n\treturn areObjectsEqual(a, b, stack, areValuesEqual);\n}\nfunction areObjectsEqual(a, b, stack, areValuesEqual) {\n\tif (Object.is(a, b)) return true;\n\tlet aTag = getTag(a);\n\tlet bTag = getTag(b);\n\tif (aTag === \"[object Arguments]\") aTag = objectTag;\n\tif (bTag === \"[object Arguments]\") bTag = objectTag;\n\tif (aTag !== bTag) return false;\n\tswitch (aTag) {\n\t\tcase stringTag: return a.toString() === b.toString();\n\t\tcase numberTag: return isEqualsSameValueZero(a.valueOf(), b.valueOf());\n\t\tcase booleanTag:\n\t\tcase dateTag:\n\t\tcase symbolTag: return Object.is(a.valueOf(), b.valueOf());\n\t\tcase regexpTag: return a.source === b.source && a.flags === b.flags;\n\t\tcase functionTag: return a === b;\n\t}\n\tstack = stack ?? /* @__PURE__ */ new Map();\n\tconst aStack = stack.get(a);\n\tconst bStack = stack.get(b);\n\tif (aStack != null && bStack != null) return aStack === b;\n\tstack.set(a, b);\n\tstack.set(b, a);\n\ttry {\n\t\tswitch (aTag) {\n\t\t\tcase mapTag:\n\t\t\t\tif (a.size !== b.size) return false;\n\t\t\t\tfor (const [key, value] of a.entries()) if (!b.has(key) || !isEqualWithImpl(value, b.get(key), key, a, b, stack, areValuesEqual)) return false;\n\t\t\t\treturn true;\n\t\t\tcase setTag: {\n\t\t\t\tif (a.size !== b.size) return false;\n\t\t\t\tconst aValues = Array.from(a.values());\n\t\t\t\tconst bValues = Array.from(b.values());\n\t\t\t\tfor (let i = 0; i < aValues.length; i++) {\n\t\t\t\t\tconst aValue = aValues[i];\n\t\t\t\t\tconst index = bValues.findIndex((bValue) => {\n\t\t\t\t\t\treturn isEqualWithImpl(aValue, bValue, void 0, a, b, stack, areValuesEqual);\n\t\t\t\t\t});\n\t\t\t\t\tif (index === -1) return false;\n\t\t\t\t\tbValues.splice(index, 1);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcase arrayTag:\n\t\t\tcase uint8ArrayTag:\n\t\t\tcase uint8ClampedArrayTag:\n\t\t\tcase uint16ArrayTag:\n\t\t\tcase uint32ArrayTag:\n\t\t\tcase bigUint64ArrayTag:\n\t\t\tcase int8ArrayTag:\n\t\t\tcase int16ArrayTag:\n\t\t\tcase int32ArrayTag:\n\t\t\tcase bigInt64ArrayTag:\n\t\t\tcase float32ArrayTag:\n\t\t\tcase float64ArrayTag:\n\t\t\t\tif (isBuffer(a) !== isBuffer(b)) return false;\n\t\t\t\tif (a.length !== b.length) return false;\n\t\t\t\tfor (let i = 0; i < a.length; i++) if (!isEqualWithImpl(a[i], b[i], i, a, b, stack, areValuesEqual)) return false;\n\t\t\t\treturn true;\n\t\t\tcase arrayBufferTag:\n\t\t\t\tif (a.byteLength !== b.byteLength) return false;\n\t\t\t\treturn areObjectsEqual(new Uint8Array(a), new Uint8Array(b), stack, areValuesEqual);\n\t\t\tcase dataViewTag:\n\t\t\t\tif (a.byteLength !== b.byteLength || a.byteOffset !== b.byteOffset) return false;\n\t\t\t\treturn areObjectsEqual(new Uint8Array(a), new Uint8Array(b), stack, areValuesEqual);\n\t\t\tcase errorTag: return a.name === b.name && a.message === b.message;\n\t\t\tcase objectTag: {\n\t\t\t\tif (!(areObjectsEqual(a.constructor, b.constructor, stack, areValuesEqual) || isPlainObject(a) && isPlainObject(b))) return false;\n\t\t\t\tconst aKeys = [...Object.keys(a), ...getSymbols(a)];\n\t\t\t\tconst bKeys = [...Object.keys(b), ...getSymbols(b)];\n\t\t\t\tif (aKeys.length !== bKeys.length) return false;\n\t\t\t\tfor (let i = 0; i < aKeys.length; i++) {\n\t\t\t\t\tconst propKey = aKeys[i];\n\t\t\t\t\tconst aProp = a[propKey];\n\t\t\t\t\tif (!Object.hasOwn(b, propKey)) return false;\n\t\t\t\t\tconst bProp = b[propKey];\n\t\t\t\t\tif (!isEqualWithImpl(aProp, bProp, propKey, a, b, stack, areValuesEqual)) return false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tdefault: return false;\n\t\t}\n\t} finally {\n\t\tstack.delete(a);\n\t\tstack.delete(b);\n\t}\n}\n//#endregion\nexport { isEqualWith };\n","import { noop } from \"../function/noop.mjs\";\nimport { isEqualWith } from \"./isEqualWith.mjs\";\n//#region src/predicate/isEqual.ts\n/**\n* Checks if two values are equal, including support for `Date`, `RegExp`, and deep object comparison.\n*\n* @param a - The first value to compare.\n* @param b - The second value to compare.\n* @returns `true` if the values are equal, otherwise `false`.\n*\n* @example\n* isEqual(1, 1); // true\n* isEqual({ a: 1 }, { a: 1 }); // true\n* isEqual(/abc/g, /abc/g); // true\n* isEqual(new Date('2020-01-01'), new Date('2020-01-01')); // true\n* isEqual([1, 2, 3], [1, 2, 3]); // true\n*/\nfunction isEqual(a, b) {\n\treturn isEqualWith(a, b, noop);\n}\n//#endregion\nexport { isEqual };\n","/**\n * FieldSignal - 表单字段状态专用 signal。\n *\n * 该模块是在通用 `createSignal` 之上的领域化组合原语。它不改变\n * `createSignal` 的基础语义,而是为表单字段提供一个更高层的响应式单元:\n * 当前值、初始值、触碰状态和异步 pending 状态共享同一个生命周期与操作入口。\n *\n * 适用边界:\n * - Store 可用它作为字段状态的最小存储单元。\n * - View 可通过 Store 或 FormApi 间接消费这些状态。\n * - FieldRuntimeState 不应使用它;FieldRuntimeState 只保存字段呈现态。\n *\n * @module core/reactivity/fieldSignal\n */\n\nimport { cloneDeep } from \"es-toolkit\"\n\nimport { createSignal } from \"./signal\"\n\nimport type { Signal } from \"./signal\"\n\n/**\n * createFieldSignal 配置项。\n */\nexport type FieldSignalOptions<TValue> = {\n /**\n * 字段当前值。\n *\n * 读取 `.value` 会建立响应式依赖;写入应优先使用 `setValue`,\n * 以便调用方在同一处维护 touched/dirty 等派生策略。\n */\n value?: TValue | undefined\n\n /**\n * 字段初始值。\n *\n * 用于 reset 和 dirty/touched 策略判断。该值与当前值分离,允许\n * setInitialValues 只更新 baseline,而不强行覆盖用户当前输入。\n */\n initialValue?: TValue | undefined\n\n /**\n * 字段触碰/修改状态。\n *\n * 这是显式 signal,Store 可以选择在 setFieldValue 时自动更新,\n * 也可以通过 setTouched 手动设置。\n */\n touched?: boolean\n\n /**\n * 字段 pending 状态。\n */\n pending?: boolean\n}\n\n/**\n * 字段状态的无追踪快照。\n *\n * 通过 `FieldSignal.peek()` 返回,用于 Store 内部同步判断或调试读取。\n * 它不会建立响应式依赖,也不暴露底层 signal。\n */\nexport interface FieldSignalSnapshot<TValue> {\n /**\n * 字段当前值\n */\n readonly value: TValue | undefined\n\n /**\n * 字段初始值 baseline\n */\n readonly initialValue: TValue | undefined\n\n /**\n * 字段是否被触碰/修改\n */\n readonly touched: boolean\n\n /**\n * 字段是否 pending\n */\n readonly pending: boolean\n\n /**\n * 字段 pending 信息。\n */\n readonly pendingMessage: string[]\n}\n\n/**\n * 表单字段状态 signal 的状态接口。\n *\n * @typeParam TValue - 字段值类型\n */\nexport interface FieldSignalState<TValue> {\n /**\n * 字段当前值。\n *\n * 读取 `.value` 会建立响应式依赖;写入应优先使用 `setValue`,\n * 以便调用方在同一处维护 touched/dirty 等派生策略。\n */\n readonly value: Signal<TValue | undefined>\n\n /**\n * 字段初始值。\n *\n * 用于 reset 和 dirty/touched 策略判断。该值与当前值分离,允许\n * setInitialValues 只更新 baseline,而不强行覆盖用户当前输入。\n */\n readonly initialValue: Signal<TValue | undefined>\n\n /**\n * 字段触碰/修改状态。\n *\n * 这是显式 signal,Store 可以选择在 setFieldValue 时自动更新,\n * 也可以通过 setTouched 手动设置。\n */\n readonly touched: Signal<boolean>\n\n /**\n * 字段 pending 状态。\n */\n readonly pending: Signal<boolean>\n\n /**\n * 字段 pending 信息。\n */\n readonly pendingMessage: Signal<string[]>\n}\n\n/**\n * 表单字段状态 signal 的操作接口。\n *\n * @typeParam TValue - 字段值类型\n */\nexport interface FieldSignalAction<TValue> {\n /**\n * 设置字段当前值。\n *\n * @param value - 新字段值。\n */\n setValue(value: TValue | undefined): void\n\n /**\n * 设置字段初始值 baseline。\n *\n * @param value - 新初始值。\n */\n setInitialValue(value: TValue | undefined): void\n\n /**\n * 设置字段 touched 状态。\n *\n * @param touched - 是否已触碰或修改。\n */\n setTouched(touched: boolean): void\n\n /**\n * 设置字段 pending 状态。\n *\n * @param pending - 是否正在处理异步操作。\n * @param message - 可选的操作中提示信息。\n */\n setPending(pending: boolean, message?: string | string[]): void\n\n /**\n * 将字段重置到指定值;未传入时重置到当前 initialValue。\n *\n * reset 同时清空 touched 和 pending。\n *\n * @param value - 可选重置目标值。\n */\n reset(value?: TValue): void\n\n /**\n * 无依赖追踪地获取字段 signal。\n *\n * @returns 当前字段状态快照。\n */\n peek(): FieldSignalSnapshot<TValue>\n}\n\n/**\n * 表单字段状态专用 signal。\n *\n * @typeParam TValue - 字段值类型\n */\nexport type FieldSignal<TValue> = FieldSignalState<TValue> & FieldSignalAction<TValue>\n\n/**\n * 创建表单字段状态专用 signal。\n *\n * @typeParam TValue - 字段值类型\n * @param options - 字段状态配置项。\n * @returns 字段状态 signal\n */\nexport function createFieldSignal<TValue>(\n options?: FieldSignalOptions<TValue>\n): FieldSignal<TValue> {\n const { value, initialValue, touched, pending } = options || {}\n\n const valueSignal = createSignal<TValue | undefined>(\n value === undefined ? undefined : cloneDeep(value)\n )\n const initialSignal = createSignal<TValue | undefined>(\n initialValue === undefined ? undefined : cloneDeep(initialValue)\n )\n const touchedSignal = createSignal(touched ?? false)\n const pendingSignal = createSignal(pending ?? false)\n const pendingMessageSignal = createSignal<string[]>([])\n\n /**\n * 写入字段当前值 signal。\n */\n const setValue = (next: TValue | undefined): void => {\n valueSignal.value = next\n }\n\n /**\n * 写入字段初始值 baseline signal。\n */\n const setInitialValue = (next: TValue | undefined): void => {\n initialSignal.value = next\n }\n\n /**\n * 写入字段 touched signal。\n */\n const setTouched = (next: boolean): void => {\n touchedSignal.value = next\n }\n\n /**\n * 写入字段 pending signal。\n */\n const setPending = (next: boolean, message?: string | string[]): void => {\n pendingSignal.value = next\n\n if (next) {\n if (message) {\n pendingMessageSignal.value = Array.isArray(message) ? message : [message]\n }\n } else {\n pendingMessageSignal.value = []\n }\n }\n\n /**\n * 将字段状态重置到指定值或当前 baseline。\n */\n const reset = (next = initialSignal.peek()): void => {\n valueSignal.value = cloneDeep(next)\n touchedSignal.value = false\n pendingSignal.value = false\n }\n\n /**\n * 读取字段状态的无追踪快照。\n */\n const peek = (): FieldSignalSnapshot<TValue> => {\n return {\n value: valueSignal.peek(),\n initialValue: initialSignal.peek(),\n touched: touchedSignal.peek(),\n pending: pendingSignal.peek(),\n pendingMessage: pendingMessageSignal.peek(),\n }\n }\n\n return {\n value: valueSignal,\n initialValue: initialSignal,\n touched: touchedSignal,\n pending: pendingSignal,\n pendingMessage: pendingMessageSignal,\n setValue,\n setInitialValue,\n setTouched,\n setPending,\n reset,\n peek,\n }\n}\n","/**\n * FieldSignalMap - 字段路径到 FieldSignal 的响应式映射。\n *\n * API 尽量贴近原生 Map:`get`、`set`、`has`、`delete`、`clear`、\n * `keys`、`values`、`entries`。额外提供 `peek` 用于无依赖追踪读取。\n *\n * 与普通 Map 的差异:\n * - key 会被标准化后存储,默认数组路径按 `.` 连接。\n * - `get/keys/values/entries` 会追踪结构版本,字段新增/删除时 effect 会重跑。\n * - `delete/clear` 会通知被删除的旧 FieldSignal 订阅者。\n *\n * @module core/reactivity/fieldSignalMap\n */\n\nimport { createSignal } from \"./signal\"\n\nimport type { FieldSignal } from \"./fieldSignal\"\n\n/**\n * FieldSignalMap 配置项。\n */\nexport interface FieldSignalMapOptions<K> {\n /**\n * 自定义字段路径标准化函数。\n *\n * @param key - 原始字段路径。\n * @returns 标准化后的映射 key。\n */\n normalizeKey?: (key: K | unknown) => string\n}\n\ninterface FieldSignalRecord<K, V> {\n readonly key: K\n readonly value: FieldSignal<V>\n}\n\n/**\n * 字段状态 signal 映射。\n *\n * @typeParam K - 字段路径类型\n * @typeParam V - 字段值类型\n */\nclass FieldSignalMapImpl<K, V> {\n private readonly records = new Map<string, FieldSignalRecord<K, V>>()\n\n private readonly version = createSignal(0)\n\n private readonly normalizeKey: (key: K | unknown) => string\n\n constructor(options: FieldSignalMapOptions<K> = {}) {\n this.normalizeKey = options.normalizeKey ?? defaultNormalizeFieldKey\n }\n\n /**\n * 获取字段 key 的标准化字符串。\n */\n private getKey(key: K | unknown): string {\n return this.normalizeKey(key)\n }\n\n /**\n * 获取字段 signal。\n *\n * 读取缺失 key 时会订阅结构版本;后续 set 同 key 会触发 effect 重跑。\n *\n * @param key - 字段路径。\n * @returns 字段 signal;未创建时返回 undefined。\n */\n public get(key: K): FieldSignal<V> | undefined {\n const record = this.records.get(this.getKey(key))\n\n if (record) {\n return record.value\n }\n\n void this.version.value\n\n return undefined\n }\n\n /**\n * 无依赖追踪地获取字段 signal。\n *\n * @param key - 字段路径。\n * @returns 字段 signal;未创建时返回 undefined。\n */\n public peek(key: K): FieldSignal<V> | undefined {\n return this.records.get(this.getKey(key))?.value\n }\n\n /**\n * 设置字段 signal。\n *\n * @param key - 字段路径。\n * @param value - 字段 signal。\n * @returns 当前映射实例,便于链式调用。\n */\n public set(key: K, value: FieldSignal<V>): this {\n const normalizedKey = this.getKey(key)\n const exists = this.records.has(normalizedKey)\n\n this.records.set(normalizedKey, { key, value })\n\n if (!exists) {\n this.version.value++\n }\n\n return this\n }\n\n /**\n * 判断字段是否存在。\n *\n * @param key - 字段路径。\n * @returns 字段 signal 是否已存在。\n */\n public has(key: K): boolean {\n return this.records.has(this.getKey(key))\n }\n\n /**\n * 删除字段 signal。\n *\n * @param key - 字段路径。\n * @returns 是否删除了已存在的字段 signal。\n */\n public delete(key: K): boolean {\n const normalizedKey = this.getKey(key)\n const record = this.records.get(normalizedKey)\n\n if (!record) return false\n\n this.records.delete(normalizedKey)\n disposeSignal(record.value)\n this.version.value++\n\n return true\n }\n\n /**\n * 清空所有字段 signal。\n */\n public clear(): void {\n if (this.records.size === 0) return\n\n for (const record of this.records.values()) {\n disposeSignal(record.value)\n }\n\n this.records.clear()\n this.version.value++\n }\n\n /**\n * 响应式遍历原始字段 key。\n *\n * @returns 原始字段 key 的迭代器。\n */\n public keys(): IterableIterator<K> {\n void this.version.value\n\n return Array.from(this.records.values(), (record) => record.key).values()\n }\n\n /**\n * 响应式遍历字段 signal。\n *\n * @returns 字段 signal 的迭代器。\n */\n public values(): IterableIterator<FieldSignal<V>> {\n void this.version.value\n\n return Array.from(this.records.values(), (record) => record.value).values()\n }\n\n /**\n * 响应式遍历 `[key, signal]`。\n *\n * @returns 原始字段 key 与字段 signal 的迭代器。\n */\n public entries(): IterableIterator<[K, FieldSignal<V>]> {\n void this.version.value\n\n return Array.from(\n this.records.values(),\n (record) => [record.key, record.value] as [K, FieldSignal<V>]\n ).values()\n }\n}\n\n/**\n * FieldSignalMap 的实例类型。\n */\nexport type FieldSignalMap<K, V> = InstanceType<typeof FieldSignalMapImpl<K, V>>\n\n/**\n * 创建 FieldSignalMap 实例。\n *\n * @param options - 字段路径标准化配置。\n * @returns 新的字段 signal 映射。\n */\nexport function createFieldSignalMap<K, V>(\n options: FieldSignalMapOptions<K> = {}\n): FieldSignalMap<K, V> {\n return new FieldSignalMapImpl<K, V>(options)\n}\n\nfunction disposeSignal(signal: FieldSignal<unknown>): void {\n signal.value.value = undefined\n signal.initialValue.value = undefined\n signal.touched.value = false\n signal.pending.value = false\n}\n\nfunction defaultNormalizeFieldKey(key: unknown): string {\n if (Array.isArray(key)) {\n return key.map((part) => String(part)).join(\".\")\n }\n\n return String(key)\n}\n","/**\n * 框架无关的 reactive effect 门面。\n *\n * createForm 和 ReactiveMap 都通过这里创建 effect,不直接 import\n * @preact/signals-core。\n *\n * @module core/reactivity/effect\n */\n\nimport { effect } from \"@preact/signals-core\"\nimport { debounce } from \"es-toolkit\"\n\nimport type { DebounceOptions } from \"es-toolkit\"\n\n/**\n * reactive effect 的释放函数。\n */\nexport type SignalEffectDispose = () => void\n\n/**\n * reactive effect 的配置。\n */\nexport interface SignalEffectOptions {\n /**\n * 是否只调用一次。\n *\n * 为 `true` 时,首次执行后会自动释放该 effect,后续 signal 变化将不再触发。\n *\n * @default false\n */\n once?: boolean\n}\n\n/**\n * 创建 reactive effect,但不暴露具体 reactivity 后端。\n *\n * @param fn - effect 回调,执行期间读取的 signal 会被追踪。\n * @param options - reactive effect 的配置。\n *\n * @returns 释放该 effect 的函数。\n */\nexport function createSignalEffect(\n fn: () => void,\n options: SignalEffectOptions = {}\n): SignalEffectDispose {\n if (!options.once) {\n return effect(fn)\n }\n\n const disposeRef: { current?: SignalEffectDispose } = {}\n disposeRef.current = effect(() => {\n fn()\n disposeRef.current?.()\n })\n\n return () => disposeRef.current?.()\n}\n\n/**\n * debounce reactive effect 的配置。\n */\nexport interface DebouncedSignalEffectOptions {\n /**\n * 是否立即执行首次副作用。\n *\n * 后续 signal 变化仍会在 debounce 等待窗口结束后执行。\n *\n * @default false\n */\n immediate?: boolean\n\n /**\n * 后续变更触发 debounce 副作用的时机。\n *\n * @default [\"trailing\"]\n */\n edges?: DebounceOptions[\"edges\"]\n\n /**\n * 是否只调用一次副作用。\n *\n * 为 `true` 时,`run` 首次执行(无论立即还是 debounce 后)后会自动释放\n * effect 并取消后续待执行回调,signal 变化将不再触发。默认为 `false`。\n *\n * @default false\n */\n once?: boolean\n}\n\n/**\n * 创建带 debounce 的 reactive effect。\n *\n * `collect` 会在 effect 中同步执行,以便追踪其中读取的 signal;\n * `run` 则在等待窗口结束后接收最新一次收集结果并执行。\n *\n * @typeParam T - `collect` 返回且传递给 `run` 的数据类型。\n *\n * @param collect - 同步读取 signal 并返回副作用所需数据的函数。\n * @param run - debounce 后执行的副作用函数。\n * @param wait - debounce 等待时间,单位为毫秒。默认为 16ms。\n * @param options - debounce reactive effect 的配置。\n *\n * @returns 释放 effect 并取消待执行 debounce 回调的函数。\n *\n * @remarks\n * 不要将 `collect` 内的 signal 读取移动到 `run` 中。异步执行时已经离开\n * effect 的依赖收集上下文,后续 signal 变化将无法重新触发该 effect。\n */\nexport function createDebouncedSignalEffect<T>(\n collect: () => T,\n run: (value: T) => void,\n wait = 16,\n options: DebouncedSignalEffectOptions = {}\n): SignalEffectDispose {\n let initialized = false\n\n // 用包装后的 run 创建 debounce,使得无论是立即执行还是 debounce 回调,\n // 在 `once` 模式下首次执行后都能通过 teardown 释放 effect 并取消后续\n // 待执行回调。\n const wrappedRun = (value: T) => {\n run(value)\n\n if (options.once) {\n teardown()\n }\n }\n\n const debouncedRun = debounce(wrappedRun, wait, { edges: options.edges })\n\n const disposeEffect = createSignalEffect(() => {\n const value = collect()\n\n if (!initialized && options.immediate) {\n initialized = true\n wrappedRun(value)\n\n return\n }\n\n initialized = true\n debouncedRun(value)\n })\n\n const teardown = () => {\n disposeEffect()\n debouncedRun.cancel()\n }\n\n return teardown\n}\n\n/**\n * 创建只调用一次的 reactive effect。\n *\n * 等价于 `createSignalEffect(fn, { once: true })`:首次执行后会自动释放该\n * effect,后续 signal 变化将不再触发。\n *\n * @param fn - effect 回调,执行期间读取的 signal 会被追踪。\n *\n * @returns 释放该 effect 的函数。\n */\nexport function createOnceSignalEffect(fn: () => void): SignalEffectDispose {\n return createSignalEffect(fn, { once: true })\n}\n","/**\n * 框架无关的 reactive batch 门面。\n *\n * 所有批量响应式写入都通过这里进入底层实现,避免业务模块直接依赖 Preact signals。\n *\n * @module core/reactivity/batch\n */\n\nimport { batch } from \"@preact/signals-core\"\n\n/**\n * 将多次 signal 写入合并到一次通知周期中。\n *\n * @param fn - 需要批量执行的响应式写入逻辑。\n */\nexport function batchUpdates(fn: () => void): void {\n batch(fn)\n}\n","/**\n * SignalMap - 按 key 管理的响应式值存储。\n *\n * API 贴近原生 Map:`get`、`set`、`has`、`delete`、`clear`、\n * `keys`、`values`、`entries`。额外提供 `peek` 用于无依赖追踪读取。\n *\n * 与普通 Map 的差异:\n * - 每个 key 独占一个 signal,value 更新可以被细粒度追踪。\n * - 读取缺失 key 时会订阅结构版本;后续 set 同 key 会触发 effect 重跑。\n * - 删除/清空 key 时会通知旧 value 的订阅者。\n *\n * @module core/reactivity/reactiveMap\n */\n\nimport { batchUpdates } from \"./batch\"\nimport { createSignal } from \"./signal\"\n\nimport type { Signal } from \"./signal\"\n\n/**\n * 按 key 细粒度追踪更新的响应式 Map。\n *\n * @typeParam K - key 类型\n * @typeParam V - value 类型\n */\nclass SignalMapImpl<K, V> {\n /** 每个 key 独占一个 signal,保证字段级更新能细粒度触发 */\n private signals = new Map<K, Signal<V>>()\n\n /**\n * 结构版本 signal,用于追踪“新 key 创建”事件。\n *\n * effect 读取缺失 key 时会依赖这个版本;之后创建该 key 会推进版本,\n * 让 effect 重新执行并订阅新 key 对应的 signal。\n */\n private version: Signal<number> = createSignal(0)\n\n /**\n * 读取 key,并在 effect 内自动收集响应式依赖。\n *\n * @param key - 待读取的 key。\n * @returns key 对应的值;不存在时返回 undefined。\n */\n get(key: K): V | undefined {\n const s = this.signals.get(key)\n if (s) return s.value\n\n void this.version.value\n\n return undefined\n }\n\n /**\n * 写入 key;如果 key 不存在,则创建新的 signal。\n *\n * @param key - 待写入的 key。\n * @param value - 新值。\n * @returns 当前 SignalMap 实例,便于链式调用。\n */\n set(key: K, value: V): this {\n const s = this.signals.get(key)\n if (s) {\n s.value = value\n } else {\n this.signals.set(key, createSignal(value))\n this.version.value++\n }\n\n return this\n }\n\n /**\n * 无依赖追踪地读取 key。\n *\n * @param key - 待读取的 key。\n * @returns key 对应的值;不存在时返回 undefined。\n */\n peek(key: K): V | undefined {\n return this.signals.get(key)?.peek()\n }\n\n /**\n * 判断 key 是否存在。\n *\n * @param key - 待检查的 key。\n * @returns key 已存在时返回 true。\n */\n has(key: K): boolean {\n return this.signals.has(key)\n }\n\n /**\n * 删除 key,并通知订阅旧 signal 或 map 结构的 effects。\n *\n * @param key - 待删除的 key。\n * @returns 成功删除时返回 true;key 不存在时返回 false。\n */\n delete(key: K): boolean {\n const s = this.signals.get(key)\n if (!s) return false\n\n this.signals.delete(key)\n\n batchUpdates(() => {\n s.value = undefined as unknown as V\n this.version.value++\n })\n\n return true\n }\n\n /**\n * 清空所有 key,并通知订阅任意被删除 signal 的 effects。\n */\n clear(): void {\n if (this.signals.size === 0) return\n\n const oldSignals = [...this.signals.values()]\n this.signals.clear()\n\n batchUpdates(() => {\n for (const s of oldSignals) {\n s.value = undefined as unknown as V\n }\n\n this.version.value++\n })\n }\n\n /**\n * 遍历所有已注册 key。\n *\n * @returns key 迭代器。\n */\n keys(): IterableIterator<K> {\n void this.version.value\n\n return this.signals.keys()\n }\n\n /**\n * 遍历所有值。\n *\n * @returns value 迭代器。\n */\n values(): IterableIterator<V> {\n void this.version.value\n\n return Array.from(this.signals.values(), (signal) => signal.value).values()\n }\n\n /**\n * 遍历 key/value 对。\n *\n * @returns key/value entry 迭代器。\n */\n entries(): IterableIterator<[K, V]> {\n void this.version.value\n\n return Array.from(\n this.signals.entries(),\n ([key, signal]) => [key, signal.value] as [K, V]\n ).values()\n }\n}\n\n/**\n * SignalMap 的实例类型。\n */\nexport type SignalMap<K, V> = InstanceType<typeof SignalMapImpl<K, V>>\n\n/**\n * 创建 SignalMap 实例。\n *\n * @returns 新的响应式 Map。\n */\nexport function createSignalMap<K, V>(): SignalMap<K, V> {\n return new SignalMapImpl<K, V>()\n}\n","/**\n * computed 门面。\n *\n * 对 `@preact/signals-core` 的 `computed` 做一层薄封装,让 core 内部模块\n * 不直接耦合底层响应式库路径。业务模块统一通过本文件导入 `createComputed`\n * 和只读 computed 类型。\n *\n * @module core/reactivity/computed\n */\n\nimport { computed } from \"@preact/signals-core\"\n\nimport type { ReadonlySignal, SignalOptions } from \"@preact/signals-core\"\n\n/**\n * 只读 computed signal 类型。\n *\n * 与 `ReadonlySignal<T>` 语义一致,仅用于在类型层面标记该 signal\n * 由 computed 派生,不可外部写入。\n *\n * @typeParam T - computed 值类型\n */\nexport type ComputedSignal<T> = ReadonlySignal<T>\n\n/**\n * 创建 computed signal。\n *\n * `compute` 函数中读取的 signal 会自动成为依赖;当依赖变化时 computed\n * 值会懒计算失效,下次读取时重新求值。\n *\n * @typeParam T - computed 值类型\n * @param compute - 计算函数,内部读取的 signal 自动成为依赖\n * @param options - signals-core 原生 signal 配置\n * @returns 只读 computed signal\n */\nexport function createComputed<T>(\n compute: () => T,\n options?: SignalOptions<T>\n): ComputedSignal<T> {\n return computed(compute, options)\n}\n","/**\n * schema 列配置工具函数\n *\n * 提供列类型守卫和初始值提取功能,用于 schemx 的列配置解析。\n *\n * @module utils/schema\n */\n\nimport type {\n SchemxBaseField,\n SchemxDependencyField,\n SchemxField,\n SchemxGroupField,\n SchemxResolvedBaseField,\n SchemxResolvedField,\n SchemxResolvedGroupField,\n Values,\n} from \"../types\"\n\n/**\n * 类型守卫:判断是否为基础字段配置\n *\n * 排除 group、dependency、nested 三种特殊类型后,剩余的即为基础字段。\n *\n * @param schema - 列配置\n * @returns 是否为基础字段\n *\n * @example\n * ```ts\n * const schemas = [\n * { name: 'username', label: '用户名', componentType: 'input' },\n * { name: 'group', componentType: 'group', children: [...] },\n * { name: 'dep', componentType: 'dependency', render: () => [...] }\n * ]\n *\n * schemas.forEach(schema => {\n * if (isBaseSchema(schema)) {\n * // TypeScript 现在知道这是 SchemxBaseField\n * console.log('基础字段:', schema.name)\n * }\n * })\n * ```\n */\nexport function isBaseSchema<T extends Values = Values>(\n schema: SchemxField<T>\n): schema is SchemxBaseField<T> {\n return !isGroupSchema(schema) && !isDependencySchema(schema)\n}\n\n/**\n * 类型守卫:判断是否为分组列配置\n *\n * @param schema - 列配置\n * @returns 是否为 `componentType === \"group\"` 的分组列\n *\n * @example\n * ```ts\n * const schema = {\n * name: 'profile',\n * componentType: 'group',\n * children: [\n * { name: 'name', label: '姓名', componentType: 'input' },\n * { name: 'age', label: '年龄', componentType: 'number' }\n * ]\n * }\n *\n * if (isGroupSchema(schema)) {\n * // TypeScript 现在知道这是 SchemxGroupField\n * schema.children.forEach(child => {\n * console.log('子字段:', child)\n * })\n * }\n * ```\n */\nexport function isGroupSchema<T extends Values = Values>(\n schema: SchemxField<T>\n): schema is SchemxGroupField<T> {\n return schema.componentType === \"group\"\n}\n\n/**\n * 类型守卫:判断是否为依赖列配置\n *\n * @param schema - 列配置\n * @returns 是否为 `componentType === \"dependency\"` 的依赖列\n *\n * @example\n * ```ts\n * const schema = {\n * name: 'dynamic',\n * componentType: 'dependency',\n * render: ({ values }) => {\n * if (values.type === 'A') {\n * return [{ name: 'fieldA', componentType: 'input' }]\n * }\n * return [{ name: 'fieldB', componentType: 'input' }]\n * }\n * }\n *\n * if (isDependencySchema(schema)) {\n * // TypeScript 现在知道这是 SchemxDependencyField\n * const dynamicSchemas = schema.render({ values: {} })\n * }\n * ```\n */\nexport function isDependencySchema<T extends Values = Values>(\n schema: SchemxField<T>\n): schema is SchemxDependencyField<T> {\n return schema.componentType === \"dependency\"\n}\n\n/**\n * 在列配置树中按字段名查找基础字段配置。\n *\n * 递归搜索 group、nested 的子 schemas,返回第一个匹配的基础字段。\n *\n * @param schemas - 列配置数组\n * @param name - 字段名称\n *\n * @returns 匹配的基础字段配置,未找到时返回 undefined\n *\n * @example\n * ```ts\n * const schemas = [\n * { name: 'username', label: '用户名', componentType: 'input' },\n * {\n * name: 'profile',\n * componentType: 'group',\n * children: [\n * { name: 'email', label: '邮箱', componentType: 'input' }\n * ]\n * }\n * ]\n *\n * // 在顶层找到\n * const usernameSchema = findSchema(schemas, 'username')\n * console.log(usernameSchema?.label) // => '用户名'\n *\n * // 在 group 中递归找到\n * const emailSchema = findSchema(schemas, 'email')\n * console.log(emailSchema?.label) // => '邮箱'\n *\n * // 未找到\n * const notFound = findSchema(schemas, 'nonexistent')\n * console.log(notFound) // => undefined\n * ```\n */\nexport function findSchema<T extends Values = Values>(\n schemas: SchemxField<T>[],\n name: string\n): SchemxBaseField<T> | undefined {\n for (const schema of schemas) {\n if (isBaseSchema(schema) && schema.name === name) {\n return schema\n }\n\n if (isGroupSchema(schema)) {\n const found = findSchema<T>(schema.children as SchemxField<T>[], name)\n\n if (found) return found\n }\n }\n\n return undefined\n}\n\n/**\n * 类型守卫:判断是否为 序列化后的 基础字段配置\n *\n * 排除 group、dependency、nested 三种特殊类型后,剩余的即为基础字段。\n *\n * @param schema - 列配置\n * @returns 是否为基础字段\n *\n * @example\n * ```ts\n * // 在处理 getViewSchemas 返回的解析后 schemas 时使用\n * const viewSchemas = form.getViewSchemas()\n *\n * viewSchemas.forEach(schema => {\n * if (isBaseResolvedSchema(schema)) {\n * console.log('基础字段:', schema.name)\n * }\n * })\n * ```\n */\nexport function isBaseResolvedSchema<T extends Values = Values>(\n schema: SchemxResolvedField<T>\n): schema is SchemxResolvedBaseField<T> {\n return !isGroupResolvedSchema(schema) && !isDependencyResolvedSchema(schema)\n}\n\n/**\n * 类型守卫:判断是否为 序列化后的 分组列配置\n *\n * @param schema - 列配置\n * @returns 是否为 `componentType === \"group\"` 的分组列\n *\n * @example\n * ```ts\n * const viewSchemas = form.getViewSchemas()\n *\n * viewSchemas.forEach(schema => {\n * if (isGroupResolvedSchema(schema)) {\n * // 递归处理子字段\n * schema.children.forEach(child => {\n * console.log('子字段:', child)\n * })\n * }\n * })\n * ```\n */\nexport function isGroupResolvedSchema<T extends Values = Values>(\n schema: SchemxResolvedField<T>\n): schema is SchemxResolvedGroupField<T> {\n return schema.componentType === \"group\"\n}\n\n/**\n * 类型守卫:判断是否为 dependency resolved schema。\n *\n * @param schema - 解析后的字段配置。\n * @returns componentType 为 dependency 时返回 true。\n *\n * @example\n * ```ts\n * const viewSchemas = form.getViewSchemas()\n *\n * viewSchemas.forEach(schema => {\n * if (isDependencyResolvedSchema(schema)) {\n * console.log('依赖字段:', schema.name)\n * }\n * })\n * ```\n */\nexport function isDependencyResolvedSchema<T extends Values = Values>(\n schema: SchemxResolvedField<T>\n): boolean {\n return (schema as SchemxField<T>).componentType === \"dependency\"\n}\n","/**\n * Schema 标准化工具\n *\n * 标准化 schema 配置,移除必填项未填的配置,并在控制台输出警告信息。\n *\n * @module utils/normalize\n */\n\nimport { isBaseSchema, isDependencySchema, isGroupSchema } from \"./schema\"\n\nimport type {\n SchemxBaseField,\n SchemxDependencyField,\n SchemxField,\n SchemxGroupField,\n Values,\n} from \"../types\"\n\n/**\n * 检查 label 是否合法\n * @param schema\n * @returns boolean\n */\nconst isLegalName = <T extends Values>(schema: SchemxBaseField<T>) =>\n Object.hasOwn(schema, \"name\") && [null, undefined, \"\"].every((i) => i !== schema.name)\n\n/**\n * 检查 componentType 是否合法\n * @param schema\n * @returns boolean\n */\nconst isLegalComponentType = <T extends Values>(schema: SchemxField<T>) =>\n Object.hasOwn(schema, \"componentType\") && typeof schema.componentType === \"string\"\n\n/**\n * 校验基础字段的必填项是否完整\n *\n * 基础字段必须包含 name、label、componentType 三个字段。\n *\n * @param schema - 基础字段配置\n * @returns 缺失的字段名数组,为空表示校验通过\n */\nfunction getBaseFieldMissing<T extends Values>(schema: SchemxBaseField<T>): string[] {\n const missing: string[] = []\n\n if (!isLegalName(schema)) missing.push(\"name\")\n\n if (!isLegalComponentType(schema)) missing.push(\"componentType\")\n\n return missing\n}\n\n/**\n * 校验分组字段的必填项是否完整\n *\n * 分组字段必须包含 label、componentType、children 三个字段。\n *\n * @param schema - 分组字段配置\n * @returns 缺失的字段名数组,为空表示校验通过\n */\nfunction getGroupFieldMissing<T extends Values>(schema: SchemxGroupField<T>): string[] {\n const missing: string[] = []\n\n if (!isLegalComponentType(schema)) missing.push(\"componentType\")\n\n if (!Object.hasOwn(schema, \"children\") || !Array.isArray(schema.children))\n missing.push(\"children\")\n\n return missing\n}\n\n/**\n * 校验依赖字段的必填项是否完整\n *\n * 依赖字段必须包含 componentType、to、renderer 三个字段。\n *\n * @param schema - 依赖字段配置\n * @returns 缺失的字段名数组,为空表示校验通过\n */\nfunction getDependencyFieldMissing<T extends Values>(\n schema: SchemxDependencyField<T>\n): string[] {\n const missing: string[] = []\n\n if (!isLegalComponentType(schema)) missing.push(\"componentType\")\n\n if (!Object.hasOwn(schema, \"to\") || !Array.isArray(schema.to) || schema.to.length === 0)\n missing.push(\"to\")\n\n if (typeof schema.renderer !== \"function\") missing.push(\"renderer\")\n\n return missing\n}\n\n/**\n * 构建警告信息\n *\n * @param index - schema 在数组中的索引\n * @param schema - 字段配置\n * @param missing - 缺失的字段名数组\n * @returns 格式化的警告信息\n */\nfunction buildWarnMessage<T extends Values>(\n index: number,\n schema: SchemxField<T>,\n missing: string[]\n): string {\n const identifier =\n (\"name\" in schema && schema.name) || schema.componentType || \"unknown\"\n\n return (\n `[schemx] schemas[${index}] (${String(identifier)}) ` +\n `缺少必填项: ${missing.join(\", \")},已被过滤`\n )\n}\n\n/**\n * 过滤 schemas 数组,移除必填项未填的配置\n *\n * 对基础字段、分组字段、依赖字段分别校验其必填项,\n * 不合格的条目会被过滤掉并在控制台输出 warn 信息。\n * 分组字段的 children 会递归过滤。\n *\n * @typeParam T - 表单值类型\n * @param schemas - 原始 schema 配置数组\n * @returns 过滤后的 schema 配置数组\n *\n * @example\n * ```ts\n * const cleaned = normalizeSchemas([\n * { name: '', label: '用户名', componentType: 'input' }, // name 为空,被过滤\n * { name: 'email', label: '邮件', componentType: '' }, // componentType 为空,被过滤\n * { componentType: 'group', label: '分组', children: [] },\n * ])\n * ```\n */\nexport function normalizeSchemas<T extends Values = Values>(\n schemas: SchemxField<T>[]\n): SchemxField<T>[] {\n const result: SchemxField<T>[] = []\n const missings: string[] = []\n let changed = false\n\n for (let i = 0; i < schemas.length; i++) {\n const schema = schemas[i]\n let missing: string[] = []\n\n if (isGroupSchema(schema)) {\n missing = getGroupFieldMissing(schema)\n\n if (missing.length > 0) {\n missings.push(buildWarnMessage(i, schema, missing))\n changed = true\n continue\n }\n\n // 递归过滤 children;children 引用不变时保留原 group 引用,\n // 让下游引用缓存能在 schemas 未变时命中。\n const normalizedChildren = normalizeSchemas<T>(schema.children as SchemxField<T>[])\n\n if (normalizedChildren === schema.children) {\n result.push(schema)\n } else {\n result.push({ ...schema, children: normalizedChildren })\n changed = true\n }\n } else if (isDependencySchema(schema)) {\n missing = getDependencyFieldMissing(schema)\n\n if (missing.length > 0) {\n missings.push(buildWarnMessage(i, schema, missing))\n changed = true\n continue\n }\n\n result.push(schema)\n } else if (isBaseSchema(schema)) {\n missing = getBaseFieldMissing(schema)\n\n if (missing.length > 0) {\n missings.push(buildWarnMessage(i, schema, missing))\n changed = true\n continue\n }\n\n result.push(schema)\n } else {\n // 未知 schema 类型,跳过\n changed = true\n }\n }\n\n if (missings.length) console.warn(missings.join(\"\\n\"))\n\n // 无任何元素被过滤或重建时返回原数组引用,保证引用稳定。\n return changed ? result : schemas\n}\n","//#region src/compat/util/toString.ts\n/**\n* Converts `value` to a string.\n*\n* An empty string is returned for `null` and `undefined` values.\n* The sign of `-0` is preserved.\n*\n* @param value - The value to convert.\n* @returns Returns the converted string.\n*\n* @example\n* toString(null) // returns ''\n* toString(undefined) // returns ''\n* toString(-0) // returns '-0'\n* toString([1, 2, -0]) // returns '1,2,-0'\n* toString([Symbol('a'), Symbol('b')]) // returns 'Symbol(a),Symbol(b)'\n*/\nfunction toString(value) {\n\tif (value == null) return \"\";\n\tif (typeof value === \"string\") return value;\n\tif (Array.isArray(value)) return value.map(toString).join(\",\");\n\tconst result = String(value);\n\tif (result === \"0\" && Object.is(Number(value), -0)) return \"-0\";\n\treturn result;\n}\n//#endregion\nexport { toString };\n","//#region src/compat/_internal/toKey.ts\n/**\n* Converts `value` to a string key if it's not a string or symbol.\n*\n* @private\n* @param {*} value The value to inspect.\n* @returns {string|symbol} Returns the key.\n*/\nfunction toKey(value) {\n\tif (typeof value === \"string\" || typeof value === \"symbol\") return value;\n\tif (Object.is(value?.valueOf?.(), -0)) return \"-0\";\n\treturn String(value);\n}\n//#endregion\nexport { toKey };\n","import { toKey } from \"../_internal/toKey.mjs\";\nimport { toString } from \"./toString.mjs\";\n//#region src/compat/util/toPath.ts\n/**\n* Converts a deep key string into an array of path segments.\n*\n* This function takes a string representing a deep key (e.g., 'a.b.c' or 'a[b][c]') and breaks it down into an array of strings, each representing a segment of the path.\n*\n* @param deepKey - The deep key string to convert.\n* @returns An array of strings, each representing a segment of the path.\n*\n* Examples:\n*\n* toPath('a.b.c') // Returns ['a', 'b', 'c']\n* toPath('a[b][c]') // Returns ['a', 'b', 'c']\n* toPath('.a.b.c') // Returns ['', 'a', 'b', 'c']\n* toPath('a[\"b.c\"].d') // Returns ['a', 'b.c', 'd']\n* toPath('') // Returns []\n* toPath('.a[b].c.d[e][\"f.g\"].h') // Returns ['', 'a', 'b', 'c', 'd', 'e', 'f.g', 'h']\n*/\nfunction toPath(deepKey) {\n\tif (Array.isArray(deepKey)) return deepKey.map(toKey);\n\tif (typeof deepKey === \"symbol\") return [deepKey];\n\tdeepKey = toString(deepKey);\n\tconst result = [];\n\tconst length = deepKey.length;\n\tif (length === 0) return result;\n\tlet index = 0;\n\tlet key = \"\";\n\tlet quoteChar = \"\";\n\tlet bracket = false;\n\tif (deepKey.charCodeAt(0) === 46) {\n\t\tresult.push(\"\");\n\t\tindex++;\n\t}\n\twhile (index < length) {\n\t\tconst char = deepKey[index];\n\t\tif (quoteChar) if (char === \"\\\\\" && index + 1 < length) {\n\t\t\tindex++;\n\t\t\tkey += deepKey[index];\n\t\t} else if (char === quoteChar) quoteChar = \"\";\n\t\telse key += char;\n\t\telse if (bracket) if (char === \"\\\"\" || char === \"'\") quoteChar = char;\n\t\telse if (char === \"]\") {\n\t\t\tbracket = false;\n\t\t\tresult.push(key);\n\t\t\tkey = \"\";\n\t\t} else key += char;\n\t\telse if (char === \"[\") {\n\t\t\tbracket = true;\n\t\t\tif (key) {\n\t\t\t\tresult.push(key);\n\t\t\t\tkey = \"\";\n\t\t\t}\n\t\t} else if (char === \".\") {\n\t\t\tif (key) {\n\t\t\t\tresult.push(key);\n\t\t\t\tkey = \"\";\n\t\t\t}\n\t\t} else key += char;\n\t\tindex++;\n\t}\n\tif (key) result.push(key);\n\treturn result;\n}\n//#endregion\nexport { toPath };\n","//#region src/compat/_internal/isDeepKey.ts\n/**\n* Checks if a given key is a deep key.\n*\n* A deep key is a string that contains a dot (.) or square brackets with a property accessor.\n*\n* @param {PropertyKey} key - The key to check.\n* @returns {boolean} - Returns true if the key is a deep key, otherwise false.\n*\n* Examples:\n*\n* isDeepKey('a.b') // true\n* isDeepKey('a[b]') // true\n* isDeepKey('a') // false\n* isDeepKey(123) // false\n* isDeepKey('a.b.c') // true\n* isDeepKey('a[b][c]') // true\n*/\nfunction isDeepKey(key) {\n\tswitch (typeof key) {\n\t\tcase \"number\":\n\t\tcase \"symbol\": return false;\n\t\tcase \"string\": return key.includes(\".\") || key.includes(\"[\") || key.includes(\"]\");\n\t}\n}\n//#endregion\nexport { isDeepKey };\n","import { isUnsafeProperty } from \"../../_internal/isUnsafeProperty.mjs\";\nimport { isDeepKey } from \"../_internal/isDeepKey.mjs\";\nimport { toKey } from \"../_internal/toKey.mjs\";\nimport { toPath } from \"../util/toPath.mjs\";\n//#region src/compat/object/get.ts\n/**\n* Retrieves the value at a given path from an object. If the resolved value is undefined, the defaultValue is returned instead.\n*\n* @param object - The object to query.\n* @param path - The path of the property to get.\n* @param [defaultValue] - The value returned if the resolved value is undefined.\n* @returns Returns the resolved value.\n*\n* @example\n* const object = { a: { b: { c: 1 } } };\n* get(object, 'a.b.c');\n* // => 1\n*\n* get(object, ['a', 'b', 'c']);\n* // => 1\n*\n* get(object, 'a.b.d', 'default');\n* // => 'default'\n*/\nfunction get(object, path, defaultValue) {\n\tif (object == null) return defaultValue;\n\tswitch (typeof path) {\n\t\tcase \"string\": {\n\t\t\tif (isUnsafeProperty(path)) return defaultValue;\n\t\t\tconst result = object[path];\n\t\t\tif (result === void 0) if (isDeepKey(path)) return get(object, toPath(path), defaultValue);\n\t\t\telse return defaultValue;\n\t\t\treturn result;\n\t\t}\n\t\tcase \"number\":\n\t\tcase \"symbol\": {\n\t\t\tif (typeof path === \"number\") path = toKey(path);\n\t\t\tconst result = object[path];\n\t\t\tif (result === void 0) return defaultValue;\n\t\t\treturn result;\n\t\t}\n\t\tdefault: {\n\t\t\tif (Array.isArray(path)) return getWithPath(object, path, defaultValue);\n\t\t\tif (Object.is(path?.valueOf(), -0)) path = \"-0\";\n\t\t\telse path = String(path);\n\t\t\tif (isUnsafeProperty(path)) return defaultValue;\n\t\t\tconst result = object[path];\n\t\t\tif (result === void 0) return defaultValue;\n\t\t\treturn result;\n\t\t}\n\t}\n}\nfunction getWithPath(object, path, defaultValue) {\n\tif (path.length === 0) return defaultValue;\n\tlet current = object;\n\tfor (let index = 0; index < path.length; index++) {\n\t\tif (current == null) return defaultValue;\n\t\tif (isUnsafeProperty(path[index])) return defaultValue;\n\t\tcurrent = current[path[index]];\n\t}\n\tif (current === void 0) return defaultValue;\n\treturn current;\n}\n//#endregion\nexport { get };\n","//#region src/compat/predicate/isObject.ts\n/**\n* Checks if the given value is an object. An object is a value that is\n* not a primitive type (string, number, boolean, symbol, null, or undefined).\n*\n* This function tests whether the provided value is an object or not.\n* It returns `true` if the value is an object, and `false` otherwise.\n*\n* This function can also serve as a type predicate in TypeScript, narrowing the type of the argument to an object value.\n*\n* @param value - The value to check if it is an object.\n* @returns `true` if the value is an object, `false` otherwise.\n*\n* @example\n* const value1 = {};\n* const value2 = [1, 2, 3];\n* const value3 = () => {};\n* const value4 = null;\n*\n* console.log(isObject(value1)); // true\n* console.log(isObject(value2)); // true\n* console.log(isObject(value3)); // true\n* console.log(isObject(value4)); // false\n*/\nfunction isObject(value) {\n\treturn value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\n//#endregion\nexport { isObject };\n","//#region src/compat/_internal/isIndex.ts\nconst IS_UNSIGNED_INTEGER = /^(?:0|[1-9]\\d*)$/;\nfunction isIndex(value, length = Number.MAX_SAFE_INTEGER) {\n\tswitch (typeof value) {\n\t\tcase \"number\": return Number.isInteger(value) && value >= 0 && value < length;\n\t\tcase \"symbol\": return false;\n\t\tcase \"string\": return IS_UNSIGNED_INTEGER.test(value);\n\t}\n}\n//#endregion\nexport { isIndex };\n","import { isSymbol } from \"../predicate/isSymbol.mjs\";\n//#region src/compat/_internal/isKey.ts\n/** Matches any deep property path. (e.g. `a.b[0].c`)*/\nconst regexIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/;\n/** Matches any word character (alphanumeric & underscore).*/\nconst regexIsPlainProp = /^\\w*$/;\n/**\n* Checks if `value` is a property name and not a property path. (It's ok that the `value` is not in the keys of the `object`)\n* @param {unknown} value The value to check.\n* @param {unknown} object The object to query.\n* @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n*\n* @example\n* isKey('a', { a: 1 });\n* // => true\n*\n* isKey('a.b', { a: { b: 2 } });\n* // => false\n*/\nfunction isKey(value, object) {\n\tif (Array.isArray(value)) return false;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value == null || isSymbol(value)) return true;\n\treturn typeof value === \"string\" && (regexIsPlainProp.test(value) || !regexIsDeepProp.test(value)) || object != null && Object.hasOwn(object, value);\n}\n//#endregion\nexport { isKey };\n","import { isEqualsSameValueZero } from \"../../_internal/isEqualsSameValueZero.mjs\";\nimport \"../util/eq.mjs\";\n//#region src/compat/_internal/assignValue.ts\nconst assignValue = (object, key, value) => {\n\tconst objValue = object[key];\n\tif (!(Object.hasOwn(object, key) && isEqualsSameValueZero(objValue, value)) || value === void 0 && !(key in object)) object[key] = value;\n};\n//#endregion\nexport { assignValue };\n","import { isUnsafeProperty } from \"../../_internal/isUnsafeProperty.mjs\";\nimport { toKey } from \"../_internal/toKey.mjs\";\nimport { toPath } from \"../util/toPath.mjs\";\nimport { get } from \"./get.mjs\";\nimport { isObject } from \"../predicate/isObject.mjs\";\nimport { isIndex } from \"../_internal/isIndex.mjs\";\nimport { isKey } from \"../_internal/isKey.mjs\";\nimport { assignValue } from \"../_internal/assignValue.mjs\";\n//#region src/compat/object/updateWith.ts\n/**\n* Updates the value at the specified path of the given object using an updater function and a customizer.\n* If any part of the path does not exist, it will be created.\n*\n* @template T - The type of the object.\n* @template R - The type of the return value.\n* @param obj - The object to modify.\n* @param path - The path of the property to update.\n* @param updater - The function to produce the updated value.\n* @param customizer - The function to customize the update process.\n* @returns The modified object.\n*\n* @example\n* const object = { 'a': [{ 'b': { 'c': 3 } }] };\n* updateWith(object, 'a[0].b.c', (n) => n * n);\n* // => { 'a': [{ 'b': { 'c': 9 } }] }\n*/\nfunction updateWith(obj, path, updater, customizer) {\n\tif (obj == null && !isObject(obj)) return obj;\n\tlet resolvedPath;\n\tif (isKey(path, obj)) resolvedPath = [path];\n\telse if (Array.isArray(path)) resolvedPath = path;\n\telse resolvedPath = toPath(path);\n\tconst updateValue = updater(get(obj, resolvedPath));\n\tlet current = obj;\n\tfor (let i = 0; i < resolvedPath.length && current != null; i++) {\n\t\tconst key = toKey(resolvedPath[i]);\n\t\tif (isUnsafeProperty(key)) continue;\n\t\tlet newValue;\n\t\tif (i === resolvedPath.length - 1) newValue = updateValue;\n\t\telse {\n\t\t\tconst objValue = current[key];\n\t\t\tconst customizerResult = customizer?.(objValue, key, obj);\n\t\t\tnewValue = customizerResult !== void 0 ? customizerResult : isObject(objValue) ? objValue : isIndex(resolvedPath[i + 1]) ? [] : {};\n\t\t}\n\t\tassignValue(current, key, newValue);\n\t\tcurrent = current[key];\n\t}\n\treturn obj;\n}\n//#endregion\nexport { updateWith };\n","import { updateWith } from \"./updateWith.mjs\";\n//#region src/compat/object/set.ts\n/**\n* Sets the value at the specified path of the given object. If any part of the path does not exist, it will be created.\n*\n* @template T - The type of the object.\n* @param obj - The object to modify.\n* @param path - The path of the property to set.\n* @param value - The value to set.\n* @returns The modified object.\n*\n* @example\n* // Set a value in a nested object\n* const obj = { a: { b: { c: 3 } } };\n* set(obj, 'a.b.c', 4);\n* console.log(obj.a.b.c); // 4\n*\n* @example\n* // Set a value in an array\n* const arr = [1, 2, 3];\n* set(arr, 1, 4);\n* console.log(arr[1]); // 4\n*\n* @example\n* // Create non-existent path and set value\n* const obj = {};\n* set(obj, 'a.b.c', 4);\n* console.log(obj); // { a: { b: { c: 4 } } }\n*/\nfunction set(obj, path, value) {\n\treturn updateWith(obj, path, () => value, () => void 0);\n}\n//#endregion\nexport { set };\n","/**\n * 路径工具函数\n *\n * 基于 es-toolkit/compat 的路径操作,提供嵌套路径的解析和设置功能。\n * 支持点号分隔的路径格式(如 `user.address.city`)和数组路径格式。\n *\n * @module utils/path\n *\n * @example\n * ```typescript\n * import { getByPath, setByPath } from './path'\n *\n * const obj = { user: { address: { city: 'Beijing' } } }\n *\n * // 获取嵌套值\n * getByPath(obj, 'user.address.city') // => 'Beijing'\n *\n * // 设置嵌套值(会自动创建中间对象)\n * setByPath(obj, 'user.profile.name', 'John')\n * // obj => { user: { address: { city: 'Beijing' }, profile: { name: 'John' } } }\n * ```\n */\n\nimport { get, set } from \"es-toolkit/compat\"\n\nimport type { FieldValue, NamePath, Values } from \"../types\"\n\ntype RuntimePath = string | number | readonly (string | number)[]\n\n/**\n * 从对象中根据路径获取嵌套值\n *\n * @param obj - 要获取值的源对象\n * @param path - NamePath 路径(string / number / array)\n * @returns 路径对应的值,如果路径不存在则返回 undefined\n *\n * @example\n * ```ts\n * const obj = {\n * user: {\n * name: 'John',\n * address: {\n * city: 'Beijing',\n * zip: '100000'\n * }\n * },\n * tags: ['a', 'b', 'c']\n * }\n *\n * // 字符串路径(点号分隔)\n * getByPath(obj, 'user.name') // => 'John'\n * getByPath(obj, 'user.address.city') // => 'Beijing'\n *\n * // 数组路径\n * getByPath(obj, ['user', 'name']) // => 'John'\n * getByPath(obj, ['user', 'address', 'city']) // => 'Beijing'\n *\n * // 数组索引\n * getByPath(obj, ['tags', 0]) // => 'a'\n *\n * // 路径不存在\n * getByPath(obj, 'user.age') // => undefined\n * ```\n */\nexport function getByPath<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n TValue = FieldValue<TValues, TName>,\n>(obj: Partial<TValues>, path: TName): TValue | undefined {\n if (path === \"\" || (Array.isArray(path) && path.length === 0)) {\n return obj as unknown as TValue\n }\n\n return get(obj, normalizeRuntimePath(path))\n}\n\n/**\n * 在对象中根据路径设置嵌套值\n *\n * @param obj - 要设置值的目标对象\n * @param path - NamePath 路径(string / number / array)\n * @param value - 要设置的值\n *\n * @example\n * ```ts\n * const obj = { user: { name: 'John' } }\n *\n * // 字符串路径\n * setByPath(obj, 'user.name', 'Jane')\n * // obj => { user: { name: 'Jane' } }\n *\n * // 自动创建中间对象\n * setByPath(obj, 'user.address.city', 'Beijing')\n * // obj => { user: { name: 'Jane', address: { city: 'Beijing' } } }\n *\n * // 数组路径\n * setByPath(obj, ['user', 'address', 'zip'], '100000')\n *\n * // 空路径或对象为 null/undefined 时不做操作\n * setByPath(null, 'path', 'value') // 无操作\n * setByPath(undefined, 'path', 'value') // 无操作\n * ```\n */\nexport function setByPath<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n TValue = FieldValue<TValues, TName>,\n>(obj: Partial<TValues>, path: TName, value: TValue): void {\n if (obj == null) return\n\n set(obj, normalizeRuntimePath(path), value)\n}\n\n/**\n * 从对象中递归收集所有叶子节点路径。\n *\n * 只返回叶子路径,不包含中间对象/数组节点。\n *\n * @param obj - 要收集路径的对象\n * @param prefix - 路径前缀(内部递归用)\n * @returns 所有叶子节点路径数组\n *\n * @example\n * ```typescript\n * collectObjectPathsByLeaf({ name: 'a', age: 25 })\n * // => ['name', 'age']\n *\n * collectObjectPathsByLeaf({ name: 'a', address: { city: 'BJ', zip: '100000' } })\n * // => ['name', 'address.city', 'address.zip']\n * ```\n */\nexport function collectObjectPathsByLeaf<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(obj: Partial<TValues>, prefix = \"\"): TName[] {\n const paths: TName[] = []\n\n for (const key of Object.keys(obj)) {\n const path = prefix ? `${prefix}.${key}` : key\n const value = obj[key]\n\n if (Array.isArray(value)) {\n value.forEach((item: unknown, index: number) => {\n const itemPath = `${path}[${index}]` as TName\n if (item !== null && typeof item === \"object\") {\n paths.push(...(collectObjectPathsByLeaf(item, itemPath as string) as TName[]))\n } else {\n paths.push(itemPath)\n }\n })\n } else if (value !== null && typeof value === \"object\") {\n paths.push(...(collectObjectPathsByLeaf(value, path) as TName[]))\n } else {\n paths.push(path as TName)\n }\n }\n\n return paths\n}\n\n/**\n * 规范化字段路径,保证字符串路径和数组路径落到同一个索引键。\n *\n * @param path - 字段路径。\n * @returns 规范化后的点号路径字符串。\n *\n * @example\n * ```typescript\n * normalizeNamePath(['user', 'name']) // => 'user.name'\n * normalizeNamePath('user[0].name') // => 'user.0.name'\n * ```\n */\nexport function normalizeNamePath<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(path: TName[]): string {\n if (Array.isArray(path)) {\n return path.map((part) => String(part)).join(\".\")\n }\n\n return String(path)\n .replace(/\\[(.*?)\\]/g, \".$1\")\n .replace(/^\\./, \"\")\n}\n\nconst normalizeRuntimePath = (path: NamePath): RuntimePath => {\n if (Array.isArray(path)) {\n return path.map((part) => (typeof part === \"number\" ? part : String(part)))\n }\n\n return path as string | number\n}\n","/**\n * 异步工具函数\n *\n * @module utils/async\n *\n * @example\n * ```ts\n * import { withLock, waitAll } from '@schemx/core'\n *\n * // 使用 withLock 防止重复提交\n * const submit = withLock(async (data) => {\n * await api.post('/submit', data)\n * })\n *\n * // 多次调用只会执行一次\n * submit(data1)\n * submit(data2) // 复用第一个 Promise\n *\n * // 使用 waitAll 等待多个 Promise,带超时\n * const promises = [fetch('/a'), fetch('/b'), fetch('/c')]\n * const result = await waitAll(promises, 5000)\n *\n * console.log('已完成:', result.results)\n * console.log('未完成:', result.remaining)\n * ```\n */\n\n/**\n * 等待所有 Promise 完成或超时\n *\n * 当所有 Promise 在超时前完成后立即返回,\n * 超时后返回已完成的结果和剩余未完成数。\n *\n * @param promises - Promise 数组\n * @param timeout - 超时时间(毫秒),默认 10000\n * @returns 包含结果和剩余未完成数的对象\n *\n * @example\n * ```ts\n * // 正常情况:所有都完成\n * const promises = [\n * Promise.resolve(1),\n * Promise.resolve(2),\n * Promise.resolve(3)\n * ]\n * const result = await waitAll(promises)\n * // result => { results: [1, 2, 3], remaining: 0 }\n *\n * // 超时情况:部分完成\n * const slowPromises = [\n * Promise.resolve('fast'),\n * new Promise(resolve => setTimeout(() => resolve('slow'), 2000))\n * ]\n * const result2 = await waitAll(slowPromises, 1000)\n * // result2 => { results: ['fast', undefined], remaining: 1 }\n *\n * // 空数组\n * const result3 = await waitAll([])\n * // result3 => { results: [], remaining: 0 }\n * ```\n */\nexport async function waitAll<T>(\n promises: Promise<T>[],\n timeout: number = 10000\n): Promise<{ results: T[]; remaining: number }> {\n if (promises.length === 0) {\n return { results: [], remaining: 0 }\n }\n\n const results: T[] = []\n let completed = 0\n const total = promises.length\n\n await Promise.race([\n Promise.allSettled(\n promises.map(async (p, i) => {\n try {\n results[i] = await p\n } catch {\n // 不在这里处理错误,让调用方自行处理\n }\n\n completed++\n })\n ),\n new Promise<void>((resolve) => {\n setTimeout(() => {\n resolve()\n }, timeout)\n }),\n ])\n\n return {\n results,\n remaining: total - completed,\n }\n}\n\n/**\n * 创建一个带锁的异步函数。\n *\n * 当函数正在执行时,重复调用会直接返回同一个 Promise;\n * 执行完成后自动释放锁,下次调用重新执行。\n *\n * @param fn - 要加锁的异步函数\n * @returns 加锁后的函数\n *\n * @remarks\n * 返回函数会透传原函数参数;并发期间的后续调用会共享第一次调用的 Promise。\n *\n * @example\n * ```typescript\n * const lockedSubmit = withLock(async () => {\n * await api.submit(data)\n * })\n *\n * lockedSubmit()\n * lockedSubmit() // 复用上一次的 Promise\n * ```\n */\nexport function withLock<T extends (...args: any[]) => Promise<any>>(fn: T): T {\n let pending: Promise<any> | null = null\n\n return ((...args: any[]) => {\n if (pending) return pending\n\n pending = fn(...args).finally(() => {\n pending = null\n })\n\n return pending\n }) as T\n}\n","/**\n * 对象浅层 diff 工具\n *\n * 提供三个函数:\n * - {@link diff} — 对比两个对象,返回变化的 key、新值和旧值\n * - {@link diffValues} — 对比两个对象,仅返回变化的属性新值\n * - {@link diffPaths} — 对比两个对象,返回变化的属性路径列表\n *\n * 使用 `isEqual`(来自 es-toolkit)进行深度比较。\n *\n * @module core/utils/diff\n */\n\nimport { isEqual } from \"es-toolkit/compat\"\n\n/**\n * 对比两个对象的顶层属性,仅返回变化的属性新值。\n *\n * 遍历 current 的所有 key,与 prev 逐一深度比较,\n * 收集不相等的 key 对应的新值。\n *\n * @typeParam T - 对象类型\n *\n * @param current - 当前对象\n * @param prev - 上一次对象\n *\n * @returns 变化的属性新值(部分对象)\n *\n * @example\n * ```typescript\n * const changed = diffValues({ a: 1, b: 2 }, { a: 1, b: 3 })\n * // changed => { b: 2 }\n * ```\n */\nexport function diff<T extends Record<string, unknown>>(current: T, prev: T): Partial<T> {\n const changedValues: Partial<T> = {}\n\n for (const key of Object.keys(current) as (keyof T)[]) {\n if (!isEqual(current[key], prev[key])) {\n changedValues[key] = current[key]\n }\n }\n\n return changedValues\n}\n","export const defaultConfig = {\n /**\n * 是否展示必填的 * 号(静态默认值)\n *\n * 控制必填标记(红色星号)的显示。\n * 若未设置,会根据 `rules` 中的校验规则自动推断。\n */\n required: false,\n\n /**\n * 是否只读(静态默认值)\n *\n * 未设置时继承 FormContext 的全局 `readonly` 配置。\n */\n readonly: false,\n\n /**\n * 是否禁用(静态默认值)\n *\n * 未设置时继承 FormContext 的全局 `disabled` 配置。\n */\n disabled: false,\n\n /**\n * 是否可见(静态默认值)\n *\n * 不可见时字段不渲染,同时会清除校验规则和错误信息。\n */\n visible: true,\n\n /**\n * 标签图标\n *\n * 显示在 label 文本旁的图标标识。\n */\n labelIcon: \"\",\n\n /**\n * 标签对齐方式\n *\n * 未设置时继承 FormContext 的全局 `labelAlign` 配置。\n */\n labelAlign: \"left\",\n\n /**\n * 标签位置\n *\n * 未设置时继承 FormContext 的全局 `labelPosition` 配置。\n */\n labelPosition: \"left\",\n\n /**\n * 标签宽度\n *\n * 未设置时继承 FormContext 的全局 `labelWidth` 配置。\n */\n labelWidth: \"auto\",\n\n /**\n * 校验触发时机\n *\n * 支持单个或多个触发时机组合,如 `'change'`、`'blur'`、`['change', 'blur']`。\n * 未设置时继承 FormContext 的全局 `validationTrigger` 配置。\n */\n validationTrigger: \"blur\",\n\n /**\n * 是否在标签后显示冒号\n *\n * 未设置时继承 FormContext 的全局 `colon` 配置。\n */\n colon: true,\n} as const\n\nexport type DefaultConfigKey = keyof typeof defaultConfig\n\nexport const defaultConfigKey = Object.keys(defaultConfig) as DefaultConfigKey[]\n","/**\n * 表单校验器。\n *\n * 管理校验规则(rules)和校验错误(errors),基于 Standard Schema 接口进行字段校验。\n * 使用 ReactiveMap 管理错误状态,支持 effect 自动追踪依赖。\n * 支持所有实现了 StandardSchemaV1 接口的验证库(Zod v4、Valibot、ArkType 等)。\n *\n * @module core/validator\n *\n * @example\n * ```typescript\n * import { createValidator } from '@schemx/core'\n *\n * const validator = createValidator()\n *\n * // 注册校验规则\n * validator.register('email', emailSchema)\n *\n * // 注册校验规则并指定空值提示\n * validator.register('address', addressSchema, '请输入收货地址')\n *\n * // 校验单个字段\n * const result = await validator.validateField('email', latestValues)\n * ```\n */\n\nimport { batchUpdates, createSignalMap } from \"../reactivity\"\nimport { getByPath } from \"../utils\"\n\nimport type { NamePath, StandardSchemaV1, Values } from \"../types\"\n\n/**\n * 单个字段的校验错误。\n */\nexport interface FieldError {\n field: string\n message: string[]\n}\n\n/**\n * 表单校验失败结果。\n *\n * 包含所有失败字段以及校验时使用的值快照。\n */\nexport interface ValidateError<TValues extends Values = Values> {\n errors: FieldError[]\n values: TValues\n}\n\n/**\n * 表单校验结果。\n *\n * 成功分支返回通过校验的 values,失败分支返回字段错误集合。\n */\nexport type ValidateResult<TValues extends Values = Values> =\n | { ok: true; values: TValues }\n | { ok: false; error: ValidateError<TValues> }\n\n/**\n * 校验规则条目。\n *\n * 包含一组 StandardSchemaV1 schema 和可选的空值默认错误提示。\n * 当字段值为 `undefined`/`null` 时,使用 `defaultMessage` 作为错误提示,\n * 避免验证库报出类型错误(如 Zod 的 \"expected string, received undefined\")。\n */\nexport interface ValidateEntry<_TValues extends Values = Values> {\n /** 符合 StandardSchemaV1 接口的校验 schema 列表 */\n schemas: StandardSchemaV1[]\n /**\n * 空值(undefined/null)时的默认错误提示。\n *\n * 设置后,当字段值为 undefined/null 时直接返回此提示,不调用 schema 校验。\n * 未设置时将原始值直接传给 schema。\n */\n defaultMessage?: string\n}\n\n/**\n * 表单校验器。\n *\n * 不持有 store 引用,所有值由调用方传入。\n * 基于 Standard Schema 接口进行字段校验,支持同步和异步规则。\n * 兼容所有实现了 StandardSchemaV1 接口的验证库。\n *\n * 每个字段可配置 `defaultMessage`,当值为 `undefined`/`null` 时\n * 跳过 schema 校验并返回该提示,避免验证库报类型错误。\n *\n * @typeParam TValues - 表单值类型,默认为 Values\n *\n * @example\n * ```typescript\n * const validator = new Validator<Values>()\n * validator.register('email', emailSchema)\n * validator.register('address', addressSchema, '请输入收货地址')\n * const result = await validator.validateField('email', formValues)\n * ```\n *\n * @remarks\n * 校验规则通过纯 Map 管理,错误状态通过 ReactiveMap 管理,\n * 在 effect 内调用 getFieldError 时自动追踪依赖。\n */\nclass ValidatorImpl<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> {\n /** 校验规则映射表:字段路径 → 规则条目 */\n private rules = new Map<TName, ValidateEntry<TValues>>()\n\n /** 校验错误映射表:字段路径 → 错误信息数组(响应式) */\n private errors = createSignalMap<TName, string[]>()\n\n /**\n * 注册单个字段的校验规则。\n *\n * 支持传入单个 schema 或 schema 数组,多次调用会追加规则而非覆盖。\n *\n * @param path - 字段路径\n * @param rules - 单个或多个 StandardSchemaV1 校验 schema\n * @param defaultMessage - 可选,空值(undefined/null)时的默认错误提示\n *\n * @example\n * ```typescript\n * validator.register('email', emailSchema)\n * validator.register('name', [minLenSchema, maxLenSchema], '请输入姓名')\n * ```\n */\n public register(\n path: TName,\n rules: StandardSchemaV1 | StandardSchemaV1[],\n defaultMessage?: string\n ): void {\n const schemas = Array.isArray(rules) ? rules : [rules]\n const existing = this.rules.get(path)\n\n if (existing) {\n existing.schemas.push(...schemas)\n\n if (defaultMessage) {\n existing.defaultMessage = defaultMessage\n }\n } else {\n this.rules.set(path, { schemas, defaultMessage })\n }\n }\n\n /**\n * 注销单个字段的校验规则,同时清除该字段的错误信息。\n *\n * @param path - 字段路径\n *\n * @example\n * ```typescript\n * validator.unregister('email')\n * ```\n */\n public unregister(path: TName): void {\n this.rules.delete(path)\n this.errors.delete(path)\n }\n\n /**\n * 获取指定字段的错误信息。\n *\n * @param path - 字段路径\n * @returns 错误信息数组,无错误时返回 undefined\n *\n * @example\n * ```typescript\n * validator.getFieldError('email') // => ['邮箱格式不正确']\n * ```\n */\n public getFieldError(path: TName): string[] | undefined {\n return this.errors.get(path)\n }\n\n /**\n * 手动设置指定字段的错误信息。\n *\n * @param path - 字段路径\n * @param errors - 错误信息数组\n *\n * @example\n * ```typescript\n * validator.setFieldError('email', ['该邮箱已被注册'])\n * ```\n */\n public setFieldError(path: TName, errors: string[]): void {\n this.errors.set(path, errors)\n }\n\n /**\n * 校验指定字段。\n *\n * 支持传入单个路径或路径数组,逐个校验后返回汇总结果。\n *\n * @param path - 字段路径或路径数组\n * @param latestValues - 当前表单全量值\n * @returns 校验结果\n *\n * @example\n * ```typescript\n * const result = await validator.validateField('email', formValues)\n * const result = await validator.validateField(['name', 'email'], formValues)\n *\n * if (!result.ok) console.log(result.error.errors)\n * ```\n */\n async validateField(\n path: TName | TName[],\n latestValues: TValues\n ): Promise<ValidateResult<TValues>> {\n const paths = (Array.isArray(path) ? path : [path]) as TName[]\n\n this.reset(paths)\n\n let allValid = true\n\n for (const p of paths) {\n const result = await this.validateSingleRule(p as TName, latestValues)\n if (!result.ok) allValid = false\n }\n\n return this.buildResult(allValid, latestValues)\n }\n\n /**\n * 校验所有已注册规则的字段。\n *\n * 校验前清空所有错误,逐个校验后返回汇总结果。\n *\n * @param latestValues - 当前表单全量值\n * @returns 校验结果\n *\n * @example\n * ```typescript\n * const result = await validator.validate(formValues)\n * if (result.ok) submit(result.values)\n * ```\n */\n async validate(latestValues: TValues): Promise<ValidateResult<TValues>> {\n let allValid = true\n\n this.reset()\n\n for (const path of this.rules.keys()) {\n const result = await this.validateSingleRule(path, latestValues)\n if (!result.ok) allValid = false\n }\n\n return this.buildResult(allValid, latestValues)\n }\n\n /**\n * 重置所有字段的校验错误。\n *\n * 清空 errors 映射表,不影响已注册的校验规则。\n *\n * @param paths - 可选的字段路径数组;不传时重置所有已注册字段。\n *\n * @example\n * ```typescript\n * validator.resetErrors()\n * ```\n */\n public reset(paths?: TName[]): void {\n if (paths) {\n batchUpdates(() => {\n for (const key of paths) {\n this.errors.set(key, [])\n }\n })\n\n return\n }\n\n // 无参数时:为所有已注册 rules 的字段初始化 error reactive value(设为 []),\n // 确保 effect 能追踪到具体字段的 reactive value 而非仅依赖 version。\n // 同时清除不在 rules 中但已有 error 的字段(如手动 setFieldError 的残留)。\n batchUpdates(() => {\n for (const key of this.rules.keys()) {\n this.errors.set(key, [])\n }\n\n for (const key of [...this.errors.keys()]) {\n if (!this.rules.has(key)) {\n this.errors.delete(key)\n }\n }\n })\n }\n\n /**\n * 根据校验结果构建 ValidateResult 返回值。\n *\n * @param ok - 校验是否全部通过\n * @param latestValues - 当前表单全量值\n * @returns 统一的校验结果对象\n */\n private buildResult(ok: boolean, latestValues: TValues): ValidateResult<TValues> {\n if (ok) {\n return { ok: true, values: latestValues }\n }\n\n return {\n ok: false,\n error: {\n errors: Array.from(this.errors.keys()).map((field) => ({\n field: field as string,\n message: this.errors.peek(field) || [],\n })),\n values: latestValues,\n },\n }\n }\n\n /**\n * 记录字段错误并返回失败结果。\n *\n * @param path - 字段路径\n * @param messages - 错误信息数组\n * @param latestValues - 当前表单全量值\n * @returns 失败的校验结果\n */\n private failResult(\n path: TName,\n messages: string[],\n latestValues: TValues\n ): ValidateResult<TValues> {\n this.errors.set(path, messages)\n\n return {\n ok: false,\n error: {\n errors: [{ field: path as string, message: messages }],\n values: latestValues,\n },\n }\n }\n\n /**\n * 校验单个字段的所有规则。\n *\n * 依次执行该字段注册的所有 schema,遇到第一个失败即返回错误。\n * 若值为 undefined/null 且配置了 defaultMessage,直接返回失败结果。\n *\n * @param path - 字段路径\n * @param latestValues - 当前表单全量值\n * @returns 校验结果\n */\n private async validateSingleRule(\n path: TName,\n latestValues: TValues\n ): Promise<ValidateResult<TValues>> {\n const entry = this.rules.get(path)\n\n if (!entry || entry.schemas.length === 0) {\n this.errors.delete(path)\n\n return { ok: true, values: latestValues }\n }\n\n const value = getByPath(latestValues, path)\n\n const allMessages: string[] = []\n\n // 空值拦截:当值为 undefined/null 且配置了 defaultMessage 时,\n // 直接返回该字段的默认错误提示,避免验证库报类型错误\n if ((value === undefined || value === null) && entry.defaultMessage) {\n allMessages.push(entry.defaultMessage)\n }\n\n // 解析快捷规则(如 createRequiredRule)\n for (const schema of entry.schemas) {\n try {\n const result = await schema[\"~standard\"].validate(value)\n\n if (result.issues) {\n allMessages.push(...result.issues.map((i: { message: any }) => i.message))\n }\n } catch (error) {\n console.warn(`[Validator] 校验字段 \"${path}\" 时发生错误:`, error)\n allMessages.push(\"校验失败\")\n }\n }\n\n if (allMessages.length > 0) {\n return this.failResult(path, allMessages, latestValues)\n }\n\n this.errors.delete(path)\n\n return { ok: true, values: latestValues }\n }\n}\n\n/**\n * Validator 的实例类型。\n */\nexport type Validator<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> = InstanceType<typeof ValidatorImpl<TValues, TName>>\n\n/**\n * 创建 Validator 实例的工厂函数。\n *\n * @typeParam TValues - 表单值类型\n *\n * @returns Validator 实例\n *\n * @example\n * ```typescript\n * const validator = createValidator<Values>()\n * ```\n */\nexport function createValidator<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(): Validator<TValues, TName> {\n return new ValidatorImpl<TValues, TName>()\n}\n","/**\n * 内置默认校验规则工厂。\n *\n * 提供轻量的内置校验 schema 构造函数,\n * 用于替代直接依赖 Zod 等第三方库构造必填规则。\n *\n * @module core/validator/defaultRules\n *\n * @example\n * ```ts\n * import {\n * createRequiredRule,\n * createSelectRequiredRule,\n * createUploadRequiredRule\n * } from '@schemx/core'\n *\n * // 在 validatorRegistry 中注册\n * const registry = createValidatorsRegistry()\n * registry.registerAll({\n * required: createRequiredRule,\n * selectRequired: createSelectRequiredRule,\n * uploadRequired: createUploadRequiredRule\n * })\n *\n * // 在 schemas 中使用(通过名称引用)\n * const schemas = [\n * {\n * name: 'username',\n * label: '用户名',\n * componentType: 'input',\n * rules: ['required'] // 使用内置规则\n * },\n * {\n * name: 'city',\n * label: '城市',\n * componentType: 'select',\n * rules: ['selectRequired']\n * },\n * {\n * name: 'avatar',\n * label: '头像',\n * componentType: 'upload',\n * rules: ['uploadRequired']\n * }\n * ]\n *\n * // 直接使用(不通过 registry)\n * const schema = { name: 'username', label: '用户名', componentType: 'input' }\n * const rule = createRequiredRule(schema)\n * const result = rule['~standard'].validate('')\n * // result => { issues: [{ message: '请输入用户名' }] }\n * ```\n */\n\nimport type { SchemxBaseField, StandardSchemaV1, Values } from \"../types\"\n\n/**\n * 创建内置必填校验 schema。\n *\n * 返回一个符合 StandardSchemaV1 接口的轻量校验对象。\n * 当值为 `undefined`、`null` 或空字符串时校验失败,返回包含提示信息的 issues。\n *\n * @param schema - 字段 schema,用于从 label 生成默认提示文案。\n *\n * @returns 符合 StandardSchemaV1 接口的必填校验 schema\n *\n * @example\n * ```ts\n * const schema = createRequiredRule({ label: '用户名', ... })\n *\n * schema['~standard'].validate('') // => { issues: [{ message: '请输入用户名' }] }\n * schema['~standard'].validate(undefined) // => { issues: [{ message: '请输入用户名' }] }\n * schema['~standard'].validate('hello') // => { value: 'hello' }\n * ```\n */\nexport function createRequiredRule<TValues extends Values = Values>(\n schema?: SchemxBaseField<TValues>\n): StandardSchemaV1<unknown, unknown> {\n /**\n * 校验空值并返回 Standard Schema v1 结果。\n */\n const validate = (value: unknown): StandardSchemaV1.Result<unknown> => {\n if (value === undefined || value === null || value === \"\") {\n const label = schema?.label ?? \"\"\n\n return standardIssueResult(label ? `请输入${label}` : \"此项为必填项\")\n }\n\n return standardValueResult(value)\n }\n\n return buildStandardSchema(validate)\n}\n\n/**\n * 创建选择类必填校验 schema。\n *\n * 适用于下拉选择、级联选择等组件。\n * 当值为 `undefined`、`null`、空字符串或空数组时校验失败。\n *\n * @param schema - 字段 schema,用于从 label 生成默认提示文案。\n *\n * @returns 符合 StandardSchemaV1 接口的选择必填校验 schema\n *\n * @example\n * ```ts\n * const schema = createSelectRequiredRule({ label: '城市', ... })\n *\n * schema['~standard'].validate(undefined) // => { issues: [{ message: '请选择城市' }] }\n * schema['~standard'].validate(null) // => { issues: [{ message: '请选择城市' }] }\n * schema['~standard'].validate('') // => { issues: [{ message: '请选择城市' }] }\n * schema['~standard'].validate([]) // => { issues: [{ message: '请选择城市' }] }\n * schema['~standard'].validate('beijing') // => { value: 'beijing' }\n * schema['~standard'].validate([1, 2]) // => { value: [1, 2] }\n * ```\n */\nexport function createSelectRequiredRule<TValues extends Values = Values>(\n schema?: SchemxBaseField<TValues>\n): StandardSchemaV1 {\n /**\n * 校验选择类空值并返回 Standard Schema v1 结果。\n */\n const validate = (value: unknown): StandardSchemaV1.Result<unknown> => {\n if (\n value === undefined ||\n value === null ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0)\n ) {\n const label = schema?.label ?? \"\"\n\n return standardIssueResult(label ? `请选择${label}` : \"此项为必选项\")\n }\n\n return standardValueResult(value)\n }\n\n return buildStandardSchema(validate)\n}\n\n/**\n * 创建上传类必填校验 schema。\n *\n * 适用于文件上传组件,值通常为数组。\n * 当值为 `undefined`、`null` 或空数组时校验失败。\n *\n * @param schema - 字段 schema,用于从 label 生成默认提示文案。\n *\n * @returns 符合 StandardSchemaV1 接口的上传必填校验 schema\n *\n * @example\n * ```ts\n * const schema = createUploadRequiredRule({ label: '文件', ... })\n *\n * schema['~standard'].validate(undefined) // => { issues: [{ message: '请上传文件' }] }\n * schema['~standard'].validate(null) // => { issues: [{ message: '请上传文件' }] }\n * schema['~standard'].validate([]) // => { issues: [{ message: '请上传文件' }] }\n * schema['~standard'].validate([file]) // => { value: [file] }\n * ```\n */\nexport function createUploadRequiredRule<TValues extends Values = Values>(\n schema?: SchemxBaseField<TValues>\n): StandardSchemaV1<unknown, unknown> {\n /**\n * 校验上传类空值并返回 Standard Schema v1 结果。\n */\n const validate = (value: unknown): StandardSchemaV1.Result<unknown> => {\n if (\n value === undefined ||\n value === null ||\n (Array.isArray(value) && value.length === 0)\n ) {\n const label = schema?.label ?? \"\"\n\n return standardIssueResult(label ? `请上传${label}` : \"此项为必传项\")\n }\n\n return standardValueResult(value)\n }\n\n return buildStandardSchema(validate)\n}\n\nconst buildStandardSchema = (\n validate: StandardSchemaV1.Props[\"validate\"]\n): StandardSchemaV1<unknown, unknown> => {\n return {\n \"~standard\": {\n version: 1,\n vendor: \"schemx\",\n validate,\n },\n }\n}\n\nconst standardIssueResult = (message: string): StandardSchemaV1.Result<unknown> => {\n return {\n issues: [{ message }],\n }\n}\n\nconst standardValueResult = (value: unknown): StandardSchemaV1.Result<unknown> => {\n return { value }\n}\n","/**\n * 渲染器注册中心。\n *\n * 纯粹的注册/查询中心,不负责渲染逻辑。\n *\n * @module core/registry/rendererRegistry\n *\n * @example\n * ```ts\n * import { createRendererRegistry, type RendererMap } from '@schemx/core'\n *\n * // 定义渲染器组件\n * const InputRenderer = (props) => <input {...props} />\n * const SelectRenderer = (props) => <select {...props} />\n * const TextRenderer = (props) => <span>{props.value}</span>\n *\n * // 创建注册中心,带默认渲染器\n * const registry = createRendererRegistry('text')\n *\n * // 单个注册\n * registry.register('input', InputRenderer)\n * registry.register('select', SelectRenderer)\n *\n * // 批量注册\n * const renderers: RendererMap = {\n * text: TextRenderer,\n * number: InputRenderer,\n * date: InputRenderer\n * }\n * registry.registerAll(renderers)\n *\n * // 获取渲染器\n * const inputRenderer = registry.getRenderer('input')\n * const fallback = registry.getRenderer('unknown') // 返回默认的 'text'\n *\n * // 检查是否存在\n * registry.hasRenderer('input') // => true\n *\n * // 获取所有类型\n * registry.getTypes() // => ['input', 'select', 'text', 'number', 'date']\n *\n * // 设置默认渲染器\n * registry.setDefault('input')\n * registry.getDefault() // => 'input'\n *\n * // 取消注册\n * registry.unregister('date')\n *\n * // 清空所有\n * registry.clear()\n * ```\n *\n * @example\n * ```ts\n * // 在 createForm 中使用\n * const rendererRegistry = createRendererRegistry()\n * rendererRegistry.registerAll(customRenderers)\n *\n * const form = createForm({\n * schemas: [...],\n * rendererRegistry // 使用自定义渲染器注册中心\n * })\n * ```\n */\n\nimport type { SchemxRendererKey } from \"../types\"\n\n/**\n * 渲染器注册选项。\n */\nexport interface RegistryOptions {\n /** 是否覆盖已存在的渲染器 */\n override?: boolean\n}\n\n/**\n * 渲染器组件映射类型。\n *\n * key 为渲染器类型字符串,value 为对应的框架组件。\n */\nexport type RendererMap<T extends SchemxRendererKey, R = unknown> = Record<T, R>\n\n/**\n * 渲染器注册中心。\n *\n * 纯粹的 Map 存储。\n *\n * @example\n * ```typescript\n * const renderer = new RendererRegistryType()\n *\n * // 注册组件\n * renderer.register('input', InputRenderer)\n *\n * // 批量注册\n * renderer.registerAll({ text: TextRenderer, number: NumberRenderer })\n * ```\n *\n * @remarks\n * 当 getRenderer 找不到指定类型时,会自动回退到默认渲染器类型(默认为 'text')。\n */\nexport class RendererRegistry<\n T extends SchemxRendererKey = SchemxRendererKey,\n R = unknown,\n> {\n /** 渲染器存储 */\n private renderers: Map<T, R>\n\n /** 默认渲染器类型 */\n private defaultType?: T\n\n /**\n * 创建 Registry 实例。\n *\n * @param defaultType - 默认渲染器类型,未找到指定类型时回退使用\n */\n constructor(defaultType?: T) {\n this.renderers = new Map()\n this.defaultType = defaultType\n }\n\n /**\n * 注册渲染器。\n *\n * 默认会覆盖已存在的同名渲染器,可通过 `options.override` 控制。\n *\n * @param type - 渲染器类型标识\n * @param renderer - 组件\n * @param options - 注册选项\n *\n * @example\n * ```typescript\n * renderer.register('text', TextRenderer)\n * renderer.register('text', NewTextRenderer, { override: true })\n * ```\n */\n register(type: T, renderer: R, options?: RegistryOptions): void {\n if (this.renderers.has(type) && options?.override === false) {\n console.warn(\n `[RendererRegistryType] RendererRegistry \"${type}\" already exists, skipping registration`\n )\n\n return\n }\n\n this.renderers.set(type, renderer)\n }\n\n /**\n * 批量注册渲染器。\n *\n * 遍历映射对象逐个注册,已存在的同名渲染器会被直接覆盖。\n *\n * @param renderers - 类型到组件的映射对象\n *\n * @example\n * ```typescript\n * renderer.registerAll({\n * text: TextRenderer,\n * number: NumberRenderer,\n * date: DateRenderer,\n * })\n * ```\n */\n registerAll(renderers: RendererMap<T, R>): void {\n Object.entries(renderers).forEach(([type, renderer]) => {\n this.renderers.set(type as T, renderer as R)\n })\n }\n\n /**\n * 获取指定类型的渲染器组件。\n *\n * 未找到时自动回退到默认类型,默认类型也不存在则返回 undefined。\n *\n * @param type - 渲染器类型标识\n * @returns 对应的组件,未找到且无默认时返回 undefined\n *\n * @example\n * ```typescript\n * const renderer = renderer.getRenderer('text')\n * const fallback = renderer.getRenderer('unknown') // => 默认渲染器\n * ```\n */\n getRenderer(type: T): R | undefined {\n let renderer = this.renderers.get(type)\n\n if (!renderer) {\n console.warn(\n `[RendererRegistryType] RendererRegistry \"${type}\" not found, falling back to default \"${this.defaultType}\"`\n )\n\n if (this.defaultType) renderer = this.renderers.get(this.defaultType)\n }\n\n return renderer\n }\n\n /**\n * 检查渲染器是否已注册\n *\n * @param type - 渲染器类型标识\n * @returns 是否存在\n *\n * @example\n * ```typescript\n * renderer.hasRenderer('text') // => true\n * renderer.hasRenderer('custom') // => false\n * ```\n */\n hasRenderer(type: T): boolean {\n return this.renderers.has(type)\n }\n\n /**\n * 移除渲染器\n *\n * 如果移除的是当前默认类型,会从剩余渲染器中智能选取新默认类型。\n * 若无剩余渲染器则默认类型设为空字符串。\n *\n * @param type - 渲染器类型标识\n * @returns 是否成功移除\n *\n * @example\n * ```typescript\n * renderer.unregister('date') // => true\n * renderer.unregister('nonexistent') // => false\n * ```\n */\n unregister(type: T): boolean {\n const isDefault = type === this.defaultType\n const deleted = this.renderers.delete(type)\n\n if (isDefault && deleted) {\n const firstKey = this.renderers.keys().next().value\n\n if (firstKey) {\n console.warn(\n `[RendererRegistryType] Default renderer was removed, Please reset the default renderer.`\n )\n\n this.defaultType = firstKey\n }\n }\n\n return deleted\n }\n\n /**\n * 获取所有已注册的渲染器类型\n *\n * @returns 类型标识数组\n *\n * @example\n * ```typescript\n * renderer.getTypes() // => ['text', 'number', 'date']\n * ```\n */\n getTypes(): T[] {\n return Array.from(this.renderers.keys())\n }\n\n /**\n * 设置默认渲染器类型\n *\n * 当 getRenderer 找不到指定类型时,会回退到默认类型。\n * 设置的类型必须已注册,否则操作无效。\n *\n * @param type - 渲染器类型标识\n *\n * @example\n * ```typescript\n * renderer.setDefault('number')\n * renderer.getDefault() // => 'number'\n * ```\n */\n setDefault(type: T): void {\n if (!this.renderers.has(type)) {\n console.warn(\n `[RendererRegistryType] Cannot set default to \"${type}\": renderer not registered`\n )\n\n return\n }\n\n this.defaultType = type\n }\n\n /**\n * 获取当前默认渲染器类型\n *\n * @returns 默认类型标识\n *\n * @example\n * ```typescript\n * renderer.getDefault() // => 'text'\n * ```\n */\n getDefault(): T | undefined {\n return this.defaultType\n }\n\n /**\n * 清除所有已注册的渲染器并重置默认类型为 'text'。\n *\n * @example\n * ```typescript\n * renderer.clear()\n * renderer.size() // => 0\n * ```\n */\n clear(): void {\n this.renderers.clear()\n }\n\n /**\n * 获取已注册渲染器数量\n *\n * @returns 渲染器数量\n *\n * @example\n * ```typescript\n * renderer.size() // => 5\n * ```\n */\n size(): number {\n return this.renderers.size\n }\n}\n\n/**\n * RendererRegistryType 的实例类型\n */\nexport type RendererRegistryType<\n T extends SchemxRendererKey = SchemxRendererKey,\n R = unknown,\n> = RendererRegistry<T, R>\n\n/**\n * 创建局部渲染器注册中心实例(仅内部使用)。\n *\n * @param defaultType - 默认渲染器类型\n * @returns 新的 Registry 实例\n *\n * @remarks\n * 用于组件内部创建独立的注册中心实例,\n * 不建议外部直接使用,除非有特殊需求。\n */\nexport function createRendererRegistry<T extends SchemxRendererKey, R = unknown>(\n defaultType?: T\n): RendererRegistryType<T, R> {\n return new RendererRegistry<T, R>(defaultType)\n}\n","/**\n * Validators 校验注册中心。\n *\n * 管理 validators 名称到 StandardSchemaV1 实例或规则工厂的映射。\n * 字段 schema 中的字符串规则会在这里解析为可执行的 Standard Schema。\n *\n * @module core/registry/validatorRegistry\n *\n * @example\n * ```typescript\n * import { createValidatorsRegistry, type ValidatorsEntryMap } from '@schemx/core'\n * import { z } from 'zod'\n *\n * const validatorRegistry = createValidatorsRegistry()\n *\n * // 注册固定的 Standard Schema\n * validatorRegistry.register('phone', z.string().regex(/^1\\d{10}$/))\n * validatorRegistry.register('email', z.string().email())\n *\n * // 注册工厂函数(接收 schema 参数)\n * validatorRegistry.register('required', (schema) => {\n * return z.string().min(1, `${schema?.label}为必填项`)\n * })\n *\n * // 批量注册\n * const validators: ValidatorsEntryMap = {\n * min10: z.string().min(10),\n * max100: z.string().max(100)\n * }\n * validatorRegistry.registerAll(validators)\n *\n * // 获取原始注册项\n * const phoneValidator = validatorRegistry.get('phone')\n *\n * // 检查是否存在\n * validatorRegistry.has('email') // => true\n *\n * // 获取所有名称\n * validatorRegistry.getNames() // => ['phone', 'email', 'required', 'min10', 'max100']\n *\n * // 解析 schema(将字符串规则转换为 Standard Schema)\n * const schema = { name: 'phone', label: '手机号', componentType: 'input', rules: ['phone'] }\n * const resolved = validatorRegistry.resolveValidatorsBySchema(schema)\n * // resolved => [z.string().regex(...)]\n *\n * // 取消注册\n * validatorRegistry.unregister('max100')\n *\n * // 清空所有\n * validatorRegistry.clear()\n * ```\n *\n * @example\n * ```ts\n * // 在 createForm 中使用\n * const validatorRegistry = createValidatorsRegistry()\n * validatorRegistry.registerAll(customValidators)\n *\n * const form = createForm({\n * schemas: [\n * { name: 'phone', label: '手机号', componentType: 'input', rules: ['phone'] }\n * ],\n * validatorRegistry // 使用自定义校验规则注册中心\n * })\n * ```\n */\n\nimport type { SchemxBaseField, StandardSchemaV1, Values } from \"../types\"\nimport type { SchemxRuleKey } from \"../types/rule\"\n\n/**\n * Validators 工厂函数类型。\n *\n * 接收字段 schema,返回 StandardSchemaV1 实例。\n * 用于内置规则等需要运行时上下文才能生成 validators 的场景。\n */\nexport type ValidatorsFactory<TValues extends Values = Values> = (\n schema?: SchemxBaseField<TValues>\n) => StandardSchemaV1\n\n/**\n * Validators 注册条目类型。\n *\n * 支持直接的 StandardSchemaV1 实例或工厂函数。\n */\nexport type ValidatorsEntry<TValues extends Values = Values> =\n | StandardSchemaV1\n | ValidatorsFactory<TValues>\n\n/**\n * Validators 注册选项。\n */\nexport interface ValidatorsRegistryOptions {\n /** 是否覆盖已存在的同名 validators */\n override?: boolean\n}\n\n/**\n * Validators 映射类型。\n *\n * 每个 key 对应一个 StandardSchemaV1 实例或按字段 schema 延迟创建的工厂。\n */\nexport type ValidatorsEntryMap<TValues extends Values = Values> = Record<\n SchemxRuleKey,\n ValidatorsEntry<TValues>\n>\n\n/**\n * Validators 校验注册中心。\n *\n * 将 validators 名称映射到 StandardSchemaV1 实例或工厂函数。\n * 工厂函数接收字段 schema,用于生成带字段上下文的校验 schema。\n * 与 {@link RendererRegistryType}(渲染器注册中心)同构设计。\n *\n * @example\n * ```typescript\n * const validatorRegistry = new ValidatorsRegistryType()\n *\n * // 注册固定 validators\n * validatorRegistry.register('phone', phoneValidators)\n *\n * // 注册工厂函数(需要字段上下文)\n * validatorRegistry.register('required', (schema) => createRequiredValidators(schema))\n *\n * // 解析 schema(工厂会自动调用)\n * const [validators] = validatorRegistry.resolveValidatorsBySchema({\n * name: 'username',\n * label: '用户名',\n * componentType: 'input',\n * validators: 'required',\n * })\n * ```\n */\nexport class ValidatorsRegistry<TValues extends Values = Values> {\n /** Validators 存储 */\n private validators: Map<SchemxRuleKey, ValidatorsEntry<TValues>>\n\n /**\n * 创建 ValidatorsRegistryType 实例。\n *\n * 创建空的规则注册中心。\n */\n constructor() {\n this.validators = new Map()\n }\n\n /**\n * 注册校验规则。\n *\n * 支持 StandardSchemaV1 实例或工厂函数。\n * 默认覆盖已存在的同名规则,可通过 `options.override` 控制。\n *\n * @param name - validators 名称\n * @param validators - StandardSchemaV1 实例或工厂函数\n * @param options - 注册选项\n *\n * @example\n * ```typescript\n * // 注册固定 validators\n * validatorRegistry.register('phone', phoneValidators)\n *\n * // 注册工厂函数\n * validatorRegistry.register('required', (schema) => createRequiredValidators(schema))\n * ```\n */\n register(\n name: SchemxRuleKey,\n validators: ValidatorsEntry<TValues>,\n options?: ValidatorsRegistryOptions\n ): void {\n if (this.validators.has(name) && options?.override === false) {\n console.warn(`[ValidatorsRegistryType] Validators \"${name}\" 已存在,跳过注册`)\n\n return\n }\n\n this.validators.set(name, validators)\n }\n\n /**\n * 批量注册校验规则。\n *\n * 遍历映射对象逐个注册,已存在的同名规则会被直接覆盖。\n *\n * @param validators - 名称到 validators/工厂的映射对象\n *\n * @example\n * ```typescript\n * validatorRegistry.registerAll({\n * phone: phoneValidators,\n * required: (schema) => createRequiredValidators(schema),\n * })\n * ```\n */\n registerAll(validators: ValidatorsEntryMap<TValues>): void {\n Object.entries(validators).forEach(([name, validators]) => {\n this.validators.set(name as SchemxRuleKey, validators)\n })\n }\n\n /**\n * 获取指定名称的原始注册条目。\n *\n * 返回 StandardSchemaV1 实例或工厂函数,不做解析。\n * 如需按字段 schema 自动解析字符串规则和工厂,请使用 {@link resolveValidatorsBySchema}。\n *\n * @param name - validators 名称\n * @returns 对应的注册条目,未找到时返回 undefined\n *\n * @example\n * ```typescript\n * const entry = validatorRegistry.get('phone')\n * ```\n */\n get(name: SchemxRuleKey): ValidatorsEntry<TValues> | undefined {\n return this.validators.get(name)\n }\n\n /**\n * 解析字段 schema 上声明的校验规则。\n *\n * 字符串规则会从注册表查找;若注册项是工厂函数,则传入完整字段 schema\n * 生成 StandardSchemaV1 实例。已经是 StandardSchemaV1 的规则会原样返回。\n *\n * @param schema - 含 validators 的字段 schema。\n * @returns 解析后的 StandardSchemaV1 实例数组。\n *\n * @example\n * ```typescript\n * // 固定 validators 直接返回\n * validatorRegistry.resolveValidatorsBySchema({\n * name: 'phone',\n * label: '手机号',\n * componentType: 'input',\n * validators: 'phone',\n * })\n *\n * // 工厂函数会被调用\n * validatorRegistry.resolveValidatorsBySchema({\n * name: 'username',\n * label: '用户名',\n * componentType: 'input',\n * validators: 'required',\n * })\n * ```\n */\n resolveValidatorsBySchema(schema: SchemxBaseField<TValues>): StandardSchemaV1[] {\n const validators = schema?.rules ?? []\n\n const validatorsList = Array.isArray(validators) ? validators : [validators]\n\n const resolved: StandardSchemaV1[] = []\n\n for (const validators of validatorsList) {\n if (typeof validators === \"string\") {\n if (this.validators.has(validators)) {\n const entry = this.validators.get(validators)\n\n if (entry) {\n resolved.push(typeof entry === \"function\" ? entry(schema) : entry)\n }\n } else {\n console.warn(`[schemx] 未找到名为 \"${validators}\" 的校验规则`)\n }\n } else {\n if (validators) resolved.push(validators)\n }\n }\n\n return resolved\n }\n\n /**\n * 检查 validators 是否已注册。\n *\n * @param name - validators 名称\n * @returns 是否存在\n *\n * @example\n * ```typescript\n * validatorRegistry.has('phone') // => true\n * validatorRegistry.has('custom') // => false\n * ```\n */\n has(name: SchemxRuleKey): boolean {\n return this.validators.has(name)\n }\n\n /**\n * 移除校验规则。\n *\n * @param name - validators 名称\n * @returns 是否成功移除\n *\n * @example\n * ```typescript\n * validatorRegistry.unregister('phone') // => true\n * ```\n */\n unregister(name: SchemxRuleKey): boolean {\n return this.validators.delete(name)\n }\n\n /**\n * 获取所有已注册的 validators 名称。\n *\n * @returns validators 名称数组\n *\n * @example\n * ```typescript\n * validatorRegistry.getNames() // => ['phone', 'email', 'idCard']\n * ```\n */\n getNames(): SchemxRuleKey[] {\n return Array.from(this.validators.keys())\n }\n\n /**\n * 清除所有已注册的规则。\n *\n * @example\n * ```typescript\n * validatorRegistry.clear()\n * validatorRegistry.size() // => 0\n * ```\n */\n clear(): void {\n this.validators.clear()\n }\n\n /**\n * 获取已注册 validators 数量。\n *\n * @returns validators 数量\n *\n * @example\n * ```typescript\n * validatorRegistry.size() // => 3\n * ```\n */\n size(): number {\n return this.validators.size\n }\n}\n\n/**\n * RendererRegistryType 的实例类型\n */\nexport type ValidatorsRegistryType<TValues extends Values = Values> = InstanceType<\n typeof ValidatorsRegistry<TValues>\n>\n\n/**\n * 创建局部 validators 注册中心实例。\n *\n * 默认以全局 {@link globalValidatorsRegistry} 作为父级,\n * 查找时先查局部注册的规则,未命中则委托全局实例。\n *\n * @param parent - 父级注册中心,默认为全局单例\n *\n * @returns 带父级链的 ValidatorsRegistryType 实例\n *\n * @remarks\n * 用于 useForm 内部创建表单级别的注册中心实例,\n * 既能继承全局自定义规则,又能支持表单级别的规则覆盖。\n */\nexport function createValidatorsRegistry<\n TValues extends Values = Values,\n>(): ValidatorsRegistryType<TValues> {\n return new ValidatorsRegistry<TValues>()\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AsyncStack = void 0;\nconst GlobalSymbol = Symbol(\"Global\");\nclass AsyncStack {\n static getCurrent() {\n const current = this.current;\n return current;\n }\n static set(ctx) {\n this.current = ctx;\n }\n static fork() {\n const origin = AsyncStack.getCurrent();\n const fork = new AsyncStack(origin);\n fork.start();\n return fork;\n }\n constructor(origin) {\n // @ts-expect-error\n if (origin !== GlobalSymbol) {\n this.origin = origin;\n }\n }\n start() {\n AsyncStack.set(this);\n }\n // private yielded = false\n yield() {\n // if (!this.yielded) return;\n // this.yielded = true;\n AsyncStack.set(this.origin);\n }\n}\nexports.AsyncStack = AsyncStack;\n// @ts-expect-error\nAsyncStack.Global = new AsyncStack(GlobalSymbol);\nAsyncStack.current = AsyncStack.Global;\nAsyncStack.NO_DATA = Symbol(\"NO_DATA\");\n//# sourceMappingURL=AsyncStack.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.runInStack = exports.withContext = exports.createAsyncResolver = void 0;\nexports.callWithContext = callWithContext;\nconst AsyncStack_1 = require(\"./AsyncStack\");\nconst createAsyncResolver = (stack, callback, onlyOnce = true) => {\n let called = false;\n return function (...args) {\n if (onlyOnce && called)\n return;\n called = true;\n stack.yield();\n // Note: Is this fork neecessary? All tests are passing without it.\n // const fork = AsyncStack.fork()\n const result = callback.call(this, ...args);\n // fork.yield()\n return result;\n };\n};\nexports.createAsyncResolver = createAsyncResolver;\nfunction callWithContext(originalCallback, args) {\n const fork = AsyncStack_1.AsyncStack.fork();\n const patchedArgs = args.map((arg) => {\n if (typeof arg === \"function\") {\n return (0, exports.createAsyncResolver)(fork, arg);\n }\n return arg;\n });\n const result = originalCallback.call(this, ...patchedArgs);\n fork.yield();\n return result;\n}\n// This function ensure that the context is passed to the callback\n// That is called by the higher order function\nconst withContext = (originalCallback, onlyOnce = true) => {\n if (typeof originalCallback === \"undefined\")\n return undefined;\n return function (...args) {\n return callWithContext.call(this, originalCallback, args);\n };\n};\nexports.withContext = withContext;\nconst runInStack = (stackToUse, callback) => {\n const currentStack = AsyncStack_1.AsyncStack.getCurrent();\n stackToUse.start();\n try {\n const result = callback();\n currentStack.start();\n return result;\n }\n catch (err) {\n currentStack.start();\n throw err;\n }\n};\nexports.runInStack = runInStack;\n//# sourceMappingURL=_lib.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PromiseWithContext = exports.OriginalPromise = void 0;\nconst AsyncStack_1 = require(\"./AsyncStack\");\nconst _lib_1 = require(\"./_lib\");\nexports.OriginalPromise = Promise;\nclass PromiseWithContext extends exports.OriginalPromise {\n constructor(callback) {\n super((resolve, reject) => {\n const fork = AsyncStack_1.AsyncStack.fork();\n const wrapResolve = (0, _lib_1.createAsyncResolver)(fork, resolve);\n const wrapReject = (0, _lib_1.createAsyncResolver)(fork, reject);\n callback(wrapResolve, wrapReject);\n fork.yield();\n });\n }\n then(...args) {\n return _lib_1.callWithContext.call(this, super.then, args);\n }\n catch(...args) {\n return _lib_1.callWithContext.call(this, super.catch, args);\n }\n finally(...args) {\n return _lib_1.callWithContext.call(this, super.finally, args);\n }\n}\nexports.PromiseWithContext = PromiseWithContext;\n// Ensure that all methods of the original Promise\n// are available on the new PromiseWithContext\nObject.getOwnPropertyNames(Promise).forEach((method) => {\n if (typeof Promise[method] === \"function\") {\n PromiseWithContext[method] =\n exports.OriginalPromise[method].bind(PromiseWithContext);\n }\n});\n//# sourceMappingURL=Promise.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addEventListenerWithContext = exports.dispatchWithContext = void 0;\nconst AsyncStack_1 = require(\"./AsyncStack\");\nconst _lib_1 = require(\"./_lib\");\nconst originalAddEventListerner = EventTarget.prototype.addEventListener;\nconst originalDispatchEvent = EventTarget.prototype.dispatchEvent;\nconst stackByEvent = new WeakMap();\nconst dispatchWithContext = function (event) {\n const stack = AsyncStack_1.AsyncStack.getCurrent();\n stackByEvent.set(event, stack);\n return originalDispatchEvent.call(this, event);\n};\nexports.dispatchWithContext = dispatchWithContext;\nconst addEventListenerWithContext = function (event, callback, options) {\n const wrappedCallback = function (event) {\n const stackWhenDispatched = stackByEvent.get(event) || AsyncStack_1.AsyncStack.Global;\n return (0, _lib_1.runInStack)(stackWhenDispatched, () => {\n // @ts-ignore\n return callback.call(this, event);\n });\n };\n return originalAddEventListerner.call(this, event, wrappedCallback, options);\n};\nexports.addEventListenerWithContext = addEventListenerWithContext;\n//# sourceMappingURL=Events.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Polyfill = void 0;\nconst Promise_1 = require(\"./Promise\");\nconst Events_1 = require(\"./Events\");\nconst _lib_1 = require(\"./_lib\");\nconst root = (typeof global !== \"undefined\" && global) ||\n (typeof window !== \"undefined\" && window);\nclass Polyfill {\n static ensureEnabled() {\n if (Polyfill.enabled)\n return;\n Polyfill.enabled = true;\n // Polyfill Promise\n root.Promise = Promise_1.PromiseWithContext;\n // Polyfill Timers\n root.setTimeout = (0, _lib_1.withContext)(root.setTimeout);\n root.setInterval = (0, _lib_1.withContext)(root.setInterval);\n root.setImmediate = (0, _lib_1.withContext)(root.setImmediate);\n EventTarget.prototype.addEventListener = Events_1.addEventListenerWithContext;\n EventTarget.prototype.dispatchEvent = Events_1.dispatchWithContext;\n }\n}\nexports.Polyfill = Polyfill;\nPolyfill.originalSetTimeout = setTimeout;\nPolyfill.OriginalPromise = Promise_1.OriginalPromise;\nPolyfill.enabled = false;\n//# sourceMappingURL=Polyfill.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.runInFork = void 0;\nconst runInFork = (callback) => {\n let result;\n let error;\n new Promise((resolve) => {\n try {\n result = callback();\n resolve(result);\n }\n catch (err) {\n error = err;\n }\n });\n if (error) {\n throw error;\n }\n return result;\n};\nexports.runInFork = runInFork;\n//# sourceMappingURL=runInFork.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AsyncVariable = void 0;\nconst AsyncStack_1 = require(\"../polyfill/AsyncStack\");\nconst runInFork_1 = require(\"./utils/runInFork\");\nclass AsyncVariable {\n constructor() {\n this.data = new WeakMap();\n }\n static registerVariable(variable, stack) {\n if (!AsyncVariable.variableByStack.has(stack)) {\n AsyncVariable.variableByStack.set(stack, new Set());\n }\n AsyncVariable.variableByStack.get(stack).add(variable);\n }\n getBox(stack) {\n if (!stack)\n return undefined;\n const currentBox = this.data.get(stack);\n if (currentBox)\n return currentBox;\n const canWalkOrigin = AsyncVariable.stopWalkAt.has(stack);\n if (canWalkOrigin)\n return undefined;\n const parentBox = this.getBox(stack.origin);\n if (parentBox)\n this.setBox(stack, parentBox);\n return parentBox;\n }\n setBox(stack, box) {\n AsyncVariable.registerVariable(this, stack);\n this.data.set(stack, box);\n }\n set(stack, data) {\n this.setBox(stack, {\n value: data,\n });\n }\n get() {\n var _a;\n const current = AsyncStack_1.AsyncStack.getCurrent();\n return (_a = this.getBox(current)) === null || _a === void 0 ? void 0 : _a.value;\n }\n run(data, callback) {\n return (0, runInFork_1.runInFork)(() => {\n const current = AsyncStack_1.AsyncStack.getCurrent();\n this.set(current, data);\n return callback();\n });\n }\n wrap(data, callback) {\n // @ts-ignore\n return (...args) => this.run(data, () => callback(...args));\n }\n}\nexports.AsyncVariable = AsyncVariable;\nAsyncVariable.stopWalkAt = new WeakSet();\nAsyncVariable.variableByStack = new WeakMap();\n//# sourceMappingURL=AsyncVariable.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AsyncSnapshot = void 0;\nconst AsyncStack_1 = require(\"../polyfill/AsyncStack\");\nconst AsyncVariable_1 = require(\"./AsyncVariable\");\nconst runInFork_1 = require(\"./utils/runInFork\");\nclass AsyncSnapshot {\n capture() {\n let current = AsyncStack_1.AsyncStack.getCurrent();\n while (current) {\n const variables = AsyncVariable_1.AsyncVariable.variableByStack.get(current);\n variables === null || variables === void 0 ? void 0 : variables.forEach((variable) => {\n const alreadyHasVariable = this.dataByVariable.has(variable);\n if (!alreadyHasVariable) {\n const value = variable.get();\n this.dataByVariable.set(variable, value);\n }\n });\n current = current.origin;\n }\n }\n constructor() {\n this.dataByVariable = new Map();\n this.capture();\n }\n static create() {\n const snapshot = new AsyncSnapshot();\n return snapshot;\n }\n run(callback) {\n return (0, runInFork_1.runInFork)(() => {\n const current = AsyncStack_1.AsyncStack.getCurrent();\n AsyncVariable_1.AsyncVariable.stopWalkAt.add(current);\n this.dataByVariable.forEach((data, variable) => {\n variable.set(current, data);\n });\n return callback();\n });\n }\n wrap(callback) {\n return (...args) => this.run(() => callback(...args));\n }\n static wrap(callback) {\n return (0, runInFork_1.runInFork)(() => {\n const snapshot = AsyncSnapshot.create();\n return snapshot.wrap(callback);\n });\n }\n}\nexports.AsyncSnapshot = AsyncSnapshot;\n//# sourceMappingURL=AsyncSnapshot.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AsyncContext = void 0;\nconst AsyncVariable_1 = require(\"./AsyncVariable\");\nconst AsyncSnapshot_1 = require(\"./AsyncSnapshot\");\nclass AsyncContext {\n}\nexports.AsyncContext = AsyncContext;\nAsyncContext.Variable = AsyncVariable_1.AsyncVariable;\nAsyncContext.Snapshot = AsyncSnapshot_1.AsyncSnapshot;\n//# sourceMappingURL=AsyncContext.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\nconst Polyfill_1 = require(\"./polyfill/Polyfill\");\nPolyfill_1.Polyfill.ensureEnabled();\ntslib_1.__exportStar(require(\"./lib/AsyncContext\"), exports);\n//# sourceMappingURL=index.js.map","/**\n * Schemx 内部上下文模块。\n *\n * 基于 `simple-async-context` 实现,提供 ambient context 读取与临时覆盖。设计目标:\n *\n * - 仅供 core 包内部使用\n * - API 风格接近 React `createContext` / `useContext`,但以对象方法形式暴露\n * - 支持默认值\n * - 支持临时覆盖上下文(`Provider`)\n *\n * 作用域限制:ambient context **仅在 `Provider` 的同步调用栈内有效**。\n * 跨 `await` / 异步回调(`setTimeout` / `queueMicrotask` / 事件回调)不会自动延续。\n * 原因:`simple-async-context` 依赖 `Promise.prototype.then` 的 patch 拦截异步 continuation,\n * 但原生 `async/await` 的 continuation 走引擎内置 microtask 调度,不经过被 patch 的 `then`,\n * 因此 polyfill 拦不到。要让其跨 await 工作,需将构建 target 降级到 es6 把 async/await\n * 转译为 `.then()` 链——本项目保持 ESNext target,故不支持跨 await。\n *\n * 调用方若需在异步回调中读取 context,应在异步入口处显式 `Provider` 重新进入作用域,\n * 或在回调闭包中直接捕获所需的 context 值。\n *\n * 注意:`simple-async-context` 在导入时会 patch 全局 `Promise` / `setTimeout` / 事件 API,\n * 属于模块加载时的全局副作用。\n *\n * @module core/context\n */\n\nimport * as AsyncContextNS from \"simple-async-context\"\n\nconst CONTEXT_MARK = Symbol(\"schemx.async-context\")\n\nconst { AsyncContext } = AsyncContextNS\n\n/**\n * Schemx 上下文声明。\n *\n * `createContext()` 返回该对象,所有读取和覆盖操作通过其方法完成。\n * 底层 Variable 通过闭包私有化,不对外暴露。\n *\n * @typeParam T - 上下文值类型。\n */\nexport interface Context<T> {\n /**\n * 调试名称,用于错误信息。\n */\n readonly name: string\n /**\n * 读取当前栈上的上下文值。\n *\n * 优先返回当前栈显式覆盖的值;未覆盖时:\n * - 存在默认值则返回默认值;\n * - 不存在默认值则抛出 `ContextNotProvidedError`。\n *\n * 仅在 `Provider` 的同步调用栈内可读。跨 `await` / 异步回调不会延续,详见模块文档。\n *\n * @throws ContextNotProvidedError - 当前栈未提供且无默认值。\n */\n useContext(): T\n /**\n * 尝试读取当前异步栈上的上下文值。\n *\n * 与 `useContext` 的区别:未提供且无默认值时返回 undefined,而不是抛错。\n */\n tryUseContext(): T | undefined\n /**\n * 在指定函数执行期间覆盖上下文值。\n *\n * 函数执行结束后(无论成功或抛错),当前栈上的覆盖值恢复。\n *\n * 注意:ambient context 仅在 `fn` 的**同步调用栈**内可读。\n * `fn` 内部若 `await` 或调度异步回调,回调中读不到 `value`——\n * 需在异步入口处再次 `Provider`,或在闭包中直接捕获 `value`。\n *\n * @param value - 临时覆盖的值。\n * @param fn - 需要读取覆盖值的同步函数。\n * @returns `fn` 的返回值。\n */\n Provider<R>(value: T, fn: () => R): R\n /**\n * 内部标记,用于判断对象是否是 Schemx Context。\n */\n readonly [CONTEXT_MARK]: true\n}\n\n/**\n * 创建一个没有默认值的上下文声明。\n *\n * @param name - 调试名称,用于错误信息和 Variable 标识。\n *\n * @returns 带 `useContext` / `tryUseContext` / `Provider` 方法的上下文声明。\n *\n * @example\n * const UserContext = createContext<{ id: string }>(\"UserContext\")\n *\n * UserContext.Provider({ id: \"u1\" }, () => {\n * UserContext.useContext().id // → \"u1\"\n * })\n */\nexport function createContext<T>(name: string): Context<T | undefined>\n\n/**\n * 创建一个带默认值的上下文声明。\n *\n * @param name - 调试名称,用于错误信息和 Variable 标识。\n * @param defaultValue - 未显式 provide 时返回的默认值。\n *\n * @returns 带 `useContext` / `tryUseContext` / `Provider` 方法的上下文声明。\n *\n * @example\n * const LocaleContext = createContext(\"LocaleContext\", \"zh-CN\")\n *\n * LocaleContext.useContext() // → \"zh-CN\"(未 Provider 时返回默认值)\n */\nexport function createContext<T>(name: string, defaultValue: T): Context<T>\n\nexport function createContext<T>(name: string, defaultValue?: T): Context<T | undefined> {\n const hasDefaultValue = arguments.length >= 2\n const variable = new AsyncContext.Variable<T>()\n\n const useContext = (): T => {\n const value = variable.get()\n\n if (value !== undefined) {\n return value\n }\n\n if (hasDefaultValue) {\n return defaultValue as T\n }\n\n throw new ContextNotProvidedError({ name } as Context<unknown>)\n }\n\n const tryUseContext = (): T | undefined => {\n const value = variable.get()\n\n if (value !== undefined) {\n return value\n }\n\n if (hasDefaultValue) {\n return defaultValue as T\n }\n\n return undefined\n }\n\n const Provider = <R>(value: T, fn: () => R): R => variable.run(value, fn)\n\n return {\n name,\n useContext,\n tryUseContext,\n Provider,\n [CONTEXT_MARK]: true,\n }\n}\n\n/**\n * 读取未提供且没有默认值的 Context 时抛出的错误。\n */\nexport class ContextNotProvidedError extends Error {\n /**\n * 创建 Context 未提供错误。\n *\n * @param context - 读取失败的上下文声明(仅取 name 用于信息展示)。\n */\n constructor(context: Pick<Context<unknown>, \"name\">) {\n super(`[schemx] Context \"${context.name}\" has not been provided.`)\n\n this.name = \"ContextNotProvidedError\"\n }\n}\n\n/**\n * 判断未知值是否是由 `createContext()` 创建的上下文声明。\n *\n * @param value - 待检查的未知值。\n *\n * @returns 是 Schemx Context 时返回 true。\n *\n * @example\n * const ThemeContext = createContext(\"ThemeContext\", \"light\")\n * isContext(ThemeContext) // true\n */\nexport function isContext(value: unknown): value is Context<unknown> {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n CONTEXT_MARK in value &&\n (value as Context<unknown>)[CONTEXT_MARK] === true\n )\n}\n","/**\n * Schemx form 实例级外部上下文。\n *\n * `schemxContext.Provider()` 只负责在 `createForm()` 初始化调用栈内提供值。\n * `CreateForm` 会在构造阶段捕获该值并固化到当前 form runtime context 中,\n * 后续 runtime node、dependency effect、lifecycle hook 等内部逻辑通过\n * `schemxContext.useContext()` 读取同一个实例级快照。\n *\n * 该 context 表达的是 form instance scope,不是 schema subtree scope。\n */\n\nimport { createContext } from \"./context\"\n\nimport type { Compile } from \"./compiler/types\"\nimport type { FormDescriptor } from \"./descriptor\"\nimport type { FieldRegistry } from \"./field\"\nimport type { LifecycleBus } from \"./lifecycle\"\nimport type {\n ContainerRuntimeNode,\n RuntimeNode,\n RuntimeNodeResourceContext,\n} from \"./node\"\nimport type { Scheduler } from \"./scheduler\"\nimport type { SchemxDefaultProps, SchemxFormApi, SchemxInstance, Values } from \"./types\"\n\n/**\n * `createForm()` 内部运行时上下文。\n *\n * 字段、dependency effect 和 node lifecycle 通过该对象共享实例级服务。\n *\n * @typeParam TValues - 表单值类型。\n */\nexport interface SchemxContext<TValues extends Values = Values> {\n /**\n * schema 编译默认选项,供 root 与 dependency 子树复用。\n */\n defaultProps: SchemxDefaultProps\n /**\n * 表单实例公开 API。\n */\n readonly instance: SchemxInstance<TValues>\n /**\n * 传递给动态 renderer 的表单 API 子集。\n */\n readonly formApi: SchemxFormApi<TValues>\n /**\n * 当前表单实例的 schema 编译门面。\n */\n readonly compile: Compile<TValues>\n /**\n * 运行时异步调度器。\n */\n readonly scheduler: Scheduler\n /**\n * runtime node 生命周期事件总线。\n */\n readonly lifecycleBus: LifecycleBus<RuntimeNode<TValues>>\n /**\n * 字段 RuntimeNode 到字段模型的注册表。\n */\n readonly fieldRegistry: FieldRegistry<TValues>\n /**\n * RuntimeNode 之外的领域资源注册表。\n */\n readonly nodeResources: RuntimeNodeResourceContext<TValues>\n /**\n * 唯一子节点提交边界。\n *\n * @param parent - 接收子节点的容器 RuntimeNode。\n * @param descriptors - 新一轮编译得到的子 descriptor 列表。\n */\n commitChildren(\n parent: ContainerRuntimeNode<TValues>,\n descriptors: FormDescriptor<TValues>[]\n ): void\n}\n\ntype SchemxContextEntry = {\n readonly type: \"runtime\"\n readonly value: SchemxContext<Values>\n}\n\nconst schemxContextStore = createContext<SchemxContextEntry>(\"SchemxContext\")\n\n/**\n * 在指定函数执行期间提供当前 form runtime context。\n *\n * @param context - 当前 `createForm()` 实例组装出的运行时上下文。\n * @param run - 需要读取当前运行时上下文的同步函数。\n *\n * @returns `run` 的返回值。\n */\nexport function withSchemxContext<TValues extends Values, TResult>(\n context: SchemxContext<TValues>,\n run: () => TResult\n): TResult {\n return schemxContextStore.Provider(\n {\n type: \"runtime\",\n value: context as SchemxContext<Values>,\n },\n run\n )\n}\n\n/**\n * 读取当前 form runtime context。\n *\n * 只能在 `withSchemxContext()` 的同步调用栈内使用。\n *\n * @returns 当前 form runtime context。\n */\nexport function useSchemxContext<\n TValues extends Values = Values,\n>(): SchemxContext<TValues> {\n const current = schemxContextStore.tryUseContext()\n\n if (current?.type !== \"runtime\") {\n throw new Error(\"[schemx] Form runtime context has not been provided.\")\n }\n\n return current.value as SchemxContext<TValues>\n}\n\n/**\n * 尝试读取当前 form runtime context。\n *\n * 和 `useSchemxContext()` 不同,当前调用栈没有 context 时会返回 undefined。\n *\n * @returns 当前 form runtime context;不存在时返回 undefined。\n */\nexport function maybeUseSchemxContext<TValues extends Values = Values>():\n | SchemxContext<TValues>\n | undefined {\n const current = schemxContextStore.tryUseContext()\n\n if (current?.type !== \"runtime\") {\n return undefined\n }\n\n return current.value as SchemxContext<TValues>\n}\n","/**\n * Descriptor 创建函数。\n *\n * 该模块只负责把单个 schema 转换为 descriptor;递归编排、缓存和失效策略属于\n * compiler 模块。\n *\n * @module core/descriptor/createDescriptor\n */\n\nimport { defaultConfig } from \"../defaultConfig\"\nimport { useSchemxContext } from \"../schemxContext\"\nimport { isDependencySchema, isGroupSchema, NormalizedTrigger } from \"../utils\"\n\nimport type {\n CreateDependencyDescriptorOptions,\n CreateDescriptorOptions,\n CreateFieldDescriptorOptions,\n CreateGroupDescriptorOptions,\n DependencyDescriptor,\n DependencyRenderer,\n FieldDescriptor,\n FieldDynamicPropsDescriptor,\n FieldValidationDescriptor,\n FormDescriptor,\n GroupDescriptor,\n} from \"./types\"\nimport type {\n NamePath,\n SchemxDependencies,\n SchemxResolvedBaseField,\n SchemxResolvedGroupField,\n SchemxRules,\n ValidationTrigger,\n Values,\n} from \"../types\"\nimport type { SchemxBaseField } from \"../types/schema\"\n\n/**\n * 创建任意表单 descriptor。\n *\n * @param options - descriptor 创建选项。\n * @returns 编译后的 descriptor。\n */\nexport function createDescriptor<TValues extends Values = Values>(\n options: CreateDescriptorOptions<TValues>\n): FormDescriptor<TValues> {\n const { schema, index, parentKey = \"\" } = options\n\n if (isGroupSchema(schema)) {\n return createGroupDescriptor({ schema, index, parentKey })\n }\n\n if (isDependencySchema(schema)) {\n return createDependencyDescriptor({ schema, parentKey })\n }\n\n return createFieldDescriptor({ schema, parentKey })\n}\n\n/**\n * 创建字段 descriptor。\n *\n * @param options - 字段 descriptor 创建选项。\n * @returns 字段 descriptor。\n */\nexport function createFieldDescriptor<TValues extends Values = Values>(\n options: CreateFieldDescriptorOptions<TValues>\n): FieldDescriptor<TValues> {\n const { schema, parentKey = \"\" } = options\n\n const key =\n schema.key ??\n (parentKey ? `field:${parentKey}/${schema.name}` : `field:${schema.name}`)\n\n const normalizedSchema = buildNormalizedFieldSchema(schema)\n\n return {\n type: \"field\",\n key,\n name: schema.name,\n componentType: schema.componentType,\n staticSchema: normalizedSchema,\n dynamicProps: createFieldDynamicProps(schema.dependencies),\n validation: createFieldValidation(normalizedSchema),\n }\n}\n\n/**\n * 创建分组 descriptor。\n *\n * @param options - 分组 descriptor 创建选项。\n * @returns 分组 descriptor。\n */\nexport function createGroupDescriptor<TValues extends Values = Values>(\n options: CreateGroupDescriptorOptions<TValues>\n): GroupDescriptor<TValues> {\n const { schema, index, parentKey = \"\" } = options\n\n const key = createGroupDescriptorKey(schema.key, index, parentKey)\n\n const { children: _rawChildren, ...schemaWithoutChildren } = schema\n\n return {\n type: \"group\",\n key,\n staticSchema: {\n ...schemaWithoutChildren,\n key,\n } as SchemxResolvedGroupField<TValues>,\n children: [],\n }\n}\n\n/**\n * 创建 dependency descriptor。\n *\n * @param options - dependency descriptor 创建选项。\n * @returns dependency descriptor。\n */\nexport function createDependencyDescriptor<TValues extends Values = Values>(\n options: CreateDependencyDescriptorOptions<TValues>\n): DependencyDescriptor<TValues> {\n const { schema, parentKey = \"\" } = options\n\n const trigger = [...schema.to]\n\n const triggerKey = trigger.map(serializeNamePath).join(\",\")\n\n const key =\n schema.key ??\n (parentKey ? `dependency:${parentKey}/${triggerKey}` : `dependency:${triggerKey}`)\n\n const renderer: DependencyRenderer<TValues> = (formApi, abortSignal) => {\n const values = formApi.getValues()\n\n return schema.renderer(values, formApi, {\n abortSignal,\n })\n }\n\n return {\n type: \"dependency\",\n key,\n triggerFields: trigger,\n renderer,\n }\n}\n\n/**\n * 根据 componentType 和 placeholder 配置生成字段占位提示文本。\n *\n * @param schema - 字段 schema。\n * @returns 占位提示文本。\n */\nfunction getPlaceholder<TValues extends Values>(\n schema: SchemxBaseField<TValues>\n): string {\n const existingplaceholder = schema.componentProps?.placeholder ?? schema.placeholder\n\n if (existingplaceholder == null) {\n return [\"input\", \"text\", \"textarea\"].includes(schema.componentType)\n ? `请输入${schema.label || schema.name}`\n : `请选择${schema.label || schema.name}`\n }\n\n return existingplaceholder\n}\n\n/**\n * 合并默认值与 schema 配置,生成规范化字段 schema。\n *\n * 字段自身配置优先级最高,其次是表单级 defaultProps,最后是 defaultConfig。\n * 只读态会强制 contentAlign 为 right、labelPosition 为 left。\n *\n * @param schema - 原始字段 schema。\n * @returns 规范化后的字段 schema。\n */\nfunction buildNormalizedFieldSchema<TValues extends Values>(\n schema: SchemxBaseField<TValues>\n): SchemxResolvedBaseField<TValues> {\n const { defaultProps, instance } = useSchemxContext<TValues>()\n\n const {\n componentProps: cp,\n visible,\n readonly,\n disabled,\n required,\n rules,\n validationTrigger,\n dependencies: _dependencies,\n ...rest\n } = schema\n\n const mergedVisible = visible ?? defaultConfig.visible\n const mergedReadonly = readonly ?? defaultProps.readonly ?? defaultConfig.readonly\n const mergedDisabled = disabled ?? defaultProps.disabled ?? defaultConfig.disabled\n const mergedAlign = mergedReadonly ? \"right\" : (cp?.align ?? rest.contentAlign)\n const mergedValidationTrigger =\n validationTrigger ?? defaultProps.validationTrigger ?? defaultConfig.validationTrigger\n const mergedPlaceholder = getPlaceholder(schema)\n const rulesArray = (Array.isArray(rules) ? rules : [rules]).filter(Boolean)\n const mergedRequired = required ?? (rulesArray.length > 0 || defaultConfig.required)\n\n const normalizedSchema: SchemxResolvedBaseField<TValues> = {\n ...(rest ?? {}),\n key: rest.key,\n name: rest.name,\n label: rest.label,\n componentType: rest.componentType,\n\n visible: mergedVisible,\n readonly: mergedReadonly,\n disabled: mergedDisabled,\n required: mergedRequired,\n placeholder: mergedPlaceholder,\n\n labelIcon: rest.labelIcon || defaultConfig.labelIcon,\n labelAlign: rest.labelAlign || defaultConfig.labelAlign,\n labelPosition: rest.labelPosition || defaultConfig.labelPosition,\n labelWidth: rest.labelWidth || defaultConfig.labelWidth,\n colon: rest.colon ?? defaultConfig.colon,\n\n rules,\n validationTrigger: normalizeTrigger(mergedValidationTrigger),\n }\n\n if (Object.hasOwn(schema, \"initialValue\")) {\n normalizedSchema.initialValue = rest.initialValue\n }\n\n if (mergedReadonly) {\n normalizedSchema.contentAlign = \"right\"\n normalizedSchema.labelPosition = \"left\"\n }\n\n normalizedSchema.componentProps = {\n ...cp,\n align: mergedAlign,\n readonly: mergedReadonly,\n disabled: mergedDisabled,\n placeholder: mergedPlaceholder,\n formItemProps: normalizedSchema,\n formInstance: instance,\n }\n\n return normalizedSchema\n}\n\n/**\n * 根据字段 dependencies 配置构建动态属性描述。\n *\n * @param dependencies - 字段 dependencies 配置,缺省时返回 null。\n * @returns 动态属性描述,或 null 表示字段无动态属性。\n */\nfunction createFieldDynamicProps<TValues extends Values>(\n dependencies: SchemxDependencies<TValues> | undefined\n): FieldDynamicPropsDescriptor<TValues> | null {\n if (!dependencies) {\n return null\n }\n\n return {\n source: \"dependencies\",\n triggerFields: dependencies.triggerFields,\n dependencies,\n }\n}\n\n/**\n * 从规范化 schema 中提取校验描述。\n *\n * @param schema - 规范化字段 schema。\n * @returns 校验描述,或 null 表示字段无校验资源。\n */\nfunction createFieldValidation<TValues extends Values>(\n schema: SchemxResolvedBaseField<TValues>\n): FieldValidationDescriptor<TValues> | null {\n const rules = normalizeValidationRules(schema.rules)\n\n if (!rules) {\n return null\n }\n\n return {\n trigger: schema.validationTrigger,\n rules,\n }\n}\n\n/**\n * 规范化校验规则:过滤空值,空数组视为无规则。\n *\n * @param rules - 原始 rules 配置。\n * @returns 规范化后的 rules,或 null 表示无规则。\n */\nfunction normalizeValidationRules(\n rules: SchemxRules | readonly SchemxRules[] | undefined\n): SchemxRules | readonly SchemxRules[] | null {\n if (rules == null) {\n return null\n }\n\n if (Array.isArray(rules)) {\n return rules.length > 0 ? rules : null\n }\n\n return rules\n}\n\n/**\n * 生成分组 descriptor 的稳定 key。\n *\n * 优先使用显式 key,否则按 parentKey + index 拼装。\n *\n * @param explicitKey - schema 上显式声明的 key。\n * @param index - schema 在同级列表中的位置。\n * @param parentKey - 父级 descriptor key。\n * @returns 分组 descriptor key。\n */\nfunction createGroupDescriptorKey(\n explicitKey: string | undefined,\n index: number,\n parentKey: string\n): string {\n return explicitKey ?? (parentKey ? `group:${parentKey}/${index}` : `group:${index}`)\n}\n\n/**\n * 将 NamePath 序列化为字符串,数组用 `.` 连接。\n *\n * @param name - 字段名路径。\n * @returns 序列化后的字符串。\n */\nfunction serializeNamePath(name: NamePath): string {\n if (Array.isArray(name)) {\n return name.join(\".\")\n }\n\n return String(name)\n}\n\n/**\n * 把外部校验触发方式映射为内部 NormalizedTrigger,未识别值回落到 submit。\n *\n * @param trigger - 原始触发方式或其数组。\n * @returns 规范化后的触发方式或其数组。\n */\nfunction normalizeTrigger(\n trigger: ValidationTrigger | ValidationTrigger[]\n): NormalizedTrigger | NormalizedTrigger[] {\n const map: Record<ValidationTrigger, NormalizedTrigger> = {\n onBlur: \"blur\",\n onChange: \"change\",\n onSubmit: \"submit\",\n blur: \"blur\",\n change: \"change\",\n submit: \"submit\",\n }\n\n const TArray = Array.isArray(trigger) ? trigger : [trigger]\n\n return TArray.map((t) => map[t] ?? \"submit\")\n}\n","/**\n * Descriptor 类型守卫与辅助函数。\n *\n * 提供 descriptor 类型判断的统一入口,避免散落的 `descriptor.type === \"field\"`\n * 字面量比较。\n *\n * @module core/descriptor/helper\n */\n\nimport type { Values } from \"../types\"\nimport type {\n DependencyDescriptor,\n FieldDescriptor,\n FormDescriptor,\n GroupDescriptor,\n} from \"./types\"\n\n/**\n * 判断 descriptor 是否为 FieldDescriptor。\n *\n * @typeParam TValues - 表单值类型。\n * @param descriptor - 待判断的 descriptor。\n * @returns 为字段描述符时返回 true。\n */\nexport function isFieldDescriptor<TValues extends Values>(\n descriptor: FormDescriptor<TValues>\n): descriptor is FieldDescriptor<TValues> {\n return descriptor.type === \"field\"\n}\n\n/**\n * 判断 descriptor 是否为 GroupDescriptor。\n *\n * @typeParam TValues - 表单值类型。\n * @param descriptor - 待判断的 descriptor。\n * @returns 为分组描述符时返回 true。\n */\nexport function isGroupDescriptor<TValues extends Values>(\n descriptor: FormDescriptor<TValues>\n): descriptor is GroupDescriptor<TValues> {\n return descriptor.type === \"group\"\n}\n\n/**\n * 判断 descriptor 是否为 DependencyDescriptor。\n *\n * @typeParam TValues - 表单值类型。\n * @param descriptor - 待判断的 descriptor。\n * @returns 为依赖描述符时返回 true。\n */\nexport function isDependencyDescriptor<TValues extends Values>(\n descriptor: FormDescriptor<TValues>\n): descriptor is DependencyDescriptor<TValues> {\n return descriptor.type === \"dependency\"\n}\n","/**\n * Schema compiler 实现。\n *\n * @module core/compiler/createCompile\n */\n\nimport {\n createDependencyDescriptor,\n createFieldDescriptor,\n createGroupDescriptor,\n} from \"../descriptor\"\nimport { maybeUseSchemxContext, withSchemxContext } from \"../schemxContext\"\nimport {\n isDependencySchema,\n isGroupSchema,\n normalizeSchemas,\n} from \"../utils\"\n\nimport {\n type Compile,\n type CompileCache,\n type CompileOptions,\n} from \"./types\"\n\nimport type { FormDescriptor } from \"../descriptor\"\nimport type { SchemxContext } from \"../schemxContext\"\nimport type { SchemxInstance, Values } from \"../types\"\nimport type { SchemxField } from \"../types/schema\"\n\n/**\n * 创建一个初始 compiler 缓存。\n *\n * @returns 初始 CompileCache,version 从 0 开始。\n */\nfunction createCompileCache<TValues extends Values = Values>(): CompileCache<TValues> {\n return {\n version: 0,\n entries: new WeakMap(),\n }\n}\n\n/**\n * 创建 schema compiler。\n *\n * 每个 compiler 实例维护自己的 descriptor cache。调用方通过 `invalidate()`\n * 失效缓存,而不是直接操作缓存版本。\n *\n * @param options - 编译选项。\n * @returns schema compiler 门面。\n */\nexport function createCompile<TValues extends Values = Values>(\n options: Partial<CompileOptions<TValues>> = {}\n): Compile<TValues> {\n const compileOptions: CompileOptions<TValues> = {\n defaultProps: options.defaultProps ?? {},\n formInstance: options.formInstance ?? ({} as SchemxInstance<TValues>),\n }\n const compileCache = createCompileCache<TValues>()\n\n /**\n * 将 schema 列表编译为 descriptor 列表。\n *\n * 在已有 SchemxContext 时直接编译,否则用一个回退 context 包裹执行。\n *\n * @param schemas - 待编译的 schema 列表。\n * @param parentKey - 父级 descriptor key,用于生成嵌套 key。\n * @returns 编译后的 descriptor 列表。\n */\n function toDescriptors(\n schemas: readonly SchemxField<TValues>[],\n parentKey = \"\"\n ): FormDescriptor<TValues>[] {\n if (maybeUseSchemxContext<TValues>()) {\n return compileDescriptors(schemas, parentKey)\n }\n\n return withSchemxContext(createFallbackCompileContext(), () =>\n compileDescriptors(schemas, parentKey)\n )\n }\n\n /**\n * 实际执行 schema 到 descriptor 的编译。\n *\n * 逐个 schema 查缓存命中则复用,否则按类型生成 descriptor,遇到 group 递归\n * 编译子级,并把新条目写回缓存。\n *\n * @param schemas - 待编译的 schema 列表。\n * @param parentKey - 父级 descriptor key。\n * @returns 编译后的 descriptor 列表。\n * @throws CompileError - dependency schema 缺少非空 trigger 字段时抛出。\n */\n function compileDescriptors(\n schemas: readonly SchemxField<TValues>[],\n parentKey = \"\"\n ): FormDescriptor<TValues>[] {\n const descriptors: FormDescriptor<TValues>[] = []\n\n const normalized = normalizeSchemas([...schemas])\n\n for (let i = 0; i < normalized.length; i++) {\n const schema = normalized[i]\n\n let descriptor: FormDescriptor<TValues>\n\n const cached = compileCache.entries.get(schema)\n\n if (cached && cached.version === compileCache.version) {\n descriptors.push(cached.descriptor)\n continue\n }\n\n if (isGroupSchema(schema)) {\n descriptor = createGroupDescriptor<TValues>({\n schema,\n index: i,\n parentKey,\n })\n\n if (schema.children.length > 0) {\n ;(\n descriptor as unknown as { children: FormDescriptor<TValues>[] }\n ).children = toDescriptors(schema.children, descriptor.key)\n }\n } else if (isDependencySchema(schema)) {\n descriptor = createDependencyDescriptor<TValues>({\n schema,\n parentKey,\n })\n } else {\n descriptor = createFieldDescriptor<TValues>({\n schema,\n parentKey,\n })\n }\n\n compileCache.entries.set(schema, {\n version: compileCache.version,\n descriptor,\n })\n\n descriptors.push(descriptor)\n }\n\n return descriptors\n }\n\n /**\n * 在缺少调用方 context 时构建回退 SchemxContext。\n *\n * @returns 由 compileOptions 衍生的最小 SchemxContext。\n */\n function createFallbackCompileContext(): SchemxContext<TValues> {\n return {\n defaultProps: compileOptions.defaultProps,\n instance: compileOptions.formInstance,\n } as SchemxContext<TValues>\n }\n\n /** 获取当前缓存版本号。 */\n function getCacheVersion() {\n return compileCache.version\n }\n\n /** 递增缓存版本号,使所有现有缓存条目失效。 */\n function invalidate(): void {\n compileCache.version++\n }\n\n /** 获取当前缓存版本号。 */\n function getVersion(): number {\n return compileCache.version\n }\n\n return {\n cache: compileCache,\n getCacheVersion,\n toDescriptors,\n invalidate,\n getVersion,\n }\n}\n","/**\n * Schema source 创建工具。\n *\n * @module core/createSchemas\n *\n * @example\n * ```ts\n * import { createSchemas, isSchemxSchemas } from '@schemx/core'\n *\n * // 创建空 schemas\n * const schemas = createSchemas()\n *\n * // 创建带初始值的 schemas\n * const schemas = createSchemas([\n * { name: 'username', label: '用户名', componentType: 'input' },\n * { name: 'email', label: '邮箱', componentType: 'input' }\n * ])\n *\n * // 读取当前 schemas\n * const current = schemas.value\n * const snapshot = schemas.peek() // 无追踪读取\n *\n * // 替换整个 schemas\n * schemas.set([\n * { name: 'newField', label: '新字段', componentType: 'input' }\n * ])\n *\n * // 基于当前值更新\n * schemas.update(prev => [\n * ...prev,\n * { name: 'additional', label: '附加字段', componentType: 'input' }\n * ])\n *\n * // 订阅变化\n * const dispose = schemas.subscribe(nextSchemas => {\n * console.log('Schemas 已更新:', nextSchemas)\n * })\n *\n * dispose() // 取消订阅\n * ```\n *\n * @example\n * ```ts\n * // 与 createForm 配合使用\n * const schemas = createSchemas([\n * { name: 'username', label: '用户名', componentType: 'input' }\n * ])\n *\n * const form = createForm({ schemas })\n *\n * // 动态添加字段\n * schemas.update(prev => [\n * ...prev,\n * { name: 'email', label: '邮箱', componentType: 'input' }\n * ])\n *\n * // 表单会自动响应 schemas 变化\n * ```\n */\n\nimport { createSignal } from \"./reactivity\"\n\nimport type { ReadonlySignal } from \"./reactivity\"\nimport type { Values } from \"./types/form\"\nimport type { SchemxField } from \"./types/schema\"\n\n/**\n * schema source 变化订阅回调。\n *\n * @typeParam TValues - 表单值类型。\n */\nexport type SchemxSchemasListener<TValues extends Values = Values> = (\n schemas: readonly SchemxField<TValues>[]\n) => void\n\n/**\n * 可响应式更新的 root schema source。\n *\n * @typeParam TValues - 表单值类型。\n *\n * @example\n * ```ts\n * const schemas: SchemxSchemas = createSchemas([\n * { name: 'field1', label: '字段1', componentType: 'input' }\n * ])\n *\n * // 响应式读取(在 effect 中会追踪)\n * console.log(schemas.value)\n *\n * // 无追踪读取\n * console.log(schemas.peek())\n *\n * // 设置新值\n * schemas.set([{ name: 'field2', label: '字段2', componentType: 'input' }])\n *\n * // 更新\n * schemas.update(prev => [...prev, newSchema])\n *\n * // 订阅\n * const dispose = schemas.subscribe(next => console.log(next))\n * ```\n */\nexport interface SchemxSchemas<TValues extends Values = Values> {\n /** 当前 schema 列表的只读 signal。 */\n readonly signal: ReadonlySignal<readonly SchemxField<TValues>[]>\n /** 当前 schema 列表。 */\n readonly value: readonly SchemxField<TValues>[]\n /** 无依赖追踪地读取当前 schema 列表。 */\n peek: () => readonly SchemxField<TValues>[]\n /** 替换当前 schema 列表。 */\n set: (schemas: readonly SchemxField<TValues>[]) => void\n /** 基于当前 schema 列表派生下一版。 */\n update: (\n updater: (schemas: readonly SchemxField<TValues>[]) => readonly SchemxField<TValues>[]\n ) => void\n /** 订阅 schema 列表变化。 */\n subscribe: (listener: SchemxSchemasListener<TValues>) => () => void\n}\n\n/**\n * createForm 可接收的 schema 输入。\n *\n * @typeParam TValues - 表单值类型。\n */\nexport type SchemxSchemasInput<TValues extends Values = Values> =\n | readonly SchemxField<TValues>[]\n | SchemxSchemas<TValues>\n\n/**\n * 创建空 schema source。\n *\n * @typeParam TValues - 表单值类型。\n * @returns 可响应式更新的 schema source。\n *\n * @example\n * ```ts\n * const schemas = createSchemas()\n * schemas.set([\n * { name: 'field1', label: '字段1', componentType: 'input' }\n * ])\n * ```\n */\nexport function createSchemas<TValues extends Values = Values>(): SchemxSchemas<TValues>\n\n/**\n * 创建 schema source。\n *\n * @typeParam TValues - 表单值类型。\n * @param schemas - 初始 root schema 列表。\n *\n * @returns 可响应式更新的 schema source。\n *\n * @example\n * ```ts\n * const schemas = createSchemas([\n * { name: 'username', label: '用户名', componentType: 'input' },\n * { name: 'email', label: '邮箱', componentType: 'input' }\n * ])\n *\n * // 在 form 中使用\n * const form = createForm({ schemas })\n * ```\n */\nexport function createSchemas<TValues extends Values = Values>(\n schemas: readonly SchemxField<TValues>[]\n): SchemxSchemas<TValues>\n\nexport function createSchemas<TValues extends Values = Values>(\n schemas: readonly SchemxField<TValues>[] = []\n): SchemxSchemas<TValues> {\n const source = createSignal<readonly SchemxField<TValues>[]>(schemas)\n\n /**\n * 响应式读取当前 schema 列表。\n */\n const getValue = (): readonly SchemxField<TValues>[] => {\n return source.value\n }\n\n /**\n * 无依赖追踪地读取当前 schema 列表。\n */\n const peek = (): readonly SchemxField<TValues>[] => {\n return source.peek()\n }\n\n /**\n * 替换 schema 列表并通知订阅者。\n */\n const set = (nextSchemas: readonly SchemxField<TValues>[]): void => {\n source.value = nextSchemas\n }\n\n /**\n * 基于当前 schema 列表派生下一版并通知订阅者。\n */\n const update = (\n updater: (schemas: readonly SchemxField<TValues>[]) => readonly SchemxField<TValues>[]\n ): void => {\n source.value = updater(source.peek())\n }\n\n /**\n * 注册 schema source 的手动订阅者。\n */\n const subscribe = (listener: SchemxSchemasListener<TValues>): (() => void) => {\n let isInitialNotify = true\n const unsubscribe = source.subscribe((value) => {\n if (isInitialNotify) {\n isInitialNotify = false\n\n return\n }\n\n listener(value)\n })\n\n return () => {\n unsubscribe()\n }\n }\n\n return {\n signal: source,\n get value() {\n return getValue()\n },\n peek,\n set,\n update,\n subscribe,\n }\n}\n\n/**\n * 判断输入是否为 schema source。\n *\n * @param schemas - createForm 接收的 schema 输入。\n * @returns true 表示输入是 schema source。\n *\n * @example\n * ```ts\n * const staticSchemas = [{ name: 'field', label: '字段', componentType: 'input' }]\n * const reactiveSchemas = createSchemas(staticSchemas)\n *\n * isSchemxSchemas(staticSchemas) // => false(是数组)\n * isSchemxSchemas(reactiveSchemas) // => true(是 SchemxSchemas)\n *\n * // 在 createForm 中使用\n * const form = createForm({\n * schemas: isSchemxSchemas(input) ? input : createSchemas(input)\n * })\n * ```\n */\nexport function isSchemxSchemas<TValues extends Values = Values>(\n schemas: SchemxSchemasInput<TValues> | undefined\n): schemas is SchemxSchemas<TValues> {\n if (!schemas || Array.isArray(schemas)) {\n return false\n }\n\n const candidate = schemas as Partial<SchemxSchemas<TValues>>\n\n return (\n typeof candidate.peek === \"function\" &&\n typeof candidate.set === \"function\" &&\n typeof candidate.update === \"function\" &&\n typeof candidate.subscribe === \"function\"\n )\n}\n","import type { Scope } from \"../node\"\nimport type { Scheduler } from \"./scheduler\"\n\nexport interface AbortableTaskRunner<TValue = void> {\n run(): Promise<TValue | undefined>\n dispose(): void\n}\n\nexport interface AbortableTaskRunnerOptions<TValue = void> {\n scope: Scope\n scheduler: Scheduler\n run(signal: AbortSignal): Promise<TValue> | TValue\n onStart?(controller: AbortController): void\n onSuccess?(value: TValue): void\n onError?(error: Error): void\n onSettled?(): void\n throwOnError?: boolean\n}\n\nexport function createAbortableTaskRunner<TValue = void>(\n options: AbortableTaskRunnerOptions<TValue>\n): AbortableTaskRunner<TValue> {\n const ownScope = options.scope.child()\n\n let version = 0\n let controller: AbortController | null = null\n\n const isStale = (\n currentVersion: number,\n currentController: AbortController\n ): boolean => {\n return (\n ownScope.disposed ||\n currentController.signal.aborted ||\n currentVersion !== version\n )\n }\n\n const runCurrentTask = async (\n currentVersion: number,\n currentController: AbortController\n ): Promise<TValue | undefined> => {\n try {\n const value = await options.run(currentController.signal)\n\n if (isStale(currentVersion, currentController)) {\n return value\n }\n\n options.onSuccess?.(value)\n options.onSettled?.()\n\n return value\n } catch (cause) {\n const error = normalizeError(cause)\n\n if (isStale(currentVersion, currentController)) {\n if (options.throwOnError) {\n throw error\n }\n\n return\n }\n\n options.onError?.(error)\n options.onSettled?.()\n\n if (options.throwOnError) {\n throw error\n }\n }\n }\n\n const run = async (): Promise<TValue | undefined> => {\n if (ownScope.disposed) {\n return\n }\n\n const currentVersion = ++version\n controller?.abort()\n controller = new AbortController()\n options.onStart?.(controller)\n\n return await options.scheduler.track(runCurrentTask(currentVersion, controller))\n }\n\n const dispose = (): void => {\n version += 1\n controller?.abort()\n ownScope.dispose()\n }\n\n options.scope.add(dispose)\n\n return {\n run,\n dispose,\n }\n}\n\nfunction normalizeError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause))\n}\n","/**\n * FieldRuntimeState - 字段运行态。\n *\n * 将字段呈现态拆分为静态 schema、动态覆盖、有效状态和视图状态四个层次,\n * 让静态 schema 更新和动态属性更新走不同入口,便于 dependencies、validation\n * 和 view 模块按需读取对应层次。\n *\n * @module core/field/runtimeState\n */\n\nimport { createComputed } from \"../reactivity/computed\"\nimport { createSignal } from \"../reactivity/signal\"\n\nimport type { ComputedSignal } from \"../reactivity/computed\"\nimport type { Signal } from \"../reactivity/signal\"\nimport type {\n SchemxComponentProps,\n SchemxResolvedBaseField,\n SchemxRules,\n Values,\n} from \"../types\"\nimport type { NamePath } from \"../types/form\"\n\n/**\n * 字段动态覆盖支持的属性 key。\n */\nexport type FieldDynamicOverrideKey =\n | \"componentProps\"\n | \"placeholder\"\n | \"required\"\n | \"readonly\"\n | \"disabled\"\n | \"visible\"\n | \"rules\"\n\n/**\n * 字段动态覆盖集合。\n *\n * 未出现的 key 表示不覆盖静态 schema。\n */\nexport type FieldDynamicOverrides<TValues extends Values = Values> = Partial<\n Pick<SchemxResolvedBaseField<TValues>, FieldDynamicOverrideKey>\n>\n\n/**\n * 字段运行时诊断信息。\n */\nexport interface FieldRuntimeDiagnostics<TValues extends Values = Values> {\n /** 最近一次更新来源 */\n readonly lastUpdatedBy: \"static-schema\" | \"dependencies\" | \"reset\" | \"dispose\"\n /** 运行态更新版本 */\n readonly version: number\n /** 最近一次 dependencies 触发字段 */\n readonly triggerFields: readonly NamePath<TValues>[]\n /** 最近一次动态覆盖涉及的 key */\n readonly overriddenKeys: readonly FieldDynamicOverrideKey[]\n /** 最近一次解析错误 */\n readonly error: Error | null\n}\n\n/**\n * 字段有效呈现态。\n *\n * 合并静态 schema、动态覆盖和默认值后的最终字段状态。\n */\nexport interface FieldEffectiveSchema<TValues extends Values = Values> {\n key: string\n name: NamePath<TValues>\n componentType: SchemxResolvedBaseField<TValues>[\"componentType\"]\n label: string\n visible: boolean\n disabled: boolean\n readonly: boolean\n required: boolean\n placeholder: string\n componentProps: SchemxComponentProps<TValues>\n rules: SchemxRules | SchemxRules[]\n validationTrigger: SchemxResolvedBaseField<TValues>[\"validationTrigger\"]\n}\n\n/**\n * 字段运行态。\n *\n * 拆分静态 schema、动态覆盖、有效状态和视图状态,让不同模块按需读取。\n */\nexport interface FieldRuntimeState<TValues extends Values = Values> {\n /** 字段当前 name path */\n readonly name: Signal<NamePath<TValues>>\n /** 来自 descriptor 的规范化静态字段 schema */\n readonly staticSchema: Signal<SchemxResolvedBaseField<TValues>>\n /** 来自 dependencies 的动态覆盖 */\n readonly dynamicOverrides: Signal<FieldDynamicOverrides<TValues>>\n /** 合并静态 schema、动态覆盖和默认值的有效字段状态 */\n readonly effectiveSchema: ComputedSignal<FieldEffectiveSchema<TValues>>\n /** 渲染层消费的字段 ViewSchema(在 viewGraph 阶段接入) */\n readonly viewSchema: ComputedSignal<SchemxResolvedBaseField<TValues>>\n /** 运行时诊断信息 */\n readonly diagnostics: Signal<FieldRuntimeDiagnostics<TValues>>\n}\n\n/**\n * 创建字段运行态的配置选项。\n */\nexport interface CreateFieldRuntimeStateOptions<TValues extends Values = Values> {\n /** 节点 ID */\n readonly nodeId: number\n /** 节点 key */\n readonly key: string\n /** 字段 descriptor */\n readonly descriptor: {\n readonly name: NamePath<TValues>\n readonly staticSchema: SchemxResolvedBaseField<TValues>\n }\n}\n\n/**\n * 创建字段运行态。\n *\n * @param options - 创建选项\n * @returns 新创建的 FieldRuntimeState\n */\nexport function createFieldRuntimeState<TValues extends Values>(\n options: CreateFieldRuntimeStateOptions<TValues>\n): FieldRuntimeState<TValues> {\n const { key, descriptor } = options\n const schema = descriptor.staticSchema\n\n const staticSchema = createSignal<SchemxResolvedBaseField<TValues>>(schema, {\n name: `field:${String(descriptor.name)}:staticSchema`,\n })\n\n const dynamicOverrides = createSignal<FieldDynamicOverrides<TValues>>(\n {},\n { name: `field:${String(descriptor.name)}:dynamicOverrides` }\n )\n\n const diagnostics = createSignal<FieldRuntimeDiagnostics<TValues>>(\n createInitialDiagnostics(),\n { name: `field:${String(descriptor.name)}:diagnostics` }\n )\n\n const name = createSignal<NamePath<TValues>>(descriptor.name, {\n name: `field:${String(descriptor.name)}:name`,\n })\n\n const effectiveSchema = createComputed<FieldEffectiveSchema<TValues>>(() => {\n const base = staticSchema.value\n const overrides = dynamicOverrides.value\n\n return {\n key,\n name: name.value,\n componentType: base.componentType,\n label: base.label || \"\",\n visible: overrides.visible ?? base.visible ?? true,\n disabled: overrides.disabled ?? base.disabled ?? false,\n readonly: overrides.readonly ?? base.readonly ?? false,\n required: overrides.required ?? base.required ?? false,\n placeholder: overrides.placeholder ?? base.placeholder ?? \"\",\n componentProps: (overrides.componentProps ?? base.componentProps ?? {}) as SchemxComponentProps<TValues>,\n rules: overrides.rules ?? base.rules ?? [],\n validationTrigger: base.validationTrigger,\n }\n })\n\n const viewSchema = createComputed<SchemxResolvedBaseField<TValues>>(() => {\n const effective = effectiveSchema.value\n\n return {\n ...staticSchema.value,\n visible: effective.visible,\n disabled: effective.disabled,\n readonly: effective.readonly,\n required: effective.required,\n label: effective.label,\n placeholder: effective.placeholder,\n componentProps: effective.componentProps,\n rules: effective.rules,\n }\n })\n\n return {\n name,\n staticSchema,\n dynamicOverrides,\n effectiveSchema,\n viewSchema,\n diagnostics,\n }\n}\n\n/**\n * 更新字段静态 schema。\n *\n * 只更新 staticSchema 和 diagnostics,不清空 dynamicOverrides。\n *\n * @param state - 字段运行态\n * @param descriptor - 最新字段 descriptor\n */\nexport function setFieldStaticSchema<TValues extends Values>(\n state: FieldRuntimeState<TValues>,\n descriptor: {\n readonly name: NamePath<TValues>\n readonly staticSchema: SchemxResolvedBaseField<TValues>\n }\n): void {\n state.staticSchema.value = descriptor.staticSchema\n state.name.value = descriptor.name\n\n const prev = state.diagnostics.peek()\n state.diagnostics.value = {\n ...prev,\n lastUpdatedBy: \"static-schema\",\n version: prev.version + 1,\n triggerFields: [],\n overriddenKeys: [],\n error: null,\n }\n}\n\n/**\n * 动态覆盖元数据。\n */\nexport interface DynamicOverrideMeta<TValues extends Values = Values> {\n /** 覆盖来源 */\n readonly source: \"dependencies\"\n /** 触发字段 */\n readonly triggerFields: readonly NamePath<TValues>[]\n /** 解析错误 */\n readonly error?: Error | null\n}\n\n/**\n * 写入字段动态覆盖。\n *\n * 只写入 dependencies 明确解析出的覆盖 key。空对象表示当前没有动态覆盖。\n * 写入后 effectiveSchema 和 viewSchema 由 computed 自动失效。\n *\n * @param state - 字段运行态\n * @param overrides - 动态覆盖值\n * @param meta - 覆盖元数据\n */\nexport function setFieldDynamicOverrides<TValues extends Values>(\n state: FieldRuntimeState<TValues>,\n overrides: FieldDynamicOverrides<TValues>,\n meta: DynamicOverrideMeta<TValues>\n): void {\n state.dynamicOverrides.value = overrides\n\n const prev = state.diagnostics.peek()\n state.diagnostics.value = {\n ...prev,\n lastUpdatedBy: \"dependencies\",\n version: prev.version + 1,\n triggerFields: meta.triggerFields,\n overriddenKeys: Object.keys(overrides) as FieldDynamicOverrideKey[],\n error: meta.error ?? null,\n }\n}\n\n/**\n * 重置字段动态覆盖。\n *\n * 清空 dynamicOverrides,更新 diagnostics,不修改 staticSchema。\n *\n * @param state - 字段运行态\n * @param reason - 重置原因\n */\nexport function resetFieldDynamicOverrides<TValues extends Values>(\n state: FieldRuntimeState<TValues>,\n reason?: \"reset\" | \"dispose\"\n): void {\n state.dynamicOverrides.value = {}\n\n const prev = state.diagnostics.peek()\n state.diagnostics.value = {\n ...prev,\n lastUpdatedBy: reason ?? \"reset\",\n version: prev.version + 1,\n triggerFields: [],\n overriddenKeys: [],\n error: null,\n }\n}\n\nfunction createInitialDiagnostics<TValues extends Values>(): FieldRuntimeDiagnostics<TValues> {\n return {\n lastUpdatedBy: \"static-schema\",\n version: 0,\n triggerFields: [],\n overriddenKeys: [],\n error: null,\n }\n}\n","/**\n * Field dependencies - 字段级动态呈现态派生。\n *\n * 根据 descriptor.dynamicProps 监听 triggerFields,并把解析结果写入\n * FieldRuntimeState.dynamicOverrides。\n * 该模块不修改 descriptor/schema。\n *\n * @module core/field/dependencies\n */\n\nimport { createSignalEffect } from \"../reactivity\"\nimport { createAbortableTaskRunner } from \"../scheduler/abortableTaskRunner\"\n\nimport { type FieldRuntimeState, setFieldDynamicOverrides } from \"./runtimeState\"\n\nimport type { FieldDescriptor } from \"../descriptor\"\nimport type { Scope } from \"../node\"\nimport type { SchemxContext } from \"../schemxContext\"\nimport type {\n SchemxConditionFn,\n SchemxDependencies,\n SchemxFormApi,\n SchemxResolvedBaseField,\n Values,\n} from \"../types\"\n\n/**\n * 支持动态配置的字段呈现态键列表。\n */\nexport const FIELD_DEPENDENCIES_PROP_KEYS = [\n \"componentProps\",\n \"placeholder\",\n \"required\",\n \"readonly\",\n \"disabled\",\n \"visible\",\n \"rules\",\n] as const\n\ntype DependenciesPropKey = (typeof FIELD_DEPENDENCIES_PROP_KEYS)[number]\n\nexport type DependenciesResolvedProps<TValues extends Values> = Partial<\n Pick<SchemxResolvedBaseField<TValues>, Exclude<DependenciesPropKey, \"rules\">> & {\n rules?: SchemxResolvedBaseField<TValues>[\"rules\"]\n }\n>\n\n/**\n * 创建字段 dependencies effect 的运行时依赖。\n *\n * @typeParam TValues - 表单值类型。\n */\nexport interface CreateDependenciesEffectOptions<TValues extends Values = Values> {\n /**\n * 当前 form 实例运行时上下文。\n */\n context: SchemxContext<TValues>\n /**\n * 字段 descriptor,提供静态 schema、validation 和 dependencies 配置。\n */\n descriptor: Readonly<FieldDescriptor<TValues>>\n /**\n * 字段运行态(Signal Graph 阶段),dependencies 结果会写入 dynamicOverrides。\n */\n runtimeState: FieldRuntimeState<TValues>\n /**\n * 当前 effect 所属的资源作用域。\n */\n scope: Scope\n}\n\n/**\n * 创建字段级 dependencies effect。\n *\n * @param options - dependencies effect 所需的 descriptor、runtimeState 和运行时上下文。\n */\nexport function createDependenciesEffect<TValues extends Values = Values>(\n options: CreateDependenciesEffectOptions<TValues>\n): void {\n const { context, descriptor, runtimeState, scope } = options\n\n const { formApi, scheduler } = context\n\n const dynamicProps = descriptor.dynamicProps\n\n const dependencies = dynamicProps?.dependencies\n\n const triggerFields = dynamicProps?.triggerFields\n\n if (dependencies == null || triggerFields == null || triggerFields.length === 0) {\n return\n }\n\n const taskRunner = createAbortableTaskRunner<DependenciesResolvedProps<TValues>>({\n scope,\n scheduler,\n run: () => resolveDependencies(dependencies, formApi),\n onSuccess: (resolvedProps) => {\n setFieldDynamicOverrides(runtimeState, resolvedProps, {\n source: \"dependencies\",\n triggerFields,\n })\n },\n onError: (error) => {\n console.error(\"[schemx] dependencies 执行错误:\", error)\n },\n })\n\n const dispose = createSignalEffect(() => {\n // 读取 trigger 字段值以建立响应式依赖;字段值变化时 effect 会重新执行。\n void formApi.getValues([...triggerFields])\n\n void taskRunner.run()\n })\n\n scope.add(() => {\n dispose()\n })\n}\n\n/**\n * 解析单个字段的 dependencies 配置。\n */\nasync function resolveDependencies<TValues extends Values>(\n dependencies: SchemxDependencies<TValues>,\n formApi: SchemxFormApi<TValues>\n): Promise<DependenciesResolvedProps<TValues>> {\n const values = formApi.getValues() as TValues\n\n const [resolvedProps] = await Promise.all([\n resolveDependenciesProps(dependencies, values, formApi),\n runDependenciesTrigger(dependencies, values, formApi),\n ])\n\n return resolvedProps\n}\n\n/**\n * 执行 dependencies.trigger 副作用。\n */\nasync function runDependenciesTrigger<TValues extends Values>(\n dependencies: SchemxDependencies<TValues>,\n values: TValues,\n formApi: SchemxFormApi<TValues>\n): Promise<void> {\n if (!dependencies.trigger) {\n return\n }\n\n try {\n await dependencies.trigger(values, formApi)\n } catch (error) {\n console.error(\"[schemx] trigger 执行错误:\", error)\n }\n}\n\n/**\n * 解析 dependencies 中显式配置的动态属性。\n */\nasync function resolveDependenciesProps<TValues extends Values>(\n dependencies: SchemxDependencies<TValues>,\n values: TValues,\n formApi: SchemxFormApi<TValues>\n): Promise<DependenciesResolvedProps<TValues>> {\n const entries = await Promise.all(\n FIELD_DEPENDENCIES_PROP_KEYS.filter((key) => dependencies[key] != null).map(\n async (key) => {\n const condition = dependencies[key] as SchemxConditionFn<TValues, unknown>\n const value = await resolveCondition(formApi, condition, values, undefined)\n\n return [key, value] as const\n }\n )\n )\n\n return Object.fromEntries(entries) as DependenciesResolvedProps<TValues>\n}\n\n/**\n * 执行单个动态属性条件函数。\n */\nasync function resolveCondition<TValues extends Values, TValue>(\n formApi: SchemxFormApi<TValues>,\n condition: SchemxConditionFn<TValues, TValue>,\n formValues: TValues,\n defaultValue: TValue | undefined\n): Promise<TValue | undefined> {\n try {\n const result = await condition(formValues, formApi)\n\n return result ?? defaultValue\n } catch (error) {\n console.error(\"[schemx] 解析动态属性时发生错误:\", error)\n\n return defaultValue\n }\n}\n","/**\n * DependencyEffect - dependency renderer 执行态容器。\n *\n * Effect state 只记录异步执行状态。renderer 返回的结构由 reconciler 写入\n * DependencyRuntimeNode.childNodes。\n *\n * @module core/field/dependencyEffect\n */\n\nimport { type DependencyDescriptor, isDependencyDescriptor } from \"../descriptor\"\nimport { createSignal, createSignalEffect } from \"../reactivity\"\nimport { createAbortableTaskRunner } from \"../scheduler/abortableTaskRunner\"\n\nimport type { DependencyRuntimeNode, RuntimeNodeResourceContext, Scope } from \"../node\"\nimport type { Signal } from \"../reactivity\"\nimport type { Scheduler } from \"../scheduler\"\nimport type { SchemxContext } from \"../schemxContext\"\nimport type { NamePath, SchemxField, SchemxFormApi, Values } from \"../types\"\n\nconst dependencyNodeResources = new WeakMap<\n DependencyRuntimeNode,\n RuntimeNodeResourceContext<any>\n>()\n\n/**\n * 检查 DependencyRuntimeNode 是否有 DependencyEffectState。\n *\n * @param node - dependency runtime 节点。\n * @returns 已挂载 effect state 时返回 true。\n */\nexport function hasDependencyEffect(node: DependencyRuntimeNode): boolean {\n return getDependencyEffect(node) != null\n}\n\n/**\n * 从 DependencyRuntimeNode 获取 DependencyEffectState。\n *\n * @param node - dependency runtime 节点。\n * @returns 当前 effect state;尚未挂载时返回 undefined。\n */\nexport function getDependencyEffect(\n node: DependencyRuntimeNode\n): DependencyEffectState | undefined {\n return dependencyNodeResources.get(node)?.dependencyEffects.get(node.id)\n}\n\n/**\n * Dependency renderer 的执行状态与控制句柄。\n */\nexport interface DependencyEffectState {\n readonly loading: Signal<boolean>\n readonly error: Signal<Error | null>\n readonly version: Signal<number>\n readonly abortController: Signal<AbortController | null>\n\n /**\n * 执行 dependency renderer。\n *\n * @returns renderer 执行完成后 resolve 的 Promise。\n */\n run(): Promise<void>\n\n /**\n * 释放当前 dependency effect 持有的异步资源。\n */\n dispose(): void\n}\n\n/**\n * 创建 DependencyEffect 的配置选项。\n *\n * @typeParam TValues - 表单值类型\n */\nexport interface CreateDependencyEffectOptions<TValues extends Values = Values> {\n /**\n * 当前 form 实例运行时上下文。\n */\n context: SchemxContext<TValues>\n\n /**\n * dependency runtime 节点。\n */\n node: DependencyRuntimeNode<TValues>\n\n /**\n * dependency descriptor,提供静态 trigger、renderer 配置。\n */\n descriptor: DependencyDescriptor<TValues>\n\n /**\n * 关联的 scope,默认创建 node 的子 scope。\n */\n scope?: Scope\n}\n\n/**\n * 创建并挂载 DependencyEffectState 到 RuntimeNode。\n *\n * 会创建 effect state 的 run/dispose 逻辑,并把 renderer 结果经由统一 commit\n * 边界写入 dependency 子树。\n *\n * @param options - 创建 dependency effect 的配置。\n * @returns 已挂载到 node 的 DependencyEffectState。\n */\nexport function createDependencyEffect<TValues extends Values = Values>(\n options: CreateDependencyEffectOptions<TValues>\n): DependencyEffectState {\n const { context, node, descriptor } = options\n\n const { formApi, scheduler, compile, commitChildren } = context\n\n const resourceScope = options.scope ?? node.scope.child()\n\n let compileCacheVersion = compile.getCacheVersion()\n\n const resources = context.nodeResources\n\n dependencyNodeResources.set(node, resources)\n\n resources.dependencyEffects.get(node.id)?.dispose()\n\n const effectState: DependencyEffectState = {\n loading: createSignal(false),\n error: createSignal<Error | null>(null),\n version: createSignal(0),\n abortController: createSignal<AbortController | null>(null),\n run: async (): Promise<void> => undefined,\n dispose: (): void => undefined,\n }\n\n resources.dependencyResourceScopes.set(node.id, resourceScope)\n\n const taskRunner = createAbortableTaskRunner<SchemxField<TValues>[]>({\n scope: resourceScope,\n scheduler,\n run: async (signal) => {\n const currentDescriptor = resources.descriptors.get(node.id)\n\n if (!currentDescriptor || !isDependencyDescriptor(currentDescriptor)) {\n return []\n }\n\n return await Promise.resolve(currentDescriptor.renderer(formApi, signal))\n },\n onStart: (controller) => {\n effectState.version.value += 1\n effectState.abortController.value = controller\n effectState.loading.value = true\n effectState.error.value = null\n },\n onSuccess: (childSchemas) => {\n const nextCompileCacheVersion = compile.getCacheVersion()\n if (nextCompileCacheVersion !== compileCacheVersion) {\n compile.invalidate()\n compileCacheVersion = nextCompileCacheVersion\n }\n\n const descriptors = compile.toDescriptors(childSchemas, \"\")\n\n commitChildren(node, descriptors)\n },\n onError: (error) => {\n effectState.error.value = error\n },\n onSettled: () => {\n effectState.loading.value = false\n },\n })\n\n effectState.run = async (): Promise<void> => {\n if (resourceScope.disposed) return\n\n const currentDescriptor = resources.descriptors.get(node.id)\n\n if (!currentDescriptor || !isDependencyDescriptor(currentDescriptor)) {\n return\n }\n\n await taskRunner.run()\n }\n\n effectState.dispose = (): void => {\n effectState.version.value += 1\n taskRunner.dispose()\n resourceScope.dispose()\n }\n\n resourceScope.add(() => {\n effectState.abortController.value?.abort()\n effectState.abortController.value = null\n\n if (resources.dependencyEffects.get(node.id) === effectState) {\n resources.dependencyEffects.delete(node.id)\n }\n\n if (resources.dependencyResourceScopes.get(node.id) === resourceScope) {\n resources.dependencyResourceScopes.delete(node.id)\n }\n })\n\n setupTriggerSubscription(\n descriptor.triggerFields,\n formApi,\n () => effectState.run(),\n resourceScope,\n scheduler,\n `dependency:${node.id}:trigger`\n )\n\n resources.dependencyEffects.set(node.id, effectState)\n\n void effectState.run().catch((runError) => {\n console.error(\"DependencyEffectState initial run error:\", runError)\n })\n\n return effectState\n}\n\n/**\n * 设置 trigger 字段监听。\n */\nfunction setupTriggerSubscription<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n triggers: readonly TName[],\n formApi: SchemxFormApi<TValues>,\n run: () => Promise<void>,\n scope: Scope,\n scheduler: Scheduler,\n taskId: string\n): void {\n let isFirstRun = true\n\n const disposeEffect = createSignalEffect(() => {\n void formApi.getValues([...triggers])\n\n if (!isFirstRun) {\n scheduler.schedule({\n id: taskId,\n priority: \"normal\",\n scope,\n run,\n onError: (runError) => {\n console.error(\"DependencyEffectState trigger run error:\", runError)\n },\n })\n }\n\n isFirstRun = false\n })\n\n scope.add(disposeEffect)\n}\n","/**\n * FieldRegistry - 字段索引。\n *\n * 通过 descriptor.name 快速查询字段 entry。\n *\n * @module core/field/registry\n */\n\nimport type { FieldRuntimeNode } from \"../node\"\nimport type { NamePath, Values } from \"../types/form\"\n\n/**\n * 字段索引条目。\n */\nexport interface FieldRegistryEntry<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> {\n /**\n * 字段在表单值对象中的名称路径。\n */\n readonly name: TName\n\n /**\n * 字段 RuntimeNode,持有字段描述符、字段运行态和字段相关资源作用域。\n *\n * @typeParam TValues - 表单值类型。\n */\n readonly node: FieldRuntimeNode<TValues>\n\n}\n\n/**\n * FieldRegistry 默认实现。\n */\nclass RuntimeFieldRegistry<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> {\n private fields = new Map<string, FieldRegistryEntry<TValues>>()\n\n register(entry: FieldRegistryEntry<TValues>): void {\n const key = entry.name\n this.fields.set(key, {\n name: entry.name,\n node: entry.node,\n })\n }\n\n unregister(name: TName, node?: FieldRuntimeNode<TValues>): void {\n const key = name\n const current = this.fields.get(key)\n\n if (node && current?.node !== node) {\n return\n }\n\n this.fields.delete(key)\n }\n\n get(name: TName): FieldRegistryEntry<TValues> | undefined {\n const key = name\n\n return this.fields.get(key)\n }\n\n list(): FieldRegistryEntry<TValues>[] {\n return Array.from(this.fields.values())\n }\n}\n\n/**\n * FieldRegistry 的实例类型。\n */\nexport type FieldRegistry<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> = InstanceType<typeof RuntimeFieldRegistry<TValues, TName>>\n\n/**\n * 创建一个 FieldRegistry 实例。\n *\n * @returns 新的字段注册表。\n */\nexport function createFieldRegistry<\n TValues extends Values = Values,\n>(): FieldRegistry<TValues> {\n return new RuntimeFieldRegistry<TValues>()\n}\n","/**\n * ValidationEffect - 校验规则注册 effect。\n *\n * ValidationEffect 只同步字段规则与 Validator 的注册状态,\n * 字段交互触发校验由具体渲染层调用字段校验命令。\n *\n * @module core/field/validationEffect\n */\n\nimport { createSignal, createSignalEffect } from \"../reactivity\"\n\nimport type { Scope } from \"../node\"\nimport type { Signal } from \"../reactivity\"\nimport type { FieldEffectiveSchema } from \"./runtimeState\"\nimport type { ComputedSignal } from \"../reactivity/computed\"\nimport type { SchemxContext } from \"../schemxContext\"\nimport type { SchemxBaseField, Values } from \"../types\"\n\n/**\n * 创建 ValidationEffect 的配置选项。\n *\n * @typeParam TValues - 表单值类型\n */\nexport interface CreateValidationEffectOptions<TValues extends Values = Values> {\n /**\n * 当前 form 实例运行时上下文。\n */\n context: SchemxContext<TValues>\n\n /**\n * 字段名路径。\n */\n name: SchemxBaseField<TValues>[\"name\"]\n\n /**\n * 字段有效状态 computed(Signal Graph 阶段)。\n */\n effectiveSchema: ComputedSignal<FieldEffectiveSchema<TValues>>\n\n /**\n * 关联的 scope。\n */\n scope: Scope\n}\n\n/**\n * 校验规则注册 effect。\n */\nexport interface ValidationEffect {\n /**\n * 是否已注册规则。\n */\n registered: Signal<boolean>\n\n /**\n * 释放资源。\n */\n dispose(): void\n}\n\ninterface ValidationRegistrationSnapshot {\n visible: boolean\n readonly: boolean\n disabled: boolean\n label: string\n rules: SchemxBaseField<Values>[\"rules\"]\n}\n\n/**\n * 创建一个 ValidationEffect 实例。\n *\n * @typeParam TValues - 表单值类型\n * @param options - 配置选项\n * @returns 新创建的 ValidationEffect\n */\nexport function createValidationEffect<TValues extends Values = Values>(\n options: CreateValidationEffectOptions<TValues>\n): ValidationEffect {\n const { context, name, effectiveSchema, scope } = options\n\n const taskScheduler = context.scheduler\n\n const registered = createSignal(false)\n let registrationVersion = 0\n\n /**\n * 读取参与规则注册决策的响应式字段呈现态。\n *\n * 直接读取 effectiveSchema(Signal Graph 路径)。\n */\n const readValidationProps = (): ValidationRegistrationSnapshot => {\n const effective = effectiveSchema.value\n\n return {\n visible: effective.visible,\n readonly: effective.readonly,\n disabled: effective.disabled,\n label: effective.label,\n rules: effective.rules,\n }\n }\n\n /**\n * 根据当前字段呈现态注册或注销校验规则。\n */\n const applyRegistration = (snapshot: ValidationRegistrationSnapshot): void => {\n const { visible, readonly, disabled, label, rules } = snapshot\n\n if (!visible || readonly || disabled || !hasRules(rules)) {\n context.instance.unregisterRules(name)\n context.instance.setFieldError(name, [])\n\n registered.value = false\n\n return\n }\n\n const normalizedRules = rules ?? []\n\n context.instance.registerRules(name, normalizedRules, `${label}为必填项`)\n\n registered.value = true\n }\n\n /**\n * 将规则注册延后到 post 队列,避免与字段呈现态更新竞争。\n */\n const scheduleRegistration = (snapshot: ValidationRegistrationSnapshot): void => {\n const currentVersion = ++registrationVersion\n\n taskScheduler.schedule({\n id: `validation:${String(name)}`,\n priority: \"post\",\n scope,\n run: () => {\n if (scope.disposed || currentVersion !== registrationVersion) {\n return\n }\n\n applyRegistration(snapshot)\n },\n })\n }\n\n scope.add(() => {\n registrationVersion += 1\n context.instance.unregisterRules(name)\n context.instance.setFieldError(name, [])\n\n registered.value = false\n })\n\n const disposeEffect = createSignalEffect(() => {\n scheduleRegistration(readValidationProps())\n })\n\n scope.add(disposeEffect)\n\n /**\n * 释放校验 effect 持有的资源作用域。\n */\n const dispose = (): void => {\n scope.dispose()\n }\n\n return {\n registered,\n dispose,\n }\n}\n\nfunction hasRules(rules: SchemxBaseField<Values>[\"rules\"]): boolean {\n return Array.isArray(rules) ? rules.length > 0 : Boolean(rules)\n}\n","/**\n * Lifecycle - RuntimeNode 生命周期事件总线。\n *\n * Reconciler 负责决定 RuntimeNode 的创建、复用和销毁,RuntimeNodeManager 负责执行单个\n * RuntimeNode 的生命周期动作。LifecycleBus 只观察 RuntimeNode 生命周期,不参与内部资源挂载。\n *\n * @module core/lifecycle\n *\n * @example\n * ```ts\n * import { createLifecycleBus, createLifecycle } from '@schemx/core'\n *\n * // 创建生命周期总线\n * const bus = createLifecycleBus()\n *\n * // 订阅生命周期事件\n * const dispose = bus.on({\n * // 旧版兼容接口\n * mount: (node) => console.log('挂载:', node),\n * update: (node, prev) => console.log('更新:', node),\n * unmount: (node) => console.log('卸载:', node),\n *\n * // 新版详细接口\n * beforeMount: (node) => console.log('即将挂载:', node),\n * mounted: (node) => console.log('已挂载:', node),\n * beforeUpdate: (node, prev) => console.log('即将更新:', node),\n * updated: (node, prev) => console.log('已更新:', node),\n * beforeUnmount: (node) => console.log('即将卸载:', node),\n * unmounted: (node) => console.log('已卸载:', node)\n * })\n *\n * // 发布事件(通常由内部调用)\n * bus.emitMount(someNode)\n * bus.emitBeforeMount(someNode)\n * bus.emitUpdate(someNode, prevNode)\n * bus.emitBeforeUpdate(someNode, prevNode)\n * bus.emitUpdated(someNode, prevNode)\n * bus.emitBeforeUnmount(someNode)\n * bus.emitUnmount(someNode)\n *\n * // 检查是否有监听器\n * // 清理所有监听器\n * bus.clear()\n *\n * // 取消订阅\n * dispose()\n * ```\n *\n * @example\n * ```ts\n * // 在 createForm 中使用\n * const form = createForm({\n * schemas: [...],\n * lifecycleHooks: {\n * mounted: (node) => {\n * console.log('节点已挂载:', node.key)\n * },\n * unmounted: (node) => {\n * console.log('节点已卸载:', node.key)\n * }\n * }\n * })\n * ```\n */\n\nimport type { RuntimeNode } from \"../node\"\nimport type { Values } from \"../types\"\n\n/**\n * 兼容旧命名的完整生命周期 hooks。\n */\nexport interface LifecycleHooks<TNode> {\n /**\n * 挂载新节点。\n *\n * @param node - 被挂载的节点。\n */\n mount(node: TNode): void\n\n /**\n * 更新已有节点。\n *\n * @param node - 被更新的节点。\n * @param previousNode - 更新前的节点快照。\n */\n update(node: TNode, previousNode: TNode): void\n\n /**\n * 卸载节点。\n *\n * @param node - 被卸载的节点。\n */\n unmount(node: TNode): void\n}\n\n/**\n * RuntimeNode 生命周期 hooks。\n */\nexport interface RuntimeNodeLifecycleHooks<TNode> {\n /**\n * RuntimeNode 挂载前。\n *\n * @param node - 即将挂载的 RuntimeNode 节点。\n */\n beforeMount(node: TNode): void\n\n /**\n * RuntimeNode 挂载后。\n *\n * @param node - 已挂载的 RuntimeNode 节点。\n */\n mounted(node: TNode): void\n\n /**\n * RuntimeNode 更新前。\n *\n * @param node - 即将更新的 RuntimeNode 节点。\n * @param previousNode - 更新前的 RuntimeNode 快照。\n */\n beforeUpdate(node: TNode, previousNode: TNode): void\n\n /**\n * RuntimeNode 更新后。\n *\n * @param node - 已更新的 RuntimeNode 节点。\n * @param previousNode - 更新前的 RuntimeNode 快照。\n */\n updated(node: TNode, previousNode: TNode): void\n\n /**\n * RuntimeNode 卸载前。\n *\n * @param node - 即将卸载的 RuntimeNode 节点。\n */\n beforeUnmount(node: TNode): void\n\n /**\n * RuntimeNode 卸载后。\n *\n * @param node - 已卸载的 RuntimeNode 节点。\n */\n unmounted(node: TNode): void\n}\n\n/**\n * 生命周期事件监听器。\n *\n * 监听器允许只实现关心的事件。mount/update/unmount 是兼容旧命名的观察入口,\n * mounted/updated/unmounted 是新的 RuntimeNode 生命周期入口。\n */\nexport type LifecycleListener<TNode> = Partial<\n LifecycleHooks<TNode> & RuntimeNodeLifecycleHooks<TNode>\n>\n\n/**\n * 生命周期事件总线。\n *\n * @example\n * ```ts\n * const bus: LifecycleBus<MyNode> = createLifecycleBus()\n *\n * // 订阅\n * const dispose = bus.on({\n * mounted: (node) => console.log('Mounted:', node),\n * unmounted: (node) => console.log('Unmounted:', node)\n * })\n *\n * // 发布\n * bus.emitMount(node)\n * bus.emitBeforeMount(node)\n * bus.emitUpdate(node, prev)\n * bus.emitBeforeUpdate(node, prev)\n * bus.emitUpdated(node, prev)\n * bus.emitBeforeUnmount(node)\n * bus.emitUnmount(node)\n *\n * // 清理\n * bus.clear()\n * dispose()\n * ```\n */\nexport interface LifecycleBus<TNode> {\n /**\n * 订阅生命周期事件。\n *\n * @param listener - 生命周期事件监听器。\n * @returns 取消订阅函数\n */\n on(listener: LifecycleListener<TNode>): () => void\n\n /**\n * 发布 mount 事件。\n *\n * @param node - 被挂载的节点。\n */\n emitMount(node: TNode): void\n\n /**\n * 发布 beforeMount 事件。\n *\n * @param node - 即将挂载的节点。\n */\n emitBeforeMount(node: TNode): void\n\n /**\n * 发布 update 事件。\n *\n * @param node - 被更新的节点。\n * @param previousNode - 更新前的节点快照。\n */\n emitUpdate(node: TNode, previousNode: TNode): void\n\n /**\n * 发布 beforeUpdate 事件。\n *\n * @param node - 即将更新的节点。\n * @param previousNode - 更新前的节点快照。\n */\n emitBeforeUpdate(node: TNode, previousNode: TNode): void\n\n /**\n * 发布 updated 事件。\n *\n * @param node - 已更新的节点。\n * @param previousNode - 更新前的节点快照。\n */\n emitUpdated(node: TNode, previousNode: TNode): void\n\n /**\n * 发布 beforeUnmount 事件。\n *\n * @param node - 即将卸载的节点。\n */\n emitBeforeUnmount(node: TNode): void\n\n /**\n * 发布 unmount 事件。\n *\n * @param node - 被卸载的节点。\n */\n emitUnmount(node: TNode): void\n\n /**\n * 移除所有监听器。\n */\n clear(): void\n}\n\n/**\n * 表单内部生命周期 hooks。\n *\n * 这些 hook 由 createForm 传入,用于在表单内部资源装配后\n * 观察字段、分组和 dependency 节点的 mount/update/unmount。\n */\nexport type SchemxLifecycleHooks<TValues extends Values = Values> = LifecycleListener<\n RuntimeNode<TValues>\n>\n\n/**\n * 创建生命周期事件总线。\n *\n * listener 按订阅顺序执行。发布事件前会复制 listener 快照,避免某个 listener\n * 在回调中订阅/取消订阅影响当前事件分发。\n *\n * @param initialListener - 可选的初始监听器。\n * @returns 新的生命周期事件总线。\n *\n * @example\n * ```ts\n * // 创建空总线\n * const bus = createLifecycleBus()\n *\n * // 创建并立即订阅\n * const bus = createLifecycleBus({\n * mounted: (node) => console.log('Node mounted:', node)\n * })\n *\n * // 后续再订阅\n * const dispose = bus.on({\n * unmounted: (node) => console.log('Node unmounted:', node)\n * })\n * ```\n */\nexport function createLifecycleBus<TNode>(\n initialListener?: LifecycleListener<TNode>\n): LifecycleBus<TNode> {\n const listeners = new Set<LifecycleListener<TNode>>()\n\n if (initialListener) {\n listeners.add(initialListener)\n }\n\n /**\n * 按监听器快照分发生命周期事件。\n */\n const emit = <TArgs extends unknown[]>(\n run: (listener: LifecycleListener<TNode>, ...args: TArgs) => void,\n ...args: TArgs\n ): void => {\n for (const listener of Array.from(listeners)) {\n run(listener, ...args)\n }\n }\n\n /**\n * 订阅生命周期事件。\n */\n const on = (listener: LifecycleListener<TNode>) => {\n listeners.add(listener)\n\n return () => {\n listeners.delete(listener)\n }\n }\n\n /**\n * 发布 mount 事件。\n */\n const emitMount = (node: TNode) => {\n emit((listener, currentNode) => {\n listener.mount?.(currentNode)\n listener.mounted?.(currentNode)\n }, node)\n }\n\n /**\n * 发布 beforeMount 事件。\n */\n const emitBeforeMount = (node: TNode) => {\n emit((listener, currentNode) => {\n listener.beforeMount?.(currentNode)\n }, node)\n }\n\n /**\n * 发布 update 事件。\n */\n const emitUpdate = (node: TNode, previousNode: TNode) => {\n emit(\n (listener, currentNode, currentPreviousNode) => {\n listener.update?.(currentNode, currentPreviousNode)\n },\n node,\n previousNode\n )\n }\n\n /**\n * 发布 beforeUpdate 事件。\n */\n const emitBeforeUpdate = (node: TNode, previousNode: TNode) => {\n emit(\n (listener, currentNode, currentPreviousNode) => {\n listener.beforeUpdate?.(currentNode, currentPreviousNode)\n },\n node,\n previousNode\n )\n }\n\n /**\n * 发布 updated 事件。\n */\n const emitUpdated = (node: TNode, previousNode: TNode) => {\n emit(\n (listener, currentNode, currentPreviousNode) => {\n listener.updated?.(currentNode, currentPreviousNode)\n },\n node,\n previousNode\n )\n }\n\n /**\n * 发布 beforeUnmount 事件。\n */\n const emitBeforeUnmount = (node: TNode) => {\n emit((listener, currentNode) => {\n listener.beforeUnmount?.(currentNode)\n }, node)\n }\n\n /**\n * 发布 unmount 事件。\n */\n const emitUnmount = (node: TNode) => {\n emit((listener, currentNode) => {\n listener.unmount?.(currentNode)\n listener.unmounted?.(currentNode)\n }, node)\n }\n\n /**\n * 移除所有监听器。\n */\n const clear = () => {\n listeners.clear()\n }\n\n return {\n on,\n emitMount,\n emitBeforeMount,\n emitUpdate,\n emitBeforeUpdate,\n emitUpdated,\n emitBeforeUnmount,\n emitUnmount,\n clear,\n }\n}\n\n/**\n * 兼容旧命名:创建生命周期事件总线。\n */\nexport const createLifecycle = createLifecycleBus\n","/**\n * Scope - 资源生命周期边界。\n *\n * Scope 管理 cleanup 的注册、嵌套 scope、dispose 执行。\n * 规则:\n * - dispose 幂等\n * - 子 scope 先释放,父 scope 后释放\n * - cleanup 抛错不阻断后续 cleanup\n * - disposed 后 add() 立即执行 cleanup 并返回已释放 handle\n *\n * @module core/node/scope\n */\n\nimport type {\n Scope,\n ScopeCleanup,\n ScopeCleanupHandle,\n ScopeCleanupRecord,\n} from \"./types\"\n\n/**\n * 创建一个资源生命周期作用域。\n *\n * @returns 新创建的 `Scope`。\n *\n * @remarks\n * 已释放的 scope 再调用 `add()` 时会立即执行 cleanup,这让调用方无需为异步\n * mount 流程额外判断资源是否已经过期。\n */\nexport function createScope(): Scope {\n let disposed = false\n const cleanupRecords: ScopeCleanupRecord[] = []\n const childScopes: Scope[] = []\n\n /**\n * 注册释放函数。\n */\n const add = (cleanup: ScopeCleanup): ScopeCleanupHandle => {\n if (disposed) {\n // 已释放的 scope 不再持有新资源,直接执行 cleanup 保持调用方语义稳定。\n runCleanup(cleanup)\n\n return createDisposedHandle()\n }\n\n // 每次 add 都创建独立记录;同一个 cleanup 函数重复注册也应独立释放。\n const record: ScopeCleanupRecord = {\n cleanup,\n disposed: false,\n }\n cleanupRecords.push(record)\n\n /**\n * 立即释放当前 cleanup 记录并从 scope 中移除。\n */\n const disposeCleanup = (): void => {\n if (record.disposed) {\n return\n }\n\n record.disposed = true\n removeItem(cleanupRecords, record)\n runCleanup(record.cleanup)\n }\n\n return {\n get disposed() {\n return record.disposed\n },\n dispose: disposeCleanup,\n }\n }\n\n /**\n * 创建子 scope。\n */\n const child = (): Scope => {\n const childScope = createScope()\n childScopes.push(childScope)\n\n // 子 scope 可能被调用方提前释放;提前释放后从父 scope 中摘除,\n // 避免父 scope 后续 dispose 时继续保留无效引用。\n childScope.add(() => {\n removeItem(childScopes, childScope)\n })\n\n return childScope\n }\n\n /**\n * 释放当前 scope 及所有子 scope。\n */\n const disposeScope = (): void => {\n if (disposed) {\n return\n }\n\n disposed = true\n\n // 先释放子 scope,确保叶子资源早于父级资源清理。\n for (const childScope of childScopes.slice().reverse()) {\n childScope.dispose()\n }\n\n childScopes.length = 0\n\n // 再按 LIFO 顺序释放当前 scope 自己注册的 cleanup。\n for (const record of cleanupRecords.slice().reverse()) {\n if (!record.disposed) {\n record.disposed = true\n runCleanup(record.cleanup)\n }\n }\n\n cleanupRecords.length = 0\n }\n\n return {\n get disposed() {\n return disposed\n },\n add,\n child,\n dispose: disposeScope,\n }\n}\n\n/**\n * `createScope` 的兼容别名。\n */\nexport const createRuntimeScope = createScope\n\nconst createDisposedHandle = (): ScopeCleanupHandle => {\n return {\n disposed: true,\n dispose: noop,\n }\n}\n\nconst noop = (): void => {}\n\nconst removeItem = <T>(items: T[], item: T): void => {\n const index = items.indexOf(item)\n if (index >= 0) {\n items.splice(index, 1)\n }\n}\n\nconst runCleanup = (cleanup: ScopeCleanup): void => {\n try {\n cleanup()\n } catch (error) {\n reportRuntimeCleanupError(error)\n }\n}\n\n/**\n * 报告 cleanup 错误。\n *\n * @remarks\n * Scope 会吞掉 cleanup 抛出的错误以保证后续清理继续执行;这个函数是统一的\n * 错误上报出口。\n *\n * @param error - cleanup 抛出的错误。\n */\nexport function reportRuntimeCleanupError(error: unknown): void {\n console.error(\"[Scope] Cleanup error:\", error)\n}\n","/**\n * RuntimeNode 结构实现。\n *\n * RuntimeNode 只表达稳定身份、节点类型、父子结构和生命周期状态。\n * descriptor、runtimeState、viewState、dependencySlot 等领域资源不挂在 node 上。\n *\n * @module core/node/runtimeNode\n */\n\nimport { createSignal } from \"../reactivity\"\n\nimport { createScope } from \"./scope\"\n\nimport type {\n CreateDependencyRuntimeNodeOptions,\n CreateFieldRuntimeNodeOptions,\n CreateGroupRuntimeNodeOptions,\n CreateRootRuntimeNodeOptions,\n DependencyRuntimeNode,\n DescribedRuntimeNode,\n FieldRuntimeNode,\n GroupRuntimeNode,\n RootRuntimeNode,\n RuntimeNode,\n} from \"./types\"\nimport type { Values } from \"../types\"\n\nexport function createRootRuntimeNode<TValues extends Values = Values>(\n options: CreateRootRuntimeNodeOptions\n): RootRuntimeNode<TValues> {\n return {\n id: 0,\n key: \"schemx:root\",\n type: \"root\",\n parent: null,\n scope: options.scope,\n mounted: createSignal(false),\n disposed: createSignal(false),\n childNodes: [],\n }\n}\n\nexport function getChildRuntimeNodes<TValues extends Values = Values>(\n node: RuntimeNode<TValues>\n): readonly DescribedRuntimeNode<TValues>[] {\n switch (node.type) {\n case \"root\":\n case \"group\":\n return node.childNodes\n case \"dependency\":\n return node.childNodes\n case \"field\":\n return []\n }\n}\n\nexport function setChildRuntimeNodes<TValues extends Values = Values>(\n node: RuntimeNode<TValues>,\n children: DescribedRuntimeNode<TValues>[]\n): void {\n switch (node.type) {\n case \"root\":\n case \"group\":\n node.childNodes = children\n\n return\n case \"dependency\":\n node.childNodes = children\n\n return\n case \"field\":\n return\n }\n}\n\nexport function createFieldRuntimeNode<TValues extends Values = Values>(\n options: CreateFieldRuntimeNodeOptions<TValues>\n): FieldRuntimeNode<TValues> {\n return {\n id: options.id,\n key: options.key,\n type: \"field\",\n parent: options.parent ?? null,\n scope: options.scope ?? options.parent?.scope.child() ?? createScope(),\n mounted: createSignal(false),\n disposed: createSignal(false),\n }\n}\n\nexport function createGroupRuntimeNode<TValues extends Values = Values>(\n options: CreateGroupRuntimeNodeOptions<TValues>\n): GroupRuntimeNode<TValues> {\n return {\n id: options.id,\n key: options.key,\n type: \"group\",\n parent: options.parent ?? null,\n scope: options.scope ?? options.parent?.scope.child() ?? createScope(),\n mounted: createSignal(false),\n disposed: createSignal(false),\n childNodes: [],\n }\n}\n\nexport function createDependencyRuntimeNode<TValues extends Values = Values>(\n options: CreateDependencyRuntimeNodeOptions<TValues>\n): DependencyRuntimeNode<TValues> {\n return {\n id: options.id,\n key: options.key,\n type: \"dependency\",\n parent: options.parent ?? null,\n scope: options.scope ?? options.parent?.scope.child() ?? createScope(),\n mounted: createSignal(false),\n disposed: createSignal(false),\n childNodes: [],\n }\n}\n","import type {\n RuntimeNodeId,\n RuntimeNodeResourceContext,\n} from \"./types\"\nimport type { Values } from \"../types\"\n\n/**\n * 创建 RuntimeNode 之外的领域资源注册表。\n *\n * 资源通过 `RuntimeNodeId` 关联,资源表是事实存储,不承载领域逻辑。\n * 创建逻辑仍留在各领域模块中,调用方在明确边界内直接读写对应 Map。\n */\nexport function createRuntimeResources<\n TValues extends Values = Values,\n>(): RuntimeNodeResourceContext<TValues> {\n return {\n nodes: new Map(),\n descriptors: new Map(),\n fieldStates: new Map(),\n viewStates: new Map(),\n childrenStates: new Map(),\n dependencyEffects: new Map(),\n fieldResourceScopes: new Map(),\n fieldDynamicPropScopes: new Map(),\n dependencyResourceScopes: new Map(),\n }\n}\n\n/**\n * 删除某个节点在所有资源表中的记录。\n *\n * 一致性清理 helper:避免调用方在移除节点时遗漏某张资源表。\n * 不负责领域资源自身的 dispose,那由各领域 scope 在卸载时处理。\n */\nexport function deleteNodeResources<TValues extends Values>(\n resources: RuntimeNodeResourceContext<TValues>,\n nodeId: RuntimeNodeId\n): void {\n resources.nodes.delete(nodeId)\n resources.descriptors.delete(nodeId)\n resources.fieldStates.delete(nodeId)\n resources.viewStates.delete(nodeId)\n resources.childrenStates.delete(nodeId)\n resources.dependencyEffects.delete(nodeId)\n resources.fieldResourceScopes.delete(nodeId)\n resources.fieldDynamicPropScopes.delete(nodeId)\n resources.dependencyResourceScopes.delete(nodeId)\n}\n","/**\n * RuntimeNodeManager - runtime tree 结构管理器。\n *\n * 该模块只维护 RuntimeNode tree 和 `nodes` Map 的一致性,不挂载 descriptor、\n * field state、dependency effect、validation effect 或 view state。\n *\n * @module core/node/runtimeNodeManager\n */\n\nimport { createSignal } from \"../reactivity\"\n\nimport { deleteNodeResources } from \"./resources\"\nimport {\n createDependencyRuntimeNode,\n createFieldRuntimeNode,\n createGroupRuntimeNode,\n createRootRuntimeNode,\n getChildRuntimeNodes,\n setChildRuntimeNodes,\n} from \"./runtimeNode\"\nimport { createScope } from \"./scope\"\n\nimport type { FormDescriptor } from \"../descriptor\"\nimport type { SchemxContext } from \"../schemxContext\"\nimport type { Values } from \"../types\"\nimport type {\n ContainerRuntimeNode,\n CreateRuntimeNodeOptions,\n DescribedRuntimeNode,\n RootRuntimeNode,\n RuntimeNode,\n RuntimeNodeManager,\n RuntimeNodeResourceContext,\n} from \"./types\"\n\nexport function createRuntimeNodeManager<TValues extends Values = Values>(\n context: SchemxContext<TValues>\n): RuntimeNodeManager<TValues> {\n const resources = context.nodeResources\n\n let nextId = 1\n\n const manager: RuntimeNodeManager<TValues> = {\n resources,\n nodes: resources.nodes,\n createRoot,\n create,\n createNode,\n getNode,\n traverse,\n insertChild,\n replaceChildren,\n removeChild,\n removeSubtree,\n }\n\n return manager\n\n function createRoot(): RootRuntimeNode<TValues> {\n const node = createRootRuntimeNode<TValues>({ scope: createScope() })\n\n registerNode(resources, node)\n ensureChildrenState(node)\n\n return node\n }\n\n function create(\n descriptor: FormDescriptor<TValues>,\n parent: ContainerRuntimeNode<TValues>\n ): DescribedRuntimeNode<TValues> {\n const node = createNode({\n type: descriptor.type,\n key: descriptor.key,\n scope: parent.scope.child(),\n })\n\n node.parent = parent\n\n if (node.type !== \"field\") {\n ensureChildrenState(node)\n }\n\n return node\n }\n\n function createNode(\n createOptions: CreateRuntimeNodeOptions\n ): DescribedRuntimeNode<TValues> {\n const nodeId = nextId++\n const scope = createOptions.scope ?? createScope()\n const baseOptions = {\n id: nodeId,\n key: createOptions.key,\n scope,\n }\n\n let node = {} as DescribedRuntimeNode<TValues>\n\n if (createOptions.type === \"field\") {\n node = createFieldRuntimeNode<TValues>(baseOptions)\n } else if (createOptions.type === \"group\") {\n node = createGroupRuntimeNode<TValues>(baseOptions)\n } else {\n node = createDependencyRuntimeNode<TValues>(baseOptions)\n }\n\n registerNode(resources, node)\n\n if (node.type !== \"field\") {\n ensureChildrenState(node)\n }\n\n return node\n }\n\n function getNode(nodeId: number): RuntimeNode<TValues> | undefined {\n return resources.nodes.get(nodeId)\n }\n\n function traverse(root: RuntimeNode<TValues>): RuntimeNode<TValues>[] {\n const result: RuntimeNode<TValues>[] = []\n const visit = (node: RuntimeNode<TValues>): void => {\n result.push(node)\n\n for (const child of getChildRuntimeNodes(node)) {\n visit(child)\n }\n }\n\n visit(root)\n\n return result\n }\n\n function insertChild(\n parent: ContainerRuntimeNode<TValues>,\n child: DescribedRuntimeNode<TValues>,\n index = getChildRuntimeNodes(parent).length\n ): void {\n if (child.parent) {\n detachChild(child.parent, child)\n }\n\n const currentChildren = getChildRuntimeNodes(parent).filter(\n (current) => current !== child\n )\n const nextChildren = [...currentChildren]\n const normalizedIndex = Math.max(0, Math.min(index, nextChildren.length))\n\n nextChildren.splice(normalizedIndex, 0, child)\n child.parent = parent\n setChildren(parent, nextChildren)\n }\n\n function replaceChildren(\n parent: ContainerRuntimeNode<TValues>,\n children: readonly DescribedRuntimeNode<TValues>[]\n ): void {\n const currentChildren = getChildRuntimeNodes(parent)\n const nextChildren = Array.from(new Set(children))\n const nextSet = new Set(nextChildren)\n\n for (const child of currentChildren) {\n if (!nextSet.has(child)) {\n child.parent = null\n }\n }\n\n for (const child of nextChildren) {\n if (child.parent && child.parent !== parent) {\n detachChild(child.parent, child)\n }\n\n child.parent = parent\n }\n\n setChildren(parent, nextChildren)\n }\n\n function removeChild(\n parent: ContainerRuntimeNode<TValues>,\n child: DescribedRuntimeNode<TValues>\n ): void {\n detachChild(parent, child)\n }\n\n function removeSubtree(node: RuntimeNode<TValues>): void {\n for (const child of getChildRuntimeNodes(node)) {\n removeSubtree(child)\n }\n\n if (node.type !== \"field\") {\n setChildren(node, [])\n }\n\n if (node.parent) {\n detachChild(node.parent, node as DescribedRuntimeNode<TValues>)\n }\n\n node.parent = null\n node.disposed.value = true\n node.scope.dispose()\n deleteNodeResources(resources, node.id)\n }\n\n function detachChild(\n parent: ContainerRuntimeNode<TValues>,\n child: DescribedRuntimeNode<TValues>\n ): void {\n const nextChildren = getChildRuntimeNodes(parent).filter(\n (current) => current !== child\n )\n\n setChildren(parent, nextChildren)\n\n if (child.parent === parent) {\n child.parent = null\n }\n }\n\n function ensureChildrenState(node: ContainerRuntimeNode<TValues>) {\n let state = resources.childrenStates.get(node.id)\n\n if (!state) {\n state = {\n children: createSignal<readonly DescribedRuntimeNode<TValues>[]>(\n getChildRuntimeNodes(node)\n ),\n }\n resources.childrenStates.set(node.id, state)\n }\n\n return state\n }\n\n function setChildren(\n node: ContainerRuntimeNode<TValues>,\n children: DescribedRuntimeNode<TValues>[]\n ): void {\n setChildRuntimeNodes(node, children)\n ensureChildrenState(node).children.value = children\n }\n}\n\n\nfunction registerNode<TValues extends Values>(\n resources: RuntimeNodeResourceContext<TValues>,\n node: RuntimeNode<TValues>\n): void {\n resources.nodes.set(node.id, node)\n}\n","/**\n * ViewGraph - 节点级 ViewSchema computed 图。\n *\n * 为 field、group、dependency 和 root 创建 computed view,让未变化子树\n * 的 ViewSchema 引用可以复用,并把 sanitize 成本限制在变化字段上。\n *\n * @module core/view/viewGraph\n */\n\nimport { createComputed } from \"../reactivity/computed\"\nimport { maybeUseSchemxContext } from \"../schemxContext\"\n\nimport type { FieldRuntimeDiagnostics } from \"../field/runtimeState\"\nimport type { DescribedRuntimeNode, RuntimeNodeResourceContext } from \"../node\"\nimport type {\n SchemxViewDebugMeta,\n SchemxViewFieldSchema,\n SchemxViewGroupSchema,\n SchemxViewSchema,\n} from \"./types\"\nimport type { ComputedSignal } from \"../reactivity/computed\"\nimport type { Signal } from \"../reactivity/signal\"\nimport type {\n SchemxComponentProps,\n SchemxResolvedBaseField,\n SchemxResolvedGroupField,\n Values,\n} from \"../types\"\n\n/**\n * 字段节点视图状态。\n */\nexport interface FieldNodeViewState<TValues extends Values = Values> {\n /** 字段 ViewSchema computed */\n readonly view: ComputedSignal<SchemxViewFieldSchema<TValues> | null>\n}\n\n/**\n * 分组节点视图状态。\n */\nexport interface GroupViewState<TValues extends Values = Values> {\n /** 分组 ViewSchema computed */\n readonly view: ComputedSignal<SchemxViewGroupSchema<TValues> | null>\n}\n\n/**\n * Dependency 节点视图状态。\n */\nexport interface DependencyViewState<TValues extends Values = Values> {\n /** dependency 透明展开的 children ViewSchemas computed */\n readonly view: ComputedSignal<readonly SchemxViewSchema<TValues>[]>\n}\n\n/**\n * Root 节点视图状态。\n */\nexport interface RootViewState<TValues extends Values = Values> {\n /** 顶层 ViewSchemas computed */\n readonly viewSchemas: ComputedSignal<readonly SchemxViewSchema<TValues>[]>\n}\n\nexport type RuntimeViewState<TValues extends Values = Values> =\n | FieldNodeViewState<TValues>\n | GroupViewState<TValues>\n | DependencyViewState<TValues>\n | RootViewState<TValues>\n\n/**\n * 创建字段节点视图状态。\n *\n * @param viewSchema - 字段运行态的 viewSchema computed\n * @param nodeKey - 节点 key\n * @param nodeId - 节点 ID\n * @param diagnostics - 字段运行态诊断信息\n * @returns 字段节点视图状态\n */\nexport function createFieldNodeViewState<TValues extends Values = Values>(\n viewSchema: ComputedSignal<SchemxResolvedBaseField<TValues>>,\n nodeKey?: string,\n nodeId?: number,\n diagnostics?: Signal<FieldRuntimeDiagnostics<TValues>>\n): FieldNodeViewState<TValues> {\n return {\n view: createComputed(() => {\n const schema = viewSchema.value\n const meta = diagnostics?.value\n\n return {\n ...schema,\n key: nodeKey ?? \"\",\n placeholder: sanitizePlaceholder(schema.placeholder ?? \"\"),\n componentProps: sanitizeComponentProps(schema.componentProps ?? {}),\n debug: buildFieldDebugMeta(nodeId, meta),\n } as SchemxViewFieldSchema<TValues>\n }),\n }\n}\n\n/**\n * 创建分组节点视图状态。\n *\n * @param groupSchema - 分组静态 schema\n * @param childrenView - children ViewSchemas computed\n * @param nodeKey - 节点 key\n * @param nodeId - 节点 ID\n * @returns 分组节点视图状态\n */\nexport function createGroupViewState<TValues extends Values = Values>(\n groupSchema: SchemxResolvedGroupField<TValues>,\n childrenView: ComputedSignal<readonly SchemxViewSchema<TValues>[]>,\n nodeKey?: string,\n nodeId?: number\n): GroupViewState<TValues> {\n return {\n view: createComputed(() => {\n return {\n ...groupSchema,\n key: nodeKey ?? \"\",\n children: childrenView.value,\n debug: buildNodeDebugMeta(nodeId, \"group\", false, false),\n } as SchemxViewGroupSchema<TValues>\n }),\n }\n}\n\n/**\n * 创建 dependency 节点视图状态。\n *\n * dependency 透明展开 children,不输出自身 schema。\n *\n * @param childrenView - dynamic children ViewSchemas computed\n * @returns dependency 节点视图状态\n */\nexport function createDependencyViewState<TValues extends Values = Values>(\n childrenView: ComputedSignal<readonly SchemxViewSchema<TValues>[]>\n): DependencyViewState<TValues> {\n return {\n view: createComputed(() => childrenView.value),\n }\n}\n\n/**\n * 创建 children ViewSchemas computed。\n *\n * @param childrenSignal - 当前容器的 runtime children signal\n * @returns children ViewSchemas computed\n */\nexport function createChildrenViewState<TValues extends Values = Values>(\n childrenSignal: Signal<readonly DescribedRuntimeNode<TValues>[]>,\n resources?: RuntimeNodeResourceContext<TValues>\n): ComputedSignal<readonly SchemxViewSchema<TValues>[]> {\n return createComputed(() => {\n const result: SchemxViewSchema<TValues>[] = []\n\n for (const child of childrenSignal.value) {\n const view = readRuntimeNodeView(child, resources)\n\n if (view == null) {\n continue\n }\n\n if (Array.isArray(view)) {\n result.push(...(view as readonly SchemxViewSchema<TValues>[]))\n } else {\n result.push(view as SchemxViewSchema<TValues>)\n }\n }\n\n return result\n })\n}\n\n/**\n * 读取 runtime node 的 view 输出。\n *\n * @param node - runtime node\n * @returns 对应的 ViewSchema、ViewSchema 列表或 null\n */\nexport function readRuntimeNodeView<TValues extends Values = Values>(\n node: DescribedRuntimeNode<TValues>,\n resources = maybeUseSchemxContext<TValues>()?.nodeResources\n): SchemxViewSchema<TValues> | readonly SchemxViewSchema<TValues>[] | null {\n if (node.disposed.value) {\n return null\n }\n\n if (!resources) {\n return null\n }\n\n const viewState = resources.viewStates.get(node.id)\n\n if (node.type === \"field\") {\n return hasNodeView(viewState) ? viewState.view.value ?? null : null\n }\n\n if (node.type === \"group\") {\n return hasNodeView(viewState) ? viewState.view.value ?? null : null\n }\n\n if (node.type === \"dependency\") {\n return hasNodeView(viewState) ? viewState.view.value ?? [] : []\n }\n\n return null\n}\n\nfunction hasNodeView<TValues extends Values>(\n viewState: RuntimeViewState<TValues> | undefined\n): viewState is\n | FieldNodeViewState<TValues>\n | GroupViewState<TValues>\n | DependencyViewState<TValues> {\n return viewState != null && \"view\" in viewState\n}\n\n/**\n * 创建 root 节点视图状态。\n *\n * root 组合顶层 children view,自身不输出 schema。\n *\n * @param childrenSignal - 顶层 children 的响应式 signal\n * @returns root 节点视图状态\n */\nexport function createRootViewState<TValues extends Values = Values>(\n childrenSignal: Signal<readonly DescribedRuntimeNode<TValues>[]>,\n resources?: RuntimeNodeResourceContext<TValues>\n): RootViewState<TValues> {\n return {\n viewSchemas: createChildrenViewState(childrenSignal, resources),\n }\n}\n\n/**\n * 读取 root 视图。\n *\n * @param root - root 节点视图状态\n * @returns 当前顶层 ViewSchemas\n */\nexport function readRootViewSchemas<TValues extends Values>(\n root: RootViewState<TValues>\n): readonly SchemxViewSchema<TValues>[] {\n return root.viewSchemas.value\n}\n\nfunction buildFieldDebugMeta<TValues extends Values = Values>(\n nodeId: number | undefined,\n diagnostics: FieldRuntimeDiagnostics<TValues> | undefined\n): Readonly<SchemxViewDebugMeta> {\n return {\n runtimeNodeId: nodeId ?? 0,\n runtimeNodeType: \"field\",\n hasRuntimeState: true,\n hasDependencyEffect: false,\n lastUpdatedBy: diagnostics?.lastUpdatedBy,\n overriddenKeys: diagnostics?.overriddenKeys,\n error: diagnostics?.error?.message ?? null,\n }\n}\n\nfunction buildNodeDebugMeta(\n nodeId: number | undefined,\n runtimeNodeType: string,\n hasRuntimeState: boolean,\n hasDependencyEffect: boolean\n): Readonly<SchemxViewDebugMeta> {\n return {\n runtimeNodeId: nodeId ?? 0,\n runtimeNodeType,\n hasRuntimeState,\n hasDependencyEffect,\n }\n}\n\nfunction sanitizePlaceholder(value: string | undefined): string {\n if (!value) {\n return \"\"\n }\n\n return value.length > 1000 ? value.slice(0, 1000) : value\n}\n\nfunction sanitizeComponentProps<TValues extends Values = Values>(\n props: SchemxComponentProps<TValues>,\n depth = 0\n): Readonly<Record<string, unknown>> {\n if (depth > 10) {\n return {}\n }\n\n const result: Record<string, unknown> = {}\n\n for (const key of Object.keys(props)) {\n if (!isValidPropKey(key)) {\n continue\n }\n\n const value = (props as Record<string, unknown>)[key]\n\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n result[key] = sanitizeComponentProps(\n value as SchemxComponentProps<TValues>,\n depth + 1\n )\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\nfunction isValidPropKey(key: string): boolean {\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)) {\n return true\n }\n\n return /^[a-zA-Z0-9_-]+$/.test(key)\n}\n","import {\n createChildrenViewState,\n createDependencyViewState,\n createFieldNodeViewState,\n createGroupViewState,\n createRootViewState,\n} from \"./viewGraph\"\n\nimport type {\n DependencyDescriptor,\n FieldDescriptor,\n FormDescriptor,\n GroupDescriptor,\n} from \"../descriptor\"\nimport type {\n ContainerRuntimeNode,\n DescribedRuntimeNode,\n RootRuntimeNode,\n RuntimeChildrenState,\n RuntimeNode,\n RuntimeNodeResourceContext,\n} from \"../node\"\nimport type { Values } from \"../types\"\nimport type { RootViewState, RuntimeViewState } from \"./viewGraph\"\n\n/**\n * 为 root 创建并注册 ViewState。\n */\nexport function createRootRuntimeViewState<TValues extends Values = Values>(\n root: RootRuntimeNode<TValues>,\n resources: RuntimeNodeResourceContext<TValues>\n): RootViewState<TValues> {\n const childrenState = getChildrenState(root, resources)\n const viewState = createRootViewState<TValues>(\n childrenState.children,\n resources\n )\n\n resources.viewStates.set(root.id, viewState)\n\n return viewState\n}\n\n/**\n * 为 RuntimeNode 创建并注册对应 ViewState。\n */\nexport function createRuntimeViewState<TValues extends Values = Values>(\n node: DescribedRuntimeNode<TValues>,\n descriptor: FormDescriptor<TValues>,\n resources: RuntimeNodeResourceContext<TValues>\n): RuntimeViewState<TValues> {\n if (node.type === \"field\" && descriptor.type === \"field\") {\n return createFieldRuntimeViewState(node, descriptor, resources)\n }\n\n if (node.type === \"group\" && descriptor.type === \"group\") {\n return createGroupRuntimeViewState(node, descriptor, resources)\n }\n\n if (node.type === \"dependency\" && descriptor.type === \"dependency\") {\n return createDependencyRuntimeViewState(node, descriptor, resources)\n }\n\n throw new Error(\n `[schemx] Cannot create viewState for node \"${node.key}\" with descriptor \"${descriptor.type}\".`\n )\n}\n\n/**\n * 更新 RuntimeNode 对应 ViewState。\n */\nexport function updateRuntimeViewState<TValues extends Values = Values>(\n node: DescribedRuntimeNode<TValues>,\n descriptor: FormDescriptor<TValues>,\n resources: RuntimeNodeResourceContext<TValues>\n): RuntimeViewState<TValues> {\n return createRuntimeViewState(node, descriptor, resources)\n}\n\n/**\n * 删除 RuntimeNode 对应 ViewState。\n */\nexport function deleteRuntimeViewState<TValues extends Values = Values>(\n node: RuntimeNode<TValues>,\n resources: RuntimeNodeResourceContext<TValues>\n): void {\n resources.viewStates.delete(node.id)\n}\n\nfunction createFieldRuntimeViewState<TValues extends Values>(\n node: Extract<RuntimeNode<TValues>, { type: \"field\" }>,\n descriptor: FieldDescriptor<TValues>,\n resources: RuntimeNodeResourceContext<TValues>\n): RuntimeViewState<TValues> {\n const runtimeState = resources.fieldStates.get(node.id)\n\n if (!runtimeState) {\n throw new Error(`[schemx] fieldState is required for node \"${node.key}\"`)\n }\n\n const viewState = createFieldNodeViewState<TValues>(\n runtimeState.viewSchema,\n node.key,\n node.id,\n runtimeState.diagnostics\n )\n\n resources.viewStates.set(node.id, viewState)\n\n return viewState\n}\n\nfunction createGroupRuntimeViewState<TValues extends Values>(\n node: Extract<RuntimeNode<TValues>, { type: \"group\" }>,\n descriptor: GroupDescriptor<TValues>,\n resources: RuntimeNodeResourceContext<TValues>\n): RuntimeViewState<TValues> {\n const viewState = createGroupViewState<TValues>(\n descriptor.staticSchema,\n createChildrenViewState<TValues>(\n getChildrenState(node, resources).children,\n resources\n ),\n node.key,\n node.id\n )\n\n resources.viewStates.set(node.id, viewState)\n\n return viewState\n}\n\nfunction createDependencyRuntimeViewState<TValues extends Values>(\n node: Extract<RuntimeNode<TValues>, { type: \"dependency\" }>,\n _descriptor: DependencyDescriptor<TValues>,\n resources: RuntimeNodeResourceContext<TValues>\n): RuntimeViewState<TValues> {\n const viewState = createDependencyViewState<TValues>(\n createChildrenViewState<TValues>(\n getChildrenState(node, resources).children,\n resources\n )\n )\n\n resources.viewStates.set(node.id, viewState)\n\n return viewState\n}\n\nfunction getChildrenState<TValues extends Values>(\n node: ContainerRuntimeNode<TValues>,\n resources: RuntimeNodeResourceContext<TValues>\n): RuntimeChildrenState<TValues> {\n const childrenState = resources.childrenStates.get(node.id)\n\n if (!childrenState) {\n throw new Error(`[schemx] childrenState is required for node \"${node.key}\"`)\n }\n\n return childrenState\n}\n","import {\n createDependenciesEffect,\n createDependencyEffect,\n createFieldRuntimeState,\n createValidationEffect,\n type FieldRuntimeState,\n setFieldStaticSchema,\n} from \"../field\"\nimport {\n createRuntimeViewState,\n deleteRuntimeViewState,\n updateRuntimeViewState,\n} from \"../view/createViewState\"\n\nimport { getChildRuntimeNodes } from \"./runtimeNode\"\n\nimport type { DependencyDescriptor, FieldDescriptor, FormDescriptor } from \"../descriptor\"\nimport type { SchemxContext } from \"../schemxContext\"\nimport type { NamePath, Values } from \"../types\"\nimport type { DescribedRuntimeNode, RuntimeNode } from \"./types\"\n\nexport interface RuntimeLifecycle<TValues extends Values = Values> {\n mount(node: DescribedRuntimeNode<TValues>, descriptor: FormDescriptor<TValues>): void\n update(\n node: DescribedRuntimeNode<TValues>,\n previousDescriptor: FormDescriptor<TValues> | undefined,\n nextDescriptor: FormDescriptor<TValues>\n ): void\n unmount(node: RuntimeNode<TValues>): void\n unmountSubtree(node: RuntimeNode<TValues>): void\n}\n\nexport function createRuntimeLifecycle<TValues extends Values = Values>(\n context: SchemxContext<TValues>\n): RuntimeLifecycle<TValues> {\n const resources = context.nodeResources\n const bus = context.lifecycleBus\n\n return {\n mount,\n update,\n unmount,\n unmountSubtree,\n }\n\n function mount(\n node: DescribedRuntimeNode<TValues>,\n descriptor: FormDescriptor<TValues>\n ): void {\n resources.descriptors.set(node.id, descriptor)\n bus.emitBeforeMount(node)\n\n mountRuntimeResources(node, descriptor)\n node.mounted.value = true\n\n bus.emitMount(node)\n }\n\n function update(\n node: DescribedRuntimeNode<TValues>,\n previousDescriptor: FormDescriptor<TValues> | undefined,\n nextDescriptor: FormDescriptor<TValues>\n ): void {\n if (node.type !== nextDescriptor.type) {\n throw new Error(\n `unexpected descriptor type: node ${node.type} cannot update with ${nextDescriptor.type}`\n )\n }\n\n const previousNode = { ...node }\n\n bus.emitBeforeUpdate(node, previousNode)\n resources.descriptors.set(node.id, nextDescriptor)\n updateRuntimeResources(node, previousDescriptor, nextDescriptor)\n bus.emitUpdate(node, previousNode)\n bus.emitUpdated(node, previousNode)\n }\n\n function unmountSubtree(node: RuntimeNode<TValues>): void {\n if (node.disposed.value) {\n return\n }\n\n for (const child of getChildRuntimeNodes(node)) {\n unmountSubtree(child)\n }\n\n unmount(node)\n }\n\n function unmount(node: RuntimeNode<TValues>): void {\n if (node.type === \"root\") {\n return\n }\n\n bus.emitBeforeUnmount(node)\n unmountRuntimeResources(node)\n bus.emitUnmount(node)\n }\n\n function mountRuntimeResources(\n node: DescribedRuntimeNode<TValues>,\n descriptor: FormDescriptor<TValues>\n ): void {\n if (node.type === \"field\" && descriptor.type === \"field\") {\n mountFieldResources(node, descriptor)\n\n return\n }\n\n if (node.type === \"group\" && descriptor.type === \"group\") {\n mountGroupResources(node, descriptor)\n\n return\n }\n\n if (node.type === \"dependency\" && descriptor.type === \"dependency\") {\n mountDependencyResources(node, descriptor)\n }\n }\n\n function updateRuntimeResources(\n node: DescribedRuntimeNode<TValues>,\n previousDescriptor: FormDescriptor<TValues> | undefined,\n nextDescriptor: FormDescriptor<TValues>\n ): void {\n if (node.type === \"field\" && nextDescriptor.type === \"field\") {\n updateFieldResources(\n node,\n nextDescriptor,\n previousDescriptor?.type === \"field\" ? previousDescriptor : undefined\n )\n\n return\n }\n\n if (node.type === \"group\" && nextDescriptor.type === \"group\") {\n mountGroupResources(node, nextDescriptor)\n\n return\n }\n\n if (node.type === \"dependency\" && nextDescriptor.type === \"dependency\") {\n updateDependencyResources(\n node,\n nextDescriptor,\n previousDescriptor?.type === \"dependency\" ? previousDescriptor : undefined\n )\n }\n }\n\n function mountFieldResources(\n node: Extract<RuntimeNode<TValues>, { type: \"field\" }>,\n descriptor: FieldDescriptor<TValues>\n ): void {\n const runtimeState = createFieldRuntimeState<TValues>({\n nodeId: node.id,\n key: node.key,\n descriptor,\n })\n\n applyFieldInitialValue(descriptor)\n resources.fieldStates.set(node.id, runtimeState)\n createRuntimeViewState(node, descriptor, resources)\n context.fieldRegistry.register({ name: descriptor.name, node })\n recreateFieldEffectScopes(node, descriptor, runtimeState)\n }\n\n function updateFieldResources(\n node: Extract<RuntimeNode<TValues>, { type: \"field\" }>,\n descriptor: FieldDescriptor<TValues>,\n previousDescriptor?: FieldDescriptor<TValues>\n ): void {\n const runtimeState = resources.fieldStates.get(node.id)\n\n if (!runtimeState) {\n mountFieldResources(node, descriptor)\n\n return\n }\n\n if (previousDescriptor && previousDescriptor.name !== descriptor.name) {\n context.fieldRegistry.unregister(previousDescriptor.name, node)\n }\n\n setFieldStaticSchema(runtimeState, descriptor)\n updateRuntimeViewState(node, descriptor, resources)\n context.fieldRegistry.register({ name: descriptor.name, node })\n recreateFieldEffectScopes(node, descriptor, runtimeState)\n }\n\n function recreateFieldEffectScopes(\n node: Extract<RuntimeNode<TValues>, { type: \"field\" }>,\n descriptor: FieldDescriptor<TValues>,\n runtimeState: FieldRuntimeState<TValues>\n ): void {\n resources.fieldResourceScopes.get(node.id)?.dispose()\n resources.fieldDynamicPropScopes.get(node.id)?.dispose()\n\n const validationScope = node.scope.child()\n const dynamicPropScope = node.scope.child()\n\n resources.fieldResourceScopes.set(node.id, validationScope)\n resources.fieldDynamicPropScopes.set(node.id, dynamicPropScope)\n\n validationScope.add(() => {\n if (resources.fieldResourceScopes.get(node.id) === validationScope) {\n resources.fieldResourceScopes.delete(node.id)\n }\n })\n dynamicPropScope.add(() => {\n if (resources.fieldDynamicPropScopes.get(node.id) === dynamicPropScope) {\n resources.fieldDynamicPropScopes.delete(node.id)\n }\n })\n\n createValidationEffect({\n context,\n name: descriptor.name,\n effectiveSchema: runtimeState.effectiveSchema,\n scope: validationScope,\n })\n createDependenciesEffect({\n context,\n descriptor,\n runtimeState,\n scope: dynamicPropScope,\n })\n }\n\n function mountGroupResources(\n node: Extract<RuntimeNode<TValues>, { type: \"group\" }>,\n descriptor: Extract<FormDescriptor<TValues>, { type: \"group\" }>\n ): void {\n createRuntimeViewState(node, descriptor, resources)\n }\n\n function mountDependencyResources(\n node: Extract<RuntimeNode<TValues>, { type: \"dependency\" }>,\n descriptor: DependencyDescriptor<TValues>\n ): void {\n createRuntimeViewState(node, descriptor, resources)\n createDependencyEffect({\n context,\n node,\n descriptor,\n scope: node.scope.child(),\n })\n }\n\n function updateDependencyResources(\n node: Extract<RuntimeNode<TValues>, { type: \"dependency\" }>,\n descriptor: DependencyDescriptor<TValues>,\n previousDescriptor?: DependencyDescriptor<TValues>\n ): void {\n createRuntimeViewState(node, descriptor, resources)\n\n if (\n previousDescriptor &&\n hasSameTriggerFields(previousDescriptor.triggerFields, descriptor.triggerFields) &&\n resources.dependencyEffects.has(node.id)\n ) {\n return\n }\n\n resources.dependencyResourceScopes.get(node.id)?.dispose()\n createDependencyEffect({\n context,\n node,\n descriptor,\n scope: node.scope.child(),\n })\n }\n\n function unmountRuntimeResources(node: RuntimeNode<TValues>): void {\n const descriptor = resources.descriptors.get(node.id)\n\n deleteRuntimeViewState(node, resources)\n\n if (node.type === \"field\" && descriptor?.type === \"field\") {\n context.fieldRegistry.unregister(descriptor.name, node)\n resources.fieldResourceScopes.get(node.id)?.dispose()\n resources.fieldDynamicPropScopes.get(node.id)?.dispose()\n } else if (node.type === \"dependency\") {\n resources.dependencyResourceScopes.get(node.id)?.dispose()\n }\n }\n\n function applyFieldInitialValue(descriptor: FieldDescriptor<TValues>): void {\n if (!Object.hasOwn(descriptor.staticSchema, \"initialValue\")) {\n return\n }\n\n if (context.instance.getFieldValue(descriptor.name) !== undefined) {\n return\n }\n\n context.instance.setFieldValue(\n descriptor.name,\n descriptor.staticSchema.initialValue as never\n )\n }\n}\n\nfunction hasSameTriggerFields<TValues extends Values>(\n previous: readonly NamePath<TValues>[],\n next: readonly NamePath<TValues>[]\n): boolean {\n if (previous.length !== next.length) {\n return false\n }\n\n return previous.every((field, index) => isSameNamePath(field, next[index]))\n}\n\nfunction isSameNamePath<TValues extends Values>(\n previous: NamePath<TValues>,\n next: NamePath<TValues> | undefined\n): boolean {\n if (next === undefined) {\n return false\n }\n\n if (Array.isArray(previous) || Array.isArray(next)) {\n return (\n Array.isArray(previous) &&\n Array.isArray(next) &&\n previous.length === next.length &&\n previous.every((part, index) => part === next[index])\n )\n }\n\n return previous === next\n}\n","import type { DescribedRuntimeNode } from \"../node\"\nimport type { ContainerRuntimeNode } from \"../node\"\nimport type { Values } from \"../types\"\nimport type {\n CommitReconcilePlanOptions,\n ReconcilePlan,\n} from \"./types\"\n\nexport function commitReconcilePlan<TValues extends Values = Values>(\n parent: ContainerRuntimeNode<TValues>,\n plan: ReconcilePlan<TValues>,\n options: CommitReconcilePlanOptions<TValues>\n): readonly DescribedRuntimeNode<TValues>[] {\n const createdByKey = new Map<string, DescribedRuntimeNode<TValues>>()\n\n for (const { descriptor } of plan.creates) {\n const node = options.nodeManager.createNode({\n type: descriptor.type,\n key: descriptor.key,\n scope: parent.scope.child(),\n })\n\n createdByKey.set(descriptor.key, node)\n }\n\n const nextChildren = plan.nextChildrenOrder.map((entry) => {\n if (entry.node) {\n return entry.node\n }\n\n const created = createdByKey.get(entry.descriptor.key)\n\n if (!created) {\n throw new Error(\n `[schemx] Missing created runtime node for descriptor \"${entry.descriptor.key}\".`\n )\n }\n\n return created\n })\n\n for (const { node, previousDescriptor, nextDescriptor } of plan.updates) {\n options.lifecycle.update(node, previousDescriptor, nextDescriptor)\n }\n\n for (const { descriptor } of plan.creates) {\n const node = createdByKey.get(descriptor.key)\n\n if (!node) {\n throw new Error(\n `[schemx] Missing mounted runtime node for descriptor \"${descriptor.key}\".`\n )\n }\n\n options.lifecycle.mount(node, descriptor)\n }\n\n options.nodeManager.replaceChildren(parent, nextChildren)\n\n for (const { node } of plan.removes) {\n options.lifecycle.unmountSubtree(node)\n options.nodeManager.removeSubtree(node)\n }\n\n return nextChildren\n}\n","import type { FormDescriptor } from \"../descriptor\"\nimport type { DescribedRuntimeNode } from \"../node\"\nimport type { Values } from \"../types\"\nimport type {\n ReconcileChildOrderEntry,\n ReconcileCreateOperation,\n ReconcileDescriptorMap,\n ReconcilePlan,\n ReconcileRemoveOperation,\n ReconcileUpdateOperation,\n} from \"./types\"\n\nexport function createReconcilePlan<TValues extends Values = Values>(\n currentChildren: readonly DescribedRuntimeNode<TValues>[],\n nextDescriptors: readonly FormDescriptor<TValues>[],\n currentDescriptors: ReconcileDescriptorMap<TValues>\n): ReconcilePlan<TValues> {\n const currentByKey = indexNodesByKey(currentChildren)\n const nextByKey = indexDescriptorsByKey(nextDescriptors)\n const creates: ReconcileCreateOperation<TValues>[] = []\n const updates: ReconcileUpdateOperation<TValues>[] = []\n const removes: ReconcileRemoveOperation<TValues>[] = []\n const nextChildrenOrder: ReconcileChildOrderEntry<TValues>[] = []\n\n for (const descriptor of nextDescriptors) {\n const existing = currentByKey.get(descriptor.key)\n\n if (!existing || !canReuse(existing, descriptor)) {\n creates.push({ descriptor })\n nextChildrenOrder.push({ descriptor })\n continue\n }\n\n const previousDescriptor = currentDescriptors.get(existing.id)\n\n if (previousDescriptor !== descriptor) {\n updates.push({\n node: existing,\n previousDescriptor,\n nextDescriptor: descriptor,\n })\n }\n\n nextChildrenOrder.push({ descriptor, node: existing })\n }\n\n for (const child of currentChildren) {\n const nextDescriptor = nextByKey.get(child.key)\n\n if (!nextDescriptor || !canReuse(child, nextDescriptor)) {\n removes.push({ node: child })\n }\n }\n\n return {\n creates,\n updates,\n removes,\n nextChildrenOrder,\n }\n}\n\nfunction canReuse<TValues extends Values>(\n node: DescribedRuntimeNode<TValues>,\n descriptor: FormDescriptor<TValues>\n): boolean {\n return node.type === descriptor.type\n}\n\nfunction indexNodesByKey<TValues extends Values>(\n nodes: readonly DescribedRuntimeNode<TValues>[]\n): Map<string, DescribedRuntimeNode<TValues>> {\n const result = new Map<string, DescribedRuntimeNode<TValues>>()\n\n for (const node of nodes) {\n result.set(node.key, node)\n }\n\n return result\n}\n\nfunction indexDescriptorsByKey<TValues extends Values>(\n descriptors: readonly FormDescriptor<TValues>[]\n): Map<string, FormDescriptor<TValues>> {\n const result = new Map<string, FormDescriptor<TValues>>()\n\n for (const descriptor of descriptors) {\n result.set(descriptor.key, descriptor)\n }\n\n return result\n}\n","import { createRuntimeLifecycle } from \"../node/runtimeLifecycle\"\nimport { getChildRuntimeNodes } from \"../node/runtimeNode\"\nimport { createRuntimeNodeManager } from \"../node/runtimeNodeManager\"\n\nimport { commitReconcilePlan } from \"./commit\"\nimport { createReconcilePlan } from \"./plan\"\n\nimport type { FormDescriptor } from \"../descriptor\"\nimport type {\n CreateReconcilerContext,\n ReconcileNodeManager,\n Reconciler,\n ReconcilerContext,\n} from \"./types\"\nimport type {\n ContainerRuntimeNode,\n DescribedRuntimeNode,\n RuntimeNode,\n} from \"../node/types\"\nimport type { Values } from \"../types\"\n\nexport function createReconciler<TValues extends Values = Values>(\n context: CreateReconcilerContext<TValues>\n): Reconciler<TValues> {\n const runtime = normalizeReconcilerContext(context)\n\n function reconcileChildren(\n parent: ContainerRuntimeNode<TValues>,\n nextDescriptors: readonly FormDescriptor<TValues>[]\n ): void {\n const currentChildren = getChildRuntimeNodes(parent)\n const plan = createReconcilePlan(\n currentChildren,\n nextDescriptors,\n runtime.getCurrentDescriptors()\n )\n const orderedNodes = commitReconcilePlan(parent, plan, runtime)\n\n for (const [index, node] of orderedNodes.entries()) {\n const descriptor = nextDescriptors[index]\n\n if (descriptor?.type === \"group\" && node.type === \"group\") {\n reconcileChildren(node, descriptor.children)\n }\n }\n }\n\n function createRoot() {\n const createRootNode = runtime.nodeManager.createRoot\n\n if (!createRootNode) {\n throw new Error(\"[schemx] Reconciler nodeManager cannot create root node.\")\n }\n\n return createRootNode()\n }\n\n function updateNode(\n node: DescribedRuntimeNode<TValues>,\n nextDescriptor: FormDescriptor<TValues>\n ): void {\n const previousDescriptor = runtime.getCurrentDescriptors().get(node.id)\n\n if (previousDescriptor === nextDescriptor) {\n return\n }\n\n runtime.lifecycle.update(node, previousDescriptor, nextDescriptor)\n }\n\n function removeNode(node: RuntimeNode<TValues>): void {\n runtime.lifecycle.unmountSubtree(node)\n runtime.nodeManager.removeSubtree(node)\n }\n\n return {\n createRoot,\n reconcileChildren,\n updateNode,\n removeNode,\n }\n}\n\ntype NormalizedReconcilerContext<TValues extends Values> =\n ReconcilerContext<TValues> & {\n readonly nodeManager: ReconcileNodeManager<TValues> & {\n createRoot?: () => ReturnType<Reconciler<TValues>[\"createRoot\"]>\n }\n }\n\nfunction normalizeReconcilerContext<TValues extends Values>(\n context: CreateReconcilerContext<TValues>\n): NormalizedReconcilerContext<TValues> {\n if (isReconcilerContext(context)) {\n return context as NormalizedReconcilerContext<TValues>\n }\n\n const nodeManager = createRuntimeNodeManager<TValues>(context)\n const lifecycle = createRuntimeLifecycle<TValues>(context)\n\n return {\n nodeManager,\n lifecycle,\n getCurrentDescriptors: () => context.nodeResources.descriptors,\n }\n}\n\nfunction isReconcilerContext<TValues extends Values>(\n context: CreateReconcilerContext<TValues>\n): context is ReconcilerContext<TValues> {\n return \"nodeManager\" in context && \"lifecycle\" in context\n}\n","/**\n * Scheduler - 通用任务调度器。\n *\n * Scheduler 不存在 validation/dependency/renderer 业务 channel,\n * 只管理 sync/pre/normal/post 优先级任务。\n *\n * @module core/scheduler/scheduler\n */\n\nimport type { Scope } from \"../node\"\n\n/**\n * 任务优先级。\n *\n * 执行顺序: sync → pre → normal → post\n */\ntype TaskPriority = \"sync\" | \"pre\" | \"normal\" | \"post\"\n\n/**\n * 调度任务。\n */\nexport interface ScheduledTask {\n /**\n * 任务唯一标识。\n */\n id: string\n\n /**\n * 任务优先级。\n */\n priority: TaskPriority\n\n /**\n * 关联的 Scope,scope dispose 时任务被取消。\n */\n scope?: Scope\n\n /**\n * 执行任务。\n *\n * @returns 同步任务返回 void,异步任务返回 Promise\n */\n run(): void | Promise<void>\n\n /**\n * 错误回调。\n *\n * @param error - 执行错误\n */\n onError?(error: unknown): void\n}\n\n/**\n * 任务调度器。\n */\nexport interface Scheduler {\n /**\n * 调度任务。\n *\n * @param task - 调度任务\n */\n schedule(task: ScheduledTask): void\n\n /**\n * 执行所有待执行任务。\n *\n * @returns Promise 在所有任务完成后 resolve\n */\n flush(): Promise<void>\n\n /**\n * 等待所有任务完成(包括异步任务)。\n *\n * @param timeout - 超时时间(毫秒),默认 10000\n * @returns Promise<true> 所有任务完成,Promise<false> 超时\n */\n whenIdle(timeout?: number): Promise<boolean>\n\n /**\n * 跟踪异步任务。\n *\n * @typeParam T - 返回值类型\n * @param promise - 异步任务\n * @returns 原始 promise\n */\n track<T>(promise: Promise<T>): Promise<T>\n\n /**\n * 释放调度器。\n */\n dispose(): void\n}\n\n/**\n * 优先级执行顺序。\n */\nconst PRIORITY_ORDER: TaskPriority[] = [\"sync\", \"pre\", \"normal\", \"post\"]\n\n/**\n * 创建一个 Scheduler 实例。\n *\n * @returns 新创建的 Scheduler\n *\n * @example\n * ```ts\n * const scheduler = createScheduler()\n *\n * // 调度任务\n * scheduler.schedule({\n * id: \"task-1\",\n * priority: \"normal\",\n * run: () => console.log(\"task 1\"),\n * })\n *\n * // 等待所有任务完成\n * await scheduler.whenIdle()\n *\n * // 跟踪异步任务\n * await scheduler.track(fetch(\"/api\"))\n *\n * // 释放调度器\n * scheduler.dispose()\n * ```\n */\nexport function createScheduler(): Scheduler {\n // 四个优先级队列\n const queues = new Map<TaskPriority, Map<string, ScheduledTask>>(\n PRIORITY_ORDER.map((priority) => [priority, new Map()])\n )\n\n // Idle 等待者\n const idleResolvers = new Set<(idle: boolean) => void>()\n\n // 飞行中异步任务计数\n let pendingAsync = 0\n\n // 是否已释放\n let disposed = false\n\n // 当前 flush Promise\n let currentFlush: Promise<void> | null = null\n\n /**\n * 执行所有待执行任务。\n */\n const flush = async (): Promise<void> => {\n if (disposed) {\n return\n }\n\n if (currentFlush) {\n return currentFlush\n }\n\n currentFlush = flushOnce().finally(() => {\n currentFlush = null\n notifyIdleIfNeeded()\n })\n\n return currentFlush\n }\n\n /**\n * 单次 flush 执行。\n */\n const flushOnce = async (): Promise<void> => {\n while (!disposed) {\n const batch = takeBatch()\n\n if (batch.length === 0) {\n return\n }\n\n for (const task of batch) {\n // 跳过已 disposed 的任务\n if (disposed || task.scope?.disposed) {\n continue\n }\n\n try {\n const result = task.run()\n\n // 跟踪异步任务\n if (isPromiseLike(result)) {\n await track(result)\n }\n } catch (error) {\n task.onError?.(error)\n }\n }\n }\n }\n\n /**\n * 调度任务。\n */\n const schedule = (task: ScheduledTask): void => {\n // 跳过已 disposed 的调度器或任务\n if (disposed || task.scope?.disposed) {\n return\n }\n\n queues.get(task.priority)?.set(task.id, task)\n queueMicrotask(() => void flush())\n }\n\n /**\n * 从所有队列取出一批任务。\n */\n const takeBatch = (): ScheduledTask[] => {\n const batch: ScheduledTask[] = []\n\n for (const priority of PRIORITY_ORDER) {\n const queue = queues.get(priority)\n\n if (!queue) {\n continue\n }\n\n batch.push(...queue.values())\n queue.clear()\n }\n\n return batch\n }\n\n /**\n * 跟踪异步任务。\n */\n const track = async <T>(promise: Promise<T>): Promise<T> => {\n pendingAsync += 1\n\n try {\n return await promise\n } finally {\n pendingAsync -= 1\n notifyIdleIfNeeded()\n }\n }\n\n /**\n * 等待所有任务完成。\n */\n const whenIdle = (timeout = 10000): Promise<boolean> => {\n if (isIdle()) {\n return Promise.resolve(true)\n }\n\n return new Promise((resolve) => {\n const timeoutId = globalThis.setTimeout(() => {\n idleResolvers.delete(resolve)\n resolve(false)\n }, timeout)\n\n idleResolvers.add((idle) => {\n globalThis.clearTimeout(timeoutId)\n resolve(idle)\n })\n })\n }\n\n /**\n * 检查是否空闲。\n */\n const isIdle = (): boolean => {\n return !currentFlush && pendingAsync === 0 && !hasQueuedTasks()\n }\n\n /**\n * 检查是否有待执行任务。\n */\n const hasQueuedTasks = (): boolean => {\n return Array.from(queues.values()).some((queue) => queue.size > 0)\n }\n\n /**\n * 如果空闲则通知所有等待者。\n */\n const notifyIdleIfNeeded = (): void => {\n if (!isIdle()) {\n return\n }\n\n const resolvers = Array.from(idleResolvers)\n idleResolvers.clear()\n resolvers.forEach((resolve) => resolve(true))\n }\n\n /**\n * 释放调度器。\n */\n const dispose = (): void => {\n disposed = true\n queues.forEach((queue) => queue.clear())\n notifyIdleIfNeeded()\n }\n\n return {\n schedule,\n flush,\n whenIdle,\n track,\n dispose,\n }\n}\n\n/**\n * 检查是否为 PromiseLike。\n */\nconst isPromiseLike = (value: unknown): value is PromiseLike<unknown> => {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"then\" in value &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n )\n}\n","/**\n * Store - 基于 FieldSignal 的表单数据存储中心\n *\n * 每个字段路径对应一个独立的 FieldSignal。字段值、初始值、\n * touched 和 pending 由同一个字段状态单元管理,支持自动依赖追踪和精确更新。\n *\n * @module core/store\n *\n * @example\n * ```typescript\n * const store = new Store({ initialValues: { name: 'John', age: 25 } })\n *\n * // 读写值\n * store.getFieldValue('name') // => 'John'\n * store.setFieldValue('name', 'Jane')\n *\n * // 批量操作\n * store.setFieldsValue({ name: 'Bob', age: 30 })\n * ```\n */\n\nimport { cloneDeep, isEqual } from \"es-toolkit\"\n\nimport { batchUpdates, createFieldSignal, createFieldSignalMap } from \"../reactivity\"\nimport { collectObjectPathsByLeaf, getByPath, setByPath } from \"../utils\"\n\nimport type { FieldSignal } from \"../reactivity\"\nimport type { FieldValue, NamePath, Values } from \"../types\"\n\n/**\n * Store 配置选项。\n *\n * @typeParam TValues - 表单值类型\n */\nexport interface StoreOptions<TValues extends Partial<Values>> {\n /** 初始值 */\n initialValues?: TValues\n}\n\n/**\n * Store 状态接口。\n *\n * @typeParam TValues - 表单值类型\n */\nexport interface StoreState<TValues extends Values> {\n /** 当前表单值 */\n values: TValues\n /** 初始值 */\n initialValues: TValues\n}\n\n/**\n * Pending 字段类型。\n *\n * 正在操作中的字段信息。\n */\nexport interface StorePending<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> {\n field: TName\n message: string[]\n}\n\n/**\n * 基于 FieldSignal 的表单数据存储中心。\n *\n * 每个字段路径对应一个独立的字段状态 signal。所有状态变更通过 reactive\n * effect 自动感知,无需手动订阅。\n *\n * @typeParam TValues - 表单值类型,默认为 Values\n * @example\n * ```typescript\n * const store = new Store({ initialValues: { name: 'John' } })\n * store.getFieldValue('name') // => 'John'\n * ```\n */\nclass StoreImpl<TValues extends Values = Values> {\n /** 每个字段路径对应一个 FieldSignal */\n private fieldSignals = createFieldSignalMap<NamePath<TValues>, unknown>()\n\n /** 初始值 */\n private initialValues: Partial<TValues>\n\n /**\n * 创建 Store 实例。\n *\n * 对 initialValues 进行深拷贝,确保内部状态与外部引用隔离。\n * 为每个初始字段路径创建对应的 reactive value。\n *\n * @param options - 配置选项\n */\n constructor(options: StoreOptions<TValues> = {}) {\n const initialValues = (options.initialValues ?? {}) as Partial<TValues>\n this.initialValues = cloneDeep(initialValues)\n\n // 为初始值的每个叶子路径创建 reactive value\n const paths = collectObjectPathsByLeaf<TValues, NamePath<TValues>>(initialValues)\n\n for (const path of paths) {\n const value = getByPath<TValues, typeof path>(initialValues, path)\n\n this.fieldSignals.set(\n path,\n createFieldSignal<typeof value>({\n value: value,\n initialValue: value,\n })\n )\n }\n }\n\n private getOrCreateFieldSignal<TName extends NamePath<TValues>>(\n path: TName\n ): FieldSignal<FieldValue<TValues, TName>> {\n const initialValue = getByPath<TValues, TName>(this.initialValues, path)\n\n let signal = this.fieldSignals.peek(path) as\n | FieldSignal<FieldValue<TValues, TName>>\n | undefined\n\n if (!signal) {\n signal = createFieldSignal<FieldValue<TValues, TName>>({\n value: initialValue,\n initialValue: initialValue,\n })\n this.fieldSignals.set(path, signal)\n }\n\n return signal\n }\n\n /**\n * 获取指定路径的字段值。\n *\n * 读取对应 reactive value,在 effect 中使用时自动收集依赖。\n *\n * @param path - 字段路径,支持嵌套路径如 'user.name'\n * @returns 字段当前值\n *\n * @example\n * ```typescript\n * store.getFieldValue('name') // => 'John'\n * store.getFieldValue('user.address') // => { city: 'Beijing', zip: '100000' }\n * ```\n */\n getFieldValue<TName extends NamePath<TValues>>(\n path: TName\n ): FieldValue<TValues, TName> | undefined {\n const signal = this.fieldSignals.get(path) as\n | FieldSignal<FieldValue<TValues, TName>>\n | undefined\n\n return signal?.value.value\n }\n\n /**\n * 设置指定路径的字段值。\n *\n * 直接写入对应 reactive value,自动触发依赖它的 effect。\n *\n * @param path - 字段路径\n * @param value - 要设置的值\n *\n * @example\n * ```typescript\n * store.setFieldValue('name', 'Jane')\n * store.setFieldValue('user.age', 30)\n * ```\n */\n setFieldValue<TName extends NamePath<TValues>>(\n path: TName,\n value: FieldValue<TValues, TName> | undefined\n ): void {\n const signal = this.getOrCreateFieldSignal(path)\n\n signal.setValue(value)\n signal.setTouched(!isEqual(value, signal.initialValue.peek()))\n }\n\n /**\n * 获取多个字段的值。\n *\n * 不传参返回全量值,传入路径数组返回指定字段的值。\n * 读取 reactive value 时会收集依赖。\n *\n * @param paths - 可选,要获取的字段路径数组\n * @returns 全量值或指定字段的值\n *\n * @example\n * ```typescript\n * store.getFieldsValue() // => { name: 'John', age: 25 }\n * store.getFieldsValue(['name', 'age']) // => { name: 'John', age: 25 }\n * ```\n */\n getFieldsValue(): TValues\n getFieldsValue<TName extends NamePath<TValues>>(paths: TName[]): Partial<TValues>\n getFieldsValue<TName extends NamePath<TValues>>(paths?: TName[]): Partial<TValues> {\n const result = {} as Partial<TValues>\n\n const pathsArr = paths ?? this.fieldSignals.keys()\n\n for (const path of pathsArr) {\n setByPath(result, path, this.getFieldValue(path))\n }\n\n return result\n }\n\n /**\n * 批量设置多个字段的值。\n *\n * 批量设置多个字段;每个字段写入都会更新对应 FieldSignal。\n *\n * @param values - 要设置的字段值对象\n *\n * @example\n * ```typescript\n * store.setFieldsValue({ name: 'Bob', age: 30 })\n * ```\n */\n setFieldsValue(values: Partial<TValues>): void {\n const paths = collectObjectPathsByLeaf<TValues, NamePath<TValues>>(values)\n\n batchUpdates(() => {\n for (const path of paths) {\n this.setFieldValue(path, getByPath<TValues, typeof path>(values, path))\n }\n })\n }\n\n /**\n * 获取单个字段值的快照。\n *\n * 使用 signal.peek() 避免收集依赖,返回深拷贝的值。\n *\n * @param path - 字段路径\n *\n * @returns 该字段当前值的深拷贝\n *\n * @example\n * ```typescript\n * const name = store.getFieldSnapshot('name') // => 'John'(深拷贝)\n * ```\n */\n getFieldSnapshot<TName extends NamePath<TValues>>(\n path: TName\n ): FieldValue<TValues, TName> | undefined {\n const signal = this.fieldSignals.peek(path) as\n | FieldSignal<FieldValue<TValues, TName>>\n | undefined\n\n return signal?.value.peek()\n }\n\n /**\n * 获取当前表单值的快照。\n *\n * 使用 signal.peek() 避免收集依赖,返回深拷贝的普通对象。\n * 传入 paths 时只返回指定字段的快照。\n *\n * @param paths - 可选的字段路径数组,不传则返回全部字段\n *\n * @returns 当前表单值的原始对象(深拷贝)\n *\n * @example\n * ```typescript\n * const snapshot = store.getFieldsSnapshot()\n * const partial = store.getFieldsSnapshot(['name', 'age'])\n * ```\n */\n getFieldsSnapshot(): TValues\n getFieldsSnapshot<TName extends NamePath<TValues>>(paths: TName[]): Partial<TValues>\n getFieldsSnapshot<TName extends NamePath<TValues>>(\n paths?: TName[]\n ): TValues | Partial<TValues> {\n const result = {} as Partial<TValues>\n\n const pathsArr = paths ?? this.fieldSignals.keys()\n\n for (const path of pathsArr) {\n setByPath(result, path, this.getFieldSnapshot(path))\n }\n\n return result\n }\n\n /**\n * 获取指定字段的初始值。\n *\n * @param path - 字段路径\n * @returns 字段初始值,不存在时返回 undefined\n *\n * @example\n * ```typescript\n * store.getInitialValue('name') // => 'John'\n * ```\n */\n getInitialValue<TName extends NamePath<TValues>>(\n path: TName\n ): FieldValue<TValues, TName> | undefined {\n const signal = this.fieldSignals.peek(path) as\n | FieldSignal<FieldValue<TValues, TName>>\n | undefined\n\n if (signal) {\n return signal.initialValue.peek()\n }\n\n return getByPath<TValues, TName>(this.initialValues, path)\n }\n\n /**\n * 获取表单初始值。\n *\n * 不传参返回全量初始值的深拷贝,传入路径数组返回指定字段的初始值。\n *\n * @param paths - 可选,字段路径数组\n * @returns 全量初始值或指定字段的初始值\n *\n * @example\n * ```typescript\n * store.getInitialValues() // => { name: 'John', age: 25 }\n * store.getInitialValues(['name']) // => { name: 'John' }\n * ```\n */\n getInitialValues(): Partial<TValues>\n getInitialValues<TName extends NamePath<TValues>>(paths: TName[]): Partial<TValues>\n getInitialValues<TName extends NamePath<TValues>>(paths?: TName[]): Partial<TValues> {\n if (paths === undefined) {\n return cloneDeep(this.initialValues)\n }\n\n const result = {} as Partial<TValues>\n\n for (const path of paths) {\n setByPath(result, path, getByPath<TValues, TName>(this.initialValues, path))\n }\n\n return result\n }\n\n /**\n * 设置指定字段的初始值。\n *\n * @param path - 字段路径\n * @param value - 要设置的初始值\n *\n * @example\n * ```typescript\n * store.setInitialValue('name', 'Bob')\n * ```\n */\n setInitialValue<TName extends NamePath<TValues>>(\n path: TName,\n value: FieldValue<TValues, TName>\n ): void {\n setByPath(this.initialValues, path, value)\n const signal = this.getOrCreateFieldSignal(path)\n\n signal.setInitialValue(value)\n signal.setTouched(!isEqual(signal.value.peek(), signal.initialValue.peek()))\n }\n\n /**\n * 批量设置多个字段的初始值。\n *\n * @param values - 要设置的字段值对象\n *\n * @example\n * ```typescript\n * store.setInitialValues({ name: 'Bob', age: 30 })\n * ```\n */\n setInitialValues(values: Partial<TValues>): void {\n const paths = collectObjectPathsByLeaf<TValues, NamePath<TValues>>(values)\n if (!paths.length) return\n\n batchUpdates(() => {\n for (const path of paths) {\n const next = getByPath<TValues, typeof path>(values, path)\n setByPath(this.initialValues, path, next)\n\n const signal = this.getOrCreateFieldSignal(path)\n signal.setInitialValue(next)\n signal.setTouched(!isEqual(signal.value.peek(), signal.initialValue.peek()))\n }\n })\n }\n\n /**\n * 检查指定字段是否被修改过。\n *\n * 通过深比较当前值与初始值判断。\n *\n * @param path - 字段路径\n * @returns 是否与初始值不同\n *\n * @example\n * ```typescript\n * store.setFieldValue('name', 'Jane')\n * store.isFieldTouched('name') // => true\n * ```\n */\n isFieldTouched<TName extends NamePath<TValues>>(path: TName): boolean {\n return this.fieldSignals.get(path)?.touched.value ?? false\n }\n\n /**\n * 检查多个字段是否被修改。\n *\n * 传入路径数组时检查所有指定字段是否都被修改,不传则检查是否有任一字段被修改。\n *\n * @param paths - 可选,要检查的字段路径数组\n * @returns 是否被修改\n *\n * @example\n * ```typescript\n * store.isFieldsTouched(['name', 'age']) // => true(全部被修改时)\n * store.isFieldsTouched() // => true(任一字段被修改时)\n * ```\n */\n isFieldsTouched(): boolean\n isFieldsTouched<TName extends NamePath<TValues>>(paths: TName[]): boolean\n isFieldsTouched<TName extends NamePath<TValues>>(paths?: TName[]): boolean {\n const pathsArr = paths ?? [...this.fieldSignals.keys()]\n\n return paths === undefined\n ? pathsArr.some((path) => this.isFieldTouched(path))\n : pathsArr.every((path) => this.isFieldTouched(path))\n }\n\n /**\n * 获取所有被修改的字段路径。\n *\n * 遍历所有 reactive values,与初始值比较,收集不同的路径。\n *\n * @returns 被修改的字段路径数组\n *\n * @example\n * ```typescript\n * store.getTouchedFields() // => ['name', 'user.age']\n * ```\n */\n getTouchedFields(): NamePath<TValues>[] {\n const touchedFields: NamePath<TValues>[] = []\n\n for (const [path, signal] of this.fieldSignals.entries()) {\n if (signal.touched.value) {\n touchedFields.push(path)\n }\n }\n\n return touchedFields\n }\n\n /**\n * 设置字段的修改状态。\n *\n * @param path - 字段路径\n * @param touched - 是否被修改\n *\n * @example\n * ```typescript\n * store.setFieldTouched('name', true)\n * ```\n */\n setFieldTouched<TName extends NamePath<TValues>>(path: TName, touched: boolean): void {\n this.getOrCreateFieldSignal(path).setTouched(touched)\n }\n\n /**\n * 批量设置字段的修改状态。\n *\n * @param paths - 要设置 touched 状态的字段路径数组\n * @param touched - 目标 touched 状态,默认 true\n *\n * @example\n * ```typescript\n * store.setFieldsTouched(['name', 'age'], true)\n * ```\n */\n setFieldsTouched<TName extends NamePath<TValues>>(\n paths: TName[],\n touched = true\n ): void {\n batchUpdates(() => {\n for (const path of paths) {\n this.setFieldTouched(path, touched)\n }\n })\n }\n\n /**\n * 检查单个字段是否处于操作中。\n *\n * 读取对应 reactive value,在 effect 中使用时自动收集依赖。\n *\n * @param path - 字段路径\n * @returns 是否处于操作中\n *\n * @example\n * ```typescript\n * store.isFieldPending('avatar') // => true\n * ```\n */\n isFieldPending<TName extends NamePath<TValues>>(path: TName): boolean {\n return this.fieldSignals.get(path)?.pending.value ?? false\n }\n\n /**\n * 检查多个字段是否处于操作中。\n *\n * 传入路径数组时检查所有指定字段是否都处于操作中,不传则检查是否有任一字段处于操作中。\n *\n * @param paths - 可选,要检查的字段路径数组\n * @returns 是否处于操作中\n *\n * @example\n * ```typescript\n * store.isFieldsPending(['name', 'age']) // => true(全部处于操作中时)\n * store.isFieldsPending() // => true(任一字段处于操作中时)\n * ```\n */\n isFieldsPending(): boolean\n isFieldsPending<TName extends NamePath<TValues>>(paths: TName[]): boolean\n isFieldsPending<TName extends NamePath<TValues>>(paths?: TName[]): boolean {\n const pathsArr = paths ?? [...this.fieldSignals.keys()]\n\n return pathsArr.every((path) => this.isFieldPending(path))\n }\n\n /**\n * 获取所有处于操作中的字段路径。\n *\n * 遍历字段 signal,收集 pending 为 true 的字段路径。\n * 无操作中字段时返回空数组。\n *\n * @returns 操作中的字段路径数组\n *\n * @example\n * ```typescript\n * store.getPendingFields() // => ['avatar', 'attachment']\n * ```\n */\n getPendingFields(): StorePending<TValues, NamePath<TValues>>[] {\n const fields: StorePending<TValues, NamePath<TValues>>[] = []\n\n for (const [field, signal] of this.fieldSignals.entries()) {\n if (signal.pending.value) {\n fields.push({ field, message: signal.pendingMessage.peek() })\n }\n }\n\n return fields\n }\n\n /**\n * 设置字段的操作中状态。\n *\n * 标记字段正在进行异步操作(如文件上传),\n * 校验和提交时会检查是否有字段处于操作中状态。\n * 取消操作中状态时删除对应 key,保持 map 干净。\n *\n * @param path - 字段路径\n * @param pending - 是否处于操作中\n * @param message - 可选的操作中提示信息。\n *\n * @example\n * ```typescript\n * store.setFieldPending('avatar', true) // 上传开始\n * store.setFieldPending('avatar', false) // 上传结束\n * ```\n */\n setFieldPending<TName extends NamePath<TValues>>(\n path: TName,\n pending: boolean,\n message?: string | string[]\n ): void {\n this.getOrCreateFieldSignal(path).setPending(pending, message)\n }\n\n /**\n * 批量设置字段的操作中状态。\n *\n * @param paths - 要设置 pending 状态的字段路径数组\n * @param pending - 目标 pending 状态,默认 true\n * @param message - 可选的操作中提示信息。\n *\n * @example\n * ```typescript\n * store.setFieldsPending(['name', 'age'], true)\n * ```\n */\n setFieldsPending<TName extends NamePath<TValues>>(\n paths: TName[],\n pending = true,\n message?: string | string[]\n ): void {\n batchUpdates(() => {\n for (const path of paths) {\n this.setFieldPending(path, pending, message)\n }\n })\n }\n\n /**\n * 重置单个字段到初始值。\n *\n * @param path - 要重置的字段路径。\n *\n * @example\n * ```typescript\n * store.resetField('name')\n * ```\n */\n resetField<TName extends NamePath<TValues>>(path: TName): void {\n this.getOrCreateFieldSignal(path).reset()\n }\n\n /**\n * 批量重置指定字段到初始值。\n *\n * @param paths - 要重置的字段路径数组。\n *\n * @example\n * ```typescript\n * store.resetFields(['name', 'age'])\n * ```\n */\n resetFields<TName extends NamePath<TValues>>(paths: TName[]): void {\n batchUpdates(() => {\n for (const path of paths) {\n this.getOrCreateFieldSignal(path).reset()\n }\n })\n }\n\n /**\n * 重置表单到初始状态(diff 式更新)。\n *\n * 不传参时恢复到构造时的初始值,传入 values 时同时更新初始值。\n * 对比新旧路径集合:复用已有字段 signal、删除多余字段 signal、\n * 创建新字段 signal。\n *\n * @param values - 可选的新初始值;传入后会同时更新 initialValues baseline。\n *\n * @example\n * ```typescript\n * store.reset() // 恢复到构造时的初始值\n * store.reset({ name: 'New', age: 0 }) // 重置并更新初始值\n * ```\n */\n reset(values?: Partial<TValues>): void {\n const resetValues = cloneDeep(values ?? this.initialValues)\n\n const nextPaths = collectObjectPathsByLeaf<TValues, NamePath<TValues>>(resetValues)\n const nextPathSet = new Set(nextPaths)\n\n batchUpdates(() => {\n for (const path of this.fieldSignals.keys()) {\n if (!nextPathSet.has(path)) {\n this.fieldSignals.delete(path)\n }\n }\n\n for (const path of nextPaths) {\n const next = getByPath<TValues, typeof path>(resetValues, path)\n\n setByPath(this.initialValues, path, next)\n\n const signal = this.fieldSignals.peek(path)\n\n if (signal) {\n signal.setInitialValue(next)\n signal.reset(next)\n } else {\n this.fieldSignals.set(\n path,\n createFieldSignal<typeof next>({\n value: next,\n initialValue: next,\n })\n )\n }\n }\n })\n }\n\n /**\n * 销毁 Store 实例。\n *\n * 清理所有字段 signal,释放资源。\n *\n * @example\n * ```typescript\n * store.destroy()\n * ```\n */\n destroy(): void {\n this.fieldSignals.clear()\n }\n}\n\n/**\n * Store 的实例类型。\n */\nexport type Store<TValues extends Values = Values> = InstanceType<\n typeof StoreImpl<TValues>\n>\n\n/**\n * 创建 Store 实例的工厂函数。\n *\n * @typeParam T - 表单值类型\n *\n * @param options - 配置选项\n * @returns Store 实例\n *\n * @example\n * ```typescript\n * const store = createStore({ initialValues: { name: 'John' } })\n * ```\n */\nexport function createStore<TValues extends Values = Values>(\n options: StoreOptions<TValues> = {}\n): Store<TValues> {\n return new StoreImpl<TValues>(options)\n}\n","/**\n * subscribeViewSchemas - ViewSchemas 订阅机制。\n *\n * 使用 createSignalEffect 追踪依赖变化,自动重新构建 ViewSchemas。\n * 读取 root view computed 作为唯一 ViewSchemas 来源。\n *\n * @module core/view/subscribeViewSchemas\n */\nimport { createDebouncedSignalEffect } from \"../reactivity\"\n\nimport type { RootRuntimeNode, RuntimeNodeResourceContext } from \"../node\"\nimport type { Values } from \"../types\"\nimport type { SchemxViewSchema } from \"./types\"\nimport type { RootViewState, RuntimeViewState } from \"./viewGraph\"\n\n/**\n * 订阅 ViewSchemas 变化。\n *\n * @param root - root runtime 节点。\n * @param onChange - ViewSchemas 变化回调。\n * @returns 取消订阅函数。\n */\nexport function subscribeViewSchemas<TValues extends Values = Values>(\n root: RootRuntimeNode<TValues>,\n resources: RuntimeNodeResourceContext<TValues>,\n onChange: (schemas: readonly SchemxViewSchema<TValues>[]) => void\n): () => void {\n let rootDisposed = false\n\n const rootScope = root.scope\n const disposeHandle = rootScope.add(() => {\n rootDisposed = true\n })\n\n const disposeEffect = createDebouncedSignalEffect(\n () => {\n if (rootDisposed) {\n return []\n }\n\n const rootViewState = resources.viewStates.get(root.id)\n\n return isRootViewState(rootViewState) ? rootViewState.viewSchemas.value : []\n },\n (viewSchemas) => {\n try {\n onChange(viewSchemas)\n } catch (error) {\n console.error(\"[subscribeViewSchemas] onChange error:\", error)\n }\n },\n 16,\n { immediate: true, edges: [\"leading\", \"trailing\"] }\n )\n\n const unsubscribe = (): void => {\n disposeEffect()\n disposeHandle.dispose()\n rootDisposed = false\n }\n\n return unsubscribe\n}\n\nfunction isRootViewState<TValues extends Values>(\n viewState: RuntimeViewState<TValues> | undefined\n): viewState is RootViewState<TValues> {\n return viewState != null && \"viewSchemas\" in viewState\n}\n","/**\n * 表单实例工厂 - 框架无关的核心实现。\n *\n * createForm 是表单内核的唯一公开装配入口。\n *\n * @module core/createForm\n *\n * @example\n * ```ts\n * import { createForm } from '@schemx/core'\n *\n * // 创建基础表单\n * const form = createForm({\n * initialValues: { username: '', email: '' }\n * })\n *\n * // 设置字段值\n * form.setFieldValue('username', 'John')\n *\n * // 获取字段值\n * const username = form.getFieldValue('username')\n *\n * // 校验并提交\n * const result = await form.validate()\n * if (result.ok) {\n * console.log('提交数据:', result.values)\n * }\n * ```\n *\n * @example\n * ```ts\n * // 带 schemas 和回调的完整表单\n * const form = createForm({\n * schemas: [\n * { name: 'username', label: '用户名', componentType: 'input' },\n * { name: 'email', label: '邮箱', componentType: 'input' }\n * ],\n * initialValues: { username: '', email: '' },\n * onValuesChange: (changed, latest) => {\n * console.log('字段变化:', changed)\n * },\n * onFinish: (values) => {\n * console.log('提交:', values)\n * },\n * onFinishFailed: (error) => {\n * console.log('校验失败:', error.errors)\n * }\n * })\n *\n * // 使用 effect 监听值变化\n * const dispose = form.effect(() => {\n * console.log('当前值:', form.getFieldsValue())\n * console.log('错误:', form.getFieldError('email'))\n * })\n *\n * // 提交表单\n * await form.submit()\n *\n * // 清理\n * dispose()\n * form.destroy()\n * ```\n */\n\nimport { pick } from \"es-toolkit\"\n\nimport { createCompile } from \"./compiler\"\nimport {\n createSchemas,\n isSchemxSchemas,\n type SchemxSchemas,\n type SchemxSchemasInput,\n} from \"./createSchemas\"\nimport { defaultConfigKey } from \"./defaultConfig\"\nimport { createFieldRegistry, type FieldRegistry } from \"./field\"\nimport {\n createLifecycleBus,\n type LifecycleBus,\n type SchemxLifecycleHooks,\n} from \"./lifecycle/lifecycle\"\nimport {\n type ContainerRuntimeNode,\n createScope,\n type RootRuntimeNode,\n type RuntimeNode,\n type RuntimeNodeResourceContext,\n type Scope,\n} from \"./node\"\nimport { createRuntimeResources } from \"./node/resources\"\nimport { batchUpdates, createSignalEffect } from \"./reactivity\"\nimport { createReconciler, type Reconciler } from \"./reconciler\"\nimport {\n createRendererRegistry,\n createValidatorsRegistry,\n type RendererRegistryType,\n type ValidatorsRegistryType,\n} from \"./registry\"\nimport { createScheduler, type Scheduler } from \"./scheduler\"\nimport { type SchemxContext } from \"./schemxContext\"\nimport { createStore, type Store } from \"./store\"\nimport { collectObjectPathsByLeaf, diff, withLock } from \"./utils\"\nimport {\n createRequiredRule,\n createSelectRequiredRule,\n createUploadRequiredRule,\n createValidator,\n type ValidateError,\n type ValidateResult,\n type Validator,\n} from \"./validator\"\nimport {\n readRootViewSchemas,\n type RootViewState,\n type SchemxViewSchema,\n subscribeViewSchemas,\n} from \"./view\"\nimport { createRootRuntimeViewState } from \"./view/createViewState\"\n\nimport type { Compile } from \"./compiler/types\"\nimport type { FormDescriptor } from \"./descriptor\"\nimport type {\n NamePath,\n SchemxBaseField,\n SchemxDefaultProps,\n SchemxField,\n SchemxFieldSchemaPatch,\n SchemxFormApi,\n SchemxInstance,\n SchemxRendererKey,\n SchemxRules,\n StandardSchemaV1,\n Values,\n} from \"./types\"\n\ntype Callbacks<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> = Pick<\n CreateFormOptions<TValues, TName>,\n \"onValuesChange\" | \"onFinish\" | \"onFinishFailed\" | \"onFieldsChange\"\n>\n\n/**\n * 创建表单实例的配置项。\n *\n * @typeParam TValues - 表单值类型\n * @typeParam TName - 字段路径类型\n *\n * @example\n * ```ts\n * const options: CreateFormOptions = {\n * // 静态 schema 数组\n * schemas: [\n * { name: 'username', label: '用户名', componentType: 'input' }\n * ],\n *\n * // 初始值\n * initialValues: { username: '' },\n *\n * // 受控值(可选)\n * modelValue: { username: 'test' },\n *\n * // 自定义渲染器注册中心\n * rendererRegistry: createRendererRegistry(),\n *\n * // 回调函数\n * onValuesChange: (changed, latest) => {},\n * onFinish: (values) => {},\n * onFinishFailed: (error) => {},\n * onFieldsChange: (changed, all) => {}\n * }\n *\n * const form = createForm(options)\n * ```\n *\n * @example\n * ```ts\n * // 使用 createSchemas 创建响应式 schemas\n * const schemas = createSchemas([\n * { name: 'username', label: '用户名', componentType: 'input' }\n * ])\n *\n * const form = createForm({ schemas })\n *\n * // 后续可动态更新 schemas\n * schemas.update(prev => [...prev, newSchema])\n * ```\n */\nexport interface CreateFormOptions<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> extends SchemxDefaultProps {\n /**\n * schema 列表或可响应式更新的 schema source。dependency schema 会在运行时透明展开。\n */\n schemas?: SchemxSchemasInput<TValues>\n /**\n * 表单初始值,作为 reset 的还原基准。\n */\n initialValues?: TValues\n /**\n * 外部受控表单值。\n */\n modelValue?: TValues\n /**\n * 当前 form 实例使用的渲染器注册表。\n */\n rendererRegistry?: RendererRegistryType\n /**\n * 字段未指定可用渲染器时使用的默认 renderer type。\n */\n defaultRendererType?: SchemxRendererKey\n /**\n * 当前 form 实例使用的规则注册表。\n */\n validatorRegistry?: ValidatorsRegistryType\n\n /**\n * submit 校验通过后的回调。\n */\n onFinish?: (values: Readonly<TValues>) => void | Promise<void>\n /**\n * submit 校验失败后的回调。\n */\n onFinishFailed?: (error: ValidateError<TValues>) => void\n /**\n * 字段值变化后的回调,接收本次变化片段和最新快照。\n */\n onValuesChange?: (\n changedValues: Readonly<Partial<TValues>>,\n latestSnapshot: Readonly<TValues> | TValues\n ) => void\n /**\n * 字段路径变化后的回调,接收本次变化路径和所有已知字段路径。\n */\n onFieldsChange?: (changedFields: TName[], allFields: TName[]) => void\n /**\n * node lifecycle hook,用于观察字段节点挂载、更新和卸载。\n */\n lifecycleHooks?: SchemxLifecycleHooks<TValues>\n}\n\nclass CreateForm<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> {\n /** 表单内部上下文,集中持有全局配置和运行时服务 */\n private context: SchemxContext<TValues>\n\n /** 用户传入的表单级回调集合 */\n readonly callbacks: Callbacks<TValues>\n\n /** 表单状态存储,管理字段值、初始值和订阅 */\n private store: Store<TValues>\n\n /** 渲染器注册表,解析 schema.componentType 到具体渲染实现 */\n readonly rendererRegistry: RendererRegistryType\n\n /** 校验规则注册表,解析字符串规则名称到 StandardSchema 或规则工厂 */\n readonly validatorRegistry: ValidatorsRegistryType<TValues>\n\n /** 字段校验器,维护规则、错误状态和校验执行流程 */\n readonly validator: Validator<TValues>\n\n /** Runtime node 的透明根节点,承载所有编译后的表单描述符节点 */\n readonly root: RootRuntimeNode<TValues>\n\n /** 运行时异步调度器,用于追踪 dependency renderer 和字段动态依赖 */\n readonly scheduler: Scheduler\n\n /** descriptor 到 RuntimeNode tree 的协调器,负责创建、复用和销毁节点 */\n readonly reconciler: Reconciler<TValues>\n\n /** 字段 RuntimeNode 到字段模型的注册表,供表单 API 和视图投影读取 */\n readonly fieldRegistry: FieldRegistry<TValues>\n\n /** RuntimeNode 之外的 descriptor、state、view 和 effect 资源表 */\n readonly nodeResources: RuntimeNodeResourceContext<TValues>\n\n /** 表单级资源作用域,统一管理回调 effect 等非 RuntimeNode 资源 */\n private readonly scope: Scope = createScope()\n\n /** root schema 的统一数据源 */\n private schemas: SchemxSchemas<TValues>\n\n /** schema 编译,让未变化的 schema 复用 descriptor 引用 */\n private compile: Compile<TValues>\n\n /** 标记表单实例是否已销毁,保证 dispose 幂等 */\n private disposed = false\n\n /** node 生命周期事件总线,连接 reconciler 与字段资源挂载流程 */\n private lifecycleBus: LifecycleBus<RuntimeNode<TValues>>\n\n constructor(options: CreateFormOptions<TValues> = {}) {\n const {\n schemas: schemasInput,\n initialValues = {} as TValues,\n modelValue,\n rendererRegistry,\n defaultRendererType,\n validatorRegistry,\n ...restOptions\n } = options\n\n // 统一保存用户回调,后续 effect 和 submit 流程从同一入口读取。\n this.callbacks = {\n onValuesChange: options.onValuesChange,\n onFinish: options.onFinish,\n onFinishFailed: options.onFinishFailed,\n onFieldsChange: options.onFieldsChange,\n }\n\n // 注册表允许外部注入;未注入时创建表单实例私有注册表,避免跨实例污染。\n this.rendererRegistry =\n rendererRegistry ?? createRendererRegistry(defaultRendererType)\n\n this.validatorRegistry = (validatorRegistry ??\n createValidatorsRegistry<TValues>()) as ValidatorsRegistryType<TValues>\n\n this.validator = createValidator<TValues, TName>()\n\n // modelValue 优先覆盖 initialValues,用于受控场景的初始快照对齐。\n this.store = createStore<TValues>({\n initialValues: { ...initialValues, ...(modelValue ?? {}) },\n })\n\n // 内置必填类规则默认注册到当前表单,用户仍可通过规则注册表覆盖。\n this.validatorRegistry.registerAll({\n required: createRequiredRule,\n selectRequired: createSelectRequiredRule,\n uploadRequired: createUploadRequiredRule,\n })\n\n // 生命周期总线连接 node 结构变化与字段模型、依赖资源的挂载和更新流程。\n this.lifecycleBus = createLifecycleBus<RuntimeNode<TValues>>()\n\n // 初始化运行时 node 所需的核心基础设施。\n this.scheduler = createScheduler()\n\n this.fieldRegistry = createFieldRegistry<TValues>()\n\n this.nodeResources = createRuntimeResources<TValues>()\n\n // defaultProps 必须在 compiler options 与 context 间共享同一引用:\n // applySchemas 走 compiler fallback 时读取的是 compileOptions.defaultProps,\n // updateDefaultProps 直接 mutate context.defaultProps,若两者是不同对象,\n // 变更将无法被编译器感知,reconcile 后字段值不变、effect 也不会重算。\n const defaultProps = pick(restOptions, defaultConfigKey)\n\n this.compile = createCompile({\n defaultProps,\n formInstance: this.getFormInstance(),\n })\n\n // dependency renderer 运行时需要回写 node,因此上下文在首次编译前准备好。\n this.context = {\n defaultProps,\n instance: this.getFormInstance(),\n formApi: this.getFormApi(),\n compile: this.compile,\n scheduler: this.scheduler,\n lifecycleBus: this.lifecycleBus,\n fieldRegistry: this.fieldRegistry,\n nodeResources: this.nodeResources,\n commitChildren: this.commitChildren,\n }\n\n this.reconciler = createReconciler<TValues>(this.context)\n\n this.root = this.reconciler.createRoot()\n\n const rootChildrenState = this.nodeResources.childrenStates.get(this.root.id)\n\n if (!rootChildrenState) {\n throw new Error(\"[schemx] root childrenState is required\")\n }\n\n createRootRuntimeViewState(this.root, this.nodeResources)\n\n if (options.lifecycleHooks) {\n this.lifecycleBus.on(options.lifecycleHooks)\n }\n\n // 无论调用方传入静态数组还是 createSchemas 返回的 source,\n // 内部都统一成 schema source,避免初始化与后续 set/update 走两套状态。\n this.schemas = isSchemxSchemas(schemasInput)\n ? schemasInput\n : createSchemas<TValues>(schemasInput ?? [])\n\n // 将外部 schema 编译成内部 descriptor tree,再交给 reconciler 建立 runtime node。\n this.applySchemas(this.schemas.peek())\n\n const schemasDisposer = this.schemas.subscribe((nextSchemas) => {\n this.applySchemas(nextSchemas)\n })\n\n this.scope.add(schemasDisposer)\n\n // 注册值变化回调(通过 store.effect 自动追踪依赖)\n if (this.callbacks?.onValuesChange || this.callbacks?.onFieldsChange) {\n let prevSnapshot = this.store.getFieldsSnapshot()\n\n const valuesChangeDisposer = createSignalEffect(() => {\n const latestValues = this.store.getFieldsValue()\n const latestSnapshot = this.store.getFieldsSnapshot()\n\n const changedValues = diff(latestSnapshot, prevSnapshot)\n\n const changedPaths = collectObjectPathsByLeaf<TValues, TName>(changedValues)\n\n if (changedPaths.length > 0) {\n this.callbacks.onValuesChange?.(changedValues, latestSnapshot)\n\n this.callbacks.onFieldsChange?.(\n changedPaths,\n collectObjectPathsByLeaf(latestValues)\n )\n }\n\n prevSnapshot = latestSnapshot\n })\n\n this.scope.add(valuesChangeDisposer)\n }\n }\n\n /**\n * 表单实例接口\n *\n * 定义表单的所有操作方法,是 useForm 返回值的基础接口。\n * SchemxInstance 类实现此接口,提供完整的表单操作能力。\n */\n getFormInstance = (): SchemxInstance<TValues> => {\n return {\n setFieldValue: this.store.setFieldValue.bind(this.store),\n setFieldsValue: this.store.setFieldsValue.bind(this.store),\n getFieldValue: this.store.getFieldValue.bind(this.store),\n getFieldsValue: this.store.getFieldsValue.bind(this.store),\n getFieldSnapshot: this.store.getFieldSnapshot.bind(this.store),\n getFieldsSnapshot: this.store.getFieldsSnapshot.bind(this.store),\n getInitialValue: this.store.getInitialValue.bind(this.store),\n getInitialValues: this.store.getInitialValues.bind(this.store),\n setInitialValues: this.store.setInitialValues.bind(this.store),\n isFieldTouched: this.store.isFieldTouched.bind(this.store),\n setFieldTouched: this.store.setFieldTouched.bind(this.store),\n getTouchedFields: this.store.getTouchedFields.bind(this.store),\n setFieldPending: this.store.setFieldPending.bind(this.store),\n isFieldPending: this.store.isFieldPending.bind(this.store),\n getPendingFields: this.store.getPendingFields.bind(this.store),\n validateField: this.validateField.bind(this),\n validate: this.validate.bind(this),\n getFieldError: this.validator.getFieldError.bind(this.validator),\n setFieldError: this.validator.setFieldError.bind(this.validator),\n resetFields: this.store.resetFields.bind(this.store),\n reset: this.reset.bind(this),\n submit: this.submit.bind(this),\n\n registerRules: this.register.bind(this),\n unregisterRules: this.validator.unregister.bind(this.validator),\n\n effect: this.effect.bind(this),\n batch: this.batch.bind(this),\n\n setSchemas: this.setSchemas.bind(this),\n updateSchemas: this.updateSchemas.bind(this),\n updateFieldSchema: this.updateFieldSchema.bind(this),\n updateDefaultProps: this.updateDefaultProps.bind(this),\n getViewSchemas: this.getViewSchemas.bind(this),\n subscribeViewSchemas: this.subscribeViewSchemas.bind(this),\n waitForDependencies: this.waitForIdle.bind(this),\n\n getRenderer: this.rendererRegistry.getRenderer.bind(this.rendererRegistry),\n registerRenderer: this.rendererRegistry.register.bind(this.rendererRegistry),\n hasRenderer: this.rendererRegistry.hasRenderer.bind(this.rendererRegistry),\n\n getValidator: this.validatorRegistry.get.bind(this.validatorRegistry),\n registerValidator: this.validatorRegistry.register.bind(this.validatorRegistry),\n hasValidator: this.validatorRegistry.has.bind(this.validatorRegistry),\n\n destroy: this.destroy.bind(this),\n }\n }\n\n /**\n * 表单 API,提供与表单交互的方法。\n *\n * 传递给动态渲染器,允许程序化操作表单。\n */\n private getFormApi = (): SchemxFormApi<TValues> => {\n return {\n setValue: this.store.setFieldValue.bind(this.store),\n setValues: this.store.setFieldsValue.bind(this.store),\n getValue: this.store.getFieldValue.bind(this.store),\n getValues: this.store.getFieldsValue.bind(this.store),\n getSnapshots: this.store.getFieldsSnapshot.bind(this.store),\n setPending: this.store.setFieldPending.bind(this.store),\n isPending: this.store.isFieldPending.bind(this.store),\n setTouched: this.store.setFieldTouched.bind(this.store),\n isTouched: this.store.isFieldTouched.bind(this.store),\n getError: this.validator.getFieldError.bind(this.validator),\n setError: this.validator.setFieldError.bind(this.validator),\n resetFields: this.store.resetFields.bind(this.store),\n reset: this.reset.bind(this),\n validateField: this.validateField.bind(this),\n validate: this.validate.bind(this),\n }\n }\n\n /**\n * 注册字段校验规则\n */\n private register(\n path: NamePath<TValues>,\n rules: SchemxRules | SchemxRules[],\n defaultMessage?: string\n ): void {\n const resolvedRules: StandardSchemaV1[] = []\n\n const node = this.fieldRegistry.get(path)?.node\n const descriptor = node ? this.nodeResources.descriptors.get(node.id) : undefined\n const schema = descriptor?.type === \"field\" ? descriptor.staticSchema : undefined\n\n this.validator.unregister(path)\n\n const schemaWithRules = {\n ...schema,\n rules,\n } as SchemxBaseField<TValues>\n\n resolvedRules.push(\n ...this.validatorRegistry.resolveValidatorsBySchema(schemaWithRules)\n )\n\n if (resolvedRules.length > 0) {\n this.validator.register(path, resolvedRules, defaultMessage)\n }\n }\n\n /**\n * 校验指定字段\n */\n private async validateField(name: NamePath<TValues>): Promise<ValidateResult<TValues>> {\n const result = await this.validator.validateField(name, this.store.getFieldsValue())\n\n return result\n }\n\n /**\n * 校验所有已注册字段\n *\n * 校验前检查是否有字段处于操作中状态,有则直接返回失败结果。\n */\n private validate = withLock(async (): Promise<ValidateResult<TValues>> => {\n const pendingFields = this.store.getPendingFields()\n\n if (pendingFields.length > 0) {\n const defaultMessage = `存在正在操作中的字段: ${pendingFields.map((i) => i.field).join(\", \")},请等待完成后再提交`\n\n console.warn(`[schemx] ${defaultMessage}`)\n\n return {\n ok: false,\n error: {\n errors: pendingFields.map(({ field, message }) => {\n const _message = message.length ? message : [\"字段正在处理中,请稍后重试\"]\n\n this.validator.setFieldError(field as NamePath<TValues>, _message)\n\n return {\n field: field as string,\n message: _message,\n }\n }),\n values: this.store.getFieldsSnapshot(),\n },\n }\n }\n\n const result = await this.validator.validate(this.store.getFieldsValue())\n\n return result\n })\n\n /**\n * 重置整个表单到初始值\n */\n private reset(): void {\n this.store.reset()\n this.validator.reset()\n }\n\n /**\n * 提交表单\n */\n private submit = withLock(async (): Promise<void> => {\n // 等待依赖解析完成\n const depsReady = await this.waitForIdle()\n if (!depsReady) {\n // 超时则拒绝提交\n return\n }\n\n const result = await this.validate()\n if (result.ok) {\n await this.callbacks.onFinish?.(result.values)\n } else {\n this.callbacks.onFinishFailed?.(result.error)\n }\n })\n\n /**\n * 创建 reactive effect。\n *\n * 回调内调用 getFieldValue / getFieldError 时自动追踪依赖,\n * 跨越 store 和 validator 的 reactive maps。\n * dispose 函数由 createForm 层面统一管理,destroy 时清理。\n */\n private effect(fn: () => void): () => void {\n const dispose = createSignalEffect(fn)\n const handle = this.scope.add(dispose)\n\n return () => {\n handle.dispose()\n }\n }\n\n /**\n * 批量更新,合并多次 reactive 写入。\n *\n * 将多次 reactive 写入合并为一次 effect 触发,\n * 跨越 store 和 validator 的 reactive maps。\n */\n private batch(fn: () => void): void {\n batchUpdates(fn)\n }\n\n /**\n * 替换 root schemas。\n */\n private setSchemas(schemas: readonly SchemxField<TValues>[]): void {\n if (this.disposed) {\n return\n }\n\n this.schemas.set(schemas)\n }\n\n /**\n * 基于当前 root schemas 派生下一版 schemas。\n */\n private updateSchemas(\n updater: (schemas: readonly SchemxField<TValues>[]) => readonly SchemxField<TValues>[]\n ): void {\n if (this.disposed) {\n return\n }\n\n this.schemas.update(updater)\n }\n\n /**\n * 更新单个字段的静态 schema 呈现配置。\n */\n private updateFieldSchema(\n name: NamePath<TValues>,\n patch: SchemxFieldSchemaPatch<TValues>\n ): void {\n if (this.disposed) {\n return\n }\n\n const entry = this.fieldRegistry.get(name)\n\n if (!entry) {\n return\n }\n\n const node = entry.node\n const current = this.nodeResources.descriptors.get(node.id)\n\n if (current?.type !== \"field\") {\n return\n }\n\n const nextRawSchema = {\n ...current.staticSchema,\n ...patch,\n componentProps: patch.componentProps\n ? {\n ...current.staticSchema.componentProps,\n ...patch.componentProps,\n }\n : current.staticSchema.componentProps,\n key: current.key,\n name: current.name,\n componentType: current.staticSchema.componentType,\n dependencies: current.dynamicProps?.dependencies,\n } as SchemxBaseField<TValues>\n\n const [next] = this.compile.toDescriptors([nextRawSchema])\n\n if (next.type !== \"field\") {\n return\n }\n\n this.reconciler.updateNode(node, next)\n }\n\n /**\n * 更新表单默认配置。\n *\n * 合并传入属性到当前 defaultProps,然后重新编译根 schemas 并 reconcile。\n * 字段级属性未设置时会回退到这些默认值。\n */\n private updateDefaultProps(partial: Partial<SchemxDefaultProps>): void {\n if (this.disposed) {\n return\n }\n\n Object.assign(this.context.defaultProps, pick(partial, defaultConfigKey))\n\n // defaultProps 影响所有字段的 normalizedSchema,bump version 让缓存条目失效。\n this.compile.invalidate()\n\n this.applySchemas(this.schemas.peek())\n }\n\n /**\n * 将 schema source 的当前值提交到 runtime node。\n */\n private applySchemas(schemas: readonly SchemxField<TValues>[]): void {\n if (this.disposed) {\n return\n }\n\n const descriptors = this.compile.toDescriptors(schemas)\n\n this.commitChildren(this.root as ContainerRuntimeNode<TValues>, descriptors)\n }\n\n /**\n * 唯一子节点提交边界。\n *\n * 所有结构输入先编译成 descriptor,再经由这里提交到某个 parent RuntimeNode。\n * Reconciler 只负责 node 结构;视图层通过 childrenState signal 自动感知结构变化。\n */\n private commitChildren = (\n parentNode: ContainerRuntimeNode<TValues>,\n descriptors: FormDescriptor<TValues>[]\n ): void => {\n this.reconciler.reconcileChildren(parentNode, descriptors)\n }\n\n /**\n * 销毁表单实例\n *\n * 清除所有订阅回调和 effect,释放资源。通常在组件卸载时调用。\n */\n private destroy(): void {\n if (this.disposed) {\n return\n }\n\n this.disposed = true\n\n this.scope.dispose()\n this.reconciler.removeNode(this.root)\n this.scheduler.dispose()\n this.store.destroy()\n }\n\n /**\n * 获取当前 ViewSchemas。\n */\n private getViewSchemas(): readonly SchemxViewSchema<TValues>[] {\n const rootViewState = this.nodeResources.viewStates.get(this.root.id)\n\n if (!rootViewState || !(\"viewSchemas\" in rootViewState)) {\n return []\n }\n\n return readRootViewSchemas<TValues>(rootViewState as RootViewState<TValues>)\n }\n\n /**\n * 订阅 ViewSchemas 变化。\n */\n private subscribeViewSchemas(\n callback: (schemas: readonly SchemxViewSchema<TValues>[]) => void\n ): () => void {\n return subscribeViewSchemas<TValues>(this.root, this.nodeResources, callback)\n }\n\n /**\n * 等待内部异步任务完成。\n */\n private waitForIdle(timeout: number = 10000): Promise<boolean> {\n return this.scheduler.whenIdle(timeout)\n }\n}\n\n/**\n * 创建 Schemx 表单实例。\n *\n * @param options - 表单配置项\n * @returns 表单实例\n *\n * @example\n * ```ts\n * // 基础用法\n * const form = createForm({\n * initialValues: { name: '', age: 0 }\n * })\n *\n * // 完整配置\n * const form = createForm({\n * schemas: [\n * { name: 'name', label: '姓名', componentType: 'input' },\n * { name: 'age', label: '年龄', componentType: 'number' }\n * ],\n * initialValues: { name: '', age: 0 },\n * onValuesChange: (changed, latest) => {\n * console.log('变化:', changed)\n * },\n * onFinish: (values) => submit(values),\n * onFinishFailed: (error) => showErrors(error)\n * })\n * ```\n */\nexport function createForm<TValues extends Values>(\n options: CreateFormOptions<TValues> = {}\n): SchemxInstance<TValues> {\n return new CreateForm<TValues>(options).getFormInstance()\n}\n\nexport default createForm\n","/**\n * createField - 框架无关的单字段控制器\n *\n * 将 SchemxInstance 的方法作用域限定到指定字段,\n * 提供单字段的读写、校验、状态订阅等能力。\n * 框架适配层(Vue / React)可通过 `effect` 桥接各自的响应式系统。\n *\n * @module core/createField\n *\n * @example\n * ```ts\n * import { createField, createForm } from '@schemx/core'\n *\n * const form = createForm({ initialValues: { name: '', avatar: '' } })\n * const field = createField(form, 'name')\n *\n * field.setValue('John')\n * field.getValue() // => 'John'\n *\n * const dispose = field.effect(() => {\n * console.log('value:', field.getValue())\n * console.log('errors:', field.getError())\n * })\n *\n * dispose() // 取消订阅\n * ```\n */\n\nimport { setByPath } from \"./utils\"\n\nimport type { FieldValue, NamePath, SchemxInstance, SchemxRules, Values } from \"./types\"\nimport type { ValidateResult } from \"./validator\"\n\n/**\n * 单字段控制器接口\n *\n * 封装 SchemxInstance 中与单个字段相关的所有操作,\n * 以及基于 reactive effect 的状态订阅能力。\n *\n * @typeParam TValues - 表单值类型\n * @typeParam TName - 当前字段路径类型\n */\nexport interface SchemxFieldInstance<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> {\n /**\n * 获取当前字段值。\n *\n * @returns 当前字段值;字段不存在时返回 undefined。\n */\n getValue: () => FieldValue<TValues, TName> | undefined\n\n /**\n * 设置当前字段值。\n *\n * @param value - 新字段值。\n */\n setValue: (value: FieldValue<TValues, TName> | undefined) => void\n\n /**\n * 获取字段初始值。\n *\n * @returns 当前字段的初始值;未设置时返回 undefined。\n */\n getInitialValue: () => FieldValue<TValues, TName> | undefined\n\n /**\n * 设置字段初始值。\n *\n * @param value - 新初始值。\n */\n setInitialValue: (value: FieldValue<TValues, TName>) => void\n\n /**\n * 获取表单全量响应式值。\n *\n * @returns 当前表单值。\n */\n getValues: () => Readonly<TValues>\n\n /**\n * 获取表单全量快照。\n *\n * @returns 当前表单值快照。\n */\n getSnapshot: () => TValues\n\n /**\n * 校验当前字段。\n *\n * @returns 当前字段校验结果。\n */\n validate: () => Promise<ValidateResult<TValues>>\n\n /**\n * 获取当前字段错误信息。\n *\n * @returns 错误信息数组;没有错误时返回 undefined。\n */\n getError: () => string[] | undefined\n\n /**\n * 设置当前字段错误信息。\n *\n * @param errors - 错误信息数组。\n */\n setError: (errors: string[]) => void\n\n /**\n * 清除当前字段错误信息。\n */\n clearError: () => void\n\n /**\n * 注册当前字段校验规则。\n *\n * @param rules - 校验规则或规则数组。\n * @param defaultMessage - 可选的默认错误信息。\n */\n registerRules: (rules: SchemxRules | SchemxRules[], defaultMessage?: string) => void\n\n /**\n * 注销当前字段校验规则。\n */\n unregisterRules: () => void\n\n /**\n * 检查当前字段是否已被触摸。\n *\n * @returns 是否已被触摸。\n */\n isTouched: () => boolean\n\n /**\n * 重置当前字段到初始值。\n */\n reset: () => void\n\n /**\n * 设置当前字段操作中状态。\n *\n * @param pending - 是否处于操作中。\n * @param message - 可选的操作中提示信息。\n */\n setPending: (pending: boolean, message?: string | string[]) => void\n\n /**\n * 检查当前字段是否处于操作中。\n *\n * @returns 是否处于操作中。\n */\n isPending: () => boolean\n\n /**\n * 创建 reactive effect\n *\n * 直接透传 form.effect,在回调中访问 getValue / getError / isPending 时\n * 自动追踪对应 reactive 依赖,依赖变化时 effect 自动重新执行。\n *\n * @param fn - effect 回调函数\n * @returns dispose 函数,取消 effect\n *\n * @example\n * ```ts\n * const dispose = field.effect(() => {\n * console.log('value:', field.getValue())\n * })\n * dispose()\n * ```\n */\n effect: (fn: () => void) => () => void\n}\n\n/**\n * 创建单字段控制器\n *\n * 将 SchemxInstance 的方法作用域限定到指定字段,\n * 返回包含读写、校验、状态订阅等能力的控制器对象。\n *\n * @typeParam TValues - 表单值类型\n *\n * @param form - 表单实例\n * @param name - 字段路径\n * @returns 单字段控制器\n *\n * @example\n * ```ts\n * const field = createField(form, 'username')\n *\n * field.setValue('John')\n * field.getValue() // => 'John'\n *\n * const dispose = field.effect(() => {\n * console.log(field.getValue())\n * })\n * ```\n */\nexport function createField<\n TValues extends Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(form: SchemxInstance<TValues>, name: TName): SchemxFieldInstance<TValues, TName> {\n /**\n * 从表单实例读取当前字段值。\n */\n const getValue = (): FieldValue<TValues, TName> | undefined => form.getFieldValue(name)\n\n /**\n * 将当前字段值写回表单实例。\n */\n const setValue = (value: FieldValue<TValues, TName> | undefined): void => {\n form.setFieldValue(name, value)\n }\n\n /**\n * 读取当前字段的初始值 baseline。\n */\n const getInitialValue = (): FieldValue<TValues, TName> | undefined => {\n return form.getInitialValue(name)\n }\n\n /**\n * 以字段路径构造局部 initialValues 并交给表单合并。\n */\n const setInitialValue = (value: FieldValue<TValues, TName>): void => {\n const result = {} as Partial<TValues>\n setByPath<TValues, TName, FieldValue<TValues, TName>>(result, name, value)\n form.setInitialValues(result)\n }\n\n /**\n * 读取表单当前响应式值。\n */\n const getValues = (): Readonly<TValues> => form.getFieldsValue()\n\n /**\n * 读取表单当前无追踪快照。\n */\n const getSnapshot = (): TValues => form.getFieldsSnapshot()\n\n /**\n * 触发当前字段校验。\n */\n const validate = (): Promise<ValidateResult<TValues>> => {\n return form.validateField(name)\n }\n\n /**\n * 读取当前字段错误信息。\n */\n const getError = (): string[] | undefined => form.getFieldError(name)\n\n /**\n * 写入当前字段错误信息。\n */\n const setError = (errors: string[]): void => {\n form.setFieldError(name, errors)\n }\n\n /**\n * 清空当前字段错误信息。\n */\n const clearError = (): void => {\n form.setFieldError(name, [])\n }\n\n /**\n * 为当前字段注册校验规则。\n */\n const registerRules = (\n rules: SchemxRules | SchemxRules[],\n defaultMessage?: string\n ): void => {\n form.registerRules(name, rules, defaultMessage)\n }\n\n /**\n * 注销当前字段的校验规则。\n */\n const unregisterRules = (): void => {\n form.unregisterRules(name)\n }\n\n /**\n * 判断当前字段是否被触碰或修改。\n */\n const isTouched = (): boolean => form.isFieldTouched(name) ?? false\n\n /**\n * 将当前字段重置到初始值。\n */\n const reset = (): void => {\n form.resetFields([name])\n }\n\n /**\n * 设置当前字段 pending 状态。\n */\n const setPending = (pending: boolean, message?: string | string[]): void => {\n form.setFieldPending(name, pending, message)\n }\n\n /**\n * 判断当前字段是否处于 pending 状态。\n */\n const isPending = (): boolean => form.isFieldPending(name) ?? false\n\n /**\n * 创建依赖当前字段读取的响应式副作用。\n */\n const effect = (fn: () => void): (() => void) => {\n return form.effect(fn)\n }\n\n return {\n getValue,\n setValue,\n getInitialValue,\n setInitialValue,\n getValues,\n getSnapshot,\n validate,\n getError,\n setError,\n clearError,\n registerRules,\n unregisterRules,\n isTouched,\n reset,\n setPending,\n isPending,\n effect,\n }\n}\n","/**\n * createEffect - 底层通用 reactive effect 工具\n *\n * 通过 core reactivity 层创建 effect,不依赖 form 实例。它提供最底层的\n * 响应式 effect 能力:在 effect 回调中访问 reactive value 时自动追踪\n * 依赖,依赖变化时自动重新执行回调。\n *\n * 相比 `createWatch` 系列函数(需要传入 form 实例,提供结构化的 payload 和 diff 计算),\n * `createEffect` 更底层、更灵活,不做任何值比较或 payload 封装。\n *\n * 支持 cleanup 机制:effect 回调可返回一个清理函数,\n * 该函数会在 effect 重新执行前或被 dispose 时自动调用。\n *\n * @module core/createEffect\n *\n * @example\n * ```ts\n * import { createEffect } from '@schemx/core'\n * const dispose = createEffect(() => {\n * console.log('reactive dependencies read here will be tracked')\n * return () => {\n * console.log('cleanup')\n * }\n * })\n * dispose()\n * ```\n */\n\nimport { createSignalEffect } from \"./reactivity\"\n\n/**\n * effect 回调返回的清理函数。\n *\n * 清理函数会在 effect 重新执行前以及 dispose 时调用。\n */\nexport type CleanupFn = () => void\n\n/**\n * reactive effect 回调。\n *\n * 回调执行期间读取的 reactive value 会被自动追踪。\n */\nexport type EffectCallback = () => CleanupFn | void\n\n/**\n * `createEffect` 返回的释放函数。\n *\n * 多次调用是安全的,只有第一次会真正释放 effect 和最后一次 cleanup。\n */\nexport type CreateEffectReturn = () => void\n\n/**\n * 创建通用 reactive effect。\n *\n * 在 effect 回调中访问任何 reactive value 时自动追踪依赖,\n * 依赖变化时自动重新执行回调。\n * 回调可返回一个清理函数,在 effect 重新执行前或被 dispose 时调用。\n *\n * @param callback - effect 回调函数,可选返回清理函数\n *\n * @returns 取消 effect 的 dispose 函数(幂等)\n *\n * @example\n * ```ts\n * import { createEffect } from '@schemx/core'\n * const dispose = createEffect(() => {\n * console.log('reactive dependencies read here will be tracked')\n * return () => console.log('cleanup')\n * })\n *\n * dispose() // 取消 effect,调用最后一次 cleanup\n * ```\n */\nexport function createEffect(callback: EffectCallback): CreateEffectReturn {\n let cleanup: CleanupFn | undefined\n let disposed = false\n\n /**\n * 执行 effect 回调,并在重新执行前释放上一轮 cleanup。\n */\n const dispose = createSignalEffect(() => {\n cleanup?.()\n cleanup = undefined\n\n const result = callback()\n if (typeof result === \"function\") {\n cleanup = result\n }\n })\n\n /**\n * 释放 effect 与最后一次 cleanup;多次调用只执行一次。\n */\n const api = (): void => {\n if (disposed) return\n disposed = true\n dispose()\n cleanup?.()\n cleanup = undefined\n }\n\n return api\n}\n","/**\n * createWatch - 基于 reactive effect 的字段监听工具\n *\n * 提供不依赖任何 UI 框架的字段监听能力,基于 form.effect() 自动依赖追踪。\n * 适用于非组件场景(如工具函数、外部逻辑)。\n *\n * 提供四种使用方式:\n * - {@link createWatch} — 统一入口,根据参数类型自动分发\n * - {@link createWatchField} — 监听单个字段\n * - {@link createWatchFields} — 监听多个字段\n * - {@link createWatchAll} — 监听所有字段\n *\n * 所有回调采用 payload 模式:`(payload, latestSnapshot)`,\n * payload 包含变更的详细信息,latestSnapshot 为变更后的表单完整快照。\n *\n * @module core/createWatch\n *\n * @example\n * ```ts\n * import { createWatch, createWatchField, createWatchFields, createWatchAll } from '@schemx/core'\n *\n * // 统一入口 — 根据参数类型自动分发\n * createWatch(form, 'username', (payload, snapshot) => { ... })\n * createWatch(form, ['firstName', 'lastName'], (payload, snapshot) => { ... })\n * createWatch(form, (payload, snapshot) => { ... })\n *\n * // 监听单个字段\n * const dispose = createWatchField(form, 'username', (payload, snapshot) => {\n * console.log(`${payload.prevValue} -> ${payload.value}`)\n * }, { immediate: true })\n *\n * // 监听多个字段\n * const dispose = createWatchFields(form, ['firstName', 'lastName'], (payload, snapshot) => {\n * console.log('changed:', payload.changedValues)\n * }, {})\n *\n * // 监听所有字段\n * const dispose = createWatchAll(form, (payload, snapshot) => {\n * console.log('changed paths:', payload.changedPaths)\n * }, {})\n *\n * // 取消监听\n * dispose()\n * ```\n */\n\nimport { isEqual } from \"es-toolkit/compat\"\n\nimport { collectObjectPathsByLeaf, diff } from \"./utils\"\n\nimport type { FieldValue, NamePath, SchemxInstance, Values } from \"./types\"\n\n/** 单字段订阅回调的载荷 */\ntype FieldPayload<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> = {\n /** 变更后的字段值 */\n value: FieldValue<TValues, TName> | undefined\n /** 变更前的字段值 */\n prevValue: FieldValue<TValues, TName> | undefined\n}\n\n/** 多字段订阅回调的载荷 */\ntype FieldsPayload<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> = {\n /** 本次变更涉及的所有字段路径 */\n changedPaths: TName[]\n /** 本次变更涉及的字段值(部分表单数据) */\n changedValues: Partial<TValues>\n /** 变更前对应字段的旧值(部分表单数据) */\n prevValues: Partial<TValues>\n}\n\n/** 全局订阅回调的载荷 */\ntype GlobalPayload<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> = {\n /** 本次变更涉及的所有字段路径 */\n changedPaths: TName[]\n /** 本次变更涉及的字段值(部分表单数据) */\n changedValues: Partial<TValues>\n /** 变更前对应字段的旧值(部分表单数据) */\n prevValues: Partial<TValues>\n}\n\n/**\n * 订阅回调的基础类型。\n *\n * 回调接收两个参数:变更载荷(payload)和变更后的表单完整快照(latestSnapshot)。\n */\ntype BaseSubscribeCallback<TValues, P> = (payload: P, latestSnapshot: TValues) => void\n\n/**\n * 单字段订阅回调类型。\n *\n * payload 包含目标字段的新旧值,第二个参数是最新表单快照。\n */\nexport type WatchFieldCallback<\n TValues extends Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n> = BaseSubscribeCallback<TValues, FieldPayload<TValues, TName>>\n\n/**\n * 多字段订阅回调类型。\n *\n * payload 只包含被监听字段集合内发生变化的路径和值。\n */\nexport type WatchFieldsCallback<TValues extends Values> = BaseSubscribeCallback<\n TValues,\n FieldsPayload<TValues>\n>\n\n/**\n * 全局订阅回调类型。\n *\n * payload 包含任意字段变化后计算出的 changedPaths、changedValues 和 prevValues。\n */\nexport type WatchAllCallback<TValues extends Values> = BaseSubscribeCallback<\n TValues,\n GlobalPayload<TValues>\n>\n\n/**\n * useWatch / createWatch 选项\n */\nexport interface CreateWatchOptions {\n /**\n * 是否在创建后立即执行一次回调\n *\n * @default false\n */\n immediate?: boolean\n\n /**\n * 是否在新旧值深度相等时跳过回调\n *\n * 开启后,使用 `isEqual`(来自 es-toolkit)对新旧值进行深度比较,\n * 若相等则不触发回调,可减少不必要的执行。\n *\n * @default false\n */\n inequality?: boolean\n}\n\n/**\n * createWatch 系列函数的返回类型 - 取消监听函数\n *\n * 调用后将移除对应的 effect,不再接收后续变更通知。\n */\nexport type CreateWatchReturn = () => void\n\n/**\n * 监听单个字段变化(基于 reactive effect)\n *\n * 在 effect 内调用 form.getFieldValue(name) 建立依赖追踪,\n * 当字段值变化时 effect 自动重新执行并触发回调。\n *\n * @param form - 表单实例\n * @param name - 要监听的字段路径\n * @param callback - 字段变化时的回调函数,接收 (payload, latestSnapshot)\n * @param options - 监听选项\n * @returns 取消监听函数\n *\n * @example\n * ```ts\n * const dispose = createWatchField(form, 'email', (payload, snapshot) => {\n * console.log(`${payload.path}: ${payload.prevValue} -> ${payload.value}`)\n * }, { immediate: true, inequality: true })\n * dispose()\n * ```\n */\nexport const createWatchField = <\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n form: SchemxInstance<TValues>,\n name: TName,\n callback: WatchFieldCallback<TValues, TName>,\n options: CreateWatchOptions\n): CreateWatchReturn => {\n let prev = form.getFieldSnapshot(name)\n\n let isFirst = true\n\n const dispose = form.effect(() => {\n const current = form.getFieldValue(name)\n const latestSnapshot = form.getFieldsSnapshot()\n\n if (isFirst) {\n isFirst = false\n if (options.immediate) {\n callback({ value: current, prevValue: undefined }, latestSnapshot)\n }\n\n prev = current\n\n return\n }\n\n if (options.inequality && isEqual(current, prev)) return\n\n callback({ value: current, prevValue: prev }, latestSnapshot)\n\n prev = current\n })\n\n return dispose\n}\n\n/**\n * 监听多个字段变化(基于 reactive effect)\n *\n * 在 effect 内调用多个 form.getFieldValue 建立依赖追踪,\n * 当任一被监听字段变化时 effect 自动重新执行并触发回调。\n *\n * @param form - 表单实例\n * @param names - 要监听的字段路径数组\n * @param callback - 字段变化时的回调函数,接收 (payload, latestSnapshot)\n * @param options - 监听选项\n * @returns 取消监听函数\n *\n * @example\n * ```ts\n * const dispose = createWatchFields(form, ['firstName', 'lastName'], (payload, snapshot) => {\n * console.log('changed:', payload.changedValues)\n * console.log('prev:', payload.prevValues)\n * }, { inequality: true })\n * dispose()\n * ```\n */\nexport const createWatchFields = <\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n form: SchemxInstance<TValues>,\n names: TName[],\n callback: WatchFieldsCallback<TValues>,\n options: CreateWatchOptions\n): CreateWatchReturn => {\n let prevValues: Partial<TValues> = form.getFieldsSnapshot(names)\n let isFirst = true\n\n const dispose = form.effect(() => {\n const currentValues: Partial<TValues> = form.getFieldsValue(names)\n const latestSnapshot = form.getFieldsSnapshot()\n\n if (isFirst) {\n isFirst = false\n\n if (options.immediate) {\n callback(\n { changedPaths: names, changedValues: currentValues, prevValues: {} },\n latestSnapshot\n )\n }\n\n prevValues = { ...currentValues }\n\n return\n }\n\n if (options.inequality && isEqual(currentValues, prevValues)) return\n\n const changedValues = diff<Partial<TValues>>(currentValues, prevValues)\n const changedPaths = collectObjectPathsByLeaf<TValues, TName>(changedValues)\n\n callback({ changedPaths, changedValues, prevValues }, latestSnapshot)\n\n prevValues = { ...currentValues }\n })\n\n return dispose\n}\n\n/**\n * 监听所有字段变化(基于 reactive effect)\n *\n * 在 effect 内调用 form.getFieldsValue() 建立依赖追踪,\n * 当任何字段变化时 effect 自动重新执行并触发回调。\n *\n * @param form - 表单实例\n * @param callback - 字段变化时的回调函数,接收 (payload, latestSnapshot)\n * @param options - 监听选项\n * @returns 取消监听函数\n *\n * @example\n * ```ts\n * const dispose = createWatchAll(form, (payload, snapshot) => {\n * console.log('changed paths:', payload.changedPaths)\n * console.log('changed values:', payload.changedValues)\n * }, { immediate: true })\n * dispose()\n * ```\n */\nexport const createWatchAll = <\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n form: SchemxInstance<TValues>,\n callback: WatchAllCallback<TValues>,\n options: CreateWatchOptions\n): CreateWatchReturn => {\n let isFirst = true\n let prevValues: TValues = form.getFieldsSnapshot()\n\n const dispose = form.effect(() => {\n const latestSnapshot = form.getFieldsSnapshot()\n\n if (isFirst) {\n isFirst = false\n if (options.immediate) {\n callback(\n {\n changedPaths: [],\n changedValues: latestSnapshot,\n prevValues: {} as Partial<TValues>,\n },\n latestSnapshot\n )\n }\n\n prevValues = { ...latestSnapshot }\n\n return\n }\n\n if (options.inequality && isEqual(latestSnapshot, prevValues)) return\n\n const changedValues = diff<Partial<TValues>>(latestSnapshot, prevValues)\n const changedPaths = collectObjectPathsByLeaf<TValues, TName>(changedValues)\n\n callback({ changedPaths, changedValues, prevValues }, latestSnapshot)\n\n prevValues = { ...latestSnapshot }\n })\n\n return dispose\n}\n\n/**\n * 统一的字段监听函数(基于 reactive effect)\n *\n * 根据参数类型自动分发到 createWatchField / createWatchFields / createWatchAll。\n * 框架适配层可直接调用此函数,无需自行判断参数类型。\n *\n * @param form - 表单实例\n * @param callback - 全局变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function createWatch<TValues extends Values = Values>(\n form: SchemxInstance<TValues>,\n callback: WatchAllCallback<TValues>,\n options?: CreateWatchOptions\n): CreateWatchReturn\n/**\n * @param form - 表单实例\n * @param name - 字段路径\n * @param callback - 单字段变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function createWatch<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n form: SchemxInstance<TValues>,\n name: TName,\n callback: WatchFieldCallback<TValues, TName>,\n options?: CreateWatchOptions\n): CreateWatchReturn\n/**\n * @param form - 表单实例\n * @param names - 字段路径数组\n * @param callback - 多字段变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function createWatch<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n form: SchemxInstance<TValues>,\n names: TName[],\n callback: WatchFieldsCallback<TValues>,\n options?: CreateWatchOptions\n): CreateWatchReturn\n/**\n * createWatch 实现 — 根据第二个参数类型分发到对应的底层函数\n */\nexport function createWatch<\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n form: SchemxInstance<TValues>,\n nameOrNamesOrCallback: TName | TName[] | WatchAllCallback<TValues>,\n callbackOrOptions?:\n | WatchFieldCallback<TValues>\n | WatchFieldsCallback<TValues>\n | CreateWatchOptions,\n maybeOptions?: CreateWatchOptions\n): CreateWatchReturn {\n // 全局监听:createWatch(form, callback, options?)\n if (typeof nameOrNamesOrCallback === \"function\") {\n return createWatchAll<TValues>(\n form,\n nameOrNamesOrCallback,\n (callbackOrOptions as CreateWatchOptions) || {}\n )\n }\n\n // 单字段监听:createWatch(form, name, callback, options?)\n if (\n typeof nameOrNamesOrCallback === \"string\" ||\n typeof nameOrNamesOrCallback === \"number\"\n ) {\n return createWatchField<TValues, TName>(\n form,\n nameOrNamesOrCallback as TName,\n callbackOrOptions as WatchFieldCallback<TValues, TName>,\n maybeOptions || {}\n )\n }\n\n // 多字段监听:createWatch(form, names, callback, options?)\n return createWatchFields<TValues, TName>(\n form,\n nameOrNamesOrCallback as TName[],\n callbackOrOptions as WatchFieldsCallback<TValues>,\n maybeOptions || {}\n )\n}\n","/**\n * 全局渲染器注册实例\n *\n * 模块级单例,由 ES Module 保证全局唯一。\n * vant 等 UI 适配层通过 import 后调用 registerAll 注册渲染器,\n * useForm 内部自动使用此实例作为 fallback。\n *\n * @module utils/rendererProvider\n */\n\nimport {\n createRendererRegistry,\n type RendererRegistryType,\n type SchemxRendererKey,\n} from \"@schemx/core\"\n\n/**\n * 全局渲染器注册实例\n *\n * @example\n * ```ts\n * // UI 适配层注册渲染器\n * import { rendererRegistry } from '@schemx/vue'\n * rendererRegistry.registerAll({ input: InputRenderer, ... })\n *\n * // useForm 内部自动使用\n * // props 传入的 rendererRegistry 优先级更高\n * ```\n */\nexport const rendererRegistry: RendererRegistryType<SchemxRendererKey> =\n createRendererRegistry<SchemxRendererKey>(\"input\")\n","/**\n * 全局校验规则注册实例\n *\n * 模块级单例,由 ES Module 保证全局唯一。\n * UI 适配层通过 import 后调用 register/registerAll 注册自定义规则,\n * useForm 内部自动使用此实例作为 fallback。\n *\n * @module utils/rulesProvider\n */\n\nimport { createValidatorsRegistry, type ValidatorsRegistryType } from \"@schemx/core\"\n\n/**\n * 全局校验规则注册实例\n *\n * @example\n * ```ts\n * // 注册自定义规则\n * import { validatorRegistry } from '@schemx/vue'\n * validatorRegistry.register('phone', phoneRule)\n *\n * // useForm 内部自动使用\n * // props 传入的 validatorRegistry 优先级更高\n * ```\n */\nexport const validatorRegistry: ValidatorsRegistryType = createValidatorsRegistry()\n","/**\n * SchemxInstance - 表单实例核心类\n *\n * 组合 Store、Validator,提供统一的表单操作接口。\n * 实现 SchemxInstance 接口,作为 useForm 的底层实现。\n *\n * @module hooks/useForm\n *\n * @example\n * ```typescript\n * import { useForm } from './useForm'\n *\n * // 在 Vue 组件中使用\n * const form = useForm({\n * schemas: [...],\n * initialValues: { name: '', age: 0 },\n * onFinish: (values) => console.log(values),\n * })\n *\n * // 或直接创建实例(非组件场景)\n * const instance = createForm({ initialValues: { name: '' } })\n * ```\n */\nimport { computed, inject, onUnmounted, provide } from \"vue\"\n\nimport { createForm } from \"@schemx/core\"\n\nimport { rendererRegistry as globalRendererRegistry } from \"../utils/rendererProvider\"\nimport { validatorRegistry as globalRulesRegistry } from \"../utils/rulesProvider\"\n\nimport type { CreateFormOptions, NamePath, SchemxInstance, Values } from \"@schemx/core\"\n\n/** SchemxInstance 在 Vue provide/inject 中的注入 key */\nexport const SCHEMX_INSTANCE_KEY = Symbol(\"SCHEMX_INSTANCE\")\n\n/** @deprecated 请使用 SCHEMX_INSTANCE_KEY。保留给旧测试和旧适配代码兼容。 */\nexport const FORM_INSTANCE_KEY = SCHEMX_INSTANCE_KEY\n\n/**\n * useForm 配置选项\n *\n * 扩展 core 层的 CreateFormOptions,增加 Vue 层特有的 request 配置。\n *\n * @typeParam TValues - 表单值类型\n */\nexport interface UseFormOptions<TValues extends Values> extends CreateFormOptions<\n TValues,\n NamePath<TValues>\n> {}\n\n/**\n * 表单组合式函数\n *\n * 创建 SchemxInstance 并通过 Vue provide 注入到子组件树中,\n * 组件卸载时自动销毁实例。\n *\n * @typeParam TValues - 表单值类型\n *\n * @param options - 表单配置选项\n * @returns 表单实例(SchemxInstance 接口)\n *\n * @example\n * ```typescript\n * // 在 setup 中使用\n * const form = useForm({\n * initialValues: { name: '', email: '' },\n * onFinish: async (values) => {\n * await api.submit(values)\n * },\n * })\n *\n * form.setFieldValue('name', 'John')\n * ```\n */\nexport function useForm<TValues extends Values = Values>(\n options: UseFormOptions<TValues> = {}\n): SchemxInstance<TValues> {\n const { ...formOptions } = options\n\n const mergedOptions: CreateFormOptions<TValues> = {\n ...formOptions,\n rendererRegistry: formOptions.rendererRegistry ?? globalRendererRegistry,\n validatorRegistry: formOptions.validatorRegistry ?? globalRulesRegistry,\n }\n\n const instance = computed(() => createForm<TValues>(mergedOptions))\n\n provide<SchemxInstance<TValues>>(SCHEMX_INSTANCE_KEY, instance.value)\n\n onUnmounted(() => {\n instance.value.destroy()\n })\n\n return instance.value\n}\n\n/**\n * 获取表单实例\n *\n * 在子组件中获取 useForm 创建的 SchemxInstance,\n * 可用于读写字段值、校验、订阅等操作。\n *\n * @typeParam TValues - 表单值类型\n * @returns 表单实例\n *\n * @throws Error 如果不在 schemx 提供的上下文中调用\n *\n * @example\n * ```ts\n * const form = useFormContext()\n * form.setFieldValue('name', 'hello')\n * ```\n */\nexport function useFormContext<\n TValues extends Values = Values,\n>(): SchemxInstance<TValues> {\n const instance = inject<SchemxInstance<TValues>>(SCHEMX_INSTANCE_KEY)\n\n if (!instance) {\n throw new Error(\"useFormContext must be used within a Form\")\n }\n\n return instance\n}\n","/**\n * useField - 字段控制 Hook\n *\n * 基于 core 层的 {@link createField} 实现,\n * 通过 subscribe 回调将 Signal 变化桥接到 Vue 响应式系统。\n *\n * @module hooks/useField\n *\n * @remarks\n * core 层的 createField 封装了所有框架无关的字段操作逻辑,\n * useField 只负责:\n * 1. 从 Vue context 中获取 form 实例\n * 2. 创建 shallowRef 容器\n * 3. 通过 subscribe 将 Signal 变化同步到 shallowRef\n * 4. 包装 computed 只读状态\n * 5. 管理 onUnmounted 生命周期清理\n */\n\nimport { computed, inject, InjectionKey, onUnmounted, provide, shallowRef } from \"vue\"\n\nimport { createField } from \"@schemx/core\"\n\nimport { FieldInstance } from \"../types/field\"\n\nimport { useFormContext } from \"./useForm\"\n\nimport type { NamePath, SchemxInstance, Values } from \"@schemx/core\"\n\n/** 字段上下文注入 key */\nconst FIELD_CONTEXT_KEY: InjectionKey<FieldInstance> = Symbol(\"schemx:field\")\n\n/**\n * useField 针对 (form, name) 的缓存条目\n *\n * 通过引用计数确保同一 (form, name) 的多次 useField 调用\n * 共享同一份 shallowRef 和 effect 桥接,避免重复订阅。\n *\n * @typeParam TValues - 表单值类型\n */\ninterface FieldHookCacheEntry<TValues extends Values = Values> {\n /** 当前活跃的引用计数,归零时释放 dispose 并从缓存中移除 */\n refCount: number\n /** 共享的字段控制器实例(含 Vue Ref 包装) */\n result: FieldInstance<TValues>\n /** 取消 Signal effect 订阅并清理资源 */\n dispose: () => void\n}\n\n/** 模块级缓存:form 实例 → 字段名 → 缓存条目 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst fieldHookCache = new WeakMap<any, Map<string, FieldHookCacheEntry>>()\n\n/**\n * 创建字段 hook 的响应式状态\n *\n * 从 createField 生成 FieldInstance,创建 shallowRef 容器\n * 并通过 field.effect 将 Signal 变化桥接到 Vue 响应式系统。\n */\nfunction createFieldHook<TValues extends Values = Values>(\n form: SchemxInstance<TValues>,\n name: NamePath<TValues>\n) {\n const field = createField<TValues>(form, name)\n\n const fieldValue = shallowRef(field.getValue())\n const fieldError = shallowRef(field.getError())\n const fieldPending = shallowRef(field.isPending())\n\n const dispose = field.effect(() => {\n fieldValue.value = field.getValue()\n fieldError.value = field.getError()\n\n fieldPending.value = field.isPending()\n })\n\n const error = computed(() => fieldError.value)\n\n const dirty = computed(() => {\n void fieldValue.value\n\n return field.isTouched()\n })\n\n const pending = computed(() => fieldPending.value)\n\n const result = {\n value: fieldValue,\n error,\n dirty,\n pending,\n ...field,\n getValue: () => fieldValue.value,\n }\n\n return { result, dispose }\n}\n\n/**\n * 获取单个字段的控制能力\n *\n * 通过 core 层 createField 提供字段操作方法,\n * 通过 subscribe 回调桥接 Signal 变化到 Vue shallowRef。\n *\n * @param name - 字段名(支持嵌套路径,如 'user.address.city')\n * @returns 字段状态和操作方法\n *\n * @example\n * ```typescript\n * const field = useField('username')\n *\n * // 响应式值(在 computed/watchEffect/template 中自动追踪)\n * field.getValue()\n *\n * // 响应式错误\n * field.error.value // string[] | undefined\n *\n * // 响应式脏状态\n * field.dirty.value // boolean\n *\n * // 响应式操作中状态\n * field.pending.value // boolean\n *\n * // 写入值\n * field.setValue('new value')\n *\n * // 校验\n * const result = await field.validate()\n * ```\n */\nexport const useField = <TValues extends Values = Values>(\n name: NamePath<TValues>\n): FieldInstance<TValues> => {\n const form = useFormContext<TValues>()\n\n const key = name\n\n let formCache = fieldHookCache.get(form)\n\n if (!formCache) {\n formCache = new Map()\n fieldHookCache.set(form, formCache)\n }\n\n const cachedEntry = formCache.get(key) as FieldHookCacheEntry<TValues> | undefined\n\n let activeEntry: FieldHookCacheEntry<TValues>\n\n if (cachedEntry) {\n cachedEntry.refCount++\n activeEntry = cachedEntry\n } else {\n const { result, dispose } = createFieldHook<TValues>(form, name)\n\n activeEntry = {\n refCount: 1,\n result,\n dispose,\n }\n\n formCache.set(key, activeEntry as any)\n }\n\n onUnmounted(() => {\n if (--activeEntry.refCount <= 0) {\n activeEntry.dispose()\n formCache.delete(key)\n }\n })\n\n return activeEntry.result\n}\n\n/**\n * 向子组件树注入当前字段上下文。\n *\n * 应在 FormItem(或任何创建了 useField 的组件)的 setup 中调用。\n *\n * @param field - useField 返回的字段实例\n *\n * @example\n * ```typescript\n * // FormItem 中\n * const field = useField('date')\n * createFieldContext(field)\n *\n * ```\n */\nexport function createFieldContext<TValues extends Values = Values>(\n field: FieldInstance<TValues>\n): void {\n provide(FIELD_CONTEXT_KEY, field as FieldInstance)\n}\n\n/**\n * 从最近的 FormItem 获取当前字段上下文。\n *\n * 必须在 FormItem 的组件子树内调用,否则抛出错误。\n *\n * @returns useField 返回的字段实例\n *\n * @throws 当不在 FormItem 子树内时抛出\n *\n * @example\n * const field = useFieldContext()\n * field.error.value // string[] | undefined\n * field.getValue() // 当前字段值(Vue 响应式)\n */\nexport function useFieldContext(): ReturnType<typeof useField> {\n const field = inject(FIELD_CONTEXT_KEY)\n\n if (!field) {\n throw new Error(\"[schemx] useFieldContext() must be used inside a FormItem tree\")\n }\n\n return field\n}\n\nexport default useField\n","/**\n * useWatch - 监听字段变化(Vue 组合式 API 版本)\n *\n * 基于 core 层的 {@link createWatch} 实现,\n * 自动通过 `useFormContext` 获取 formContext,\n * 并在 `onUnmounted` 时自动取消监听,无需手动管理生命周期。\n *\n * 提供三种监听模式:\n * - 全局监听:`useWatch(callback, options?)` — 监听表单中任意字段变化\n * - 单字段监听:`useWatch(name, callback, options?)` — 监听指定字段变化\n * - 多字段监听:`useWatch(names, callback, options?)` — 监听一组字段变化\n *\n * 同时提供语义化的便捷方法:\n * - {@link useWatchField} — 单字段监听\n * - {@link useWatchFields} — 多字段监听\n * - {@link useWatchAll} — 全局监听\n *\n * @module hooks/useWatch\n *\n * @example\n * ```ts\n * // 全局监听\n * useWatch((snapshot) => {\n * console.log('form changed:', snapshot)\n * })\n *\n * // 单字段监听\n * useWatch('username', (current, prev) => {\n * console.log('username changed:', prev, '->', current)\n * }, { immediate: true })\n *\n * // 多字段监听\n * useWatch(['firstName', 'lastName'], (currentValues, prevValues) => {\n * console.log('name changed:', currentValues)\n * }, { inequality: true })\n * ```\n */\n\nimport { onUnmounted } from \"vue\"\n\nimport { createWatch } from \"@schemx/core\"\n\nimport { useFormContext } from \"./useForm\"\n\nimport type { NamePath, Values } from \"@schemx/core\"\nimport type {\n CreateWatchOptions,\n WatchAllCallback,\n WatchFieldCallback,\n WatchFieldsCallback,\n} from \"@schemx/core\"\n\n/**\n * 监听所有字段变化\n *\n * @param callback - 全局变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function useWatch<T extends Values>(\n callback: WatchAllCallback<T>,\n options?: CreateWatchOptions\n): () => void\n/**\n * 监听单个字段变化\n *\n * @param name - 字段路径\n * @param callback - 单字段变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function useWatch<T extends Values>(\n name: NamePath<T>,\n callback: WatchFieldCallback<T>,\n options?: CreateWatchOptions\n): () => void\n/**\n * 监听多个字段变化\n *\n * @param names - 字段路径数组\n * @param callback - 多字段变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function useWatch<T extends Values>(\n names: NamePath<T>[],\n callback: WatchFieldsCallback<T>,\n options?: CreateWatchOptions\n): () => void\n/**\n * useWatch 实现 — 获取 form 实例后委托给 core 层的 createWatch\n */\nexport function useWatch<T extends Values>(\n nameOrNamesOrCallback: NamePath<T> | NamePath<T>[] | WatchAllCallback<T>,\n callbackOrOptions?: WatchFieldCallback<T> | WatchFieldsCallback<T> | CreateWatchOptions,\n maybeOptions?: CreateWatchOptions\n): () => void {\n const form = useFormContext<T>()\n\n const dispose = (createWatch as any)(\n form,\n nameOrNamesOrCallback,\n callbackOrOptions,\n maybeOptions\n )\n\n onUnmounted(dispose)\n\n return dispose\n}\n\n/**\n * 监听单个字段变化的便捷方法\n *\n * 等价于 `useWatch(name, callback, options)`,语义更明确。\n * 自动绑定 formContext 并在组件卸载时取消监听。\n *\n * @param name - 要监听的字段路径\n * @param callback - 字段变化回调\n * @param options - 可选配置\n * @returns 取消监听函数\n */\nexport function useWatchField<T extends Values = Values>(\n name: NamePath<T>,\n callback: WatchFieldCallback<T>,\n options?: CreateWatchOptions\n): () => void {\n return useWatch<T>(name, callback, options)\n}\n\n/**\n * 监听多个字段变化的便捷方法\n *\n * 等价于 `useWatch(names, callback, options)`,语义更明确。\n * 自动绑定 formContext 并在组件卸载时取消监听。\n *\n * @param names - 要监听的字段路径数组\n * @param callback - 字段变化回调\n * @param options - 可选配置\n * @returns 取消监听函数\n */\nexport function useWatchFields<T extends Values>(\n names: NamePath<T>[],\n callback: WatchFieldsCallback<T>,\n options?: CreateWatchOptions\n): () => void {\n return useWatch<T>(names, callback, options)\n}\n\n/**\n * 监听所有字段变化的便捷方法\n *\n * 等价于 `useWatch(callback, options)`,语义更明确。\n * 自动绑定 formContext 并在组件卸载时取消监听。\n *\n * @param callback - 全局变化回调\n * @param options - 可选配置\n * @returns 取消监听函数\n */\nexport function useWatchAll<T extends Values = Values>(\n callback: WatchAllCallback<T>,\n options?: CreateWatchOptions\n): () => void {\n return useWatch(callback, options)\n}\n\nexport default useWatch\n","/**\n * useEffect - Vue 组合式 API 版本的 Signal effect\n *\n * 封装 `@schemx/core` 的 `createEffect`,在组件卸载时自动 dispose,\n * 无需手动管理生命周期。\n *\n * @module hooks/useEffect\n *\n * @example\n * ```ts\n * import { useEffect } from '@schemx/vue'\n *\n * // 在 setup 中使用\n * useEffect(() => {\n * const name = form.getFieldValue('name')\n * console.log('name:', name)\n *\n * return () => {\n * // 清理逻辑\n * }\n * })\n * ```\n */\n\nimport { onUnmounted } from \"vue\"\n\nimport { createEffect } from \"@schemx/core\"\n\nimport type { CreateEffectReturn, EffectCallback } from \"@schemx/core\"\n\n/**\n * 创建 Signal effect 并在组件卸载时自动取消。\n *\n * 在 effect 回调中访问任何 Signal 值时自动追踪依赖,\n * 依赖变化时自动重新执行回调。\n * 回调可返回一个清理函数,在 effect 重新执行前或被 dispose 时调用。\n *\n * @param callback - effect 回调函数,可选返回清理函数\n *\n * @returns 取消 effect 的 dispose 函数(通常无需手动调用,组件卸载时自动取消)\n *\n * @example\n * ```ts\n * // 监听字段值变化\n * useEffect(() => {\n * const name = form.getFieldValue('name')\n * console.log('name changed:', name)\n * })\n *\n * // 带清理函数\n * useEffect(() => {\n * const timer = setInterval(() => {\n * console.log('value:', form.getFieldValue('count'))\n * }, 1000)\n *\n * return () => clearInterval(timer)\n * })\n * ```\n */\nexport function useEffect(callback: EffectCallback): CreateEffectReturn {\n const dispose = createEffect(callback)\n\n onUnmounted(dispose)\n\n return dispose\n}\n\nexport default useEffect\n","/**\n * useDictionary - 字典选项 Hook\n *\n * 通过 api 函数加载字典选项,支持完整的表单值泛型推导。\n * 自动在组件挂载时加载,支持通过 dependsOn 声明依赖字段,\n * 当依赖字段变化时自动重新请求。\n *\n * @module hooks/useDictionary\n */\n\nimport { onMounted, Ref, ref } from \"vue\"\n\nimport type { SchemxDictionary } from \"@/types/dictionary\"\n\nimport { useFormContext } from \"./useForm\"\nimport { useWatchFields } from \"./useWatch\"\n\nimport type { NamePath, Values } from \"@schemx/core\"\n\n\nexport type { SchemxDictionary, SchemxWithDictionary } from \"@/types/dictionary\"\n\n/**\n * useDictionary 返回值\n */\nexport interface UseDictionaryReturn {\n /** 远程加载的字典选项列表(响应式) */\n list: Ref<any[]>\n /** 请求加载状态(响应式) */\n loading: Ref<boolean>\n /** 请求错误信息(响应式) */\n error: Ref<Error | undefined>\n /** 触发字典选项加载 */\n loadDict: () => Promise<void>\n /** 使用当前配置重新执行 api */\n refresh: () => Promise<void>\n /** 直接修改 list 的值,不触发 api 调用 */\n mutate: (data: any[]) => void\n}\n\n/**\n * @deprecated\n *\n * 已弃用,请使用 **UseDictionaryReturn**\n */\nexport type UseDictOptionsReturn = UseDictionaryReturn\n\n/**\n * 将未知抛出值规范化为 `Error` 实例\n *\n * @param err - 捕获的值(可能是任意类型)\n * @returns 包装原始值的 `Error` 对象\n */\nexport function normalizeError(err: unknown): Error {\n if (err instanceof Error) return err\n\n return new Error(String(err))\n}\n\n/**\n * 加载字典选项\n *\n * 通过 api 函数获取数据,支持完整的表单值泛型推导。\n * 自动在组件挂载时加载,支持依赖字段联动、竞态控制、\n * 重试、错误处理等能力。\n *\n * @typeParam TValues - 表单值类型\n * @param options - 字典配置选项\n * @param fieldName - 当前字段名,用于 resetOnDepsChange 时清空字段值\n * @returns 响应式选项列表、loading/error 状态及控制方法\n *\n * @example\n * ```ts\n * // 基础用法\n * const { list } = useDictionary({\n * api: async () => {\n * const res = await fetch('/api/options')\n * return res.json()\n * },\n * })\n *\n * // 依赖联动(带泛型)\n * const { list } = useDictionary<MyFormValues>({\n * api: async (values) => fetchCities(values.province),\n * dependsOn: ['province'],\n * shouldFetch: (values) => !!values.province,\n * resetOnDepsChange: true,\n * immediate: false,\n * }, 'city')\n * ```\n */\nexport const useDictionary = <\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n options: SchemxDictionary<TValues>,\n fieldName?: TName\n): UseDictionaryReturn => {\n const instance = useFormContext<TValues>()\n\n const list = ref<any[]>([])\n const loading = ref<boolean>(false)\n const error = ref<Error | undefined>(undefined)\n\n // 竞态控制:仅最新请求写入状态\n let requestCount = 0\n\n /**\n * 使用配置的 formatter 格式化原始响应数据\n */\n const format = async (res: any): Promise<any> => {\n if (typeof options?.formatter === \"function\") {\n return await options.formatter(res, instance)\n }\n\n return res\n }\n\n /**\n * 带重试的执行\n */\n const executeWithRetry = async (formValues: TValues): Promise<any> => {\n const maxRetries = options.retryCount ?? 0\n const retryDelay = options.retryInterval ?? 1000\n let lastError: Error = new Error(\"Unknown error\")\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await options.api(formValues, instance)\n } catch (err) {\n lastError = normalizeError(err)\n\n if (attempt < maxRetries) {\n await new Promise((r) => setTimeout(r, retryDelay))\n }\n }\n }\n\n throw lastError\n }\n\n /**\n * 执行 api 函数加载字典选项\n */\n const loadDict = async (): Promise<void> => {\n try {\n const formValues = instance.getFieldsValue()\n\n // shouldFetch 检查\n if (typeof options.shouldFetch === \"function\" && !options.shouldFetch(formValues)) {\n list.value = []\n loading.value = false\n\n return\n }\n\n loading.value = true\n error.value = undefined\n\n // 递增请求计数器用于竞态控制\n const currentCount = ++requestCount\n\n const res = await executeWithRetry(formValues)\n\n // 竞态检查:丢弃过期响应\n if (currentCount !== requestCount) return\n\n const formatted = await format(res)\n\n // 格式化后再次竞态检查(格式化可能是异步的)\n if (currentCount !== requestCount) return\n\n list.value = formatted\n error.value = undefined\n\n // onSuccess 回调\n if (typeof options.onSuccess === \"function\") {\n options.onSuccess(formatted, instance)\n }\n\n loading.value = false\n } catch (err) {\n const normalized = normalizeError(err)\n\n error.value = normalized\n list.value = []\n loading.value = false\n\n if (typeof options.onError === \"function\") {\n options.onError(normalized, instance)\n }\n }\n }\n\n const refresh = (): Promise<void> => loadDict()\n\n const mutate = (data: any[]): void => {\n list.value = data\n }\n\n // ========== 依赖字段监听 ==========\n if (options.dependsOn?.length) {\n useWatchFields(options.dependsOn, (_payload, latestSnapshot) => {\n // 1. 触发 onDepsChange 回调\n if (typeof options.onDepsChange === \"function\") {\n options.onDepsChange(latestSnapshot as TValues, instance)\n }\n\n // 2. 清空当前字段值\n if (options.resetOnDepsChange && fieldName) {\n instance.setFieldValue(fieldName, undefined)\n }\n\n // 3. 重新执行 api\n void loadDict()\n })\n }\n\n // ========== 挂载行为 ==========\n const immediate = options.immediate ?? true\n\n onMounted(() => {\n if (immediate) {\n void loadDict()\n }\n })\n\n return { list, loading, error, loadDict, refresh, mutate }\n}\n\nexport default useDictionary\n","/**\n * useConfigContext - 表单上下文 Hook\n *\n * 提供表单上下文的创建与消费能力。\n * schemx 通过 createConfigContext 注入全局配置,\n * 子组件通过 useConfigContext 获取。\n *\n * @module hooks/useContext\n */\n\nimport { inject, provide } from \"vue\"\n\nimport type { SchemxFormProps } from \"../types\"\nimport type { Values } from \"@schemx/core\"\n\n/** FormContext 注入 key */\nexport const FORM_CONTEXT_KEY = Symbol(\"FormContext\")\n\n/**\n * 表单上下文属性\n *\n * 由 schemx 组件注入,包含表单级别的全局配置。\n *\n * @typeParam T - 表单值类型\n */\nexport interface FormContextProps<T extends Values = Values> extends Omit<\n SchemxFormProps<T>,\n | \"form\"\n | \"modelValue\"\n | \"rendererRegistry\"\n | \"defaultRendererType\"\n | \"rulesRegistery\"\n | \"onFinish\"\n | \"onFinishFailed\"\n | \"onValuesChange\"\n | \"onFieldsChange\"\n> {}\n\n/**\n * 创建并注入表单上下文\n *\n * 在 schemx 的 setup 中调用,将表单级别配置注入到子组件树中。\n *\n * @typeParam T - 表单值类型\n * @param props - 表单上下文属性\n */\nexport const createConfigContext = <T extends Values = Values>(\n props: FormContextProps<T>\n) => {\n provide<FormContextProps<T>>(FORM_CONTEXT_KEY, props)\n}\n\n/**\n * @deprecated\n *\n * 已弃用,请使用 **createConfigContext**\n */\nexport const createContext = createConfigContext\n\n/**\n * 获取表单上下文配置\n *\n * 在子组件中获取 schemx 注入的全局配置(readonly、disabled、labelAlign 等)。\n *\n * @returns 表单上下文属性\n *\n * @throws Error 如果不在 schemx 提供的上下文中调用\n *\n * @example\n * ```ts\n * const context = useConfigContext()\n * console.log(context.readonly, context.disabled)\n * ```\n */\nexport function useConfigContext(): FormContextProps {\n const context = inject<FormContextProps>(FORM_CONTEXT_KEY)\n\n if (!context) {\n throw new Error(\"useConfigContext must be used within a Form\")\n }\n\n return context\n}\n\n/**\n * @deprecated\n *\n * 已弃用,请使用 **useConfigContext**\n */\nexport const useContext = useConfigContext\n","/**\n * 对象浅比较工具\n *\n * @module utils/equal\n */\n\n/**\n * 浅比较两个对象的自有属性值是否相同。\n *\n * 用于避免 computed / shallowRef 每次返回新对象引用导致子组件不必要的更新。\n * 仅比较第一层属性,函数引用通过 === 判断。\n *\n * @param a - 旧对象\n * @param b - 新对象\n *\n * @returns 两个对象浅相等时返回 true\n *\n * @example\n * shallowEqual({ a: 1, b: 2 }, { a: 1, b: 2 }) // => true\n * shallowEqual({ a: 1 }, { a: 1, b: 2 }) // => false\n */\nexport const isShallowEqual = (\n a: Record<string, any>,\n b: Record<string, any>\n): boolean => {\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n\n return keysA.every((key) => a[key] === b[key])\n}\n","/**\n * useStableRef - 引用稳定化的 shallowRef\n *\n * 封装 `shallowRef` + `watchEffect` + `isShallowEqual`,\n * 仅在工厂函数返回值与当前值浅不相等时才更新引用,\n * 避免下游组件因对象引用变化而不必要地重渲染。\n *\n * @module hooks/useStableRef\n *\n * @example\n * ```ts\n * import { useStableRef } from '@schemx/vue'\n *\n * const stableProps = useStableRef(() => ({\n * visible: visible.value,\n * disabled: disabled.value,\n * value: field.getValue(),\n * }))\n * ```\n */\n\nimport { type ShallowRef, shallowRef, watchEffect } from \"vue\"\n\nimport { isShallowEqual } from \"../utils/equal\"\n\n/**\n * 创建一个引用稳定的 shallowRef。\n *\n * 在 watchEffect 中执行工厂函数,自动追踪响应式依赖。\n * 仅当新旧值浅比较不相等时才替换 `.value`,保持引用稳定。\n *\n * @typeParam T - 对象类型\n *\n * @param factory - 返回目标对象的工厂函数,在 watchEffect 内执行\n *\n * @returns 只读的 ShallowRef,引用仅在属性值真正变化时更新\n *\n * @example\n * ```ts\n * const props = useStableRef(() => ({\n * value: field.getValue(),\n * onChange: handleChange,\n * }))\n *\n * // props.value 的引用在属性值未变时保持不变\n * h(Component, props.value)\n * ```\n */\nexport function useStableRef<T extends Record<string, any>>(\n factory: () => T\n): Readonly<ShallowRef<T>> {\n const stableRef = shallowRef({} as T) as ShallowRef<T>\n\n watchEffect(() => {\n const next = factory()\n\n if (!isShallowEqual(stableRef.value, next)) {\n stableRef.value = next\n }\n })\n\n return stableRef\n}\n\nexport default useStableRef\n","/**\n * useViewSchemas - Vue ViewSchemas bridge.\n *\n * @module hooks/useViewSchemas\n */\n\nimport { onScopeDispose, shallowRef } from \"vue\"\nimport type { ShallowRef } from \"vue\"\n\nimport type { SchemxInstance, SchemxViewSchema, Values } from \"@schemx/core\"\n\nexport function useViewSchemas<T extends Values = Values>(\n form: SchemxInstance<T>\n): ShallowRef<readonly SchemxViewSchema<T>[]> {\n const viewSchemas = shallowRef<readonly SchemxViewSchema<T>[]>(form.getViewSchemas())\n\n const unsubscribe = form.subscribeViewSchemas((nextSchemas) => {\n viewSchemas.value = nextSchemas\n })\n\n onScopeDispose(unsubscribe)\n\n return viewSchemas\n}\n\nexport default useViewSchemas\n","/**\n * 校验触发工具\n *\n * 提供校验触发时机的合并、归一化和匹配判断功能。\n *\n * @module utils/validation\n */\n\nimport type { ValidationTrigger } from \"@schemx/core\"\n\n/** 触发时机类型(支持单个或数组) */\nexport type TriggerConfig = ValidationTrigger | ValidationTrigger[]\n\n/** 归一化后的触发类型 */\nexport type NormalizedTrigger = \"blur\" | \"change\" | \"submit\"\n\n/**\n * 判断触发时机配置是否有效。\n *\n * undefined 和空数组视为无效,其余值(包括单个字符串、非空数组)视为有效。\n *\n * @param v - 触发时机配置\n *\n * @returns 配置有效时返回 true\n */\nfunction isValidTrigger(v: TriggerConfig | undefined): v is TriggerConfig {\n if (v === undefined) return false\n if (Array.isArray(v) && v.length === 0) return false\n\n return true\n}\n\n/**\n * 合并校验触发时机配置。\n *\n * 按优先级从高到低取值:列级配置 > 表单上下文配置 > 默认值。\n * 跳过 undefined 和空数组,确保空数组不会意外覆盖后续配置。\n *\n * @param columnTrigger - 列级配置的触发时机\n * @param contextTrigger - 表单上下文配置的触发时机\n * @param defaultTrigger - 兜底默认值\n *\n * @returns 最终生效的触发时机\n *\n * @example\n * mergeTrigger(\"onBlur\", \"onChange\", \"onSubmit\") // => \"onBlur\"\n * mergeTrigger(undefined, \"onChange\", \"onSubmit\") // => \"onChange\"\n * mergeTrigger([], \"onChange\", \"onSubmit\") // => \"onChange\"\n * mergeTrigger(undefined, undefined, \"onSubmit\") // => \"onSubmit\"\n */\nexport function mergeTrigger(\n columnTrigger: TriggerConfig | undefined,\n contextTrigger: TriggerConfig | undefined,\n defaultTrigger: TriggerConfig\n): TriggerConfig {\n if (isValidTrigger(columnTrigger)) return columnTrigger\n\n if (isValidTrigger(contextTrigger)) return contextTrigger\n\n return defaultTrigger\n}\n\n/**\n * 归一化触发类型字符串。\n *\n * 将带 `on` 前缀的格式统一为短格式:\n * `\"onBlur\"` → `\"blur\"`、`\"onChange\"` → `\"change\"`、`\"onSubmit\"` → `\"submit\"`。\n *\n * @param t - 原始触发类型\n *\n * @returns 归一化后的触发类型\n */\nfunction normalizeTrigger(t: ValidationTrigger): NormalizedTrigger {\n const map: Record<ValidationTrigger, NormalizedTrigger> = {\n onBlur: \"blur\",\n onChange: \"change\",\n onSubmit: \"submit\",\n blur: \"blur\",\n change: \"change\",\n submit: \"submit\",\n }\n\n return map[t] ?? \"submit\"\n}\n\n/**\n * 判断当前事件是否应该触发校验。\n *\n * 将配置的触发时机归一化后,与当前事件类型进行匹配。\n *\n * @param event - 当前触发的事件类型\n * @param trigger - 配置的触发时机(支持单个或数组)\n *\n * @returns 是否应该触发校验\n *\n * @example\n * shouldValidateOn(\"change\", \"onChange\") // => true\n * shouldValidateOn(\"blur\", [\"onBlur\", \"onChange\"]) // => true\n * shouldValidateOn(\"change\", \"onSubmit\") // => false\n * shouldValidateOn(\"change\", undefined) // => false\n */\nexport function shouldValidateOn(\n event: NormalizedTrigger,\n trigger?: TriggerConfig\n): boolean {\n if (!trigger) return false\n const triggers = Array.isArray(trigger) ? trigger : [trigger]\n\n return triggers.some((t) => normalizeTrigger(t) === event)\n}\n","/**\n * 插槽解析与子插槽提取工具。\n *\n * 提供 camelCase / kebab-case 双向查找插槽,\n * 以及按字段名前缀提取子渲染器插槽。\n *\n * @module utils/slot\n */\n\n/**\n * 检查字符串是否包含大写字母(驼峰格式特征)。\n *\n * @param str - 待检测的字符串\n * @returns 是否包含大写字母\n */\nconst isCamelCase = (str: string): boolean => /[A-Z]/.test(str)\n\n/**\n * 检查字符串是否包含连字符(kebab-case 特征)。\n *\n * @param str - 待检测的字符串\n * @returns 是否包含连字符\n */\nconst isKebabCase = (str: string): boolean => str.includes(\"-\")\n\n/**\n * 将驼峰命名转换为连字符命名(kebab-case)。\n *\n * @param str - 驼峰格式的字符串\n * @returns 转换后的 kebab-case 字符串\n */\nconst camelToKebab = (str: string): string => {\n return str.replace(/([A-Z])/g, \"-$1\").toLowerCase()\n}\n\n/**\n * 将连字符命名转换为驼峰命名(camelCase)。\n *\n * @param str - kebab-case 格式的字符串\n * @returns 转换后的 camelCase 字符串\n */\nconst kebabToCamel = (str: string): string => {\n return str.replace(/-([a-z])/g, (_match, letter) => letter.toUpperCase())\n}\n\n/**\n * 将命名格式归一化为 kebab-case。\n *\n * @param str - 任意命名格式的字符串\n * @returns kebab-case 格式的字符串\n */\nconst normalizeToKebab = (str: string): string => {\n if (isCamelCase(str)) return camelToKebab(str)\n\n return str\n}\n\n/**\n * 将命名格式归一化为 camelCase。\n *\n * @param str - 任意命名格式的字符串\n * @returns camelCase 格式的字符串\n */\nconst normalizeToCamel = (str: string): string => {\n if (isKebabCase(str)) return kebabToCamel(str)\n\n return str\n}\n\n/**\n * 从插槽对象中按名称查找插槽,同时支持 camelCase 和 kebab-case。\n *\n * 优先查找原始名称,未找到时尝试另一种命名格式。\n * 例如传入 `userName` 时,先查 `userName`,再查 `user-name`;\n * 传入 `user-name` 时,先查 `user-name`,再查 `userName`。\n *\n * @param slots - Vue 插槽对象\n * @param name - 插槽名称(camelCase 或 kebab-case)\n *\n * @returns 匹配的插槽函数,未找到返回 undefined\n *\n * @example\n * ```typescript\n * // slots 中定义了 'user-name' 插槽\n * resolveSlot(slots, 'userName') // => 找到 'user-name' 插槽\n * resolveSlot(slots, 'user-name') // => 找到 'user-name' 插槽\n * ```\n */\nexport const resolveSlot = (\n slots: Record<string, any>,\n name: string\n): ((...args: any[]) => any) | undefined => {\n if (slots[name]) return slots[name]\n\n const alt = isCamelCase(name)\n ? camelToKebab(name)\n : isKebabCase(name)\n ? kebabToCamel(name)\n : undefined\n\n if (alt && slots[alt]) return slots[alt]\n\n return undefined\n}\n\n/**\n * 从父级插槽中提取子渲染器插槽。\n *\n * 按 `fieldName:slotName` 和 `fieldName:slot-name` 格式匹配,\n * 提取后去掉前缀作为子渲染器的插槽名。\n * 同时支持 camelCase 和 kebab-case 的 fieldName。\n *\n * @param fieldName - 字段名\n * @param allSlots - 父级全部插槽\n *\n * @returns 子渲染器的插槽对象\n *\n * @example\n * ```typescript\n * // 父级插槽: { 'userName:prefix': fn, 'userName:suffix': fn, 'userNameLabel': fn }\n * extractChildSlots('userName', slots)\n * // => { prefix: fn, suffix: fn }\n * ```\n */\nexport const extractChildSlots = (\n fieldName: string,\n allSlots: Record<string, any>\n): Record<string, any> => {\n const result: Record<string, any> = {}\n const camelPrefix = normalizeToCamel(String(fieldName)) + \":\"\n const kebabPrefix = normalizeToKebab(String(fieldName)) + \":\"\n\n for (const [key, value] of Object.entries(allSlots)) {\n if (key.startsWith(camelPrefix)) {\n result[key.slice(camelPrefix.length)] = value\n } else if (key.startsWith(kebabPrefix) && kebabPrefix !== camelPrefix) {\n result[key.slice(kebabPrefix.length)] = value\n }\n }\n\n return result\n}\n","/**\n * FormGroup - 分组字段组件\n *\n * 用于渲染 componentType 为 \"group\" 的分组字段配置。\n * 支持可折叠的分组容器,内部渲染子 columns。\n *\n * @module components/FormGroup\n */\n\nimport { defineComponent, PropType, ref } from \"vue\"\nimport type { SetupContext, VNodeChild } from \"vue\"\n\nimport classnames from \"classnames\"\n\nimport FormItem from \"../FormItem\"\n\nimport type { SchemxViewGroupSchema, SchemxViewSchema, Values } from \"@schemx/core\"\n\n/**\n * FormGroup Props\n *\n * @typeParam T - 表单值类型\n */\nexport interface SchemxGroupProps<T extends Values = Values> {\n schema: SchemxViewGroupSchema<T>\n}\n\nconst FormGroup = defineComponent(\n <T extends Values = Values>(props: SchemxGroupProps<T>, { slots }: SetupContext) => {\n const collapsed = ref(Boolean(props.schema.defaultCollapsed))\n\n const toggle = () => {\n if (props.schema.collapsible) {\n collapsed.value = !collapsed.value\n }\n }\n\n return (): VNodeChild => {\n const schema = props.schema\n const collapsible = Boolean(schema.collapsible)\n\n return (\n <div\n class={classnames(\n \"schemx-group\",\n { \"schemx-group--collapsed\": collapsed.value },\n schema.class as string | undefined\n )}\n data-key={schema.key}\n >\n {schema.label && (\n <div\n role={collapsible ? \"button\" : undefined}\n tabindex={collapsible ? 0 : undefined}\n class={classnames(\"schemx-group__header\", {\n \"schemx-group__header--clickable\": collapsible,\n })}\n onClick={toggle}\n onKeydown={(e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n toggle()\n }\n }}\n >\n <span class=\"schemx-group__title\">{schema.label}</span>\n {collapsible && (\n <span\n class={classnames(\"schemx-group__arrow\", {\n \"schemx-group__arrow--down\": !collapsed.value,\n })}\n />\n )}\n </div>\n )}\n {!collapsed.value && (\n <div class=\"schemx-group__body\">\n {schema.children.map((child) => (\n <FormItem\n key={child.key}\n schema={child as SchemxViewSchema}\n v-slots={slots}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n },\n {\n name: \"SchemxGroup\",\n\n props: {\n schema: {\n type: Object as PropType<SchemxViewGroupSchema>,\n required: true,\n },\n },\n }\n)\n\nexport default FormGroup\n","/**\n * FormItem\n *\n * schemx 和 FormGroup 实际渲染字段的组件。\n * 动态属性已由 core 解析到 ViewSchema 中;这里只负责消费\n * 已解析 schema、创建字段实例、组装渲染器属性与插槽。\n *\n * @module components/FormItem\n */\n\nimport { computed, defineComponent, h, PropType, toRef } from \"vue\"\nimport type { SetupContext, VNodeChild } from \"vue\"\n\nimport classnames from \"classnames\"\n\nimport {\n createFieldContext,\n useConfigContext,\n useField,\n useFormContext,\n useStableRef,\n} from \"@/hooks\"\nimport { extractChildSlots, mergeTrigger, resolveSlot, shouldValidateOn } from \"@/utils\"\nimport type { TriggerConfig } from \"@/utils\"\n\nimport FormGroup from \"../FormGroup\"\n\nimport type {\n FieldValue,\n NamePath,\n SchemxComponentProps,\n SchemxViewFieldSchema,\n SchemxViewGroupSchema,\n SchemxViewSchema,\n Values,\n} from \"@schemx/core\"\n\n/**\n * FormItem 属性。\n *\n * @typeParam T - 表单值类型\n */\nexport interface SchemxItemProps<T extends Values = Values> {\n schema: SchemxViewSchema<T>\n}\n\nconst FormItem = defineComponent(\n <T extends Values = Values>(props: SchemxItemProps<T>, { slots }: SetupContext) => {\n const schemaRef = toRef(props, \"schema\")\n\n if (isViewGroupSchema(schemaRef.value)) {\n return (): VNodeChild => {\n return h(FormGroup, { schema: schemaRef.value as SchemxViewGroupSchema }, slots)\n }\n }\n\n const form = useFormContext<T>()\n const formContext = useConfigContext()\n\n const schema = (): SchemxViewFieldSchema<T> =>\n schemaRef.value as SchemxViewFieldSchema<T>\n\n const field = useField(schema().name)\n\n createFieldContext(field)\n\n const trigger = computed<TriggerConfig>(() =>\n mergeTrigger(schema().validationTrigger, formContext.validationTrigger, \"onChange\")\n )\n\n /**\n * 是否需要进行校验。\n *\n * 当字段不可见、详情展示、只读或禁用时,无需进行校验。\n */\n const canVerified = computed(() => {\n const isOperate = schema().visible && !schema().readonly && !schema().disabled\n\n const rules = schema().rules\n\n const hasRules = Array.isArray(rules) ? rules?.length > 0 : !!schema().rules\n\n return isOperate && hasRules\n })\n\n /** 值变化处理,设置值后根据触发时机决定是否校验 */\n const handleChange = (v: FieldValue<T, NamePath<T>>) => {\n field.setValue(v)\n schema().componentProps?.onChange?.(v)\n\n if (canVerified.value && shouldValidateOn(\"change\", trigger.value)) {\n field.validate()\n }\n }\n\n /** 失焦处理,根据触发时机决定是否校验 */\n const handleBlur = () => {\n // schema().componentProps?.onBlur?.()\n\n if (canVerified.value && shouldValidateOn(\"blur\", trigger.value)) {\n field.validate()\n }\n }\n\n // 使用 useStableRef 避免每次生成新对象引用\n const componentProps = useStableRef<SchemxComponentProps<T>>(\n (): SchemxComponentProps<T> => ({\n ...schema().componentProps,\n value: field.getValue(),\n onChange: handleChange,\n onBlur: handleBlur,\n \"onUpdate:value\": (v) => field.setValue(v),\n })\n )\n\n /**\n * 渲染 required 星号。\n *\n * 当字段为必填且非详情展示/禁用/只读状态时,在 label 前显示红色星号标记。\n *\n * @returns 星号 VNode 或空片段\n */\n const renderRequired = (): VNodeChild => {\n if (!schema().required || schema().disabled || schema().readonly) {\n return null\n }\n\n return <span class=\"schemx-item__required\">*</span>\n }\n\n /**\n * 渲染 formItem label 区域。\n *\n * 优先使用 `{name}Label` 插槽(支持 camelCase / kebab-case),\n * 未提供时渲染默认 label(含 required 星号、label 文本、冒号)。\n *\n * @returns label VNode\n */\n const renderLabel = (): VNodeChild => {\n const labelSlot = resolveSlot(slots, `${schema().name}Label`)\n\n if (labelSlot) {\n return labelSlot(schema())\n }\n\n const labelAlign = schema().labelAlign || formContext.labelAlign\n const labelWidth = schema().labelWidth || formContext.labelWidth\n const colon = schema().colon ?? formContext.colon\n\n return (\n <label\n class=\"schemx-item__label\"\n style={{ width: labelWidth, textAlign: labelAlign }}\n >\n {renderRequired()}\n <span class=\"schemx-item__label-text\">\n {schema().label}\n {colon ? \":\" : \"\"}\n </span>\n </label>\n )\n }\n\n /**\n * 渲染 formItem content 区域(仅控件)。\n *\n * 优先使用 `{name}Content` 插槽(支持 camelCase / kebab-case),\n * 插槽参数包含 formItemProps 和 columnElement(渲染器 VNode)。\n * 未提供插槽时,渲染默认控件布局。\n *\n * @returns content VNode\n */\n const renderContent = (): VNodeChild => {\n const component = form.getRenderer(schema().componentType)\n\n if (!component) {\n throw new Error(\n `[schemx] Can not find component renderer of \"${schema().componentType}\".`\n )\n }\n\n // 提取子渲染器插槽(fieldName:slotName 格式)\n const childSlots = extractChildSlots(normalizeNameKey(schema().name), slots)\n const columnElement = h(component, componentProps.value, childSlots)\n\n const contentSlot = resolveSlot(slots, `${schema().name}Content`)\n\n if (contentSlot) {\n return contentSlot({\n ...schema(),\n columnElement,\n })\n }\n\n return <div class=\"schemx-item__control\">{columnElement}</div>\n }\n\n /**\n * 渲染 formItem error 区域。\n *\n * 优先使用 `{name}Error` 插槽(支持 camelCase / kebab-case),\n * 插槽参数包含 formItemProps 和 errors 数组。\n * 未提供插槽时,仅在存在错误时显示第一条错误信息。\n *\n * @returns error VNode 或 null\n */\n const renderError = (): VNodeChild => {\n const errorSlot = resolveSlot(slots, `${schema().name}Error`)\n\n if (errorSlot) {\n return errorSlot({\n ...schema(),\n errors: field.error.value,\n })\n }\n\n if (!Array.isArray(field.error.value) || field.error.value.length === 0) {\n return null\n }\n\n return <div class=\"schemx-item__error\">{field.error.value[0]}</div>\n }\n\n return (): VNodeChild => {\n if (!schema().visible) {\n return null\n }\n\n // 整体插槽:完全接管渲染,不包裹任何默认结构\n const itemSlot = resolveSlot(slots, normalizeNameKey(schema().name))\n\n if (itemSlot) {\n return itemSlot(schema())\n }\n\n const labelPosition = schema().labelPosition || formContext.labelPosition\n\n return (\n <div class={classnames(\"schemx-item-wrapper\")}>\n <div\n class={classnames(\n \"schemx-item\",\n `schemx-item--label-${labelPosition}`,\n schema().class,\n {\n \"is-readonly\": schema().readonly,\n \"is-disabled\": schema().disabled,\n }\n )}\n style={{ ...(schema().style ?? {}) }}\n >\n {renderLabel()}\n\n <div class=\"schemx-item__content\">\n {renderContent()}\n {renderError()}\n </div>\n </div>\n </div>\n )\n }\n },\n {\n name: \"SchemxItem\",\n\n props: {\n schema: {\n type: Object as PropType<SchemxViewSchema>,\n required: true,\n },\n },\n }\n)\n\nexport default FormItem\n\nconst isViewGroupSchema = <T extends Values>(\n schema: SchemxViewSchema<T>\n): schema is SchemxViewGroupSchema<T> => {\n return schema.componentType === \"group\"\n}\n\nconst normalizeNameKey = (name: unknown): string => {\n if (Array.isArray(name)) {\n return name.map((part) => String(part)).join(\".\")\n }\n\n return String(name)\n}\n","import { SchemxViewSchema } from \"@schemx/core\"\n\n/**\n * 判断当前项是否为顶层可见普通字段中的第一个或最后一个。\n *\n * `group` 和不可见字段不参与顶层卡片圆角判断。\n *\n * 使用示例:\n *\n * const list = [\n * { key: 'group-1', type: 'group' },\n * { key: 'a' },\n * { key: 'b' },\n * { key: 'group-2', type: 'group' },\n * { key: 'c' },\n * ]\n *\n * getSectionPosition(list, 'a')\n * // => { found: true, isFirst: true, isLast: false }\n */\nexport function getSectionPosition<T extends SchemxViewSchema>(\n list: T[],\n currentKey: string\n) {\n const currentIndex = list.findIndex((item) => item.key === currentKey)\n\n if (currentIndex === -1) {\n return {\n found: false,\n isFirst: false,\n isLast: false,\n }\n }\n\n const currentItem = list[currentIndex]\n\n if (!isPositionItem(currentItem)) {\n return {\n found: true,\n isFirst: false,\n isLast: false,\n }\n }\n\n const prevItem = findPositionItem(list, currentIndex, -1)\n const nextItem = findPositionItem(list, currentIndex, 1)\n\n return {\n found: true,\n isFirst: !prevItem,\n isLast: !nextItem,\n }\n}\n\n/**\n * 判断当前项是否参与顶层首尾样式计算。\n */\nfunction isPositionItem<T extends SchemxViewSchema>(item?: T) {\n return (\n !!item &&\n item.componentType !== \"group\" &&\n (!(\"visible\" in item) || item.visible !== false)\n )\n}\n\nfunction findPositionItem<T extends SchemxViewSchema>(\n list: T[],\n startIndex: number,\n step: 1 | -1\n) {\n for (let index = startIndex + step; index >= 0 && index < list.length; index += step) {\n if (isPositionItem(list[index])) {\n return list[index]\n }\n }\n\n return undefined\n}\n","<!--\n schemx - 主组件\n\n 基于 Schema 配置的表单组件,使用 useForm Hook 管理状态。\n\n @module schemx\n-->\n\n<script lang=\"ts\" setup generic=\"T extends Values = Values\">\n import { watch, watchEffect } from \"vue\"\n\n import { omit } from \"es-toolkit\"\n\n import FormItem from \"./components/FormItem\"\n import { createConfigContext, useForm, useViewSchemas } from \"./hooks\"\n import { getSectionPosition } from \"./utils/helpers\"\n\n import type { SchemxFormProps } from \"./types/index\"\n import type { SchemxViewSchema, Values } from \"@schemx/core\"\n\n import \"./styles/index.css\"\n\n defineOptions({ name: \"SchemxForm\" })\n\n const props = withDefaults(defineProps<SchemxFormProps<T>>(), {\n modelValue: () => ({}) as T,\n initialValues: () => ({}) as T,\n form: undefined,\n schemas: () => [],\n class: \"\",\n style: () => ({}),\n onFinish: undefined,\n onFinishFailed: undefined,\n onValuesChange: undefined,\n onFieldsChange: undefined,\n rendererRegistry: undefined,\n validatorRegistry: undefined,\n })\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: T]\n }>()\n\n /**\n * 创建 FormContext 上下文\n *\n * 为子组件提供表单配置信息。\n */\n createConfigContext(\n omit(props, [\n \"form\",\n \"modelValue\",\n \"rendererRegistry\",\n \"defaultRendererType\",\n \"validatorRegistry\",\n \"onFinish\",\n \"onFinishFailed\",\n \"onValuesChange\",\n \"onFieldsChange\",\n ])\n )\n\n /**\n * 获取或创建表单实例\n *\n * 优先使用外部传入的 form,否则内部通过 useForm 创建。\n * 必须在 setup 同步阶段调用,确保 provide 正确注入。\n */\n const form = props.form\n ? props.form\n : useForm<T>({\n schemas: props.schemas,\n initialValues: props.initialValues,\n rendererRegistry: props.rendererRegistry,\n defaultRendererType: props.defaultRendererType,\n validatorRegistry: props.validatorRegistry,\n\n readonly: props.readonly,\n disabled: props.disabled,\n\n onFinish: async (values) => {\n props.onFinish?.(values)\n },\n onFinishFailed: async (errors) => {\n props.onFinishFailed?.(errors)\n },\n onValuesChange: (changedValues, latestSnapshot) => {\n emit(\"update:modelValue\", latestSnapshot as T)\n props.onValuesChange?.(changedValues, latestSnapshot)\n },\n onFieldsChange: (changedPaths, allPaths) => {\n props.onFieldsChange?.(changedPaths, allPaths)\n },\n })\n\n watch(\n () => props.schemas,\n (schemas) => {\n form.setSchemas(schemas)\n },\n { deep: false, immediate: !!props.form }\n )\n\n const viewSchemas = useViewSchemas(form)\n\n const getFormItemClass = (schema: SchemxViewSchema<T>) => {\n const { isFirst, isLast } = getSectionPosition(\n viewSchemas.value as SchemxViewSchema[],\n schema.key\n )\n\n return {\n \"schemx-item-wrapper--first\": isFirst,\n \"schemx-item-wrapper--last\": isLast,\n }\n }\n\n watchEffect(() => {\n form.updateDefaultProps(props)\n })\n\n defineExpose({\n ...form,\n })\n</script>\n\n<template>\n <div :class=\"['schemx', props.class]\">\n <FormItem\n v-for=\"schema in viewSchemas\"\n :key=\"schema.key\"\n :schema=\"schema as SchemxViewSchema\"\n :class=\"getFormItemClass(schema as SchemxViewSchema<T>)\"\n >\n <template v-for=\"(_, slotName) in $slots\" #[slotName]=\"slotProps\">\n <slot :name=\"slotName\" v-bind=\"slotProps ?? {}\" />\n </template>\n </FormItem>\n </div>\n</template>\n","/**\n * schemx 组件导出\n *\n * 为 SchemxForm 组件挂载静态方法(install、FormItem、registerRequest 等),\n * 并作为默认导出。\n *\n * @module formExport\n */\n\nimport type { App, DefineComponent } from \"vue\"\n\nimport FormItem from \"./components/FormItem\"\nimport SchemxForm from \"./formRuntime.js\"\n\nimport type { SchemxFormProps } from \"./types\"\n\n/**\n * SchemxForm 插件安装选项\n *\n * 在 `app.use(SchemxForm, options)` 时传入,用于配置全局默认行为。\n *\n * @example\n * ```ts\n * import SchemxForm from '@schemx/vue'\n *\n * app.use(SchemxForm, {\n * request: (url) => fetch(url).then(r => r.json()),\n * })\n * ```\n */\nexport interface SchemxInstallOptions {}\n\n/**\n * 为组件挂载静态属性并保留原始类型\n *\n * @param comp - 原始组件\n * @param extra - 要挂载的静态属性\n */\nexport function withInstall<T extends object, E extends Record<string, unknown>>(\n comp: T,\n extra: E\n) {\n return Object.assign(comp, extra) as T & E\n}\n\nexport type SchemxFormPlugin = DefineComponent<SchemxFormProps> & {\n install: (app: App, options?: SchemxInstallOptions) => void\n FormItem: typeof FormItem\n}\n\nconst SchemxFormExport = withInstall(SchemxForm, {\n /** Vue 插件安装方法 */\n install(app: App, _options?: SchemxInstallOptions) {\n app.component(\"SchemxForm\", SchemxForm)\n },\n /** FormItem 子组件引用 */\n FormItem,\n}) as unknown as SchemxFormPlugin\n\nexport default SchemxFormExport\n","/**\n * WithRemoteOptions - 选项高阶组件\n *\n * 包装任意渲染器组件,自动注入 useDictionary 的选项加载能力。\n * 被包装组件会额外收到 options、loading 两个 props,\n * 无需自行调用 useDictionary。\n *\n * @module hocs/withRemoteOptions\n */\n\nimport { Component, computed, defineComponent, h, PropType, SetupContext } from \"vue\"\n\nimport type { SchemxDictionary } from \"@/types/dictionary\"\n\nimport { useDictionary } from \"../hooks/useDictionary\"\n\nimport type { NamePath } from \"@schemx/core\"\n\n\n/**\n * WithRemoteOptions 注入给被包装组件的额外 Props\n */\nexport interface RemoteOptionsInjectedProps {\n /** 加载的选项列表 */\n options: any[]\n /** 加载状态 */\n loading: boolean\n}\n\n/**\n * 选项高阶组件\n *\n * 包装一个渲染器组件,当 dict prop 存在时,\n * 调用 useDictionary 加载选项,并将结果作为 options prop 注入。\n *\n * 当组件自身已传入非空 options 且无 dict 时,优先使用静态 options。\n *\n * @param WrappedComponent - 被包装的渲染器组件\n * @returns 增强后的组件,自动具备选项加载能力\n *\n * @example\n * ```ts\n * import { WithRemoteOptions } from '@schemx/vue'\n * import MySelect from './MySelect.vue'\n *\n * const RemoteSelect = WithRemoteOptions(MySelect)\n *\n * // 在 schema 中使用\n * const schema = {\n * name: 'city',\n * label: '城市',\n * componentType: 'select',\n * componentProps: {\n * dict: {\n * api: async (values) => fetchCities(values.province),\n * dependsOn: ['province'],\n * shouldFetch: (values) => !!values.province,\n * resetOnDepsChange: true,\n * immediate: false,\n * },\n * },\n * }\n * ```\n */\nexport function WithRemoteOptions(WrappedComponent: Component) {\n return defineComponent({\n name: `WithRemoteOptions(${WrappedComponent.name || \"Anonymous\"})`,\n inheritAttrs: false,\n props: {\n dict: {\n type: Object as PropType<SchemxDictionary>,\n default: undefined,\n },\n fieldName: {\n type: [String, Array] as PropType<NamePath>,\n default: undefined,\n },\n },\n setup(props, { attrs, slots }: SetupContext) {\n // 仅在 dict 配置存在时调用 useDictionary\n const dictResult = props.dict ? useDictionary(props.dict, props.fieldName) : null\n\n const childrenProps = computed(() => {\n return {\n ...attrs,\n dict: props.dict,\n options: props.dict ? dictResult?.list.value : attrs.options,\n loading: props.dict ? dictResult?.loading.value : attrs.loading,\n }\n })\n\n return () => h(WrappedComponent, childrenProps.value, slots)\n },\n })\n}\n\nexport default WithRemoteOptions\n"],"names":["i","t","n","r","o","signal","noop","x","a","b","effect","batch","s","computed","p","validators","d","__assign","e","c","_","y","g","v","m","j","l","AsyncStack_1","require$$0","_lib_1","require$$1","event","Polyfill_1","require$$2","global","runInFork_1","runInFork","AsyncVariable_1","AsyncVariable","AsyncSnapshot_1","AsyncSnapshot","AsyncContext_1","AsyncContext","normalizeTrigger","set","normalizeError","_a","root","rendererRegistry","validatorRegistry","_b","globalRendererRegistry","globalRulesRegistry","FormGroup","defineComponent","props","slots","collapsed","ref","Boolean","schema","defaultCollapsed","toggle","collapsible","value","_createVNode","classnames","class","key","label","undefined","preventDefault","children","map","child","FormItem","name","type","Object","required","schemaRef","toRef","isViewGroupSchema","h","form","useFormContext","formContext","useConfigContext","field","useField","createFieldContext","trigger","mergeTrigger","validationTrigger","canVerified","isOperate","visible","readonly","disabled","rules","hasRules","Array","isArray","length","handleChange","setValue","componentProps","onChange","shouldValidateOn","validate","handleBlur","useStableRef","getValue","onBlur","renderRequired","_createTextVNode","renderLabel","labelSlot","resolveSlot","labelAlign","labelWidth","colon","width","textAlign","renderContent","component","getRenderer","componentType","Error","childSlots","extractChildSlots","normalizeNameKey","columnElement","contentSlot","renderError","errorSlot","errors","error","itemSlot","labelPosition","style","part","String","join","_createElementBlock","_normalizeClass","_Fragment","_renderList","_unref","_createBlock","$slots","_withCtx","_renderSlot","_mergeProps","SchemxForm"],"mappings":"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","x_google_ignoreList":[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,30,31,32,33,34,35,36,37,38,39,40,49,50,51,52,53,54,55,56,57,58,59]}
1
+ {"version":3,"file":"index.mjs","sources":["../src/utils/rendererProvider.ts","../src/utils/rulesProvider.ts","../src/hooks/useForm.ts","../src/hooks/useField.ts","../src/hooks/useWatch.ts","../src/hooks/useEffect.ts","../src/hooks/useDictionary.ts","../src/hooks/useContext.ts","../src/utils/equal.ts","../src/hooks/useStableRef.ts","../src/hooks/useViewSchemas.ts","../src/utils/validation.ts","../src/utils/slot.ts","../src/components/FormGroup/index.tsx","../src/components/FormItem/index.tsx","../src/utils/helpers.ts","../src/form.vue","../src/form.ts","../src/hocs/withRemoteOptions.ts"],"sourcesContent":["/**\n * 全局渲染器注册实例\n *\n * 模块级单例,由 ES Module 保证全局唯一。\n * vant 等 UI 适配层通过 import 后调用 registerAll 注册渲染器,\n * useForm 内部自动使用此实例作为 fallback。\n *\n * @module utils/rendererProvider\n */\n\nimport {\n createRendererRegistry,\n type RendererRegistryType,\n type SchemxRendererKey,\n} from \"@schemx/core\"\n\n/**\n * 全局渲染器注册实例\n *\n * @example\n * ```ts\n * // UI 适配层注册渲染器\n * import { rendererRegistry } from '@schemx/vue'\n * rendererRegistry.registerAll({ input: InputRenderer, ... })\n *\n * // useForm 内部自动使用\n * // props 传入的 rendererRegistry 优先级更高\n * ```\n */\nexport const rendererRegistry: RendererRegistryType<SchemxRendererKey> =\n createRendererRegistry<SchemxRendererKey>(\"input\")\n","/**\n * 全局校验规则注册实例\n *\n * 模块级单例,由 ES Module 保证全局唯一。\n * UI 适配层通过 import 后调用 register/registerAll 注册自定义规则,\n * useForm 内部自动使用此实例作为 fallback。\n *\n * @module utils/rulesProvider\n */\n\nimport { createValidatorsRegistry, type ValidatorsRegistryType } from \"@schemx/core\"\n\n/**\n * 全局校验规则注册实例\n *\n * @example\n * ```ts\n * // 注册自定义规则\n * import { validatorRegistry } from '@schemx/vue'\n * validatorRegistry.register('phone', phoneRule)\n *\n * // useForm 内部自动使用\n * // props 传入的 validatorRegistry 优先级更高\n * ```\n */\nexport const validatorRegistry: ValidatorsRegistryType = createValidatorsRegistry()\n","/**\n * SchemxInstance - 表单实例核心类\n *\n * 组合 Store、Validator,提供统一的表单操作接口。\n * 实现 SchemxInstance 接口,作为 useForm 的底层实现。\n *\n * @module hooks/useForm\n *\n * @example\n * ```typescript\n * import { useForm } from './useForm'\n *\n * // 在 Vue 组件中使用\n * const form = useForm({\n * schemas: [...],\n * initialValues: { name: '', age: 0 },\n * onFinish: (values) => console.log(values),\n * })\n *\n * // 或直接创建实例(非组件场景)\n * const instance = createForm({ initialValues: { name: '' } })\n * ```\n */\nimport { computed, inject, onUnmounted, provide } from \"vue\"\n\nimport { createForm } from \"@schemx/core\"\n\nimport { rendererRegistry as globalRendererRegistry } from \"../utils/rendererProvider\"\nimport { validatorRegistry as globalRulesRegistry } from \"../utils/rulesProvider\"\n\nimport type { CreateFormOptions, NamePath, SchemxInstance, Values } from \"@schemx/core\"\n\n/** SchemxInstance 在 Vue provide/inject 中的注入 key */\nexport const SCHEMX_INSTANCE_KEY = Symbol(\"SCHEMX_INSTANCE\")\n\n/** @deprecated 请使用 SCHEMX_INSTANCE_KEY。保留给旧测试和旧适配代码兼容。 */\nexport const FORM_INSTANCE_KEY = SCHEMX_INSTANCE_KEY\n\n/**\n * useForm 配置选项\n *\n * 扩展 core 层的 CreateFormOptions,增加 Vue 层特有的 request 配置。\n *\n * @typeParam TValues - 表单值类型\n */\nexport interface UseFormOptions<TValues extends Values> extends CreateFormOptions<\n TValues,\n NamePath<TValues>\n> {}\n\n/**\n * 表单组合式函数\n *\n * 创建 SchemxInstance 并通过 Vue provide 注入到子组件树中,\n * 组件卸载时自动销毁实例。\n *\n * @typeParam TValues - 表单值类型\n *\n * @param options - 表单配置选项\n * @returns 表单实例(SchemxInstance 接口)\n *\n * @example\n * ```typescript\n * // 在 setup 中使用\n * const form = useForm({\n * initialValues: { name: '', email: '' },\n * onFinish: async (values) => {\n * await api.submit(values)\n * },\n * })\n *\n * form.setFieldValue('name', 'John')\n * ```\n */\nexport function useForm<TValues extends Values = Values>(\n options: UseFormOptions<TValues> = {}\n): SchemxInstance<TValues> {\n const { ...formOptions } = options\n\n const mergedOptions: CreateFormOptions<TValues> = {\n ...formOptions,\n rendererRegistry: formOptions.rendererRegistry ?? globalRendererRegistry,\n validatorRegistry: formOptions.validatorRegistry ?? globalRulesRegistry,\n }\n\n const instance = computed(() => createForm<TValues>(mergedOptions))\n\n provide<SchemxInstance<TValues>>(SCHEMX_INSTANCE_KEY, instance.value)\n\n onUnmounted(() => {\n instance.value.destroy()\n })\n\n return instance.value\n}\n\n/**\n * 获取表单实例\n *\n * 在子组件中获取 useForm 创建的 SchemxInstance,\n * 可用于读写字段值、校验、订阅等操作。\n *\n * @typeParam TValues - 表单值类型\n * @returns 表单实例\n *\n * @throws Error 如果不在 schemx 提供的上下文中调用\n *\n * @example\n * ```ts\n * const form = useFormContext()\n * form.setFieldValue('name', 'hello')\n * ```\n */\nexport function useFormContext<\n TValues extends Values = Values,\n>(): SchemxInstance<TValues> {\n const instance = inject<SchemxInstance<TValues>>(SCHEMX_INSTANCE_KEY)\n\n if (!instance) {\n throw new Error(\"useFormContext must be used within a Form\")\n }\n\n return instance\n}\n","/**\n * useField - 字段控制 Hook\n *\n * 基于 core 层的 {@link createField} 实现,\n * 通过 subscribe 回调将 Signal 变化桥接到 Vue 响应式系统。\n *\n * @module hooks/useField\n *\n * @remarks\n * core 层的 createField 封装了所有框架无关的字段操作逻辑,\n * useField 只负责:\n * 1. 从 Vue context 中获取 form 实例\n * 2. 创建 shallowRef 容器\n * 3. 通过 subscribe 将 Signal 变化同步到 shallowRef\n * 4. 包装 computed 只读状态\n * 5. 管理 onUnmounted 生命周期清理\n */\n\nimport { computed, inject, InjectionKey, onUnmounted, provide, shallowRef } from \"vue\"\n\nimport { createField } from \"@schemx/core\"\n\nimport { FieldInstance } from \"../types/field\"\n\nimport { useFormContext } from \"./useForm\"\n\nimport type { NamePath, SchemxInstance, Values } from \"@schemx/core\"\n\n/** 字段上下文注入 key */\nconst FIELD_CONTEXT_KEY: InjectionKey<FieldInstance> = Symbol(\"schemx:field\")\n\n/**\n * useField 针对 (form, name) 的缓存条目\n *\n * 通过引用计数确保同一 (form, name) 的多次 useField 调用\n * 共享同一份 shallowRef 和 effect 桥接,避免重复订阅。\n *\n * @typeParam TValues - 表单值类型\n */\ninterface FieldHookCacheEntry<TValues extends Values = Values> {\n /** 当前活跃的引用计数,归零时释放 dispose 并从缓存中移除 */\n refCount: number\n /** 共享的字段控制器实例(含 Vue Ref 包装) */\n result: FieldInstance<TValues>\n /** 取消 Signal effect 订阅并清理资源 */\n dispose: () => void\n}\n\n/** 模块级缓存:form 实例 → 字段名 → 缓存条目 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst fieldHookCache = new WeakMap<any, Map<string, FieldHookCacheEntry>>()\n\n/**\n * 创建字段 hook 的响应式状态\n *\n * 从 createField 生成 FieldInstance,创建 shallowRef 容器\n * 并通过 field.effect 将 Signal 变化桥接到 Vue 响应式系统。\n */\nfunction createFieldHook<TValues extends Values = Values>(\n form: SchemxInstance<TValues>,\n name: NamePath<TValues>\n) {\n const field = createField<TValues>(form, name)\n\n const fieldValue = shallowRef(field.getValue())\n const fieldError = shallowRef(field.getError())\n const fieldPending = shallowRef(field.isPending())\n\n const dispose = field.effect(() => {\n fieldValue.value = field.getValue()\n fieldError.value = field.getError()\n\n fieldPending.value = field.isPending()\n })\n\n const error = computed(() => fieldError.value)\n\n const dirty = computed(() => {\n void fieldValue.value\n\n return field.isTouched()\n })\n\n const pending = computed(() => fieldPending.value)\n\n const result = {\n value: fieldValue,\n error,\n dirty,\n pending,\n ...field,\n getValue: () => fieldValue.value,\n }\n\n return { result, dispose }\n}\n\n/**\n * 获取单个字段的控制能力\n *\n * 通过 core 层 createField 提供字段操作方法,\n * 通过 subscribe 回调桥接 Signal 变化到 Vue shallowRef。\n *\n * @param name - 字段名(支持嵌套路径,如 'user.address.city')\n * @returns 字段状态和操作方法\n *\n * @example\n * ```typescript\n * const field = useField('username')\n *\n * // 响应式值(在 computed/watchEffect/template 中自动追踪)\n * field.getValue()\n *\n * // 响应式错误\n * field.error.value // string[] | undefined\n *\n * // 响应式脏状态\n * field.dirty.value // boolean\n *\n * // 响应式操作中状态\n * field.pending.value // boolean\n *\n * // 写入值\n * field.setValue('new value')\n *\n * // 校验\n * const result = await field.validate()\n * ```\n */\nexport const useField = <TValues extends Values = Values>(\n name: NamePath<TValues>\n): FieldInstance<TValues> => {\n const form = useFormContext<TValues>()\n\n const key = name\n\n let formCache = fieldHookCache.get(form)\n\n if (!formCache) {\n formCache = new Map()\n fieldHookCache.set(form, formCache)\n }\n\n const cachedEntry = formCache.get(key) as FieldHookCacheEntry<TValues> | undefined\n\n let activeEntry: FieldHookCacheEntry<TValues>\n\n if (cachedEntry) {\n cachedEntry.refCount++\n activeEntry = cachedEntry\n } else {\n const { result, dispose } = createFieldHook<TValues>(form, name)\n\n activeEntry = {\n refCount: 1,\n result,\n dispose,\n }\n\n formCache.set(key, activeEntry as any)\n }\n\n onUnmounted(() => {\n if (--activeEntry.refCount <= 0) {\n activeEntry.dispose()\n formCache.delete(key)\n }\n })\n\n return activeEntry.result\n}\n\n/**\n * 向子组件树注入当前字段上下文。\n *\n * 应在 FormItem(或任何创建了 useField 的组件)的 setup 中调用。\n *\n * @param field - useField 返回的字段实例\n *\n * @example\n * ```typescript\n * // FormItem 中\n * const field = useField('date')\n * createFieldContext(field)\n *\n * ```\n */\nexport function createFieldContext<TValues extends Values = Values>(\n field: FieldInstance<TValues>\n): void {\n provide(FIELD_CONTEXT_KEY, field as FieldInstance)\n}\n\n/**\n * 从最近的 FormItem 获取当前字段上下文。\n *\n * 必须在 FormItem 的组件子树内调用,否则抛出错误。\n *\n * @returns useField 返回的字段实例\n *\n * @throws 当不在 FormItem 子树内时抛出\n *\n * @example\n * const field = useFieldContext()\n * field.error.value // string[] | undefined\n * field.getValue() // 当前字段值(Vue 响应式)\n */\nexport function useFieldContext(): ReturnType<typeof useField> {\n const field = inject(FIELD_CONTEXT_KEY)\n\n if (!field) {\n throw new Error(\"[schemx] useFieldContext() must be used inside a FormItem tree\")\n }\n\n return field\n}\n\nexport default useField\n","/**\n * useWatch - 监听字段变化(Vue 组合式 API 版本)\n *\n * 基于 core 层的 {@link createWatch} 实现,\n * 自动通过 `useFormContext` 获取 formContext,\n * 并在 `onUnmounted` 时自动取消监听,无需手动管理生命周期。\n *\n * 提供三种监听模式:\n * - 全局监听:`useWatch(callback, options?)` — 监听表单中任意字段变化\n * - 单字段监听:`useWatch(name, callback, options?)` — 监听指定字段变化\n * - 多字段监听:`useWatch(names, callback, options?)` — 监听一组字段变化\n *\n * 同时提供语义化的便捷方法:\n * - {@link useWatchField} — 单字段监听\n * - {@link useWatchFields} — 多字段监听\n * - {@link useWatchAll} — 全局监听\n *\n * @module hooks/useWatch\n *\n * @example\n * ```ts\n * // 全局监听\n * useWatch((snapshot) => {\n * console.log('form changed:', snapshot)\n * })\n *\n * // 单字段监听\n * useWatch('username', (current, prev) => {\n * console.log('username changed:', prev, '->', current)\n * }, { immediate: true })\n *\n * // 多字段监听\n * useWatch(['firstName', 'lastName'], (currentValues, prevValues) => {\n * console.log('name changed:', currentValues)\n * }, { inequality: true })\n * ```\n */\n\nimport { onUnmounted } from \"vue\"\n\nimport { createWatch } from \"@schemx/core\"\n\nimport { useFormContext } from \"./useForm\"\n\nimport type { NamePath, Values } from \"@schemx/core\"\nimport type {\n CreateWatchOptions,\n WatchAllCallback,\n WatchFieldCallback,\n WatchFieldsCallback,\n} from \"@schemx/core\"\n\n/**\n * 监听所有字段变化\n *\n * @param callback - 全局变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function useWatch<T extends Values>(\n callback: WatchAllCallback<T>,\n options?: CreateWatchOptions\n): () => void\n/**\n * 监听单个字段变化\n *\n * @param name - 字段路径\n * @param callback - 单字段变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function useWatch<T extends Values>(\n name: NamePath<T>,\n callback: WatchFieldCallback<T>,\n options?: CreateWatchOptions\n): () => void\n/**\n * 监听多个字段变化\n *\n * @param names - 字段路径数组\n * @param callback - 多字段变化回调\n * @param options - 监听选项\n * @returns 取消监听函数\n */\nexport function useWatch<T extends Values>(\n names: NamePath<T>[],\n callback: WatchFieldsCallback<T>,\n options?: CreateWatchOptions\n): () => void\n/**\n * useWatch 实现 — 获取 form 实例后委托给 core 层的 createWatch\n */\nexport function useWatch<T extends Values>(\n nameOrNamesOrCallback: NamePath<T> | NamePath<T>[] | WatchAllCallback<T>,\n callbackOrOptions?: WatchFieldCallback<T> | WatchFieldsCallback<T> | CreateWatchOptions,\n maybeOptions?: CreateWatchOptions\n): () => void {\n const form = useFormContext<T>()\n\n const dispose = (createWatch as any)(\n form,\n nameOrNamesOrCallback,\n callbackOrOptions,\n maybeOptions\n )\n\n onUnmounted(dispose)\n\n return dispose\n}\n\n/**\n * 监听单个字段变化的便捷方法\n *\n * 等价于 `useWatch(name, callback, options)`,语义更明确。\n * 自动绑定 formContext 并在组件卸载时取消监听。\n *\n * @param name - 要监听的字段路径\n * @param callback - 字段变化回调\n * @param options - 可选配置\n * @returns 取消监听函数\n */\nexport function useWatchField<T extends Values = Values>(\n name: NamePath<T>,\n callback: WatchFieldCallback<T>,\n options?: CreateWatchOptions\n): () => void {\n return useWatch<T>(name, callback, options)\n}\n\n/**\n * 监听多个字段变化的便捷方法\n *\n * 等价于 `useWatch(names, callback, options)`,语义更明确。\n * 自动绑定 formContext 并在组件卸载时取消监听。\n *\n * @param names - 要监听的字段路径数组\n * @param callback - 字段变化回调\n * @param options - 可选配置\n * @returns 取消监听函数\n */\nexport function useWatchFields<T extends Values>(\n names: NamePath<T>[],\n callback: WatchFieldsCallback<T>,\n options?: CreateWatchOptions\n): () => void {\n return useWatch<T>(names, callback, options)\n}\n\n/**\n * 监听所有字段变化的便捷方法\n *\n * 等价于 `useWatch(callback, options)`,语义更明确。\n * 自动绑定 formContext 并在组件卸载时取消监听。\n *\n * @param callback - 全局变化回调\n * @param options - 可选配置\n * @returns 取消监听函数\n */\nexport function useWatchAll<T extends Values = Values>(\n callback: WatchAllCallback<T>,\n options?: CreateWatchOptions\n): () => void {\n return useWatch(callback, options)\n}\n\nexport default useWatch\n","/**\n * useEffect - Vue 组合式 API 版本的 Signal effect\n *\n * 封装 `@schemx/core` 的 `createEffect`,在组件卸载时自动 dispose,\n * 无需手动管理生命周期。\n *\n * @module hooks/useEffect\n *\n * @example\n * ```ts\n * import { useEffect } from '@schemx/vue'\n *\n * // 在 setup 中使用\n * useEffect(() => {\n * const name = form.getFieldValue('name')\n * console.log('name:', name)\n *\n * return () => {\n * // 清理逻辑\n * }\n * })\n * ```\n */\n\nimport { onUnmounted } from \"vue\"\n\nimport { createEffect } from \"@schemx/core\"\n\nimport type { CreateEffectReturn, EffectCallback } from \"@schemx/core\"\n\n/**\n * 创建 Signal effect 并在组件卸载时自动取消。\n *\n * 在 effect 回调中访问任何 Signal 值时自动追踪依赖,\n * 依赖变化时自动重新执行回调。\n * 回调可返回一个清理函数,在 effect 重新执行前或被 dispose 时调用。\n *\n * @param callback - effect 回调函数,可选返回清理函数\n *\n * @returns 取消 effect 的 dispose 函数(通常无需手动调用,组件卸载时自动取消)\n *\n * @example\n * ```ts\n * // 监听字段值变化\n * useEffect(() => {\n * const name = form.getFieldValue('name')\n * console.log('name changed:', name)\n * })\n *\n * // 带清理函数\n * useEffect(() => {\n * const timer = setInterval(() => {\n * console.log('value:', form.getFieldValue('count'))\n * }, 1000)\n *\n * return () => clearInterval(timer)\n * })\n * ```\n */\nexport function useEffect(callback: EffectCallback): CreateEffectReturn {\n const dispose = createEffect(callback)\n\n onUnmounted(dispose)\n\n return dispose\n}\n\nexport default useEffect\n","/**\n * useDictionary - 字典选项 Hook\n *\n * 通过 api 函数加载字典选项,支持完整的表单值泛型推导。\n * 自动在组件挂载时加载,支持通过 dependsOn 声明依赖字段,\n * 当依赖字段变化时自动重新请求。\n *\n * @module hooks/useDictionary\n */\n\nimport { onMounted, Ref, ref } from \"vue\"\n\nimport type { SchemxDictionary } from \"@/types/dictionary\"\n\nimport { useFormContext } from \"./useForm\"\nimport { useWatchFields } from \"./useWatch\"\n\nimport type { NamePath, Values } from \"@schemx/core\"\n\n\nexport type { SchemxDictionary, SchemxWithDictionary } from \"@/types/dictionary\"\n\n/**\n * useDictionary 返回值\n */\nexport interface UseDictionaryReturn {\n /** 远程加载的字典选项列表(响应式) */\n list: Ref<any[]>\n /** 请求加载状态(响应式) */\n loading: Ref<boolean>\n /** 请求错误信息(响应式) */\n error: Ref<Error | undefined>\n /** 触发字典选项加载 */\n loadDict: () => Promise<void>\n /** 使用当前配置重新执行 api */\n refresh: () => Promise<void>\n /** 直接修改 list 的值,不触发 api 调用 */\n mutate: (data: any[]) => void\n}\n\n/**\n * @deprecated\n *\n * 已弃用,请使用 **UseDictionaryReturn**\n */\nexport type UseDictOptionsReturn = UseDictionaryReturn\n\n/**\n * 将未知抛出值规范化为 `Error` 实例\n *\n * @param err - 捕获的值(可能是任意类型)\n * @returns 包装原始值的 `Error` 对象\n */\nexport function normalizeError(err: unknown): Error {\n if (err instanceof Error) return err\n\n return new Error(String(err))\n}\n\n/**\n * 加载字典选项\n *\n * 通过 api 函数获取数据,支持完整的表单值泛型推导。\n * 自动在组件挂载时加载,支持依赖字段联动、竞态控制、\n * 重试、错误处理等能力。\n *\n * @typeParam TValues - 表单值类型\n * @param options - 字典配置选项\n * @param fieldName - 当前字段名,用于 resetOnDepsChange 时清空字段值\n * @returns 响应式选项列表、loading/error 状态及控制方法\n *\n * @example\n * ```ts\n * // 基础用法\n * const { list } = useDictionary({\n * api: async () => {\n * const res = await fetch('/api/options')\n * return res.json()\n * },\n * })\n *\n * // 依赖联动(带泛型)\n * const { list } = useDictionary<MyFormValues>({\n * api: async (values) => fetchCities(values.province),\n * dependsOn: ['province'],\n * shouldFetch: (values) => !!values.province,\n * resetOnDepsChange: true,\n * immediate: false,\n * }, 'city')\n * ```\n */\nexport const useDictionary = <\n TValues extends Values = Values,\n TName extends NamePath<TValues> = NamePath<TValues>,\n>(\n options: SchemxDictionary<TValues>,\n fieldName?: TName\n): UseDictionaryReturn => {\n const instance = useFormContext<TValues>()\n\n const list = ref<any[]>([])\n const loading = ref<boolean>(false)\n const error = ref<Error | undefined>(undefined)\n\n // 竞态控制:仅最新请求写入状态\n let requestCount = 0\n\n /**\n * 使用配置的 formatter 格式化原始响应数据\n */\n const format = async (res: any): Promise<any> => {\n if (typeof options?.formatter === \"function\") {\n return await options.formatter(res, instance)\n }\n\n return res\n }\n\n /**\n * 带重试的执行\n */\n const executeWithRetry = async (formValues: TValues): Promise<any> => {\n const maxRetries = options.retryCount ?? 0\n const retryDelay = options.retryInterval ?? 1000\n let lastError: Error = new Error(\"Unknown error\")\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await options.api(formValues, instance)\n } catch (err) {\n lastError = normalizeError(err)\n\n if (attempt < maxRetries) {\n await new Promise((r) => setTimeout(r, retryDelay))\n }\n }\n }\n\n throw lastError\n }\n\n /**\n * 执行 api 函数加载字典选项\n */\n const loadDict = async (): Promise<void> => {\n try {\n const formValues = instance.getFieldsValue()\n\n // shouldFetch 检查\n if (typeof options.shouldFetch === \"function\" && !options.shouldFetch(formValues)) {\n list.value = []\n loading.value = false\n\n return\n }\n\n loading.value = true\n error.value = undefined\n\n // 递增请求计数器用于竞态控制\n const currentCount = ++requestCount\n\n const res = await executeWithRetry(formValues)\n\n // 竞态检查:丢弃过期响应\n if (currentCount !== requestCount) return\n\n const formatted = await format(res)\n\n // 格式化后再次竞态检查(格式化可能是异步的)\n if (currentCount !== requestCount) return\n\n list.value = formatted\n error.value = undefined\n\n // onSuccess 回调\n if (typeof options.onSuccess === \"function\") {\n options.onSuccess(formatted, instance)\n }\n\n loading.value = false\n } catch (err) {\n const normalized = normalizeError(err)\n\n error.value = normalized\n list.value = []\n loading.value = false\n\n if (typeof options.onError === \"function\") {\n options.onError(normalized, instance)\n }\n }\n }\n\n const refresh = (): Promise<void> => loadDict()\n\n const mutate = (data: any[]): void => {\n list.value = data\n }\n\n // ========== 依赖字段监听 ==========\n if (options.dependsOn?.length) {\n useWatchFields(options.dependsOn, (_payload, latestSnapshot) => {\n // 1. 触发 onDepsChange 回调\n if (typeof options.onDepsChange === \"function\") {\n options.onDepsChange(latestSnapshot as TValues, instance)\n }\n\n // 2. 清空当前字段值\n if (options.resetOnDepsChange && fieldName) {\n instance.setFieldValue(fieldName, undefined)\n }\n\n // 3. 重新执行 api\n void loadDict()\n })\n }\n\n // ========== 挂载行为 ==========\n const immediate = options.immediate ?? true\n\n onMounted(() => {\n if (immediate) {\n void loadDict()\n }\n })\n\n return { list, loading, error, loadDict, refresh, mutate }\n}\n\nexport default useDictionary\n","/**\n * useConfigContext - 表单上下文 Hook\n *\n * 提供表单上下文的创建与消费能力。\n * schemx 通过 createConfigContext 注入全局配置,\n * 子组件通过 useConfigContext 获取。\n *\n * @module hooks/useContext\n */\n\nimport { inject, provide } from \"vue\"\n\nimport type { SchemxFormProps } from \"../types\"\nimport type { Values } from \"@schemx/core\"\n\n/** FormContext 注入 key */\nexport const FORM_CONTEXT_KEY = Symbol(\"FormContext\")\n\n/**\n * 表单上下文属性\n *\n * 由 schemx 组件注入,包含表单级别的全局配置。\n *\n * @typeParam T - 表单值类型\n */\nexport interface FormContextProps<T extends Values = Values> extends Omit<\n SchemxFormProps<T>,\n | \"form\"\n | \"modelValue\"\n | \"rendererRegistry\"\n | \"defaultRendererType\"\n | \"rulesRegistery\"\n | \"onFinish\"\n | \"onFinishFailed\"\n | \"onValuesChange\"\n | \"onFieldsChange\"\n> {}\n\n/**\n * 创建并注入表单上下文\n *\n * 在 schemx 的 setup 中调用,将表单级别配置注入到子组件树中。\n *\n * @typeParam T - 表单值类型\n * @param props - 表单上下文属性\n */\nexport const createConfigContext = <T extends Values = Values>(\n props: FormContextProps<T>\n) => {\n provide<FormContextProps<T>>(FORM_CONTEXT_KEY, props)\n}\n\n/**\n * @deprecated\n *\n * 已弃用,请使用 **createConfigContext**\n */\nexport const createContext = createConfigContext\n\n/**\n * 获取表单上下文配置\n *\n * 在子组件中获取 schemx 注入的全局配置(readonly、disabled、labelAlign 等)。\n *\n * @returns 表单上下文属性\n *\n * @throws Error 如果不在 schemx 提供的上下文中调用\n *\n * @example\n * ```ts\n * const context = useConfigContext()\n * console.log(context.readonly, context.disabled)\n * ```\n */\nexport function useConfigContext(): FormContextProps {\n const context = inject<FormContextProps>(FORM_CONTEXT_KEY)\n\n if (!context) {\n throw new Error(\"useConfigContext must be used within a Form\")\n }\n\n return context\n}\n\n/**\n * @deprecated\n *\n * 已弃用,请使用 **useConfigContext**\n */\nexport const useContext = useConfigContext\n","/**\n * 对象浅比较工具\n *\n * @module utils/equal\n */\n\n/**\n * 浅比较两个对象的自有属性值是否相同。\n *\n * 用于避免 computed / shallowRef 每次返回新对象引用导致子组件不必要的更新。\n * 仅比较第一层属性,函数引用通过 === 判断。\n *\n * @param a - 旧对象\n * @param b - 新对象\n *\n * @returns 两个对象浅相等时返回 true\n *\n * @example\n * shallowEqual({ a: 1, b: 2 }, { a: 1, b: 2 }) // => true\n * shallowEqual({ a: 1 }, { a: 1, b: 2 }) // => false\n */\nexport const isShallowEqual = (\n a: Record<string, any>,\n b: Record<string, any>\n): boolean => {\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n\n return keysA.every((key) => a[key] === b[key])\n}\n","/**\n * useStableRef - 引用稳定化的 shallowRef\n *\n * 封装 `shallowRef` + `watchEffect` + `isShallowEqual`,\n * 仅在工厂函数返回值与当前值浅不相等时才更新引用,\n * 避免下游组件因对象引用变化而不必要地重渲染。\n *\n * @module hooks/useStableRef\n *\n * @example\n * ```ts\n * import { useStableRef } from '@schemx/vue'\n *\n * const stableProps = useStableRef(() => ({\n * visible: visible.value,\n * disabled: disabled.value,\n * value: field.getValue(),\n * }))\n * ```\n */\n\nimport { type ShallowRef, shallowRef, watchEffect } from \"vue\"\n\nimport { isShallowEqual } from \"../utils/equal\"\n\n/**\n * 创建一个引用稳定的 shallowRef。\n *\n * 在 watchEffect 中执行工厂函数,自动追踪响应式依赖。\n * 仅当新旧值浅比较不相等时才替换 `.value`,保持引用稳定。\n *\n * @typeParam T - 对象类型\n *\n * @param factory - 返回目标对象的工厂函数,在 watchEffect 内执行\n *\n * @returns 只读的 ShallowRef,引用仅在属性值真正变化时更新\n *\n * @example\n * ```ts\n * const props = useStableRef(() => ({\n * value: field.getValue(),\n * onChange: handleChange,\n * }))\n *\n * // props.value 的引用在属性值未变时保持不变\n * h(Component, props.value)\n * ```\n */\nexport function useStableRef<T extends Record<string, any>>(\n factory: () => T\n): Readonly<ShallowRef<T>> {\n const stableRef = shallowRef({} as T) as ShallowRef<T>\n\n watchEffect(() => {\n const next = factory()\n\n if (!isShallowEqual(stableRef.value, next)) {\n stableRef.value = next\n }\n })\n\n return stableRef\n}\n\nexport default useStableRef\n","/**\n * useViewSchemas - Vue ViewSchemas bridge.\n *\n * @module hooks/useViewSchemas\n */\n\nimport { onScopeDispose, shallowRef } from \"vue\"\nimport type { ShallowRef } from \"vue\"\n\nimport type { SchemxInstance, SchemxViewSchema, Values } from \"@schemx/core\"\n\nexport function useViewSchemas<T extends Values = Values>(\n form: SchemxInstance<T>\n): ShallowRef<readonly SchemxViewSchema<T>[]> {\n const viewSchemas = shallowRef<readonly SchemxViewSchema<T>[]>(form.getViewSchemas())\n\n const unsubscribe = form.subscribeViewSchemas((nextSchemas) => {\n viewSchemas.value = nextSchemas\n })\n\n onScopeDispose(unsubscribe)\n\n return viewSchemas\n}\n\nexport default useViewSchemas\n","/**\n * 校验触发工具\n *\n * 提供校验触发时机的合并、归一化和匹配判断功能。\n *\n * @module utils/validation\n */\n\nimport type { ValidationTrigger } from \"@schemx/core\"\n\n/** 触发时机类型(支持单个或数组) */\nexport type TriggerConfig = ValidationTrigger | ValidationTrigger[]\n\n/** 归一化后的触发类型 */\nexport type NormalizedTrigger = \"blur\" | \"change\" | \"submit\"\n\n/**\n * 判断触发时机配置是否有效。\n *\n * undefined 和空数组视为无效,其余值(包括单个字符串、非空数组)视为有效。\n *\n * @param v - 触发时机配置\n *\n * @returns 配置有效时返回 true\n */\nfunction isValidTrigger(v: TriggerConfig | undefined): v is TriggerConfig {\n if (v === undefined) return false\n if (Array.isArray(v) && v.length === 0) return false\n\n return true\n}\n\n/**\n * 合并校验触发时机配置。\n *\n * 按优先级从高到低取值:列级配置 > 表单上下文配置 > 默认值。\n * 跳过 undefined 和空数组,确保空数组不会意外覆盖后续配置。\n *\n * @param columnTrigger - 列级配置的触发时机\n * @param contextTrigger - 表单上下文配置的触发时机\n * @param defaultTrigger - 兜底默认值\n *\n * @returns 最终生效的触发时机\n *\n * @example\n * mergeTrigger(\"onBlur\", \"onChange\", \"onSubmit\") // => \"onBlur\"\n * mergeTrigger(undefined, \"onChange\", \"onSubmit\") // => \"onChange\"\n * mergeTrigger([], \"onChange\", \"onSubmit\") // => \"onChange\"\n * mergeTrigger(undefined, undefined, \"onSubmit\") // => \"onSubmit\"\n */\nexport function mergeTrigger(\n columnTrigger: TriggerConfig | undefined,\n contextTrigger: TriggerConfig | undefined,\n defaultTrigger: TriggerConfig\n): TriggerConfig {\n if (isValidTrigger(columnTrigger)) return columnTrigger\n\n if (isValidTrigger(contextTrigger)) return contextTrigger\n\n return defaultTrigger\n}\n\n/**\n * 归一化触发类型字符串。\n *\n * 将带 `on` 前缀的格式统一为短格式:\n * `\"onBlur\"` → `\"blur\"`、`\"onChange\"` → `\"change\"`、`\"onSubmit\"` → `\"submit\"`。\n *\n * @param t - 原始触发类型\n *\n * @returns 归一化后的触发类型\n */\nfunction normalizeTrigger(t: ValidationTrigger): NormalizedTrigger {\n const map: Record<ValidationTrigger, NormalizedTrigger> = {\n onBlur: \"blur\",\n onChange: \"change\",\n onSubmit: \"submit\",\n blur: \"blur\",\n change: \"change\",\n submit: \"submit\",\n }\n\n return map[t] ?? \"submit\"\n}\n\n/**\n * 判断当前事件是否应该触发校验。\n *\n * 将配置的触发时机归一化后,与当前事件类型进行匹配。\n *\n * @param event - 当前触发的事件类型\n * @param trigger - 配置的触发时机(支持单个或数组)\n *\n * @returns 是否应该触发校验\n *\n * @example\n * shouldValidateOn(\"change\", \"onChange\") // => true\n * shouldValidateOn(\"blur\", [\"onBlur\", \"onChange\"]) // => true\n * shouldValidateOn(\"change\", \"onSubmit\") // => false\n * shouldValidateOn(\"change\", undefined) // => false\n */\nexport function shouldValidateOn(\n event: NormalizedTrigger,\n trigger?: TriggerConfig\n): boolean {\n if (!trigger) return false\n const triggers = Array.isArray(trigger) ? trigger : [trigger]\n\n return triggers.some((t) => normalizeTrigger(t) === event)\n}\n","/**\n * 插槽解析与子插槽提取工具。\n *\n * 提供 camelCase / kebab-case 双向查找插槽,\n * 以及按字段名前缀提取子渲染器插槽。\n *\n * @module utils/slot\n */\n\n/**\n * 检查字符串是否包含大写字母(驼峰格式特征)。\n *\n * @param str - 待检测的字符串\n * @returns 是否包含大写字母\n */\nconst isCamelCase = (str: string): boolean => /[A-Z]/.test(str)\n\n/**\n * 检查字符串是否包含连字符(kebab-case 特征)。\n *\n * @param str - 待检测的字符串\n * @returns 是否包含连字符\n */\nconst isKebabCase = (str: string): boolean => str.includes(\"-\")\n\n/**\n * 将驼峰命名转换为连字符命名(kebab-case)。\n *\n * @param str - 驼峰格式的字符串\n * @returns 转换后的 kebab-case 字符串\n */\nconst camelToKebab = (str: string): string => {\n return str.replace(/([A-Z])/g, \"-$1\").toLowerCase()\n}\n\n/**\n * 将连字符命名转换为驼峰命名(camelCase)。\n *\n * @param str - kebab-case 格式的字符串\n * @returns 转换后的 camelCase 字符串\n */\nconst kebabToCamel = (str: string): string => {\n return str.replace(/-([a-z])/g, (_match, letter) => letter.toUpperCase())\n}\n\n/**\n * 将命名格式归一化为 kebab-case。\n *\n * @param str - 任意命名格式的字符串\n * @returns kebab-case 格式的字符串\n */\nconst normalizeToKebab = (str: string): string => {\n if (isCamelCase(str)) return camelToKebab(str)\n\n return str\n}\n\n/**\n * 将命名格式归一化为 camelCase。\n *\n * @param str - 任意命名格式的字符串\n * @returns camelCase 格式的字符串\n */\nconst normalizeToCamel = (str: string): string => {\n if (isKebabCase(str)) return kebabToCamel(str)\n\n return str\n}\n\n/**\n * 从插槽对象中按名称查找插槽,同时支持 camelCase 和 kebab-case。\n *\n * 优先查找原始名称,未找到时尝试另一种命名格式。\n * 例如传入 `userName` 时,先查 `userName`,再查 `user-name`;\n * 传入 `user-name` 时,先查 `user-name`,再查 `userName`。\n *\n * @param slots - Vue 插槽对象\n * @param name - 插槽名称(camelCase 或 kebab-case)\n *\n * @returns 匹配的插槽函数,未找到返回 undefined\n *\n * @example\n * ```typescript\n * // slots 中定义了 'user-name' 插槽\n * resolveSlot(slots, 'userName') // => 找到 'user-name' 插槽\n * resolveSlot(slots, 'user-name') // => 找到 'user-name' 插槽\n * ```\n */\nexport const resolveSlot = (\n slots: Record<string, any>,\n name: string\n): ((...args: any[]) => any) | undefined => {\n if (slots[name]) return slots[name]\n\n const alt = isCamelCase(name)\n ? camelToKebab(name)\n : isKebabCase(name)\n ? kebabToCamel(name)\n : undefined\n\n if (alt && slots[alt]) return slots[alt]\n\n return undefined\n}\n\n/**\n * 从父级插槽中提取子渲染器插槽。\n *\n * 按 `fieldName:slotName` 和 `fieldName:slot-name` 格式匹配,\n * 提取后去掉前缀作为子渲染器的插槽名。\n * 同时支持 camelCase 和 kebab-case 的 fieldName。\n *\n * @param fieldName - 字段名\n * @param allSlots - 父级全部插槽\n *\n * @returns 子渲染器的插槽对象\n *\n * @example\n * ```typescript\n * // 父级插槽: { 'userName:prefix': fn, 'userName:suffix': fn, 'userNameLabel': fn }\n * extractChildSlots('userName', slots)\n * // => { prefix: fn, suffix: fn }\n * ```\n */\nexport const extractChildSlots = (\n fieldName: string,\n allSlots: Record<string, any>\n): Record<string, any> => {\n const result: Record<string, any> = {}\n const camelPrefix = normalizeToCamel(String(fieldName)) + \":\"\n const kebabPrefix = normalizeToKebab(String(fieldName)) + \":\"\n\n for (const [key, value] of Object.entries(allSlots)) {\n if (key.startsWith(camelPrefix)) {\n result[key.slice(camelPrefix.length)] = value\n } else if (key.startsWith(kebabPrefix) && kebabPrefix !== camelPrefix) {\n result[key.slice(kebabPrefix.length)] = value\n }\n }\n\n return result\n}\n","/**\n * FormGroup - 分组字段组件\n *\n * 用于渲染 componentType 为 \"group\" 的分组字段配置。\n * 支持可折叠的分组容器,内部渲染子 columns。\n *\n * @module components/FormGroup\n */\n\nimport { defineComponent, PropType, ref } from \"vue\"\nimport type { SetupContext, VNodeChild } from \"vue\"\n\nimport classnames from \"classnames\"\n\nimport FormItem from \"../FormItem\"\n\nimport type { SchemxViewGroupSchema, SchemxViewSchema, Values } from \"@schemx/core\"\n\n/**\n * FormGroup Props\n *\n * @typeParam T - 表单值类型\n */\nexport interface SchemxGroupProps<T extends Values = Values> {\n schema: SchemxViewGroupSchema<T>\n}\n\nconst FormGroup = defineComponent(\n <T extends Values = Values>(props: SchemxGroupProps<T>, { slots }: SetupContext) => {\n const collapsed = ref(Boolean(props.schema.defaultCollapsed))\n\n const toggle = () => {\n if (props.schema.collapsible) {\n collapsed.value = !collapsed.value\n }\n }\n\n return (): VNodeChild => {\n const schema = props.schema\n const collapsible = Boolean(schema.collapsible)\n\n return (\n <div\n class={classnames(\n \"schemx-group\",\n { \"schemx-group--collapsed\": collapsed.value },\n schema.class as string | undefined\n )}\n data-key={schema.key}\n >\n {schema.label && (\n <div\n role={collapsible ? \"button\" : undefined}\n tabindex={collapsible ? 0 : undefined}\n class={classnames(\"schemx-group__header\", {\n \"schemx-group__header--clickable\": collapsible,\n })}\n onClick={toggle}\n onKeydown={(e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n toggle()\n }\n }}\n >\n <span class=\"schemx-group__title\">{schema.label}</span>\n {collapsible && (\n <span\n class={classnames(\"schemx-group__arrow\", {\n \"schemx-group__arrow--down\": !collapsed.value,\n })}\n />\n )}\n </div>\n )}\n {!collapsed.value && (\n <div class=\"schemx-group__body\">\n {schema.children.map((child) => (\n <FormItem\n key={child.key}\n schema={child as SchemxViewSchema}\n v-slots={slots}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n },\n {\n name: \"SchemxGroup\",\n\n props: {\n schema: {\n type: Object as PropType<SchemxViewGroupSchema>,\n required: true,\n },\n },\n }\n)\n\nexport default FormGroup\n","/**\n * FormItem\n *\n * schemx 和 FormGroup 实际渲染字段的组件。\n * 动态属性已由 core 解析到 ViewSchema 中;这里只负责消费\n * 已解析 schema、创建字段实例、组装渲染器属性与插槽。\n *\n * @module components/FormItem\n */\n\nimport { computed, defineComponent, h, PropType, toRef } from \"vue\"\nimport type { SetupContext, VNodeChild } from \"vue\"\n\nimport classnames from \"classnames\"\n\nimport {\n createFieldContext,\n useConfigContext,\n useField,\n useFormContext,\n useStableRef,\n} from \"@/hooks\"\nimport { extractChildSlots, mergeTrigger, resolveSlot, shouldValidateOn } from \"@/utils\"\nimport type { TriggerConfig } from \"@/utils\"\n\nimport FormGroup from \"../FormGroup\"\n\nimport type {\n FieldValue,\n NamePath,\n SchemxComponentProps,\n SchemxViewFieldSchema,\n SchemxViewGroupSchema,\n SchemxViewSchema,\n Values,\n} from \"@schemx/core\"\n\n/**\n * FormItem 属性。\n *\n * @typeParam T - 表单值类型\n */\nexport interface SchemxItemProps<T extends Values = Values> {\n schema: SchemxViewSchema<T>\n}\n\nconst FormItem = defineComponent(\n <T extends Values = Values>(props: SchemxItemProps<T>, { slots }: SetupContext) => {\n const schemaRef = toRef(props, \"schema\")\n\n if (isViewGroupSchema(schemaRef.value)) {\n return (): VNodeChild => {\n return h(FormGroup, { schema: schemaRef.value as SchemxViewGroupSchema }, slots)\n }\n }\n\n const form = useFormContext<T>()\n const formContext = useConfigContext()\n\n const schema = (): SchemxViewFieldSchema<T> =>\n schemaRef.value as SchemxViewFieldSchema<T>\n\n const field = useField(schema().name)\n\n createFieldContext(field)\n\n const trigger = computed<TriggerConfig>(() =>\n mergeTrigger(schema().validationTrigger, formContext.validationTrigger, \"onChange\")\n )\n\n /**\n * 是否需要进行校验。\n *\n * 当字段不可见、详情展示、只读或禁用时,无需进行校验。\n */\n const canVerified = computed(() => {\n const isOperate = schema().visible && !schema().readonly && !schema().disabled\n\n const rules = schema().rules\n\n const hasRules = Array.isArray(rules) ? rules?.length > 0 : !!schema().rules\n\n return isOperate && hasRules\n })\n\n /** 值变化处理,设置值后根据触发时机决定是否校验 */\n const handleChange = (v: FieldValue<T, NamePath<T>>) => {\n field.setValue(v)\n schema().componentProps?.onChange?.(v)\n\n if (canVerified.value && shouldValidateOn(\"change\", trigger.value)) {\n field.validate()\n }\n }\n\n /** 失焦处理,根据触发时机决定是否校验 */\n const handleBlur = () => {\n // schema().componentProps?.onBlur?.()\n\n if (canVerified.value && shouldValidateOn(\"blur\", trigger.value)) {\n field.validate()\n }\n }\n\n // 使用 useStableRef 避免每次生成新对象引用\n const componentProps = useStableRef<SchemxComponentProps<T>>(\n (): SchemxComponentProps<T> => ({\n ...schema().componentProps,\n value: field.getValue(),\n onChange: handleChange,\n onBlur: handleBlur,\n \"onUpdate:value\": (v) => field.setValue(v),\n })\n )\n\n /**\n * 渲染 required 星号。\n *\n * 当字段为必填且非详情展示/禁用/只读状态时,在 label 前显示红色星号标记。\n *\n * @returns 星号 VNode 或空片段\n */\n const renderRequired = (): VNodeChild => {\n if (!schema().required || schema().disabled || schema().readonly) {\n return null\n }\n\n return <span class=\"schemx-item__required\">*</span>\n }\n\n /**\n * 渲染 formItem label 区域。\n *\n * 优先使用 `{name}Label` 插槽(支持 camelCase / kebab-case),\n * 未提供时渲染默认 label(含 required 星号、label 文本、冒号)。\n *\n * @returns label VNode\n */\n const renderLabel = (): VNodeChild => {\n const labelSlot = resolveSlot(slots, `${schema().name}Label`)\n\n if (labelSlot) {\n return labelSlot(schema())\n }\n\n const labelAlign = schema().labelAlign || formContext.labelAlign\n const labelWidth = schema().labelWidth || formContext.labelWidth\n const colon = schema().colon ?? formContext.colon\n\n return (\n <label\n class=\"schemx-item__label\"\n style={{ width: labelWidth, textAlign: labelAlign }}\n >\n {renderRequired()}\n <span class=\"schemx-item__label-text\">\n {schema().label}\n {colon ? \":\" : \"\"}\n </span>\n </label>\n )\n }\n\n /**\n * 渲染 formItem content 区域(仅控件)。\n *\n * 优先使用 `{name}Content` 插槽(支持 camelCase / kebab-case),\n * 插槽参数包含 formItemProps 和 columnElement(渲染器 VNode)。\n * 未提供插槽时,渲染默认控件布局。\n *\n * @returns content VNode\n */\n const renderContent = (): VNodeChild => {\n const component = form.getRenderer(schema().componentType)\n\n if (!component) {\n throw new Error(\n `[schemx] Can not find component renderer of \"${schema().componentType}\".`\n )\n }\n\n // 提取子渲染器插槽(fieldName:slotName 格式)\n const childSlots = extractChildSlots(normalizeNameKey(schema().name), slots)\n const columnElement = h(component, componentProps.value, childSlots)\n\n const contentSlot = resolveSlot(slots, `${schema().name}Content`)\n\n if (contentSlot) {\n return contentSlot({\n ...schema(),\n columnElement,\n })\n }\n\n return <div class=\"schemx-item__control\">{columnElement}</div>\n }\n\n /**\n * 渲染 formItem error 区域。\n *\n * 优先使用 `{name}Error` 插槽(支持 camelCase / kebab-case),\n * 插槽参数包含 formItemProps 和 errors 数组。\n * 未提供插槽时,仅在存在错误时显示第一条错误信息。\n *\n * @returns error VNode 或 null\n */\n const renderError = (): VNodeChild => {\n const errorSlot = resolveSlot(slots, `${schema().name}Error`)\n\n if (errorSlot) {\n return errorSlot({\n ...schema(),\n errors: field.error.value,\n })\n }\n\n if (!Array.isArray(field.error.value) || field.error.value.length === 0) {\n return null\n }\n\n return <div class=\"schemx-item__error\">{field.error.value[0]}</div>\n }\n\n return (): VNodeChild => {\n if (!schema().visible) {\n return null\n }\n\n // 整体插槽:完全接管渲染,不包裹任何默认结构\n const itemSlot = resolveSlot(slots, normalizeNameKey(schema().name))\n\n if (itemSlot) {\n return itemSlot(schema())\n }\n\n const labelPosition = schema().labelPosition || formContext.labelPosition\n\n return (\n <div class={classnames(\"schemx-item-wrapper\")}>\n <div\n class={classnames(\n \"schemx-item\",\n `schemx-item--label-${labelPosition}`,\n schema().class,\n {\n \"is-readonly\": schema().readonly,\n \"is-disabled\": schema().disabled,\n }\n )}\n style={{ ...(schema().style ?? {}) }}\n >\n {renderLabel()}\n\n <div class=\"schemx-item__content\">\n {renderContent()}\n {renderError()}\n </div>\n </div>\n </div>\n )\n }\n },\n {\n name: \"SchemxItem\",\n\n props: {\n schema: {\n type: Object as PropType<SchemxViewSchema>,\n required: true,\n },\n },\n }\n)\n\nexport default FormItem\n\nconst isViewGroupSchema = <T extends Values>(\n schema: SchemxViewSchema<T>\n): schema is SchemxViewGroupSchema<T> => {\n return schema.componentType === \"group\"\n}\n\nconst normalizeNameKey = (name: unknown): string => {\n if (Array.isArray(name)) {\n return name.map((part) => String(part)).join(\".\")\n }\n\n return String(name)\n}\n","import { SchemxViewSchema } from \"@schemx/core\"\n\n/**\n * 判断当前项是否为顶层可见普通字段中的第一个或最后一个。\n *\n * `group` 和不可见字段不参与顶层卡片圆角判断。\n *\n * 使用示例:\n *\n * const list = [\n * { key: 'group-1', type: 'group' },\n * { key: 'a' },\n * { key: 'b' },\n * { key: 'group-2', type: 'group' },\n * { key: 'c' },\n * ]\n *\n * getSectionPosition(list, 'a')\n * // => { found: true, isFirst: true, isLast: false }\n */\nexport function getSectionPosition<T extends SchemxViewSchema>(\n list: T[],\n currentKey: string\n) {\n const currentIndex = list.findIndex((item) => item.key === currentKey)\n\n if (currentIndex === -1) {\n return {\n found: false,\n isFirst: false,\n isLast: false,\n }\n }\n\n const currentItem = list[currentIndex]\n\n if (!isPositionItem(currentItem)) {\n return {\n found: true,\n isFirst: false,\n isLast: false,\n }\n }\n\n const prevItem = findPositionItem(list, currentIndex, -1)\n const nextItem = findPositionItem(list, currentIndex, 1)\n\n return {\n found: true,\n isFirst: !prevItem,\n isLast: !nextItem,\n }\n}\n\n/**\n * 判断当前项是否参与顶层首尾样式计算。\n */\nfunction isPositionItem<T extends SchemxViewSchema>(item?: T) {\n return (\n !!item &&\n item.componentType !== \"group\" &&\n (!(\"visible\" in item) || item.visible !== false)\n )\n}\n\nfunction findPositionItem<T extends SchemxViewSchema>(\n list: T[],\n startIndex: number,\n step: 1 | -1\n) {\n for (let index = startIndex + step; index >= 0 && index < list.length; index += step) {\n if (isPositionItem(list[index])) {\n return list[index]\n }\n }\n\n return undefined\n}\n","<!--\n schemx - 主组件\n\n 基于 Schema 配置的表单组件,使用 useForm Hook 管理状态。\n\n @module schemx\n-->\n\n<script lang=\"ts\" setup generic=\"T extends Values = Values\">\n import { watch, watchEffect } from \"vue\"\n\n import { omit } from \"es-toolkit\"\n\n import FormItem from \"./components/FormItem\"\n import { createConfigContext, useForm, useViewSchemas } from \"./hooks\"\n import { getSectionPosition } from \"./utils/helpers\"\n\n import type { SchemxFormProps } from \"./types/index\"\n import type { SchemxViewSchema, Values } from \"@schemx/core\"\n\n import \"./styles/index.css\"\n\n defineOptions({ name: \"SchemxForm\" })\n\n const props = withDefaults(defineProps<SchemxFormProps<T>>(), {\n modelValue: () => ({}) as T,\n initialValues: () => ({}) as T,\n form: undefined,\n schemas: () => [],\n class: \"\",\n style: () => ({}),\n onFinish: undefined,\n onFinishFailed: undefined,\n onValuesChange: undefined,\n onFieldsChange: undefined,\n rendererRegistry: undefined,\n validatorRegistry: undefined,\n })\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: T]\n }>()\n\n /**\n * 创建 FormContext 上下文\n *\n * 为子组件提供表单配置信息。\n */\n createConfigContext(\n omit(props, [\n \"form\",\n \"modelValue\",\n \"rendererRegistry\",\n \"defaultRendererType\",\n \"validatorRegistry\",\n \"onFinish\",\n \"onFinishFailed\",\n \"onValuesChange\",\n \"onFieldsChange\",\n ])\n )\n\n /**\n * 获取或创建表单实例\n *\n * 优先使用外部传入的 form,否则内部通过 useForm 创建。\n * 必须在 setup 同步阶段调用,确保 provide 正确注入。\n */\n const form = props.form\n ? props.form\n : useForm<T>({\n schemas: props.schemas,\n initialValues: props.initialValues,\n rendererRegistry: props.rendererRegistry,\n defaultRendererType: props.defaultRendererType,\n validatorRegistry: props.validatorRegistry,\n\n readonly: props.readonly,\n disabled: props.disabled,\n\n onFinish: async (values) => {\n props.onFinish?.(values)\n },\n onFinishFailed: async (errors) => {\n props.onFinishFailed?.(errors)\n },\n onValuesChange: (changedValues, latestSnapshot) => {\n emit(\"update:modelValue\", latestSnapshot as T)\n props.onValuesChange?.(changedValues, latestSnapshot)\n },\n onFieldsChange: (changedPaths, allPaths) => {\n props.onFieldsChange?.(changedPaths, allPaths)\n },\n })\n\n watch(\n () => props.schemas,\n (schemas) => {\n form.setSchemas(schemas)\n },\n { deep: false, immediate: !!props.form }\n )\n\n const viewSchemas = useViewSchemas(form)\n\n const getFormItemClass = (schema: SchemxViewSchema<T>) => {\n const { isFirst, isLast } = getSectionPosition(\n viewSchemas.value as SchemxViewSchema[],\n schema.key\n )\n\n return {\n \"schemx-item-wrapper--first\": isFirst,\n \"schemx-item-wrapper--last\": isLast,\n }\n }\n\n watchEffect(() => {\n form.updateDefaultProps(props)\n })\n\n defineExpose({\n ...form,\n })\n</script>\n\n<template>\n <div :class=\"['schemx', props.class]\">\n <FormItem\n v-for=\"schema in viewSchemas\"\n :key=\"schema.key\"\n :schema=\"schema as SchemxViewSchema\"\n :class=\"getFormItemClass(schema as SchemxViewSchema<T>)\"\n >\n <template v-for=\"(_, slotName) in $slots\" #[slotName]=\"slotProps\">\n <slot :name=\"slotName\" v-bind=\"slotProps ?? {}\" />\n </template>\n </FormItem>\n </div>\n</template>\n","/**\n * schemx 组件导出\n *\n * 为 SchemxForm 组件挂载静态方法(install、FormItem、registerRequest 等),\n * 并作为默认导出。\n *\n * @module formExport\n */\n\nimport type { App, DefineComponent } from \"vue\"\n\nimport FormItem from \"./components/FormItem\"\nimport SchemxForm from \"./formRuntime.js\"\n\nimport type { SchemxFormProps } from \"./types\"\n\n/**\n * SchemxForm 插件安装选项\n *\n * 在 `app.use(SchemxForm, options)` 时传入,用于配置全局默认行为。\n *\n * @example\n * ```ts\n * import SchemxForm from '@schemx/vue'\n *\n * app.use(SchemxForm, {\n * request: (url) => fetch(url).then(r => r.json()),\n * })\n * ```\n */\nexport interface SchemxInstallOptions {}\n\n/**\n * 为组件挂载静态属性并保留原始类型\n *\n * @param comp - 原始组件\n * @param extra - 要挂载的静态属性\n */\nexport function withInstall<T extends object, E extends Record<string, unknown>>(\n comp: T,\n extra: E\n) {\n return Object.assign(comp, extra) as T & E\n}\n\nexport type SchemxFormPlugin = DefineComponent<SchemxFormProps> & {\n install: (app: App, options?: SchemxInstallOptions) => void\n FormItem: typeof FormItem\n}\n\nconst SchemxFormExport = withInstall(SchemxForm, {\n /** Vue 插件安装方法 */\n install(app: App, _options?: SchemxInstallOptions) {\n app.component(\"SchemxForm\", SchemxForm)\n },\n /** FormItem 子组件引用 */\n FormItem,\n}) as unknown as SchemxFormPlugin\n\nexport default SchemxFormExport\n","/**\n * WithRemoteOptions - 选项高阶组件\n *\n * 包装任意渲染器组件,自动注入 useDictionary 的选项加载能力。\n * 被包装组件会额外收到 options、loading 两个 props,\n * 无需自行调用 useDictionary。\n *\n * @module hocs/withRemoteOptions\n */\n\nimport { Component, computed, defineComponent, h, PropType, SetupContext } from \"vue\"\n\nimport type { SchemxDictionary } from \"@/types/dictionary\"\n\nimport { useDictionary } from \"../hooks/useDictionary\"\n\nimport type { NamePath } from \"@schemx/core\"\n\n\n/**\n * WithRemoteOptions 注入给被包装组件的额外 Props\n */\nexport interface RemoteOptionsInjectedProps {\n /** 加载的选项列表 */\n options: any[]\n /** 加载状态 */\n loading: boolean\n}\n\n/**\n * 选项高阶组件\n *\n * 包装一个渲染器组件,当 dict prop 存在时,\n * 调用 useDictionary 加载选项,并将结果作为 options prop 注入。\n *\n * 当组件自身已传入非空 options 且无 dict 时,优先使用静态 options。\n *\n * @param WrappedComponent - 被包装的渲染器组件\n * @returns 增强后的组件,自动具备选项加载能力\n *\n * @example\n * ```ts\n * import { WithRemoteOptions } from '@schemx/vue'\n * import MySelect from './MySelect.vue'\n *\n * const RemoteSelect = WithRemoteOptions(MySelect)\n *\n * // 在 schema 中使用\n * const schema = {\n * name: 'city',\n * label: '城市',\n * componentType: 'select',\n * componentProps: {\n * dict: {\n * api: async (values) => fetchCities(values.province),\n * dependsOn: ['province'],\n * shouldFetch: (values) => !!values.province,\n * resetOnDepsChange: true,\n * immediate: false,\n * },\n * },\n * }\n * ```\n */\nexport function WithRemoteOptions(WrappedComponent: Component) {\n return defineComponent({\n name: `WithRemoteOptions(${WrappedComponent.name || \"Anonymous\"})`,\n inheritAttrs: false,\n props: {\n dict: {\n type: Object as PropType<SchemxDictionary>,\n default: undefined,\n },\n fieldName: {\n type: [String, Array] as PropType<NamePath>,\n default: undefined,\n },\n },\n setup(props, { attrs, slots }: SetupContext) {\n // 仅在 dict 配置存在时调用 useDictionary\n const dictResult = props.dict ? useDictionary(props.dict, props.fieldName) : null\n\n const childrenProps = computed(() => {\n return {\n ...attrs,\n dict: props.dict,\n options: props.dict ? dictResult?.list.value : attrs.options,\n loading: props.dict ? dictResult?.loading.value : attrs.loading,\n }\n })\n\n return () => h(WrappedComponent, childrenProps.value, slots)\n },\n })\n}\n\nexport default WithRemoteOptions\n"],"names":["globalRendererRegistry","globalRulesRegistry","FormGroup","defineComponent","props","slots","collapsed","ref","Boolean","schema","defaultCollapsed","toggle","collapsible","value","_createVNode","classnames","class","key","label","undefined","e","preventDefault","children","map","child","FormItem","name","type","Object","required","schemaRef","toRef","isViewGroupSchema","h","form","useFormContext","formContext","useConfigContext","field","useField","createFieldContext","trigger","computed","mergeTrigger","validationTrigger","canVerified","isOperate","visible","readonly","disabled","rules","hasRules","Array","isArray","length","handleChange","v","setValue","componentProps","onChange","shouldValidateOn","validate","handleBlur","useStableRef","getValue","onBlur","renderRequired","_createTextVNode","renderLabel","labelSlot","resolveSlot","labelAlign","labelWidth","colon","width","textAlign","renderContent","component","getRenderer","componentType","Error","childSlots","extractChildSlots","normalizeNameKey","columnElement","contentSlot","renderError","errorSlot","errors","error","itemSlot","labelPosition","style","part","String","join","_createElementBlock","_normalizeClass","_Fragment","_renderList","_unref","_createBlock","$slots","_withCtx","_renderSlot","_mergeProps","SchemxForm"],"mappings":"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"}