diff --git a/packages/core/strapi/bin/strapi.js b/packages/core/strapi/bin/strapi.js index a6dcbcf25d..8111100810 100755 --- a/packages/core/strapi/bin/strapi.js +++ b/packages/core/strapi/bin/strapi.js @@ -95,6 +95,7 @@ program .option('--dbssl ', 'Database SSL') .option('--dbfile ', 'Database file path for sqlite') .option('--dbforce', 'Allow overwriting existing database content') + .option('-ts, --typescript', 'Create a typescript project') .description('Create a new application') .action(require('../lib/commands/new')); diff --git a/packages/core/strapi/lib/commands/admin-create.js b/packages/core/strapi/lib/commands/admin-create.js index 304d3c9a4f..1261103193 100644 --- a/packages/core/strapi/lib/commands/admin-create.js +++ b/packages/core/strapi/lib/commands/admin-create.js @@ -1,8 +1,10 @@ 'use strict'; +const path = require('path'); const { yup } = require('@strapi/utils'); const _ = require('lodash'); const inquirer = require('inquirer'); +const tsUtils = require('@strapi/typescript-utils'); const strapi = require('../index'); const emailValidator = yup @@ -90,7 +92,12 @@ module.exports = async function(cmdOptions = {}) { }; async function createAdmin({ email, password, firstname, lastname }) { - const app = await strapi().load(); + const appDir = process.cwd(); + + const isTSProject = await tsUtils.isUsingTypeScript(appDir); + const distDir = isTSProject ? path.join(appDir, 'dist') : appDir; + + const app = await strapi({ appDir, distDir }).load(); const user = await app.admin.services.user.exists({ email }); diff --git a/packages/core/strapi/lib/commands/admin-reset.js b/packages/core/strapi/lib/commands/admin-reset.js index 0446c6f4f1..02436239eb 100644 --- a/packages/core/strapi/lib/commands/admin-reset.js +++ b/packages/core/strapi/lib/commands/admin-reset.js @@ -1,7 +1,9 @@ 'use strict'; +const path = require('path'); const _ = require('lodash'); const inquirer = require('inquirer'); +const tsUtils = require('@strapi/typescript-utils'); const strapi = require('../index'); const promptQuestions = [ @@ -42,7 +44,12 @@ module.exports = async function(cmdOptions = {}) { }; async function changePassword({ email, password }) { - const app = await strapi().load(); + const appDir = process.cwd(); + + const isTSProject = await tsUtils.isUsingTypeScript(appDir); + const distDir = isTSProject ? path.join(appDir, 'dist') : appDir; + + const app = await strapi({ appDir, distDir }).load(); await app.admin.services.user.resetPasswordByEmail(email, password); diff --git a/packages/core/strapi/lib/commands/configurationDump.js b/packages/core/strapi/lib/commands/configurationDump.js index 5977ae5a1f..881d5db474 100644 --- a/packages/core/strapi/lib/commands/configurationDump.js +++ b/packages/core/strapi/lib/commands/configurationDump.js @@ -1,6 +1,8 @@ 'use strict'; const fs = require('fs'); +const path = require('path'); +const tsUtils = require('@strapi/typescript-utils'); const strapi = require('../index'); const CHUNK_SIZE = 100; @@ -12,7 +14,12 @@ const CHUNK_SIZE = 100; module.exports = async function({ file: filePath, pretty }) { const output = filePath ? fs.createWriteStream(filePath) : process.stdout; - const app = await strapi().load(); + const appDir = process.cwd(); + + const isTSProject = await tsUtils.isUsingTypeScript(appDir); + const distDir = isTSProject ? path.join(appDir, 'dist') : appDir; + + const app = await strapi({ appDir, distDir }).load(); const count = await app.query('strapi::core-store').count(); diff --git a/packages/core/strapi/lib/commands/configurationRestore.js b/packages/core/strapi/lib/commands/configurationRestore.js index 674e879ea0..27f93519a3 100644 --- a/packages/core/strapi/lib/commands/configurationRestore.js +++ b/packages/core/strapi/lib/commands/configurationRestore.js @@ -1,7 +1,10 @@ 'use strict'; const fs = require('fs'); +const path = require('path'); const _ = require('lodash'); +const tsUtils = require('@strapi/typescript-utils'); + const strapi = require('../index'); /** @@ -12,7 +15,12 @@ const strapi = require('../index'); module.exports = async function({ file: filePath, strategy = 'replace' }) { const input = filePath ? fs.readFileSync(filePath) : await readStdin(process.stdin); - const app = await strapi().load(); + const appDir = process.cwd(); + + const isTSProject = await tsUtils.isUsingTypeScript(appDir); + const distDir = isTSProject ? path.join(appDir, 'dist') : appDir; + + const app = await strapi({ appDir, distDir }).load(); let dataToImport; try { diff --git a/packages/core/strapi/lib/commands/console.js b/packages/core/strapi/lib/commands/console.js index 0c24521318..4efd7c95a8 100644 --- a/packages/core/strapi/lib/commands/console.js +++ b/packages/core/strapi/lib/commands/console.js @@ -1,14 +1,22 @@ 'use strict'; const REPL = require('repl'); +const path = require('path'); +const tsUtils = require('@strapi/typescript-utils'); + const strapi = require('../index'); /** * `$ strapi console` */ -module.exports = () => { +module.exports = async () => { // Now load up the Strapi framework for real. - const app = strapi(); + const appDir = process.cwd(); + + const isTSProject = await tsUtils.isUsingTypeScript(appDir); + const distDir = isTSProject ? path.join(appDir, 'dist') : appDir; + + const app = await strapi({ appDir, distDir }).load(); app.start().then(() => { const repl = REPL.start(app.config.info.name + ' > ' || 'strapi > '); // eslint-disable-line prefer-template diff --git a/packages/core/strapi/lib/commands/routes/list.js b/packages/core/strapi/lib/commands/routes/list.js index 83e51ece2c..0c24995c62 100644 --- a/packages/core/strapi/lib/commands/routes/list.js +++ b/packages/core/strapi/lib/commands/routes/list.js @@ -1,13 +1,20 @@ 'use strict'; +const path = require('path'); const CLITable = require('cli-table3'); const chalk = require('chalk'); const { toUpper } = require('lodash/fp'); +const tsUtils = require('@strapi/typescript-utils'); const strapi = require('../../index'); module.exports = async function() { - const app = await strapi().load(); + const appDir = process.cwd(); + + const isTSProject = await tsUtils.isUsingTypeScript(appDir); + const distDir = isTSProject ? path.join(appDir, 'dist') : appDir; + + const app = await strapi({ appDir, distDir }).load(); const list = app.server.listRoutes(); diff --git a/packages/core/strapi/lib/commands/start.js b/packages/core/strapi/lib/commands/start.js index 802972ebed..5ca79e4315 100644 --- a/packages/core/strapi/lib/commands/start.js +++ b/packages/core/strapi/lib/commands/start.js @@ -1,8 +1,14 @@ 'use strict'; - +const tsUtils = require('@strapi/typescript-utils') const strapi = require('../index'); /** * `$ strapi start` */ -module.exports = distDir => strapi({ distDir }).start(); +module.exports = async specifiedDir => { + const appDir = process.cwd(); + const isTSProject = await tsUtils.isUsingTypeScript(appDir) + const distDir = isTSProject && !specifiedDir ? 'dist' : specifiedDir; + + strapi({ distDir }).start() +}; diff --git a/packages/generators/app/lib/create-customized-project.js b/packages/generators/app/lib/create-customized-project.js index 3d85b96a13..717a40207e 100644 --- a/packages/generators/app/lib/create-customized-project.js +++ b/packages/generators/app/lib/create-customized-project.js @@ -15,6 +15,11 @@ const dbQuestions = require('./utils/db-questions'); const createProject = require('./create-project'); module.exports = async scope => { + if (!scope.useTypescript) { + const language = await askAboutLanguages(scope); + scope.useTypescript = language === 'Typescript'; + } + await trackUsage({ event: 'didChooseCustomDatabase', scope }); const configuration = await askDbInfosAndTest(scope).catch(error => { @@ -157,3 +162,17 @@ async function installDatabaseTestingDep({ scope, configuration }) { await execa(packageManager, cmd.concat(deps)); } + +async function askAboutLanguages() { + const { language } = await inquirer.prompt([ + { + type: 'list', + name: 'language', + message: 'Choose your preferred language', + choices: ['Javascript', 'Typescript'], + default: 'Javascript', + }, + ]); + + return language; +} diff --git a/packages/generators/generators/lib/plops/plugin.js b/packages/generators/generators/lib/plops/plugin.js index d1594b585b..e6da928691 100644 --- a/packages/generators/generators/lib/plops/plugin.js +++ b/packages/generators/generators/lib/plops/plugin.js @@ -1,7 +1,6 @@ 'use strict'; const chalk = require('chalk'); -const tsUtils = require('@strapi/typescript-utils'); const logInstructions = (pluginName, { language }) => { const maxLength = ` resolve: './src/plugins/${pluginName}'`.length; @@ -38,10 +37,17 @@ module.exports = plop => { name: 'pluginName', message: 'Plugin name', }, + { + type: 'list', + name: 'language', + message: 'Choose your preferred language', + choices: ['Javascript', 'Typescript'], + default: 'Javascript', + }, ], actions(answers) { - const currentDir = process.cwd(); - const language = tsUtils.isUsingTypeScriptSync(currentDir) ? 'ts' : 'js'; + const isTypescript = answers.language === 'Typescript'; + const language = isTypescript ? 'ts' : 'js'; // TODO: Adds tsconfig & build command for TS plugins?