@intlayer/types 9.4.3 → 9.5.0
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.
- package/README.md +0 -2
- package/dist/types/allLocales.d.ts +2 -3
- package/dist/types/allLocales.d.ts.map +1 -1
- package/dist/types/config.d.ts +29 -30
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/dictionary.d.ts +22 -23
- package/dist/types/dictionary.d.ts.map +1 -1
- package/dist/types/filePathPattern.d.ts +3 -4
- package/dist/types/filePathPattern.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/keyPath.d.ts +16 -17
- package/dist/types/keyPath.d.ts.map +1 -1
- package/dist/types/locales.d.ts +303 -303
- package/dist/types/locales.d.ts.map +1 -1
- package/dist/types/module_augmentation.d.ts +32 -32
- package/dist/types/module_augmentation.d.ts.map +1 -1
- package/dist/types/nodeType.d.ts +29 -27
- package/dist/types/nodeType.d.ts.map +1 -1
- package/dist/types/plugin.d.ts +5 -6
- package/dist/types/plugin.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.d.ts","names":[],"sources":["../../src/locales.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"locales.d.ts","names":[],"sources":["../../src/locales.ts"],"mappings":";;;;qBACa;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAGA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA;;qBAEA"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { Locale } from "./allLocales.js";
|
|
2
|
-
import { Dictionary, DictionarySelector, DictionarySelectorForGroup, DictionaryVariantIdsOf,
|
|
2
|
+
import { Dictionary, DictionarySelector, DictionarySelectorForGroup, DictionaryVariantIdsOf, ProviderVariantBase, ResolveQualifiedDictionaryContent } from "./dictionary.js";
|
|
3
3
|
import { StrictMode } from "./config.js";
|
|
4
4
|
import { __DeclaredLocalesRegistry, __DictionaryRegistry, __EditorRegistry, __RequiredLocalesRegistry, __RoutingRegistry, __SchemaRegistry, __StrictModeRegistry } from "intlayer";
|
|
5
5
|
//#region src/module_augmentation.d.ts
|
|
6
|
-
type SchemaKeys = keyof __SchemaRegistry extends never ? string : keyof __SchemaRegistry;
|
|
7
|
-
type Schema<T extends SchemaKeys> = [string] extends [T] ? any : T extends keyof __SchemaRegistry ? __SchemaRegistry[T] : any;
|
|
8
|
-
type DictionaryKeys = keyof __DictionaryRegistry extends never ? string : keyof __DictionaryRegistry;
|
|
9
|
-
type DictionaryRegistry = __DictionaryRegistry[keyof __DictionaryRegistry] extends never ? Record<string, Dictionary> : __DictionaryRegistry;
|
|
10
|
-
type DictionaryRegistryElement<T extends DictionaryKeys> = [string] extends [T] ? Dictionary : T extends keyof __DictionaryRegistry ? __DictionaryRegistry[T] extends Dictionary ? __DictionaryRegistry[T] : Dictionary : Dictionary;
|
|
11
|
-
type DictionaryRegistryContent<T extends PropertyKey> = [T] extends [keyof __DictionaryRegistry] ? __DictionaryRegistry[T] extends {
|
|
6
|
+
export type SchemaKeys = keyof __SchemaRegistry extends never ? string : keyof __SchemaRegistry;
|
|
7
|
+
export type Schema<T extends SchemaKeys> = [string] extends [T] ? any : T extends keyof __SchemaRegistry ? __SchemaRegistry[T] : any;
|
|
8
|
+
export type DictionaryKeys = keyof __DictionaryRegistry extends never ? string : keyof __DictionaryRegistry;
|
|
9
|
+
export type DictionaryRegistry = __DictionaryRegistry[keyof __DictionaryRegistry] extends never ? Record<string, Dictionary> : __DictionaryRegistry;
|
|
10
|
+
export type DictionaryRegistryElement<T extends DictionaryKeys> = [string] extends [T] ? Dictionary : T extends keyof __DictionaryRegistry ? __DictionaryRegistry[T] extends Dictionary ? __DictionaryRegistry[T] : Dictionary : Dictionary;
|
|
11
|
+
export type DictionaryRegistryContent<T extends PropertyKey> = [T] extends [keyof __DictionaryRegistry] ? __DictionaryRegistry[T] extends {
|
|
12
12
|
content: infer C;
|
|
13
13
|
} ? C : Dictionary["content"] : Dictionary["content"];
|
|
14
14
|
/**
|
|
@@ -20,12 +20,12 @@ type DictionaryRegistryContent<T extends PropertyKey> = [T] extends [keyof __Dic
|
|
|
20
20
|
* (collections, variants) the selector shape drives the result
|
|
21
21
|
* (single entry, array of entries, or null).
|
|
22
22
|
*/
|
|
23
|
-
type DictionaryRegistryResult<T extends PropertyKey, Arg = undefined> = [T] extends [keyof __DictionaryRegistry] ? ResolveQualifiedDictionaryContent<__DictionaryRegistry[T], Arg> : Dictionary["content"];
|
|
23
|
+
export type DictionaryRegistryResult<T extends PropertyKey, Arg = undefined> = [T] extends [keyof __DictionaryRegistry] ? ResolveQualifiedDictionaryContent<__DictionaryRegistry[T], Arg> : Dictionary["content"];
|
|
24
24
|
/**
|
|
25
25
|
* Extracts the effective locale from the second argument of
|
|
26
26
|
* `getIntlayer` / `useIntlayer` (locale string or selector object).
|
|
27
27
|
*/
|
|
28
|
-
type ExtractSelectorLocale<Arg> = Arg extends {
|
|
28
|
+
export type ExtractSelectorLocale<Arg> = Arg extends {
|
|
29
29
|
locale: infer L extends LocalesValues;
|
|
30
30
|
} ? L : Arg extends LocalesValues ? Arg : DeclaredLocales;
|
|
31
31
|
/**
|
|
@@ -44,13 +44,13 @@ type ExtractSelectorLocale<Arg> = Arg extends {
|
|
|
44
44
|
* TypeScript prints this name in error messages instead of expanding the
|
|
45
45
|
* registry inline.
|
|
46
46
|
*/
|
|
47
|
-
type DeclaredVariants = DictionaryVariantIdsOf<__DictionaryRegistry[keyof __DictionaryRegistry]>;
|
|
47
|
+
export type DeclaredVariants = DictionaryVariantIdsOf<__DictionaryRegistry[keyof __DictionaryRegistry]>;
|
|
48
48
|
/**
|
|
49
49
|
* The selector accepted for a dictionary **key** `T`: its `variant` / `item` /
|
|
50
50
|
* `id` are constrained to the coordinates that exist for that key, so an unknown
|
|
51
51
|
* value is a compile-time error. Plain keys fall back to {@link DictionarySelector}.
|
|
52
52
|
*/
|
|
53
|
-
type DictionarySelectorForKey<T extends PropertyKey> = [T] extends [keyof __DictionaryRegistry] ? DictionarySelectorForGroup<__DictionaryRegistry[T]> : DictionarySelector;
|
|
53
|
+
export type DictionarySelectorForKey<T extends PropertyKey> = [T] extends [keyof __DictionaryRegistry] ? DictionarySelectorForGroup<__DictionaryRegistry[T]> : DictionarySelector;
|
|
54
54
|
/**
|
|
55
55
|
* The `variant` prop of a framework provider (`<IntlayerProvider variant>`),
|
|
56
56
|
* narrowed to this project's declared dictionary keys — so the per-key map form
|
|
@@ -62,26 +62,26 @@ type DictionarySelectorForKey<T extends PropertyKey> = [T] extends [keyof __Dict
|
|
|
62
62
|
* happens to be a dictionary key. Pin a structured variant globally by nesting
|
|
63
63
|
* it under an entry instead: `variant={{ default: { id: 'prod_abc' } }}`.
|
|
64
64
|
*/
|
|
65
|
-
type ProviderVariant =
|
|
65
|
+
export type ProviderVariant = ProviderVariantBase<DictionaryKeys & string>;
|
|
66
66
|
type NarrowStringKeys<T> = string extends keyof T ? never : Extract<keyof T, string>;
|
|
67
|
-
type DeclaredLocales = [NarrowStringKeys<__DeclaredLocalesRegistry>] extends [never] ? Locale : NarrowStringKeys<__DeclaredLocalesRegistry>;
|
|
68
|
-
type RequiredLocales = [NarrowStringKeys<__RequiredLocalesRegistry>] extends [never] ? never : NarrowStringKeys<__RequiredLocalesRegistry>;
|
|
67
|
+
export type DeclaredLocales = [NarrowStringKeys<__DeclaredLocalesRegistry>] extends [never] ? Locale : NarrowStringKeys<__DeclaredLocalesRegistry>;
|
|
68
|
+
export type RequiredLocales = [NarrowStringKeys<__RequiredLocalesRegistry>] extends [never] ? never : NarrowStringKeys<__RequiredLocalesRegistry>;
|
|
69
69
|
/** Define MyType using the ValueOf utility type on Locales */
|
|
70
|
-
type LocalesValues = DeclaredLocales | (string & {});
|
|
70
|
+
export type LocalesValues = DeclaredLocales | (string & {});
|
|
71
71
|
type ResolvedStrictMode = __StrictModeRegistry extends {
|
|
72
72
|
mode: infer M;
|
|
73
73
|
} ? M : "inclusive";
|
|
74
|
-
type StrictModeLocaleMap<Content = unknown, Mode extends StrictMode = ResolvedStrictMode> = RequiredLocales extends never ? Partial<Record<Locale, Content>> : Mode extends "strict" ? Required<Record<RequiredLocales, Content>> & Partial<Record<DeclaredLocales, Content>> : Mode extends "inclusive" ? Required<Record<RequiredLocales, Content>> & Partial<Record<Locale, Content>> : Partial<Record<Locale, Content>>;
|
|
75
|
-
type ResolvedEditor<Node, Editor> = __EditorRegistry extends {
|
|
74
|
+
export type StrictModeLocaleMap<Content = unknown, Mode extends StrictMode = ResolvedStrictMode> = RequiredLocales extends never ? Partial<Record<Locale, Content>> : Mode extends "strict" ? Required<Record<RequiredLocales, Content>> & Partial<Record<DeclaredLocales, Content>> : Mode extends "inclusive" ? Required<Record<RequiredLocales, Content>> & Partial<Record<Locale, Content>> : Partial<Record<Locale, Content>>;
|
|
75
|
+
export type ResolvedEditor<Node, Editor> = __EditorRegistry extends {
|
|
76
76
|
enabled: true;
|
|
77
77
|
} ? Editor : Node;
|
|
78
78
|
type RoutingMode = "prefix-no-default" | "prefix-all" | "no-prefix" | "search-params";
|
|
79
79
|
/** The routing mode resolved from the generated registry (falls back to 'prefix-no-default'). */
|
|
80
|
-
type ResolvedRoutingMode = __RoutingRegistry extends {
|
|
80
|
+
export type ResolvedRoutingMode = __RoutingRegistry extends {
|
|
81
81
|
mode: infer M extends RoutingMode;
|
|
82
82
|
} ? M : "prefix-no-default";
|
|
83
83
|
/** The default locale resolved from the generated registry (falls back to the full LocalesValues union). */
|
|
84
|
-
type ResolvedDefaultLocale = __RoutingRegistry extends {
|
|
84
|
+
export type ResolvedDefaultLocale = __RoutingRegistry extends {
|
|
85
85
|
defaultLocale: infer D extends DeclaredLocales;
|
|
86
86
|
} ? D : DeclaredLocales;
|
|
87
87
|
/**
|
|
@@ -89,7 +89,7 @@ type ResolvedDefaultLocale = __RoutingRegistry extends {
|
|
|
89
89
|
* locale: the normalized origin to prepend to its URLs, and whether that
|
|
90
90
|
* hostname serves this locale alone.
|
|
91
91
|
*/
|
|
92
|
-
type DomainRegistryEntry = {
|
|
92
|
+
export type DomainRegistryEntry = {
|
|
93
93
|
origin: string;
|
|
94
94
|
exclusive: boolean;
|
|
95
95
|
};
|
|
@@ -99,13 +99,13 @@ type DomainRegistryEntry = {
|
|
|
99
99
|
* @example
|
|
100
100
|
* { en: { origin: 'https://intlayer.org'; exclusive: false }; zh: { origin: 'https://intlayer.cn'; exclusive: true } }
|
|
101
101
|
*/
|
|
102
|
-
type DomainRuleMap = Record<string, DomainRegistryEntry>;
|
|
102
|
+
export type DomainRuleMap = Record<string, DomainRegistryEntry>;
|
|
103
103
|
/**
|
|
104
104
|
* The project's domain map resolved from the generated registry. Falls back to
|
|
105
105
|
* an empty map — no locale is then served from its own domain — when the project
|
|
106
106
|
* declares no `routing.domains`, or when the types have not been generated yet.
|
|
107
107
|
*/
|
|
108
|
-
type ResolvedDomains = __RoutingRegistry extends {
|
|
108
|
+
export type ResolvedDomains = __RoutingRegistry extends {
|
|
109
109
|
domains: infer Domains extends DomainRuleMap;
|
|
110
110
|
} ? Domains : {};
|
|
111
111
|
/**
|
|
@@ -116,7 +116,7 @@ type ResolvedDomains = __RoutingRegistry extends {
|
|
|
116
116
|
* type A = LocaleDomainOrigin<'zh', ResolvedDomains>; // 'https://intlayer.cn'
|
|
117
117
|
* type B = LocaleDomainOrigin<'fr', ResolvedDomains>; // never
|
|
118
118
|
*/
|
|
119
|
-
type LocaleDomainOrigin<L extends string, Domains extends DomainRuleMap = ResolvedDomains> = L extends keyof Domains ? Extract<Domains[L]["origin"], string> : never;
|
|
119
|
+
export type LocaleDomainOrigin<L extends string, Domains extends DomainRuleMap = ResolvedDomains> = L extends keyof Domains ? Extract<Domains[L]["origin"], string> : never;
|
|
120
120
|
/**
|
|
121
121
|
* Whether `L` is the only locale mapped to its domain. The domain then identifies
|
|
122
122
|
* the locale on its own, so its paths carry no locale prefix — the type-level
|
|
@@ -127,7 +127,7 @@ type LocaleDomainOrigin<L extends string, Domains extends DomainRuleMap = Resolv
|
|
|
127
127
|
* type A = IsDomainExclusive<'zh'>; // true → https://intlayer.cn/about
|
|
128
128
|
* type B = IsDomainExclusive<'fr'>; // false → https://intlayer.org/fr/about
|
|
129
129
|
*/
|
|
130
|
-
type IsDomainExclusive<L extends string, Domains extends DomainRuleMap = ResolvedDomains> = L extends keyof Domains ? Domains[L]["exclusive"] : false;
|
|
130
|
+
export type IsDomainExclusive<L extends string, Domains extends DomainRuleMap = ResolvedDomains> = L extends keyof Domains ? Domains[L]["exclusive"] : false;
|
|
131
131
|
/** Computes the locale path segment (e.g. `'fr/'`) for a given locale and routing mode. */
|
|
132
132
|
type LocalePrefixSegment<L extends string, Mode extends string, Default extends string> = Mode extends "prefix-all" ? `${L}/` : Mode extends "prefix-no-default" ? L extends Default ? "" : `${L}/` : "";
|
|
133
133
|
/**
|
|
@@ -210,7 +210,7 @@ type LocalizedPathBody<Path extends string, L extends LocalesValues, Mode extend
|
|
|
210
210
|
* // with domains: { zh: 'intlayer.cn' } (exclusive → no locale prefix)
|
|
211
211
|
* type H = LocalizedUrl<'/about', 'zh'>; // 'https://intlayer.cn/about' | '/about'
|
|
212
212
|
*/
|
|
213
|
-
type LocalizedUrl<Path extends string, L extends LocalesValues, Mode extends string = ResolvedRoutingMode, Default extends LocalesValues = ResolvedDefaultLocale, Locales extends string = DeclaredLocales & string, Domains extends DomainRuleMap = ResolvedDomains> = [string] extends [Mode] ? string : Mode extends "search-params" ? string : LocalizedPathBody<Path, L, Mode, Default, Locales, Domains> extends (infer LocalPath extends string) ? [LocaleDomainOrigin<L & string, Domains>] extends [never] ? `${UrlOrigin<Path>}${LocalPath}` : `${LocaleDomainOrigin<L & string, Domains>}${LocalPath}` | `${UrlOrigin<Path>}${LocalPath}` : never;
|
|
213
|
+
export type LocalizedUrl<Path extends string, L extends LocalesValues, Mode extends string = ResolvedRoutingMode, Default extends LocalesValues = ResolvedDefaultLocale, Locales extends string = DeclaredLocales & string, Domains extends DomainRuleMap = ResolvedDomains> = [string] extends [Mode] ? string : Mode extends "search-params" ? string : LocalizedPathBody<Path, L, Mode, Default, Locales, Domains> extends (infer LocalPath extends string) ? [LocaleDomainOrigin<L & string, Domains>] extends [never] ? `${UrlOrigin<Path>}${LocalPath}` : `${LocaleDomainOrigin<L & string, Domains>}${LocalPath}` | `${UrlOrigin<Path>}${LocalPath}` : never;
|
|
214
214
|
/**
|
|
215
215
|
* Computes the localized path string type for a given path, locale, routing
|
|
216
216
|
* mode, default locale and domain map — the type-level counterpart of
|
|
@@ -229,7 +229,7 @@ type LocalizedUrl<Path extends string, L extends LocalesValues, Mode extends str
|
|
|
229
229
|
* // with domains: { zh: 'intlayer.cn' } (exclusive → no locale prefix)
|
|
230
230
|
* type D = LocalizedPathname<'/about', 'zh'>; // '/about'
|
|
231
231
|
*/
|
|
232
|
-
type LocalizedPathname<Path extends string, L extends LocalesValues, Mode extends string = ResolvedRoutingMode, Default extends LocalesValues = ResolvedDefaultLocale, Locales extends string = DeclaredLocales & string, Domains extends DomainRuleMap = ResolvedDomains> = [string] extends [Mode] ? string : Mode extends "search-params" ? string : LocalizedPathBody<Path, L, Mode, Default, Locales, Domains>;
|
|
232
|
+
export type LocalizedPathname<Path extends string, L extends LocalesValues, Mode extends string = ResolvedRoutingMode, Default extends LocalesValues = ResolvedDefaultLocale, Locales extends string = DeclaredLocales & string, Domains extends DomainRuleMap = ResolvedDomains> = [string] extends [Mode] ? string : Mode extends "search-params" ? string : LocalizedPathBody<Path, L, Mode, Default, Locales, Domains>;
|
|
233
233
|
/**
|
|
234
234
|
* Extracts the language subtag from a locale string.
|
|
235
235
|
*
|
|
@@ -237,7 +237,7 @@ type LocalizedPathname<Path extends string, L extends LocalesValues, Mode extend
|
|
|
237
237
|
* type A = GetLocaleLang<'en-GB'>; // 'en'
|
|
238
238
|
* type B = GetLocaleLang<'fr'>; // 'fr'
|
|
239
239
|
*/
|
|
240
|
-
type GetLocaleLang<L extends string> = L extends `${infer Lang}-${string}` ? Lang : L;
|
|
240
|
+
export type GetLocaleLang<L extends string> = L extends `${infer Lang}-${string}` ? Lang : L;
|
|
241
241
|
/**
|
|
242
242
|
* Removes the locale path segment from a URL (relative or absolute).
|
|
243
243
|
*
|
|
@@ -251,7 +251,7 @@ type GetLocaleLang<L extends string> = L extends `${infer Lang}-${string}` ? Lan
|
|
|
251
251
|
* type E = PathWithoutLocale<'https://sub.example.com/fr/about', 'fr' | 'en'>; // 'https://sub.example.com/about'
|
|
252
252
|
* type F = PathWithoutLocale<'https://example.com/fr', 'fr' | 'en'>; // 'https://example.com/'
|
|
253
253
|
*/
|
|
254
|
-
type PathWithoutLocale<Path extends string, Locales extends string> = Path extends `${infer Protocol}://${infer Domain}/${infer Seg}/${infer Rest}` ? Seg extends Locales ? `${Protocol}://${Domain}/${Rest}` : Path : Path extends `${infer Protocol}://${infer Domain}/${infer Seg}` ? Seg extends Locales ? `${Protocol}://${Domain}/` : Path : Path extends `/${infer Seg}/${infer Rest}` ? Seg extends Locales ? `/${Rest}` : Path : Path extends `/${infer Seg}` ? Seg extends Locales ? "/" : Path : Path;
|
|
254
|
+
export type PathWithoutLocale<Path extends string, Locales extends string> = Path extends `${infer Protocol}://${infer Domain}/${infer Seg}/${infer Rest}` ? Seg extends Locales ? `${Protocol}://${Domain}/${Rest}` : Path : Path extends `${infer Protocol}://${infer Domain}/${infer Seg}` ? Seg extends Locales ? `${Protocol}://${Domain}/` : Path : Path extends `/${infer Seg}/${infer Rest}` ? Seg extends Locales ? `/${Rest}` : Path : Path extends `/${infer Seg}` ? Seg extends Locales ? "/" : Path : Path;
|
|
255
255
|
/**
|
|
256
256
|
* Shape of the rewrite rules carried by the generated module augmentation: a
|
|
257
257
|
* canonical pattern mapped to its localized counterpart per locale, in the
|
|
@@ -261,13 +261,13 @@ type PathWithoutLocale<Path extends string, Locales extends string> = Path exten
|
|
|
261
261
|
* @example
|
|
262
262
|
* { '/about': { en: '/about'; fr: '/a-propos' }; '/product/:id': { fr: '/produit/:id' } }
|
|
263
263
|
*/
|
|
264
|
-
type RewriteRuleMap = Record<string, Record<string, string>>;
|
|
264
|
+
export type RewriteRuleMap = Record<string, Record<string, string>>;
|
|
265
265
|
/**
|
|
266
266
|
* The project's rewrite rules resolved from the generated registry. Falls back
|
|
267
267
|
* to an empty map — every path then localizes to itself — when the project
|
|
268
268
|
* declares no `routing.rewrite`, or when the types have not been generated yet.
|
|
269
269
|
*/
|
|
270
|
-
type ResolvedRewriteRules = __RoutingRegistry extends {
|
|
270
|
+
export type ResolvedRewriteRules = __RoutingRegistry extends {
|
|
271
271
|
rewrite: infer Rules extends RewriteRuleMap;
|
|
272
272
|
} ? Rules : {};
|
|
273
273
|
/**
|
|
@@ -318,7 +318,7 @@ type ResolveRewriteRules<Path extends string, L extends string, Rules extends Re
|
|
|
318
318
|
* type B = LocalizedPath<'/product/123', 'fr'>; // '/produit/123'
|
|
319
319
|
* type C = LocalizedPath<'/contact', 'fr'>; // '/contact' (no rule)
|
|
320
320
|
*/
|
|
321
|
-
type LocalizedPath<Path extends string, L extends LocalesValues = ResolvedDefaultLocale, Rules extends RewriteRuleMap = ResolvedRewriteRules> = string extends Path ? string : string extends L ? string : [keyof Rules] extends [never] ? Path : ResolveRewriteRules<Path, L & string, Rules> extends (infer Localized) ? [Localized] extends [never] ? Path : Extract<Localized, string> : never;
|
|
321
|
+
export type LocalizedPath<Path extends string, L extends LocalesValues = ResolvedDefaultLocale, Rules extends RewriteRuleMap = ResolvedRewriteRules> = string extends Path ? string : string extends L ? string : [keyof Rules] extends [never] ? Path : ResolveRewriteRules<Path, L & string, Rules> extends (infer Localized) ? [Localized] extends [never] ? Path : Extract<Localized, string> : never;
|
|
322
322
|
//#endregion
|
|
323
|
-
export {
|
|
323
|
+
export type { DictionarySelector, DictionarySelectorForGroup };
|
|
324
324
|
//# sourceMappingURL=module_augmentation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module_augmentation.d.ts","names":[],"sources":["../../src/module_augmentation.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"module_augmentation.d.ts","names":[],"sources":["../../src/module_augmentation.ts"],"mappings":"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"}
|
package/dist/types/nodeType.d.ts
CHANGED
|
@@ -1,40 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
declare const
|
|
5
|
-
declare const
|
|
6
|
-
declare const
|
|
7
|
-
declare const
|
|
8
|
-
declare const
|
|
9
|
-
declare const
|
|
10
|
-
declare const
|
|
11
|
-
declare const
|
|
12
|
-
declare const
|
|
13
|
-
declare const
|
|
14
|
-
declare const
|
|
15
|
-
declare const
|
|
16
|
-
declare const
|
|
17
|
-
declare const
|
|
18
|
-
declare const
|
|
19
|
-
declare const
|
|
20
|
-
declare const
|
|
21
|
-
declare const
|
|
22
|
-
declare const
|
|
1
|
+
declare namespace nodeType_d_exports {
|
|
2
|
+
export { ARRAY, BOOLEAN, CONDITION, ENUMERATION, FILE, GENDER, HTML, INSERTION, MARKDOWN, NESTED, NULL, NUMBER, NodeType, OBJECT, PLUGIN_NODE_TYPES, PLURAL, PREACT_NODE, REACT_NODE, SELECT, SOLID_NODE, TEXT, TRANSLATION, TypedNodeModel, UNKNOWN, formatNodeType };
|
|
3
|
+
}
|
|
4
|
+
export declare const TRANSLATION: "translation";
|
|
5
|
+
export declare const ENUMERATION: "enumeration";
|
|
6
|
+
export declare const PLURAL: "plural";
|
|
7
|
+
export declare const CONDITION: "condition";
|
|
8
|
+
export declare const INSERTION: "insertion";
|
|
9
|
+
export declare const FILE: "file";
|
|
10
|
+
export declare const OBJECT: "object";
|
|
11
|
+
export declare const ARRAY: "array";
|
|
12
|
+
export declare const NESTED: "nested";
|
|
13
|
+
export declare const REACT_NODE: "reactNode";
|
|
14
|
+
export declare const PREACT_NODE: "preactNode";
|
|
15
|
+
export declare const SOLID_NODE: "solidNode";
|
|
16
|
+
export declare const MARKDOWN: "markdown";
|
|
17
|
+
export declare const HTML: "html";
|
|
18
|
+
export declare const TEXT: "text";
|
|
19
|
+
export declare const NUMBER: "number";
|
|
20
|
+
export declare const BOOLEAN: "boolean";
|
|
21
|
+
export declare const GENDER: "gender";
|
|
22
|
+
export declare const SELECT: "select";
|
|
23
|
+
export declare const NULL: "null";
|
|
24
|
+
export declare const UNKNOWN: "unknown";
|
|
23
25
|
/**
|
|
24
26
|
* NodeType strings that correspond to plugins that can be conditionally
|
|
25
27
|
* removed from the bundle when unused.
|
|
26
28
|
*/
|
|
27
|
-
declare const PLUGIN_NODE_TYPES: readonly [typeof TRANSLATION, typeof ENUMERATION, typeof PLURAL, typeof CONDITION, typeof INSERTION, typeof GENDER, typeof SELECT, typeof NESTED, typeof FILE, typeof MARKDOWN, typeof HTML, typeof REACT_NODE, typeof PREACT_NODE, typeof SOLID_NODE];
|
|
28
|
-
type NodeType = typeof TRANSLATION | typeof ENUMERATION | typeof PLURAL | typeof CONDITION | typeof INSERTION | typeof FILE | typeof OBJECT | typeof ARRAY | typeof NESTED | typeof REACT_NODE | typeof PREACT_NODE | typeof SOLID_NODE | typeof MARKDOWN | typeof HTML | typeof TEXT | typeof NUMBER | typeof BOOLEAN | typeof GENDER | typeof SELECT | typeof NULL | typeof UNKNOWN;
|
|
29
|
+
export declare const PLUGIN_NODE_TYPES: readonly [typeof TRANSLATION, typeof ENUMERATION, typeof PLURAL, typeof CONDITION, typeof INSERTION, typeof GENDER, typeof SELECT, typeof NESTED, typeof FILE, typeof MARKDOWN, typeof HTML, typeof REACT_NODE, typeof PREACT_NODE, typeof SOLID_NODE];
|
|
30
|
+
export type NodeType = typeof TRANSLATION | typeof ENUMERATION | typeof PLURAL | typeof CONDITION | typeof INSERTION | typeof FILE | typeof OBJECT | typeof ARRAY | typeof NESTED | typeof REACT_NODE | typeof PREACT_NODE | typeof SOLID_NODE | typeof MARKDOWN | typeof HTML | typeof TEXT | typeof NUMBER | typeof BOOLEAN | typeof GENDER | typeof SELECT | typeof NULL | typeof UNKNOWN;
|
|
29
31
|
type AdditionalAttributesType = {
|
|
30
32
|
[key: string]: unknown;
|
|
31
33
|
};
|
|
32
|
-
type TypedNodeModel<T extends NodeType, Content, AdditionalAttributes extends AdditionalAttributesType = {}> = {
|
|
34
|
+
export type TypedNodeModel<T extends NodeType, Content, AdditionalAttributes extends AdditionalAttributesType = {}> = {
|
|
33
35
|
nodeType: T;
|
|
34
36
|
} & { [K in T]: Content; } & AdditionalAttributes;
|
|
35
|
-
declare const formatNodeType: <T extends NodeType, Content = unknown, AdditionalAttributes extends AdditionalAttributesType = {}>(nodeType: T, content: Content, additionalAttributes?: {
|
|
37
|
+
export declare const formatNodeType: <T extends NodeType, Content = unknown, AdditionalAttributes extends AdditionalAttributesType = {}>(nodeType: T, content: Content, additionalAttributes?: {
|
|
36
38
|
[key: string]: unknown;
|
|
37
39
|
}) => TypedNodeModel<T, Content, AdditionalAttributes>;
|
|
38
40
|
//#endregion
|
|
39
|
-
export {
|
|
41
|
+
export { nodeType_d_exports };
|
|
40
42
|
//# sourceMappingURL=nodeType.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeType.d.ts","names":[],"sources":["../../src/nodeType.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"nodeType.d.ts","names":[],"sources":["../../src/nodeType.ts"],"mappings":";;;qBAAa;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA;;;;;qBAMA,oCACJ,oBACA,oBACA,eACA,kBACA,kBACA,eACA,eACA,eACA,aACA,iBACA,aACA,mBACA,oBACA;YAkBG,kBACD,qBACA,qBACA,gBACA,mBACA,mBACA,cACA,gBACA,eACA,gBACA,oBACA,qBACA,oBACA,kBACA,cACA,cACA,gBACA,iBACA,gBACA,gBACA,cACA;KAEN;GAAA;;YAIO,eACV,UAAU,UACV,SACA,6BAA6B;EAE7B,UAAU;OAET,KAAK,IAAI,aACR;qBAES,iBACX,UAAU,UACV,mBACA,6BAA6B,+BAE7B,UAAU,GACV,SAAS,SACT;;MAMM,eAAe,GAAG,SAAS"}
|
package/dist/types/plugin.d.ts
CHANGED
|
@@ -13,15 +13,15 @@ interface PluginDictionary {
|
|
|
13
13
|
content: unknown;
|
|
14
14
|
filePath?: string;
|
|
15
15
|
}
|
|
16
|
-
type UnmergedDictionaryResult = {
|
|
16
|
+
export type UnmergedDictionaryResult = {
|
|
17
17
|
dictionaryPath: string;
|
|
18
18
|
dictionaries: PluginDictionary[];
|
|
19
19
|
};
|
|
20
|
-
type UnmergedDictionaryOutput = Record<string, UnmergedDictionaryResult>;
|
|
21
|
-
type MergedDictionaryResult = {
|
|
20
|
+
export type UnmergedDictionaryOutput = Record<string, UnmergedDictionaryResult>;
|
|
21
|
+
export type MergedDictionaryResult = {
|
|
22
22
|
dictionary: PluginDictionary;
|
|
23
23
|
};
|
|
24
|
-
type MergedDictionaryOutput = Record<string, MergedDictionaryResult>;
|
|
24
|
+
export type MergedDictionaryOutput = Record<string, MergedDictionaryResult>;
|
|
25
25
|
/**
|
|
26
26
|
* Extension points for Intlayer plugins.
|
|
27
27
|
*
|
|
@@ -29,7 +29,7 @@ type MergedDictionaryOutput = Record<string, MergedDictionaryResult>;
|
|
|
29
29
|
* - loadDictionaries: ingest external formats (e.g., ICU JSON) and convert to Intlayer `Dictionary[]`
|
|
30
30
|
* - afterBuild: transform/write back merged dictionaries to external formats/locations (e.g., write ICU JSON)
|
|
31
31
|
*/
|
|
32
|
-
type Plugin = {
|
|
32
|
+
export type Plugin = {
|
|
33
33
|
/**
|
|
34
34
|
* Name of the plugin
|
|
35
35
|
*/
|
|
@@ -65,5 +65,4 @@ type Plugin = {
|
|
|
65
65
|
}) => unknown;
|
|
66
66
|
};
|
|
67
67
|
//#endregion
|
|
68
|
-
export { MergedDictionaryOutput, MergedDictionaryResult, Plugin, UnmergedDictionaryOutput, UnmergedDictionaryResult };
|
|
69
68
|
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","names":[],"sources":["../../src/plugin.ts"],"mappings":";;;;;;;;UAQU;EACR;EACA,SAAS;EACT;EACA;EACA;;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","names":[],"sources":["../../src/plugin.ts"],"mappings":";;;;;;;;UAQU;EACR;EACA,SAAS;EACT;EACA;EACA;;YAGU;EACV;EACA,cAAc;;YAGJ,2BAA2B,eAAe;YAE1C;EACV,YAAY;;YAGF,yBAAyB,eAAe;;;;;;;;YASxC;;;;EAIV;;;;;;EAOA,oBAAoB;IAClB,eAAe;QACX,QAAQ,sBAAsB;;;;;;;EAQpC,cAAc;IACZ;MACE,sBAAsB;MACtB,oBAAoB;;IAEtB,eAAe;QACX;;;;;EAMN,gBAAgB;IACd,YAAY;IACZ,eAAe"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intlayer/types",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Retrieve Intlayer configurations and manage environment variables for both server-side and client-side environments.",
|
|
6
6
|
"keywords": [
|
|
@@ -141,14 +141,14 @@
|
|
|
141
141
|
"typecheck": "tsc --noEmit --project tsconfig.types.json"
|
|
142
142
|
},
|
|
143
143
|
"devDependencies": {
|
|
144
|
-
"@types/node": "26.
|
|
144
|
+
"@types/node": "26.5.0",
|
|
145
145
|
"@utils/ts-config": "1.0.4",
|
|
146
146
|
"@utils/ts-config-types": "1.0.4",
|
|
147
147
|
"@utils/tsdown-config": "1.0.4",
|
|
148
148
|
"rimraf": "6.1.3",
|
|
149
|
-
"tsdown": "0.
|
|
149
|
+
"tsdown": "0.23.0",
|
|
150
150
|
"typescript": "7.0.2",
|
|
151
|
-
"vitest": "
|
|
151
|
+
"vitest": "5.0.0",
|
|
152
152
|
"zod": "4.5.4"
|
|
153
153
|
},
|
|
154
154
|
"engines": {
|