@piying/view-vue 2.4.5 → 2.4.6

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.
Files changed (3) hide show
  1. package/index.js +18 -19
  2. package/index.js.map +1 -1
  3. package/package.json +2 -2
package/index.js CHANGED
@@ -151,25 +151,24 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
151
151
  PI_INPUT_MODEL_TOKEN,
152
152
  computed(() => inputs.modelValue)
153
153
  );
154
- let injectorDispose;
155
- const initResult = computed(() => {
156
- injectorDispose?.();
157
- const subInjector = createInjector({ providers: [], parent: rootInjector.value });
158
- injectorDispose = () => {
159
- subInjector.destroy();
160
- injectorDispose = void 0;
161
- };
162
- const field2 = convert(inputs.schema, {
163
- ...inputs.options,
164
- handle: VueSchemaHandle,
165
- builder: VueFormBuilder,
166
- injector: subInjector
167
- });
168
- return [field2, subInjector];
169
- });
170
- onUnmounted(() => {
171
- injectorDispose?.();
172
- });
154
+ let initResult = shallowRef();
155
+ watch(
156
+ () => [inputs.schema, inputs.options, rootInjector.value],
157
+ (_, __, onCleanup) => {
158
+ const subInjector = createInjector({ providers: [], parent: rootInjector.value });
159
+ onCleanup(() => {
160
+ subInjector.destroy();
161
+ });
162
+ const field2 = convert(inputs.schema, {
163
+ ...inputs.options,
164
+ handle: VueSchemaHandle,
165
+ builder: VueFormBuilder,
166
+ injector: subInjector
167
+ });
168
+ initResult.value = [field2, subInjector];
169
+ },
170
+ { immediate: true }
171
+ );
173
172
  const field = computed(() => initResult.value[0]);
174
173
  watch(
175
174
  () => [initResult.value, inputs.modelValue],
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../packages/vue/src/vue-schema.ts","../../packages/vue/src/builder.ts","../../packages/vue/src/token.ts","../../packages/vue/src/util/signal-convert.ts","../../packages/vue/src/component/wrapper.vue","../../packages/vue/src/component/field-template.vue","../../packages/vue/src/component/piying-view.vue","../../packages/vue/src/util/use-control-value-accessor.ts","../../packages/vue/src/component/group.vue"],"sourcesContent":["import { CoreSchemaHandle } from '@piying/view-core';\nimport type { PiResolvedViewFieldConfig } from './type/group';\n\nexport class VueSchemaHandle extends CoreSchemaHandle<\n VueSchemaHandle,\n () => PiResolvedViewFieldConfig\n> {\n declare type: any;\n}\n","import { FormBuilder } from '@piying/view-core';\nimport type { VueSchemaHandle } from './vue-schema';\n\nexport class VueFormBuilder extends FormBuilder<VueSchemaHandle> {}\n","import type { Injector } from 'static-injector';\nimport type { ComputedRef, InjectionKey } from 'vue';\nimport type { PiResolvedViewFieldConfig, PiViewConfig } from './type/group';\nimport type { CoreSchemaHandle, FormBuilder, SetOptional } from '@piying/view-core';\nimport type { ConvertOptions } from '@piying/valibot-visit';\nimport * as v from 'valibot';\nexport const InjectorToken: InjectionKey<ComputedRef<Injector>> = Symbol();\nexport const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>> = Symbol();\n\nexport const PI_INPUT_OPTIONS_TOKEN: InjectionKey<\n ComputedRef<\n SetOptional<ConvertOptions<typeof CoreSchemaHandle<any, any>>, 'handle'> & {\n builder: typeof FormBuilder<CoreSchemaHandle<any, any>>;\n fieldGlobalConfig?: PiViewConfig;\n }\n >\n> = Symbol();\nexport const PI_INPUT_SCHEMA_TOKEN: InjectionKey<\n ComputedRef<v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>>\n> = Symbol();\nexport const PI_INPUT_MODEL_TOKEN: InjectionKey<ComputedRef<any>> = Symbol();\n","import { effect } from 'static-injector';\nimport { shallowRef, watchEffect, inject as vInject, type ShallowRef } from 'vue';\nimport { InjectorToken } from '../token';\n\n// signal=>ref\nexport function signalToRef<T>(value: () => T | undefined): ShallowRef<T> {\n const injector = vInject(InjectorToken)!;\n\n const dataRef = shallowRef<T>(undefined as any);\n watchEffect((onWatcherCleanup) => {\n dataRef.value = value();\n const ref = effect(\n () => {\n const currentValue = value();\n if (!Object.is(dataRef.value, currentValue)) {\n dataRef.value = currentValue;\n }\n },\n { injector: injector.value },\n );\n onWatcherCleanup(() => {\n ref.destroy();\n });\n });\n return dataRef;\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport SelfComponent from './wrapper.vue';\nimport type { CoreWrapperConfig } from '@piying/view-core';\nimport { signalToRef } from '../util/signal-convert';\n\nconst dInputs = defineProps<{\n wrappers: CoreWrapperConfig[];\n}>();\nconst restWrappers = computed(() => dInputs.wrappers!.slice(1));\nconst wrapper = computed(() => dInputs.wrappers[0]);\nconst inputs = signalToRef(() => ({ ...wrapper.value?.inputs(), ...wrapper.value?.attributes() }));\nconst outputs = computed(() => wrapper.value?.outputs?.() ?? {});\n</script>\n\n<template>\n <template v-if=\"wrapper\">\n <component :is=\"wrapper.type\" v-bind=\"inputs\" v-on=\"outputs\">\n <self-component v-bind=\"{ wrappers: restWrappers }\">\n <slot></slot>\n </self-component>\n </component>\n </template>\n <template v-else>\n <slot></slot>\n </template>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport {\n computed,\n defineAsyncComponent,\n onUnmounted,\n provide,\n ref,\n inject as vInject,\n watch,\n} from 'vue';\nimport type { PiResolvedViewFieldConfig } from '../type/group';\nimport { signalToRef } from '../util/signal-convert';\nimport { PI_VIEW_FIELD_TOKEN, InjectorToken } from '../token';\nimport PiWrapper from './wrapper.vue';\nimport {\n createViewControlLink,\n getLazyImport,\n isFieldControl,\n isLazyMark,\n} from '@piying/view-core';\nconst props = defineProps<{\n field: PiResolvedViewFieldConfig;\n}>();\nconst injector = vInject(InjectorToken)!;\n\nconst renderConfig = signalToRef(() => props.field.renderConfig());\n\nconst inputs = signalToRef(() => props.field.inputs?.());\nconst attributes = signalToRef(() => props.field.attributes?.());\nconst fieldInput = computed(() => ({ ...attributes.value, ...inputs.value }));\nconst outputs = signalToRef(() => props.field.outputs?.());\nconst events = signalToRef(() => props.field.events?.());\nconst fieldOutput = computed(() => ({ ...outputs.value, ...events.value }));\n\nconst fieldChildren = signalToRef(() => props.field.children?.());\n\nconst wrappers = signalToRef(() => props.field.wrappers());\nconst define = signalToRef(() => props.field.define?.());\nconst componentType = computed(() =>\n typeof define.value?.type === 'function' || isLazyMark(define.value?.type)\n ? defineAsyncComponent(getLazyImport<any>(define.value?.type))\n : define.value?.type,\n);\nconst field = computed(() => props.field);\nprovide(PI_VIEW_FIELD_TOKEN, field);\n// 使用cva\nconst childRef = ref<any>(null);\nconst isControl = isFieldControl(field.value.form.control);\nlet dispose: ((destroy?: boolean) => void) | undefined;\n\nwatch(\n [childRef, field, injector],\n ([childRef, field, injector]) => {\n dispose?.();\n if (isControl && childRef) {\n dispose = createViewControlLink((() => field.form.control) as any, childRef['cva'], injector);\n }\n },\n { immediate: true },\n);\nonUnmounted(() => {\n dispose?.(true);\n dispose = undefined;\n});\n</script>\n\n<template>\n <template v-if=\"!renderConfig!.hidden\">\n <template v-if=\"define?.type\">\n <pi-wrapper v-bind:wrappers=\"wrappers!\">\n <!-- group -->\n <template v-if=\"fieldChildren\">\n <component :is=\"componentType\" v-bind=\"fieldInput\" v-on=\"fieldOutput\"></component>\n </template>\n <!-- control -->\n <template v-else>\n <template v-if=\"field.form.control\">\n <component\n :is=\"componentType\"\n v-bind=\"fieldInput\"\n v-on=\"fieldOutput\"\n ref=\"childRef\"\n ></component>\n </template>\n <template v-else>\n <component :is=\"componentType\" v-bind=\"fieldInput\" v-on=\"fieldOutput\"></component>\n </template>\n </template>\n </pi-wrapper>\n </template>\n </template>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport * as v from 'valibot';\nimport { convert } from '@piying/view-core';\nimport { computed, inject, onUnmounted, provide, watch } from 'vue';\nimport {\n ChangeDetectionScheduler,\n ChangeDetectionSchedulerImpl,\n createInjector,\n createRootInjector,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport { VueSchemaHandle } from '../vue-schema';\nimport { VueFormBuilder } from '../builder';\nimport {\n InjectorToken,\n PI_INPUT_MODEL_TOKEN,\n PI_INPUT_OPTIONS_TOKEN,\n PI_INPUT_SCHEMA_TOKEN,\n PI_VIEW_FIELD_TOKEN,\n} from '../token';\nimport FieldTemplate from './field-template.vue';\nimport type { Injector } from 'static-injector';\nimport { initListen } from '@piying/view-core';\nconst inputs = defineProps<{\n schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;\n modelValue?: any;\n options: { injector?: Injector; [name: string]: any };\n}>();\n\nconst emit = defineEmits(['update:modelValue']);\nconst maybeParentField = inject(PI_VIEW_FIELD_TOKEN, undefined);\nconst rootInjector = computed(() => {\n return (\n inputs.options.injector ??\n maybeParentField?.value.injector ??\n createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\n },\n ],\n })\n );\n});\nprovide(InjectorToken, rootInjector);\nprovide(\n PI_INPUT_OPTIONS_TOKEN,\n computed(() => inputs.options as any),\n);\nprovide(\n PI_INPUT_SCHEMA_TOKEN,\n computed(() => inputs.schema),\n);\nprovide(\n PI_INPUT_MODEL_TOKEN,\n computed(() => inputs.modelValue),\n);\n\nlet injectorDispose: (() => any) | undefined;\nconst initResult = computed(() => {\n injectorDispose?.();\n const subInjector = createInjector({ providers: [], parent: rootInjector.value });\n injectorDispose = () => {\n subInjector.destroy();\n injectorDispose = undefined;\n };\n const field = convert(inputs.schema as any, {\n ...inputs.options,\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n });\n return [field, subInjector] as const;\n});\nonUnmounted(() => {\n injectorDispose?.();\n});\nconst field = computed(() => initResult.value[0]);\n\nwatch(\n () => [initResult.value, inputs.modelValue],\n ([[field, subInjector], modelValue], _1, onWatcherCleanup) => {\n let ref: EffectRef | undefined;\n if (field.form.control) {\n ref = initListen(modelValue, field!.form.control!, subInjector as Injector, (value) => {\n untracked(() => {\n if (field!.form.control?.valueNoError$$()) {\n emit('update:modelValue', value);\n }\n });\n });\n field!.form.control!.updateValue(inputs.modelValue);\n }\n onWatcherCleanup(() => {\n ref?.destroy();\n });\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <field-template :field=\"field!\"></field-template>\n</template>\n\n<style scoped></style>\n","import type { ControlValueAccessor } from '@piying/view-core';\nimport { ref } from 'vue';\n\nexport function useControlValueAccessor() {\n const value = ref();\n const disabled = ref(false);\n let onChange: (input: any) => void;\n let touched: () => void;\n const instance: ControlValueAccessor = {\n writeValue(obj) {\n value.value = obj;\n },\n registerOnChange(fn) {\n onChange = fn;\n },\n registerOnTouched(fn) {\n touched = fn;\n },\n setDisabledState(value) {\n disabled.value = value;\n },\n };\n return {\n cva: instance,\n cvaa: {\n value: value,\n disabled: disabled,\n valueChange: (input: any) => {\n onChange(input);\n value.value = input;\n },\n touchedChange: () => {\n touched();\n },\n },\n };\n}\n","<script setup lang=\"ts\">\nimport FieldTemplate from './field-template.vue';\nimport { inject } from 'vue';\nimport { PI_VIEW_FIELD_TOKEN } from '../token';\nimport { signalToRef } from '../util';\n\nconst field = inject(PI_VIEW_FIELD_TOKEN)!;\nconst children = signalToRef(() => field?.value.children!());\n</script>\n\n<template>\n <template v-for=\"(field, index) in children\" :key=\"index\">\n <field-template :field=\"field!\"></field-template>\n </template>\n</template>\n\n<style scoped></style>\n"],"names":["vInject","ref","childRef","field","injector","value"],"mappings":";;;AAGO,MAAM,wBAAwB,iBAGnC;AAEF;ACLO,MAAM,uBAAuB,YAA6B;AAAC;ACG3D,MAAM,gBAAqD,uBAAA;AAC3D,MAAM,sBAA4E,uBAAA;AAElF,MAAM,yBAOT,uBAAA;AACG,MAAM,wBAET,uBAAA;AACG,MAAM,uBAAuD,uBAAA;ACf7D,SAAS,YAAe,OAA2C;AACxE,QAAM,WAAWA,OAAQ,aAAa;AAEtC,QAAM,UAAU,WAAc,MAAgB;AAC9C,cAAY,CAAC,qBAAqB;AAChC,YAAQ,QAAQ,MAAA;AAChB,UAAMC,OAAM;AAAA,MACV,MAAM;AACJ,cAAM,eAAe,MAAA;AACrB,YAAI,CAAC,OAAO,GAAG,QAAQ,OAAO,YAAY,GAAG;AAC3C,kBAAQ,QAAQ;AAAA,QAClB;AAAA,MACF;AAAA,MACA,EAAE,UAAU,SAAS,MAAA;AAAA,IAAM;AAE7B,qBAAiB,MAAM;AACrB,MAAAA,KAAI,QAAA;AAAA,IACN,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AACT;;;;;;;ACnBA,UAAM,UAAU;AAGhB,UAAM,eAAe,SAAS,MAAM,QAAQ,SAAU,MAAM,CAAC,CAAC;AAC9D,UAAM,UAAU,SAAS,MAAM,QAAQ,SAAS,CAAC,CAAC;AAClD,UAAM,SAAS,YAAY,OAAO,EAAE,GAAG,QAAQ,OAAO,OAAA,GAAU,GAAG,QAAQ,OAAO,WAAA,IAAe;AACjG,UAAM,UAAU,SAAS,MAAM,QAAQ,OAAO,UAAA,KAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;ACQ/D,UAAM,QAAQ;AAGd,UAAM,WAAWD,OAAQ,aAAa;AAEtC,UAAM,eAAe,YAAY,MAAM,MAAM,MAAM,cAAc;AAEjE,UAAM,SAAS,YAAY,MAAM,MAAM,MAAM,UAAU;AACvD,UAAM,aAAa,YAAY,MAAM,MAAM,MAAM,cAAc;AAC/D,UAAM,aAAa,SAAS,OAAO,EAAE,GAAG,WAAW,OAAO,GAAG,OAAO,MAAA,EAAQ;AAC5E,UAAM,UAAU,YAAY,MAAM,MAAM,MAAM,WAAW;AACzD,UAAM,SAAS,YAAY,MAAM,MAAM,MAAM,UAAU;AACvD,UAAM,cAAc,SAAS,OAAO,EAAE,GAAG,QAAQ,OAAO,GAAG,OAAO,MAAA,EAAQ;AAE1E,UAAM,gBAAgB,YAAY,MAAM,MAAM,MAAM,YAAY;AAEhE,UAAM,WAAW,YAAY,MAAM,MAAM,MAAM,UAAU;AACzD,UAAM,SAAS,YAAY,MAAM,MAAM,MAAM,UAAU;AACvD,UAAM,gBAAgB;AAAA,MAAS,MAC7B,OAAO,OAAO,OAAO,SAAS,cAAc,WAAW,OAAO,OAAO,IAAI,IACrE,qBAAqB,cAAmB,OAAO,OAAO,IAAI,CAAC,IAC3D,OAAO,OAAO;AAAA,IAAA;AAEpB,UAAM,QAAQ,SAAS,MAAM,MAAM,KAAK;AACxC,YAAQ,qBAAqB,KAAK;AAElC,UAAM,WAAW,IAAS,IAAI;AAC9B,UAAM,YAAY,eAAe,MAAM,MAAM,KAAK,OAAO;AACzD,QAAI;AAEJ;AAAA,MACE,CAAC,UAAU,OAAO,QAAQ;AAAA,MAC1B,CAAC,CAACE,WAAUC,QAAOC,SAAQ,MAAM;AAC/B,kBAAA;AACA,YAAI,aAAaF,WAAU;AACzB,oBAAU,uBAAuB,MAAMC,OAAM,KAAK,UAAiBD,UAAS,KAAK,GAAGE,SAAQ;AAAA,QAC9F;AAAA,MACF;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAEpB,gBAAY,MAAM;AAChB,gBAAU,IAAI;AACd,gBAAU;AAAA,IACZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvCD,UAAM,SAAS;AAMf,UAAM,OAAO;AACb,UAAM,mBAAmB,OAAO,qBAAqB,MAAS;AAC9D,UAAM,eAAe,SAAS,MAAM;AAClC,aACE,OAAO,QAAQ,YACf,kBAAkB,MAAM,YACxB,mBAAmB;AAAA,QACjB,WAAW;AAAA,UACT;AAAA,YACE,SAAS;AAAA,YACT,UAAU;AAAA,UAAA;AAAA,QACZ;AAAA,MACF,CACD;AAAA,IAEL,CAAC;AACD,YAAQ,eAAe,YAAY;AACnC;AAAA,MACE;AAAA,MACA,SAAS,MAAM,OAAO,OAAc;AAAA,IAAA;AAEtC;AAAA,MACE;AAAA,MACA,SAAS,MAAM,OAAO,MAAM;AAAA,IAAA;AAE9B;AAAA,MACE;AAAA,MACA,SAAS,MAAM,OAAO,UAAU;AAAA,IAAA;AAGlC,QAAI;AACJ,UAAM,aAAa,SAAS,MAAM;AAChC,wBAAA;AACA,YAAM,cAAc,eAAe,EAAE,WAAW,CAAA,GAAI,QAAQ,aAAa,OAAO;AAChF,wBAAkB,MAAM;AACtB,oBAAY,QAAA;AACZ,0BAAkB;AAAA,MACpB;AACA,YAAMD,SAAQ,QAAQ,OAAO,QAAe;AAAA,QAC1C,GAAG,OAAO;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACX;AACD,aAAO,CAACA,QAAO,WAAW;AAAA,IAC5B,CAAC;AACD,gBAAY,MAAM;AAChB,wBAAA;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,SAAS,MAAM,WAAW,MAAM,CAAC,CAAC;AAEhD;AAAA,MACE,MAAM,CAAC,WAAW,OAAO,OAAO,UAAU;AAAA,MAC1C,CAAC,CAAC,CAACA,QAAO,WAAW,GAAG,UAAU,GAAG,IAAI,qBAAqB;AAC5D,YAAIF;AACJ,YAAIE,OAAM,KAAK,SAAS;AACtB,UAAAF,OAAM,WAAW,YAAYE,OAAO,KAAK,SAAU,aAAyB,CAAC,UAAU;AACrF,sBAAU,MAAM;AACd,kBAAIA,OAAO,KAAK,SAAS,eAAA,GAAkB;AACzC,qBAAK,qBAAqB,KAAK;AAAA,cACjC;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AACDA,iBAAO,KAAK,QAAS,YAAY,OAAO,UAAU;AAAA,QACpD;AACA,yBAAiB,MAAM;AACrB,UAAAF,MAAK,QAAA;AAAA,QACP,CAAC;AAAA,MACH;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;;;;;;;;AChGb,SAAS,0BAA0B;AACxC,QAAM,QAAQ,IAAA;AACd,QAAM,WAAW,IAAI,KAAK;AAC1B,MAAI;AACJ,MAAI;AACJ,QAAM,WAAiC;AAAA,IACrC,WAAW,KAAK;AACd,YAAM,QAAQ;AAAA,IAChB;AAAA,IACA,iBAAiB,IAAI;AACnB,iBAAW;AAAA,IACb;AAAA,IACA,kBAAkB,IAAI;AACpB,gBAAU;AAAA,IACZ;AAAA,IACA,iBAAiBI,QAAO;AACtB,eAAS,QAAQA;AAAAA,IACnB;AAAA,EAAA;AAEF,SAAO;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,aAAa,CAAC,UAAe;AAC3B,iBAAS,KAAK;AACd,cAAM,QAAQ;AAAA,MAChB;AAAA,MACA,eAAe,MAAM;AACnB,gBAAA;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAEJ;;;;AC9BA,UAAM,QAAQ,OAAO,mBAAmB;AACxC,UAAM,WAAW,YAAY,MAAM,OAAO,MAAM,UAAW;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../packages/vue/src/vue-schema.ts","../../packages/vue/src/builder.ts","../../packages/vue/src/token.ts","../../packages/vue/src/util/signal-convert.ts","../../packages/vue/src/component/wrapper.vue","../../packages/vue/src/component/field-template.vue","../../packages/vue/src/component/piying-view.vue","../../packages/vue/src/util/use-control-value-accessor.ts","../../packages/vue/src/component/group.vue"],"sourcesContent":["import { CoreSchemaHandle } from '@piying/view-core';\nimport type { PiResolvedViewFieldConfig } from './type/group';\n\nexport class VueSchemaHandle extends CoreSchemaHandle<\n VueSchemaHandle,\n () => PiResolvedViewFieldConfig\n> {\n declare type: any;\n}\n","import { FormBuilder } from '@piying/view-core';\nimport type { VueSchemaHandle } from './vue-schema';\n\nexport class VueFormBuilder extends FormBuilder<VueSchemaHandle> {}\n","import type { Injector } from 'static-injector';\nimport type { ComputedRef, InjectionKey } from 'vue';\nimport type { PiResolvedViewFieldConfig, PiViewConfig } from './type/group';\nimport type { CoreSchemaHandle, FormBuilder, SetOptional } from '@piying/view-core';\nimport type { ConvertOptions } from '@piying/valibot-visit';\nimport * as v from 'valibot';\nexport const InjectorToken: InjectionKey<ComputedRef<Injector>> = Symbol();\nexport const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>> = Symbol();\n\nexport const PI_INPUT_OPTIONS_TOKEN: InjectionKey<\n ComputedRef<\n SetOptional<ConvertOptions<typeof CoreSchemaHandle<any, any>>, 'handle'> & {\n builder: typeof FormBuilder<CoreSchemaHandle<any, any>>;\n fieldGlobalConfig?: PiViewConfig;\n }\n >\n> = Symbol();\nexport const PI_INPUT_SCHEMA_TOKEN: InjectionKey<\n ComputedRef<v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>>\n> = Symbol();\nexport const PI_INPUT_MODEL_TOKEN: InjectionKey<ComputedRef<any>> = Symbol();\n","import { effect } from 'static-injector';\nimport { shallowRef, watchEffect, inject as vInject, type ShallowRef } from 'vue';\nimport { InjectorToken } from '../token';\n\n// signal=>ref\nexport function signalToRef<T>(value: () => T | undefined): ShallowRef<T> {\n const injector = vInject(InjectorToken)!;\n\n const dataRef = shallowRef<T>(undefined as any);\n watchEffect((onWatcherCleanup) => {\n dataRef.value = value();\n const ref = effect(\n () => {\n const currentValue = value();\n if (!Object.is(dataRef.value, currentValue)) {\n dataRef.value = currentValue;\n }\n },\n { injector: injector.value },\n );\n onWatcherCleanup(() => {\n ref.destroy();\n });\n });\n return dataRef;\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport SelfComponent from './wrapper.vue';\nimport type { CoreWrapperConfig } from '@piying/view-core';\nimport { signalToRef } from '../util/signal-convert';\n\nconst dInputs = defineProps<{\n wrappers: CoreWrapperConfig[];\n}>();\nconst restWrappers = computed(() => dInputs.wrappers!.slice(1));\nconst wrapper = computed(() => dInputs.wrappers[0]);\nconst inputs = signalToRef(() => ({ ...wrapper.value?.inputs(), ...wrapper.value?.attributes() }));\nconst outputs = computed(() => wrapper.value?.outputs?.() ?? {});\n</script>\n\n<template>\n <template v-if=\"wrapper\">\n <component :is=\"wrapper.type\" v-bind=\"inputs\" v-on=\"outputs\">\n <self-component v-bind=\"{ wrappers: restWrappers }\">\n <slot></slot>\n </self-component>\n </component>\n </template>\n <template v-else>\n <slot></slot>\n </template>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport {\n computed,\n defineAsyncComponent,\n onUnmounted,\n provide,\n ref,\n inject as vInject,\n watch,\n} from 'vue';\nimport type { PiResolvedViewFieldConfig } from '../type/group';\nimport { signalToRef } from '../util/signal-convert';\nimport { PI_VIEW_FIELD_TOKEN, InjectorToken } from '../token';\nimport PiWrapper from './wrapper.vue';\nimport {\n createViewControlLink,\n getLazyImport,\n isFieldControl,\n isLazyMark,\n} from '@piying/view-core';\nconst props = defineProps<{\n field: PiResolvedViewFieldConfig;\n}>();\nconst injector = vInject(InjectorToken)!;\n\nconst renderConfig = signalToRef(() => props.field.renderConfig());\n\nconst inputs = signalToRef(() => props.field.inputs?.());\nconst attributes = signalToRef(() => props.field.attributes?.());\nconst fieldInput = computed(() => ({ ...attributes.value, ...inputs.value }));\nconst outputs = signalToRef(() => props.field.outputs?.());\nconst events = signalToRef(() => props.field.events?.());\nconst fieldOutput = computed(() => ({ ...outputs.value, ...events.value }));\n\nconst fieldChildren = signalToRef(() => props.field.children?.());\n\nconst wrappers = signalToRef(() => props.field.wrappers());\nconst define = signalToRef(() => props.field.define?.());\nconst componentType = computed(() =>\n typeof define.value?.type === 'function' || isLazyMark(define.value?.type)\n ? defineAsyncComponent(getLazyImport<any>(define.value?.type))\n : define.value?.type,\n);\nconst field = computed(() => props.field);\nprovide(PI_VIEW_FIELD_TOKEN, field);\n// 使用cva\nconst childRef = ref<any>(null);\nconst isControl = isFieldControl(field.value.form.control);\nlet dispose: ((destroy?: boolean) => void) | undefined;\n\nwatch(\n [childRef, field, injector],\n ([childRef, field, injector]) => {\n dispose?.();\n if (isControl && childRef) {\n dispose = createViewControlLink((() => field.form.control) as any, childRef['cva'], injector);\n }\n },\n { immediate: true },\n);\nonUnmounted(() => {\n dispose?.(true);\n dispose = undefined;\n});\n</script>\n\n<template>\n <template v-if=\"!renderConfig!.hidden\">\n <template v-if=\"define?.type\">\n <pi-wrapper v-bind:wrappers=\"wrappers!\">\n <!-- group -->\n <template v-if=\"fieldChildren\">\n <component :is=\"componentType\" v-bind=\"fieldInput\" v-on=\"fieldOutput\"></component>\n </template>\n <!-- control -->\n <template v-else>\n <template v-if=\"field.form.control\">\n <component\n :is=\"componentType\"\n v-bind=\"fieldInput\"\n v-on=\"fieldOutput\"\n ref=\"childRef\"\n ></component>\n </template>\n <template v-else>\n <component :is=\"componentType\" v-bind=\"fieldInput\" v-on=\"fieldOutput\"></component>\n </template>\n </template>\n </pi-wrapper>\n </template>\n </template>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport * as v from 'valibot';\nimport { convert, type PiResolvedCommonViewFieldConfig } from '@piying/view-core';\nimport { computed, inject, markRaw, onUnmounted, provide, shallowRef, watch } from 'vue';\nimport {\n ChangeDetectionScheduler,\n ChangeDetectionSchedulerImpl,\n createInjector,\n createRootInjector,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport { VueSchemaHandle } from '../vue-schema';\nimport { VueFormBuilder } from '../builder';\nimport {\n InjectorToken,\n PI_INPUT_MODEL_TOKEN,\n PI_INPUT_OPTIONS_TOKEN,\n PI_INPUT_SCHEMA_TOKEN,\n PI_VIEW_FIELD_TOKEN,\n} from '../token';\nimport FieldTemplate from './field-template.vue';\nimport type { Injector, R3Injector } from 'static-injector';\nimport { initListen } from '@piying/view-core';\nconst inputs = defineProps<{\n schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;\n modelValue?: any;\n options: { injector?: Injector; [name: string]: any };\n}>();\n\nconst emit = defineEmits(['update:modelValue']);\nconst maybeParentField = inject(PI_VIEW_FIELD_TOKEN, undefined);\nconst rootInjector = computed(() => {\n return (\n inputs.options.injector ??\n maybeParentField?.value.injector ??\n createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\n },\n ],\n })\n );\n});\nprovide(InjectorToken, rootInjector);\nprovide(\n PI_INPUT_OPTIONS_TOKEN,\n computed(() => inputs.options as any),\n);\nprovide(\n PI_INPUT_SCHEMA_TOKEN,\n computed(() => inputs.schema),\n);\nprovide(\n PI_INPUT_MODEL_TOKEN,\n computed(() => inputs.modelValue),\n);\n\nlet initResult =\n shallowRef<[Omit<PiResolvedCommonViewFieldConfig<any, any>, 'define'>, R3Injector]>();\nwatch(\n () => [inputs.schema, inputs.options, rootInjector.value],\n (_, __, onCleanup) => {\n const subInjector = createInjector({ providers: [], parent: rootInjector.value });\n onCleanup(() => {\n subInjector.destroy();\n });\n\n const field = convert(inputs.schema as any, {\n ...inputs.options,\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n });\n initResult.value = [field, subInjector] as const;\n },\n { immediate: true },\n);\n\nconst field = computed(() => initResult.value![0]);\nwatch(\n () => [initResult.value!, inputs.modelValue],\n ([[field, subInjector], modelValue], _1, onWatcherCleanup) => {\n let ref: EffectRef | undefined;\n if (field.form.control) {\n ref = initListen(modelValue, field!.form.control!, subInjector as Injector, (value) => {\n untracked(() => {\n if (field!.form.control?.valueNoError$$()) {\n emit('update:modelValue', value);\n }\n });\n });\n field!.form.control!.updateValue(inputs.modelValue);\n }\n onWatcherCleanup(() => {\n ref?.destroy();\n });\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <field-template :field=\"field!\"></field-template>\n</template>\n\n<style scoped></style>\n","import type { ControlValueAccessor } from '@piying/view-core';\nimport { ref } from 'vue';\n\nexport function useControlValueAccessor() {\n const value = ref();\n const disabled = ref(false);\n let onChange: (input: any) => void;\n let touched: () => void;\n const instance: ControlValueAccessor = {\n writeValue(obj) {\n value.value = obj;\n },\n registerOnChange(fn) {\n onChange = fn;\n },\n registerOnTouched(fn) {\n touched = fn;\n },\n setDisabledState(value) {\n disabled.value = value;\n },\n };\n return {\n cva: instance,\n cvaa: {\n value: value,\n disabled: disabled,\n valueChange: (input: any) => {\n onChange(input);\n value.value = input;\n },\n touchedChange: () => {\n touched();\n },\n },\n };\n}\n","<script setup lang=\"ts\">\nimport FieldTemplate from './field-template.vue';\nimport { inject } from 'vue';\nimport { PI_VIEW_FIELD_TOKEN } from '../token';\nimport { signalToRef } from '../util';\n\nconst field = inject(PI_VIEW_FIELD_TOKEN)!;\nconst children = signalToRef(() => field?.value.children!());\n</script>\n\n<template>\n <template v-for=\"(field, index) in children\" :key=\"index\">\n <field-template :field=\"field!\"></field-template>\n </template>\n</template>\n\n<style scoped></style>\n"],"names":["vInject","ref","childRef","field","injector","value"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@piying/view-vue",
3
- "version": "2.4.5",
3
+ "version": "2.4.6",
4
4
  "description": "Piying view For Vue;Valibot to Component",
5
5
  "type": "module",
6
6
  "homepage": "https://piying-org.github.io/website/docs/client/intro",
@@ -36,7 +36,7 @@
36
36
  ],
37
37
  "license": "MIT",
38
38
  "dependencies": {
39
- "@piying/view-core": "^2.4.5",
39
+ "@piying/view-core": "^2.4.6",
40
40
  "static-injector": "^6.1.2"
41
41
  },
42
42
  "sideEffects": false,