From 3e0958eb5e574f961e94fb3e0225306c3e840242 Mon Sep 17 00:00:00 2001 From: Bobbie Goede Date: Sun, 14 Jul 2024 14:01:53 +0200 Subject: [PATCH 1/5] feat: support generated locale type --- packages/vue-i18n-core/src/composer.ts | 44 ++++++++++++++++++++++---- packages/vue-i18n/src/index.ts | 1 + 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/packages/vue-i18n-core/src/composer.ts b/packages/vue-i18n-core/src/composer.ts index cc379456b..c2af71f9e 100644 --- a/packages/vue-i18n-core/src/composer.ts +++ b/packages/vue-i18n-core/src/composer.ts @@ -1257,6 +1257,36 @@ export interface ComposerNumberFormatting< */ export interface ComposerCustom {} +/** + * + * The interface used for narrowing the Composer type using generated types. + * + * @remarks + * + * The type generated by 3rd party (e.g. nuxt/i18n) + * + * @example + * ```ts + * // generated-vue-i18n.d.ts (`.d.ts` file at your app) + * + * declare module 'vue-i18n' { + * interface ComposerGeneratedTypeConfig { + * // based on configuration elsewhere + * locale: "en" | "ja" + * } + * } + * ``` + */ +export interface ComposerGeneratedTypeConfig {} + +/** + * Generated locale which falls back to `Locale` if left unset + */ +export type GeneratedLocale = + ComposerGeneratedTypeConfig extends Record<'locale', infer CustomLocale> + ? CustomLocale + : Locale + /** * Composer interfaces * @@ -1269,16 +1299,18 @@ export interface Composer< Messages extends Record = {}, DateTimeFormats extends Record = {}, NumberFormats extends Record = {}, - OptionLocale = Locale, + OptionLocale = GeneratedLocale, ResourceLocales = | PickupLocales> | PickupLocales> | PickupLocales>, - Locales = OptionLocale extends Locale - ? IsNever extends true - ? Locale - : ResourceLocales - : OptionLocale | ResourceLocales + Locales = IsNever extends true + ? OptionLocale extends Locale + ? IsNever extends true + ? Locale + : ResourceLocales + : OptionLocale | ResourceLocales + : GeneratedLocale > extends ComposerCustom { /** * @remarks diff --git a/packages/vue-i18n/src/index.ts b/packages/vue-i18n/src/index.ts index ae725bb8e..b74385bef 100644 --- a/packages/vue-i18n/src/index.ts +++ b/packages/vue-i18n/src/index.ts @@ -66,6 +66,7 @@ export { ComposerOptions, Composer, ComposerCustom, + ComposerGeneratedTypeConfig, CustomBlock, CustomBlocks, ComposerTranslation, From cdd08c3c2722459fc8cecb42683011f59b740ab0 Mon Sep 17 00:00:00 2001 From: Bobbie Goede Date: Sun, 14 Jul 2024 14:25:41 +0200 Subject: [PATCH 2/5] fix: resolve `GeneratedLocale` to `never` if unset --- packages/vue-i18n-core/src/composer.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/vue-i18n-core/src/composer.ts b/packages/vue-i18n-core/src/composer.ts index c2af71f9e..403fad914 100644 --- a/packages/vue-i18n-core/src/composer.ts +++ b/packages/vue-i18n-core/src/composer.ts @@ -1280,12 +1280,12 @@ export interface ComposerCustom {} export interface ComposerGeneratedTypeConfig {} /** - * Generated locale which falls back to `Locale` if left unset + * Generated locale which resolves to `never` if left unset */ export type GeneratedLocale = ComposerGeneratedTypeConfig extends Record<'locale', infer CustomLocale> ? CustomLocale - : Locale + : never /** * Composer interfaces @@ -1299,7 +1299,9 @@ export interface Composer< Messages extends Record = {}, DateTimeFormats extends Record = {}, NumberFormats extends Record = {}, - OptionLocale = GeneratedLocale, + OptionLocale = IsNever extends true + ? Locale + : GeneratedLocale, ResourceLocales = | PickupLocales> | PickupLocales> From 110630daa8c23294ae3c2c12e01c8eadb79b1cc1 Mon Sep 17 00:00:00 2001 From: Bobbie Goede Date: Sun, 14 Jul 2024 16:47:49 +0200 Subject: [PATCH 3/5] fix: use `IntlifyGenratedTypeConfig` instead and resolve earlier --- packages/core-base/src/runtime.ts | 33 +++++++++++++++++++- packages/vue-i18n-core/src/composer.ts | 43 ++++---------------------- packages/vue-i18n-core/src/legacy.ts | 15 +++++---- packages/vue-i18n/src/index.ts | 4 +-- 4 files changed, 49 insertions(+), 46 deletions(-) diff --git a/packages/core-base/src/runtime.ts b/packages/core-base/src/runtime.ts index 7ee29c17f..2dfbe95df 100644 --- a/packages/core-base/src/runtime.ts +++ b/packages/core-base/src/runtime.ts @@ -11,6 +11,7 @@ import { } from '@intlify/shared' import { HelperNameMap } from '@intlify/message-compiler' import { Path } from './resolver' +import { IsNever } from './types' type ExtractToStringKey = Extract type ExtractToStringFunction = T[ExtractToStringKey] @@ -21,8 +22,38 @@ type StringConvertable = ExtractToStringKey extends never ? T : unknown +/** + * + * The interface used for narrowing types using generated types. + * + * @remarks + * + * The type generated by 3rd party (e.g. nuxt/i18n) + * + * @example + * ```ts + * // generated-intlify-core.d.ts (`.d.ts` file at your app) + * + * declare module '@intlify/core' { + * interface IntlifyGeneratedTypeConfig { + * locale: "en" | "ja" + * } + * } + * ``` + */ +export interface IntlifyGeneratedTypeConfig {} + +/** + * Generated locale which resolves to `never` if left unset + */ +export type GeneratedLocale = + IntlifyGeneratedTypeConfig extends Record<'locale', infer CustomLocale> + ? CustomLocale + : never + /** @VueI18nGeneral */ -export type Locale = string +export type Locale = + IsNever extends true ? string : GeneratedLocale /** @VueI18nGeneral */ // prettier-ignore diff --git a/packages/vue-i18n-core/src/composer.ts b/packages/vue-i18n-core/src/composer.ts index 403fad914..b5bc124e3 100644 --- a/packages/vue-i18n-core/src/composer.ts +++ b/packages/vue-i18n-core/src/composer.ts @@ -109,7 +109,8 @@ import type { IsEmptyObject, CoreMissingType, JsonPaths, - TranslationsPaths + TranslationsPaths, + GeneratedLocale } from '@intlify/core-base' import type { VueDevToolsEmitter } from '@intlify/devtools-types' @@ -1257,36 +1258,6 @@ export interface ComposerNumberFormatting< */ export interface ComposerCustom {} -/** - * - * The interface used for narrowing the Composer type using generated types. - * - * @remarks - * - * The type generated by 3rd party (e.g. nuxt/i18n) - * - * @example - * ```ts - * // generated-vue-i18n.d.ts (`.d.ts` file at your app) - * - * declare module 'vue-i18n' { - * interface ComposerGeneratedTypeConfig { - * // based on configuration elsewhere - * locale: "en" | "ja" - * } - * } - * ``` - */ -export interface ComposerGeneratedTypeConfig {} - -/** - * Generated locale which resolves to `never` if left unset - */ -export type GeneratedLocale = - ComposerGeneratedTypeConfig extends Record<'locale', infer CustomLocale> - ? CustomLocale - : never - /** * Composer interfaces * @@ -1299,20 +1270,18 @@ export interface Composer< Messages extends Record = {}, DateTimeFormats extends Record = {}, NumberFormats extends Record = {}, - OptionLocale = IsNever extends true - ? Locale - : GeneratedLocale, + OptionLocale = Locale, ResourceLocales = | PickupLocales> | PickupLocales> | PickupLocales>, - Locales = IsNever extends true - ? OptionLocale extends Locale + Locales = Locale extends GeneratedLocale + ? GeneratedLocale + : OptionLocale extends Locale ? IsNever extends true ? Locale : ResourceLocales : OptionLocale | ResourceLocales - : GeneratedLocale > extends ComposerCustom { /** * @remarks diff --git a/packages/vue-i18n-core/src/legacy.ts b/packages/vue-i18n-core/src/legacy.ts index 670071129..ce33eb622 100644 --- a/packages/vue-i18n-core/src/legacy.ts +++ b/packages/vue-i18n-core/src/legacy.ts @@ -46,7 +46,8 @@ import type { PickupPaths, PickupFormatPathKeys, IsEmptyObject, - IsNever + IsNever, + GeneratedLocale } from '@intlify/core-base' import type { VueDevToolsEmitter } from '@intlify/devtools-types' import type { @@ -1047,11 +1048,13 @@ export interface VueI18n< | PickupLocales> | PickupLocales> | PickupLocales>, - Locales = OptionLocale extends string - ? [ResourceLocales] extends [never] - ? Locale - : ResourceLocales - : OptionLocale | ResourceLocales, + Locales = Locale extends GeneratedLocale + ? GeneratedLocale + : OptionLocale extends string + ? [ResourceLocales] extends [never] + ? Locale + : ResourceLocales + : OptionLocale | ResourceLocales, Composition extends Composer< Messages, DateTimeFormats, diff --git a/packages/vue-i18n/src/index.ts b/packages/vue-i18n/src/index.ts index b74385bef..0a8af56fc 100644 --- a/packages/vue-i18n/src/index.ts +++ b/packages/vue-i18n/src/index.ts @@ -52,7 +52,8 @@ export { MessageCompilerContext, CompileError, MessageContext, - RemovedIndexResources + RemovedIndexResources, + IntlifyGeneratedTypeConfig } from '@intlify/core-base' export { VueMessageType, @@ -66,7 +67,6 @@ export { ComposerOptions, Composer, ComposerCustom, - ComposerGeneratedTypeConfig, CustomBlock, CustomBlocks, ComposerTranslation, From ded11751d6e31e5a89363be85f168f931294a878 Mon Sep 17 00:00:00 2001 From: Bobbie Goede Date: Mon, 15 Jul 2024 18:37:50 +0200 Subject: [PATCH 4/5] fix: rename interface --- packages/core-base/src/runtime.ts | 8 ++++---- packages/vue-i18n/src/index.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core-base/src/runtime.ts b/packages/core-base/src/runtime.ts index 2dfbe95df..f80666538 100644 --- a/packages/core-base/src/runtime.ts +++ b/packages/core-base/src/runtime.ts @@ -32,22 +32,22 @@ type StringConvertable = ExtractToStringKey extends never * * @example * ```ts - * // generated-intlify-core.d.ts (`.d.ts` file at your app) + * // generated-i18n-types.d.ts (`.d.ts` file at your app) * * declare module '@intlify/core' { - * interface IntlifyGeneratedTypeConfig { + * interface GeneratedTypeConfig { * locale: "en" | "ja" * } * } * ``` */ -export interface IntlifyGeneratedTypeConfig {} +export interface GeneratedTypeConfig {} /** * Generated locale which resolves to `never` if left unset */ export type GeneratedLocale = - IntlifyGeneratedTypeConfig extends Record<'locale', infer CustomLocale> + GeneratedTypeConfig extends Record<'locale', infer CustomLocale> ? CustomLocale : never diff --git a/packages/vue-i18n/src/index.ts b/packages/vue-i18n/src/index.ts index 0a8af56fc..53c16ee0c 100644 --- a/packages/vue-i18n/src/index.ts +++ b/packages/vue-i18n/src/index.ts @@ -53,7 +53,7 @@ export { CompileError, MessageContext, RemovedIndexResources, - IntlifyGeneratedTypeConfig + GeneratedTypeConfig } from '@intlify/core-base' export { VueMessageType, From cce8f6c71322675aff6be0353bf979cf080c275b Mon Sep 17 00:00:00 2001 From: Bobbie Goede Date: Mon, 15 Jul 2024 18:38:11 +0200 Subject: [PATCH 5/5] fix: export interface from `petite-vue-i18n` --- packages/petite-vue-i18n/src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/petite-vue-i18n/src/index.ts b/packages/petite-vue-i18n/src/index.ts index 7002ce033..0b01eb2f8 100644 --- a/packages/petite-vue-i18n/src/index.ts +++ b/packages/petite-vue-i18n/src/index.ts @@ -42,7 +42,8 @@ export { MessageCompilerContext, CompileError, MessageContext, - RemovedIndexResources + RemovedIndexResources, + GeneratedTypeConfig } from '@intlify/core-base' export { VueMessageType,