"use strict";

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

function _react() {
  const data = _interopRequireDefault(require("react"));

  _react = function _react() {
    return data;
  };

  return data;
}

function _assert() {
  const data = _interopRequireDefault(require("assert"));

  _assert = function _assert() {
    return data;
  };

  return data;
}

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

  _chalk = function _chalk() {
    return data;
  };

  return data;
}

function _lodash() {
  const data = require("lodash");

  _lodash = function _lodash() {
    return data;
  };

  return data;
}

var _clearGitCache = _interopRequireDefault(require("./clearGitCache"));

var _addBlock = _interopRequireDefault(require("./addBlock"));

var _list = _interopRequireDefault(require("./list"));

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

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var _default = api => {
  // 注册 区块的 ui
  // 以下场景不启动 ui 功能:
  // 1. ssr 时
  // 2. 非 dev 或 ui 时
  const command = process.argv.slice(2)[0];

  if (process.env.UMI_UI !== 'none' && !api.config.ssr && (command === 'dev' || command === 'ui')) {
    require('./ui/index').default(api);
  }

  const log = api.log,
        debug = api.debug,
        config = api.config;
  const blockConfig = config.block || {};
  debug(`blockConfig ${blockConfig}`);

  function block() {
    return _block.apply(this, arguments);
  }

  function _block() {
    _block = _asyncToGenerator(function* (args = {}, opts = {}) {
      let retCtx;

      switch (args._[0]) {
        case 'clear':
          yield (0, _clearGitCache.default)({
            dryRun: args.dryRun
          }, api);
          break;

        case 'add':
          retCtx = yield (0, _addBlock.default)(_objectSpread({}, args, {
            url: args._[1]
          }), opts, api);
          break;

        case 'list':
          retCtx = yield (0, _list.default)(args, blockConfig, api);
          break;

        default:
          throw new Error(`Please run ${_chalk().default.cyan.underline('umi help block')} to checkout the usage`);
      }

      return retCtx; // return for test
    });
    return _block.apply(this, arguments);
  }

  const details = `

Commands:

  ${_chalk().default.cyan(`add `)}     add a block to your project
  ${_chalk().default.cyan(`list`)}     list all blocks
  ${_chalk().default.cyan(`clear`)}    clear all git cache


Options for the ${_chalk().default.cyan(`add`)} command:

  ${_chalk().default.green(`--path              `)} the file path, default the name in package.json
  ${_chalk().default.green(`--route-path       `)} the route path, default the name in package.json
  ${_chalk().default.green(`--branch            `)} git branch
  ${_chalk().default.green(`--npm-client        `)} the npm client, default npm or yarn (if has yarn.lock)
  ${_chalk().default.green(`--skip-dependencies `)} don't install dependencies
  ${_chalk().default.green(`--skip-modify-routes`)} don't modify the routes
  ${_chalk().default.green(`--dry-run           `)} for test, don't install dependencies and download
  ${_chalk().default.green(`--page              `)} add the block to a independent directory as a page
  ${_chalk().default.green(`--layout            `)} add as a layout block (add route with empty children)
  ${_chalk().default.green(`--js                `)} If the block is typescript, convert to js
  ${_chalk().default.green(`--registry          `)} set up npm installation using the registry
  ${_chalk().default.green(`--uni18n          `)}   remove umi-plugin-locale formatMessage

Examples:

  ${_chalk().default.gray(`# Add block`)}
  umi block add demo
  umi block add ant-design-pro/Monitor

  ${_chalk().default.gray(`# Add block with full url`)}
  umi block add https://github.com/umijs/umi-blocks/tree/master/demo

  ${_chalk().default.gray(`# Add block with specified route path`)}
  umi block add demo --path /foo/bar

  ${_chalk().default.gray(`# List all blocks`)}
  umi block list
  `.trim();
  api.registerCommand('block', {
    description: 'block related commands, e.g. add, list',
    usage: `umi block <command>`,
    details
  }, (args, opts) => {
    // return only for test
    return block(args, opts).catch(e => {
      log.error(e);
    });
  });

  api._registerConfig(() => {
    return () => {
      return {
        name: 'block',

        validate(val) {
          (0, _assert().default)((0, _lodash().isPlainObject)(val), `Configure item block should be Plain Object, but got ${val}.`);
        }

      };
    };
  });
};

exports.default = _default;