import {
joinPathFragments,
logger,
readProjectConfiguration,
Tree,
updateProjectConfiguration
} from '@nx/devkit';
import {
extractInternationalizationBuildConfigurations,
extractInternationalizationGenerateAndServeConfigurations,
extractInternationalizationRootConfiguration,
extractInternationalizationServeConfigurations,
extractLocalesFromFileNames
} from './extract-internationalization-configs';
export interface UpdateWorkspaceInternationalizationOptions {
projectName: string;
stripLocaleBaseHref: boolean;
}
export function updateProjectInternationalization(
tree: Tree,
projectName: string,
stripLocaleBaseHref: boolean,
localesDestinationFolder: string
) {
const project = readProjectConfiguration(tree, projectName);
const localesDirectory = joinPathFragments(project.root, 'config', 'locales');
const localeFilePaths = tree
.children(localesDirectory)
.map((fileName) => joinPathFragments(localesDirectory, fileName));
// The Nx project schema does not allow for additional properties. However,
// this root-level 'i18n' property is required by the various Angular builders
// so we use an "as any" assertion here to be able to set the "i18n" property.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(project as any)['i18n'] = extractInternationalizationRootConfiguration(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(project as any)['i18n']?.sourceLocale,
localeFilePaths,
stripLocaleBaseHref
);
if (localeFilePaths.length > 0) {
const localeNames = extractLocalesFromFileNames(localeFilePaths);
if (!project.targets?.['develop']) {
logger.warn(
`⚠️ No "develop" target in project "${projectName}". Internationalization configuration cannot be updated for the "develop" target. Please consider adding a "develop" target.`
);
} else {
const developTarget = project.targets['develop'];
const developConfig = extractInternationalizationGenerateAndServeConfigurations(
localeNames,
projectName
);
developTarget.configurations = { ...developTarget?.configurations, ...developConfig };
}
if (!project.targets?.['build-generated-app']) {
logger.warn(
`⚠️ No "build-generated-app" target in project "${projectName}". Internationalization configuration can not be updated for the "build-generated-app" target. Please consider adding a "build-generated-app" target.`
);
} else {
const buildTarget = project.targets['build-generated-app'];
const buildConfig = extractInternationalizationBuildConfigurations(
localeNames,
localesDestinationFolder
);
buildTarget.configurations = { ...buildTarget?.configurations, ...buildConfig };
localeNames.forEach((localeName) => {
tree.write(
joinPathFragments(localesDestinationFolder, `locale.${localeName}.ts`),
`import 'dayjs/locale/${localeName}';`
);
});
}
if (!project.targets?.['serve-generated-app']) {
logger.warn(
`⚠️ No "serve-generated-app" target in project "${projectName}". Internationalization configuration can not be updated for the "serve-generated-app" target. Please consider adding a "serve-generated-app" target.`
);
} else {
const serveTarget = project.targets['serve-generated-app'];
const serveConfig = extractInternationalizationServeConfigurations(localeNames, projectName);
serveTarget.configurations = { ...serveTarget?.configurations, ...serveConfig };
}
}
updateProjectConfiguration(tree, projectName, project);
}