File

libs/nx/src/generators/journey-src/lib/update-project-internationalization/update-project-internationalization.ts

Index

Properties

Properties

projectName
Type string
stripLocaleBaseHref
Type boolean
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);
}

results matching ""

    No results matching ""