@form-renderer/adapter-vue3
Version:
Vue3 adapter for FormEngine
2 lines (1 loc) • 32.8 kB
JavaScript
(function(i,r){typeof exports=="object"&&typeof module<"u"?r(exports,require("vue"),require("@form-renderer/engine")):typeof define=="function"&&define.amd?define(["exports","vue","@form-renderer/engine"],r):(i=typeof globalThis<"u"?globalThis:i||self,r(i.FormAdapter={},i.Vue,i.FormEngine))})(this,function(i,r,T){"use strict";var mt=Object.defineProperty;var pt=(i,r,T)=>r in i?mt(i,r,{enumerable:!0,configurable:!0,writable:!0,value:T}):i[r]=T;var B=(i,r,T)=>pt(i,typeof r!="symbol"?r+"":r,T);function pe(n,t){let e=null;return function(...a){e!==null&&clearTimeout(e),e=setTimeout(()=>{n(...a),e=null},t)}}function fe(n,t){let e=!1;return function(...a){e||(n(...a),e=!0,setTimeout(()=>{e=!1},t))}}function he(n="id"){return`${n}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}function ge(n){return n===""||n===null||n===void 0||Array.isArray(n)&&n.length===0}function $(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(n instanceof Array)return n.map(t=>$(t));if(n instanceof Object){const t={};for(const e in n)n.hasOwnProperty(e)&&(t[e]=$(n[e]));return t}return n}function z(n,...t){if(!t.length)return n;const e=t.shift();if(x(n)&&x(e))for(const o in e)x(e[o])?(n[o]||Object.assign(n,{[o]:{}}),z(n[o],e[o])):Object.assign(n,{[o]:e[o]});return z(n,...t)}function x(n){return n&&typeof n=="object"&&!Array.isArray(n)}function Z(n,t,e){const o=t.split(".");let a=n;for(const c of o)if(a=a?.[c],a===void 0)return e;return a}function N(n,t,e){const o=t.split(".");let a=n;for(let c=0;c<o.length-1;c++){const u=o[c];(!(u in a)||typeof a[u]!="object")&&(a[u]={}),a=a[u]}a[o[o.length-1]]=e}function ye(n,t,e){N(n,t,e)}function q(n,t,e){return Z(n,t,e)}function ve(n){return new Promise(t=>setTimeout(t,n))}function Ce(n,t){try{return n()}catch(e){return console.error("Error in tryCall:",e),t}}async function Fe(n,t=5){const e=[],o=[];for(const a of n){const c=a().then(u=>{e.push(u)});o.push(c),o.length>=t&&(await Promise.race(o),o.splice(o.findIndex(u=>u===c),1))}return await Promise.all(o),e}function Be(n){return n&&typeof n=="object"&&"name"in n&&"components"in n&&Array.isArray(n.components)}function we(n){return Object.entries(n).map(([t,e])=>({name:t,component:e,type:"field",needFormItem:!0}))}function be(n,t={}){return{...n,...t,path:t.path||n.path,depth:t.depth??n.depth}}function Ee(n,t){return{...n.defaultProps,...t}}function ee(n){return{onChange:"update:modelValue",onFocus:"focus",onBlur:"blur",onInput:"input",...n.eventMapping}}function Re(n){return n.type==="field"&&n.needFormItem!==!1}class te{constructor(t){B(this,"pending",new Map);B(this,"timer",null);B(this,"flushCallback");this.flushCallback=t}scheduleUpdate(t,e){this.pending.set(t,e),this.timer||(this.timer=requestAnimationFrame(()=>{this.flush()}))}flush(){if(this.pending.size===0)return;const t=Array.from(this.pending.entries()).map(([e,o])=>({path:e,value:o}));this.pending.clear(),this.timer=null,this.flushCallback(t)}clear(){this.timer!==null&&(cancelAnimationFrame(this.timer),this.timer=null),this.pending.clear()}hasPending(){return this.pending.size>0}getPendingCount(){return this.pending.size}}function Ve(n){let t=[],e=null;return(...o)=>{t.push(o),e||(e=requestAnimationFrame(()=>{const a=[...t];t=[],e=null,a.forEach(c=>n(...c))}))}}function ne(n){const t=new Map;for(const e of n)t.set(e.path,e.value);return Array.from(t.entries()).map(([e,o])=>({path:e,value:o}))}function Pe(n){const t=new Map;for(const e of n){const o=e.path.split(".")[0];t.has(o)||t.set(o,[]),t.get(o).push(e)}return t}function ke(n){const{maxSize:t=100,flushDelay:e=16,onFlush:o}=n,a=[];let c=null;const u=()=>{if(a.length===0)return;const y=[...a];a.length=0,c=null,o(ne(y))},m=()=>{c||(c=setTimeout(u,e))};return{add(y){a.push(y),a.length>=t?u():m()},flush:u,clear(){a.length=0,c&&(clearTimeout(c),c=null)},size(){return a.length}}}function Ae(){const n={updateCount:0,renderCount:0,averageUpdateTime:0,lastUpdateTime:0,maxUpdateTime:0,minUpdateTime:1/0,totalTime:0};return{recordUpdate:u=>{n.updateCount++,n.totalTime+=u,n.lastUpdateTime=u,n.averageUpdateTime=n.totalTime/n.updateCount,u>n.maxUpdateTime&&(n.maxUpdateTime=u),u<n.minUpdateTime&&(n.minUpdateTime=u)},recordRender:()=>{n.renderCount++},getMetrics:()=>({...n}),reset:()=>{n.updateCount=0,n.renderCount=0,n.averageUpdateTime=0,n.lastUpdateTime=0,n.maxUpdateTime=0,n.minUpdateTime=1/0,n.totalTime=0},report:()=>{console.group("📊 FormAdapter 性能报告"),console.log("更新次数:",n.updateCount),console.log("渲染次数:",n.renderCount),console.log("平均更新耗时:",n.averageUpdateTime.toFixed(2),"ms"),console.log("最后更新耗时:",n.lastUpdateTime.toFixed(2),"ms"),console.log("最长更新耗时:",n.maxUpdateTime.toFixed(2),"ms"),console.log("最短更新耗时:",n.minUpdateTime===1/0?"N/A":n.minUpdateTime.toFixed(2)+" ms"),console.log("总耗时:",n.totalTime.toFixed(2),"ms");const u=n.averageUpdateTime;let m="优秀";u>50?m="较差":u>30?m="一般":u>15&&(m="良好"),console.log("性能评级:",m),console.groupEnd()}}}function Se(n,t){const e=performance.now();try{const o=n(),a=performance.now()-e;return t&&t(a),o}catch(o){const a=performance.now()-e;throw t&&t(a),o}}async function Te(n,t){const e=performance.now();try{const o=await n(),a=performance.now()-e;return t&&t(a),o}catch(o){const a=performance.now()-e;throw t&&t(a),o}}function _e(){let n=0;return{increment:()=>++n,getCount:()=>n,reset:()=>{n=0}}}function I(n,t){return!(t.ifShow===!1||t.show===!1||t.disabled===!0)}function Le(n,t){if(I(n,t))return t.required??!1}function Me(n,t){return I(n,t)?n.validators||[]:[]}function Ue(n,t){const e=I(n,t);return{required:e&&(t.required??!1),validators:e?n.validators||[]:[],shouldValidate:e}}class D{constructor(){B(this,"components",new Map)}register(t){this.validateDefinition(t),this.components.set(t.name,t)}registerBatch(t){t.forEach(e=>this.register(e))}get(t){return this.components.get(t)}has(t){return this.components.has(t)}getByType(t){return Array.from(this.components.values()).filter(e=>e.type===t)}registerPreset(t){t.setup&&t.setup(),this.registerBatch(t.components)}getRegisteredNames(){return Array.from(this.components.keys())}getAll(){return Array.from(this.components.values())}clear(){this.components.clear()}unregister(t){return this.components.delete(t)}validateDefinition(t){if(!t.name)throw new Error("Component definition must have a name");if(!t.component)throw new Error(`Component "${t.name}" must have a component`);if(!t.type)throw new Error(`Component "${t.name}" must have a type`);const e=["field","layout","list","form"];if(!e.includes(t.type))throw new Error(`Component "${t.name}" has invalid type "${t.type}". Valid types are: ${e.join(", ")}`)}clone(){const t=new D;return this.components.forEach((e,o)=>{t.components.set(o,{...e})}),t}merge(t,e=!1){t.components.forEach((o,a)=>{(e||!this.components.has(a))&&this.components.set(a,o)})}getStats(){const t={field:0,layout:0,list:0,form:0};return this.components.forEach(e=>{t[e.type]++}),{total:this.components.size,byType:t}}}function H(){return new D}function L(n){const{name:t,component:e,type:o="field",defaultProps:a={},valueTransformer:c,eventMapping:u,needFormItem:m=o==="field",customRender:y}=n;if(!t||!e)throw new Error("Component name and component are required");const g={onChange:"update:modelValue",...u};return{name:t,component:e,type:o,defaultProps:a,valueTransformer:c,eventMapping:g,needFormItem:m,customRender:y}}function _(n){const{valueType:t="string",valueTransformer:e,...o}=n;let a=e;return!a&&t!=="custom"&&(a=Oe(t)),L({...o,type:"field",valueTransformer:a})}function Ie(n){return L({...n,type:"layout",needFormItem:!1})}function De(n){return L({...n,type:"list",needFormItem:!1})}function Oe(n){return{string:{toComponent:e=>e??"",fromComponent:e=>e||void 0},number:{toComponent:e=>e==null?"":Number(e),fromComponent:e=>{if(e===""||e===null||e===void 0)return;const o=Number(e);return isNaN(o)?void 0:o}},boolean:{toComponent:e=>!!e,fromComponent:e=>!!e},array:{toComponent:e=>e??[],fromComponent:e=>Array.isArray(e)?e.length>0?e:void 0:[]},date:{toComponent:e=>e?new Date(e):null,fromComponent:e=>{if(e)return e instanceof Date?e.toISOString():e}}}[n]}function $e(n){return n.map(t=>L(t))}function ze(n,t){return{...n,...t,defaultProps:{...n.defaultProps,...t.defaultProps},eventMapping:{...n.eventMapping,...t.eventMapping}}}function xe(n,t){return{...n,defaultProps:{...t,...n.defaultProps}}}function qe(n,t,e){return _({name:n,component:t,valueType:"string",...e})}function He(n,t,e=!1,o){return _({name:n,component:t,valueType:e?"array":"string",...o})}function je(n,t,e){return _({name:n,component:t,valueType:"date",...e})}function We(n,t,e){return _({name:n,component:t,valueType:"number",...e})}function Qe(n,t,e){return _({name:n,component:t,valueType:"boolean",...e})}class j{constructor(t){B(this,"engine");B(this,"pendingUpdates",new Map);B(this,"timer",null);B(this,"flushCallbacks",new Set);this.engine=t}scheduleUpdate(t,e,o){this.pendingUpdates.set(t,e),o&&this.flushCallbacks.add(o),this.timer||(this.timer=requestAnimationFrame(()=>{this.flush()}))}scheduleBatch(t,e){Object.entries(t).forEach(([o,a])=>{this.pendingUpdates.set(o,a)}),e&&this.flushCallbacks.add(e),this.timer||(this.timer=requestAnimationFrame(()=>{this.flush()}))}flush(){if(this.timer&&(cancelAnimationFrame(this.timer),this.timer=null),this.pendingUpdates.size===0)return;const t=Object.fromEntries(this.pendingUpdates);this.pendingUpdates.clear();try{this.engine.updateValue(t),this.flushCallbacks.forEach(e=>{try{e()}catch(o){console.error("Error in flush callback:",o)}})}catch(e){throw console.error("Error flushing updates:",e),e}finally{this.flushCallbacks.clear()}}cancel(){this.timer&&(cancelAnimationFrame(this.timer),this.timer=null),this.pendingUpdates.clear(),this.flushCallbacks.clear()}hasPending(){return this.pendingUpdates.size>0}getPendingCount(){return this.pendingUpdates.size}getPendingPaths(){return Array.from(this.pendingUpdates.keys())}destroy(){this.cancel()}}function Ge(n){return new j(n)}class oe{constructor(t){B(this,"engine");B(this,"renderSchemaRef");B(this,"modelRef");B(this,"subscriptions",[]);B(this,"isDestroyed",!1);B(this,"updateScheduler");const{schema:e,model:o,enableUpdateScheduler:a=!1}=t;this.engine=new T.FormEngine({schema:e,model:o}),this.renderSchemaRef=r.shallowRef(this.engine.getRenderSchema()),this.modelRef=r.shallowRef(this.engine.getValue()),a&&(this.updateScheduler=new j(this.engine)),this.setupEventListeners()}setupEventListeners(){const t=this.engine.onValueChange(e=>{this.isDestroyed||(e.event.kind==="value"?this.handleValueChange(e):e.event.kind==="structure"&&this.handleStructureChange())});this.subscriptions.push(t)}handleValueChange(t){this.modelRef.value=this.engine.getValue(),this.renderSchemaRef.value=this.engine.getRenderSchema()}handleStructureChange(){this.renderSchemaRef.value=this.engine.getRenderSchema(),this.modelRef.value=this.engine.getValue()}getRenderSchema(){return r.readonly(this.renderSchemaRef)}getModel(){return r.readonly(this.modelRef)}getEngine(){return this.engine}updateValue(t,e){if(this.isDestroyed){console.warn("Cannot update value on destroyed ReactiveEngine");return}this.updateScheduler?typeof t=="string"?this.updateScheduler.scheduleUpdate(t,e):this.updateScheduler.scheduleBatch(t):typeof t=="string"?this.engine.updateValue(t,e):this.engine.updateValue(t)}flush(){this.updateScheduler&&this.updateScheduler.flush()}waitFlush(){return this.engine?this.engine.waitFlush():Promise.resolve()}setFormSchema(t){if(this.isDestroyed){console.warn("Cannot set schema on destroyed ReactiveEngine");return}this.engine.setFormSchema(t),this.renderSchemaRef.value=this.engine.getRenderSchema(),this.modelRef.value=this.engine.getValue()}reset(t){if(this.isDestroyed){console.warn("Cannot reset destroyed ReactiveEngine");return}this.engine.reset(t),this.modelRef.value=this.engine.getValue(),this.renderSchemaRef.value=this.engine.getRenderSchema()}async validate(t){return this.isDestroyed?(console.warn("Cannot validate destroyed ReactiveEngine"),{valid:!1,errors:{}}):this.engine.validate(t)}getListOperator(t){if(this.isDestroyed)throw new Error("Cannot get list operator from destroyed ReactiveEngine");return{append:e=>{this.engine.listAppend(t,e)},insert:(e,o)=>this.engine.listInsert(t,e,o),remove:e=>this.engine.listRemove(t,e),move:(e,o)=>this.engine.listMove(t,e,o),swap:(e,o)=>this.engine.listSwap(t,e,o),replace:(e,o)=>this.engine.listReplace(t,e,o),clear:()=>this.engine.listClear(t)}}destroy(){this.isDestroyed||(this.isDestroyed=!0,this.subscriptions.forEach(t=>t()),this.subscriptions=[],this.updateScheduler&&(this.updateScheduler.destroy(),this.updateScheduler=void 0))}get destroyed(){return this.isDestroyed}}function W(n){return new oe(n)}class re{constructor(t,e,o={}){B(this,"engine");B(this,"registry");B(this,"batchManager");B(this,"options");this.engine=t,this.registry=e,this.options={enableBatch:!1,batchDelay:16,...o},this.options.enableBatch&&(this.batchManager=new te(a=>{const c=a.reduce((u,m)=>(u[m.path]=m.value,u),{});this.engine.updateValue(c)}))}handleFieldChange(t,e,o){try{const a=this.registry.get(o);if(!a){console.warn(`Component "${o}" not found in registry`);return}const c=this.transformValue(e,a);this.updateEngine(t,c)}catch(a){this.handleError(a,t,e,"transform")}}handleFieldFocus(t,e){}handleFieldBlur(t,e){}handleListAdd(t,e){try{const o=this.engine.getListOperator(t),a=e??{};o.append(a)}catch(o){this.handleError(o,t,e,"list-add")}}handleListRemove(t,e){try{this.engine.getListOperator(t).remove(e)}catch(o){this.handleError(o,t,e,"list-remove")}}handleListMove(t,e,o){try{this.engine.getListOperator(t).move(e,o)}catch(a){this.handleError(a,t,{from:e,to:o},"list-move")}}handleListInsert(t,e,o){try{this.engine.getListOperator(t).insert(e,o??{})}catch(a){this.handleError(a,t,{index:e,row:o},"list-insert")}}batchUpdate(t){try{const e={};for(const{path:o,value:a,component:c}of t)if(c){const u=this.registry.get(c);e[o]=this.transformValue(a,u)}else e[o]=a;this.engine.updateValue(e)}catch(e){this.handleError(e,"",t,"batch-update")}}flush(){this.batchManager&&this.batchManager.flush()}destroy(){this.batchManager&&(this.batchManager.clear(),this.batchManager=void 0)}transformValue(t,e){if(!e?.valueTransformer?.fromComponent)return t;try{return e.valueTransformer.fromComponent(t)}catch(o){throw new Q(`Failed to transform value: ${o}`,e.name,t)}}updateEngine(t,e){this.batchManager?this.batchManager.scheduleUpdate(t,e):this.engine.updateValue(t,e)}handleError(t,e,o,a){console.error(`EventHandler error [${a}] at "${e}":`,t),t instanceof Q?this.options.onTransformError?.(t,e,o):this.options.onUpdateError?.(t,e,o)}}class Q extends Error{constructor(t,e,o){super(t),this.componentName=e,this.value=o,this.name="TransformError"}}function G(n,t,e){return new re(n,t,e)}const Je=r.defineComponent({__name:"FormContainer",props:{node:{},context:{}},emits:["submit","field-change","field-blur","field-focus","list-add","list-remove","list-move"],setup(n,{expose:t,emit:e}){const o=n,a=e,c=r.ref(),u=r.computed(()=>o.node.component?o.context.registry.get(o.node.component)?.component:null),m=r.computed(()=>({...o.node.formProps,...o.node.componentProps,modelValue:o.context.engine?.getModel().value})),y=r.computed(()=>{const s=["form-adapter-root"];return o.context.options?.theme?.classPrefix&&s.push(`${o.context.options.theme.classPrefix}form`),s}),g=r.computed(()=>o.node.children||[]),C=r.computed(()=>({...o.context,depth:o.context.depth+1,parentType:"form"})),b=()=>{a("submit")},E=s=>{a("field-change",s)},R=s=>{a("field-blur",s)},V=s=>{a("field-focus",s)},h=s=>{a("list-add",s)},P=s=>{a("list-remove",s)},w=s=>{a("list-move",s)};return t({formRef:c}),(s,v)=>(r.openBlock(),r.createBlock(r.resolveDynamicComponent(u.value||"div"),r.mergeProps({ref_key:"formRef",ref:c},m.value,{class:y.value,onSubmit:r.withModifiers(b,["prevent"])}),{default:r.withCtx(()=>[r.renderSlot(s.$slots,"before-form",{},void 0,!0),(r.openBlock(!0),r.createElementBlock(r.Fragment,null,r.renderList(g.value,(p,l)=>(r.openBlock(),r.createBlock(A,{key:p.path||l,node:p,context:C.value,onFieldChange:E,onFieldBlur:R,onFieldFocus:V,onListAdd:h,onListRemove:P,onListMove:w},null,8,["node","context"]))),128)),r.renderSlot(s.$slots,"after-form",{},void 0,!0)]),_:3},16,["class"]))}}),M=(n,t)=>{const e=n.__vccOpts||n;for(const[o,a]of t)e[o]=a;return e},J=M(Je,[["__scopeId","data-v-ef247ce9"]]),ae=M(r.defineComponent({__name:"LayoutContainer",props:{node:{},context:{}},emits:["field-change","field-blur","field-focus","list-add","list-remove","list-move"],setup(n,{emit:t}){const e=n,o=t,a=r.computed(()=>e.node.component?e.context.registry.get(e.node.component)?.component:null),c=r.computed(()=>({...e.node.componentProps})),u=r.computed(()=>{const h=["layout-container"];return e.node.computed?.show===!1&&h.push("hidden"),h}),m=r.computed(()=>{const h=e.node.children;return Array.isArray(h)&&!Array.isArray(h[0])?h:[]}),y=r.computed(()=>({...e.context,depth:e.context.depth+1,parentType:"layout"})),g=h=>{o("field-change",h)},C=h=>{o("field-blur",h)},b=h=>{o("field-focus",h)},E=h=>{o("list-add",h)},R=h=>{o("list-remove",h)},V=h=>{o("list-move",h)};return(h,P)=>a.value?(r.openBlock(),r.createBlock(r.resolveDynamicComponent(a.value),r.mergeProps({key:0},c.value,{class:u.value}),{default:r.withCtx(()=>[(r.openBlock(!0),r.createElementBlock(r.Fragment,null,r.renderList(m.value,(w,s)=>(r.openBlock(),r.createBlock(A,{key:w.path||s,node:w,context:y.value,onFieldChange:g,onFieldBlur:C,onFieldFocus:b,onListAdd:E,onListRemove:R,onListMove:V},null,8,["node","context"]))),128))]),_:1},16,["class"])):(r.openBlock(!0),r.createElementBlock(r.Fragment,{key:1},r.renderList(m.value,(w,s)=>(r.openBlock(),r.createBlock(A,{key:w.path||s,node:w,context:y.value,onFieldChange:g,onFieldBlur:C,onFieldFocus:b,onListAdd:E,onListRemove:R,onListMove:V},null,8,["node","context"]))),128))}}),[["__scopeId","data-v-1b078edd"]]),Ke={class:"list-row-actions"},Xe=["onClick"],se=M(r.defineComponent({__name:"ListContainer",props:{node:{},context:{}},emits:["field-change","field-blur","field-focus","list-add","list-remove","list-move"],setup(n,{emit:t}){const e=n,o=t,a=r.computed(()=>e.node.component?e.context.registry.get(e.node.component)?.component:null),c=r.computed(()=>({...e.node.componentProps,title:e.node.label})),u=r.computed(()=>{const s=["list-container"];return e.node.computed?.show===!1&&s.push("hidden"),s}),m=r.computed(()=>{const s=e.context.engine.getModel()?.value,v=q(s,e.node.path);return Array.isArray(v)?v:[]}),y=r.computed(()=>e.node.children),g=s=>({...e.context,depth:e.context.depth+1,parentType:"list",rowIndex:s}),C=(s,v,p)=>{if(s){if(s.type==="field"){if(s.defaultValue!==void 0&&s.prop)if(typeof s.defaultValue=="function")try{v[s.prop]=s.defaultValue(p)}catch(l){console.error(`Error evaluating defaultValue for field ${s.prop}:`,l)}else v[s.prop]=s.defaultValue}else if(s.type==="layout"&&s.properties)for(const l of Object.values(s.properties))C(l,v,p);else if(s.type==="list"&&s.prop&&v[s.prop]===void 0)if(s.defaultValue!==void 0)if(typeof s.defaultValue=="function")try{v[s.prop]=s.defaultValue(p)}catch(l){console.error(`Error evaluating defaultValue for list ${s.prop}:`,l)}else v[s.prop]=s.defaultValue;else v[s.prop]=[]}},b=()=>{let s={};const v={mode:"list-add",getValue:l=>{const f=e.context.engine.getModel()?.value;return l?e.context.engine.getEngine().getValue(l):f},getListLength:()=>m.value.length,getRowData:()=>s};if(e.node.defaultValue!==void 0)if(typeof e.node.defaultValue=="function")try{s=e.node.defaultValue(v)}catch(l){console.error("Error evaluating list-level defaultValue:",l),s={}}else s=e.node.defaultValue;const p=e.context.engine.getEngine().getSchema(e.node.path);if(p&&p.items)for(const l of Object.values(p.items))C(l,s,v);o("list-add",{path:e.node.path,value:s})},E=s=>{o("list-add",s)},R=s=>{o("list-remove",{path:e.node.path,index:s})},V=(s,v)=>{o("list-move",{path:e.node.path,from:s,to:v})},h=s=>{o("field-change",s)},P=s=>{o("field-blur",s)},w=s=>{o("field-focus",s)};return(s,v)=>a.value?(r.openBlock(),r.createBlock(r.resolveDynamicComponent(a.value),r.mergeProps({key:0},c.value,{rows:m.value,class:u.value,onAdd:b,onRemove:R,onMove:V}),{default:r.withCtx(({index:p})=>[(r.openBlock(!0),r.createElementBlock(r.Fragment,null,r.renderList(y.value?.[p],(l,f)=>(r.openBlock(),r.createBlock(A,{key:l.prop||f,node:l,context:g(p),onFieldChange:h,onFieldBlur:P,onFieldFocus:w,onListAdd:E},null,8,["node","context"]))),128))]),_:1},16,["rows","class"])):(r.openBlock(),r.createElementBlock("div",{key:1,class:r.normalizeClass(u.value)},[(r.openBlock(!0),r.createElementBlock(r.Fragment,null,r.renderList(m.value,(p,l)=>(r.openBlock(),r.createElementBlock("div",{key:p.__key||l,class:"list-row"},[(r.openBlock(!0),r.createElementBlock(r.Fragment,null,r.renderList(y.value?.[l],(f,F)=>(r.openBlock(),r.createBlock(A,{key:f.prop||F,node:f,context:g(l),onFieldChange:h,onFieldBlur:P,onFieldFocus:w},null,8,["node","context"]))),128)),r.createElementVNode("div",Ke,[r.createElementVNode("button",{type:"button",onClick:f=>R(l)},"删除",8,Xe)])]))),128)),r.createElementVNode("div",{class:"list-actions"},[r.createElementVNode("button",{type:"button",onClick:b},"添加")])],2))}}),[["__scopeId","data-v-7ed0d7fa"]]),ie=M(r.defineComponent({__name:"FieldWrapper",props:{node:{},context:{}},emits:["field-change","field-blur","field-focus"],setup(n,{emit:t}){const e=n,o=t,a=r.computed(()=>e.context.registry.get(e.node.component||"")),c=r.computed(()=>a.value?.component),u=r.computed(()=>a.value?.needFormItem?e.context.formItem:null),m=r.computed(()=>a.value?.needFormItem??!0),y=r.ref(!0),g=r.computed(()=>{const l=e.context.engine.getModel().value;return q(l,e.node.path)}),C=r.ref();r.watch(g,async l=>{y.value=!1;const f=a.value?.valueTransformer;C.value=f?.toComponent?.(l)??l,await r.nextTick(),y.value=!0},{immediate:!0});const b=r.computed(()=>{const l=e.node.computed?.componentProps||e.node.componentProps;return{...a.value?.defaultProps,...l,disabled:e.node.computed?.disabled,readonly:e.node.computed?.readonly,placeholder:e.node.placeholder}}),E=r.computed(()=>{const l=e.context.ruleConverter?.(e.node,e.node.computed||{},e.context),f=e.node.computed?.formItemProps||e.node.formItemProps;return{label:e.node.label,name:e.node.path,required:e.node.computed?.required,rules:l,...f}}),R=r.computed(()=>{const l=[];return e.node.computed?.show===!1&&l.push("hidden"),l}),V=["onChange","onInput","onFocus","onBlur"],h=r.computed(()=>a.value?a.value?.eventMapping||ee(a.value):{onChange:"update:modelValue",onInput:"input",onFocus:"focus",onBlur:"blur"}),P=r.computed(()=>{const l={};h.value.onChange&&(l[h.value.onChange]=w),h.value.onFocus&&(l[h.value.onFocus]=p),h.value.onBlur&&(l[h.value.onBlur]=v),h.value.onInput&&(l[h.value.onInput]=s);const f=e.node.componentProps||{};return Object.keys(f).forEach(F=>{if(F.startsWith("on")&&typeof f[F]=="function"&&!V.includes(F)){const S=F.slice(2).toLowerCase();l[S]=f[F]}}),l}),w=l=>{let f;if(l&&l.target&&"value"in l.target?f=l.target.value:f=l,y.value){const S=a.value?.valueTransformer?.fromComponent?.(f)??f;o("field-change",{path:e.node.path,value:S,component:e.node.component||""})}},s=l=>{let f;if(l&&l.target&&"value"in l.target?f=l.target.value:f=l,y.value){const S=a.value?.valueTransformer?.fromComponent?.(f)??f;o("field-change",{path:e.node.path,value:S,component:e.node.component||""})}},v=l=>{o("field-blur",{path:e.node.path,event:l})},p=l=>{o("field-focus",{path:e.node.path,event:l})};return(l,f)=>m.value&&u.value?(r.openBlock(),r.createBlock(r.resolveDynamicComponent(u.value),r.mergeProps({key:0},E.value,{class:R.value}),{default:r.withCtx(()=>[(r.openBlock(),r.createBlock(r.resolveDynamicComponent(c.value),r.mergeProps({modelValue:C.value,"onUpdate:modelValue":f[0]||(f[0]=F=>C.value=F)},b.value,r.toHandlers(P.value)),null,16,["modelValue"]))]),_:1},16,["class"])):(r.openBlock(),r.createBlock(r.resolveDynamicComponent(c.value),r.mergeProps({key:1,modelValue:C.value,"onUpdate:modelValue":f[1]||(f[1]=F=>C.value=F)},b.value,r.toHandlers(P.value)),null,16,["modelValue"]))}}),[["__scopeId","data-v-43b92528"]]),A=r.defineComponent({__name:"SchemaRenderer",props:{node:{},context:{}},setup(n,{expose:t}){const e=n,o=r.ref(),a=r.computed(()=>e.node.computed?.ifShow!==!1),c=r.computed(()=>({form:J,layout:ae,list:se,field:ie})[e.node.type]||J);return t({containerRef:o}),(u,m)=>a.value?(r.openBlock(),r.createBlock(r.resolveDynamicComponent(c.value),{key:0,node:n.node,context:n.context,ref_key:"containerRef",ref:o},null,8,["node","context"])):r.createCommentVNode("",!0)}}),Ye=M(r.defineComponent({__name:"FormAdapter",props:{schema:{},model:{},components:{},options:{default:()=>({})}},emits:["update:model","change","field-blur","field-focus","list-change","validate","submit","ready"],setup(n,{expose:t,emit:e}){const o=n,a=e,c=r.shallowRef(),u=r.shallowRef(),m=r.shallowRef(),y=r.ref(),g=r.computed(()=>c.value?.getRenderSchema().value),C=r.computed(()=>!c.value||!u.value||!m.value?null:{engine:c.value,registry:u.value,eventHandler:m.value,options:o.options,formItem:o.options?.formItem??(Array.isArray(o.components)?void 0:o.components?.formItem),ruleConverter:Array.isArray(o.components)?void 0:o.components?.ruleConverter,path:[],depth:0}),b=r.computed(()=>{const d=[];return o.options?.theme?.classPrefix&&d.push(`${o.options.theme.classPrefix}form-adapter`),o.options?.theme?.size&&d.push(`size-${o.options.theme.size}`),d}),E=()=>{u.value=H(),o.components&&(Array.isArray(o.components)?u.value.registerBatch(o.components):u.value.registerPreset(o.components)),c.value=W({schema:o.schema,model:o.model,enableUpdateScheduler:o.options?.engine?.enableUpdateScheduler}),m.value=G(c.value,u.value,{enableBatch:o.options?.eventHandler?.enableBatch,batchDelay:o.options?.eventHandler?.batchDelay}),r.watch(()=>c.value?.getModel().value,d=>{d&&a("update:model",d)})},R=d=>{m.value?.handleFieldChange(d.path,d.value,d.component),a("change",{path:d.path,value:d.value})},V=d=>{m.value?.handleFieldBlur(d.path,d.event),a("field-blur",d)},h=d=>{m.value?.handleFieldFocus(d.path,d.event),a("field-focus",d)},P=d=>{m.value?.handleListAdd(d.path,d.value),a("list-change",{path:d.path,operation:"add"})},w=d=>{m.value?.handleListRemove(d.path,d.index),a("list-change",{path:d.path,operation:"remove",index:d.index})},s=d=>{m.value?.handleListMove(d.path,d.from,d.to),a("list-change",{path:d.path,operation:"move",from:d.from,to:d.to})},v=d=>{if(c.value)return d?c.value.getEngine().getValue(d):c.value.getModel().value},p=(d,k)=>{c.value?.updateValue(d,k)},l=d=>{c.value?.updateValue(d)},f=()=>{const d=y.value;if(!d)return null;const k=d.containerRef;return k?k.formRef:null},F=async d=>{if(!c.value)return{ok:!1,errors:[],errorByPath:{}};if(!Array.isArray(o.components)&&o.components?.ruleConverter){const K=f();if(K&&typeof K.validate=="function")try{if(await K.validate())return a("validate",!0),!0}catch(X){const Y=[],O={};Array.isArray(X)&&X.forEach(me=>{const U={path:me.field||"",message:me.message||"校验失败",code:"VALIDATION_ERROR"};Y.push(U),O[U.path]||(O[U.path]=[]),O[U.path].push(U)});const ue={ok:!1,errors:Y,errorByPath:O};return a("validate",ue),ue}}const de=await c.value.validate(d);return a("validate",de),de},S=async()=>{if(await F()===!0){const k=c.value?.getModel().value;k&&a("submit",k)}},ot=async d=>{await c.value?.reset(d)},rt=d=>{u.value?.register(d)},at=d=>{u.value?.registerBatch(d)},st=d=>{u.value?.registerPreset(d)},it=d=>c.value?.getListOperator(d),lt=d=>{console.log("scrollToField:",d)},ct=d=>{console.log("focusField:",d)},dt=()=>{m.value?.flush(),c.value?.flush()},ut=async()=>{await c.value?.waitFlush()},ce=()=>{m.value?.destroy(),c.value?.destroy()};return r.watch(()=>o.schema,d=>{c.value&&d&&c.value.setFormSchema(d)},{deep:!0}),r.onMounted(()=>{E(),c.value&&a("ready",c.value)}),r.onBeforeUnmount(()=>{ce()}),t({getEngine:()=>c.value,getRegistry:()=>u.value,getEventHandler:()=>m.value,getValue:v,updateValue:p,updateValues:l,getListOperator:it,validate:F,submit:S,reset:ot,flush:dt,registerComponent:rt,registerComponents:at,registerPreset:st,scrollToField:lt,focusField:ct,waitFlush:ut,destroy:ce}),(d,k)=>(r.openBlock(),r.createElementBlock("div",{class:r.normalizeClass(["form-adapter",b.value])},[r.renderSlot(d.$slots,"before-form",{},void 0,!0),g.value&&C.value?(r.openBlock(),r.createBlock(A,{key:0,ref_key:"schemaRendererRef",ref:y,node:g.value,context:C.value,onFieldChange:R,onFieldBlur:V,onFieldFocus:h,onListAdd:P,onListRemove:w,onListMove:s},null,8,["node","context"])):r.createCommentVNode("",!0),r.renderSlot(d.$slots,"after-form",{},void 0,!0)],2))}}),[["__scopeId","data-v-1cd25b93"]]);function Ze(n){const t=r.shallowRef(),e=r.shallowRef(),o=r.shallowRef(),a=r.ref(!1),c=r.ref(),u=r.computed(()=>t.value?.getRenderSchema().value),m=r.computed(()=>t.value?.getModel().value),y=async()=>{e.value=H(),n.components&&(Array.isArray(n.components)?e.value.registerBatch(n.components):e.value.registerPreset(n.components)),t.value=W({schema:n.schema,model:n.model,...n.engineOptions}),o.value=G(t.value,e.value,n.eventHandlerOptions),t.value&&n.onReady?.(t.value)},g=p=>{if(t.value)return p?t.value.getEngine().getValue(p):t.value.getModel().value},C=(p,l)=>{if(!t.value){console.warn("Engine not initialized");return}t.value.updateValue(p,l),n.onChange?.({path:p,value:l})},b=p=>{if(!t.value){console.warn("Engine not initialized");return}t.value.updateValue(p),Object.entries(p).forEach(([l,f])=>{n.onChange?.({path:l,value:f})})},E=async p=>{if(!t.value)return{ok:!1,errors:[],errorByPath:{}};a.value=!0;try{const l=await t.value.validate(p);if(l===!0)c.value=void 0;else{const f={};Array.isArray(l.errors)&&l.errors.forEach(F=>{f[F.path]||(f[F.path]=[]),f[F.path].push(F.message)}),c.value=f}return n.onValidate?.(l),l}finally{a.value=!1}},R=async()=>{if(await E()===!0&&m.value){a.value=!0;try{await n.onSubmit?.(m.value)}catch(l){throw console.error("Submit error:",l),l}finally{a.value=!1}}},V=()=>{t.value?.reset(),c.value=void 0},h=p=>{e.value?.register(p)},P=p=>{e.value?.registerBatch(p)},w=p=>{e.value?.registerPreset(p)},s=p=>t.value?.getListOperator(p),v=()=>{o.value?.destroy(),t.value?.destroy(),c.value=void 0};return r.onMounted(()=>{y()}),r.onBeforeUnmount(()=>{v()}),{engine:t,registry:e,eventHandler:o,renderSchema:u,model:m,loading:a,errors:c,init:y,getValue:g,updateValue:C,updateValues:b,validate:E,submit:R,reset:V,destroy:v,registerComponent:h,registerComponents:P,registerPreset:w,getListOperator:s}}function Ne(n){const{props:t,emit:e,valueTransformer:o}=n,a=r.ref(t.modelValue);r.watch(()=>t.modelValue,g=>{a.value=o?.toComponent?.(g)??g},{immediate:!0});const c=r.computed(()=>!!(t.disabled||t.readonly));return{internalValue:a,isDisabled:c,handleChange:g=>{const C=o?.fromComponent?.(g)??g;a.value=C,e("update:modelValue",C),e("change",C),n.validateOnChange},handleFocus:g=>{e("focus",g)},handleBlur:g=>{e("blur",g),n.validateOnBlur}}}function et(){return{modelValue:{type:[String,Number,Boolean,Array,Object,Date],default:void 0},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},placeholder:{type:String,default:""}}}function tt(){return["update:modelValue","change","focus","blur"]}const le="0.0.1";function nt(n){console.log("Adapter installed",le)}i.BatchUpdateManager=te,i.ComponentRegistry=D,i.EventHandler=re,i.FieldWrapper=ie,i.FormAdapter=Ye,i.FormContainer=J,i.LayoutContainer=ae,i.ListContainer=se,i.ReactiveEngine=oe,i.SchemaRenderer=A,i.TransformError=Q,i.UpdateScheduler=j,i.batchPromises=Fe,i.buildValidationContext=Ue,i.createBatchUpdate=Ve,i.createComponentRegistry=H,i.createDefinitionsFromMap=we,i.createEventHandler=G,i.createFieldEmits=tt,i.createFieldProps=et,i.createPerformanceMonitor=Ae,i.createReactiveEngine=W,i.createRenderContext=be,i.createRenderCounter=_e,i.createUpdateQueue=ke,i.createUpdateScheduler=Ge,i.debounce=pe,i.deepClone=$,i.deepMerge=z,i.defineBooleanComponent=Qe,i.defineDateComponent=je,i.defineFieldComponent=_,i.defineInputComponent=qe,i.defineLayoutComponent=Ie,i.defineListComponent=De,i.defineNumberComponent=We,i.defineSelectComponent=He,i.delay=ve,i.extractRequired=Le,i.extractValidators=Me,i.generateId=he,i.get=Z,i.getEventMapping=ee,i.getValueByPath=q,i.groupUpdatesByPath=Pe,i.install=nt,i.isComponentPreset=Be,i.isEmpty=ge,i.measurePerformance=Se,i.measurePerformanceAsync=Te,i.mergeComponentDefinition=ze,i.mergeComponentProps=Ee,i.mergeUpdates=ne,i.needsFormItem=Re,i.normalizeComponent=L,i.normalizeComponents=$e,i.set=N,i.shouldValidateField=I,i.throttle=fe,i.tryCall=Ce,i.updateValueByPath=ye,i.useFieldComponent=Ne,i.useFormAdapter=Ze,i.version=le,i.wrapWithCommonProps=xe,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});