{"version":3,"sources":["../src/constants/env.ts","../src/constants/paths.ts","../src/helpers/libreoffice.ts","../src/helpers/child-process.ts","../src/helpers/fs.ts","../src/helpers/primitives.ts","../src/libreoffice-file-converter.ts"],"names":["PROGRAM_FILES","PROGRAM_FILES_86","DARWIN_PATHS","LINUX_PATHS","WIN32_PATHS","join","process","env","getLibreOfficeExecutablePaths","platform","getLibreOfficeExecutablePath","binaryPaths","paths","existingPaths","Promise","all","map","path","access","filter","Boolean","Error","getLibreOfficeInitCommandArgs","installationDir","args","length","push","pathToFileURL","toString","getLibreOfficeConvertCommandArgs","inputPath","outputDir","format","inputFilter","outputFilter","filterSegment","hasLibreOfficeError","stderr","toLowerCase","includes","isBuffer","value","Buffer","processOutputToString","processOutput","execFileAsync","options","debug","startTime","performance","now","resolve","reject","execFile","error","stdout","stderrString","stdoutString","debugInfo","inspect","executionTime","colors","sorted","write","libreOfficeError","getTemporaryFilePath","temporaryDir","getProcessedFilePath","temporaryDirPath","insideTemporaryDir","startsWith","inputPathSegments","split","sep","inputFileNameSegment","inputFileNameSegments","inputFileName","slice","writeStream","readStream","createWriteStream","pipeline","isObject","item","Array","isArray","deepMerge","objects","reduce","target","source","Object","keys","forEach","key","targetValue","sourceValue","LibreOfficeFileConverter","constructor","_options","setGracefulCleanup","convert","callOptions","mergedOptions","mergeOptions","tmpOptions","dir","prefix","unsafeCleanup","read","init","childProcessOptions","libreOfficeExecutablePath","libreOfficeCommandArgs","getInstallationDir","output","processedFilePath","readFile","outputPath","stream","createReadStream","input","temporaryFilePath","buffer","writeFile"],"mappings":"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","file":"index.mjs","sourcesContent":["export const PROGRAM_FILES = 'PROGRAMFILES';\n\nexport const PROGRAM_FILES_86 = 'PROGRAMFILES(X86)';\n","import { join } from 'node:path';\nimport process from 'node:process';\n\nimport { PROGRAM_FILES, PROGRAM_FILES_86 } from './env';\n\nexport const DARWIN_PATHS = (): readonly string[] => ['/Applications/LibreOffice.app/Contents/MacOS/soffice'];\n\nexport const LINUX_PATHS = (): readonly string[] => [\n  '/usr/bin/libreoffice',\n  '/usr/bin/soffice',\n  '/snap/bin/libreoffice',\n  '/opt/libreoffice/program/soffice',\n  '/opt/libreoffice7.6/program/soffice',\n];\n\nexport const WIN32_PATHS = (): readonly string[] => [\n  join(process.env[PROGRAM_FILES_86] || '', 'LIBREO~1/program/soffice.exe'),\n  join(process.env[PROGRAM_FILES_86] || '', 'LibreOffice/program/soffice.exe'),\n  join(process.env[PROGRAM_FILES] || '', 'LibreOffice/program/soffice.exe'),\n];\n","import { access } from 'node:fs/promises';\nimport process from 'node:process';\nimport { pathToFileURL } from 'node:url';\n\nimport { DARWIN_PATHS, LINUX_PATHS, WIN32_PATHS } from '../constants';\n\nexport const getLibreOfficeExecutablePaths = (): readonly string[] => {\n  if (process.platform === 'darwin') {\n    return DARWIN_PATHS();\n  }\n\n  if (process.platform === 'linux') {\n    return LINUX_PATHS();\n  }\n\n  if (process.platform === 'win32') {\n    return WIN32_PATHS();\n  }\n\n  return [];\n};\n\nexport const getLibreOfficeExecutablePath = async (binaryPaths: readonly string[] = []): Promise<string> => {\n  const paths = [...binaryPaths, ...getLibreOfficeExecutablePaths()];\n\n  const existingPaths = await Promise.all(\n    paths.map(async (path) => {\n      try {\n        await access(path);\n      } catch {\n        return false;\n      }\n\n      return path;\n    }),\n  );\n\n  const [path] = existingPaths.filter(Boolean);\n\n  if (!path) {\n    throw new Error('Could not find soffice binary');\n  }\n\n  return path;\n};\n\nexport const getLibreOfficeInitCommandArgs = (installationDir: string): readonly string[] => {\n  const args: string[] = [];\n\n  if (installationDir && installationDir.length > 0) {\n    args.push(`-env:UserInstallation=${pathToFileURL(installationDir).toString()}`);\n  }\n\n  args.push('--headless', '--terminate_after_init');\n\n  return args;\n};\n\nexport const getLibreOfficeConvertCommandArgs = (\n  installationDir: string,\n  inputPath: string,\n  outputDir: string,\n  format: string,\n  inputFilter?: string,\n  outputFilter?: string,\n): readonly string[] => {\n  const filterSegment = outputFilter && outputFilter.length > 0 ? `:${outputFilter}` : '';\n\n  const args: string[] = [];\n\n  if (installationDir && installationDir.length > 0) {\n    args.push(`-env:UserInstallation=${pathToFileURL(installationDir).toString()}`);\n  }\n\n  args.push('--headless');\n\n  if (inputFilter && inputFilter.length > 0) {\n    args.push(`--infilter=${inputFilter}`);\n  }\n\n  args.push('--convert-to', `${format}${filterSegment}`, '--outdir', outputDir, inputPath);\n\n  return args;\n};\n\nexport const hasLibreOfficeError = (stderr: string): boolean => {\n  return stderr?.toLowerCase()?.includes('error:');\n};\n","import { Buffer } from 'node:buffer';\nimport { execFile } from 'node:child_process';\nimport type { ExecFileOptions } from 'node:child_process';\nimport process from 'node:process';\nimport { inspect } from 'node:util';\n\nimport { hasLibreOfficeError } from './libreoffice';\n\nconst isBuffer = (value: unknown): value is Buffer => {\n  return Buffer.isBuffer(value);\n};\n\nconst processOutputToString = (processOutput: string | Buffer): string => {\n  return isBuffer(processOutput) ? processOutput.toString('utf-8') : processOutput;\n};\n\nexport const execFileAsync = (\n  path: string,\n  args: readonly string[],\n  options?: ExecFileOptions,\n  debug?: boolean,\n): Promise<void> => {\n  let startTime: number;\n\n  if (debug) {\n    startTime = performance.now();\n  }\n\n  return new Promise((resolve, reject) => {\n    execFile(path, args, options, (error, stdout, stderr) => {\n      const stderrString = processOutputToString(stderr);\n      const stdoutString = processOutputToString(stdout);\n\n      if (debug) {\n        const debugInfo = inspect(\n          {\n            args,\n            executionTime: performance.now() - startTime,\n            path,\n            stderr: stderrString,\n            stdout: stdoutString,\n          },\n          {\n            colors: true,\n            sorted: true,\n          },\n        );\n\n        process.stdout.write(`LibreOffice debug output:\\n${debugInfo}\\n`);\n      }\n\n      const libreOfficeError = hasLibreOfficeError(stderrString);\n\n      if (error || libreOfficeError) {\n        return reject(error || new Error(stderrString));\n      }\n\n      return resolve();\n    });\n  });\n};\n","import { createWriteStream } from 'node:fs';\nimport { join, sep } from 'node:path';\nimport { pipeline } from 'node:stream';\nimport type { Readable } from 'node:stream';\n\nexport const getTemporaryFilePath = (temporaryDir: string): string => {\n  return join(temporaryDir, 'source');\n};\n\nexport const getProcessedFilePath = (temporaryDirPath: string, inputPath: string, format: string): string => {\n  const insideTemporaryDir = inputPath.startsWith(temporaryDirPath);\n\n  if (insideTemporaryDir) {\n    return `${inputPath}.${format}`;\n  }\n\n  const inputPathSegments = inputPath.split(sep);\n  const inputFileNameSegment =\n    inputPathSegments.length > 0 ? inputPathSegments[inputPathSegments.length - 1] : inputPathSegments[0];\n  const inputFileNameSegments = inputFileNameSegment?.split('.');\n\n  const inputFileName =\n    inputFileNameSegments?.length && inputFileNameSegments.length > 1\n      ? inputFileNameSegments?.slice(0, -1).join('.')\n      : inputFileNameSegments?.[0];\n\n  return `${temporaryDirPath}${sep}${inputFileName}.${format}`;\n};\n\nexport const writeStream = (path: string, readStream: Readable): Promise<void> => {\n  return new Promise((resolve, reject) => {\n    const writeStream = createWriteStream(path);\n\n    pipeline(readStream, writeStream, (error) => {\n      if (error) {\n        return reject(error);\n      }\n\n      return resolve();\n    });\n  });\n};\n","export const isObject = (item: unknown): item is Record<string, unknown> => {\n  return Boolean(item && typeof item === 'object' && !Array.isArray(item));\n};\n\nexport const deepMerge = <T extends Record<string, unknown>>(...objects: readonly T[]): T => {\n  return objects.reduce<T>((target, source) => {\n    Object.keys(source).forEach((key: keyof T) => {\n      const targetValue = target[key];\n      const sourceValue = source[key];\n\n      if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n        target[key] = [...targetValue, ...sourceValue] as T[keyof T];\n\n        return;\n      }\n\n      if (isObject(targetValue) && isObject(sourceValue)) {\n        target[key] = deepMerge(targetValue, sourceValue);\n\n        return;\n      }\n\n      target[key] = sourceValue;\n    });\n\n    return target;\n  }, {} as T);\n};\n","import type { Buffer } from 'node:buffer';\nimport { createReadStream } from 'node:fs';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport type { Readable } from 'node:stream';\nimport { dir, setGracefulCleanup } from 'tmp-promise';\n\nimport {\n  deepMerge,\n  execFileAsync,\n  getLibreOfficeConvertCommandArgs,\n  getLibreOfficeExecutablePath,\n  getLibreOfficeInitCommandArgs,\n  getProcessedFilePath,\n  getTemporaryFilePath,\n  writeStream,\n} from './helpers';\nimport type {\n  ConvertOptions,\n  ConvertOptionsInput,\n  ConvertOutputOptionsBuffer,\n  ConvertOutputOptionsFile,\n  ConvertOutputOptionsStream,\n  InitOptions,\n  InstallationDir,\n  LibreOfficeFileConverterOptions,\n} from './types';\n\n/**\n * Simple NodeJS wrapper for libreoffice CLI for converting office documents to different formats.\n *\n * @example\n * ```ts\n * const libreOfficeFileConverter = new LibreOfficeFileConverter({ childProcessOptions: { timeout: 60 * 1000 } });\n * ```\n *\n * @class\n * @public\n */\nexport class LibreOfficeFileConverter {\n  private readonly _options: LibreOfficeFileConverterOptions;\n\n  /**\n   * Create an instance of the LibreOfficeFileConverter.\n   *\n   * @example\n   * ```ts\n   * const libreOfficeFileConverter = new LibreOfficeFileConverter({ childProcessOptions: { timeout: 60 * 1000 } });\n   * ```\n   *\n   * @param options The LibreOfficeFileConverter options.\n   *\n   * @constructor\n   * @public\n   */\n  constructor(options: LibreOfficeFileConverterOptions = {}) {\n    this._options = options;\n\n    setGracefulCleanup();\n  }\n\n  /**\n   * Converts provided input to the requested format.\n   *\n   * @example\n   * ```ts\n   * const outputBuffer = await libreOfficeFileConverter.convert({\n   *  buffer: inputBuffer,\n   *  format: 'pdf',\n   *  input: 'buffer',\n   *  output: 'buffer',\n   * });\n   * ```\n   *\n   * @param options Convert options: input and output type, format, filter, converter options.\n   *\n   * @returns Buffer of the converted input.\n   *\n   * @overload\n   * @public\n   */\n  public async convert(options: ConvertOptionsInput & ConvertOutputOptionsBuffer): Promise<Buffer>;\n\n  /**\n   * Converts provided input to the requested format.\n   *\n   * @example\n   * ```ts\n   * await libreOfficeFileConverter.convert({\n   *  format: 'pdf',\n   *  input: 'file',\n   *  inputPath,\n   *  output: 'file',\n   *  outputPath,\n   * });\n   * ```\n   *\n   * @param options Convert options: input and output type, format, filter, converter options.\n   *\n   * @overload\n   * @public\n   */\n  public async convert(options: ConvertOptionsInput & ConvertOutputOptionsFile): Promise<void>;\n\n  /**\n   * Converts provided input to the requested format.\n   *\n   * @example\n   * ```ts\n   * const outputStream = await libreOfficeFileConverter.convert({\n   *  format: 'pdf',\n   *  input: 'stream',\n   *  stream: inputStream,\n   *  output: 'stream',\n   * });\n   * ```\n   *\n   * @param options Convert options: input and output type, format, filter, converter options.\n   *\n   * @returns Readable stream of the converted input.\n   *\n   * @overload\n   * @public\n   */\n  public async convert(options: ConvertOptionsInput & ConvertOutputOptionsStream): Promise<Readable>;\n\n  /**\n   * Converts provided input to the requested format.\n   *\n   * @example\n   * ```ts\n   * const outputBuffer = await libreOfficeFileConverter.convert({\n   *  buffer: inputBuffer,\n   *  format: 'pdf',\n   *  input: 'buffer',\n   *  output: 'buffer',\n   * });\n   * ```\n   *\n   * @param options Convert options: input and output type, format, filter, converter options.\n   *\n   * @returns Buffer, readable stream or void depending on the convert options.\n   *\n   * @public\n   */\n  public async convert(options: ConvertOptions): Promise<Buffer | Readable | void> {\n    const { filter, format, inputFilter, options: callOptions = {}, outputFilter } = options;\n\n    const mergedOptions = this.mergeOptions(callOptions);\n    const { tmpOptions } = mergedOptions;\n\n    const temporaryDir = await dir({\n      prefix: 'libreoffice-file-converter',\n      unsafeCleanup: true,\n      ...tmpOptions,\n    });\n\n    const inputPath = await this.write(options, temporaryDir.path);\n\n    await this.process(inputPath, temporaryDir.path, format, inputFilter || filter, outputFilter, mergedOptions);\n\n    return this.read(options, temporaryDir.path, inputPath);\n  }\n\n  /**\n   * Initializes LibreOffice installation dir by starting executable in headless mode and then terminating it.\n   *\n   * @example\n   * ```ts\n   * await libreOfficeFileConverter.init({ installationDir: '/home/user/custom-soffice-profile' });\n   * ```\n   *\n   * @param options Init options.\n   *\n   * @public\n   */\n  public async init(options: InitOptions): Promise<void> {\n    const { installationDir, options: callOptions = {} } = options;\n\n    const mergedOptions = this.mergeOptions(callOptions);\n    const { binaryPaths, childProcessOptions, debug } = mergedOptions;\n\n    const libreOfficeExecutablePath = await getLibreOfficeExecutablePath(binaryPaths);\n\n    const libreOfficeCommandArgs = getLibreOfficeInitCommandArgs(installationDir);\n\n    await execFileAsync(libreOfficeExecutablePath, libreOfficeCommandArgs, childProcessOptions, debug);\n  }\n\n  private async getInstallationDir(\n    installationDir: InstallationDir = 'dynamic',\n    options: LibreOfficeFileConverterOptions = {},\n  ): Promise<string> {\n    if (installationDir === 'default') {\n      return '';\n    }\n\n    if (installationDir === 'dynamic') {\n      const { tmpOptions } = options;\n\n      const temporaryDir = await dir({\n        prefix: 'soffice',\n        unsafeCleanup: true,\n        ...tmpOptions,\n      });\n\n      return temporaryDir.path;\n    }\n\n    return installationDir;\n  }\n\n  private mergeOptions(options: LibreOfficeFileConverterOptions = {}): LibreOfficeFileConverterOptions {\n    return deepMerge(this._options, options);\n  }\n\n  private async process(\n    inputPath: string,\n    outputDir: string,\n    format: string,\n    inputFilter?: string,\n    outputFilter?: string,\n    options: LibreOfficeFileConverterOptions = {},\n  ): Promise<void> {\n    const { binaryPaths, childProcessOptions, debug } = options;\n\n    const libreOfficeExecutablePath = await getLibreOfficeExecutablePath(binaryPaths);\n\n    const installationDir = await this.getInstallationDir(options.installationDir, options);\n\n    const libreOfficeCommandArgs = getLibreOfficeConvertCommandArgs(\n      installationDir,\n      inputPath,\n      outputDir,\n      format,\n      inputFilter,\n      outputFilter,\n    );\n\n    await execFileAsync(libreOfficeExecutablePath, libreOfficeCommandArgs, childProcessOptions, debug);\n  }\n\n  private async read(\n    options: ConvertOptions,\n    temporaryDirPath: string,\n    inputPath: string,\n  ): Promise<Buffer | Readable | void> {\n    const { format, output } = options;\n\n    const processedFilePath = getProcessedFilePath(temporaryDirPath, inputPath, format);\n\n    if (output === 'buffer') {\n      return readFile(processedFilePath);\n    }\n\n    if (output === 'file') {\n      const { outputPath } = options;\n\n      const stream = createReadStream(processedFilePath);\n\n      return writeStream(outputPath, stream);\n    }\n\n    if (output === 'stream') {\n      return createReadStream(processedFilePath);\n    }\n  }\n\n  private async write(options: ConvertOptions, temporaryDirPath: string): Promise<string> {\n    const { input } = options;\n\n    const temporaryFilePath = getTemporaryFilePath(temporaryDirPath);\n\n    if (input === 'buffer') {\n      const { buffer } = options;\n\n      await writeFile(temporaryFilePath, buffer);\n\n      return temporaryFilePath;\n    }\n\n    if (input === 'file') {\n      const { inputPath } = options;\n\n      return inputPath;\n    }\n\n    if (input === 'stream') {\n      const { stream } = options;\n\n      await writeStream(temporaryFilePath, stream);\n\n      return temporaryFilePath;\n    }\n\n    return temporaryFilePath;\n  }\n}\n"]}