@piying/view-angular-core 0.6.27 → 0.6.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/piying-view-angular-core.mjs +1 -1
- package/index.d.ts +12 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{effect,inject,Injector,untracked,DestroyRef,isSignal,signal,computed,linkedSignal,InjectionToken,EnvironmentInjector}from"@angular/core";import*as v from"valibot";import{deepEqual}from"fast-equals";import{BehaviorSubject,isObservable,Subject,combineLatest,startWith,skip,map}from"rxjs";import rfdc from"rfdc";import{createRawConfig,BaseSchemaHandle,convertSchema,convertCore}from"@piying/valibot-visit";export{asControl,asVirtualGroup,changeObject,condition,getDefaults,getSchemaByIssuePath,getSchemaMetadata}from"@piying/valibot-visit";import clsx from"clsx";function arrayStartsWith(list,parts){return(Array.isArray(parts)?parts:[parts]).every((item,index)=>item===list[index])}function effectListen(listen,fn,options){let first=!0,oldValue=listen();return effect(()=>{let currentValue=listen();if(first){first=!1,deepEqual(oldValue,currentValue)||fn();return}return fn()},options)}function toObservable(listen,source,options){let injector=options?.injector??inject(Injector),subject=new BehaviorSubject(source()),watcher=effectListen(listen,()=>{let value;try{value=source()}catch(err){untracked(()=>subject.error(err));return}untracked(()=>subject.next(value))},{injector,manualCleanup:!0});return injector.get(DestroyRef).onDestroy(()=>{watcher.destroy(),subject.complete()}),subject.asObservable()}let clone=rfdc({proto:!1,circles:!1});function unWrapSignal$1(value){return isSignal(value)?value():value}function toArray(input){return void 0===input||Array.isArray(input)?input:[input]}class SortedArray extends Array{#compareFn;constructor(compareFn){super(),this.#compareFn=compareFn}push(...items){let result=super.push(...items);return this.sort(this.#compareFn),result}}function createViewControlLink(fieldControl,cva,injector){let pendingValue,pendingChange=!1;cva.registerOnChange(value=>{fieldControl().disabled$$()||(pendingValue=value,pendingChange=!0,"change"===fieldControl().updateOn$$()&&fieldControl().viewValueChange(value))}),cva.registerOnTouched(()=>{fieldControl().markAsTouched(),pendingChange&&"blur"===fieldControl().updateOn$$()&&(fieldControl().viewValueChange(pendingValue),pendingChange=!1)});let disposeList=[],ref=effect(()=>{let value=fieldControl().modelValueToViewValue$$();untracked(()=>{cva.writeValue(value)})},{injector:injector});if(cva.writeValue(fieldControl().modelValueToViewValue$$()),disposeList.push(()=>ref.destroy()),cva.setDisabledState){let disabledRef=effect(()=>{let value=fieldControl().disabled$$();untracked(()=>{cva.setDisabledState(value)})},{injector:injector});cva.setDisabledState(fieldControl().disabled$$()),disposeList.push(()=>disabledRef.destroy())}return()=>{disposeList.forEach(fn=>fn()),untracked(()=>{fieldControl().updateValue(fieldControl().value$$(),!0)})}}function controlStatusList(fieldControl,skipDisabled){if(!fieldControl)return[];let statusList=[];switch(!skipDisabled&&fieldControl.disabled$$()&&statusList.push("disabled"),fieldControl.touched$$()?statusList.push("touched"):statusList.push("untouched"),fieldControl.dirty$$()?statusList.push("dirty"):statusList.push("pristine"),fieldControl.status$$()){case"VALID":statusList.push("valid");break;case"INVALID":statusList.push("invalid");break;case"PENDING":statusList.push("pending")}return statusList}function fieldControlStatusClass(fieldControl,skipDisabled){return controlStatusList(fieldControl,skipDisabled).map(item=>`pi-${item}`).join(" ")}function isPromise(obj){return!!obj&&"function"==typeof obj.then}let ValidatorPending=Symbol("PENDING");function shortCircuitTrue(value){return value}let VALID="VALID",INVALID="INVALID",PENDING="PENDING";class AbstractControl{emptyValue$$=computed(()=>clone(this.config$().emptyValue));shouldInclude$$=computed(()=>this.valueNoError$$()&&(!this.selfDisabled$$()||this.selfDisabled$$()&&"reserve"===this.config$().disabledValue));injector;selfDisabled$$=computed(()=>this.config$?.().disabled??!1);selfEnabled$$=computed(()=>!this.selfDisabled$$());disabled$$=computed(()=>(this.parent?.disabled$$()||this.selfDisabled$$())??!1);enabled$$=computed(()=>!this.disabled$$());get disabled(){return this.disabled$$()}get enabled(){return!this.disabled$$()}enable(){this.config$.update(config=>({...config={...config,disabled:!1},disabled:!1}))}disable(){this.config$.update(config=>({...config,disabled:!0}))}selfTouched$=signal(!1);touched$$=computed(()=>this.reduceChildren(this.selfTouched$(),(child,value)=>value||child.touched$$(),shortCircuitTrue));get touched(){return untracked(this.touched$$)}get untouched(){return!untracked(this.touched$$)}selfDirty$=signal(!1);dirty$$=computed(()=>this.reduceChildren(this.selfDirty$(),(child,value)=>value||child.dirty$$(),shortCircuitTrue));get dirty(){return untracked(this.dirty$$)}get pristine(){return!untracked(this.dirty$$)}#validators$$=computed(()=>this.config$().validators??[]);#asyncValidators$$=computed(()=>this.config$().asyncValidators??[]);resetIndex$=signal(0);syncError$=linkedSignal(computed(()=>{if(this.disabled$$())return;this.resetIndex$(),this.value$$();let result=this.#validators$$().reduce((obj,item)=>{let result=untracked(()=>item(this));return result&&(obj={...obj,...result}),obj},{}),schemaResult=this.#schemaCheck$$();return schemaResult.success?Object.keys(result).length?result:void 0:{...result,valibot:schemaResult.issues}},{equal:()=>!1}));asyncErrorRes$$=computed(()=>{let result=this.#asyncValidators$$();if(0===result.length)return;this.resetIndex$(),this.value$$();let dataList=result.map(item=>untracked(()=>(function(input){if(isPromise(input)){let value$=signal(ValidatorPending);return input.then(value=>{value$.set({value})}),value$}if(!isObservable(input))return input;let value$=signal(ValidatorPending);return input.subscribe({next:value=>{value$.set({value})},error:error=>{value$.set({error})}}),value$})(item(this))));return computed(()=>{let params=dataList.map(item=>item()),pendingCount=0,errorResult=params.reduce((obj,item)=>item===ValidatorPending?(pendingCount++,obj):"value"in item?{...obj,...item.value}:{...obj,error:item.error},{});return Object.keys(errorResult).length?errorResult:pendingCount?ValidatorPending:void 0})});asyncError$$=computed(()=>{if(this.disabled$$())return;let ref=this.asyncErrorRes$$();if(ref){let result=ref();return result===ValidatorPending?PENDING:result}});rawError$$=computed(()=>{if(this.disabled$$())return;let syncError=this.syncError$(),asyncError=this.asyncError$$();return asyncError===PENDING?PENDING:syncError&&asyncError?{...syncError,...asyncError}:syncError||asyncError?syncError||asyncError:void 0});valueNoError$$=computed(()=>void 0===this.rawError$$());get errors(){let error=this.rawError$$();return error===PENDING?void 0:error}_parent;get parent(){return this._parent}get value(){return this.value$$()}required$$=computed(()=>this.config$().required);schemaParser;constructor(rawSchema,injector){this.injector=injector,this.schemaParser=v.safeParser(rawSchema)}#schemaCheck$$=computed(()=>this.schemaParser(this.value$$()));setParent(parent){this._parent=parent}get valid(){return this.status$$()===VALID}get invalid(){return this.status$$()===INVALID}get pending(){return this.status$$()===PENDING}selfUpdateOn$$=computed(()=>this.config$?.().updateOn);updateOn$$=computed(()=>(this.selfUpdateOn$$()||this.parent?.updateOn$$())??"change");markAsTouched(){this.selfTouched$.set(!0)}markAllAsDirty(){this.markAsDirty(),this._forEachChild(control=>control.markAllAsDirty())}markAllAsTouched(){this.markAsTouched(),this._forEachChild(control=>control.markAllAsTouched())}markAsUntouched(){this.selfTouched$.set(!1)}markAsDirty(){this.selfDirty$.set(!0)}markAsPristine(){this.selfDirty$.set(!1)}getRawValue(){return this.value}get(path){let currPath=path;return null==currPath||(Array.isArray(currPath)||(currPath=currPath.split(".")),0===currPath.length)?null:currPath.reduce((control,name)=>control&&control.find(name),this)}get root(){let x=this;for(;x._parent;)x=x._parent;return x}config$=signal({});initConfig(config){this.config$=config}find(name){return null}setControl(name,control){}reduceChildren(initialValue,fn,shortCircuit){let childrenMap=this.children$$?.();if(!childrenMap)return initialValue;let value=initialValue;for(let child of childrenMap){if(shortCircuit?.(value))break;value=fn(child,value)}return value}#valueChange;get valueChanges(){return this.#valueChange??(this.#valueChange=toObservable(computed(()=>({value:this.value$$(),disabled:this.disabled$$()})),this.value$$,{injector:this.injector}))}status$$=computed(()=>{if(this.disabled$$())return VALID;if(this.rawError$$())if(this.rawError$$()!==PENDING)return INVALID;else return PENDING;return this.reduceChildren(VALID,(child,value)=>value===INVALID||child.status$$()===INVALID?INVALID:value===PENDING||child.status$$()===PENDING?PENDING:VALID,v=>v===INVALID)});#statusChange;get statusChanges(){return this.#statusChange??(this.#statusChange=toObservable(this.status$$,this.status$$,{injector:this.injector}))}}class FieldArray extends AbstractControl{#deletionMode$$=computed(()=>this.config$().deletionMode??"shrink");value$$=computed(()=>{let list=[];for(let control of this.controls$())if(control&&control.shouldInclude$$())list.push(control.value$$());else{if("shrink"===this.#deletionMode$$())continue;"mark"===this.#deletionMode$$()&&list.push(void 0)}return 0===list.length?this.emptyValue$$():list});children$$=computed(()=>this.controls$());controls$=signal([]);get controls(){return this.controls$()}removeAt(index){let adjustedIndex=this._adjustIndex(index);this.controls$()[adjustedIndex]&&this.controls$.update(list=>((list=list.slice()).splice(adjustedIndex,1),list))}setControl(index,control){let adjustedIndex=this._adjustIndex(index);this.controls$.update(list=>((list=list.slice())[adjustedIndex]=control,list)),control.setParent(this)}get length(){return this.controls$().length}reset(value=[]){this._forEachChild((control,index)=>{control.reset(value[index])})}getRawValue(){return this.controls$().map(control=>control.getRawValue())}clear(){this.controls$().length<1||this.controls$.update(()=>[])}_adjustIndex(index){return index<0?Math.max(index+this.length,0):index}_forEachChild(cb){this.controls$().forEach((control,index)=>{control&&cb(control,index)})}find(name){return this.controls$()[this._adjustIndex(name)]}beforeUpdateList=[];updateValue(value=[]){deepEqual(value,this.value$$())||(this.beforeUpdateList.forEach(item=>item(value)),this.controls$().forEach((control,i)=>{control.updateValue(value[i])}))}}class FieldControl extends AbstractControl{children$$;#viewIndex=0;viewIndex$=signal(0);modelValue$=signal(void 0);modelValueToViewValueOrigin$$=computed(()=>{let viewValue=this.modelValue$(),toView=this.config$?.().transfomer?.toView;return toView?toView(viewValue,this):viewValue});modelValueToViewValue$$=computed(()=>(this.viewIndex$(),this.modelValueToViewValueOrigin$$()),{equal:()=>!1});value$$=signal(void 0);reset(formState=this.config$().defaultValue){this.updateValue(formState,!0),this.markAsPristine(),this.markAsUntouched()}_forEachChild(cb){}#initInput=!0;#viewSubject$$=computed(()=>{let subject=new Subject;return this.injector.get(DestroyRef).onDestroy(()=>{subject.complete()}),subject.pipe(this.config$().pipe.toModel).subscribe(value=>{untracked(()=>{this.#viewValueChange(value)})}),subject});#viewValueChange(value){this.markAllAsDirty(),this.#viewIndex++;let toModel=this.config$?.().transfomer?.toModel,originValue=toModel?toModel(value,this):value,transfomered=this.schemaParser(originValue);transfomered.success?(this.value$$.set(transfomered.output),this.syncError$.update(data=>(data&&delete data.valibot,data&&Object.keys(data).length?data:void 0))):this.syncError$.update(data=>({...data,valibot:transfomered.issues}))}viewValueChange(value){this.config$().pipe?.toModel?this.#viewSubject$$().next(value):this.#viewValueChange(value)}updateValue(value,force){if(force&&(this.#viewIndex++,this.viewIndex$.set(this.#viewIndex),this.resetIndex$.update(a=>a+1),this.#initInput=!0),this.#initInput){this.#initInput=!1,(void 0!==value&&!deepEqual(value,this.value$$())||force)&&(this.modelValue$.set(value),this.value$$.set(value));return}deepEqual(value,this.value$$())||(this.viewIndex$.set(this.#viewIndex),this.modelValue$.set(value),this.value$$.set(value))}initConfig(config){super.initConfig(config),"defaultValue"in this.config$()&&(this.modelValue$.set(this.config$().defaultValue),this.value$$.set(this.config$().defaultValue))}}class FieldLogicGroup extends FieldArray{activateIndex$=signal(0);type=signal("and");activateControl$=signal(void 0);value$$=computed(()=>this.getValue(!1));getActivateControls(){let list;if(this.activateControl$())list=this.activateControl$();else if("and"===this.type())list=this.controls$();else if("or"===this.type())list=[this.controls$()[this.activateIndex$()]];else throw Error("");return list}getValue(rawData){let controls=rawData?this.getActivateControls():this.getActivateControls().filter(control=>control.shouldInclude$$()),control=controls[0];if(0===controls.length)return this.emptyValue$$();if(1===controls.length)return control.value;let result=controls.reduce((obj,control)=>({...obj,...control.value$$()}),{});return Object.keys(result).length?result:this.emptyValue$$()}getRawValue(){return this.getValue(!0)}updateValue(value){deepEqual(value,this.value$$())||this.controls$().forEach((control,i)=>{control.updateValue(value)})}}function isFieldGroup(input){return input instanceof FieldGroup}function isFieldArray(input){return input instanceof FieldArray}function isFieldControl(input){return input instanceof FieldControl}function isFieldLogicGroup(input){return input instanceof FieldLogicGroup}class FieldGroup extends AbstractControl{value$$=computed(()=>{let result={...this._reduceChildren({},(acc,control,name)=>(control.shouldInclude$$()&&(acc[name]=control.value),acc)),...this.looseValue$$()};return Object.keys(result).length?result:this.emptyValue$$()});children$$=computed(()=>Object.values(this.controls$()));controls$=signal({});get controls(){return this.controls$()}registerControl(name,control){return this.controls$()[name]?this.controls$()[name]:(this.controls$.update(controls=>({...controls,[name]:control})),control.setParent(this),control)}removeControl(name){this.controls$()[name]&&this.controls$.update(controls=>(controls={...controls},delete controls[name],controls))}setControl(name,control){this.controls$.update(controls=>(controls={...controls},delete controls[name],controls)),control&&this.registerControl(name,control)}reset(value={}){this._forEachChild((control,name)=>{control.reset(value?value[name]:void 0)})}getRawValue(){return this._reduceChildren({},(acc,control,name)=>(acc[name]=control.getRawValue(),acc))}_forEachChild(cb){Object.keys(this.controls$()).forEach(key=>{let control=this.controls$()[key];control&&cb(control,key)})}_reduceChildren(initValue,fn){let res=initValue;return this._forEachChild((control,name)=>{res=fn(res,control,name)}),res}find(name){return this.controls$()[name]}looseValue$$=computed(()=>{let initValue=this.#initValue$();if(!initValue||isFieldLogicGroup(this.parent))return{};let controls=this.controls$(),looseValue={};for(let key in initValue)key in controls||(looseValue[key]=initValue[key]);return looseValue});#initValue$=signal({});setInitValue(obj){this.#initValue$.set(obj)}updateValue(value){if(!deepEqual(value,this.value$$())){for(let key in this.controls$())this.controls$()[key].updateValue(value?.[key]);if(!deepEqual(value,this.#initValue$()))return void this.setInitValue(value)}}}let PI_VIEW_CONFIG_TOKEN=new InjectionToken("PI_VIEW_CONFIG"),PI_FORM_BUILDER_OPTIONS_TOKEN=new InjectionToken("PI_FORM_BUILDER_OPTIONS"),PI_FORM_BUILDER_ALIAS_MAP=new InjectionToken("PI_FORM_BUILDER_ALIAS_MAP");function isGroup(schema){return schema.isGroup}function isArray(schema){return schema.isArray}function unWrapSignal(value){return isSignal(value)?value():value}class ParentMap extends Map{parent;constructor(parent){super(),this.parent=parent}get(key){let result=super.get(key);return void 0===result?this.parent?.get(key):result}}function fieldQuery(key,field,aliasMap,root,aliasNotFoundFn){let list,keyPath=Array.isArray(key)?key:"number"==typeof key?[key]:key.split("."),firstPath=keyPath[0];if("#"===firstPath)field=root,list=[{field:root,level:1}];else if(".."===firstPath)list=[{field:field.parent,level:1}];else if("string"==typeof firstPath&&firstPath.startsWith("@")){let queryField=aliasMap.get(firstPath.slice(1));!queryField&&aliasNotFoundFn&&(queryField=aliasNotFoundFn(firstPath.slice(1),field)),list=[{field:queryField,level:1}]}else field.fieldGroup?list=(function* groupGenerator(list){for(let item of list)!item.keyPath?.length&&item.fieldGroup?.().length?yield*groupGenerator(item.fieldGroup()):item.keyPath?.length&&(yield item)})(field.fieldGroup()).filter(field=>field.keyPath&&arrayStartsWith(keyPath,field.keyPath)).map(field=>({field:field,level:field.keyPath?.length})):field.fieldArray&&(list=field.fieldArray().filter(field=>field.keyPath&&arrayStartsWith(keyPath,field.keyPath)).map(field=>({field:field,level:field.keyPath?.length})));if(list)for(let item of list){if(keyPath.length===item.level)return item.field;let res=item.field.get(keyPath.slice(item.level),aliasNotFoundFn);if(res)return res}}class FormBuilder{#scopeMap=inject(PI_FORM_BUILDER_ALIAS_MAP,{optional:!0})??new ParentMap;#options=inject(PI_FORM_BUILDER_OPTIONS_TOKEN);#injector=inject(Injector);#envInjector=inject(EnvironmentInjector);#globalConfig=inject(PI_VIEW_CONFIG_TOKEN,{optional:!0})??void 0;#allFieldInitHookList=[];buildRoot(item){this.#buildControl({type:"root",field:{fullPath:[]},form:void 0,resolvedField$:item.resolvedField$,append:()=>{}},item.field,0),this.allFieldInitHookCall()}allFieldInitHookCall(){let list=this.#allFieldInitHookList;this.#allFieldInitHookList=[],list.forEach(fn=>fn())}#buildField(item){"group"===item.type?this.#buildGroup(item):this.#buildArray(item)}afterResolveConfig(rawConfig,config){}#buildControl(parent,field,index){var parentForm,key,injector;let viewDefaultConfig,define,control,FieldClass,control1,type=field.type;if(type){let result=this.#resolveComponent(type);viewDefaultConfig=result.defaultConfig,define=result.define}let mergeStrategy=this.#globalConfig?.defaultConfigMergeStrategy,inputs=this.configMerge([this.#globalConfig?.defaultConfig?.inputs,viewDefaultConfig?.inputs,field.inputs],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.inputs??"merge"),outputs=this.configMerge([this.#globalConfig?.defaultConfig?.outputs,viewDefaultConfig?.outputs,field.outputs],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.outputs??"merge"),attributes=this.configMerge([this.#globalConfig?.defaultConfig?.attributes,viewDefaultConfig?.attributes,field.attributes],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.attributes??"merge"),wrappers1=this.configMergeRaw([this.#globalConfig?.defaultConfig?.wrappers,viewDefaultConfig?.wrappers,field.wrappers],!0,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.wrappers??"replace"),wrappers=this.#resolveWrappers(wrappers1),props=this.configMerge([this.#globalConfig?.defaultConfig?.props,viewDefaultConfig?.props,field.props],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.props??"merge"),formConfig$=this.configMerge([this.#globalConfig?.defaultConfig?.formConfig,viewDefaultConfig?.formConfig,field.formConfig],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.formConfig??"merge"),renderConfig=this.configMerge([this.#globalConfig?.defaultConfig?.renderConfig,viewDefaultConfig?.renderConfig,field.renderConfig],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.renderConfig??"merge"),keyPath=field.key;isFieldLogicGroup(parent.form)?keyPath??=parent.form.controls$().length:isFieldArray(parent.form)&&(keyPath??=index);let isRoot="root"===parent.type;!field.nonFieldControl&&(void 0!==keyPath||isRoot)&&(parentForm=parent.form,key=keyPath,injector=this.#injector,FieldClass=field.isLogicAnd||field.isLogicOr?FieldLogicGroup:isGroup(field)?FieldGroup:isArray(field)||field.isTuple?FieldArray:FieldControl,isRoot?(isFieldLogicGroup(control1=new FieldClass(field.sourceSchema,injector))&&control1.type.set(field.isLogicAnd?"and":"or"),control1.initConfig(formConfig$)):(control1=parentForm.get([key]))||(isFieldLogicGroup(control1=new FieldClass(field.sourceSchema,injector))&&control1.type.set(field.isLogicAnd?"and":"or"),parentForm.setControl?.(key,control1),control1.initConfig(formConfig$)),control=control1);let rootForm=this.#options.form$$,resolvedConfig={id:field.id,keyPath:toArray(keyPath),get fullPath(){return[...resolvedConfig.parent.fullPath,...resolvedConfig.keyPath??[]]},form:{parent:parent.form,control:control??(isGroup(field)?parent.form:void 0),get root(){return rootForm()}},get:(keyPath,aliasNotFoundFn)=>untracked(()=>fieldQuery(keyPath,resolvedConfig,this.#scopeMap,this.#options.resolvedField$(),aliasNotFoundFn)),parent:parent.field,origin:field,renderConfig:renderConfig,formConfig:formConfig$,props,context:this.#options.context(),priority:field.priority,hooks:field.hooks,alias:field.alias,inputs:inputs,outputs:outputs,attributes,define:define?{...define,inputs,outputs,attributes}:void 0,wrappers};return resolvedConfig=this.afterResolveConfig(field,resolvedConfig)??resolvedConfig,field.movePath?this.#moveViewField(field.movePath,resolvedConfig):parent.append(resolvedConfig),field.alias&&this.#scopeMap.set(field.alias,resolvedConfig),resolvedConfig.hooks?.fieldResolved?.(resolvedConfig),isRoot&&parent.resolvedField$.set(resolvedConfig),isGroup(field)||field.isLogicAnd||field.isLogicOr||field.isTuple?(resolvedConfig.fieldGroup=signal(new SortedArray((a,b)=>a.priority-b.priority)),this.#buildField({type:"group",fields:field.children,field:resolvedConfig,form:control||parent.form,append:field=>{resolvedConfig.fieldGroup().push(field)}})):isArray(field)&&this.#buildField({type:"array",templateField:field.arrayChild,field:resolvedConfig,form:control,append:field=>{}}),resolvedConfig.hooks?.allFieldsResolved&&this.#allFieldInitHookList.push(()=>{resolvedConfig.hooks.allFieldsResolved(resolvedConfig)}),resolvedConfig}#buildGroup(groupItem){for(let index=0;index<groupItem.fields.length;index++){let field=groupItem.fields[index];this.#buildControl(groupItem,field,index)}let field=groupItem.field;field.hooks?.afterChildrenInit?.(field)}createArrayItem(parent,field,index){let Builder=this.constructor,injector=Injector.create({providers:[Builder,{provide:PI_FORM_BUILDER_ALIAS_MAP,useValue:new ParentMap(this.#scopeMap)},{provide:EnvironmentInjector,useFactory:()=>injector}],parent:this.#envInjector});this.#envInjector.get(DestroyRef).onDestroy(()=>{result.injector?.destroy()});let instance=injector.get(Builder),result=instance.#buildControl(parent,field,index);return this.#allFieldInitHookList.push(()=>instance.allFieldInitHookCall()),result.injector=injector.get(EnvironmentInjector),result}#buildArray(arrayItem){let{templateField,form}=arrayItem;arrayItem.field.action={set:(value,index)=>{untracked(()=>{index="number"==typeof index?index:arrayItem.field.fieldArray?.().length??0;let result=this.createArrayItem(arrayItem,templateField,index),list=[...arrayItem.field.fieldArray()];list[index]=result,arrayItem.field.fieldArray.set(list),this.allFieldInitHookCall(),result.form.control.updateValue(value)})},remove:index=>{untracked(()=>{let list=[...arrayItem.field.fieldArray()],[deletedItem]=list.splice(index,1);arrayItem.field.fieldArray.set(list),form.removeAt(index),deletedItem&&(deletedItem.injector.destroy(),deletedItem.injector=void 0)})}},arrayItem.field.fieldArray=signal([]),arrayItem.field.hooks?.afterChildrenInit?.(arrayItem.field),form.beforeUpdateList.push(input=>{let controlLength=form.controls$().length;if(controlLength<input.length){let list=arrayItem.field.fieldArray().slice();for(let index=controlLength;index<input.length;index++){let result=this.createArrayItem(arrayItem,arrayItem.templateField,index);list[index]=result}arrayItem.field.fieldArray.set(list)}else if(input.length<controlLength){let list=arrayItem.field.fieldArray().slice();for(let index=arrayItem.field.fieldArray().length-1;index>=input.length;index--){let[deletedItem]=list.splice(index,1);form.removeAt(index),deletedItem&&(deletedItem.injector?.destroy(),deletedItem.injector=void 0)}arrayItem.field.fieldArray.set(list)}this.allFieldInitHookCall()})}#resolveComponent(type){let define,defaultConfig;if("string"!=typeof type)return{define:{type:type}};{let config=this.#globalConfig?.types?.[type];if(!config)throw Error(`define:未注册[${type}]`);if(defaultConfig=config,Object.keys(config).length)return define={...config},{define:{...config},defaultConfig}}return{define,defaultConfig}}configMergeRaw(list,isArray,strategy){return clone(isArray?"merge"===strategy?list.filter(Boolean).flat().map(item=>unWrapSignal(item)):list.reduce((data,item)=>unWrapSignal(item)??data,[]):"merge"===strategy?list.reduce((obj,item)=>({...obj,...unWrapSignal(item)}),{}):list.reduce((data,item)=>unWrapSignal(item)??data,{}))}configMerge(list,isArray,strategy){return signal(this.configMergeRaw(list,isArray,strategy))}#moveViewField(key,inputField){let parent=fieldQuery(key,inputField,this.#scopeMap,this.#options.resolvedField$(),(name,field)=>{let rootForm=this.#options.form$$,aliasField={alias:name,parent:field,get fullPath(){return field.fullPath},form:{parent:field.form.control??field.form.parent,control:void 0,get root(){return rootForm()}},get:(keyPath,fn)=>fieldQuery(keyPath,aliasField,this.#scopeMap,this.#options.resolvedField$(),fn),fieldGroup:signal(new SortedArray((a,b)=>a.priority-b.priority)),priority:0,renderConfig:signal({}),wrappers:signal([])};if(this.#scopeMap.set(name,aliasField),inputField===field)throw Error(`添加位置不可为自身`);return field.fieldGroup().push(aliasField),aliasField});if(!parent)throw Error("移动视图项失败");let index=inputField.parent.fieldGroup?.().findIndex(item=>item===inputField);"number"==typeof index&&-1!==index&&inputField.parent.fieldGroup?.().splice(index,1);let newKeyPath=inputField.fullPath.slice(parent.fullPath.length);inputField.keyPath=newKeyPath,inputField.parent=parent,parent.fieldGroup().push(inputField)}#resolveWrappers(wrappers){let result=(wrappers??[]).map(wrapper=>{if("string"==typeof wrapper){let config=this.#globalConfig?.wrappers?.[wrapper];if(!config)throw Error(`wrapper:未注册[${wrapper}]`);return{...config,inputs:signal(config.inputs),attributes:signal(config.attributes)}}if("string"!=typeof wrapper.type)return{...wrapper,inputs:signal(wrapper.inputs),attributes:signal(wrapper.attributes)};{let config=this.#globalConfig?.wrappers?.[wrapper.type];if(!config)throw Error(`wrapper:未注册[${wrapper.type}]`);return{inputs:signal({...config.inputs,...wrapper.inputs}),outputs:{...config.outputs,...wrapper.outputs},attributes:signal({...config.attributes,...wrapper.attributes}),type:config.type}}});return signal(result)}}function layout(value){return{kind:"metadata",type:"layout",reference:layout,value:value}}let rawConfig=createRawConfig("viewRawConfig");function setComponent(type){return rawConfig(field=>{field.type=type})}let setHooks=hooks=>rawConfig(field=>{field.hooks=hooks}),patchHooks=hooks=>rawConfig(field=>{field.hooks={...field.hooks,...hooks}}),DefaultOptions$1={position:"bottom"};function mergeHooksFn(hooks,options,field){for(let key in field.hooks??={},hooks){let oldFn=field.hooks[key];field.hooks[key]=(...args)=>{"top"===options.position&&hooks[key](...args),oldFn?.(...args),"bottom"===options.position&&hooks[key](...args)}}}let mergeHooks=(hooks,options=DefaultOptions$1)=>rawConfig(field=>mergeHooksFn(hooks,options,field));function removeHooks(list){return rawConfig(field=>{let oldValue=field.hooks;oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.hooks=oldValue)})}function setInputs(inputs){return rawConfig(field=>{field.inputs=inputs})}function patchInputs(inputs){return rawConfig(field=>{field.inputs={...field.inputs,...inputs}})}function removeInputs(list){return rawConfig(field=>{let oldValue=unWrapSignal$1(field.inputs);oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.inputs=oldValue)})}function asyncInputMerge(dataObj,data$){let signalObj={};Object.keys(dataObj).forEach(key=>{let result=dataObj[key];isPromise(result)?result.then(value=>{data$.update(lastData=>((lastData={...lastData})[key]=value,lastData))}):result&&"function"==typeof result.subscribe?result.subscribe({next:value=>{data$.update(lastData=>((lastData={...lastData})[key]=value,lastData))}}):isSignal(result)?signalObj[key]=result:data$.update(lastData=>((lastData={...lastData})[key]=result,lastData))});let signalKeyList=Object.keys(signalObj);return signalKeyList.length?linkedSignal(computed(()=>({...data$(),...signalKeyList.reduce((obj,key)=>({...obj,[key]:signalObj[key]()}),{})}))):data$}function patchAsyncFn(patchKey){return(dataObj,options)=>rawConfig(rawField=>{let inputList=Object.keys(dataObj),hookName=options?.hookName??"allFieldsResolved";return rawField[patchKey]={...rawField[patchKey],...inputList.reduce((obj,item)=>(obj[item]=rawField[patchKey]?.[item]??void 0,obj),{})},mergeHooksFn({[hookName]:field=>{field[patchKey]=asyncInputMerge(Object.entries(dataObj).reduce((obj,[key,value])=>(obj[key]=value(field),obj),{}),field[patchKey])}},{position:options?.addPosition??"bottom"},rawField)})}let patchAsyncInputs=patchAsyncFn("inputs");function setAttributes(attributes){return rawConfig(field=>{field.attributes=attributes})}function patchAttributes(attributes){return rawConfig(field=>{field.attributes={...field.attributes,...attributes}})}function removeAttributes(list){return rawConfig(field=>{let oldValue=unWrapSignal$1(field.attributes);oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.attributes=oldValue)})}let patchAsyncAttributes=patchAsyncFn("attributes");function setProps(props){return rawConfig(field=>{field.props=props})}function patchProps(props){return rawConfig(field=>{field.props={...field.props,...props}})}function removeProps(list){return rawConfig(field=>{let oldValue=unWrapSignal$1(field.props);oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.props=oldValue)})}let patchAsyncProps=patchAsyncFn("props");function setOutputs(outputs){return rawConfig(field=>{field.outputs=outputs})}function patchOutputs(outputs){return rawConfig(field=>{let oldValue=field.outputs;field.outputs={...oldValue,...outputs}})}function removeOutputs(list){return rawConfig(field=>{let oldValue=field.outputs;oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.outputs=oldValue)})}function mergeOutputFn(field,outputs,options){field.outputs.update(originOutputs=>{for(let key in originOutputs={...originOutputs},outputs){let oldFn=originOutputs[key];originOutputs[key]=(...args)=>{"top"===options.position&&outputs[key](...args,field),oldFn?.(...args,field),"bottom"===options.position&&outputs[key](...args,field)}}return originOutputs})}let DefaultOptions={position:"bottom"},mergeOutputs=(outputs,options=DefaultOptions)=>rawConfig(field=>{mergeHooksFn({allFieldsResolved:field=>{mergeOutputFn(field,outputs,options)}},{position:"bottom"},field)});function outputChangeFn(rawField,fn){mergeHooksFn({allFieldsResolved:field=>fn(list=>{let resultList=[];for(let item of list){let emitField=item.list?field.get(item.list):field,subject=new Subject;mergeOutputFn(field,{[item.output]:(...args)=>{subject.next(args)}},{position:"bottom"}),resultList.push({subject,field:emitField})}return combineLatest(resultList.map(({subject})=>subject.pipe(startWith(void 0)))).pipe(skip(1),map(list=>({list,field,listenFields:resultList.map(item=>item.field)})))})},{position:"bottom"},rawField)}function outputChange(fn){return rawConfig(field=>outputChangeFn(field,fn))}function setWrappers(wrappers){return rawConfig(field=>{field.wrappers=wrappers})}let defaultValue={position:"tail"};function patchWrappers(wrappers,options=defaultValue){return rawConfig(field=>{let list=toArray(wrappers);field.wrappers??=[],"tail"===options.position?field.wrappers.push(...list):field.wrappers.unshift(...list)})}function removeWrappers(list){return rawConfig(field=>{if(!field.wrappers)return;let wrappers=field.wrappers;for(let i=0;i<list.length;i++){let name=list[i];for(let j=0;j<wrappers.length;j++){let config=wrappers[j];if(("string"==typeof config?config:config.type)===name){wrappers.splice(j,1);break}}}field.wrappers=wrappers})}function setAlias(alias){return rawConfig(field=>{field.alias=alias})}function renderConfig(type){return rawConfig(field=>{field.renderConfig=type})}function formConfig(config){return rawConfig(field=>{field.formConfig={...field.formConfig,...config}})}let DefaultSelfList=[void 0];function valueChangeFn(field,input={}){return combineLatest((input.list??DefaultSelfList).map(keyPath=>keyPath?field.get(keyPath).form.control:field.form.control).map(control=>input.skipInitValue?control.valueChanges.pipe(skip(1)):control.valueChanges)).pipe(map(list=>({list,field,listenFields:list})))}function valueChange(listenFn){return rawConfig(field=>{mergeHooksFn({allFieldsResolved:field=>{listenFn(options=>valueChangeFn(field,options),field)}},{position:"bottom"},field)})}function hideWhen(options){return rawConfig(field=>(mergeHooksFn({allFieldsResolved:field=>{options.listen(options=>valueChangeFn(field,options),field).subscribe(hidden=>{field.renderConfig.update(value=>!!value.hidden!==hidden?{...value,hidden:hidden}:value),void 0!==options.disabled&&field.formConfig&&field.formConfig.update(value=>((value={...value}).disabled=!!hidden&&options.disabled,value))})}},{position:"bottom"},field),field))}function disableWhen(options){return rawConfig(field=>(mergeHooksFn({allFieldsResolved:field=>{options.listen(options=>valueChangeFn(field,options),field).subscribe(disabled=>{field.formConfig().disabled!==disabled&&field.formConfig.update(value=>({...value,disabled:disabled}))})}},{position:"bottom"},field),field))}function topClass(className,merge){return rawConfig(rawField=>{mergeHooksFn({fieldResolved:field=>{let wrappers=field.wrappers();wrappers?.length?wrappers[0].attributes.update(attributes=>({...attributes,class:merge?clsx(attributes?.class,className):clsx(className)})):field.attributes.update(attributes=>({...attributes,class:merge?clsx(attributes?.class,className):clsx(className)}))}},{position:"bottom"},rawField)})}function componentClass(className,merge){return rawConfig(field=>{field.attributes={...field.attributes,class:merge?clsx(field.attributes?.class,className):clsx(className)}})}function nonFieldControl(value=!0){return{kind:"metadata",type:"nonFieldControl",reference:nonFieldControl,value:value}}class CoreSchemaHandle extends BaseSchemaHandle{inputs;outputs;wrappers;attributes;alias;movePath;renderConfig;formConfig={};id;isLogicAnd=!1;isLogicOr=!1;isArray=!1;isTuple=!1;nonFieldControl=!1;hooks;lazySchema(schema){if(super.lazySchema(schema),this.parent){let wrappered=this.lazyWrapped;if(this.parent.isArray)this.parent.arrayChild=wrappered;else{let index=this.parent.children.findIndex(item=>item===this);this.parent.children[index]=wrappered}wrappered.parent=this.parent,wrappered.key=this.key}}arraySchema(schema){if(!this.isObjectControl){this.isArray=!0;let sh=new this.globalConfig.handle(this.globalConfig,this,schema);sh.parent=this,this.arrayChild=sh,convertSchema(schema.item,sh)}}defaultSchema(schema){this.defaultValue=schema.literal}tupleDefault(schema){super.tupleDefault(schema),this.isTuple=!0}enumSchema(schema){this.props??={},this.props.options??=schema.options}intersectBefore(schema){this.childrenAsVirtualGroup?"intersect"===this.type&&(this.type="intersect-group"):this.isLogicAnd=!0}logicItemSchema(schema,index,type){let sh=new this.globalConfig.handle(this.globalConfig,this,schema);this.childrenAsVirtualGroup||(sh.key=index),sh.setParent(this),convertSchema(schema,sh)}unionBefore(schema){this.childrenAsVirtualGroup||(this.isLogicOr=!0)}beforeSchemaType(schema){super.beforeSchemaType(schema),this.formConfig.required=!this.undefinedable&&!this.nullable}voidSchema(schema){this.nonFieldControl=!0}metadataDefaulthandle(metadata,environments){switch(metadata.type){case"viewRawConfig":metadata.value(this,this.globalConfig.context);break;case"layout":this.movePath=metadata.value.keyPath,this.priority=metadata.value.priority;break;case"nonFieldControl":this.nonFieldControl=metadata.value}}end(schema){super.end(schema),this.formConfig.defaultValue=this.defaultValue}}function convert(obj,options){let buildOptions={form$$:computed(()=>buildOptions.resolvedField$()?.form.control),resolvedField$:signal(void 0),context:computed(()=>options.context)},injector=Injector.create({providers:[{provide:PI_FORM_BUILDER_OPTIONS_TOKEN,useValue:buildOptions},{provide:PI_VIEW_CONFIG_TOKEN,useValue:options.fieldGlobalConfig},options.builder,{provide:EnvironmentInjector,useFactory:()=>injector}],parent:options.injector});return options.registerOnDestroy?.(()=>{injector.get(EnvironmentInjector).destroy()}),convertCore(obj,item=>(injector.get(options.builder).buildRoot({field:item,resolvedField$:buildOptions.resolvedField$}),buildOptions.resolvedField$()),{...options,handle:options?.handle??CoreSchemaHandle})}let NFCSchema=v.optional(v.void());export{AbstractControl,CoreSchemaHandle,FieldArray,FieldControl,FieldGroup,FieldLogicGroup,FormBuilder,INVALID,NFCSchema,PENDING,PI_FORM_BUILDER_ALIAS_MAP,PI_FORM_BUILDER_OPTIONS_TOKEN,PI_VIEW_CONFIG_TOKEN,SortedArray,VALID,arrayStartsWith,asyncInputMerge,clone,componentClass,controlStatusList,convert,createViewControlLink,disableWhen,effectListen,fieldControlStatusClass,formConfig,hideWhen,isArray,isFieldArray,isFieldControl,isFieldGroup,isFieldLogicGroup,isGroup,layout,mergeHooks,mergeHooksFn,mergeOutputFn,mergeOutputs,nonFieldControl,outputChange,outputChangeFn,patchAsyncAttributes,patchAsyncFn,patchAsyncInputs,patchAsyncProps,patchAttributes,patchHooks,patchInputs,patchOutputs,patchProps,patchWrappers,rawConfig,removeAttributes,removeHooks,removeInputs,removeOutputs,removeProps,removeWrappers,renderConfig,setAlias,setAttributes,setComponent,setHooks,setInputs,setOutputs,setProps,setWrappers,toArray,toObservable,topClass,unWrapSignal$1 as unWrapSignal,valueChange,valueChangeFn};
|
|
1
|
+
import{effect,inject,Injector,untracked,DestroyRef,isSignal,signal,computed,linkedSignal,InjectionToken,EnvironmentInjector}from"@angular/core";import*as v from"valibot";import{deepEqual}from"fast-equals";import{BehaviorSubject,isObservable,Subject,combineLatest,startWith,skip,map}from"rxjs";import rfdc from"rfdc";import{createRawConfig,BaseSchemaHandle,convertSchema,convertCore}from"@piying/valibot-visit";export{asControl,asVirtualGroup,changeObject,condition,getDefaults,getSchemaByIssuePath,getSchemaMetadata}from"@piying/valibot-visit";import clsx from"clsx";function arrayStartsWith(list,parts){return(Array.isArray(parts)?parts:[parts]).every((item,index)=>item===list[index])}function effectListen(listen,fn,options){let first=!0,oldValue=listen();return effect(()=>{let currentValue=listen();if(first){first=!1,deepEqual(oldValue,currentValue)||fn();return}return fn()},options)}function toObservable(listen,source,options){let injector=options?.injector??inject(Injector),subject=new BehaviorSubject(source()),watcher=effectListen(listen,()=>{let value;try{value=source()}catch(err){untracked(()=>subject.error(err));return}untracked(()=>subject.next(value))},{injector,manualCleanup:!0});return injector.get(DestroyRef).onDestroy(()=>{watcher.destroy(),subject.complete()}),subject.asObservable()}let clone=rfdc({proto:!1,circles:!1});function unWrapSignal$1(value){return isSignal(value)?value():value}function toArray(input){return void 0===input||Array.isArray(input)?input:[input]}class SortedArray extends Array{#compareFn;constructor(compareFn){super(),this.#compareFn=compareFn}push(...items){let result=super.push(...items);return this.sort(this.#compareFn),result}}function createViewControlLink(fieldControl,cva,injector){cva.registerOnChange(value=>{fieldControl().disabled$$()||(fieldControl().pendingStatus.update(status=>({...status,value:value,change:!0})),"change"===fieldControl().updateOn$$()&&fieldControl().viewValueChange(value))}),cva.registerOnTouched(()=>{if(fieldControl().disabled$$())return;let updateOn=fieldControl().updateOn$$(),pendingStatus=fieldControl().pendingStatus();"submit"===updateOn?fieldControl().pendingStatus.update(status=>({...status,touched:!0})):(fieldControl().markAsTouched(),pendingStatus.change&&"blur"===updateOn&&(fieldControl().viewValueChange(pendingStatus.value),fieldControl().pendingStatus.update(status=>({...status,change:!1,value:void 0}))))});let disposeList=[],ref=effect(()=>{let value=fieldControl().modelValueToViewValue$$();untracked(()=>{cva.writeValue(value)})},{injector:injector});if(cva.writeValue(fieldControl().modelValueToViewValue$$()),disposeList.push(()=>ref.destroy()),cva.setDisabledState){let disabledRef=effect(()=>{let value=fieldControl().disabled$$();untracked(()=>{cva.setDisabledState(value)})},{injector:injector});cva.setDisabledState(fieldControl().disabled$$()),disposeList.push(()=>disabledRef.destroy())}return()=>{disposeList.forEach(fn=>fn()),untracked(()=>{fieldControl().updateValue(fieldControl().value$$(),!0)})}}function controlStatusList(fieldControl,skipDisabled){if(!fieldControl)return[];let statusList=[];switch(!skipDisabled&&fieldControl.disabled$$()&&statusList.push("disabled"),fieldControl.touched$$()?statusList.push("touched"):statusList.push("untouched"),fieldControl.dirty$$()?statusList.push("dirty"):statusList.push("pristine"),fieldControl.status$$()){case"VALID":statusList.push("valid");break;case"INVALID":statusList.push("invalid");break;case"PENDING":statusList.push("pending")}return statusList}function fieldControlStatusClass(fieldControl,skipDisabled){return controlStatusList(fieldControl,skipDisabled).map(item=>`pi-${item}`).join(" ")}function isPromise(obj){return!!obj&&"function"==typeof obj.then}let ValidatorPending=Symbol("PENDING");function shortCircuitTrue(value){return value}let VALID="VALID",INVALID="INVALID",PENDING="PENDING";class AbstractControl{emptyValue$$=computed(()=>clone(this.config$().emptyValue));shouldInclude$$=computed(()=>this.valueNoError$$()&&(!this.selfDisabled$$()||this.selfDisabled$$()&&"reserve"===this.config$().disabledValue));injector;selfDisabled$$=computed(()=>this.config$?.().disabled??!1);selfEnabled$$=computed(()=>!this.selfDisabled$$());disabled$$=computed(()=>(this.parent?.disabled$$()||this.selfDisabled$$())??!1);enabled$$=computed(()=>!this.disabled$$());get disabled(){return this.disabled$$()}get enabled(){return!this.disabled$$()}enable(){this.config$.update(config=>({...config,disabled:!1}))}disable(){this.config$.update(config=>({...config,disabled:!0}))}selfTouched$=signal(!1);touched$$=computed(()=>this.reduceChildren(this.selfTouched$(),(child,value)=>value||child.touched$$(),shortCircuitTrue));get touched(){return untracked(this.touched$$)}get untouched(){return!untracked(this.touched$$)}selfDirty$=signal(!1);dirty$$=computed(()=>this.reduceChildren(this.selfDirty$(),(child,value)=>value||child.dirty$$(),shortCircuitTrue));get dirty(){return untracked(this.dirty$$)}get pristine(){return!untracked(this.dirty$$)}#validators$$=computed(()=>this.config$().validators??[]);#asyncValidators$$=computed(()=>this.config$().asyncValidators??[]);resetIndex$=signal(0);syncError$=linkedSignal(computed(()=>{if(this.disabled$$())return;this.resetIndex$(),this.value$$();let result=this.#validators$$().reduce((obj,item)=>{let result=untracked(()=>item(this));return result&&(obj={...obj,...result}),obj},{}),schemaResult=this.#schemaCheck$$();return schemaResult.success?Object.keys(result).length?result:void 0:{...result,valibot:schemaResult.issues}},{equal:()=>!1}));asyncErrorRes$$=computed(()=>{let result=this.#asyncValidators$$();if(0===result.length)return;this.resetIndex$(),this.value$$();let dataList=result.map(item=>untracked(()=>(function(input){if(isPromise(input)){let value$=signal(ValidatorPending);return input.then(value=>{value$.set({value})}),value$}if(!isObservable(input))return input;let value$=signal(ValidatorPending);return input.subscribe({next:value=>{value$.set({value})},error:error=>{value$.set({error})}}),value$})(item(this))));return computed(()=>{let params=dataList.map(item=>item()),pendingCount=0,errorResult=params.reduce((obj,item)=>item===ValidatorPending?(pendingCount++,obj):"value"in item?{...obj,...item.value}:{...obj,error:item.error},{});return Object.keys(errorResult).length?errorResult:pendingCount?ValidatorPending:void 0})});asyncError$$=computed(()=>{if(this.disabled$$())return;let ref=this.asyncErrorRes$$();if(ref){let result=ref();return result===ValidatorPending?PENDING:result}});rawError$$=computed(()=>{if(this.disabled$$())return;let syncError=this.syncError$(),asyncError=this.asyncError$$();return asyncError===PENDING?PENDING:syncError&&asyncError?{...syncError,...asyncError}:syncError||asyncError?syncError||asyncError:void 0});valueNoError$$=computed(()=>void 0===this.rawError$$());get errors(){let error=this.rawError$$();return error===PENDING?void 0:error}_parent;get parent(){return this._parent}get value(){return this.value$$()}required$$=computed(()=>this.config$().required);schemaParser;constructor(rawSchema,injector){this.injector=injector,this.schemaParser=v.safeParser(rawSchema)}#schemaCheck$$=computed(()=>this.schemaParser(this.value$$()));setParent(parent){this._parent=parent}get valid(){return this.status$$()===VALID}get invalid(){return this.status$$()===INVALID}get pending(){return this.status$$()===PENDING}selfUpdateOn$$=computed(()=>this.config$?.().updateOn);updateOn$$=computed(()=>(this.selfUpdateOn$$()||this.parent?.updateOn$$())??"change");markAsTouched(){this.selfTouched$.set(!0)}markAllAsDirty(){this.markAsDirty(),this._forEachChild(control=>control.markAllAsDirty())}markAllAsTouched(){this.markAsTouched(),this._forEachChild(control=>control.markAllAsTouched())}markAsUntouched(){this.selfTouched$.set(!1)}markAsDirty(){this.selfDirty$.set(!0)}markAsPristine(){this.selfDirty$.set(!1)}getRawValue(){return this.value}get(path){let currPath=path;return null==currPath||(Array.isArray(currPath)||(currPath=currPath.split(".")),0===currPath.length)?null:currPath.reduce((control,name)=>control&&control.find(name),this)}get root(){let x=this;for(;x._parent;)x=x._parent;return x}config$=signal({});initConfig(config){this.config$=config}find(name){return null}setControl(name,control){}reduceChildren(initialValue,fn,shortCircuit){let childrenMap=this.children$$?.();if(!childrenMap)return initialValue;let value=initialValue;for(let child of childrenMap){if(shortCircuit?.(value))break;value=fn(child,value)}return value}#valueChange;get valueChanges(){return this.#valueChange??(this.#valueChange=toObservable(computed(()=>({value:this.value$$(),disabled:this.disabled$$()})),this.value$$,{injector:this.injector}))}status$$=computed(()=>{if(this.disabled$$())return VALID;let childStatus=this.reduceChildren(VALID,(child,value)=>value===INVALID||child.status$$()===INVALID?INVALID:value===PENDING||child.status$$()===PENDING?PENDING:VALID,v=>v===INVALID||v===PENDING);if(childStatus===VALID&&this.rawError$$())if(this.rawError$$()!==PENDING)return INVALID;else return PENDING;return childStatus});#statusChange;get statusChanges(){return this.#statusChange??(this.#statusChange=toObservable(this.status$$,this.status$$,{injector:this.injector}))}emitSubmit(){this.children$$&&this.children$$().forEach(child=>{child.emitSubmit()})}}class FieldArray extends AbstractControl{#deletionMode$$=computed(()=>this.config$().deletionMode??"shrink");value$$=computed(()=>{let list=[];for(let control of this.controls$())if(control&&control.shouldInclude$$())list.push(control.value$$());else{if("shrink"===this.#deletionMode$$())continue;"mark"===this.#deletionMode$$()&&list.push(void 0)}let returnResult=0===list.length?this.emptyValue$$():list;return this.config$().transfomer?.toModel?.(returnResult,this)??returnResult});children$$=computed(()=>this.controls$());controls$=signal([]);get controls(){return this.controls$()}removeAt(index){let adjustedIndex=this._adjustIndex(index);this.controls$()[adjustedIndex]&&this.controls$.update(list=>((list=list.slice()).splice(adjustedIndex,1),list))}setControl(index,control){let adjustedIndex=this._adjustIndex(index);this.controls$.update(list=>((list=list.slice())[adjustedIndex]=control,list)),control.setParent(this)}get length(){return this.controls$().length}reset(value=[]){this._forEachChild((control,index)=>{control.reset(value[index])})}getRawValue(){return this.controls$().map(control=>control.getRawValue())}clear(){this.controls$().length<1||this.controls$.update(()=>[])}_adjustIndex(index){return index<0?Math.max(index+this.length,0):index}_forEachChild(cb){this.controls$().forEach((control,index)=>{control&&cb(control,index)})}find(name){return this.controls$()[this._adjustIndex(name)]}beforeUpdateList=[];updateValue(value=[]){if(deepEqual(value,this.value$$()))return;let viewValue=this.config$().transfomer?.toView?.(value,this)??value;this.beforeUpdateList.forEach(item=>item(viewValue)),this.controls$().forEach((control,i)=>{control.updateValue(viewValue[i])})}}let InitPendingValue={touched:!1,change:!1,value:void 0};class FieldControl extends AbstractControl{pendingStatus=signal(InitPendingValue);children$$;#viewIndex=0;viewIndex$=signal(0);modelValue$=signal(void 0);modelValueToViewValueOrigin$$=computed(()=>{let viewValue=this.modelValue$(),toView=this.config$?.().transfomer?.toView;return toView?toView(viewValue,this):viewValue});modelValueToViewValue$$=computed(()=>(this.viewIndex$(),this.modelValueToViewValueOrigin$$()),{equal:()=>!1});value$$=signal(void 0);reset(formState=this.config$().defaultValue){this.updateValue(formState,!0),this.markAsPristine(),this.markAsUntouched()}_forEachChild(cb){}#initInput=!0;#viewSubject$$=computed(()=>{let subject=new Subject;return this.injector.get(DestroyRef).onDestroy(()=>{subject.complete()}),subject.pipe(this.config$().pipe.toModel).subscribe(value=>{untracked(()=>{this.#viewValueChange(value)})}),subject});#viewValueChange(value){this.markAllAsDirty(),this.#viewIndex++;let toModel=this.config$?.().transfomer?.toModel,originValue=toModel?toModel(value,this):value,transfomered=this.schemaParser(originValue);transfomered.success?(this.value$$.set(transfomered.output),this.syncError$.update(data=>(data&&delete data.valibot,data&&Object.keys(data).length?data:void 0))):this.syncError$.update(data=>({...data,valibot:transfomered.issues}))}viewValueChange(value){this.config$().pipe?.toModel?this.#viewSubject$$().next(value):this.#viewValueChange(value)}updateValue(value,force){if(force&&(this.#viewIndex++,this.viewIndex$.set(this.#viewIndex),this.resetIndex$.update(a=>a+1),this.#initInput=!0),this.#initInput){this.#initInput=!1,(void 0!==value&&!deepEqual(value,this.value$$())||force)&&(this.modelValue$.set(value),this.value$$.set(value));return}deepEqual(value,this.value$$())||(this.viewIndex$.set(this.#viewIndex),this.modelValue$.set(value),this.value$$.set(value))}initConfig(config){super.initConfig(config),"defaultValue"in this.config$()&&(this.modelValue$.set(this.config$().defaultValue),this.value$$.set(this.config$().defaultValue))}emitSubmit(){let pendingStatus=this.pendingStatus();pendingStatus.touched&&this.markAsTouched(),pendingStatus.change&&this.viewValueChange(pendingStatus.value),this.pendingStatus.set(InitPendingValue)}}class FieldLogicGroup extends FieldArray{activateIndex$=signal(0);type=signal("and");activateControl$=signal(void 0);value$$=computed(()=>{let returnResult=this.getValue(!1);return this.config$().transfomer?.toModel?.(returnResult,this)??returnResult});getActivateControls(){let list;if(this.activateControl$())list=this.activateControl$();else if("and"===this.type())list=this.controls$();else if("or"===this.type())list=[this.controls$()[this.activateIndex$()]];else throw Error("");return list}getValue(rawData){let controls=rawData?this.getActivateControls():this.getActivateControls().filter(control=>control.shouldInclude$$()),control=controls[0];if(0===controls.length)return this.emptyValue$$();if(1===controls.length)return control.value;let result=controls.reduce((obj,control)=>({...obj,...control.value$$()}),{});return Object.keys(result).length?result:this.emptyValue$$()}getRawValue(){return this.getValue(!0)}updateValue(value){if(deepEqual(value,this.value$$()))return;let viewValue=this.config$().transfomer?.toView?.(value,this)??value;this.controls$().forEach((control,i)=>{control.updateValue(viewValue)})}}function isFieldGroup(input){return input instanceof FieldGroup}function isFieldArray(input){return input instanceof FieldArray}function isFieldControl(input){return input instanceof FieldControl}function isFieldLogicGroup(input){return input instanceof FieldLogicGroup}class FieldGroup extends AbstractControl{value$$=computed(()=>{let result={...this._reduceChildren({},(acc,control,name)=>(control.shouldInclude$$()&&(acc[name]=control.value),acc)),...this.looseValue$$()},returnResult=Object.keys(result).length?result:this.emptyValue$$();return this.config$().transfomer?.toModel?.(returnResult,this)??returnResult});children$$=computed(()=>Object.values(this.controls$()));controls$=signal({});get controls(){return this.controls$()}registerControl(name,control){return this.controls$()[name]?this.controls$()[name]:(this.controls$.update(controls=>({...controls,[name]:control})),control.setParent(this),control)}removeControl(name){this.controls$()[name]&&this.controls$.update(controls=>(controls={...controls},delete controls[name],controls))}setControl(name,control){this.controls$.update(controls=>(controls={...controls},delete controls[name],controls)),control&&this.registerControl(name,control)}reset(value={}){this._forEachChild((control,name)=>{control.reset(value?value[name]:void 0)})}getRawValue(){return this._reduceChildren({},(acc,control,name)=>(acc[name]=control.getRawValue(),acc))}_forEachChild(cb){Object.keys(this.controls$()).forEach(key=>{let control=this.controls$()[key];control&&cb(control,key)})}_reduceChildren(initValue,fn){let res=initValue;return this._forEachChild((control,name)=>{res=fn(res,control,name)}),res}find(name){return this.controls$()[name]}looseValue$$=computed(()=>{let resetValue=this.#inputValue$();if(!resetValue||isFieldLogicGroup(this.parent))return{};let controls=this.controls$(),looseValue={};for(let key in resetValue)key in controls||(looseValue[key]=resetValue[key]);return looseValue});#inputValue$=signal({});#setInputValue(obj){this.#inputValue$.set(obj)}updateValue(value){if(deepEqual(value,this.value$$()))return;deepEqual(value,this.#inputValue$())||this.#setInputValue(value);let viewValue=this.config$().transfomer?.toView?.(value,this)??value;for(let key in this.controls$())this.controls$()[key].updateValue(viewValue?.[key])}}let PI_VIEW_CONFIG_TOKEN=new InjectionToken("PI_VIEW_CONFIG"),PI_FORM_BUILDER_OPTIONS_TOKEN=new InjectionToken("PI_FORM_BUILDER_OPTIONS"),PI_FORM_BUILDER_ALIAS_MAP=new InjectionToken("PI_FORM_BUILDER_ALIAS_MAP");function isGroup(schema){return schema.isGroup}function isArray(schema){return schema.isArray}function unWrapSignal(value){return isSignal(value)?value():value}class ParentMap extends Map{parent;constructor(parent){super(),this.parent=parent}get(key){let result=super.get(key);return void 0===result?this.parent?.get(key):result}}function fieldQuery(key,field,aliasMap,root,aliasNotFoundFn){let list,keyPath=Array.isArray(key)?key:"number"==typeof key?[key]:key.split("."),firstPath=keyPath[0];if("#"===firstPath)field=root,list=[{field:root,level:1}];else if(".."===firstPath)list=[{field:field.parent,level:1}];else if("string"==typeof firstPath&&firstPath.startsWith("@")){let queryField=aliasMap.get(firstPath.slice(1));!queryField&&aliasNotFoundFn&&(queryField=aliasNotFoundFn(firstPath.slice(1),field)),list=[{field:queryField,level:1}]}else field.fieldGroup?list=(function* groupGenerator(list){for(let item of list)!item.keyPath?.length&&item.fieldGroup?.().length?yield*groupGenerator(item.fieldGroup()):item.keyPath?.length&&(yield item)})(field.fieldGroup()).filter(field=>field.keyPath&&arrayStartsWith(keyPath,field.keyPath)).map(field=>({field:field,level:field.keyPath?.length})):field.fieldArray&&(list=field.fieldArray().filter(field=>field.keyPath&&arrayStartsWith(keyPath,field.keyPath)).map(field=>({field:field,level:field.keyPath?.length})));if(list)for(let item of list){if(keyPath.length===item.level)return item.field;let res=item.field.get(keyPath.slice(item.level),aliasNotFoundFn);if(res)return res}}class FormBuilder{#scopeMap=inject(PI_FORM_BUILDER_ALIAS_MAP,{optional:!0})??new ParentMap;#options=inject(PI_FORM_BUILDER_OPTIONS_TOKEN);#injector=inject(Injector);#envInjector=inject(EnvironmentInjector);#globalConfig=inject(PI_VIEW_CONFIG_TOKEN,{optional:!0})??void 0;#allFieldInitHookList=[];buildRoot(item){this.#buildControl({type:"root",field:{fullPath:[]},form:void 0,resolvedField$:item.resolvedField$,append:()=>{}},item.field,0),this.allFieldInitHookCall()}allFieldInitHookCall(){let list=this.#allFieldInitHookList;this.#allFieldInitHookList=[],list.forEach(fn=>fn())}#buildField(item){"group"===item.type?this.#buildGroup(item):this.#buildArray(item)}afterResolveConfig(rawConfig,config){}#buildControl(parent,field,index){var parentForm,key,injector;let viewDefaultConfig,define,control,FieldClass,control1,type=field.type;if(type){let result=this.#resolveComponent(type);viewDefaultConfig=result.defaultConfig,define=result.define}let mergeStrategy=this.#globalConfig?.defaultConfigMergeStrategy,inputs=this.configMerge([this.#globalConfig?.defaultConfig?.inputs,viewDefaultConfig?.inputs,field.inputs],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.inputs??"merge"),outputs=this.configMerge([this.#globalConfig?.defaultConfig?.outputs,viewDefaultConfig?.outputs,field.outputs],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.outputs??"merge"),attributes=this.configMerge([this.#globalConfig?.defaultConfig?.attributes,viewDefaultConfig?.attributes,field.attributes],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.attributes??"merge"),wrappers1=this.configMergeRaw([this.#globalConfig?.defaultConfig?.wrappers,viewDefaultConfig?.wrappers,field.wrappers],!0,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.wrappers??"replace"),wrappers=this.#resolveWrappers(wrappers1),props=this.configMerge([this.#globalConfig?.defaultConfig?.props,viewDefaultConfig?.props,field.props],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.props??"merge"),formConfig$=this.configMerge([this.#globalConfig?.defaultConfig?.formConfig,viewDefaultConfig?.formConfig,field.formConfig],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.formConfig??"merge"),renderConfig=this.configMerge([this.#globalConfig?.defaultConfig?.renderConfig,viewDefaultConfig?.renderConfig,field.renderConfig],!1,"string"==typeof mergeStrategy?mergeStrategy:mergeStrategy?.renderConfig??"merge"),keyPath=field.key;isFieldLogicGroup(parent.form)?keyPath??=parent.form.controls$().length:isFieldArray(parent.form)&&(keyPath??=index);let isRoot="root"===parent.type;!field.nonFieldControl&&(void 0!==keyPath||isRoot)&&(parentForm=parent.form,key=keyPath,injector=this.#injector,FieldClass=field.isLogicAnd||field.isLogicOr?FieldLogicGroup:isGroup(field)?FieldGroup:isArray(field)||field.isTuple?FieldArray:FieldControl,isRoot?(isFieldLogicGroup(control1=new FieldClass(field.sourceSchema,injector))&&control1.type.set(field.isLogicAnd?"and":"or"),control1.initConfig(formConfig$)):(control1=parentForm.get([key]))||(isFieldLogicGroup(control1=new FieldClass(field.sourceSchema,injector))&&control1.type.set(field.isLogicAnd?"and":"or"),parentForm.setControl?.(key,control1),control1.initConfig(formConfig$)),control=control1);let rootForm=this.#options.form$$,resolvedConfig={id:field.id,keyPath:toArray(keyPath),get fullPath(){return[...resolvedConfig.parent.fullPath,...resolvedConfig.keyPath??[]]},form:{parent:parent.form,control:control??(isGroup(field)?parent.form:void 0),get root(){return rootForm()}},get:(keyPath,aliasNotFoundFn)=>untracked(()=>fieldQuery(keyPath,resolvedConfig,this.#scopeMap,this.#options.resolvedField$(),aliasNotFoundFn)),parent:parent.field,origin:field,renderConfig:renderConfig,formConfig:formConfig$,props,context:this.#options.context(),priority:field.priority,hooks:field.hooks,alias:field.alias,inputs:inputs,outputs:outputs,attributes,define:define?{...define,inputs,outputs,attributes}:void 0,wrappers};return resolvedConfig=this.afterResolveConfig(field,resolvedConfig)??resolvedConfig,field.movePath?this.#moveViewField(field.movePath,resolvedConfig):parent.append(resolvedConfig),field.alias&&this.#scopeMap.set(field.alias,resolvedConfig),resolvedConfig.hooks?.fieldResolved?.(resolvedConfig),isRoot&&parent.resolvedField$.set(resolvedConfig),isGroup(field)||field.isLogicAnd||field.isLogicOr||field.isTuple?(resolvedConfig.fieldGroup=signal(new SortedArray((a,b)=>a.priority-b.priority)),this.#buildField({type:"group",fields:field.children,field:resolvedConfig,form:control||parent.form,append:field=>{resolvedConfig.fieldGroup().push(field)}})):isArray(field)&&this.#buildField({type:"array",templateField:field.arrayChild,field:resolvedConfig,form:control,append:field=>{}}),resolvedConfig.hooks?.allFieldsResolved&&this.#allFieldInitHookList.push(()=>{resolvedConfig.hooks.allFieldsResolved(resolvedConfig)}),resolvedConfig}#buildGroup(groupItem){for(let index=0;index<groupItem.fields.length;index++){let field=groupItem.fields[index];this.#buildControl(groupItem,field,index)}let field=groupItem.field;field.hooks?.afterChildrenInit?.(field)}createArrayItem(parent,field,index){let Builder=this.constructor,injector=Injector.create({providers:[Builder,{provide:PI_FORM_BUILDER_ALIAS_MAP,useValue:new ParentMap(this.#scopeMap)},{provide:EnvironmentInjector,useFactory:()=>injector}],parent:this.#envInjector});this.#envInjector.get(DestroyRef).onDestroy(()=>{result.injector?.destroy()});let instance=injector.get(Builder),result=instance.#buildControl(parent,field,index);return this.#allFieldInitHookList.push(()=>instance.allFieldInitHookCall()),result.injector=injector.get(EnvironmentInjector),result}#buildArray(arrayItem){let{templateField,form}=arrayItem;arrayItem.field.action={set:(value,index)=>{untracked(()=>{index="number"==typeof index?index:arrayItem.field.fieldArray?.().length??0;let result=this.createArrayItem(arrayItem,templateField,index),list=[...arrayItem.field.fieldArray()];list[index]=result,arrayItem.field.fieldArray.set(list),this.allFieldInitHookCall(),result.form.control.updateValue(value)})},remove:index=>{untracked(()=>{let list=[...arrayItem.field.fieldArray()],[deletedItem]=list.splice(index,1);arrayItem.field.fieldArray.set(list),form.removeAt(index),deletedItem&&(deletedItem.injector.destroy(),deletedItem.injector=void 0)})}},arrayItem.field.fieldArray=signal([]),arrayItem.field.hooks?.afterChildrenInit?.(arrayItem.field),form.beforeUpdateList.push(input=>{let controlLength=form.controls$().length;if(controlLength<input.length){let list=arrayItem.field.fieldArray().slice();for(let index=controlLength;index<input.length;index++){let result=this.createArrayItem(arrayItem,arrayItem.templateField,index);list[index]=result}arrayItem.field.fieldArray.set(list)}else if(input.length<controlLength){let list=arrayItem.field.fieldArray().slice();for(let index=arrayItem.field.fieldArray().length-1;index>=input.length;index--){let[deletedItem]=list.splice(index,1);form.removeAt(index),deletedItem&&(deletedItem.injector?.destroy(),deletedItem.injector=void 0)}arrayItem.field.fieldArray.set(list)}this.allFieldInitHookCall()})}#resolveComponent(type){let define,defaultConfig;if("string"!=typeof type)return{define:{type:type}};{let config=this.#globalConfig?.types?.[type];if(!config)throw Error(`define:未注册[${type}]`);if(defaultConfig=config,Object.keys(config).length)return define={...config},{define:{...config},defaultConfig}}return{define,defaultConfig}}configMergeRaw(list,isArray,strategy){return clone(isArray?"merge"===strategy?list.filter(Boolean).flat().map(item=>unWrapSignal(item)):list.reduce((data,item)=>unWrapSignal(item)??data,[]):"merge"===strategy?list.reduce((obj,item)=>({...obj,...unWrapSignal(item)}),{}):list.reduce((data,item)=>unWrapSignal(item)??data,{}))}configMerge(list,isArray,strategy){return signal(this.configMergeRaw(list,isArray,strategy))}#moveViewField(key,inputField){let parent=fieldQuery(key,inputField,this.#scopeMap,this.#options.resolvedField$(),(name,field)=>{let rootForm=this.#options.form$$,aliasField={alias:name,parent:field,get fullPath(){return field.fullPath},form:{parent:field.form.control??field.form.parent,control:void 0,get root(){return rootForm()}},get:(keyPath,fn)=>fieldQuery(keyPath,aliasField,this.#scopeMap,this.#options.resolvedField$(),fn),fieldGroup:signal(new SortedArray((a,b)=>a.priority-b.priority)),priority:0,renderConfig:signal({}),wrappers:signal([])};if(this.#scopeMap.set(name,aliasField),inputField===field)throw Error(`添加位置不可为自身`);return field.fieldGroup().push(aliasField),aliasField});if(!parent)throw Error("移动视图项失败");let index=inputField.parent.fieldGroup?.().findIndex(item=>item===inputField);"number"==typeof index&&-1!==index&&inputField.parent.fieldGroup?.().splice(index,1);let newKeyPath=inputField.fullPath.slice(parent.fullPath.length);inputField.keyPath=newKeyPath,inputField.parent=parent,parent.fieldGroup().push(inputField)}#resolveWrappers(wrappers){let result=(wrappers??[]).map(wrapper=>{if("string"==typeof wrapper){let config=this.#globalConfig?.wrappers?.[wrapper];if(!config)throw Error(`wrapper:未注册[${wrapper}]`);return{...config,inputs:signal(config.inputs),attributes:signal(config.attributes)}}if("string"!=typeof wrapper.type)return{...wrapper,inputs:signal(wrapper.inputs),attributes:signal(wrapper.attributes)};{let config=this.#globalConfig?.wrappers?.[wrapper.type];if(!config)throw Error(`wrapper:未注册[${wrapper.type}]`);return{inputs:signal({...config.inputs,...wrapper.inputs}),outputs:{...config.outputs,...wrapper.outputs},attributes:signal({...config.attributes,...wrapper.attributes}),type:config.type}}});return signal(result)}}function layout(value){return{kind:"metadata",type:"layout",reference:layout,value:value}}let rawConfig=createRawConfig("viewRawConfig");function setComponent(type){return rawConfig(field=>{field.type=type})}let setHooks=hooks=>rawConfig(field=>{field.hooks=hooks}),patchHooks=hooks=>rawConfig(field=>{field.hooks={...field.hooks,...hooks}}),DefaultOptions$1={position:"bottom"};function mergeHooksFn(hooks,options,field){for(let key in field.hooks??={},hooks){let oldFn=field.hooks[key];field.hooks[key]=(...args)=>{"top"===options.position&&hooks[key](...args),oldFn?.(...args),"bottom"===options.position&&hooks[key](...args)}}}let mergeHooks=(hooks,options=DefaultOptions$1)=>rawConfig(field=>mergeHooksFn(hooks,options,field));function removeHooks(list){return rawConfig(field=>{let oldValue=field.hooks;oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.hooks=oldValue)})}function setInputs(inputs){return rawConfig(field=>{field.inputs=inputs})}function patchInputs(inputs){return rawConfig(field=>{field.inputs={...field.inputs,...inputs}})}function removeInputs(list){return rawConfig(field=>{let oldValue=unWrapSignal$1(field.inputs);oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.inputs=oldValue)})}function asyncInputMerge(dataObj,data$){let signalObj={};Object.keys(dataObj).forEach(key=>{let result=dataObj[key];isPromise(result)?result.then(value=>{data$.update(lastData=>((lastData={...lastData})[key]=value,lastData))}):result&&"function"==typeof result.subscribe?result.subscribe({next:value=>{data$.update(lastData=>((lastData={...lastData})[key]=value,lastData))}}):isSignal(result)?signalObj[key]=result:data$.update(lastData=>((lastData={...lastData})[key]=result,lastData))});let signalKeyList=Object.keys(signalObj);return signalKeyList.length?linkedSignal(computed(()=>({...data$(),...signalKeyList.reduce((obj,key)=>({...obj,[key]:signalObj[key]()}),{})}))):data$}function patchAsyncFn(patchKey){return(dataObj,options)=>rawConfig(rawField=>{let inputList=Object.keys(dataObj),hookName=options?.hookName??"allFieldsResolved";return rawField[patchKey]={...rawField[patchKey],...inputList.reduce((obj,item)=>(obj[item]=rawField[patchKey]?.[item]??void 0,obj),{})},mergeHooksFn({[hookName]:field=>{field[patchKey]=asyncInputMerge(Object.entries(dataObj).reduce((obj,[key,value])=>(obj[key]=value(field),obj),{}),field[patchKey])}},{position:options?.addPosition??"bottom"},rawField)})}let patchAsyncInputs=patchAsyncFn("inputs");function setAttributes(attributes){return rawConfig(field=>{field.attributes=attributes})}function patchAttributes(attributes){return rawConfig(field=>{field.attributes={...field.attributes,...attributes}})}function removeAttributes(list){return rawConfig(field=>{let oldValue=unWrapSignal$1(field.attributes);oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.attributes=oldValue)})}let patchAsyncAttributes=patchAsyncFn("attributes");function setProps(props){return rawConfig(field=>{field.props=props})}function patchProps(props){return rawConfig(field=>{field.props={...field.props,...props}})}function removeProps(list){return rawConfig(field=>{let oldValue=unWrapSignal$1(field.props);oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.props=oldValue)})}let patchAsyncProps=patchAsyncFn("props");function setOutputs(outputs){return rawConfig(field=>{field.outputs=outputs})}function patchOutputs(outputs){return rawConfig(field=>{let oldValue=field.outputs;field.outputs={...oldValue,...outputs}})}function removeOutputs(list){return rawConfig(field=>{let oldValue=field.outputs;oldValue&&(list.forEach(item=>{delete oldValue[item]}),field.outputs=oldValue)})}function mergeOutputFn(field,outputs,options){field.outputs.update(originOutputs=>{for(let key in originOutputs={...originOutputs},outputs){let oldFn=originOutputs[key];originOutputs[key]=(...args)=>{"top"===options.position&&outputs[key](...args,field),oldFn?.(...args,field),"bottom"===options.position&&outputs[key](...args,field)}}return originOutputs})}let DefaultOptions={position:"bottom"},mergeOutputs=(outputs,options=DefaultOptions)=>rawConfig(field=>{mergeHooksFn({allFieldsResolved:field=>{mergeOutputFn(field,outputs,options)}},{position:"bottom"},field)});function outputChangeFn(rawField,fn){mergeHooksFn({allFieldsResolved:field=>fn(list=>{let resultList=[];for(let item of list){let emitField=item.list?field.get(item.list):field,subject=new Subject;mergeOutputFn(field,{[item.output]:(...args)=>{subject.next(args)}},{position:"bottom"}),resultList.push({subject,field:emitField})}return combineLatest(resultList.map(({subject})=>subject.pipe(startWith(void 0)))).pipe(skip(1),map(list=>({list,field,listenFields:resultList.map(item=>item.field)})))})},{position:"bottom"},rawField)}function outputChange(fn){return rawConfig(field=>outputChangeFn(field,fn))}function setWrappers(wrappers){return rawConfig(field=>{field.wrappers=wrappers})}let defaultValue={position:"tail"};function patchWrappers(wrappers,options=defaultValue){return rawConfig(field=>{let list=toArray(wrappers);field.wrappers??=[],"tail"===options.position?field.wrappers.push(...list):field.wrappers.unshift(...list)})}function removeWrappers(list){return rawConfig(field=>{if(!field.wrappers)return;let wrappers=field.wrappers;for(let i=0;i<list.length;i++){let name=list[i];for(let j=0;j<wrappers.length;j++){let config=wrappers[j];if(("string"==typeof config?config:config.type)===name){wrappers.splice(j,1);break}}}field.wrappers=wrappers})}function setAlias(alias){return rawConfig(field=>{field.alias=alias})}function renderConfig(type){return rawConfig(field=>{field.renderConfig=type})}function formConfig(config){return rawConfig(field=>{field.formConfig={...field.formConfig,...config}})}let DefaultSelfList=[void 0];function valueChangeFn(field,input={}){return combineLatest((input.list??DefaultSelfList).map(keyPath=>keyPath?field.get(keyPath).form.control:field.form.control).map(control=>input.skipInitValue?control.valueChanges.pipe(skip(1)):control.valueChanges)).pipe(map(list=>({list,field,listenFields:list})))}function valueChange(listenFn){return rawConfig(field=>{mergeHooksFn({allFieldsResolved:field=>{listenFn(options=>valueChangeFn(field,options),field)}},{position:"bottom"},field)})}function hideWhen(options){return rawConfig(field=>(mergeHooksFn({allFieldsResolved:field=>{options.listen(options=>valueChangeFn(field,options),field).subscribe(hidden=>{field.renderConfig.update(value=>!!value.hidden!==hidden?{...value,hidden:hidden}:value),void 0!==options.disabled&&field.formConfig&&field.formConfig.update(value=>((value={...value}).disabled=!!hidden&&options.disabled,value))})}},{position:"bottom"},field),field))}function disableWhen(options){return rawConfig(field=>(mergeHooksFn({allFieldsResolved:field=>{options.listen(options=>valueChangeFn(field,options),field).subscribe(disabled=>{field.formConfig().disabled!==disabled&&field.formConfig.update(value=>({...value,disabled:disabled}))})}},{position:"bottom"},field),field))}function topClass(className,merge){return rawConfig(rawField=>{mergeHooksFn({fieldResolved:field=>{let wrappers=field.wrappers();wrappers?.length?wrappers[0].attributes.update(attributes=>({...attributes,class:merge?clsx(attributes?.class,className):clsx(className)})):field.attributes.update(attributes=>({...attributes,class:merge?clsx(attributes?.class,className):clsx(className)}))}},{position:"bottom"},rawField)})}function componentClass(className,merge){return rawConfig(field=>{field.attributes={...field.attributes,class:merge?clsx(field.attributes?.class,className):clsx(className)}})}function nonFieldControl(value=!0){return{kind:"metadata",type:"nonFieldControl",reference:nonFieldControl,value:value}}class CoreSchemaHandle extends BaseSchemaHandle{inputs;outputs;wrappers;attributes;alias;movePath;renderConfig;formConfig={};id;isLogicAnd=!1;isLogicOr=!1;isArray=!1;isTuple=!1;nonFieldControl=!1;hooks;lazySchema(schema){if(super.lazySchema(schema),this.parent){let wrappered=this.lazyWrapped;if(this.parent.isArray)this.parent.arrayChild=wrappered;else{let index=this.parent.children.findIndex(item=>item===this);this.parent.children[index]=wrappered}wrappered.parent=this.parent,wrappered.key=this.key}}arraySchema(schema){if(!this.isObjectControl){this.isArray=!0;let sh=new this.globalConfig.handle(this.globalConfig,this,schema);sh.parent=this,this.arrayChild=sh,convertSchema(schema.item,sh)}}defaultSchema(schema){this.defaultValue=schema.literal}tupleDefault(schema){super.tupleDefault(schema),this.isTuple=!0}enumSchema(schema){this.props??={},this.props.options??=schema.options}intersectBefore(schema){this.childrenAsVirtualGroup?"intersect"===this.type&&(this.type="intersect-group"):this.isLogicAnd=!0}logicItemSchema(schema,index,type){let sh=new this.globalConfig.handle(this.globalConfig,this,schema);this.childrenAsVirtualGroup||(sh.key=index),sh.setParent(this),convertSchema(schema,sh)}unionBefore(schema){this.childrenAsVirtualGroup||(this.isLogicOr=!0)}beforeSchemaType(schema){super.beforeSchemaType(schema),this.formConfig.required=!this.undefinedable&&!this.nullable}voidSchema(schema){this.nonFieldControl=!0}metadataDefaulthandle(metadata,environments){switch(metadata.type){case"viewRawConfig":metadata.value(this,this.globalConfig.context);break;case"layout":this.movePath=metadata.value.keyPath,this.priority=metadata.value.priority;break;case"nonFieldControl":this.nonFieldControl=metadata.value}}end(schema){super.end(schema),this.formConfig.defaultValue=this.defaultValue}}function convert(obj,options){let buildOptions={form$$:computed(()=>buildOptions.resolvedField$()?.form.control),resolvedField$:signal(void 0),context:computed(()=>options.context)},injector=Injector.create({providers:[{provide:PI_FORM_BUILDER_OPTIONS_TOKEN,useValue:buildOptions},{provide:PI_VIEW_CONFIG_TOKEN,useValue:options.fieldGlobalConfig},options.builder,{provide:EnvironmentInjector,useFactory:()=>injector}],parent:options.injector});return options.registerOnDestroy?.(()=>{injector.get(EnvironmentInjector).destroy()}),convertCore(obj,item=>(injector.get(options.builder).buildRoot({field:item,resolvedField$:buildOptions.resolvedField$}),buildOptions.resolvedField$()),{...options,handle:options?.handle??CoreSchemaHandle})}let NFCSchema=v.optional(v.void());export{AbstractControl,CoreSchemaHandle,FieldArray,FieldControl,FieldGroup,FieldLogicGroup,FormBuilder,INVALID,NFCSchema,PENDING,PI_FORM_BUILDER_ALIAS_MAP,PI_FORM_BUILDER_OPTIONS_TOKEN,PI_VIEW_CONFIG_TOKEN,SortedArray,VALID,arrayStartsWith,asyncInputMerge,clone,componentClass,controlStatusList,convert,createViewControlLink,disableWhen,effectListen,fieldControlStatusClass,formConfig,hideWhen,isArray,isFieldArray,isFieldControl,isFieldGroup,isFieldLogicGroup,isGroup,layout,mergeHooks,mergeHooksFn,mergeOutputFn,mergeOutputs,nonFieldControl,outputChange,outputChangeFn,patchAsyncAttributes,patchAsyncFn,patchAsyncInputs,patchAsyncProps,patchAttributes,patchHooks,patchInputs,patchOutputs,patchProps,patchWrappers,rawConfig,removeAttributes,removeHooks,removeInputs,removeOutputs,removeProps,removeWrappers,renderConfig,setAlias,setAttributes,setComponent,setHooks,setInputs,setOutputs,setProps,setWrappers,toArray,toObservable,topClass,unWrapSignal$1 as unWrapSignal,valueChange,valueChangeFn};
|
package/index.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ interface FieldFormConfig<T = any> {
|
|
|
28
28
|
defaultValue?: any;
|
|
29
29
|
validators?: ValidatorFn[];
|
|
30
30
|
asyncValidators?: AsyncValidatorFn[];
|
|
31
|
-
updateOn?:
|
|
31
|
+
updateOn?: FormHooks;
|
|
32
32
|
/** auto */
|
|
33
33
|
required?: boolean;
|
|
34
34
|
/** array/group/logic group */
|
|
@@ -56,7 +56,7 @@ declare const VALID = "VALID";
|
|
|
56
56
|
declare const INVALID = "INVALID";
|
|
57
57
|
declare const PENDING = "PENDING";
|
|
58
58
|
type VALID_STATUS = typeof VALID | typeof INVALID | typeof PENDING;
|
|
59
|
-
type FormHooks = 'change' | 'blur';
|
|
59
|
+
type FormHooks = 'change' | 'blur' | 'submit';
|
|
60
60
|
type AbstractControlParams = ConstructorParameters<typeof AbstractControl<any>>;
|
|
61
61
|
declare abstract class AbstractControl<TValue = any> {
|
|
62
62
|
#private;
|
|
@@ -105,7 +105,7 @@ declare abstract class AbstractControl<TValue = any> {
|
|
|
105
105
|
get valid(): boolean;
|
|
106
106
|
get invalid(): boolean;
|
|
107
107
|
get pending(): boolean;
|
|
108
|
-
selfUpdateOn$$: Signal<
|
|
108
|
+
selfUpdateOn$$: Signal<FormHooks | undefined>;
|
|
109
109
|
updateOn$$: Signal<FormHooks>;
|
|
110
110
|
markAsTouched(): void;
|
|
111
111
|
markAllAsDirty(): void;
|
|
@@ -126,6 +126,8 @@ declare abstract class AbstractControl<TValue = any> {
|
|
|
126
126
|
get valueChanges(): Observable<any>;
|
|
127
127
|
status$$: Signal<VALID_STATUS>;
|
|
128
128
|
get statusChanges(): Observable<VALID_STATUS>;
|
|
129
|
+
/** 仅触发 updateOn: submit 时使用 */
|
|
130
|
+
emitSubmit(): void;
|
|
129
131
|
}
|
|
130
132
|
|
|
131
133
|
declare class FieldGroup<TControl extends {
|
|
@@ -143,12 +145,16 @@ declare class FieldGroup<TControl extends {
|
|
|
143
145
|
getRawValue(): any;
|
|
144
146
|
find(name: string): AbstractControl | null;
|
|
145
147
|
looseValue$$: _angular_core.Signal<any>;
|
|
146
|
-
setInitValue(obj: any): void;
|
|
147
148
|
updateValue(value: any): void;
|
|
148
149
|
}
|
|
149
150
|
|
|
150
151
|
declare class FieldControl<TValue = any> extends AbstractControl<TValue> {
|
|
151
152
|
#private;
|
|
153
|
+
pendingStatus: WritableSignal<{
|
|
154
|
+
touched: boolean;
|
|
155
|
+
change: boolean;
|
|
156
|
+
value: undefined;
|
|
157
|
+
}>;
|
|
152
158
|
children$$: undefined;
|
|
153
159
|
/** 视图变化时model值不变也要更新view */
|
|
154
160
|
private viewIndex$;
|
|
@@ -164,6 +170,7 @@ declare class FieldControl<TValue = any> extends AbstractControl<TValue> {
|
|
|
164
170
|
viewValueChange(value: TValue | undefined): void;
|
|
165
171
|
updateValue(value: any, force?: boolean): void;
|
|
166
172
|
initConfig(config: any): void;
|
|
173
|
+
emitSubmit(): void;
|
|
167
174
|
}
|
|
168
175
|
|
|
169
176
|
declare class FieldArray<TControl extends AbstractControl<any> = any> extends AbstractControl {
|
|
@@ -372,7 +379,7 @@ interface ControlValueAccessor {
|
|
|
372
379
|
*/
|
|
373
380
|
setDisabledState?(isDisabled: boolean): void;
|
|
374
381
|
}
|
|
375
|
-
declare function createViewControlLink(fieldControl:
|
|
382
|
+
declare function createViewControlLink(fieldControl: () => FieldControl, cva: ControlValueAccessor, injector: Injector): () => void;
|
|
376
383
|
|
|
377
384
|
declare function controlStatusList(fieldControl?: AbstractControl, skipDisabled?: boolean): string[];
|
|
378
385
|
declare function fieldControlStatusClass(fieldControl?: AbstractControl, skipDisabled?: boolean): string;
|