All files / libs/tools/plugin/src/executors/intl-update executor.ts

0% Statements 0/56
0% Branches 0/1
0% Functions 0/1
0% Lines 0/56

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57                                                                                                                 
import { createWriteStream } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path/posix';
import { pipeline } from 'node:stream/promises';

import { extract } from '@formatjs/cli-lib';
import { type ExtractedMessageDescriptor } from '@formatjs/cli-lib/src/extract';
import { getProjects, type ExecutorContext } from '@nx/devkit';
import { glob } from 'glob';
import { FsTree } from 'nx/src/generators/tree';

import { PotFileGeneratorStream } from './potFileGenerator.stream';
import { type IntlUpdateExecutorSchema } from './schema.d';
import { updatePoFiles } from './updater';

export default async function runExecutor(
  { messagesPackageTags, poPath }: IntlUpdateExecutorSchema,
  context: ExecutorContext,
) {
  const tree = new FsTree(context.cwd, false);
  const messagesPackagePaths = [...getProjects(tree).values()]
    .filter((project) => project.tags?.some((tag) => messagesPackageTags.includes(tag)))
    .map((project) => `${project.root}/src`)
    .filter(Boolean)
    .sort((a, b) => b.localeCompare(a));

  // Get all messages from the matching packages.
  const messages: Record<string, ExtractedMessageDescriptor> = JSON.parse(
    await extract(
      messagesPackagePaths.flatMap((path) =>
        glob.sync(join(path, '**/*.@(ts|tsx)'), {
          nodir: true,
          ignore: ['**/*.d.ts', '**/*.spec.@(ts|tsx)', '**/*.test.@(ts|tsx)', '**/*.e2e-spec.@(ts|tsx)'],
        }),
      ),
      {
        idInterpolationPattern: '[sha512:contenthash:base64:6]',
        extractSourceLocation: true,
      },
    ),
  ) as Record<string, ExtractedMessageDescriptor>;

  const poFilesPath = glob.sync(poPath);

  // write transformed messages to a temporary file
  const potFilePath = `${tmpdir()}/messages.pot`;

  await pipeline(new PotFileGeneratorStream(messages, 'en'), createWriteStream(potFilePath, { encoding: 'utf-8' }));

  // update translations
  updatePoFiles(poFilesPath, potFilePath);

  return {
    success: true,
  };
}