30 lines
1.2 KiB
JavaScript
30 lines
1.2 KiB
JavaScript
const LOCALE_CODE_PATTERN = /^[a-z]{2,3}(-[A-Z]{2})?$/;
|
|
/**
|
|
* Validates i18n config at plugin initialization.
|
|
* Throws descriptive errors — fail fast, no silent defaults.
|
|
*/ export function validateI18nConfig(config) {
|
|
const { defaultLocale, locales } = config;
|
|
if (!locales?.length) {
|
|
throw new Error('[ipal] i18n: "locales" must contain at least one locale.');
|
|
}
|
|
const codes = new Set();
|
|
for (const locale of locales){
|
|
if (!locale.code || !locale.label) {
|
|
throw new Error(`[ipal] i18n: Every locale must have "code" and "label". Received: ${JSON.stringify(locale)}`);
|
|
}
|
|
if (!LOCALE_CODE_PATTERN.test(locale.code)) {
|
|
throw new Error(`[ipal] i18n: Invalid locale code "${locale.code}". Expected format: "pl", "en", "pt-BR".`);
|
|
}
|
|
if (codes.has(locale.code)) {
|
|
throw new Error(`[ipal] i18n: Duplicate locale code "${locale.code}".`);
|
|
}
|
|
codes.add(locale.code);
|
|
}
|
|
if (!codes.has(defaultLocale)) {
|
|
throw new Error(`[ipal] i18n: defaultLocale "${defaultLocale}" not found in locales [${[
|
|
...codes
|
|
].join(', ')}].`);
|
|
}
|
|
}
|
|
|
|
//# sourceMappingURL=validation.js.map
|