@strapi/generate-new
Version:
Generate a new Strapi application.
1 lines • 12.3 kB
Source Map (JSON)
{"version":3,"file":"create-project.mjs","sources":["../src/create-project.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport { join } from 'path';\nimport fse from 'fs-extra';\nimport chalk from 'chalk';\nimport execa from 'execa';\nimport ora from 'ora';\nimport _ from 'lodash';\n\nimport stopProcess from './utils/stop-process';\nimport { trackUsage, captureStderr } from './utils/usage';\nimport mergeTemplate from './utils/merge-template.js';\nimport tryGitInit from './utils/git';\n\nimport packageJSON from './resources/json/common/package.json';\nimport jsconfig from './resources/json/js/jsconfig.json';\nimport adminTsconfig from './resources/json/ts/tsconfig-admin.json';\nimport serverTsconfig from './resources/json/ts/tsconfig-server.json';\nimport { createDatabaseConfig, generateDbEnvariables } from './resources/templates/database';\nimport createEnvFile from './resources/templates/env';\nimport { Configuration, Scope, isStderrError } from './types';\n\nexport default async function createProject(\n scope: Scope,\n { client, connection, dependencies }: Configuration\n) {\n console.log(`Creating a new Strapi application at ${chalk.green(scope.rootPath)}.`);\n console.log('Creating files.');\n\n const { rootPath, useTypescript } = scope;\n const resources = join(__dirname, 'resources');\n\n const language = useTypescript ? 'ts' : 'js';\n\n try {\n // copy files\n await fse.copy(join(resources, 'files', language), rootPath);\n\n // copy dot files\n await fse.writeFile(join(rootPath, '.env'), createEnvFile());\n\n const copyDotFilesFromSubDirectory = (subDirectory: string) => {\n const files = fse.readdirSync(join(resources, 'dot-files', subDirectory));\n\n return Promise.all(\n files.map((file) => {\n const src = join(resources, 'dot-files', subDirectory, file);\n const dest = join(rootPath, `.${file}`);\n return fse.copy(src, dest);\n })\n );\n };\n\n // Copy common dot files\n copyDotFilesFromSubDirectory('common');\n\n // Copy JS dot files\n // For now we only support javascript and typescript, so if we're not using\n // typescript, then we can assume we're using javascript. We'll need to change\n // this behavior when we'll abstract the supported languages even more.\n if (!useTypescript) {\n copyDotFilesFromSubDirectory('js');\n }\n\n await trackUsage({ event: 'didCopyProjectFiles', scope });\n\n // copy templates\n await fse.writeJSON(\n join(rootPath, 'package.json'),\n packageJSON({\n strapiDependencies: scope.strapiDependencies,\n additionalsDependencies: dependencies,\n strapiVersion: scope.strapiVersion,\n projectName: _.kebabCase(scope.name),\n uuid: scope.uuid,\n packageJsonStrapi: scope.packageJsonStrapi,\n }),\n {\n spaces: 2,\n }\n );\n\n await trackUsage({ event: 'didWritePackageJSON', scope });\n\n if (useTypescript) {\n const filesMap = {\n 'tsconfig-admin.json.js': 'src/admin',\n 'tsconfig-server.json.js': '.',\n };\n\n for (const [fileName, path] of Object.entries(filesMap)) {\n const destPath = join(rootPath, path, 'tsconfig.json');\n\n if (fileName === 'tsconfig-admin.json.js') {\n await fse.writeJSON(destPath, adminTsconfig(), { spaces: 2 });\n }\n if (fileName === 'tsconfig-server.json.js') {\n await fse.writeJSON(destPath, serverTsconfig(), { spaces: 2 });\n }\n }\n } else {\n const filesMap = { 'jsconfig.json.js': '.' };\n\n for (const [, path] of Object.entries(filesMap)) {\n const destPath = join(rootPath, path, 'jsconfig.json');\n await fse.writeJSON(destPath, jsconfig(), { spaces: 2 });\n }\n }\n\n // ensure node_modules is created\n await fse.ensureDir(join(rootPath, 'node_modules'));\n\n // create config/database\n await fse.appendFile(join(rootPath, '.env'), generateDbEnvariables({ client, connection }));\n await fse.writeFile(\n join(rootPath, `config/database.${language}`),\n createDatabaseConfig({ useTypescript })\n );\n\n await trackUsage({ event: 'didCopyConfigurationFiles', scope });\n\n // merge template files if a template is specified\n const hasTemplate = Boolean(scope.template);\n if (hasTemplate) {\n try {\n await mergeTemplate(scope, rootPath);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`⛔️ Template installation failed: ${error.message}`);\n }\n\n throw error;\n }\n }\n } catch (err) {\n await fse.remove(scope.rootPath);\n throw err;\n }\n\n await trackUsage({ event: 'willInstallProjectDependencies', scope });\n\n const installPrefix = chalk.yellow('Installing dependencies:');\n const loader = ora(installPrefix).start();\n\n const logInstall = (chunk = '') => {\n loader.text = `${installPrefix} ${chunk.toString().split('\\n').join(' ')}`;\n };\n\n try {\n if (scope.installDependencies !== false) {\n const runner = runInstall(scope);\n\n runner.stdout?.on('data', logInstall);\n runner.stderr?.on('data', logInstall);\n\n await runner;\n }\n\n loader.stop();\n console.log(`Dependencies installed ${chalk.green('successfully')}.`);\n\n await trackUsage({ event: 'didInstallProjectDependencies', scope });\n } catch (error) {\n const stderr = isStderrError(error) ? error.stderr : '';\n\n loader.stop();\n await trackUsage({\n event: 'didNotInstallProjectDependencies',\n scope,\n error: stderr.slice(-1024),\n });\n\n console.error(`${chalk.red('Error')} while installing dependencies:`);\n console.error(stderr);\n\n await captureStderr('didNotInstallProjectDependencies', error);\n\n console.log(chalk.black.bgWhite(' Keep trying!'));\n console.log();\n console.log(\n chalk.bold(\n 'Oh, it seems that you encountered errors while installing dependencies in your project.'\n )\n );\n console.log(`Don't give up, your project was created correctly.`);\n console.log(\n `Fix the issues mentioned in the installation errors and try to run the following command:`\n );\n console.log();\n console.log(\n `cd ${chalk.green(rootPath)} && ${chalk.cyan(scope.useYarn ? 'yarn' : 'npm')} install`\n );\n console.log();\n\n stopProcess();\n }\n\n await trackUsage({ event: 'didCreateProject', scope });\n\n // Init git\n if (await tryGitInit(rootPath)) {\n console.log('Initialized a git repository.');\n console.log();\n }\n\n console.log();\n console.log(`Your application was created at ${chalk.green(rootPath)}.\\n`);\n\n const cmd = chalk.cyan(scope.useYarn ? 'yarn' : 'npm run');\n\n console.log('Available commands in your project:');\n console.log();\n console.log(` ${cmd} develop`);\n console.log(\n ' Start Strapi in watch mode. (Changes in Strapi project files will trigger a server restart)'\n );\n console.log();\n console.log(` ${cmd} start`);\n console.log(' Start Strapi without watch mode.');\n console.log();\n console.log(` ${cmd} build`);\n console.log(' Build Strapi admin panel.');\n console.log();\n console.log(` ${cmd} deploy`);\n console.log(' Deploy Strapi project.');\n console.log();\n console.log(` ${cmd} strapi`);\n console.log(` Display all available commands.`);\n console.log();\n console.log('You can start by doing:');\n console.log();\n console.log(` ${chalk.cyan('cd')} ${rootPath}`);\n console.log(` ${cmd} develop`);\n console.log();\n}\n\nconst installArguments = ['install', '--production', '--no-optional'];\nfunction runInstall({ rootPath, useYarn }: Scope) {\n if (useYarn) {\n // Increase timeout for slow internet connections.\n installArguments.push('--network-timeout 1000000');\n\n return execa('yarnpkg', installArguments, {\n cwd: rootPath,\n stdin: 'ignore',\n });\n }\n\n return execa('npm', installArguments, { cwd: rootPath, stdin: 'ignore' });\n}\n"],"names":[],"mappings":"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"}