lib/plugins/console/deploy.ts

Summary

Maintainability
A
1 hr
Test Coverage
import { exists } from 'hexo-fs';
import { underline, magenta } from 'picocolors';
import type Hexo from '../../hexo';

interface DeployArgs {
  _?: string[]
  g?: boolean
  generate?: boolean
  [key: string]: any
}

function deployConsole(this: Hexo, args: DeployArgs) {
  let config = this.config.deploy;
  const deployers = this.extend.deployer.list();

  if (!config) {
    let help = '';

    help += 'You should configure deployment settings in _config.yml first!\n\n';
    help += 'Available deployer plugins:\n';
    help += `  ${Object.keys(deployers).join(', ')}\n\n`;
    help += `For more help, you can check the online docs: ${underline('https://hexo.io/')}`;

    console.log(help);
    return;
  }

  let promise;

  if (args.g || args.generate) {
    promise = this.call('generate', args);
  } else {
    promise = exists(this.public_dir).then(exist => {
      if (!exist) return this.call('generate', args);
    });
  }

  return promise.then(() => {
    this.emit('deployBefore');

    if (!Array.isArray(config)) config = [config];
    return config;
  }).each(item => {
    if (!item.type) return;

    const { type } = item;

    if (!deployers[type]) {
      this.log.error('Deployer not found: %s', magenta(type));
      return;
    }

    this.log.info('Deploying: %s', magenta(type));

    // eslint-disable-next-line no-extra-parens
    return (Reflect.apply(deployers[type], this, [{ ...item, ...args }]) as any).then(() => {
      this.log.info('Deploy done: %s', magenta(type));
    });
  }).then(() => {
    this.emit('deployAfter');
  });
}

export = deployConsole;