@piying/view-vue 2.4.1 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,12 @@
1
1
  import * as v from 'valibot';
2
+ import type { Injector } from 'static-injector';
2
3
  type __VLS_Props = {
3
4
  schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;
4
5
  modelValue?: any;
5
- options: any;
6
+ options: {
7
+ injector?: Injector;
8
+ [name: string]: any;
9
+ };
6
10
  };
7
11
  declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
8
12
  "update:modelValue": (...args: any[]) => void;
package/index.js CHANGED
@@ -125,7 +125,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
125
125
  setup(__props, { emit: __emit }) {
126
126
  const inputs = __props;
127
127
  const emit = __emit;
128
- const rootInjector = createRootInjector({
128
+ const rootInjector = inputs.options.injector ?? inject(PI_VIEW_FIELD_TOKEN, void 0)?.value.injector ?? createRootInjector({
129
129
  providers: [
130
130
  {
131
131
  provide: ChangeDetectionScheduler,
@@ -155,10 +155,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
155
155
  injectorDispose = void 0;
156
156
  };
157
157
  const field2 = convert(inputs.schema, {
158
+ ...inputs.options,
158
159
  handle: VueSchemaHandle,
159
160
  builder: VueFormBuilder,
160
- injector: subInjector,
161
- ...inputs.options
161
+ injector: subInjector
162
162
  });
163
163
  return [field2, subInjector];
164
164
  });
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<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 },\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 inputs = signalToRef(() => props.field.inputs());\nconst outputs = signalToRef(() => props.field.outputs());\nconst renderConfig = signalToRef(() => props.field.renderConfig());\n\nconst attributes = signalToRef(() => props.field.attributes());\nconst fieldInput = computed(() => ({ ...attributes.value, ...inputs.value }));\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],\n ([childRef, field]) => {\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=\"outputs\"></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=\"outputs\"\n ref=\"childRef\"\n ></component>\n </template>\n <template v-else>\n <component :is=\"componentType\" v-bind=\"fieldInput\" v-on=\"outputs\"></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, 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} 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: any;\n}>();\n\nconst emit = defineEmits(['update:modelValue']);\nconst rootInjector = createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\n },\n ],\n});\nprovide(InjectorToken, rootInjector);\nprovide(\n PI_INPUT_OPTIONS_TOKEN,\n computed(() => inputs.options),\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 });\n injectorDispose = () => {\n subInjector.destroy();\n injectorDispose = undefined;\n };\n const field = convert(inputs.schema as any, {\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n ...inputs.options,\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","value"],"mappings":"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"}
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<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 },\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 inputs = signalToRef(() => props.field.inputs());\nconst outputs = signalToRef(() => props.field.outputs());\nconst renderConfig = signalToRef(() => props.field.renderConfig());\n\nconst attributes = signalToRef(() => props.field.attributes());\nconst fieldInput = computed(() => ({ ...attributes.value, ...inputs.value }));\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],\n ([childRef, field]) => {\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=\"outputs\"></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=\"outputs\"\n ref=\"childRef\"\n ></component>\n </template>\n <template v-else>\n <component :is=\"componentType\" v-bind=\"fieldInput\" v-on=\"outputs\"></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 rootInjector =\n inputs.options.injector ??\n inject(PI_VIEW_FIELD_TOKEN, undefined)?.value.injector ??\n createRootInjector({\n providers: [\n {\n provide: ChangeDetectionScheduler,\n useClass: ChangeDetectionSchedulerImpl,\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 });\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","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.1",
3
+ "version": "2.4.2",
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.1",
39
+ "@piying/view-core": "^2.4.2",
40
40
  "static-injector": "^6.1.2"
41
41
  },
42
42
  "sideEffects": false,