{"version":3,"file":"index.mjs","names":[],"sources":["../../../../node_modules/extract-zip/index.js"],"sourcesContent":["const debug = require('debug')('extract-zip')\n// eslint-disable-next-line node/no-unsupported-features/node-builtins\nconst { createWriteStream, promises: fs } = require('fs')\nconst getStream = require('get-stream')\nconst path = require('path')\nconst { promisify } = require('util')\nconst stream = require('stream')\nconst yauzl = require('yauzl')\n\nconst openZip = promisify(yauzl.open)\nconst pipeline = promisify(stream.pipeline)\n\nclass Extractor {\n  constructor (zipPath, opts) {\n    this.zipPath = zipPath\n    this.opts = opts\n  }\n\n  async extract () {\n    debug('opening', this.zipPath, 'with opts', this.opts)\n\n    this.zipfile = await openZip(this.zipPath, { lazyEntries: true })\n    this.canceled = false\n\n    return new Promise((resolve, reject) => {\n      this.zipfile.on('error', err => {\n        this.canceled = true\n        reject(err)\n      })\n      this.zipfile.readEntry()\n\n      this.zipfile.on('close', () => {\n        if (!this.canceled) {\n          debug('zip extraction complete')\n          resolve()\n        }\n      })\n\n      this.zipfile.on('entry', async entry => {\n        /* istanbul ignore if */\n        if (this.canceled) {\n          debug('skipping entry', entry.fileName, { cancelled: this.canceled })\n          return\n        }\n\n        debug('zipfile entry', entry.fileName)\n\n        if (entry.fileName.startsWith('__MACOSX/')) {\n          this.zipfile.readEntry()\n          return\n        }\n\n        const destDir = path.dirname(path.join(this.opts.dir, entry.fileName))\n\n        try {\n          await fs.mkdir(destDir, { recursive: true })\n\n          const canonicalDestDir = await fs.realpath(destDir)\n          const relativeDestDir = path.relative(this.opts.dir, canonicalDestDir)\n\n          if (relativeDestDir.split(path.sep).includes('..')) {\n            throw new Error(`Out of bound path \"${canonicalDestDir}\" found while processing file ${entry.fileName}`)\n          }\n\n          await this.extractEntry(entry)\n          debug('finished processing', entry.fileName)\n          this.zipfile.readEntry()\n        } catch (err) {\n          this.canceled = true\n          this.zipfile.close()\n          reject(err)\n        }\n      })\n    })\n  }\n\n  async extractEntry (entry) {\n    /* istanbul ignore if */\n    if (this.canceled) {\n      debug('skipping entry extraction', entry.fileName, { cancelled: this.canceled })\n      return\n    }\n\n    if (this.opts.onEntry) {\n      this.opts.onEntry(entry, this.zipfile)\n    }\n\n    const dest = path.join(this.opts.dir, entry.fileName)\n\n    // convert external file attr int into a fs stat mode int\n    const mode = (entry.externalFileAttributes >> 16) & 0xFFFF\n    // check if it's a symlink or dir (using stat mode constants)\n    const IFMT = 61440\n    const IFDIR = 16384\n    const IFLNK = 40960\n    const symlink = (mode & IFMT) === IFLNK\n    let isDir = (mode & IFMT) === IFDIR\n\n    // Failsafe, borrowed from jsZip\n    if (!isDir && entry.fileName.endsWith('/')) {\n      isDir = true\n    }\n\n    // check for windows weird way of specifying a directory\n    // https://github.com/maxogden/extract-zip/issues/13#issuecomment-154494566\n    const madeBy = entry.versionMadeBy >> 8\n    if (!isDir) isDir = (madeBy === 0 && entry.externalFileAttributes === 16)\n\n    debug('extracting entry', { filename: entry.fileName, isDir: isDir, isSymlink: symlink })\n\n    const procMode = this.getExtractedMode(mode, isDir) & 0o777\n\n    // always ensure folders are created\n    const destDir = isDir ? dest : path.dirname(dest)\n\n    const mkdirOptions = { recursive: true }\n    if (isDir) {\n      mkdirOptions.mode = procMode\n    }\n    debug('mkdir', { dir: destDir, ...mkdirOptions })\n    await fs.mkdir(destDir, mkdirOptions)\n    if (isDir) return\n\n    debug('opening read stream', dest)\n    const readStream = await promisify(this.zipfile.openReadStream.bind(this.zipfile))(entry)\n\n    if (symlink) {\n      const link = await getStream(readStream)\n      debug('creating symlink', link, dest)\n      await fs.symlink(link, dest)\n    } else {\n      await pipeline(readStream, createWriteStream(dest, { mode: procMode }))\n    }\n  }\n\n  getExtractedMode (entryMode, isDir) {\n    let mode = entryMode\n    // Set defaults, if necessary\n    if (mode === 0) {\n      if (isDir) {\n        if (this.opts.defaultDirMode) {\n          mode = parseInt(this.opts.defaultDirMode, 10)\n        }\n\n        if (!mode) {\n          mode = 0o755\n        }\n      } else {\n        if (this.opts.defaultFileMode) {\n          mode = parseInt(this.opts.defaultFileMode, 10)\n        }\n\n        if (!mode) {\n          mode = 0o644\n        }\n      }\n    }\n\n    return mode\n  }\n}\n\nmodule.exports = async function (zipPath, opts) {\n  debug('creating target directory', opts.dir)\n\n  if (!path.isAbsolute(opts.dir)) {\n    throw new Error('Target directory is expected to be absolute')\n  }\n\n  await fs.mkdir(opts.dir, { recursive: true })\n  opts.dir = await fs.realpath(opts.dir)\n  return new Extractor(zipPath, opts).extract()\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}