international-types
Advanced tools
Comparing version 0.6.2 to 0.7.0
@@ -5,6 +5,7 @@ export type LocaleValue = string | number | boolean | null | undefined | Date; | ||
export type ExplicitLocales = Record<string, BaseLocale>; | ||
export type LocaleKeys<Locale extends BaseLocale, Scope extends Scopes<Locale> | undefined, Key extends string = Extract<keyof Locale, string>> = Scope extends undefined ? Key : Key extends `${Scope}.${infer Test}` ? Test : never; | ||
export type LocaleKeys<Locale extends BaseLocale, Scope extends Scopes<Locale> | undefined, Key extends string = Extract<keyof Locale, string>> = Scope extends undefined ? RemovePlural<Key> : Key extends `${Scope}.${infer Test}` ? RemovePlural<Test> : never; | ||
type Delimiter = `=${number}` | 'other'; | ||
type ExtractParams<Value extends LocaleValue> = Value extends '' ? [] : Value extends `${string}{${infer Param}}${infer Tail}` ? [Param, ...ExtractParams<Tail>] : []; | ||
export type Params<Value extends LocaleValue> = Value extends '' ? [] : Value extends `{${infer Param}, plural, ${Delimiter} {${infer Content}} ${Delimiter} {${infer Content2}} ${Delimiter} {${infer Content3}}}` ? [Param, ...ExtractParams<Content>, ...ExtractParams<Content2>, ...ExtractParams<Content3>] : Value extends `{${infer Param}, plural, ${Delimiter} {${infer Content}} ${Delimiter} {${infer Content2}}}` ? [Param, ...ExtractParams<Content>, ...ExtractParams<Content2>] : Value extends `${string}{${infer Param}}${infer Tail}` ? [Param, ...Params<Tail>] : []; | ||
export type GetParams<Value extends LocaleValue> = Value extends '' ? [] : Value extends `${string}{${infer Param}}${infer Tail}` ? [Param, ...Params<Tail>] : []; | ||
export type ParamsObject<Value extends LocaleValue> = Record<Params<Value>[number], LocaleValue>; | ||
@@ -16,3 +17,3 @@ type ExtractScopes<Value extends string, Prev extends string | undefined = undefined> = Value extends `${infer Head}.${infer Tail}` ? [ | ||
export type Scopes<Locale extends BaseLocale> = ExtractScopes<Extract<keyof Locale, string>>[number]; | ||
export type ScopedValue<Locale extends BaseLocale, Scope extends Scopes<Locale> | undefined, Key extends LocaleKeys<Locale, Scope>> = Scope extends undefined ? Locale[Key] : Locale[`${Scope}.${Key}`]; | ||
export type ScopedValue<Locale extends BaseLocale, Scope extends Scopes<Locale> | undefined, Key extends LocaleKeys<Locale, Scope>> = Scope extends undefined ? IsPlural<Key, Locale> extends true ? Locale[`${Key}#${PluralSuffix}`] : Locale[Key] : IsPlural<Key, Locale> extends true ? Locale[`${Scope}.${Key}#${PluralSuffix}`] : Locale[`${Scope}.${Key}`]; | ||
type UnionToIntersection<U> = (U extends never ? never : (arg: U) => never) extends (arg: infer I) => void ? I : never; | ||
@@ -31,2 +32,13 @@ type UnionToTuple<T> = UnionToIntersection<T extends never ? never : (t: T) => T> extends (_: never) => infer W ? [...UnionToTuple<Exclude<T, W>>, W] : []; | ||
}; | ||
type PluralSuffix = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'; | ||
type RemovePlural<Key extends string> = Key extends `${infer Head}#${PluralSuffix}` ? Head : Key; | ||
type GetPlural<Key extends string, Locale extends BaseLocale> = `${Key}#${PluralSuffix}` & keyof Locale extends infer PluralKey ? PluralKey extends `${string}#${infer Plural extends PluralSuffix}` ? Plural : never : never; | ||
type IsPlural<Key extends string, Locale extends BaseLocale> = `${Key}#${PluralSuffix}` & keyof Locale extends never ? false : true; | ||
type GetCountUnion<Key extends string, Locale extends BaseLocale, Plural extends PluralSuffix = GetPlural<Key, Locale>> = Plural extends 'zero' ? 0 : Plural extends 'one' ? 1 : Plural extends 'two' ? 2 : number; | ||
type AddCount<T, Key extends string, Locale extends BaseLocale> = T extends [] ? [{ | ||
count: GetCountUnion<Key, Locale>; | ||
}] : T extends [infer R] ? [{ | ||
count: GetCountUnion<Key, Locale>; | ||
} & R] : never; | ||
export type CreateParams<T, Locale extends BaseLocale, Scope extends Scopes<Locale> | undefined, Key extends LocaleKeys<Locale, Scope>, Value extends LocaleValue = ScopedValue<Locale, Scope, Key>> = IsPlural<Key, Locale> extends true ? AddCount<GetParams<Value>['length'] extends 0 ? [] : [T], Key, Locale> : GetParams<Value>['length'] extends 0 ? [] : [T]; | ||
export {}; |
{ | ||
"name": "international-types", | ||
"version": "0.6.2", | ||
"version": "0.7.0", | ||
"description": "Type-safe internationalization (i18n) utility types", | ||
@@ -5,0 +5,0 @@ "types": "dist/index.d.ts", |
7732
44