@piying/view-vue 1.5.6 → 1.5.7

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 +38 -37
  2. package/index.js.map +1 -1
  3. package/package.json +2 -2
package/index.js CHANGED
@@ -132,7 +132,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
132
132
  },
133
133
  emits: ["update:modelValue"],
134
134
  setup(__props, { emit: __emit }) {
135
- const inputs = __props;
135
+ const dProps = __props;
136
136
  const emit = __emit;
137
137
  const rootInjector = createRootInjector({
138
138
  providers: [
@@ -143,51 +143,52 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
143
143
  ]
144
144
  });
145
145
  provide(InjectorToken, rootInjector);
146
- const field = shallowRef(void 0);
146
+ let injectorDispose;
147
+ const initResult = computed(() => {
148
+ injectorDispose == null ? void 0 : injectorDispose();
149
+ const subInjector = createInjector({ providers: [], parent: rootInjector });
150
+ injectorDispose = () => {
151
+ subInjector.destroy();
152
+ injectorDispose = void 0;
153
+ };
154
+ const field2 = convert(dProps.schema, {
155
+ handle: VueSchemaHandle,
156
+ builder: VueFormBuilder,
157
+ injector: subInjector,
158
+ registerOnDestroy: (fn) => {
159
+ subInjector.get(DestroyRef).onDestroy(() => {
160
+ fn();
161
+ });
162
+ },
163
+ ...dProps.options
164
+ });
165
+ return [field2, subInjector];
166
+ });
167
+ onUnmounted(() => {
168
+ injectorDispose == null ? void 0 : injectorDispose();
169
+ });
170
+ const field = computed(() => initResult.value[0]);
147
171
  watch(
148
- () => [inputs.schema, inputs.options],
149
- ([schema, options], _1, onWatcherCleanup) => {
150
- const subInjector = createInjector({ providers: [], parent: rootInjector });
151
- const result = convert(schema, {
152
- handle: VueSchemaHandle,
153
- builder: VueFormBuilder,
154
- injector: subInjector,
155
- registerOnDestroy: (fn) => {
156
- subInjector.get(DestroyRef).onDestroy(() => {
157
- fn();
158
- });
159
- },
160
- ...options
161
- });
162
- field.value = result;
172
+ () => [initResult.value, dProps.modelValue],
173
+ ([[field2, subInjector], modelValue], _1, onWatcherCleanup) => {
163
174
  let ref2;
164
- if (result.form.control) {
165
- const value = inputs.modelValue;
166
- ref2 = initListen(
167
- typeof value !== "undefined" ? value : void 0,
168
- result.form.control,
169
- subInjector,
170
- (value2) => {
171
- untracked(() => {
172
- var _a;
173
- if ((_a = result.form.control) == null ? void 0 : _a.valueNoError$$()) {
174
- emit("update:modelValue", value2);
175
- }
176
- });
177
- }
178
- );
175
+ if (field2.form.control) {
176
+ ref2 = initListen(modelValue, field2.form.control, subInjector, (value) => {
177
+ untracked(() => {
178
+ var _a;
179
+ if ((_a = field2.form.control) == null ? void 0 : _a.valueNoError$$()) {
180
+ emit("update:modelValue", value);
181
+ }
182
+ });
183
+ });
184
+ field2.form.control.updateValue(dProps.modelValue);
179
185
  }
180
186
  onWatcherCleanup(() => {
181
- subInjector.destroy();
182
187
  ref2 == null ? void 0 : ref2.destroy();
183
188
  });
184
189
  },
185
190
  { immediate: true }
186
191
  );
187
- watchEffect(() => {
188
- var _a;
189
- (_a = field.value.form.control) == null ? void 0 : _a.updateValue(inputs.modelValue);
190
- });
191
192
  return (_ctx, _cache) => {
192
193
  return openBlock(), createBlock(_sfc_main$2, {
193
194
  field: field.value
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 } from './type/group';\n\nexport const InjectorToken: InjectionKey<Injector> = Symbol();\nexport const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>> = Symbol();\n","import { effect } from 'static-injector';\nimport { shallowRef, watchEffect, inject as vInject } from 'vue';\nimport { InjectorToken } from '../token';\n\n// signal=>ref\nexport function signalToRef<T>(value: () => T | undefined) {\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 { CoreResolvedWrapperConfig } from '@piying/view-core';\nimport { signalToRef } from '../util/signal-convert';\n\nconst dInputs = defineProps<{\n wrappers: CoreResolvedWrapperConfig[];\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());\n\nconst componentType = computed(() =>\n typeof props.field.define?.type === 'function' || isLazyMark(props.field.define?.type)\n ? defineAsyncComponent(getLazyImport<any>(props.field.define?.type))\n : props.field.define?.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: (() => 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?.();\n dispose = undefined;\n});\n</script>\n\n<template>\n <template v-if=\"!renderConfig!.hidden\">\n <template v-if=\"field.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 { provide, shallowRef, watch, watchEffect } from 'vue';\nimport {\n ChangeDetectionScheduler,\n ChangeDetectionSchedulerImpl,\n createInjector,\n createRootInjector,\n DestroyRef,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport { VueSchemaHandle } from '../vue-schema';\nimport { VueFormBuilder } from '../builder';\nimport { InjectorToken } from '../token';\nimport FieldTemplate from './field-template.vue';\nimport type { PiResolvedViewFieldConfig } from '../type/group';\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);\n\nconst field = shallowRef<PiResolvedViewFieldConfig | undefined>(undefined);\n\nwatch(\n () => [inputs.schema, inputs.options],\n ([schema, options], _1, onWatcherCleanup) => {\n const subInjector = createInjector({ providers: [], parent: rootInjector });\n\n const result = convert(schema as any, {\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n registerOnDestroy: (fn) => {\n subInjector!.get(DestroyRef).onDestroy(() => {\n fn();\n });\n },\n ...options,\n });\n field.value = result;\n let ref: EffectRef | undefined;\n if (result.form.control) {\n const value = inputs.modelValue;\n ref = initListen(\n typeof value !== 'undefined' ? value : undefined,\n result!.form.control!,\n subInjector as Injector,\n (value) => {\n untracked(() => {\n if (result!.form.control?.valueNoError$$()) {\n emit('update:modelValue', value);\n }\n });\n },\n );\n }\n onWatcherCleanup(() => {\n subInjector.destroy();\n ref?.destroy();\n });\n },\n { immediate: true },\n);\nwatchEffect(() => {\n field.value!.form.control?.updateValue(inputs.modelValue);\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 } from './type/group';\n\nexport const InjectorToken: InjectionKey<Injector> = Symbol();\nexport const PI_VIEW_FIELD_TOKEN: InjectionKey<ComputedRef<PiResolvedViewFieldConfig>> = Symbol();\n","import { effect } from 'static-injector';\nimport { shallowRef, watchEffect, inject as vInject } from 'vue';\nimport { InjectorToken } from '../token';\n\n// signal=>ref\nexport function signalToRef<T>(value: () => T | undefined) {\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 { CoreResolvedWrapperConfig } from '@piying/view-core';\nimport { signalToRef } from '../util/signal-convert';\n\nconst dInputs = defineProps<{\n wrappers: CoreResolvedWrapperConfig[];\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());\n\nconst componentType = computed(() =>\n typeof props.field.define?.type === 'function' || isLazyMark(props.field.define?.type)\n ? defineAsyncComponent(getLazyImport<any>(props.field.define?.type))\n : props.field.define?.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: (() => 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?.();\n dispose = undefined;\n});\n</script>\n\n<template>\n <template v-if=\"!renderConfig!.hidden\">\n <template v-if=\"field.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 DestroyRef,\n untracked,\n type EffectRef,\n} from 'static-injector';\nimport { VueSchemaHandle } from '../vue-schema';\nimport { VueFormBuilder } from '../builder';\nimport { InjectorToken } from '../token';\nimport FieldTemplate from './field-template.vue';\nimport type { Injector } from 'static-injector';\nimport { initListen } from '@piying/view-core';\nconst dProps = 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);\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(dProps.schema as any, {\n handle: VueSchemaHandle as any,\n builder: VueFormBuilder,\n injector: subInjector,\n registerOnDestroy: (fn) => {\n subInjector!.get(DestroyRef).onDestroy(() => {\n fn();\n });\n },\n ...dProps.options,\n });\n return [field, subInjector] as const;\n});\nonUnmounted(() => {\n injectorDispose?.();\n});\nconst field = computed(() => initResult.value[0]);\n\nwatch(\n () => [initResult.value, dProps.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(dProps.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": "1.5.6",
3
+ "version": "1.5.7",
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": "^1.5.6",
39
+ "@piying/view-core": "^1.5.7",
40
40
  "static-injector": "^6.1.2"
41
41
  },
42
42
  "sideEffects": false,