mirror of
https://github.com/strapi/strapi.git
synced 2025-07-18 22:45:47 +00:00

Create starter CLI Add spaces option Extract project basename Add starter shortcut Refactor git init commit Replace concurrently with npm-run-all Move fetch repo function to dedicated file Allow shortcut to accept external org repo Fix package config & readme Fix versions Add task prefixes Update readme [Starter CLI] error handling (#9600) * Display error message + help for missing arguments * Add cleaner error messages * Bump commander from v6.1.0 to v7.1.0 * Capture and log errors from commander * Simplify cli argument errors * Provide more human readable error messages * Replace throw with console log * Add logger Add starter tracking Add wrapper for tracking keys Update root config Keep template in scope root fix strapi config Fix open frontend Remove open-cli Update for rename frontend->starter update description Update tracking Fix tests fix e2e tests Make sure packageJsonStrapi does not override unwanted keys & make it optional to avoid errors simplify metadata strapi Allow stater or frontend folder for smooth migration of existing starters Udpate dep Handle error
184 lines
5.3 KiB
JavaScript
184 lines
5.3 KiB
JavaScript
'use strict';
|
|
|
|
const { join } = require('path');
|
|
const fse = require('fs-extra');
|
|
const chalk = require('chalk');
|
|
const execa = require('execa');
|
|
const ora = require('ora');
|
|
const _ = require('lodash');
|
|
|
|
const stopProcess = require('./utils/stop-process');
|
|
const { trackUsage, captureStderr } = require('./utils/usage');
|
|
const mergeTemplate = require('./utils/merge-template.js');
|
|
|
|
const packageJSON = require('./resources/json/package.json');
|
|
const createDatabaseConfig = require('./resources/templates/database.js');
|
|
const createServerConfig = require('./resources/templates/server.js');
|
|
|
|
module.exports = async function createProject(scope, { client, connection, dependencies }) {
|
|
console.log('Creating files.');
|
|
|
|
const { rootPath } = scope;
|
|
const resources = join(__dirname, 'resources');
|
|
|
|
try {
|
|
// copy files
|
|
await fse.copy(join(resources, 'files'), rootPath);
|
|
|
|
// copy dot files
|
|
const dotFiles = await fse.readdir(join(resources, 'dot-files'));
|
|
await Promise.all(
|
|
dotFiles.map(name => {
|
|
return fse.copy(join(resources, 'dot-files', name), join(rootPath, `.${name}`));
|
|
})
|
|
);
|
|
|
|
await trackUsage({ event: 'didCopyProjectFiles', scope });
|
|
|
|
// copy templates
|
|
await fse.writeJSON(
|
|
join(rootPath, 'package.json'),
|
|
packageJSON({
|
|
strapiDependencies: scope.strapiDependencies,
|
|
additionalsDependencies: dependencies,
|
|
strapiVersion: scope.strapiVersion,
|
|
projectName: _.kebabCase(scope.name),
|
|
uuid: scope.uuid,
|
|
packageJsonStrapi: scope.packageJsonStrapi,
|
|
}),
|
|
{
|
|
spaces: 2,
|
|
}
|
|
);
|
|
|
|
await trackUsage({ event: 'didWritePackageJSON', scope });
|
|
|
|
// ensure node_modules is created
|
|
await fse.ensureDir(join(rootPath, 'node_modules'));
|
|
|
|
// create config/database.js
|
|
await fse.writeFile(
|
|
join(rootPath, `config/database.js`),
|
|
createDatabaseConfig({
|
|
client,
|
|
connection,
|
|
})
|
|
);
|
|
|
|
// create config/server.js
|
|
await fse.writeFile(join(rootPath, `config/server.js`), createServerConfig());
|
|
await trackUsage({ event: 'didCopyConfigurationFiles', scope });
|
|
|
|
// merge template files if a template is specified
|
|
const hasTemplate = Boolean(scope.template);
|
|
if (hasTemplate) {
|
|
try {
|
|
await mergeTemplate(scope, rootPath);
|
|
} catch (error) {
|
|
throw new Error(`⛔️ Template installation failed: ${error.message}`);
|
|
}
|
|
}
|
|
} catch (err) {
|
|
await fse.remove(scope.rootPath);
|
|
throw err;
|
|
}
|
|
|
|
await trackUsage({ event: 'willInstallProjectDependencies', scope });
|
|
|
|
const installPrefix = chalk.yellow('Installing dependencies:');
|
|
const loader = ora(installPrefix).start();
|
|
|
|
const logInstall = (chunk = '') => {
|
|
loader.text = `${installPrefix} ${chunk
|
|
.toString()
|
|
.split('\n')
|
|
.join(' ')}`;
|
|
};
|
|
|
|
try {
|
|
if (scope.installDependencies !== false) {
|
|
const runner = runInstall(scope);
|
|
|
|
runner.stdout.on('data', logInstall);
|
|
runner.stderr.on('data', logInstall);
|
|
|
|
await runner;
|
|
}
|
|
|
|
loader.stop();
|
|
console.log(`Dependencies installed ${chalk.green('successfully')}.`);
|
|
|
|
await trackUsage({ event: 'didInstallProjectDependencies', scope });
|
|
} catch (error) {
|
|
loader.stop();
|
|
await trackUsage({
|
|
event: 'didNotInstallProjectDependencies',
|
|
scope,
|
|
error: error.stderr.slice(-1024),
|
|
});
|
|
|
|
console.error(`${chalk.red('Error')} while installing dependencies:`);
|
|
console.error(error.stderr);
|
|
|
|
await captureStderr('didNotInstallProjectDependencies', error);
|
|
|
|
console.log(chalk.black.bgWhite(' Keep trying! '));
|
|
console.log();
|
|
console.log(
|
|
chalk.bold(
|
|
'Oh, it seems that you encountered errors while installing dependencies in your project.'
|
|
)
|
|
);
|
|
console.log(`Don't give up, your project was created correctly.`);
|
|
console.log(
|
|
`Fix the issues mentioned in the installation errors and try to run the following command:`
|
|
);
|
|
console.log();
|
|
console.log(
|
|
`cd ${chalk.green(rootPath)} && ${chalk.cyan(scope.useYarn ? 'yarn' : 'npm')} install`
|
|
);
|
|
console.log();
|
|
|
|
stopProcess();
|
|
}
|
|
|
|
await trackUsage({ event: 'didCreateProject', scope });
|
|
|
|
console.log();
|
|
console.log(`Your application was created at ${chalk.green(rootPath)}.\n`);
|
|
|
|
const cmd = chalk.cyan(scope.useYarn ? 'yarn' : 'npm run');
|
|
|
|
console.log('Available commands in your project:');
|
|
console.log();
|
|
console.log(` ${cmd} develop`);
|
|
console.log(' Start Strapi in watch mode.');
|
|
console.log();
|
|
console.log(` ${cmd} start`);
|
|
console.log(' Start Strapi without watch mode.');
|
|
console.log();
|
|
console.log(` ${cmd} build`);
|
|
console.log(' Build Strapi admin panel.');
|
|
console.log();
|
|
console.log(` ${cmd} strapi`);
|
|
console.log(` Display all available commands.`);
|
|
console.log();
|
|
console.log('You can start by doing:');
|
|
console.log();
|
|
console.log(` ${chalk.cyan('cd')} ${rootPath}`);
|
|
console.log(` ${cmd} develop`);
|
|
console.log();
|
|
};
|
|
|
|
const installArguments = ['install', '--production', '--no-optional'];
|
|
function runInstall({ rootPath, useYarn }) {
|
|
if (useYarn) {
|
|
return execa('yarnpkg', installArguments, {
|
|
cwd: rootPath,
|
|
stdin: 'ignore',
|
|
});
|
|
}
|
|
|
|
return execa('npm', installArguments, { cwd: rootPath, stdin: 'ignore' });
|
|
}
|