docs: function create(options) {
    console.log('Creating app: ', options.name);
  
    if (!options.status)
      options.status = (code, msg) => {
        console.log(msg);
      };
    if (!options.type) options.type = 'rekit-react';
  
    const prjDir = path.join(options.location || process.cwd(), options.name);
    return new Promise(async (resolve, reject) => {
      try {
        if (fs.existsSync(prjDir)) {
          reject('FOLDER_EXISTS');
          return;
        }
        fs.mkdirSync(prjDir);
        let gitRepo;
        if (options.source) {
          if (/^https?:/.test(options.source)) {
            // It's a git repo
            gitRepo = options.source;
          } else {
            // It's a local folder
            const srcDir = path.isAbsolute(options.source)
              ? options.source
              : path.join(process.cwd(), options.source);
            options.status('CREATE_APP_COPY_FILES', `Copy files from ${srcDir}...`);
            await fs.copy(srcDir, prjDir, {
              filter: src => !/\/(\.git|node_modules\/|node_modules$)/.test(src) || path.basename(src) === '.gitignore',
            });
          }
        } else if (options.type) {
          // Get gitRepo
          options.status(
            'QUERY_APP_TYPES_GIT_REPO',
            `Looking for the git repo for app type ${options.type}...`,
          );
          const appTypes = await getAppTypes();
          const appType = _.find(appTypes, { id: options.type });
          if (!appType) reject('APP_TYPE_NOT_SUPPORTED');
          gitRepo = appType.repo;
        } else {
          await fs.remove(prjDir);
          reject('NO_SOURCE_OR_APP_TYPE');
        }
  
        if (gitRepo) {
          options.status('CLONE_PROJECT', `Downloading project from ${gitRepo}...`);
          await cloneRepo(gitRepo, prjDir);
        }
  
        postCreate(prjDir, options);
        options.status('CREATION_SUCCESS', '😃App creation success.');
        resolve();
      } catch (err) {
        console.log('Failed to create project.');
        fs.removeSync(prjDir);
        reject(err);
      }
    });
  }