packages/create-ice/src/create.ts (120 lines of code) (raw):
import inquirer from 'inquirer';
import fs from 'fs-extra';
import chalk from 'chalk';
import { checkAliInternal } from 'ice-npm-utils';
import { downloadAndGenerateProject, checkEmpty } from '@iceworks/generate-project';
interface ITemplate {
npmName: string;
description?: string;
}
interface EjsOptions {
iceConfig?: Record<string, any>;
appConfig?: Record<string, any>;
esLintConfigOptions?: string;
}
export default async function create(dirPath: string, templateName: string, dirname: string): Promise<void> {
if (!templateName) {
templateName = await selectTemplate();
}
await fs.ensureDir(dirPath);
const empty = await checkEmpty(dirPath);
if (!empty) {
const { go } = await inquirer.prompt({
type: 'confirm',
name: 'go',
message:
'The existing file in the current directory. Are you sure to continue?',
default: false,
});
if (!go) process.exit(1);
}
let ejsOptions: EjsOptions = {
appConfig: null,
};
let extraDependencies: Record<string, any> = {};
const isAliInternal = await checkAliInternal();
if (isAliInternal) {
ejsOptions = {
...ejsOptions,
iceConfig: {
importDeclarationsStr: 'import def from \'@ali/ice-plugin-def\';\n',
options: {
pluginItemsStr: 'def(),',
},
optionsStr: `plugins: [
def(),
],`,
},
esLintConfigOptions: `{
extends: ['@ali/eslint-config-att/typescript/react']
}`,
};
extraDependencies = {
...extraDependencies,
devDependencies: {
...extraDependencies?.devDependencies || {},
'@ali/eslint-config-att': '^1.0.0',
'@ali/ice-plugin-def': '^1.0.0',
},
};
}
await downloadAndGenerateProject(
dirPath,
templateName,
{
ejsOptions,
extraDependencies,
},
);
console.log();
console.log('Initialize project successfully.');
console.log();
console.log('Starts the development server.');
console.log();
console.log(chalk.cyan(` cd ${dirname}`));
if (isAliInternal) {
console.log(chalk.cyan(' tnpm install'));
console.log(chalk.cyan(' tnpm start'));
console.log(chalk.cyan('Detected that you are an Alibaba user, DEF plugin has been added!'));
} else {
console.log(chalk.cyan(' npm install'));
console.log(chalk.cyan(' npm start'));
}
console.log(chalk.cyan('\n\nWe have prepared develop toolkit for you. \nSee: https://marketplace.visualstudio.com/items?itemName=iceworks-team.iceworks'));
console.log();
}
/**
* 选择使用的模板
*
* @param {String} type project|material|component
*/
async function selectTemplate(): Promise<string> {
const templates: ITemplate[] = [
{
npmName: '@ice/lite-scaffold',
description: 'Web Lite Scaffold',
},
{
npmName: '@ice/antd-pro-scaffold',
description: 'Antd Pro Scaffold',
},
{
npmName: '@ice/fusion-pro-scaffold',
description: 'Fusion Pro Scaffold',
},
{
npmName: '@ice/miniapp-scaffold',
description: 'Miniapp Scaffold',
},
];
const defaultTemplate = templates[0];
const answer = await inquirer.prompt({
type: 'list',
name: 'template',
loop: false,
message: 'Please select a template',
default: defaultTemplate,
choices: templates.map(item => {
return {
name: item.description,
value: item.npmName,
};
}),
});
return answer.template;
}