@gabrielbourget/i18n-foundation 0.1.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 +159 -0
- package/dist/assets/index.d.ts +35 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +102 -0
- package/dist/common/index.d.ts +18 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +27 -0
- package/dist/core/client.d.ts +22 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +89 -0
- package/dist/core/configuration.d.ts +18 -0
- package/dist/core/configuration.d.ts.map +1 -0
- package/dist/core/configuration.js +36 -0
- package/dist/core/createIsolatedI18nInstance.d.ts +13 -0
- package/dist/core/createIsolatedI18nInstance.d.ts.map +1 -0
- package/dist/core/createIsolatedI18nInstance.js +16 -0
- package/dist/core/i18nStrictMode.d.ts +11 -0
- package/dist/core/i18nStrictMode.d.ts.map +1 -0
- package/dist/core/i18nStrictMode.js +19 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/initCommon.d.ts +15 -0
- package/dist/core/initCommon.d.ts.map +1 -0
- package/dist/core/initCommon.js +51 -0
- package/dist/core/resourceLoader.d.ts +9 -0
- package/dist/core/resourceLoader.d.ts.map +1 -0
- package/dist/core/resourceLoader.js +56 -0
- package/dist/core/server.d.ts +21 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +20 -0
- package/dist/core/types.d.ts +20 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +1 -0
- package/dist/env/client.d.ts +29 -0
- package/dist/env/client.d.ts.map +1 -0
- package/dist/env/client.js +42 -0
- package/dist/env/index.d.ts +4 -0
- package/dist/env/index.d.ts.map +1 -0
- package/dist/env/index.js +3 -0
- package/dist/env/server.d.ts +30 -0
- package/dist/env/server.d.ts.map +1 -0
- package/dist/env/server.js +45 -0
- package/dist/env/utils.d.ts +23 -0
- package/dist/env/utils.d.ts.map +1 -0
- package/dist/env/utils.js +65 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/manifest/index.d.ts +37 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +46 -0
- package/dist/pseudolocalization/index.d.ts +89 -0
- package/dist/pseudolocalization/index.d.ts.map +1 -0
- package/dist/pseudolocalization/index.js +182 -0
- package/dist/verifier/domainContracts.d.ts +43 -0
- package/dist/verifier/domainContracts.d.ts.map +1 -0
- package/dist/verifier/domainContracts.js +324 -0
- package/dist/verifier/fileSystem.d.ts +9 -0
- package/dist/verifier/fileSystem.d.ts.map +1 -0
- package/dist/verifier/fileSystem.js +42 -0
- package/dist/verifier/icuContracts.d.ts +13 -0
- package/dist/verifier/icuContracts.d.ts.map +1 -0
- package/dist/verifier/icuContracts.js +109 -0
- package/dist/verifier/index.d.ts +7 -0
- package/dist/verifier/index.d.ts.map +1 -0
- package/dist/verifier/index.js +6 -0
- package/dist/verifier/keyShape.d.ts +12 -0
- package/dist/verifier/keyShape.d.ts.map +1 -0
- package/dist/verifier/keyShape.js +73 -0
- package/dist/verifier/sheetOrdering.d.ts +2 -0
- package/dist/verifier/sheetOrdering.d.ts.map +1 -0
- package/dist/verifier/sheetOrdering.js +161 -0
- package/dist/verifier/verifyI18nSource.d.ts +25 -0
- package/dist/verifier/verifyI18nSource.d.ts.map +1 -0
- package/dist/verifier/verifyI18nSource.js +162 -0
- package/locales/en/common--carousel.json +30 -0
- package/locales/en/common--delete-entity-modal.json +15 -0
- package/locales/en/common--file-upload.json +88 -0
- package/locales/en/common--form-rules.json +12 -0
- package/locales/en/common--form-validation.json +19 -0
- package/locales/en/common--pagination.json +36 -0
- package/locales/en/common--saved-views.json +37 -0
- package/locales/en/common--searching.json +14 -0
- package/locales/en/common--sort-and-filter-panel.json +135 -0
- package/locales/en/common--theme.json +9 -0
- package/locales/en/common--ui.json +52 -0
- package/locales/fr/common--carousel.json +30 -0
- package/locales/fr/common--delete-entity-modal.json +15 -0
- package/locales/fr/common--file-upload.json +88 -0
- package/locales/fr/common--form-rules.json +12 -0
- package/locales/fr/common--form-validation.json +19 -0
- package/locales/fr/common--pagination.json +36 -0
- package/locales/fr/common--saved-views.json +37 -0
- package/locales/fr/common--searching.json +14 -0
- package/locales/fr/common--sort-and-filter-panel.json +135 -0
- package/locales/fr/common--theme.json +9 -0
- package/locales/fr/common--ui.json +52 -0
- package/package.json +103 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import ICU from "i18next-icu";
|
|
2
|
+
import resourcesToBackend from "i18next-resources-to-backend";
|
|
3
|
+
import { initReactI18next } from "react-i18next/initReactI18next";
|
|
4
|
+
import { createPseudolocalizationPostProcessor, } from "../pseudolocalization/index.js";
|
|
5
|
+
import { buildCoreConfig } from "./configuration.js";
|
|
6
|
+
import { createI18nResourceLoader } from "./resourceLoader.js";
|
|
7
|
+
const createResourceLoaderArgs = (runtimeConfig) => {
|
|
8
|
+
const args = { version: runtimeConfig.version };
|
|
9
|
+
if (runtimeConfig.assetBaseURL) {
|
|
10
|
+
args.assetBaseURL = runtimeConfig.assetBaseURL;
|
|
11
|
+
}
|
|
12
|
+
if (runtimeConfig.preferSameOrigin !== undefined) {
|
|
13
|
+
args.preferSameOrigin = runtimeConfig.preferSameOrigin;
|
|
14
|
+
}
|
|
15
|
+
if (runtimeConfig.fallbackToSameOriginOnError !== undefined) {
|
|
16
|
+
args.fallbackToSameOriginOnError = runtimeConfig.fallbackToSameOriginOnError;
|
|
17
|
+
}
|
|
18
|
+
return args;
|
|
19
|
+
};
|
|
20
|
+
const createPostProcessorOptions = (runtimeConfig) => {
|
|
21
|
+
const options = {};
|
|
22
|
+
if (runtimeConfig.pseudolocalizationCharacterSet) {
|
|
23
|
+
options.characterSet = runtimeConfig.pseudolocalizationCharacterSet;
|
|
24
|
+
}
|
|
25
|
+
if (runtimeConfig.pseudolocalizationPostProcessorName) {
|
|
26
|
+
options.name = runtimeConfig.pseudolocalizationPostProcessorName;
|
|
27
|
+
}
|
|
28
|
+
return options;
|
|
29
|
+
};
|
|
30
|
+
export const initI18nCommon = async ({ instance, locale, namespaces, registry, runtimeConfig, productionLike = false, installReactPlugin = true, environment, missingKeyWarnings, }) => {
|
|
31
|
+
const backend = resourcesToBackend(createI18nResourceLoader(createResourceLoaderArgs(runtimeConfig)));
|
|
32
|
+
if (installReactPlugin) {
|
|
33
|
+
instance.use(initReactI18next);
|
|
34
|
+
}
|
|
35
|
+
instance.use(ICU);
|
|
36
|
+
if (runtimeConfig.pseudolocalizationActive) {
|
|
37
|
+
instance.use(createPseudolocalizationPostProcessor(createPostProcessorOptions(runtimeConfig)));
|
|
38
|
+
}
|
|
39
|
+
await instance.use(backend).init(buildCoreConfig({
|
|
40
|
+
environment,
|
|
41
|
+
locale,
|
|
42
|
+
missingKeyWarnings,
|
|
43
|
+
namespaces,
|
|
44
|
+
productionLike,
|
|
45
|
+
pseudolocalizationActive: runtimeConfig.pseudolocalizationActive,
|
|
46
|
+
pseudolocalizationCharacterSet: runtimeConfig.pseudolocalizationCharacterSet,
|
|
47
|
+
pseudolocalizationPostProcessorName: runtimeConfig.pseudolocalizationPostProcessorName,
|
|
48
|
+
registry,
|
|
49
|
+
}));
|
|
50
|
+
return instance;
|
|
51
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Resource } from "i18next";
|
|
2
|
+
export type TCreateI18nResourceLoaderArgs = {
|
|
3
|
+
version: string;
|
|
4
|
+
preferSameOrigin?: boolean;
|
|
5
|
+
assetBaseURL?: string;
|
|
6
|
+
fallbackToSameOriginOnError?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const createI18nResourceLoader: ({ version, preferSameOrigin, assetBaseURL, fallbackToSameOriginOnError, }: TCreateI18nResourceLoaderArgs) => (locale: string, namespace: string) => Promise<Resource>;
|
|
9
|
+
//# sourceMappingURL=resourceLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceLoader.d.ts","sourceRoot":"","sources":["../../src/core/resourceLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2BAA2B,CAAC,EAAE,OAAO,CAAA;CACtC,CAAA;AA8BD,eAAO,MAAM,wBAAwB,GAClC,2EAKE,6BAA6B,MACzB,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,QAAQ,CAsC1D,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const stripTrailingSlashes = (value) => value.replace(/\/+$/, "");
|
|
2
|
+
const warnedFallbacks = new Set();
|
|
3
|
+
const formatError = (error) => {
|
|
4
|
+
if (error instanceof Error)
|
|
5
|
+
return error.message;
|
|
6
|
+
return String(error);
|
|
7
|
+
};
|
|
8
|
+
const fetchResourceJSON = async (url) => {
|
|
9
|
+
let response;
|
|
10
|
+
try {
|
|
11
|
+
response = await fetch(url, { cache: "no-store" });
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
throw new Error(`Network failure for ${url}: ${formatError(error)}`);
|
|
15
|
+
}
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`HTTP ${response.status} ${response.statusText} for ${url}`);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
return (await response.json());
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
throw new Error(`Invalid JSON for ${url}: ${formatError(error)}`);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
export const createI18nResourceLoader = ({ version, preferSameOrigin = false, assetBaseURL, fallbackToSameOriginOnError = true, }) => async (locale, namespace) => {
|
|
27
|
+
const path = `/i18n/${version}/${locale}/${namespace}.json`;
|
|
28
|
+
const useCDN = Boolean(assetBaseURL) && !preferSameOrigin;
|
|
29
|
+
if (!useCDN) {
|
|
30
|
+
return await fetchResourceJSON(path);
|
|
31
|
+
}
|
|
32
|
+
const cdnBase = stripTrailingSlashes(assetBaseURL);
|
|
33
|
+
const cdnURL = `${cdnBase}${path}`;
|
|
34
|
+
try {
|
|
35
|
+
return await fetchResourceJSON(cdnURL);
|
|
36
|
+
}
|
|
37
|
+
catch (cdnError) {
|
|
38
|
+
if (!fallbackToSameOriginOnError) {
|
|
39
|
+
throw new Error(`[i18n] CDN fetch failed for ${cdnURL}: ${formatError(cdnError)}`);
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const resource = await fetchResourceJSON(path);
|
|
43
|
+
const warnKey = `${version}:${locale}:${namespace}`;
|
|
44
|
+
if (!warnedFallbacks.has(warnKey)) {
|
|
45
|
+
warnedFallbacks.add(warnKey);
|
|
46
|
+
console.warn(`[i18n] CDN fetch failed; falling back to same-origin for version=${version}, locale=${locale}, ns=${namespace}.`);
|
|
47
|
+
}
|
|
48
|
+
return resource;
|
|
49
|
+
}
|
|
50
|
+
catch (originError) {
|
|
51
|
+
throw new Error(`[i18n] Translation load failed for version=${version}, locale=${locale}, ns=${namespace}. ` +
|
|
52
|
+
`CDN attempt (${cdnURL}) failed: ${formatError(cdnError)}. ` +
|
|
53
|
+
`Same-origin attempt (${path}) failed: ${formatError(originError)}.`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { i18n, TFunction } from "i18next";
|
|
2
|
+
import type { TI18nRegistry, TI18nRuntimeConfig } from "./types.js";
|
|
3
|
+
export type TGetServerTranslationArgs<Locale extends string, Namespace extends string> = {
|
|
4
|
+
locale: Locale;
|
|
5
|
+
namespaces?: readonly Namespace[] | undefined;
|
|
6
|
+
registry: TI18nRegistry<Locale, Namespace>;
|
|
7
|
+
runtimeConfig: TI18nRuntimeConfig;
|
|
8
|
+
productionLike?: boolean | undefined;
|
|
9
|
+
};
|
|
10
|
+
export type TServerTranslationResult = {
|
|
11
|
+
t: TFunction;
|
|
12
|
+
i18n: i18n;
|
|
13
|
+
};
|
|
14
|
+
export declare const getServerTranslation: <Locale extends string, Namespace extends string>({ locale, namespaces, registry, runtimeConfig, productionLike, }: TGetServerTranslationArgs<Locale, Namespace>) => Promise<TServerTranslationResult>;
|
|
15
|
+
export type TCreateServerTranslationGetterArgs<Locale extends string, Namespace extends string> = {
|
|
16
|
+
registry: TI18nRegistry<Locale, Namespace>;
|
|
17
|
+
getRuntimeConfig: () => TI18nRuntimeConfig;
|
|
18
|
+
productionLike?: boolean | undefined;
|
|
19
|
+
};
|
|
20
|
+
export declare const createServerTranslationGetter: <Locale extends string, Namespace extends string>({ registry, getRuntimeConfig, productionLike, }: TCreateServerTranslationGetterArgs<Locale, Namespace>) => (locale: Locale, namespaces?: readonly Namespace[]) => Promise<TServerTranslationResult>;
|
|
21
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEnE,MAAM,MAAM,yBAAyB,CAAC,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,IAAI;IACvF,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAA;IAC7C,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1C,aAAa,EAAE,kBAAkB,CAAA;IACjC,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,CAAC,EAAE,SAAS,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;CACX,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAU,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EAAE,kEAMzF,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,KAAG,OAAO,CAAC,wBAAwB,CAUjF,CAAA;AAED,MAAM,MAAM,kCAAkC,CAAC,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,IAAI;IAChG,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1C,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;IAC1C,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACrC,CAAA;AAED,eAAO,MAAM,6BAA6B,GAAI,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EAAE,iDAI5F,kCAAkC,CAAC,MAAM,EAAE,SAAS,CAAC,MACxC,QAAQ,MAAM,EAAE,aAAa,SAAS,SAAS,EAAE,KAAG,OAAO,CAAC,wBAAwB,CAQnG,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createIsolatedI18nInstance } from "./createIsolatedI18nInstance.js";
|
|
2
|
+
export const getServerTranslation = async ({ locale, namespaces, registry, runtimeConfig, productionLike = true, }) => {
|
|
3
|
+
const i18nInstance = await createIsolatedI18nInstance({
|
|
4
|
+
locale,
|
|
5
|
+
namespaces,
|
|
6
|
+
productionLike,
|
|
7
|
+
registry,
|
|
8
|
+
runtimeConfig,
|
|
9
|
+
});
|
|
10
|
+
return { t: i18nInstance.getFixedT(locale), i18n: i18nInstance };
|
|
11
|
+
};
|
|
12
|
+
export const createServerTranslationGetter = ({ registry, getRuntimeConfig, productionLike = true, }) => {
|
|
13
|
+
return async (locale, namespaces) => getServerTranslation({
|
|
14
|
+
locale,
|
|
15
|
+
namespaces,
|
|
16
|
+
productionLike,
|
|
17
|
+
registry,
|
|
18
|
+
runtimeConfig: getRuntimeConfig(),
|
|
19
|
+
});
|
|
20
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { TPseudolocalizationCharacterSet } from "../pseudolocalization/index.js";
|
|
3
|
+
export type TI18nRegistry<Locale extends string = string, Namespace extends string = string> = {
|
|
4
|
+
defaultLocale: Locale;
|
|
5
|
+
availableLocales: readonly Locale[];
|
|
6
|
+
availableNamespaces: readonly Namespace[];
|
|
7
|
+
initialLoadNamespaces: readonly Namespace[];
|
|
8
|
+
defaultNamespace?: Namespace | undefined;
|
|
9
|
+
};
|
|
10
|
+
export type TI18nRuntimeConfig = {
|
|
11
|
+
version: string;
|
|
12
|
+
assetBaseURL?: string | undefined;
|
|
13
|
+
preferSameOrigin?: boolean | undefined;
|
|
14
|
+
fallbackToSameOriginOnError?: boolean | undefined;
|
|
15
|
+
pseudolocalizationActive?: boolean | undefined;
|
|
16
|
+
pseudolocalizationCharacterSet?: TPseudolocalizationCharacterSet | undefined;
|
|
17
|
+
pseudolocalizationPostProcessorName?: string | undefined;
|
|
18
|
+
};
|
|
19
|
+
export type TI18nProviderFallback = ReactNode;
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAA;AAErF,MAAM,MAAM,aAAa,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG,MAAM,IAAI;IAC7F,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,mBAAmB,EAAE,SAAS,SAAS,EAAE,CAAA;IACzC,qBAAqB,EAAE,SAAS,SAAS,EAAE,CAAA;IAC3C,gBAAgB,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACtC,2BAA2B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACjD,wBAAwB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC9C,8BAA8B,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAA;IAC5E,mCAAmC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACzD,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,SAAS,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TI18nRuntimeConfig } from "../core/types.js";
|
|
2
|
+
import type { TPseudolocalizationCharacterSet } from "../pseudolocalization/index.js";
|
|
3
|
+
import { type TI18nEnvParserConfig, type TI18nEnvSource, type TPseudolocalizationActiveEnvValue } from "./utils.js";
|
|
4
|
+
export declare const AVAILABLE_I18N_CLIENT_ENV_VARS: readonly ["NEXT_PUBLIC_AVAILABLE_LOCALES", "NEXT_PUBLIC_DEFAULT_LOCALE", "NEXT_PUBLIC_I18N_VERSION", "NEXT_PUBLIC_I18N_CDN_BASE_URL", "NEXT_PUBLIC_PSEUDOLOCALIZATION_ACTIVE", "NEXT_PUBLIC_PSEUDOLOCALIZATION_CHARACTER_SET"];
|
|
5
|
+
export type TI18nClientEnvKey = (typeof AVAILABLE_I18N_CLIENT_ENV_VARS)[number];
|
|
6
|
+
export type TI18nClientEnv<Locale extends string = string> = {
|
|
7
|
+
NEXT_PUBLIC_AVAILABLE_LOCALES?: string | undefined;
|
|
8
|
+
NEXT_PUBLIC_DEFAULT_LOCALE: Locale;
|
|
9
|
+
NEXT_PUBLIC_I18N_VERSION: string;
|
|
10
|
+
NEXT_PUBLIC_I18N_CDN_BASE_URL?: string | undefined;
|
|
11
|
+
NEXT_PUBLIC_PSEUDOLOCALIZATION_ACTIVE: TPseudolocalizationActiveEnvValue;
|
|
12
|
+
NEXT_PUBLIC_PSEUDOLOCALIZATION_CHARACTER_SET: TPseudolocalizationCharacterSet;
|
|
13
|
+
AVAILABLE_LOCALE_LIST: readonly Locale[];
|
|
14
|
+
};
|
|
15
|
+
export type TParseI18nClientEnvArgs<Locale extends string> = {
|
|
16
|
+
source: TI18nEnvSource;
|
|
17
|
+
config: TI18nEnvParserConfig<Locale>;
|
|
18
|
+
};
|
|
19
|
+
export type TCreateI18nClientEnvReaderArgs<Locale extends string> = {
|
|
20
|
+
config: TI18nEnvParserConfig<Locale>;
|
|
21
|
+
source?: (() => TI18nEnvSource) | undefined;
|
|
22
|
+
};
|
|
23
|
+
export declare const parseI18nClientEnv: <Locale extends string>({ source, config, }: TParseI18nClientEnvArgs<Locale>) => TI18nClientEnv<Locale>;
|
|
24
|
+
export declare const buildClientRuntimeConfig: <Locale extends string>(env: TI18nClientEnv<Locale>) => TI18nRuntimeConfig;
|
|
25
|
+
export declare const createI18nClientEnvReader: <Locale extends string>({ config, source, }: TCreateI18nClientEnvReaderArgs<Locale>) => {
|
|
26
|
+
get: () => TI18nClientEnv<Locale>;
|
|
27
|
+
resetForTests: () => void;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/env/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAA;AAErF,OAAO,EAQL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iCAAiC,EACvC,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,8BAA8B,gOAOjC,CAAA;AAEV,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/E,MAAM,MAAM,cAAc,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;IAC3D,6BAA6B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAClD,0BAA0B,EAAE,MAAM,CAAA;IAClC,wBAAwB,EAAE,MAAM,CAAA;IAChC,6BAA6B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAClD,qCAAqC,EAAE,iCAAiC,CAAA;IACxE,4CAA4C,EAAE,+BAA+B,CAAA;IAC7E,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,uBAAuB,CAAC,MAAM,SAAS,MAAM,IAAI;IAC3D,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,8BAA8B,CAAC,MAAM,SAAS,MAAM,IAAI;IAClE,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,CAAC,EAAE,CAAC,MAAM,cAAc,CAAC,GAAG,SAAS,CAAA;CAC5C,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,SAAS,MAAM,EAAE,qBAGvD,uBAAuB,CAAC,MAAM,CAAC,KAAG,cAAc,CAAC,MAAM,CAmBzD,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,MAAM,SAAS,MAAM,EAAE,KAAK,cAAc,CAAC,MAAM,CAAC,KAAG,kBAM1F,CAAA;AAEJ,eAAO,MAAM,yBAAyB,GAAI,MAAM,SAAS,MAAM,EAAE,qBAG9D,8BAA8B,CAAC,MAAM,CAAC;eAI5B,cAAc,CAAC,MAAM,CAAC;yBAMZ,IAAI;CAI1B,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { buildRuntimeConfigFromEnvValues, parseAssetBaseURL, parseAvailableLocaleList, parseDefaultLocale, parseI18nVersion, parsePseudolocalizationActive, parsePseudolocalizationCharacterSet, } from "./utils.js";
|
|
2
|
+
export const AVAILABLE_I18N_CLIENT_ENV_VARS = [
|
|
3
|
+
"NEXT_PUBLIC_AVAILABLE_LOCALES",
|
|
4
|
+
"NEXT_PUBLIC_DEFAULT_LOCALE",
|
|
5
|
+
"NEXT_PUBLIC_I18N_VERSION",
|
|
6
|
+
"NEXT_PUBLIC_I18N_CDN_BASE_URL",
|
|
7
|
+
"NEXT_PUBLIC_PSEUDOLOCALIZATION_ACTIVE",
|
|
8
|
+
"NEXT_PUBLIC_PSEUDOLOCALIZATION_CHARACTER_SET",
|
|
9
|
+
];
|
|
10
|
+
export const parseI18nClientEnv = ({ source, config, }) => {
|
|
11
|
+
const availableLocales = source.NEXT_PUBLIC_AVAILABLE_LOCALES;
|
|
12
|
+
const cdnBaseURL = parseAssetBaseURL(source.NEXT_PUBLIC_I18N_CDN_BASE_URL, "NEXT_PUBLIC_I18N_CDN_BASE_URL");
|
|
13
|
+
return {
|
|
14
|
+
AVAILABLE_LOCALE_LIST: parseAvailableLocaleList(availableLocales, config),
|
|
15
|
+
NEXT_PUBLIC_AVAILABLE_LOCALES: availableLocales,
|
|
16
|
+
NEXT_PUBLIC_DEFAULT_LOCALE: parseDefaultLocale(source.NEXT_PUBLIC_DEFAULT_LOCALE, config),
|
|
17
|
+
NEXT_PUBLIC_I18N_CDN_BASE_URL: cdnBaseURL,
|
|
18
|
+
NEXT_PUBLIC_I18N_VERSION: parseI18nVersion(source.NEXT_PUBLIC_I18N_VERSION, config),
|
|
19
|
+
NEXT_PUBLIC_PSEUDOLOCALIZATION_ACTIVE: parsePseudolocalizationActive(source.NEXT_PUBLIC_PSEUDOLOCALIZATION_ACTIVE, "NEXT_PUBLIC_PSEUDOLOCALIZATION_ACTIVE"),
|
|
20
|
+
NEXT_PUBLIC_PSEUDOLOCALIZATION_CHARACTER_SET: parsePseudolocalizationCharacterSet(source.NEXT_PUBLIC_PSEUDOLOCALIZATION_CHARACTER_SET, "NEXT_PUBLIC_PSEUDOLOCALIZATION_CHARACTER_SET"),
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export const buildClientRuntimeConfig = (env) => buildRuntimeConfigFromEnvValues({
|
|
24
|
+
assetBaseURL: env.NEXT_PUBLIC_I18N_CDN_BASE_URL,
|
|
25
|
+
pseudolocalizationActive: env.NEXT_PUBLIC_PSEUDOLOCALIZATION_ACTIVE,
|
|
26
|
+
pseudolocalizationCharacterSet: env.NEXT_PUBLIC_PSEUDOLOCALIZATION_CHARACTER_SET,
|
|
27
|
+
version: env.NEXT_PUBLIC_I18N_VERSION,
|
|
28
|
+
});
|
|
29
|
+
export const createI18nClientEnvReader = ({ config, source = () => process.env, }) => {
|
|
30
|
+
let cached = null;
|
|
31
|
+
return {
|
|
32
|
+
get: () => {
|
|
33
|
+
if (cached)
|
|
34
|
+
return cached;
|
|
35
|
+
cached = parseI18nClientEnv({ config, source: source() });
|
|
36
|
+
return cached;
|
|
37
|
+
},
|
|
38
|
+
resetForTests: () => {
|
|
39
|
+
cached = null;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/env/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TI18nRuntimeConfig } from "../core/types.js";
|
|
2
|
+
import type { TPseudolocalizationCharacterSet } from "../pseudolocalization/index.js";
|
|
3
|
+
import { type TI18nEnvParserConfig, type TI18nEnvSource, type TPseudolocalizationActiveEnvValue } from "./utils.js";
|
|
4
|
+
export declare const AVAILABLE_I18N_SERVER_ENV_VARS: readonly ["AVAILABLE_LOCALES", "DEFAULT_LOCALE", "I18N_VERSION", "I18N_CDN_BASE_URL", "PSEUDOLOCALIZATION_ACTIVE", "PSEUDOLOCALIZATION_CHARACTER_SET"];
|
|
5
|
+
export type TI18nServerEnvKey = (typeof AVAILABLE_I18N_SERVER_ENV_VARS)[number];
|
|
6
|
+
export type TI18nServerEnv<Locale extends string = string> = {
|
|
7
|
+
AVAILABLE_LOCALES?: string | undefined;
|
|
8
|
+
DEFAULT_LOCALE: Locale;
|
|
9
|
+
I18N_VERSION: string;
|
|
10
|
+
I18N_CDN_BASE_URL?: string | undefined;
|
|
11
|
+
PSEUDOLOCALIZATION_ACTIVE: TPseudolocalizationActiveEnvValue;
|
|
12
|
+
PSEUDOLOCALIZATION_CHARACTER_SET: TPseudolocalizationCharacterSet;
|
|
13
|
+
AVAILABLE_LOCALE_LIST: readonly Locale[];
|
|
14
|
+
};
|
|
15
|
+
export type TParseI18nServerEnvArgs<Locale extends string> = {
|
|
16
|
+
source: TI18nEnvSource;
|
|
17
|
+
config: TI18nEnvParserConfig<Locale>;
|
|
18
|
+
};
|
|
19
|
+
export type TCreateI18nServerEnvReaderArgs<Locale extends string> = {
|
|
20
|
+
config: TI18nEnvParserConfig<Locale>;
|
|
21
|
+
source?: (() => TI18nEnvSource) | undefined;
|
|
22
|
+
clientImportErrorMessage?: string | undefined;
|
|
23
|
+
};
|
|
24
|
+
export declare const parseI18nServerEnv: <Locale extends string>({ source, config, }: TParseI18nServerEnvArgs<Locale>) => TI18nServerEnv<Locale>;
|
|
25
|
+
export declare const buildServerRuntimeConfig: <Locale extends string>(env: TI18nServerEnv<Locale>) => TI18nRuntimeConfig;
|
|
26
|
+
export declare const createI18nServerEnvReader: <Locale extends string>({ config, source, clientImportErrorMessage, }: TCreateI18nServerEnvReaderArgs<Locale>) => {
|
|
27
|
+
get: () => TI18nServerEnv<Locale>;
|
|
28
|
+
resetForTests: () => void;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/env/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAA;AAErF,OAAO,EAQL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iCAAiC,EACvC,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,8BAA8B,wJAOjC,CAAA;AAEV,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/E,MAAM,MAAM,cAAc,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;IAC3D,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,yBAAyB,EAAE,iCAAiC,CAAA;IAC5D,gCAAgC,EAAE,+BAA+B,CAAA;IACjE,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,uBAAuB,CAAC,MAAM,SAAS,MAAM,IAAI;IAC3D,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,8BAA8B,CAAC,MAAM,SAAS,MAAM,IAAI;IAClE,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,CAAC,EAAE,CAAC,MAAM,cAAc,CAAC,GAAG,SAAS,CAAA;IAC3C,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9C,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,SAAS,MAAM,EAAE,qBAGvD,uBAAuB,CAAC,MAAM,CAAC,KAAG,cAAc,CAAC,MAAM,CAmBzD,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,MAAM,SAAS,MAAM,EAAE,KAAK,cAAc,CAAC,MAAM,CAAC,KAAG,kBAM1F,CAAA;AAEJ,eAAO,MAAM,yBAAyB,GAAI,MAAM,SAAS,MAAM,EAAE,+CAI9D,8BAA8B,CAAC,MAAM,CAAC;eAI5B,cAAc,CAAC,MAAM,CAAC;yBAUZ,IAAI;CAI1B,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { buildRuntimeConfigFromEnvValues, parseAssetBaseURL, parseAvailableLocaleList, parseDefaultLocale, parseI18nVersion, parsePseudolocalizationActive, parsePseudolocalizationCharacterSet, } from "./utils.js";
|
|
2
|
+
export const AVAILABLE_I18N_SERVER_ENV_VARS = [
|
|
3
|
+
"AVAILABLE_LOCALES",
|
|
4
|
+
"DEFAULT_LOCALE",
|
|
5
|
+
"I18N_VERSION",
|
|
6
|
+
"I18N_CDN_BASE_URL",
|
|
7
|
+
"PSEUDOLOCALIZATION_ACTIVE",
|
|
8
|
+
"PSEUDOLOCALIZATION_CHARACTER_SET",
|
|
9
|
+
];
|
|
10
|
+
export const parseI18nServerEnv = ({ source, config, }) => {
|
|
11
|
+
const availableLocales = source.AVAILABLE_LOCALES;
|
|
12
|
+
const cdnBaseURL = parseAssetBaseURL(source.I18N_CDN_BASE_URL, "I18N_CDN_BASE_URL");
|
|
13
|
+
return {
|
|
14
|
+
AVAILABLE_LOCALE_LIST: parseAvailableLocaleList(availableLocales, config),
|
|
15
|
+
AVAILABLE_LOCALES: availableLocales,
|
|
16
|
+
DEFAULT_LOCALE: parseDefaultLocale(source.DEFAULT_LOCALE, config),
|
|
17
|
+
I18N_CDN_BASE_URL: cdnBaseURL,
|
|
18
|
+
I18N_VERSION: parseI18nVersion(source.I18N_VERSION, config),
|
|
19
|
+
PSEUDOLOCALIZATION_ACTIVE: parsePseudolocalizationActive(source.PSEUDOLOCALIZATION_ACTIVE, "PSEUDOLOCALIZATION_ACTIVE"),
|
|
20
|
+
PSEUDOLOCALIZATION_CHARACTER_SET: parsePseudolocalizationCharacterSet(source.PSEUDOLOCALIZATION_CHARACTER_SET, "PSEUDOLOCALIZATION_CHARACTER_SET"),
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export const buildServerRuntimeConfig = (env) => buildRuntimeConfigFromEnvValues({
|
|
24
|
+
assetBaseURL: env.I18N_CDN_BASE_URL,
|
|
25
|
+
pseudolocalizationActive: env.PSEUDOLOCALIZATION_ACTIVE,
|
|
26
|
+
pseudolocalizationCharacterSet: env.PSEUDOLOCALIZATION_CHARACTER_SET,
|
|
27
|
+
version: env.I18N_VERSION,
|
|
28
|
+
});
|
|
29
|
+
export const createI18nServerEnvReader = ({ config, source = () => process.env, clientImportErrorMessage = "[i18n server env] Imported in a client/browser context. Use the client env reader instead.", }) => {
|
|
30
|
+
let cached = null;
|
|
31
|
+
return {
|
|
32
|
+
get: () => {
|
|
33
|
+
if (typeof window !== "undefined") {
|
|
34
|
+
throw new Error(clientImportErrorMessage);
|
|
35
|
+
}
|
|
36
|
+
if (cached)
|
|
37
|
+
return cached;
|
|
38
|
+
cached = parseI18nServerEnv({ config, source: source() });
|
|
39
|
+
return cached;
|
|
40
|
+
},
|
|
41
|
+
resetForTests: () => {
|
|
42
|
+
cached = null;
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { TI18nRuntimeConfig } from "../core/types.js";
|
|
2
|
+
import { type TPseudolocalizationCharacterSet } from "../pseudolocalization/index.js";
|
|
3
|
+
export type TI18nEnvSource = Record<string, string | undefined>;
|
|
4
|
+
export type TI18nEnvParserConfig<Locale extends string = string> = {
|
|
5
|
+
declaredLocales: readonly Locale[];
|
|
6
|
+
defaultLocale: Locale;
|
|
7
|
+
i18nVersion: string;
|
|
8
|
+
};
|
|
9
|
+
export type TPseudolocalizationActiveEnvValue = "true" | "false";
|
|
10
|
+
export declare const isDeclaredLocaleValue: <Locale extends string>(value: string, config: TI18nEnvParserConfig<Locale>) => value is Locale;
|
|
11
|
+
export declare const parseAvailableLocaleList: <Locale extends string>(rawValue: string | undefined, config: TI18nEnvParserConfig<Locale>) => readonly Locale[];
|
|
12
|
+
export declare const parseDefaultLocale: <Locale extends string>(rawValue: string | undefined, config: TI18nEnvParserConfig<Locale>) => Locale;
|
|
13
|
+
export declare const parseI18nVersion: <Locale extends string>(rawValue: string | undefined, config: TI18nEnvParserConfig<Locale>) => string;
|
|
14
|
+
export declare const parseAssetBaseURL: (rawValue: string | undefined, envKey: string) => string | undefined;
|
|
15
|
+
export declare const parsePseudolocalizationActive: (rawValue: string | undefined, envKey: string) => TPseudolocalizationActiveEnvValue;
|
|
16
|
+
export declare const parsePseudolocalizationCharacterSet: (rawValue: string | undefined, envKey: string) => TPseudolocalizationCharacterSet;
|
|
17
|
+
export declare const buildRuntimeConfigFromEnvValues: ({ version, assetBaseURL, pseudolocalizationActive, pseudolocalizationCharacterSet, }: {
|
|
18
|
+
version: string;
|
|
19
|
+
assetBaseURL?: string | undefined;
|
|
20
|
+
pseudolocalizationActive: TPseudolocalizationActiveEnvValue;
|
|
21
|
+
pseudolocalizationCharacterSet: TPseudolocalizationCharacterSet;
|
|
22
|
+
}) => TI18nRuntimeConfig;
|
|
23
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/env/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAGL,KAAK,+BAA+B,EACrC,MAAM,gCAAgC,CAAA;AAEvC,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;AAE/D,MAAM,MAAM,oBAAoB,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;IACjE,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iCAAiC,GAAG,MAAM,GAAG,OAAO,CAAA;AAIhE,eAAO,MAAM,qBAAqB,GAAI,MAAM,SAAS,MAAM,EACzD,OAAO,MAAM,EACb,QAAQ,oBAAoB,CAAC,MAAM,CAAC,KACnC,KAAK,IAAI,MAA0D,CAAA;AAEtE,eAAO,MAAM,wBAAwB,GAAI,MAAM,SAAS,MAAM,EAC5D,UAAU,MAAM,GAAG,SAAS,EAC5B,QAAQ,oBAAoB,CAAC,MAAM,CAAC,KACnC,SAAS,MAAM,EAWjB,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,SAAS,MAAM,EACtD,UAAU,MAAM,GAAG,SAAS,EAC5B,QAAQ,oBAAoB,CAAC,MAAM,CAAC,KACnC,MAIF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,MAAM,EACpD,UAAU,MAAM,GAAG,SAAS,EAC5B,QAAQ,oBAAoB,CAAC,MAAM,CAAC,KACnC,MAIF,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,GAAG,SAAS,EAAE,QAAQ,MAAM,KAAG,MAAM,GAAG,SAkBzF,CAAA;AAED,eAAO,MAAM,6BAA6B,GACxC,UAAU,MAAM,GAAG,SAAS,EAC5B,QAAQ,MAAM,KACb,iCAOF,CAAA;AAED,eAAO,MAAM,mCAAmC,GAC9C,UAAU,MAAM,GAAG,SAAS,EAC5B,QAAQ,MAAM,KACb,+BASF,CAAA;AAED,eAAO,MAAM,+BAA+B,GAAI,sFAK7C;IACD,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,wBAAwB,EAAE,iCAAiC,CAAA;IAC3D,8BAA8B,EAAE,+BAA+B,CAAA;CAChE,KAAG,kBAYH,CAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { DEFAULT_PSEUDOLOCALIZATION_CHARACTER_SET, PSEUDOLOCALIZATION_CHARACTER_SETS, } from "../pseudolocalization/index.js";
|
|
2
|
+
const normalizeLocale = (value) => value.trim().toLowerCase();
|
|
3
|
+
export const isDeclaredLocaleValue = (value, config) => config.declaredLocales.includes(value);
|
|
4
|
+
export const parseAvailableLocaleList = (rawValue, config) => {
|
|
5
|
+
if (!rawValue?.trim())
|
|
6
|
+
return config.declaredLocales;
|
|
7
|
+
const requestedLocales = rawValue
|
|
8
|
+
.split(",")
|
|
9
|
+
.map((value) => normalizeLocale(value))
|
|
10
|
+
.filter((value) => value.length > 0);
|
|
11
|
+
const validatedLocales = requestedLocales.filter((value) => isDeclaredLocaleValue(value, config));
|
|
12
|
+
return validatedLocales.length > 0 ? validatedLocales : config.declaredLocales;
|
|
13
|
+
};
|
|
14
|
+
export const parseDefaultLocale = (rawValue, config) => {
|
|
15
|
+
const normalizedValue = rawValue ? normalizeLocale(rawValue) : undefined;
|
|
16
|
+
return normalizedValue && isDeclaredLocaleValue(normalizedValue, config) ? normalizedValue : config.defaultLocale;
|
|
17
|
+
};
|
|
18
|
+
export const parseI18nVersion = (rawValue, config) => {
|
|
19
|
+
const normalizedValue = rawValue?.trim();
|
|
20
|
+
return normalizedValue && normalizedValue.length > 0 ? normalizedValue : config.i18nVersion;
|
|
21
|
+
};
|
|
22
|
+
export const parseAssetBaseURL = (rawValue, envKey) => {
|
|
23
|
+
const normalizedValue = rawValue?.trim().replace(/\/+$/, "");
|
|
24
|
+
if (!normalizedValue)
|
|
25
|
+
return undefined;
|
|
26
|
+
let url;
|
|
27
|
+
try {
|
|
28
|
+
url = new URL(normalizedValue);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new Error(`[i18n env] ${envKey} must be an absolute HTTP(S) URL.`);
|
|
32
|
+
}
|
|
33
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
34
|
+
throw new Error(`[i18n env] ${envKey} must use the http: or https: protocol.`);
|
|
35
|
+
}
|
|
36
|
+
return normalizedValue;
|
|
37
|
+
};
|
|
38
|
+
export const parsePseudolocalizationActive = (rawValue, envKey) => {
|
|
39
|
+
const normalizedValue = rawValue?.trim().toLowerCase();
|
|
40
|
+
if (!normalizedValue)
|
|
41
|
+
return "false";
|
|
42
|
+
if (normalizedValue === "true" || normalizedValue === "false")
|
|
43
|
+
return normalizedValue;
|
|
44
|
+
throw new Error(`[i18n env] ${envKey} must be "true" or "false".`);
|
|
45
|
+
};
|
|
46
|
+
export const parsePseudolocalizationCharacterSet = (rawValue, envKey) => {
|
|
47
|
+
const normalizedValue = rawValue?.trim().toLowerCase();
|
|
48
|
+
if (!normalizedValue)
|
|
49
|
+
return DEFAULT_PSEUDOLOCALIZATION_CHARACTER_SET;
|
|
50
|
+
if (PSEUDOLOCALIZATION_CHARACTER_SETS.includes(normalizedValue)) {
|
|
51
|
+
return normalizedValue;
|
|
52
|
+
}
|
|
53
|
+
throw new Error(`[i18n env] ${envKey} must be one of: ${PSEUDOLOCALIZATION_CHARACTER_SETS.join(", ")}.`);
|
|
54
|
+
};
|
|
55
|
+
export const buildRuntimeConfigFromEnvValues = ({ version, assetBaseURL, pseudolocalizationActive, pseudolocalizationCharacterSet, }) => {
|
|
56
|
+
const runtimeConfig = {
|
|
57
|
+
pseudolocalizationActive: pseudolocalizationActive === "true",
|
|
58
|
+
pseudolocalizationCharacterSet,
|
|
59
|
+
version,
|
|
60
|
+
};
|
|
61
|
+
if (assetBaseURL) {
|
|
62
|
+
runtimeConfig.assetBaseURL = assetBaseURL;
|
|
63
|
+
}
|
|
64
|
+
return runtimeConfig;
|
|
65
|
+
};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,+BAA+B,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare const I18N_ASSET_BASE_PATH: "/i18n";
|
|
2
|
+
export type TI18nManifest<Locale extends string = string, Namespace extends string = string> = {
|
|
3
|
+
defaultLocale: Locale;
|
|
4
|
+
locales: readonly Locale[];
|
|
5
|
+
namespaces: readonly Namespace[];
|
|
6
|
+
version: string;
|
|
7
|
+
};
|
|
8
|
+
export type TBuildI18nManifestArgs<Locale extends string, Namespace extends string> = {
|
|
9
|
+
defaultLocale: Locale;
|
|
10
|
+
locales: readonly Locale[];
|
|
11
|
+
namespaces: readonly Namespace[];
|
|
12
|
+
version: string;
|
|
13
|
+
};
|
|
14
|
+
export type TBuildI18nResourcePathArgs<Locale extends string = string, Namespace extends string = string> = {
|
|
15
|
+
locale: Locale;
|
|
16
|
+
namespace: Namespace;
|
|
17
|
+
version: string;
|
|
18
|
+
assetBasePath?: string | undefined;
|
|
19
|
+
};
|
|
20
|
+
export type TBuildI18nManifestPathArgs = {
|
|
21
|
+
version: string;
|
|
22
|
+
assetBasePath?: string | undefined;
|
|
23
|
+
};
|
|
24
|
+
export type TValidateDevManifestArgs<Locale extends string = string, Namespace extends string = string> = {
|
|
25
|
+
version: string;
|
|
26
|
+
expectedLocales: readonly Locale[];
|
|
27
|
+
expectedNamespaces: readonly Namespace[];
|
|
28
|
+
environment?: string | undefined;
|
|
29
|
+
developmentEnvironmentName?: string | undefined;
|
|
30
|
+
fetcher?: typeof fetch | undefined;
|
|
31
|
+
manifestPath?: string | undefined;
|
|
32
|
+
};
|
|
33
|
+
export declare const buildI18nManifest: <Locale extends string, Namespace extends string>({ defaultLocale, locales, namespaces, version, }: TBuildI18nManifestArgs<Locale, Namespace>) => TI18nManifest<Locale, Namespace>;
|
|
34
|
+
export declare const buildI18nManifestPath: ({ assetBasePath, version, }: TBuildI18nManifestPathArgs) => string;
|
|
35
|
+
export declare const buildI18nResourcePath: <Locale extends string, Namespace extends string>({ assetBasePath, locale, namespace, version, }: TBuildI18nResourcePathArgs<Locale, Namespace>) => string;
|
|
36
|
+
export declare const validateDevManifest: <Locale extends string, Namespace extends string>({ version, expectedLocales, expectedNamespaces, environment, developmentEnvironmentName, fetcher, manifestPath, }: TValidateDevManifestArgs<Locale, Namespace>) => Promise<void>;
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,EAAG,OAAgB,CAAA;AAEpD,MAAM,MAAM,aAAa,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG,MAAM,IAAI;IAC7F,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,UAAU,EAAE,SAAS,SAAS,EAAE,CAAA;IAChC,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,IAAI;IACpF,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,UAAU,EAAE,SAAS,SAAS,EAAE,CAAA;IAChC,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,0BAA0B,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG,MAAM,IAAI;IAC1G,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,wBAAwB,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG,MAAM,IAAI;IACxG,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,kBAAkB,EAAE,SAAS,SAAS,EAAE,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,0BAA0B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/C,OAAO,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAA;IAClC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAClC,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EAAE,kDAKhF,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,KAAG,aAAa,CAAC,MAAM,EAAE,SAAS,CAK5E,CAAA;AAEF,eAAO,MAAM,qBAAqB,GAAI,6BAGnC,0BAA0B,KAAG,MAE/B,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EAAE,gDAKpF,0BAA0B,CAAC,MAAM,EAAE,SAAS,CAAC,KAAG,MAElD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAU,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,EAAE,mHAQxF,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,KAAG,OAAO,CAAC,IAAI,CAuC5D,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export const I18N_ASSET_BASE_PATH = "/i18n";
|
|
2
|
+
export const buildI18nManifest = ({ defaultLocale, locales, namespaces, version, }) => ({
|
|
3
|
+
defaultLocale,
|
|
4
|
+
locales,
|
|
5
|
+
namespaces,
|
|
6
|
+
version,
|
|
7
|
+
});
|
|
8
|
+
export const buildI18nManifestPath = ({ assetBasePath = I18N_ASSET_BASE_PATH, version, }) => {
|
|
9
|
+
return `${assetBasePath}/${version}/manifest.json`;
|
|
10
|
+
};
|
|
11
|
+
export const buildI18nResourcePath = ({ assetBasePath = I18N_ASSET_BASE_PATH, locale, namespace, version, }) => {
|
|
12
|
+
return `${assetBasePath}/${version}/${locale}/${namespace}.json`;
|
|
13
|
+
};
|
|
14
|
+
export const validateDevManifest = async ({ version, expectedLocales, expectedNamespaces, environment = process.env.NODE_ENV, developmentEnvironmentName = "development", fetcher = fetch, manifestPath, }) => {
|
|
15
|
+
if (environment !== developmentEnvironmentName)
|
|
16
|
+
return;
|
|
17
|
+
if (!version) {
|
|
18
|
+
console.warn("[i18n] I18N_VERSION is not set; skipping dev manifest validation.");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const url = manifestPath ?? buildI18nManifestPath({ version });
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetcher(url, { cache: "no-store" });
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
console.warn(`[i18n] dev manifest fetch failed (${response.status}) for ${url}`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const manifest = (await response.json());
|
|
29
|
+
if (manifest.version !== version) {
|
|
30
|
+
console.warn(`[i18n] dev manifest version mismatch: env=${version} manifest=${manifest.version}`);
|
|
31
|
+
}
|
|
32
|
+
const manifestLocales = new Set(manifest.locales);
|
|
33
|
+
const manifestNamespaces = new Set(manifest.namespaces);
|
|
34
|
+
const missingLocales = expectedLocales.filter((locale) => !manifestLocales.has(locale));
|
|
35
|
+
const missingNamespaces = expectedNamespaces.filter((namespace) => !manifestNamespaces.has(namespace));
|
|
36
|
+
if (missingLocales.length > 0) {
|
|
37
|
+
console.warn(`[i18n] locales missing on disk: ${missingLocales.join(", ")}`);
|
|
38
|
+
}
|
|
39
|
+
if (missingNamespaces.length > 0) {
|
|
40
|
+
console.warn(`[i18n] namespaces missing on disk: ${missingNamespaces.join(", ")}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.warn(`[i18n] An error was encountered during a development i18n manifest validation -> ${error}`);
|
|
45
|
+
}
|
|
46
|
+
};
|