{"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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"}