"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.extractAsync = extractAsync;

function _fsExtra() {
  const data = _interopRequireDefault(require("fs-extra"));

  _fsExtra = function () {
    return data;
  };

  return data;
}

function _tar() {
  const data = _interopRequireDefault(require("tar"));

  _tar = function () {
    return data;
  };

  return data;
}

function _path() {
  const data = _interopRequireDefault(require("path"));

  _path = function () {
    return data;
  };

  return data;
}

function _spawnAsync() {
  const data = _interopRequireDefault(require("@expo/spawn-async"));

  _spawnAsync = function () {
    return data;
  };

  return data;
}

function _uuid() {
  const data = _interopRequireDefault(require("uuid"));

  _uuid = function () {
    return data;
  };

  return data;
}

function Binaries() {
  const data = _interopRequireWildcard(require("./Binaries"));

  Binaries = function () {
    return data;
  };

  return data;
}

function _UserSettings() {
  const data = _interopRequireDefault(require("./UserSettings"));

  _UserSettings = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

async function _extractWindowsAsync(archive, dir) {
  let dotExpoHomeDirectory = _UserSettings().default.dotExpoHomeDirectory();

  let tmpDir = _path().default.join(dotExpoHomeDirectory, 'tmp', _uuid().default.v4());

  _fsExtra().default.mkdirpSync(tmpDir);

  let binary = _path().default.join(Binaries().getBinariesPath(), '7z1602-extra', '7za');

  try {
    await (0, _spawnAsync().default)(binary, ['x', archive, '-aoa', `-o${tmpDir}`]); // We don't know the resulting filename after this step, so
    // just assume the only file in the directory is our .tar file.
    // This should be fine since we created the directory with a random name.

    let files = _fsExtra().default.readdirSync(tmpDir);

    let outputFile = _path().default.resolve(tmpDir, files[0]);

    await (0, _spawnAsync().default)(binary, ['x', outputFile, '-aoa', `-o${dir}`]);
  } catch (e) {
    console.error(e.message);
    console.error(e.stderr);
    throw e;
  } finally {
    _fsExtra().default.removeSync(tmpDir);
  }
}

async function extractAsync(archive, dir) {
  try {
    if (process.platform === 'win32') {
      await _extractWindowsAsync(archive, dir);
    } else {
      await (0, _spawnAsync().default)('tar', ['-xf', archive, '-C', dir], {
        stdio: 'inherit',
        cwd: __dirname
      });
    }
  } catch (e) {
    // tar node module has previously had problems with big files, and seems to
    // be slower, so only use it as a backup.
    console.error(e.message);
    await _tar().default.extract({
      file: archive,
      cwd: dir
    });
  }
}
//# sourceMappingURL=__sourcemaps__/Extract.js.map