{"version":3,"file":"i18n-unused.cjs","sources":["../src/helpers/meta.ts","../src/helpers/files.ts","../src/helpers/parseRegex.ts","../src/core/initialize.ts","../src/helpers/flatKeys.ts","../src/core/translations.ts","../src/actions/display.ts","../src/core/action.ts","../src/helpers/consoleColor.ts","../src/helpers/git.ts","../src/helpers/writeJsonFile.ts","../src/actions/remove.ts","../src/actions/mark.ts","../src/actions/sync.ts"],"sourcesContent":["export function importMetaUrl(): string {\n  return import.meta.url;\n}\n","import { tsImport } from \"ts-import\";\n\nimport { createRequire } from \"module\";\n\nimport { readFileSync, Dirent, promises as FsPromises } from \"fs\";\n\nimport path from \"path\";\n\nimport {\n  ModuleResolver,\n  ModuleNameResolver,\n  RecursiveStruct,\n  CustomFileLoader,\n} from \"../types\";\nimport { importMetaUrl } from \"./meta\";\n\nexport const getFileSizeKb = (str: string): number =>\n  Buffer.byteLength(str, \"utf8\") / 1000;\n\nexport const isSubstrInFile = (filePath: string, substr: string): boolean => {\n  const file = readFileSync(filePath).toString();\n\n  return file.includes(substr);\n};\n\nconst isNodeVersion22OrAbove = () => {\n  const version = process.version.match(/^v(\\d+)/);\n  return version && parseInt(version[1], 10) >= 22;\n};\n\nexport const resolveFile = async (\n  filePath: string,\n  resolver: ModuleResolver = (m) => m,\n  loader?: CustomFileLoader,\n): Promise<RecursiveStruct> => {\n  const [, ext] = filePath.match(/\\.([0-9a-z]+)(?:[?#]|$)/i) || [];\n  let m = {};\n\n  if (loader) {\n    m = loader(filePath);\n  } else if (ext === \"ts\") {\n    m = await tsImport.compile(filePath);\n  } else if ([\"js\", \"cjs\"].includes(ext)) {\n    let r = createRequire(importMetaUrl());\n    if (!isNodeVersion22OrAbove()) {\n      r = r(\"esm\")(m /*, options*/);\n    }\n    m = r(filePath);\n  } else if (ext === \"json\") {\n    const r = createRequire(importMetaUrl());\n    m = r(filePath);\n  }\n\n  return resolver(m);\n};\n\nconst useFileNameResolver = (\n  resolver: ModuleNameResolver,\n  name: string,\n): boolean => {\n  if (resolver instanceof RegExp) {\n    return resolver.test(name);\n  }\n  if (typeof resolver === \"function\") {\n    return resolver(name);\n  }\n\n  return false;\n};\n\ninterface options {\n  basePath?: string;\n  ignorePaths?: string[];\n  srcExtensions?: string[];\n  fileNameResolver?: ModuleNameResolver;\n}\n\nexport const generateFilesPaths = async (\n  srcPath: string,\n  { basePath, ignorePaths, srcExtensions, fileNameResolver }: options,\n): Promise<string[]> => {\n  // Dirent: https://nodejs.org/api/fs.html#class-fsdirent\n  const entries: Dirent[] = await FsPromises.readdir(srcPath, {\n    withFileTypes: true,\n  });\n  const files = await entries.reduce(async (accPromise, dirent: Dirent) => {\n    const nextPath: string = path.resolve(srcPath, dirent.name);\n    const acc = await accPromise;\n\n    if (ignorePaths) {\n      const fullBasePath = path.resolve(`${process.cwd()}/${basePath}`);\n      const pathFromBasePath = `${path.relative(fullBasePath, nextPath)}${\n        dirent.isDirectory() ? \"/\" : \"\"\n      }`;\n      if (\n        ignorePaths.some((ignorePath) =>\n          pathFromBasePath.startsWith(`${ignorePath}/`),\n        )\n      ) {\n        return acc;\n      }\n    }\n\n    if (dirent.isDirectory()) {\n      const generatedNextPath = await generateFilesPaths(nextPath, {\n        basePath,\n        ignorePaths,\n        srcExtensions,\n        fileNameResolver,\n      });\n\n      acc.push(...generatedNextPath);\n\n      return acc;\n    }\n\n    const fileName = path.basename(nextPath);\n\n    if (srcExtensions) {\n      const [, ext] = fileName.match(/\\.([0-9a-z]+)(?:[?#]|$)/i) || [];\n      const validExtension = srcExtensions.some((_ext: string) => {\n        if (_ext === ext && fileNameResolver) {\n          return useFileNameResolver(fileNameResolver, fileName);\n        }\n\n        return _ext === ext;\n      });\n\n      if (!validExtension) {\n        return acc;\n      }\n    }\n\n    if (fileNameResolver && !useFileNameResolver(fileNameResolver, fileName)) {\n      return acc;\n    }\n\n    acc.push(nextPath);\n\n    return acc;\n  }, Promise.resolve([]));\n\n  return files;\n};\n","/**\n * Transform the escaped string provided into a valid regex\n * @param {string} str\n * @return {RegExp}\n */\nexport const parseRegex = (str: string): RegExp => {\n  const parts = str.split(\"/\");\n  return new RegExp(`${parts[1]}`.replace(/\\\\\\\\/g, \"\\\\\"), parts[2]);\n};\n","/* eslint no-empty: [\"error\", { \"allowEmptyCatch\": true }] */\n\nimport { resolveFile } from \"../helpers/files\";\n\nimport { RunOptions, RecursiveStruct } from \"../types\";\nimport fs from \"fs\";\nimport { parseRegex } from \"../helpers/parseRegex\";\n\nconst defaultValues: RunOptions = {\n  srcPath: \"\",\n  context: true,\n  excludeKey: \"\",\n  marker: \"[UNUSED]\",\n  ignoreComments: false,\n  flatTranslations: false,\n  translationSeparator: \".\",\n  translationContextSeparator: \"_\",\n  // Based on https://www.i18next.com/misc/json-format\n  translationContextMatcher:\n    /^(zero|one|two|few|many|other|male|female|0|1|2|3|4|5|plural|11|100)$/,\n  srcExtensions: [\"js\", \"ts\", \"jsx\", \"tsx\", \"vue\"],\n  translationKeyMatcher: /(?:[.$\\s]*\\{?)?(_|t|tc|i18nKey)\\)\\(([\\n\\r\\s]|.)*?\\)/gi,\n  localeFileParser: (m: RecursiveStruct): RecursiveStruct =>\n    (m.default || m) as RecursiveStruct,\n  missedTranslationParser: /\\(([^)]+)\\)/,\n  localeJsonStringifyIndent: 2,\n};\n\nexport const initialize = async (\n  inlineOptions: RunOptions,\n): Promise<RunOptions> => {\n  let config: RunOptions = { ...inlineOptions };\n\n  try {\n    const base = process.cwd();\n\n    let configFile: Partial<RunOptions> = {};\n\n    for (const ext of [\"js\", \"cjs\", \"json\"]) {\n      const path = `${base}/i18n-unused.config.${ext}`;\n      if (fs.existsSync(path)) {\n        configFile = await resolveFile(path);\n        // ⛔ There is no safe/reliable way to parse a function\n        // ✔ When the file is a JSON need to parse the regex\n        if (ext === \"json\") {\n          const potentialRegex = [\n            \"translationContextMatcher\",\n            \"translationKeyMatcher\",\n            \"missedTranslationParser\",\n            \"localeNameResolver\",\n          ];\n          potentialRegex.forEach((value) => {\n            if (Object.prototype.hasOwnProperty.call(configFile, value)) {\n              configFile[value] = parseRegex(configFile[value]);\n            }\n          });\n        }\n        break;\n      }\n    }\n\n    config = { ...configFile, ...inlineOptions };\n  } catch (e) {}\n\n  if (!config.localesPath) {\n    throw new Error(\"Locales path is required\");\n  }\n\n  if (!config.localesExtensions && !config.localeNameResolver) {\n    config.localesExtensions = [\"json\"];\n  }\n\n  return { ...defaultValues, ...config };\n};\n","import { RecursiveStruct } from \"../types\";\n\ninterface Options {\n  parent?: string;\n  keys?: string[];\n  context: boolean;\n  contextSeparator: string;\n  contextMatcher: RegExp;\n  excludeKey?: string | string[];\n}\n\nexport const generateTranslationsFlatKeys = (\n  source: RecursiveStruct,\n  {\n    parent,\n    keys = [],\n    excludeKey,\n    context,\n    contextSeparator,\n    contextMatcher,\n  }: Options,\n): string[] => {\n  Object.keys(source).forEach((key) => {\n    const flatKey = parent ? `${parent}.${key}` : key;\n\n    if (!Array.isArray(source[key]) && typeof source[key] === \"object\") {\n      generateTranslationsFlatKeys(source[key] as RecursiveStruct, {\n        contextSeparator,\n        parent: flatKey,\n        excludeKey,\n        context,\n        contextMatcher,\n        keys,\n      });\n    } else {\n      keys.push(\n        context\n          ? getKeyWithoutContext(flatKey, contextSeparator, contextMatcher)\n          : flatKey,\n      );\n    }\n  });\n\n  const resultKeys = excludeKey\n    ? keys.filter((k: string) =>\n        typeof excludeKey === \"string\"\n          ? !k.includes(excludeKey)\n          : excludeKey.every((ek) => !k.includes(ek)),\n      )\n    : keys;\n\n  // The context removal can cause duplicates, so we need to remove them\n  return [...new Set(resultKeys)];\n};\n\n/**\n * Removes context from key.\n *\n * Makes sure translation keys like `some_key_i_have` is not treated as context.\n */\nconst getKeyWithoutContext = (\n  flatKey: string,\n  contextSeparator: string,\n  contextMatcher: RegExp,\n) => {\n  const splitted = flatKey.split(contextSeparator);\n  if (splitted.length === 1) return flatKey;\n\n  const lastPart = splitted[splitted.length - 1];\n\n  // If the last part is a context, remove it\n  if (lastPart.match(contextMatcher)) {\n    return splitted.slice(0, splitted.length - 2).join(contextSeparator);\n  }\n  // Otherwise, join all parts\n  return splitted.join(contextSeparator);\n};\n","import { readFileSync } from \"fs\";\n\nimport {\n  UnusedTranslation,\n  UnusedTranslations,\n  MissedTranslation,\n  MissedTranslations,\n  ModuleResolver,\n  TranslationKeyMatcher,\n  CustomFileLoader,\n  MissedTranslationParser,\n  CustomChecker,\n} from \"../types\";\n\nimport { resolveFile } from \"../helpers/files\";\nimport { generateTranslationsFlatKeys } from \"../helpers/flatKeys\";\n\nconst replaceQuotes = (v: string): string => v.replace(/['\"`]/gi, \"\");\n\nconst isStaticKey = (v: string): boolean => !v.includes(\"${\") && /['\"]/.test(v);\n\nconst isDynamicKey = (v: string): boolean =>\n  v.includes(\"${\") || !/['\"]/.test(v);\n\nconst isInlineComment = (str: string): boolean => /^(\\/\\/)/.test(str);\nconst isHTMLComment = (str: string): boolean => /^(<!--)/.test(str);\nconst isStartOfMultilineComment = (str: string): boolean => /^(\\/\\*)/.test(str);\nconst isEndOfMultilineComment = (str: string): boolean => /^(\\*\\/)/.test(str);\n\nconst removeComments = (fileTxt: string): string => {\n  let skip = false;\n\n  return fileTxt\n    .split(\"\\n\")\n    .reduce((acc, str) => {\n      const _str = str.trim();\n\n      if (isStartOfMultilineComment(_str) || isEndOfMultilineComment(_str)) {\n        skip = isStartOfMultilineComment(_str);\n      }\n\n      if (skip || isInlineComment(_str) || isHTMLComment(_str)) {\n        return acc;\n      }\n\n      acc.push(str);\n\n      return acc;\n    }, [])\n    .join(\"\\n\");\n};\n\ninterface unusedOptions {\n  context: boolean;\n  contextSeparator: string;\n  contextMatcher: RegExp;\n  ignoreComments: boolean;\n  localeFileParser?: ModuleResolver;\n  localeFileLoader?: CustomFileLoader;\n  customChecker: CustomChecker;\n  excludeTranslationKey?: string | string[];\n  translationKeyMatcher?: TranslationKeyMatcher;\n}\n\nexport const collectUnusedTranslations = async (\n  localesPaths: string[],\n  srcFilesPaths: string[],\n  {\n    ignoreComments,\n    localeFileParser,\n    localeFileLoader,\n    customChecker,\n    excludeTranslationKey,\n    contextMatcher,\n    contextSeparator,\n    context,\n    translationKeyMatcher,\n  }: unusedOptions,\n): Promise<UnusedTranslations> => {\n  const translations: UnusedTranslation = [];\n\n  for (const localePath of localesPaths) {\n    const locale = await resolveFile(\n      localePath,\n      localeFileParser,\n      localeFileLoader,\n    );\n    const translationsKeys = generateTranslationsFlatKeys(locale, {\n      excludeKey: excludeTranslationKey,\n      contextMatcher,\n      contextSeparator,\n      context,\n    });\n\n    srcFilesPaths.forEach((filePath: string) => {\n      const file = readFileSync(filePath).toString();\n      const matchKeys =\n        (ignoreComments ? removeComments(file) : file).match(\n          translationKeyMatcher,\n        ) || [];\n\n      const matchKeysSet = new Set(matchKeys);\n\n      if (customChecker) {\n        customChecker(matchKeysSet, translationsKeys);\n      } else {\n        const matchKeysSetArrStr = [...matchKeysSet].toString();\n\n        [...translationsKeys].forEach((key) => {\n          if (matchKeysSetArrStr.includes(key)) {\n            translationsKeys.splice(translationsKeys.indexOf(key), 1);\n          }\n        });\n      }\n    });\n\n    translations.push({\n      localePath: localePath,\n      keys: translationsKeys,\n      count: translationsKeys.length,\n    });\n  }\n\n  return {\n    translations,\n    totalCount: translations.reduce((acc, { count }) => acc + count, 0),\n  };\n};\n\ninterface missedOptions {\n  context: boolean;\n  contextSeparator: string;\n  contextMatcher: RegExp;\n  ignoreComments: boolean;\n  localeFileParser?: ModuleResolver;\n  localeFileLoader?: CustomFileLoader;\n  excludeTranslationKey?: string | string[];\n  translationKeyMatcher?: TranslationKeyMatcher;\n  missedTranslationParser: MissedTranslationParser;\n}\n\nexport const collectMissedTranslations = async (\n  localesPaths: string[],\n  srcFilesPaths: string[],\n  {\n    context,\n    ignoreComments,\n    localeFileParser,\n    localeFileLoader,\n    contextSeparator,\n    excludeTranslationKey,\n    translationKeyMatcher,\n    missedTranslationParser,\n    contextMatcher,\n  }: missedOptions,\n): Promise<MissedTranslations> => {\n  const translations: MissedTranslation = [];\n\n  const flatKeys = [\n    ...new Set(\n      await localesPaths.reduce(async (asyncAcc, localePath) => {\n        const acc = await asyncAcc;\n        const locale = await resolveFile(\n          localePath,\n          localeFileParser,\n          localeFileLoader,\n        );\n        const translationsKeys = generateTranslationsFlatKeys(locale, {\n          excludeKey: excludeTranslationKey,\n          contextMatcher,\n          contextSeparator,\n          context,\n        });\n\n        return [...acc, ...translationsKeys];\n      }, Promise.resolve([])),\n    ),\n  ];\n\n  const filesMissedTranslationsKeys: { [key: string]: string[] } =\n    await srcFilesPaths.reduce(async (asyncAcc, filePath) => {\n      const acc: { [key: string]: string[] } = await asyncAcc;\n      acc[filePath] = acc[filePath] || [];\n\n      const file = readFileSync(filePath).toString();\n\n      const matchKeys = (\n        (ignoreComments ? removeComments(file) : file).match(\n          translationKeyMatcher,\n        ) || []\n      )\n        .map((v) => {\n          if (typeof missedTranslationParser === \"function\") {\n            return missedTranslationParser(v);\n          }\n\n          const [, translation] = v.match(missedTranslationParser) || [];\n\n          return translation;\n        })\n        .filter((v) => v && !flatKeys.includes(replaceQuotes(v)));\n\n      if (matchKeys.length) {\n        acc[filePath].push(...matchKeys);\n      }\n\n      return acc;\n    }, Promise.resolve({}));\n\n  Object.keys(filesMissedTranslationsKeys).forEach((filePath: string) => {\n    if (!filesMissedTranslationsKeys[filePath].length) {\n      return;\n    }\n\n    const staticKeys = filesMissedTranslationsKeys[filePath]\n      .filter(isStaticKey)\n      .map(replaceQuotes);\n    const dynamicKeys = filesMissedTranslationsKeys[filePath]\n      .filter(isDynamicKey)\n      .map(replaceQuotes);\n\n    translations.push({\n      filePath,\n      staticKeys,\n      dynamicKeys,\n      staticCount: staticKeys.length,\n      dynamicCount: dynamicKeys.length,\n    });\n  });\n\n  return {\n    translations,\n    totalStaticCount: translations.reduce(\n      (acc, { staticCount: c }) => acc + c,\n      0,\n    ),\n    totalDynamicCount: translations.reduce(\n      (acc, { dynamicCount: c }) => acc + c,\n      0,\n    ),\n  };\n};\n","import { RunOptions, UnusedTranslations, MissedTranslations } from \"../types\";\n\nimport { initialize } from \"../core/initialize\";\nimport {\n  collectUnusedTranslations,\n  collectMissedTranslations,\n} from \"../core/translations\";\nimport { generateFilesPaths, getFileSizeKb } from \"../helpers/files\";\n\nexport const displayUnusedTranslations = async (\n  options: RunOptions,\n): Promise<UnusedTranslations> => {\n  const config = await initialize(options);\n\n  const localesFilesPaths = await generateFilesPaths(config.localesPath, {\n    srcExtensions: config.localesExtensions,\n    fileNameResolver: config.localeNameResolver,\n  });\n\n  const srcFilesPaths = await generateFilesPaths(\n    `${process.cwd()}/${config.srcPath}`,\n    {\n      srcExtensions: config.srcExtensions,\n      ignorePaths: config.ignorePaths,\n      basePath: config.srcPath,\n    },\n  );\n\n  const unusedTranslations = await collectUnusedTranslations(\n    localesFilesPaths,\n    srcFilesPaths,\n    {\n      context: config.context,\n      contextSeparator: config.translationContextSeparator,\n      contextMatcher: config.translationContextMatcher,\n      ignoreComments: config.ignoreComments,\n      localeFileParser: config.localeFileParser,\n      localeFileLoader: config.localeFileLoader,\n      customChecker: config.customChecker,\n      excludeTranslationKey: config.excludeKey,\n      translationKeyMatcher: config.translationKeyMatcher,\n    },\n  );\n\n  unusedTranslations.translations.forEach((translation) => {\n    console.log(\n      \"<<<==========================================================>>>\",\n    );\n    console.log(`Unused translations in: ${translation.localePath}`);\n    console.log(`Unused translations count: ${translation.count}`);\n    console.table(\n      translation.keys.map((key: string) => ({ Translation: key })),\n    );\n  });\n\n  console.log(\n    `Total unused translations count: ${unusedTranslations.totalCount}`,\n  );\n\n  console.log(\n    `Can free up memory: ~${getFileSizeKb(\n      unusedTranslations.translations.reduce(\n        (acc, { keys }) => `${acc}, ${keys.join(\", \")}`,\n        \"\",\n      ),\n    )}kb`,\n  );\n\n  if (config.failOnUnused && unusedTranslations.totalCount > 0) {\n    process.exitCode = 1;\n  }\n\n  return unusedTranslations;\n};\n\nexport const displayMissedTranslations = async (\n  options: RunOptions,\n): Promise<MissedTranslations> => {\n  const config = await initialize(options);\n\n  const localesFilesPaths = await generateFilesPaths(config.localesPath, {\n    srcExtensions: config.localesExtensions,\n    fileNameResolver: config.localeNameResolver,\n  });\n\n  const srcFilesPaths = await generateFilesPaths(\n    `${process.cwd()}/${config.srcPath}`,\n    {\n      srcExtensions: config.srcExtensions,\n      ignorePaths: config.ignorePaths,\n      basePath: config.srcPath,\n    },\n  );\n\n  const missedTranslations = await collectMissedTranslations(\n    localesFilesPaths,\n    srcFilesPaths,\n    {\n      context: config.context,\n      contextSeparator: config.translationContextSeparator,\n      contextMatcher: config.translationContextMatcher,\n      ignoreComments: config.ignoreComments,\n      localeFileParser: config.localeFileParser,\n      localeFileLoader: config.localeFileLoader,\n      excludeTranslationKey: config.excludeKey,\n      translationKeyMatcher: config.translationKeyMatcher,\n      missedTranslationParser: config.missedTranslationParser,\n    },\n  );\n\n  missedTranslations.translations.forEach((translation) => {\n    console.log(\n      \"<<<==========================================================>>>\",\n    );\n\n    console.log(`Missed translations in: ${translation.filePath}`);\n    console.log(`Missed static translations count: ${translation.staticCount}`);\n    console.log(\n      `Missed dynamic translations count: ${translation.dynamicCount}`,\n    );\n\n    if (translation.staticKeys.length) {\n      console.log(\"--------------------------------------------\");\n      console.log(\"Static keys:\");\n      console.table(\n        translation.staticKeys.map((key: string) => ({ Key: key })),\n      );\n    }\n    if (translation.dynamicKeys.length) {\n      console.log(\"--------------------------------------------\");\n      console.log(\"Dynamic keys:\");\n      console.table(\n        translation.dynamicKeys.map((key: string) => ({ Key: key })),\n      );\n    }\n  });\n\n  console.log(\n    `Total missed static translations count: ${missedTranslations.totalStaticCount}`,\n  );\n  console.log(\n    `Total missed dynamic translations count: ${missedTranslations.totalDynamicCount}`,\n  );\n\n  if (\n    config.failOnMissed &&\n    missedTranslations.totalStaticCount + missedTranslations.totalDynamicCount >\n      0\n  ) {\n    process.exitCode = 1;\n  }\n\n  return missedTranslations;\n};\n","import { ApplyFlat, RecursiveStruct } from \"../types\";\n\ntype Options = {\n  flatTranslations: boolean;\n  separator: string;\n};\n\nexport const applyToFlatKey = (\n  source: RecursiveStruct,\n  key: string,\n  cb: ApplyFlat,\n  options: Options,\n): boolean => {\n  const separatedKey = options.flatTranslations\n    ? [key]\n    : key.split(options.separator);\n  const keyLength = separatedKey.length - 1;\n\n  separatedKey.reduce((acc, _k, i) => {\n    if (i === keyLength) {\n      cb(acc, _k);\n    } else {\n      acc = acc[_k] as RecursiveStruct;\n    }\n\n    return acc;\n  }, source);\n\n  return true;\n};\n","export const GREEN = \"\\x1b[32m\";\nexport const RED = \"\\x1b[31m\";\nexport const BLUE = \"\\x1b[34m\";\nexport const MAGENTA = \"\\x1b[35m\";\n","import { execSync } from \"child_process\";\n\nimport { GREEN, MAGENTA } from \"./consoleColor\";\n\nexport const checkUncommittedChanges = (): boolean => {\n  const result = execSync(\"git status --porcelain\").toString();\n\n  if (result) {\n    console.log(\n      MAGENTA,\n      \"Working tree is dirty: you might want to commit your changes before running the script\",\n    );\n\n    return true;\n  } else {\n    console.log(GREEN, \"Working tree is clean\");\n\n    return false;\n  }\n};\n","import { writeFileSync } from \"fs\";\nimport { RecursiveStruct } from \"../types\";\n\ninterface writeJsonFileOptions {\n  localeJsonStringifyIndent?: string | number;\n}\n\nexport const writeJsonFile = (\n  filePath: string,\n  data: RecursiveStruct,\n  config: writeJsonFileOptions,\n): void => {\n  const jsonString = JSON.stringify(\n    data,\n    null,\n    config.localeJsonStringifyIndent,\n  );\n  const jsonStringWithNewLine = `${jsonString}\\n`;\n  writeFileSync(filePath, jsonStringWithNewLine);\n};\n","import { createRequire } from \"module\";\n\nimport { RunOptions, UnusedTranslations } from \"../types\";\n\nimport { initialize } from \"../core/initialize\";\nimport { collectUnusedTranslations } from \"../core/translations\";\nimport { generateFilesPaths } from \"../helpers/files\";\nimport { applyToFlatKey } from \"../core/action\";\nimport { checkUncommittedChanges } from \"../helpers/git\";\nimport { importMetaUrl } from \"../helpers/meta\";\n\nimport { GREEN } from \"../helpers/consoleColor\";\nimport { writeJsonFile } from \"../helpers/writeJsonFile\";\n\nexport const removeUnusedTranslations = async (\n  options: RunOptions,\n): Promise<UnusedTranslations> => {\n  const config = await initialize(options);\n\n  const localesFilesPaths = await generateFilesPaths(config.localesPath, {\n    srcExtensions: [\"json\"], // @TODO implement other types when add other types writes\n    fileNameResolver: config.localeNameResolver,\n  });\n\n  const srcFilesPaths = await generateFilesPaths(\n    `${process.cwd()}/${config.srcPath}`,\n    {\n      srcExtensions: config.srcExtensions,\n      ignorePaths: config.ignorePaths,\n      basePath: config.srcPath,\n    },\n  );\n\n  const unusedTranslations = await collectUnusedTranslations(\n    localesFilesPaths,\n    srcFilesPaths,\n    {\n      context: config.context,\n      contextSeparator: config.translationContextSeparator,\n      contextMatcher: config.translationContextMatcher,\n      ignoreComments: config.ignoreComments,\n      localeFileParser: config.localeFileParser,\n      localeFileLoader: config.localeFileLoader,\n      customChecker: config.customChecker,\n      excludeTranslationKey: config.excludeKey,\n      translationKeyMatcher: config.translationKeyMatcher,\n    },\n  );\n\n  if (config.gitCheck) {\n    checkUncommittedChanges();\n  }\n\n  unusedTranslations.translations.forEach((translation) => {\n    const r = createRequire(importMetaUrl());\n    const locale = r(translation.localePath);\n\n    translation.keys.forEach((key) =>\n      applyToFlatKey(\n        locale,\n        key,\n        (source, lastKey) => {\n          delete source[lastKey];\n        },\n        {\n          flatTranslations: config.flatTranslations,\n          separator: config.translationSeparator,\n        },\n      ),\n    );\n\n    writeJsonFile(translation.localePath, locale, config);\n\n    console.log(GREEN, `Successfully removed: ${translation.localePath}`);\n  });\n\n  return unusedTranslations;\n};\n","import { createRequire } from \"module\";\n\nimport { RunOptions, UnusedTranslations } from \"../types\";\n\nimport { initialize } from \"../core/initialize\";\nimport { collectUnusedTranslations } from \"../core/translations\";\nimport { generateFilesPaths } from \"../helpers/files\";\nimport { applyToFlatKey } from \"../core/action\";\nimport { checkUncommittedChanges } from \"../helpers/git\";\nimport { importMetaUrl } from \"../helpers/meta\";\n\nimport { GREEN } from \"../helpers/consoleColor\";\nimport { writeJsonFile } from \"../helpers/writeJsonFile\";\n\nexport const markUnusedTranslations = async (\n  options: RunOptions,\n): Promise<UnusedTranslations> => {\n  const config = await initialize(options);\n\n  const localesFilesPaths = await generateFilesPaths(config.localesPath, {\n    srcExtensions: [\"json\"], // @TODO implement other types when add other types writes\n    fileNameResolver: config.localeNameResolver,\n  });\n\n  const srcFilesPaths = await generateFilesPaths(\n    `${process.cwd()}/${config.srcPath}`,\n    {\n      srcExtensions: config.srcExtensions,\n      ignorePaths: config.ignorePaths,\n      basePath: config.srcPath,\n    },\n  );\n\n  const unusedTranslations = await collectUnusedTranslations(\n    localesFilesPaths,\n    srcFilesPaths,\n    {\n      context: config.context,\n      contextSeparator: config.translationContextSeparator,\n      contextMatcher: config.translationContextMatcher,\n      ignoreComments: config.ignoreComments,\n      localeFileParser: config.localeFileParser,\n      localeFileLoader: config.localeFileLoader,\n      customChecker: config.customChecker,\n      excludeTranslationKey: config.excludeKey,\n      translationKeyMatcher: config.translationKeyMatcher,\n    },\n  );\n\n  if (config.gitCheck) {\n    checkUncommittedChanges();\n  }\n\n  unusedTranslations.translations.forEach((translation) => {\n    const r = createRequire(importMetaUrl());\n    const locale = r(translation.localePath);\n\n    translation.keys.forEach((key) =>\n      applyToFlatKey(\n        locale,\n        key,\n        (source, lastKey) => {\n          source[lastKey] = `${config.marker} ${source[lastKey]}`;\n        },\n        {\n          flatTranslations: config.flatTranslations,\n          separator: config.translationSeparator,\n        },\n      ),\n    );\n\n    writeJsonFile(translation.localePath, locale, config);\n\n    console.log(GREEN, `Successfully marked: ${translation.localePath}`);\n  });\n\n  return unusedTranslations;\n};\n","import { createRequire } from \"module\";\n\nimport { RunOptions, RecursiveStruct } from \"../types\";\n\nimport { initialize } from \"../core/initialize\";\nimport { generateFilesPaths } from \"../helpers/files\";\nimport { checkUncommittedChanges } from \"../helpers/git\";\nimport { importMetaUrl } from \"../helpers/meta\";\n\nimport { GREEN } from \"../helpers/consoleColor\";\nimport { writeJsonFile } from \"../helpers/writeJsonFile\";\n\nexport const mergeLocaleData = (\n  source: RecursiveStruct,\n  target: RecursiveStruct,\n): RecursiveStruct => {\n  const keys = Object.keys(source);\n\n  keys.forEach((key) => {\n    if (typeof source[key] === \"object\") {\n      target[key] = target[key] || {};\n      mergeLocaleData(\n        source[key] as RecursiveStruct,\n        target[key] as RecursiveStruct,\n      );\n    } else {\n      target[key] = target[key] || source[key];\n    }\n  });\n\n  return target;\n};\n\nexport const syncTranslations = async (\n  source: string,\n  target: string,\n  options: RunOptions,\n): Promise<boolean> => {\n  const config: RunOptions = await initialize(options);\n\n  const [sourcePath] = await generateFilesPaths(config.localesPath, {\n    fileNameResolver: (n) => n === source,\n  });\n  const [targetPath] = await generateFilesPaths(config.localesPath, {\n    fileNameResolver: (n) => n === target,\n  });\n\n  const r = createRequire(importMetaUrl());\n  const sourceLocale = r(sourcePath);\n  const targetLocale = r(targetPath);\n\n  const mergedLocale = mergeLocaleData(sourceLocale, targetLocale);\n\n  if (config.gitCheck) {\n    checkUncommittedChanges();\n  }\n\n  writeJsonFile(targetPath, mergedLocale, config);\n\n  console.log(GREEN, \"Translations are synchronized\");\n\n  return true;\n};\n"],"names":["importMetaUrl","import","getFileSizeKb","str","Buffer","byteLength","isNodeVersion22OrAbove","version","process","match","parseInt","resolveFile","filePath","resolver","m","loader","ext","tsImport","compile","includes","r","createRequire","useFileNameResolver","name","RegExp","test","generateFilesPaths","srcPath","basePath","ignorePaths","srcExtensions","fileNameResolver","entries","FsPromises","readdir","withFileTypes","files","reduce","accPromise","dirent","nextPath","path","resolve","acc","fullBasePath","cwd","pathFromBasePath","relative","isDirectory","some","ignorePath","startsWith","generatedNextPath","push","fileName","basename","validExtension","_ext","Promise","parseRegex","parts","split","replace","defaultValues","context","excludeKey","marker","ignoreComments","flatTranslations","translationSeparator","translationContextSeparator","translationContextMatcher","translationKeyMatcher","localeFileParser","default","missedTranslationParser","localeJsonStringifyIndent","initialize","inlineOptions","config","base","configFile","fs","existsSync","potentialRegex","forEach","value","Object","prototype","hasOwnProperty","call","e","localesPath","Error","localesExtensions","localeNameResolver","generateTranslationsFlatKeys","source","parent","keys","contextSeparator","contextMatcher","key","flatKey","Array","isArray","getKeyWithoutContext","resultKeys","filter","k","every","ek","Set","splitted","length","lastPart","slice","join","replaceQuotes","v","isStaticKey","isDynamicKey","isInlineComment","isHTMLComment","isStartOfMultilineComment","isEndOfMultilineComment","removeComments","fileTxt","skip","_str","trim","collectUnusedTranslations","localesPaths","srcFilesPaths","localeFileLoader","customChecker","excludeTranslationKey","translations","localePath","locale","translationsKeys","file","readFileSync","toString","matchKeys","matchKeysSet","matchKeysSetArrStr","splice","indexOf","count","totalCount","collectMissedTranslations","flatKeys","asyncAcc","filesMissedTranslationsKeys","map","translation","staticKeys","dynamicKeys","staticCount","dynamicCount","totalStaticCount","c","totalDynamicCount","displayUnusedTranslations","options","localesFilesPaths","unusedTranslations","console","log","table","Translation","failOnUnused","exitCode","displayMissedTranslations","missedTranslations","Key","failOnMissed","applyToFlatKey","cb","separatedKey","separator","keyLength","_k","i","GREEN","MAGENTA","checkUncommittedChanges","result","execSync","writeJsonFile","data","jsonString","JSON","stringify","jsonStringWithNewLine","writeFileSync","removeUnusedTranslations","gitCheck","lastKey","markUnusedTranslations","mergeLocaleData","target","syncTranslations","sourcePath","n","targetPath","sourceLocale","targetLocale","mergedLocale"],"mappings":"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"}