From 0add252eb5fcff3b55f1d9ee44f336844a65c4d2 Mon Sep 17 00:00:00 2001 From: kazuya kawaguchi Date: Sat, 28 Oct 2023 07:33:45 +0900 Subject: [PATCH] fix: return null for fucntion (#1617) * fix: return null for fucntion * fix: remove comment --- packages/core-base/src/resolver.ts | 5 ++- packages/core-base/test/resolver.test.ts | 5 +++ packages/vue-i18n-core/src/composer.ts | 14 ------- packages/vue-i18n-core/test/issues.test.ts | 48 +++++++++++++++++++++- 4 files changed, 56 insertions(+), 16 deletions(-) diff --git a/packages/core-base/src/resolver.ts b/packages/core-base/src/resolver.ts index ba838c00c..165cff19c 100644 --- a/packages/core-base/src/resolver.ts +++ b/packages/core-base/src/resolver.ts @@ -1,4 +1,4 @@ -import { isObject } from '@intlify/shared' +import { isObject, isFunction } from '@intlify/shared' /** @VueI18nGeneral */ export type Path = string @@ -348,6 +348,9 @@ export function resolveValue(obj: unknown, path: Path): PathValue { if (val === undefined) { return null } + if (isFunction(last)) { + return null + } last = val i++ } diff --git a/packages/core-base/test/resolver.test.ts b/packages/core-base/test/resolver.test.ts index 3cc00008a..13285113f 100644 --- a/packages/core-base/test/resolver.test.ts +++ b/packages/core-base/test/resolver.test.ts @@ -120,4 +120,9 @@ test('resolveValue', () => { expect(resolveValue({}, 'a.b.c[]')).toEqual(null) // blanket middle expect(resolveValue({}, 'a.b.c[]d')).toEqual(null) + // function + const fn = () => 1 + expect(resolveValue({ a: fn }, 'a.name')).toEqual(null) + expect(resolveValue({ a: fn }, 'a.toString')).toEqual(null) + expect(resolveValue({ a: fn }, 'a')).toEqual(fn) }) diff --git a/packages/vue-i18n-core/src/composer.ts b/packages/vue-i18n-core/src/composer.ts index a2968174e..411bbcb1b 100644 --- a/packages/vue-i18n-core/src/composer.ts +++ b/packages/vue-i18n-core/src/composer.ts @@ -2364,25 +2364,11 @@ export function createComposer(options: any = {}, VueI18nLegacy?: any): any { () => [key], 'translate exists', root => { - console.log('root ... te') return Reflect.apply(root.te, root, [key, locale]) }, NOOP_RETURN_FALSE, val => isBoolean(val) ) - /* - if (!key) { - return false - } - const targetLocale = isString(locale) ? locale : _locale.value - const message = getLocaleMessage(targetLocale) - const resolved = _context.messageResolver(message, key) - return ( - isMessageAST(resolved) || - isMessageFunction(resolved) || - isString(resolved) - ) - */ } function resolveMessages(key: Path): LocaleMessageValue | null { diff --git a/packages/vue-i18n-core/test/issues.test.ts b/packages/vue-i18n-core/test/issues.test.ts index 84768c570..61ab56268 100644 --- a/packages/vue-i18n-core/test/issues.test.ts +++ b/packages/vue-i18n-core/test/issues.test.ts @@ -1198,7 +1198,7 @@ test('issue #1595 merge case', async () => { ) }) -test('issue #1610 merge case', async () => { +test('issue #1610', async () => { const en = { hello: 'Hello, Vue I18n', language: 'Languages' @@ -1227,3 +1227,49 @@ test('issue #1610 merge case', async () => { `

Hello, Vue I18n

true (...but this should be true)` ) }) + +test('issue #1615', async () => { + console.log('----') + const en = { + hello: (() => { + const fn = ctx => { + const { normalize: _normalize } = ctx + return _normalize(['Hello, Vue I18n']) + } + fn.source = 'Hello, Vue I18n' + return fn + })(), + language: (() => { + const fn = ctx => { + const { normalize: _normalize } = ctx + return _normalize(['Languages']) + } + fn.source = 'Languages' + return fn + })() + } + const i18n = createI18n({ + legacy: false, + locale: 'en', + globalInjection: true, + messages: { + en: {} + } + }) + + const App = defineComponent({ + template: ` +

{{ $t('hello.name') }}

+

(( "hello.name" does not exist. correct path would just be "hello")

+

{{ $te('hello.name') }} (...but this should be false)

+` + }) + const wrapper = await mount(App, i18n) + + i18n.global.setLocaleMessage('en', en) + await nextTick() + + expect(wrapper.find('#te')?.textContent).toEqual( + `false (...but this should be false)` + ) +})