From e93d34f8f25d7ed2e36e0b1fc1e3792e462a3660 Mon Sep 17 00:00:00 2001 From: Shigma Date: Tue, 14 Nov 2023 02:28:09 +0800 Subject: [PATCH] fix: catch inner union check, close koishijs/koishi#1261 --- .github/workflows/build.yaml | 10 ++++------ packages/form/package.json | 2 +- packages/form/src/index.ts | 4 ++-- packages/form/src/schema.vue | 6 +++--- packages/form/src/utils.ts | 7 ++++++- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 26621c5..a713914 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -15,9 +15,9 @@ jobs: steps: - name: Check out - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Install @@ -39,11 +39,9 @@ jobs: steps: - name: Check out - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Node - uses: actions/setup-node@v3 - with: - node-version: 18 + uses: actions/setup-node@v4 - name: Install run: yarn - name: Build source diff --git a/packages/form/package.json b/packages/form/package.json index 3bfd9ee..7a15758 100644 --- a/packages/form/package.json +++ b/packages/form/package.json @@ -1,7 +1,7 @@ { "name": "schemastery-vue", "description": "Type driven schema validator", - "version": "7.1.2", + "version": "7.1.3", "main": "src/index.ts", "files": [ "src" diff --git a/packages/form/src/index.ts b/packages/form/src/index.ts index 96bde34..f46ae4f 100644 --- a/packages/form/src/index.ts +++ b/packages/form/src/index.ts @@ -1,5 +1,5 @@ import { App, Component } from 'vue' -import { Schema, useDisabled, useEntries, useModel } from './utils' +import extensions, { Schema, useDisabled, useEntries, useModel } from './utils' import SchemaBase from './base.vue' import Primitive from './primitive.vue' import SchemaCheckbox from './extensions/checkbox.vue' @@ -31,7 +31,7 @@ export const form = Object.assign(SchemaBase, { useModel, useEntries, useDisabled, - extensions: new Set(), + extensions, install(app: App) { app.component('k-form', KForm) app.component('k-badge', KBadge) diff --git a/packages/form/src/schema.vue b/packages/form/src/schema.vue index f4108a4..b666030 100644 --- a/packages/form/src/schema.vue +++ b/packages/form/src/schema.vue @@ -50,8 +50,8 @@ import { computed, PropType } from 'vue' import { useI18n } from 'vue-i18n' import { clone, deepEqual, isNullable } from 'cosmokit' -import { Schema, useI18nText } from './utils' -import form, { IconUndo, IconReset } from '.' +import extensions, { Schema, useI18nText } from './utils' +import { IconUndo, IconReset } from './icons' import SchemaPrimitive from './primitive.vue' import SchemaBase from './base.vue' import zhCN from './locales/zh-CN.yml' @@ -81,7 +81,7 @@ const isPrimitive = computed(() => { }) const SchemaComponent = computed(() => { - const candidates = [...form.extensions].map((ext) => { + const candidates = [...extensions].map((ext) => { if (ext.type && props.schema?.type !== ext.type) return if (ext.role && props.schema?.meta.role !== ext.role) return if (ext.validate) { diff --git a/packages/form/src/utils.ts b/packages/form/src/utils.ts index 3d2fe75..43f7b17 100644 --- a/packages/form/src/utils.ts +++ b/packages/form/src/utils.ts @@ -3,9 +3,13 @@ import { clone, deepEqual, Dict, isNullable, valueMap } from 'cosmokit' import { computed, getCurrentInstance, ref, watch, WatchStopHandle } from 'vue' import { fallbackWithLocaleChain } from '@intlify/core-base' import { useI18n } from 'vue-i18n' +import form from '.' export { Schema } +const extensions = new Set() +export default extensions + export function useI18nText() { const composer = useI18n() const context: any = {} @@ -102,10 +106,11 @@ export function useModel(options?: ConfigOptions) { const doWatch = () => watch(config, (value) => { try { if (options?.output) value = options.output(value) + const schema = optional(Schema(props.schema)) + if (deepEqual(schema(value), props.schema.meta.default, options?.strict)) value = null } catch { return } - if (deepEqual(Schema(props.schema)(value), props.schema.meta.default, options?.strict)) value = null emit('update:modelValue', value) }, { deep: true })