{"version":3,"sources":["../../../src/writeContentDeclaration/writeContentDeclaration.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport * as fsPromises from 'fs/promises';\nimport { basename, dirname, extname } from 'path';\nimport type { IntlayerConfig } from '@intlayer/config/client';\nimport { prepareContentDeclaration } from '@intlayer/chokidar';\nimport configuration from '@intlayer/config/built';\nimport type { Dictionary } from '@intlayer/core';\nimport dictionariesRecord from '@intlayer/dictionaries-entry';\nimport deepEqual from 'deep-equal';\nimport type { DictionaryStatus } from './dictionaryStatus';\n\nconst DEFAULT_NEW_DICTIONARY_PATH = 'intlayer-dictionaries';\n\nexport const writeContentDeclaration = async (\n  dictionary: Dictionary,\n  config: IntlayerConfig = configuration,\n  newDictionariesPath?: string\n): Promise<{ status: DictionaryStatus; path: string }> => {\n  const { content } = config;\n  const { baseDir } = content;\n\n  const newDictionaryRelativeLocationPath =\n    newDictionariesPath ?? DEFAULT_NEW_DICTIONARY_PATH;\n  const newDictionaryLocationPath = `${baseDir}/${newDictionaryRelativeLocationPath}`;\n\n  const existingDictionary = dictionariesRecord[dictionary.key];\n\n  const preparedContentDeclaration =\n    await prepareContentDeclaration(dictionary);\n\n  const { filePath, $schema, ...dictionaryWithoutPath } =\n    preparedContentDeclaration;\n  const formattedContentDeclaration = {\n    $schema: 'https://intlayer.org/schema.json',\n    ...dictionaryWithoutPath,\n  };\n\n  if (existingDictionary) {\n    // Compare existing dictionary with distant dictionary\n    if (deepEqual(existingDictionary, dictionary)) {\n      // Up to date, nothing to do\n      return {\n        status: 'up-to-date',\n        path: filePath!,\n      };\n    } else {\n      if (filePath) {\n        const isDictionaryJSON = filePath.endsWith('.json');\n\n        if (isDictionaryJSON) {\n          const contentDeclarationPath = `${baseDir}/${filePath}`;\n\n          await writeFileWithDirectories(\n            contentDeclarationPath,\n            formattedContentDeclaration\n          );\n          return { status: 'updated', path: contentDeclarationPath };\n        } else {\n          // Remove the existing dictionary file\n          await fsPromises.rm(filePath);\n\n          // Write the dictionary to the intlayer-dictionaries directory\n          const dictionariesDirPath = dirname(filePath);\n          const dictionariesFileName = basename(filePath, extname(filePath));\n\n          const newFilePath = `${dictionariesDirPath}/${dictionariesFileName}.json`;\n\n          await writeFileWithDirectories(\n            newFilePath,\n            formattedContentDeclaration\n          );\n\n          return {\n            status: 'replaced',\n            path: newFilePath,\n          };\n        }\n      } else {\n        // Write the dictionary to the intlayer-dictionaries directory\n        const contentDeclarationPath = `${newDictionaryLocationPath}/${dictionary.key}.content.json`;\n\n        await writeFileWithDirectories(\n          contentDeclarationPath,\n          formattedContentDeclaration\n        );\n\n        return {\n          status: 'reimported in new location',\n          path: contentDeclarationPath,\n        };\n      }\n    }\n  } else {\n    // No existing dictionary, write to new location\n    const contentDeclarationPath = `${newDictionaryLocationPath}/${dictionary.key}.content.json`;\n\n    await writeFileWithDirectories(\n      contentDeclarationPath,\n      formattedContentDeclaration\n    );\n\n    return {\n      status: 'imported',\n      path: contentDeclarationPath,\n    };\n  }\n};\n\nconst writeFileWithDirectories = async (\n  filePath: string,\n  data: string | Buffer\n): Promise<void> => {\n  try {\n    // Extract the directory from the file path\n    const dir = dirname(filePath);\n\n    // Check if the directory exists\n    const directoryExists = existsSync(dir);\n\n    if (!directoryExists) {\n      // Create the directory recursively\n      await fsPromises.mkdir(dir, { recursive: true });\n    }\n\n    const jsonDictionary = JSON.stringify(data, null, 2);\n\n    // Write the file\n    await fsPromises.writeFile(filePath, jsonDictionary);\n  } catch (error) {\n    throw new Error(`Error writing file to ${filePath}: ${error}`);\n  }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAA2B;AAC3B,iBAA4B;AAC5B,kBAA2C;AAE3C,sBAA0C;AAC1C,mBAA0B;AAE1B,gCAA+B;AAC/B,wBAAsB;AAGtB,MAAM,8BAA8B;AAE7B,MAAM,0BAA0B,OACrC,YACA,SAAyB,aAAAA,SACzB,wBACwD;AACxD,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,oCACJ,uBAAuB;AACzB,QAAM,4BAA4B,GAAG,OAAO,IAAI,iCAAiC;AAEjF,QAAM,qBAAqB,0BAAAC,QAAmB,WAAW,GAAG;AAE5D,QAAM,6BACJ,UAAM,2CAA0B,UAAU;AAE5C,QAAM,EAAE,UAAU,SAAS,GAAG,sBAAsB,IAClD;AACF,QAAM,8BAA8B;AAAA,IAClC,SAAS;AAAA,IACT,GAAG;AAAA,EACL;AAEA,MAAI,oBAAoB;AAEtB,YAAI,kBAAAC,SAAU,oBAAoB,UAAU,GAAG;AAE7C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,IACF,OAAO;AACL,UAAI,UAAU;AACZ,cAAM,mBAAmB,SAAS,SAAS,OAAO;AAElD,YAAI,kBAAkB;AACpB,gBAAM,yBAAyB,GAAG,OAAO,IAAI,QAAQ;AAErD,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,UACF;AACA,iBAAO,EAAE,QAAQ,WAAW,MAAM,uBAAuB;AAAA,QAC3D,OAAO;AAEL,gBAAM,WAAW,GAAG,QAAQ;AAG5B,gBAAM,0BAAsB,qBAAQ,QAAQ;AAC5C,gBAAM,2BAAuB,sBAAS,cAAU,qBAAQ,QAAQ,CAAC;AAEjE,gBAAM,cAAc,GAAG,mBAAmB,IAAI,oBAAoB;AAElE,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF,OAAO;AAEL,cAAM,yBAAyB,GAAG,yBAAyB,IAAI,WAAW,GAAG;AAE7E,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,yBAAyB,GAAG,yBAAyB,IAAI,WAAW,GAAG;AAE7E,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,MAAM,2BAA2B,OAC/B,UACA,SACkB;AAClB,MAAI;AAEF,UAAM,UAAM,qBAAQ,QAAQ;AAG5B,UAAM,sBAAkB,sBAAW,GAAG;AAEtC,QAAI,CAAC,iBAAiB;AAEpB,YAAM,WAAW,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACjD;AAEA,UAAM,iBAAiB,KAAK,UAAU,MAAM,MAAM,CAAC;AAGnD,UAAM,WAAW,UAAU,UAAU,cAAc;AAAA,EACrD,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,yBAAyB,QAAQ,KAAK,KAAK,EAAE;AAAA,EAC/D;AACF;","names":["configuration","dictionariesRecord","deepEqual"]}