Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 35 additions & 30 deletions npm/ng-packs/packages/core/locale/src/utils/register-locale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,35 @@ export interface LocaleErrorHandlerData {

let localeMap = {} as { [key: string]: string };

const localeLoaders: Record<string, () => Promise<any>> = {
ar: () => import('@angular/common/locales/ar'),
cs: () => import('@angular/common/locales/cs'),
en: () => import('@angular/common/locales/en'),
'en-GB': () => import('@angular/common/locales/en-GB'),
es: () => import('@angular/common/locales/es'),
de: () => import('@angular/common/locales/de'),
fi: () => import('@angular/common/locales/fi'),
fr: () => import('@angular/common/locales/fr'),
hi: () => import('@angular/common/locales/hi'),
hu: () => import('@angular/common/locales/hu'),
is: () => import('@angular/common/locales/is'),
it: () => import('@angular/common/locales/it'),
ja: () => import('@angular/common/locales/ja'),
ko: () => import('@angular/common/locales/ko'),
pt: () => import('@angular/common/locales/pt'),
ro: () => import('@angular/common/locales/ro'),
ru: () => import('@angular/common/locales/ru'),
sk: () => import('@angular/common/locales/sk'),
sl: () => import('@angular/common/locales/sl'),
th: () => import('@angular/common/locales/th'),
tr: () => import('@angular/common/locales/tr'),
vi: () => import('@angular/common/locales/vi'),
'zh-Hans': () => import('@angular/common/locales/zh-Hans'),
'zh-Hant': () => import('@angular/common/locales/zh-Hant'),
};

const localeSupportList = Object.keys(localeLoaders);

export interface RegisterLocaleData {
cultureNameLocaleFileMap?: Record<string, string>;
errorHandlerFn?: (data: LocaleErrorHandlerData) => any;
Expand All @@ -19,29 +48,11 @@ export interface RegisterLocaleData {
function loadLocale(locale: string) {
// hard coded list works with esbuild. Source https://github.com/angular/angular-cli/issues/26904#issuecomment-1903596563

const list = {
ar: () => import('@angular/common/locales/ar'),
cs: () => import('@angular/common/locales/cs'),
en: () => import('@angular/common/locales/en'),
'en-GB': () => import('@angular/common/locales/en-GB'),
es: () => import('@angular/common/locales/es'),
de: () => import('@angular/common/locales/de'),
fi: () => import('@angular/common/locales/fi'),
fr: () => import('@angular/common/locales/fr'),
hi: () => import('@angular/common/locales/hi'),
hu: () => import('@angular/common/locales/hu'),
is: () => import('@angular/common/locales/is'),
it: () => import('@angular/common/locales/it'),
pt: () => import('@angular/common/locales/pt'),
tr: () => import('@angular/common/locales/tr'),
ru: () => import('@angular/common/locales/ru'),
ro: () => import('@angular/common/locales/ro'),
sk: () => import('@angular/common/locales/sk'),
sl: () => import('@angular/common/locales/sl'),
'zh-Hans': () => import('@angular/common/locales/zh-Hans'),
'zh-Hant': () => import('@angular/common/locales/zh-Hant'),
};
return list[locale]();
if (localeSupportList.indexOf(locale) === -1) {
return Promise.reject(new Error(`Cannot find the ${locale} locale file.`));
}

return localeLoaders[locale]();
}

export function registerLocaleForEsBuild(
Expand All @@ -53,12 +64,6 @@ export function registerLocaleForEsBuild(
return (locale: string): Promise<any> => {
localeMap = { ...differentLocales, ...cultureNameLocaleFileMap };
const l = localeMap[locale] || locale;
const localeSupportList =
'ar|cs|en|en-GB|es|de|fi|fr|hi|hu|is|it|pt|tr|ru|ro|sk|sl|zh-Hans|zh-Hant'.split('|');

if (localeSupportList.indexOf(l) == -1) {
return;
}
return new Promise((resolve, reject) => {
return loadLocale(l)
.then(val => {
Expand Down Expand Up @@ -93,7 +98,7 @@ export function registerLocale(
return import(
/* webpackMode: "lazy-once" */
/* webpackChunkName: "locales"*/
/* webpackInclude: /[/\\](ar|cs|en|en-GB|es|de|fi|fr|hi|hu|is|it|pt|tr|ru|ro|sk|sl|zh-Hans|zh-Hant)\.(mjs|js)$/ */
/* webpackInclude: /[/\\](ar|cs|en|en-GB|es|de|fi|fr|hi|hu|is|it|ja|ko|pt|ro|ru|sk|sl|th|tr|vi|zh-Hans|zh-Hant)\.(mjs|js)$/ */
/* webpackExclude: /[/\\]global|extra/ */
/* @vite-ignore */
`@angular/common${localePath}`
Expand Down
29 changes: 29 additions & 0 deletions npm/ng-packs/packages/core/src/lib/tests/register-locale.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { registerLocaleForEsBuild, storeLocaleData } from '../../../locale/src/utils/register-locale';

describe('registerLocaleForEsBuild', () => {
it('should always return a promise for unsupported locales', async () => {
const errorHandlerFn = vi.fn(({ resolve }) => resolve({ default: null }));

const result = registerLocaleForEsBuild({ errorHandlerFn })('xx');

expect(result).toBeInstanceOf(Promise);
await expect(result).resolves.toEqual({ default: null });
expect(errorHandlerFn).toHaveBeenCalledWith(
expect.objectContaining({ locale: 'xx', error: expect.any(Error) }),
);
});

it('should load supported locales', async () => {
await expect(registerLocaleForEsBuild()('ko')).resolves.toEqual(
expect.objectContaining({ default: expect.anything() }),
);
});

it('should resolve stored locale data for unsupported locales', async () => {
const locale = 'xx-extra';
const data = { hello: 'world' };
storeLocaleData(data, locale);

await expect(registerLocaleForEsBuild()(locale)).resolves.toEqual({ default: data });
});
});
Loading