@angular/build
Version:
Official build system for Angular
139 lines • 6.82 kB
JavaScript
;
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.LOCALE_DATA_BASE_MODULE = exports.LOCALE_DATA_NAMESPACE = void 0;
exports.createAngularLocaleDataPlugin = createAngularLocaleDataPlugin;
const node_module_1 = require("node:module");
/**
* The internal namespace used by generated locale import statements and Angular locale data plugin.
*/
exports.LOCALE_DATA_NAMESPACE = 'angular:locale/data';
/**
* The base module location used to search for locale specific data.
*/
exports.LOCALE_DATA_BASE_MODULE = '@angular/common/locales/global';
/**
* Creates an esbuild plugin that resolves Angular locale data files from `@angular/common`.
*
* @returns An esbuild plugin.
*/
function createAngularLocaleDataPlugin() {
return {
name: 'angular-locale-data',
setup(build) {
build.onResolve({ filter: /^angular:locale\/data:/ }, async ({ path }) => {
// Extract the locale from the path
const rawLocaleTag = path.split(':', 3)[2];
// Extract and normalize the base name of the raw locale tag
let partialLocaleTag;
try {
const locale = new Intl.Locale(rawLocaleTag);
partialLocaleTag = locale.baseName;
}
catch {
return {
path: rawLocaleTag,
namespace: exports.LOCALE_DATA_NAMESPACE,
errors: [
{
text: `Invalid or unsupported locale provided in configuration: "${rawLocaleTag}"`,
},
],
};
}
let exact = true;
let localeRequire;
while (partialLocaleTag) {
// Angular embeds the `en`/`en-US` locale into the framework and it does not need to be included again here.
// The onLoad hook below for the locale data namespace has an `empty` loader that will prevent inclusion.
// Angular does not contain exact locale data for `en-US` but `en` is equivalent.
if (partialLocaleTag === 'en' || partialLocaleTag === 'en-US') {
return {
path: rawLocaleTag,
namespace: exports.LOCALE_DATA_NAMESPACE,
};
}
// Attempt to resolve the locale tag data within the Angular base module location
const potentialPath = `${exports.LOCALE_DATA_BASE_MODULE}/${partialLocaleTag}`;
// If packages are configured to be external then leave the original angular locale import path.
// This happens when using the development server with caching enabled to allow Vite prebundling to work.
// There currently is no option on the esbuild resolve function to resolve while disabling the option.
// NOTE: If esbuild eventually allows controlling the external package options in a build.resolve call, this
// workaround can be removed.
let result;
const { packages, absWorkingDir } = build.initialOptions;
if (packages === 'external' && absWorkingDir) {
localeRequire ??= (0, node_module_1.createRequire)(absWorkingDir + '/');
try {
localeRequire.resolve(potentialPath);
result = {
errors: [],
warnings: [],
external: true,
sideEffects: true,
namespace: '',
suffix: '',
pluginData: undefined,
path: potentialPath,
};
}
catch { }
}
else {
result = await build.resolve(potentialPath, {
kind: 'import-statement',
resolveDir: absWorkingDir,
});
}
if (result?.path) {
if (exact) {
return result;
}
else {
return {
...result,
warnings: [
...result.warnings,
{
location: null,
text: `Locale data for '${rawLocaleTag}' cannot be found. Using locale data for '${partialLocaleTag}'.`,
},
],
};
}
}
// Remove the last subtag and try again with a less specific locale.
// Usually the match is exact so the string splitting here is not done until actually needed after the exact
// match fails to resolve.
const parts = partialLocaleTag.split('-');
partialLocaleTag = parts.slice(0, -1).join('-');
exact = false;
}
// Not found so issue a warning and use an empty loader. Framework built-in `en-US` data will be used.
// This retains existing behavior as in the Webpack-based builder.
return {
path: rawLocaleTag,
namespace: exports.LOCALE_DATA_NAMESPACE,
warnings: [
{
location: null,
text: `Locale data for '${rawLocaleTag}' cannot be found. No locale data will be included for this locale.`,
},
],
};
});
// Locales that cannot be found will be loaded as empty content with a warning from the resolve step
build.onLoad({ filter: /./, namespace: exports.LOCALE_DATA_NAMESPACE }, () => ({
contents: '',
loader: 'empty',
}));
},
};
}
//# sourceMappingURL=i18n-locale-plugin.js.map