"use strict";

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

function _jsonFile() {
  const data = _interopRequireDefault(require("@expo/json-file"));

  _jsonFile = function () {
    return data;
  };

  return data;
}

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

  _spawnAsync = function () {
    return data;
  };

  return data;
}

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

  _path = function () {
    return data;
  };

  return data;
}

function _fs() {
  const data = _interopRequireDefault(require("fs"));

  _fs = function () {
    return data;
  };

  return data;
}

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _CommandError() {
  const data = _interopRequireDefault(require("../../CommandError"));

  _CommandError = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = _interopRequireDefault(require("../../log"));

  _log = function () {
    return data;
  };

  return data;
}

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

async function findProjectRootAsync(base) {
  let previous = null;
  let dir = base;

  do {
    let pkgPath = _path().default.join(dir, 'package.json');

    let appJsonPath = _path().default.join(dir, 'app.json');

    let pkgExists = _fs().default.existsSync(pkgPath);

    let appJsonExists = _fs().default.existsSync(appJsonPath);

    if (pkgExists && appJsonExists) {
      let pkg = await _jsonFile().default.readAsync(pkgPath);
      let expo = await _jsonFile().default.getAsync(_path().default.join(dir, 'app.json'), 'expo', null);
      let workflow;

      if (expo && pkg.dependencies && pkg.dependencies.hasOwnProperty('react-native-unimodules')) {
        workflow = 'bare';
      } else if (!expo) {
        workflow = 'bare';
      } else {
        workflow = 'managed';
      }

      return {
        projectRoot: dir,
        workflow
      };
    } else if (pkgExists && !appJsonExists) {
      return {
        projectRoot: dir,
        workflow: 'bare'
      };
    }

    previous = dir;
    dir = _path().default.dirname(dir);
  } while (dir !== previous);

  throw new (_CommandError().default)('NO_PROJECT', 'No managed or bare projects found. Please make sure you are inside a project folder.');
}

async function validateGitStatusAsync() {
  let workingTreeStatus = 'unknown';

  try {
    let result = await (0, _spawnAsync().default)('git', ['status', '--porcelain']);
    workingTreeStatus = result.stdout === '' ? 'clean' : 'dirty';
  } catch (e) {// Maybe git is not installed?
    // Maybe this project is not using git?
  }

  if (workingTreeStatus === 'clean') {
    _log().default.nested(`Your git working tree is ${_chalk().default.green('clean')}`);

    _log().default.nested('To revert the changes after this command completes, you can run the following:');

    _log().default.nested('  git clean --force && git reset --hard');

    return true;
  } else if (workingTreeStatus === 'dirty') {
    _log().default.nested(`${_chalk().default.bold('Warning!')} Your git working tree is ${_chalk().default.red('dirty')}.`);

    _log().default.nested(`It's recommended to ${_chalk().default.bold('commit all your changes before proceeding')},\nso you can revert the changes made by this command if necessary.`);
  } else {
    _log().default.nested("We couldn't find a git repository in your project directory.");

    _log().default.nested("It's recommended to back up your project before proceeding.");
  }

  return false;
}
//# sourceMappingURL=../../__sourcemaps__/commands/utils/ProjectUtils.js.map