create-strapi-app 5.0.0-beta.10 → 5.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -100,7 +100,9 @@ const DBOptions = ["dbclient", "dbhost", "dbport", "dbname", "dbusername", "dbpa
100
100
  const VALID_CLIENTS = ["sqlite", "mysql", "postgres"];
101
101
  const DEFAULT_CONFIG = {
102
102
  client: "sqlite",
103
- connection: {}
103
+ connection: {
104
+ filename: ".tmp/data.db"
105
+ }
104
106
  };
105
107
  async function dbPrompt() {
106
108
  const { useDefault } = await inquirer__default.default.prompt([
@@ -1 +1 @@
1
- {"version":3,"file":"create-strapi-app.js","sources":["../src/prompts.ts","../src/package-manager.ts","../src/db-questions.ts","../src/database.ts","../src/create-strapi-app.ts"],"sourcesContent":["import inquirer from 'inquirer';\n\nasync function directory() {\n const { directory } = await inquirer.prompt<{\n directory: string;\n }>([\n {\n type: 'input',\n default: 'my-strapi-project',\n name: 'directory',\n message: 'What is the name of your project?',\n },\n ]);\n\n return directory;\n}\n\nasync function typescript() {\n const { useTypescript } = await inquirer.prompt<{\n useTypescript: boolean;\n }>([\n {\n type: 'confirm',\n name: 'useTypescript',\n message: 'Do you want to use Typescript ?',\n default: true,\n },\n ]);\n\n return useTypescript;\n}\n\nexport { directory, typescript };\n","export type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\nexport const detectPackageManager = (): PackageManager => {\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n\n return 'npm';\n};\n","import type { Question } from 'inquirer';\nimport type { DBClient } from './types';\n\ninterface QuestionFactory {\n (options: { client: DBClient }): Question;\n}\n\nconst DEFAULT_PORTS = {\n postgres: 5432,\n mysql: 3306,\n sqlite: undefined,\n};\n\nconst database: QuestionFactory = () => ({\n type: 'input',\n name: 'database',\n message: 'Database name:',\n default: 'strapi',\n validate(value: string) {\n if (value.includes('.')) {\n return `The database name can't contain a \".\"`;\n }\n\n return true;\n },\n});\n\nconst host: QuestionFactory = () => ({\n type: 'input',\n name: 'host',\n message: 'Host:',\n default: '127.0.0.1',\n});\n\nconst port: QuestionFactory = ({ client }) => ({\n type: 'input',\n name: 'port',\n message: 'Port:',\n default: DEFAULT_PORTS[client],\n});\n\nconst username: QuestionFactory = () => ({\n type: 'input',\n name: 'username',\n message: 'Username:',\n});\n\nconst password: QuestionFactory = () => ({\n type: 'password',\n name: 'password',\n message: 'Password:',\n mask: '*',\n});\n\nconst ssl: QuestionFactory = () => ({\n type: 'confirm',\n name: 'ssl',\n message: 'Enable SSL connection:',\n default: false,\n});\n\nconst filename: QuestionFactory = () => ({\n type: 'input',\n name: 'filename',\n message: 'Filename:',\n default: '.tmp/data.db',\n});\n\nexport default {\n sqlite: [filename],\n postgres: [database, host, port, username, password, ssl],\n mysql: [database, host, port, username, password, ssl],\n};\n","import inquirer from 'inquirer';\n\nimport type { Options, DBClient, DBConfig } from './types';\nimport dbQuestions from './db-questions';\n\nconst DBOptions = ['dbclient', 'dbhost', 'dbport', 'dbname', 'dbusername', 'dbpassword'];\n\nconst VALID_CLIENTS = ['sqlite', 'mysql', 'postgres'] as const;\n\nconst DEFAULT_CONFIG: DBConfig = {\n client: 'sqlite',\n connection: {},\n};\n\nasync function dbPrompt() {\n const { useDefault } = await inquirer.prompt<{ useDefault: boolean }>([\n {\n type: 'confirm',\n name: 'useDefault',\n message: 'Use the default database (sqlite) ?',\n default: true,\n },\n ]);\n\n if (useDefault) {\n return DEFAULT_CONFIG;\n }\n\n const { client } = await inquirer.prompt<{ client: DBClient }>([\n {\n type: 'list',\n name: 'client',\n message: 'Choose your default database client',\n choices: ['sqlite', 'postgres', 'mysql'],\n default: 'sqlite',\n },\n ]);\n\n const questions = dbQuestions[client].map((q) => q({ client }));\n\n const responses = await inquirer.prompt(questions);\n\n return {\n client,\n connection: responses,\n };\n}\n\nexport async function getDatabaseInfos(options: Options): Promise<DBConfig> {\n const hasDBOptions = DBOptions.some((key) => key in options);\n\n if (!hasDBOptions) {\n if (options.quickstart) {\n return DEFAULT_CONFIG;\n }\n\n return dbPrompt();\n }\n\n if (!options.dbclient) {\n console.error('Please specify the database client');\n process.exit(1);\n }\n\n const database: DBConfig = {\n client: options.dbclient,\n connection: {\n host: options.dbhost,\n port: options.dbport,\n database: options.dbname,\n username: options.dbusername,\n password: options.dbpassword,\n filename: options.dbfile,\n },\n };\n\n if (options.dbssl !== undefined) {\n database.connection.ssl = options.dbssl === 'true';\n }\n\n return database;\n}\n\nexport function validateOptions(options: Options) {\n if (options.dbclient && !VALID_CLIENTS.includes(options.dbclient)) {\n console.error(\n `Invalid --dbclient: ${options.dbclient}, expected one of ${VALID_CLIENTS.join(', ')}`\n );\n process.exit(1);\n }\n\n const matchingArgs = DBOptions.filter((key) => key in options);\n const missingArgs = DBOptions.filter((key) => !(key in options));\n\n if (\n matchingArgs.length > 0 &&\n matchingArgs.length !== DBOptions.length &&\n options.dbclient !== 'sqlite'\n ) {\n console.error(`Required database arguments are missing: ${missingArgs.join(', ')}.`);\n process.exit(1);\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport commander from 'commander';\nimport { generateNewApp, type Options as GenerateNewAppOptions } from '@strapi/generate-new';\n\nimport * as prompts from './prompts';\nimport type { Options } from './types';\nimport { detectPackageManager } from './package-manager';\nimport * as database from './database';\n\nconst packageJson = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf8'));\n\nconst command = new commander.Command(packageJson.name);\n\ncommand\n .version(packageJson.version)\n .arguments('[directory]')\n .usage('[directory] [options]')\n .option('--quickstart', 'Quickstart app creation (deprecated)')\n .option('--no-run', 'Do not start the application after it is created.')\n\n // setup options\n .option('--ts, --typescript', 'Initialize the project with TypeScript (default)')\n .option('--js, --javascript', 'Initialize the project with Javascript')\n\n // Package manager options\n .option('--use-npm', 'Use npm as the project package manager')\n .option('--use-yarn', 'Use yarn as the project package manager')\n .option('--use-pnpm', 'Use pnpm as the project package manager')\n\n // Database options\n .option('--dbclient <dbclient>', 'Database client')\n .option('--dbhost <dbhost>', 'Database host')\n .option('--dbport <dbport>', 'Database port')\n .option('--dbname <dbname>', 'Database name')\n .option('--dbusername <dbusername>', 'Database username')\n .option('--dbpassword <dbpassword>', 'Database password')\n .option('--dbssl <dbssl>', 'Database SSL')\n .option('--dbfile <dbfile>', 'Database file path for sqlite')\n\n // templates\n .option('--template <templateurl>', 'Specify a Strapi template')\n .description('create a new application')\n .action((directory, options) => {\n createStrapiApp(directory, options);\n })\n .parse(process.argv);\n\nasync function createStrapiApp(directory: string | undefined, options: Options) {\n validateOptions(options);\n\n if (options.quickstart && !directory) {\n console.error('Please specify the <directory> of your project when using --quickstart');\n process.exit(1);\n }\n\n const appDirectory = directory || (await prompts.directory());\n\n const appOptions = {\n directory: appDirectory,\n useTypescript: true,\n packageManager: 'npm',\n template: options.template,\n isQuickstart: options.quickstart,\n } as GenerateNewAppOptions;\n\n if (options.javascript === true) {\n appOptions.useTypescript = false;\n } else if (options.typescript === true) {\n appOptions.useTypescript = true;\n } else {\n appOptions.useTypescript = options.quickstart ? true : await prompts.typescript();\n }\n\n if (options.useNpm === true) {\n appOptions.packageManager = 'npm';\n } else if (options.usePnpm === true) {\n appOptions.packageManager = 'pnpm';\n } else if (options.useYarn === true) {\n appOptions.packageManager = 'yarn';\n } else {\n appOptions.packageManager = detectPackageManager();\n }\n\n if (options.quickstart === true && options.run !== false) {\n appOptions.runApp = true;\n }\n\n appOptions.database = await database.getDatabaseInfos(options);\n\n return generateNewApp(appOptions)\n .then(() => {\n if (process.platform === 'win32') {\n process.exit(0);\n }\n })\n .catch((error) => {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n });\n}\n\nasync function validateOptions(options: Options) {\n const programFlags = command\n .createHelp()\n .visibleOptions(command)\n .reduce<Array<string | undefined>>((acc, { short, long }) => [...acc, short, long], [])\n .filter(Boolean);\n\n if (options.template && programFlags.includes(options.template)) {\n console.error(`${options.template} is not a valid template`);\n process.exit(1);\n }\n\n if (options.javascript === true && options.typescript === true) {\n console.error('You cannot use both --typescript (--ts) and --javascript (--js) flags together');\n process.exit(1);\n }\n\n if ([options.useNpm, options.usePnpm, options.useYarn].filter(Boolean).length > 1) {\n console.error(\n 'You cannot specify multiple package managers at the same time (--use-npm, --use-pnpm, --use-yarn)'\n );\n process.exit(1);\n }\n\n database.validateOptions(options);\n}\n"],"names":["directory","inquirer","database","validateOptions","readFileSync","resolve","commander","prompts.directory","prompts.typescript","database.getDatabaseInfos","generateNewApp","database.validateOptions"],"mappings":"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"}
1
+ {"version":3,"file":"create-strapi-app.js","sources":["../src/prompts.ts","../src/package-manager.ts","../src/db-questions.ts","../src/database.ts","../src/create-strapi-app.ts"],"sourcesContent":["import inquirer from 'inquirer';\n\nasync function directory() {\n const { directory } = await inquirer.prompt<{\n directory: string;\n }>([\n {\n type: 'input',\n default: 'my-strapi-project',\n name: 'directory',\n message: 'What is the name of your project?',\n },\n ]);\n\n return directory;\n}\n\nasync function typescript() {\n const { useTypescript } = await inquirer.prompt<{\n useTypescript: boolean;\n }>([\n {\n type: 'confirm',\n name: 'useTypescript',\n message: 'Do you want to use Typescript ?',\n default: true,\n },\n ]);\n\n return useTypescript;\n}\n\nexport { directory, typescript };\n","export type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\nexport const detectPackageManager = (): PackageManager => {\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n\n return 'npm';\n};\n","import type { Question } from 'inquirer';\nimport type { DBClient } from './types';\n\ninterface QuestionFactory {\n (options: { client: DBClient }): Question;\n}\n\nconst DEFAULT_PORTS = {\n postgres: 5432,\n mysql: 3306,\n sqlite: undefined,\n};\n\nconst database: QuestionFactory = () => ({\n type: 'input',\n name: 'database',\n message: 'Database name:',\n default: 'strapi',\n validate(value: string) {\n if (value.includes('.')) {\n return `The database name can't contain a \".\"`;\n }\n\n return true;\n },\n});\n\nconst host: QuestionFactory = () => ({\n type: 'input',\n name: 'host',\n message: 'Host:',\n default: '127.0.0.1',\n});\n\nconst port: QuestionFactory = ({ client }) => ({\n type: 'input',\n name: 'port',\n message: 'Port:',\n default: DEFAULT_PORTS[client],\n});\n\nconst username: QuestionFactory = () => ({\n type: 'input',\n name: 'username',\n message: 'Username:',\n});\n\nconst password: QuestionFactory = () => ({\n type: 'password',\n name: 'password',\n message: 'Password:',\n mask: '*',\n});\n\nconst ssl: QuestionFactory = () => ({\n type: 'confirm',\n name: 'ssl',\n message: 'Enable SSL connection:',\n default: false,\n});\n\nconst filename: QuestionFactory = () => ({\n type: 'input',\n name: 'filename',\n message: 'Filename:',\n default: '.tmp/data.db',\n});\n\nexport default {\n sqlite: [filename],\n postgres: [database, host, port, username, password, ssl],\n mysql: [database, host, port, username, password, ssl],\n};\n","import inquirer from 'inquirer';\n\nimport type { Options, DBClient, DBConfig } from './types';\nimport dbQuestions from './db-questions';\n\nconst DBOptions = ['dbclient', 'dbhost', 'dbport', 'dbname', 'dbusername', 'dbpassword'];\n\nconst VALID_CLIENTS = ['sqlite', 'mysql', 'postgres'] as const;\n\nconst DEFAULT_CONFIG: DBConfig = {\n client: 'sqlite',\n connection: {\n filename: '.tmp/data.db',\n },\n};\n\nasync function dbPrompt() {\n const { useDefault } = await inquirer.prompt<{ useDefault: boolean }>([\n {\n type: 'confirm',\n name: 'useDefault',\n message: 'Use the default database (sqlite) ?',\n default: true,\n },\n ]);\n\n if (useDefault) {\n return DEFAULT_CONFIG;\n }\n\n const { client } = await inquirer.prompt<{ client: DBClient }>([\n {\n type: 'list',\n name: 'client',\n message: 'Choose your default database client',\n choices: ['sqlite', 'postgres', 'mysql'],\n default: 'sqlite',\n },\n ]);\n\n const questions = dbQuestions[client].map((q) => q({ client }));\n\n const responses = await inquirer.prompt(questions);\n\n return {\n client,\n connection: responses,\n };\n}\n\nexport async function getDatabaseInfos(options: Options): Promise<DBConfig> {\n const hasDBOptions = DBOptions.some((key) => key in options);\n\n if (!hasDBOptions) {\n if (options.quickstart) {\n return DEFAULT_CONFIG;\n }\n\n return dbPrompt();\n }\n\n if (!options.dbclient) {\n console.error('Please specify the database client');\n process.exit(1);\n }\n\n const database: DBConfig = {\n client: options.dbclient,\n connection: {\n host: options.dbhost,\n port: options.dbport,\n database: options.dbname,\n username: options.dbusername,\n password: options.dbpassword,\n filename: options.dbfile,\n },\n };\n\n if (options.dbssl !== undefined) {\n database.connection.ssl = options.dbssl === 'true';\n }\n\n return database;\n}\n\nexport function validateOptions(options: Options) {\n if (options.dbclient && !VALID_CLIENTS.includes(options.dbclient)) {\n console.error(\n `Invalid --dbclient: ${options.dbclient}, expected one of ${VALID_CLIENTS.join(', ')}`\n );\n process.exit(1);\n }\n\n const matchingArgs = DBOptions.filter((key) => key in options);\n const missingArgs = DBOptions.filter((key) => !(key in options));\n\n if (\n matchingArgs.length > 0 &&\n matchingArgs.length !== DBOptions.length &&\n options.dbclient !== 'sqlite'\n ) {\n console.error(`Required database arguments are missing: ${missingArgs.join(', ')}.`);\n process.exit(1);\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport commander from 'commander';\nimport { generateNewApp, type Options as GenerateNewAppOptions } from '@strapi/generate-new';\n\nimport * as prompts from './prompts';\nimport type { Options } from './types';\nimport { detectPackageManager } from './package-manager';\nimport * as database from './database';\n\nconst packageJson = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf8'));\n\nconst command = new commander.Command(packageJson.name);\n\ncommand\n .version(packageJson.version)\n .arguments('[directory]')\n .usage('[directory] [options]')\n .option('--quickstart', 'Quickstart app creation (deprecated)')\n .option('--no-run', 'Do not start the application after it is created.')\n\n // setup options\n .option('--ts, --typescript', 'Initialize the project with TypeScript (default)')\n .option('--js, --javascript', 'Initialize the project with Javascript')\n\n // Package manager options\n .option('--use-npm', 'Use npm as the project package manager')\n .option('--use-yarn', 'Use yarn as the project package manager')\n .option('--use-pnpm', 'Use pnpm as the project package manager')\n\n // Database options\n .option('--dbclient <dbclient>', 'Database client')\n .option('--dbhost <dbhost>', 'Database host')\n .option('--dbport <dbport>', 'Database port')\n .option('--dbname <dbname>', 'Database name')\n .option('--dbusername <dbusername>', 'Database username')\n .option('--dbpassword <dbpassword>', 'Database password')\n .option('--dbssl <dbssl>', 'Database SSL')\n .option('--dbfile <dbfile>', 'Database file path for sqlite')\n\n // templates\n .option('--template <templateurl>', 'Specify a Strapi template')\n .description('create a new application')\n .action((directory, options) => {\n createStrapiApp(directory, options);\n })\n .parse(process.argv);\n\nasync function createStrapiApp(directory: string | undefined, options: Options) {\n validateOptions(options);\n\n if (options.quickstart && !directory) {\n console.error('Please specify the <directory> of your project when using --quickstart');\n process.exit(1);\n }\n\n const appDirectory = directory || (await prompts.directory());\n\n const appOptions = {\n directory: appDirectory,\n useTypescript: true,\n packageManager: 'npm',\n template: options.template,\n isQuickstart: options.quickstart,\n } as GenerateNewAppOptions;\n\n if (options.javascript === true) {\n appOptions.useTypescript = false;\n } else if (options.typescript === true) {\n appOptions.useTypescript = true;\n } else {\n appOptions.useTypescript = options.quickstart ? true : await prompts.typescript();\n }\n\n if (options.useNpm === true) {\n appOptions.packageManager = 'npm';\n } else if (options.usePnpm === true) {\n appOptions.packageManager = 'pnpm';\n } else if (options.useYarn === true) {\n appOptions.packageManager = 'yarn';\n } else {\n appOptions.packageManager = detectPackageManager();\n }\n\n if (options.quickstart === true && options.run !== false) {\n appOptions.runApp = true;\n }\n\n appOptions.database = await database.getDatabaseInfos(options);\n\n return generateNewApp(appOptions)\n .then(() => {\n if (process.platform === 'win32') {\n process.exit(0);\n }\n })\n .catch((error) => {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n });\n}\n\nasync function validateOptions(options: Options) {\n const programFlags = command\n .createHelp()\n .visibleOptions(command)\n .reduce<Array<string | undefined>>((acc, { short, long }) => [...acc, short, long], [])\n .filter(Boolean);\n\n if (options.template && programFlags.includes(options.template)) {\n console.error(`${options.template} is not a valid template`);\n process.exit(1);\n }\n\n if (options.javascript === true && options.typescript === true) {\n console.error('You cannot use both --typescript (--ts) and --javascript (--js) flags together');\n process.exit(1);\n }\n\n if ([options.useNpm, options.usePnpm, options.useYarn].filter(Boolean).length > 1) {\n console.error(\n 'You cannot specify multiple package managers at the same time (--use-npm, --use-pnpm, --use-yarn)'\n );\n process.exit(1);\n }\n\n database.validateOptions(options);\n}\n"],"names":["directory","inquirer","database","validateOptions","readFileSync","resolve","commander","prompts.directory","prompts.typescript","database.getDatabaseInfos","generateNewApp","database.validateOptions"],"mappings":"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"}
@@ -96,7 +96,9 @@ const DBOptions = ["dbclient", "dbhost", "dbport", "dbname", "dbusername", "dbpa
96
96
  const VALID_CLIENTS = ["sqlite", "mysql", "postgres"];
97
97
  const DEFAULT_CONFIG = {
98
98
  client: "sqlite",
99
- connection: {}
99
+ connection: {
100
+ filename: ".tmp/data.db"
101
+ }
100
102
  };
101
103
  async function dbPrompt() {
102
104
  const { useDefault } = await inquirer.prompt([
@@ -1 +1 @@
1
- {"version":3,"file":"create-strapi-app.mjs","sources":["../src/prompts.ts","../src/package-manager.ts","../src/db-questions.ts","../src/database.ts","../src/create-strapi-app.ts"],"sourcesContent":["import inquirer from 'inquirer';\n\nasync function directory() {\n const { directory } = await inquirer.prompt<{\n directory: string;\n }>([\n {\n type: 'input',\n default: 'my-strapi-project',\n name: 'directory',\n message: 'What is the name of your project?',\n },\n ]);\n\n return directory;\n}\n\nasync function typescript() {\n const { useTypescript } = await inquirer.prompt<{\n useTypescript: boolean;\n }>([\n {\n type: 'confirm',\n name: 'useTypescript',\n message: 'Do you want to use Typescript ?',\n default: true,\n },\n ]);\n\n return useTypescript;\n}\n\nexport { directory, typescript };\n","export type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\nexport const detectPackageManager = (): PackageManager => {\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n\n return 'npm';\n};\n","import type { Question } from 'inquirer';\nimport type { DBClient } from './types';\n\ninterface QuestionFactory {\n (options: { client: DBClient }): Question;\n}\n\nconst DEFAULT_PORTS = {\n postgres: 5432,\n mysql: 3306,\n sqlite: undefined,\n};\n\nconst database: QuestionFactory = () => ({\n type: 'input',\n name: 'database',\n message: 'Database name:',\n default: 'strapi',\n validate(value: string) {\n if (value.includes('.')) {\n return `The database name can't contain a \".\"`;\n }\n\n return true;\n },\n});\n\nconst host: QuestionFactory = () => ({\n type: 'input',\n name: 'host',\n message: 'Host:',\n default: '127.0.0.1',\n});\n\nconst port: QuestionFactory = ({ client }) => ({\n type: 'input',\n name: 'port',\n message: 'Port:',\n default: DEFAULT_PORTS[client],\n});\n\nconst username: QuestionFactory = () => ({\n type: 'input',\n name: 'username',\n message: 'Username:',\n});\n\nconst password: QuestionFactory = () => ({\n type: 'password',\n name: 'password',\n message: 'Password:',\n mask: '*',\n});\n\nconst ssl: QuestionFactory = () => ({\n type: 'confirm',\n name: 'ssl',\n message: 'Enable SSL connection:',\n default: false,\n});\n\nconst filename: QuestionFactory = () => ({\n type: 'input',\n name: 'filename',\n message: 'Filename:',\n default: '.tmp/data.db',\n});\n\nexport default {\n sqlite: [filename],\n postgres: [database, host, port, username, password, ssl],\n mysql: [database, host, port, username, password, ssl],\n};\n","import inquirer from 'inquirer';\n\nimport type { Options, DBClient, DBConfig } from './types';\nimport dbQuestions from './db-questions';\n\nconst DBOptions = ['dbclient', 'dbhost', 'dbport', 'dbname', 'dbusername', 'dbpassword'];\n\nconst VALID_CLIENTS = ['sqlite', 'mysql', 'postgres'] as const;\n\nconst DEFAULT_CONFIG: DBConfig = {\n client: 'sqlite',\n connection: {},\n};\n\nasync function dbPrompt() {\n const { useDefault } = await inquirer.prompt<{ useDefault: boolean }>([\n {\n type: 'confirm',\n name: 'useDefault',\n message: 'Use the default database (sqlite) ?',\n default: true,\n },\n ]);\n\n if (useDefault) {\n return DEFAULT_CONFIG;\n }\n\n const { client } = await inquirer.prompt<{ client: DBClient }>([\n {\n type: 'list',\n name: 'client',\n message: 'Choose your default database client',\n choices: ['sqlite', 'postgres', 'mysql'],\n default: 'sqlite',\n },\n ]);\n\n const questions = dbQuestions[client].map((q) => q({ client }));\n\n const responses = await inquirer.prompt(questions);\n\n return {\n client,\n connection: responses,\n };\n}\n\nexport async function getDatabaseInfos(options: Options): Promise<DBConfig> {\n const hasDBOptions = DBOptions.some((key) => key in options);\n\n if (!hasDBOptions) {\n if (options.quickstart) {\n return DEFAULT_CONFIG;\n }\n\n return dbPrompt();\n }\n\n if (!options.dbclient) {\n console.error('Please specify the database client');\n process.exit(1);\n }\n\n const database: DBConfig = {\n client: options.dbclient,\n connection: {\n host: options.dbhost,\n port: options.dbport,\n database: options.dbname,\n username: options.dbusername,\n password: options.dbpassword,\n filename: options.dbfile,\n },\n };\n\n if (options.dbssl !== undefined) {\n database.connection.ssl = options.dbssl === 'true';\n }\n\n return database;\n}\n\nexport function validateOptions(options: Options) {\n if (options.dbclient && !VALID_CLIENTS.includes(options.dbclient)) {\n console.error(\n `Invalid --dbclient: ${options.dbclient}, expected one of ${VALID_CLIENTS.join(', ')}`\n );\n process.exit(1);\n }\n\n const matchingArgs = DBOptions.filter((key) => key in options);\n const missingArgs = DBOptions.filter((key) => !(key in options));\n\n if (\n matchingArgs.length > 0 &&\n matchingArgs.length !== DBOptions.length &&\n options.dbclient !== 'sqlite'\n ) {\n console.error(`Required database arguments are missing: ${missingArgs.join(', ')}.`);\n process.exit(1);\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport commander from 'commander';\nimport { generateNewApp, type Options as GenerateNewAppOptions } from '@strapi/generate-new';\n\nimport * as prompts from './prompts';\nimport type { Options } from './types';\nimport { detectPackageManager } from './package-manager';\nimport * as database from './database';\n\nconst packageJson = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf8'));\n\nconst command = new commander.Command(packageJson.name);\n\ncommand\n .version(packageJson.version)\n .arguments('[directory]')\n .usage('[directory] [options]')\n .option('--quickstart', 'Quickstart app creation (deprecated)')\n .option('--no-run', 'Do not start the application after it is created.')\n\n // setup options\n .option('--ts, --typescript', 'Initialize the project with TypeScript (default)')\n .option('--js, --javascript', 'Initialize the project with Javascript')\n\n // Package manager options\n .option('--use-npm', 'Use npm as the project package manager')\n .option('--use-yarn', 'Use yarn as the project package manager')\n .option('--use-pnpm', 'Use pnpm as the project package manager')\n\n // Database options\n .option('--dbclient <dbclient>', 'Database client')\n .option('--dbhost <dbhost>', 'Database host')\n .option('--dbport <dbport>', 'Database port')\n .option('--dbname <dbname>', 'Database name')\n .option('--dbusername <dbusername>', 'Database username')\n .option('--dbpassword <dbpassword>', 'Database password')\n .option('--dbssl <dbssl>', 'Database SSL')\n .option('--dbfile <dbfile>', 'Database file path for sqlite')\n\n // templates\n .option('--template <templateurl>', 'Specify a Strapi template')\n .description('create a new application')\n .action((directory, options) => {\n createStrapiApp(directory, options);\n })\n .parse(process.argv);\n\nasync function createStrapiApp(directory: string | undefined, options: Options) {\n validateOptions(options);\n\n if (options.quickstart && !directory) {\n console.error('Please specify the <directory> of your project when using --quickstart');\n process.exit(1);\n }\n\n const appDirectory = directory || (await prompts.directory());\n\n const appOptions = {\n directory: appDirectory,\n useTypescript: true,\n packageManager: 'npm',\n template: options.template,\n isQuickstart: options.quickstart,\n } as GenerateNewAppOptions;\n\n if (options.javascript === true) {\n appOptions.useTypescript = false;\n } else if (options.typescript === true) {\n appOptions.useTypescript = true;\n } else {\n appOptions.useTypescript = options.quickstart ? true : await prompts.typescript();\n }\n\n if (options.useNpm === true) {\n appOptions.packageManager = 'npm';\n } else if (options.usePnpm === true) {\n appOptions.packageManager = 'pnpm';\n } else if (options.useYarn === true) {\n appOptions.packageManager = 'yarn';\n } else {\n appOptions.packageManager = detectPackageManager();\n }\n\n if (options.quickstart === true && options.run !== false) {\n appOptions.runApp = true;\n }\n\n appOptions.database = await database.getDatabaseInfos(options);\n\n return generateNewApp(appOptions)\n .then(() => {\n if (process.platform === 'win32') {\n process.exit(0);\n }\n })\n .catch((error) => {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n });\n}\n\nasync function validateOptions(options: Options) {\n const programFlags = command\n .createHelp()\n .visibleOptions(command)\n .reduce<Array<string | undefined>>((acc, { short, long }) => [...acc, short, long], [])\n .filter(Boolean);\n\n if (options.template && programFlags.includes(options.template)) {\n console.error(`${options.template} is not a valid template`);\n process.exit(1);\n }\n\n if (options.javascript === true && options.typescript === true) {\n console.error('You cannot use both --typescript (--ts) and --javascript (--js) flags together');\n process.exit(1);\n }\n\n if ([options.useNpm, options.usePnpm, options.useYarn].filter(Boolean).length > 1) {\n console.error(\n 'You cannot specify multiple package managers at the same time (--use-npm, --use-pnpm, --use-yarn)'\n );\n process.exit(1);\n }\n\n database.validateOptions(options);\n}\n"],"names":["directory","database","validateOptions","prompts.directory","prompts.typescript","database.getDatabaseInfos","database.validateOptions"],"mappings":";;;;;AAEA,eAAe,YAAY;AACzB,QAAM,EAAE,WAAAA,WAAc,IAAA,MAAM,SAAS,OAElC;AAAA,IACD;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EAAA,CACD;AAEMA,SAAAA;AACT;AAEA,eAAe,aAAa;AAC1B,QAAM,EAAE,cAAA,IAAkB,MAAM,SAAS,OAEtC;AAAA,IACD;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EAAA,CACD;AAEM,SAAA;AACT;AC5BO,MAAM,uBAAuB,MAAsB;AAClD,QAAA,YAAY,QAAQ,IAAI,yBAAyB;AAEnD,MAAA,UAAU,WAAW,MAAM,GAAG;AACzB,WAAA;AAAA,EACT;AAEI,MAAA,UAAU,WAAW,MAAM,GAAG;AACzB,WAAA;AAAA,EACT;AAEO,SAAA;AACT;ACPA,MAAM,gBAAgB;AAAA,EACpB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,MAAM,WAA4B,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS,OAAe;AAClB,QAAA,MAAM,SAAS,GAAG,GAAG;AAChB,aAAA;AAAA,IACT;AAEO,WAAA;AAAA,EACT;AACF;AAEA,MAAM,OAAwB,OAAO;AAAA,EACnC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AACX;AAEA,MAAM,OAAwB,CAAC,EAAE,cAAc;AAAA,EAC7C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS,cAAc,MAAM;AAC/B;AAEA,MAAM,WAA4B,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AACX;AAEA,MAAM,WAA4B,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AACR;AAEA,MAAM,MAAuB,OAAO;AAAA,EAClC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AACX;AAEA,MAAM,WAA4B,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AACX;AAEA,MAAe,cAAA;AAAA,EACb,QAAQ,CAAC,QAAQ;AAAA,EACjB,UAAU,CAAC,UAAU,MAAM,MAAM,UAAU,UAAU,GAAG;AAAA,EACxD,OAAO,CAAC,UAAU,MAAM,MAAM,UAAU,UAAU,GAAG;AACvD;ACnEA,MAAM,YAAY,CAAC,YAAY,UAAU,UAAU,UAAU,cAAc,YAAY;AAEvF,MAAM,gBAAgB,CAAC,UAAU,SAAS,UAAU;AAEpD,MAAM,iBAA2B;AAAA,EAC/B,QAAQ;AAAA,EACR,YAAY,CAAC;AACf;AAEA,eAAe,WAAW;AACxB,QAAM,EAAE,WAAA,IAAe,MAAM,SAAS,OAAgC;AAAA,IACpE;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EAAA,CACD;AAED,MAAI,YAAY;AACP,WAAA;AAAA,EACT;AAEA,QAAM,EAAE,OAAA,IAAW,MAAM,SAAS,OAA6B;AAAA,IAC7D;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC,UAAU,YAAY,OAAO;AAAA,MACvC,SAAS;AAAA,IACX;AAAA,EAAA,CACD;AAEK,QAAA,YAAY,YAAY,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,OAAQ,CAAA,CAAC;AAE9D,QAAM,YAAY,MAAM,SAAS,OAAO,SAAS;AAE1C,SAAA;AAAA,IACL;AAAA,IACA,YAAY;AAAA,EAAA;AAEhB;AAEA,eAAsB,iBAAiB,SAAqC;AAC1E,QAAM,eAAe,UAAU,KAAK,CAAC,QAAQ,OAAO,OAAO;AAE3D,MAAI,CAAC,cAAc;AACjB,QAAI,QAAQ,YAAY;AACf,aAAA;AAAA,IACT;AAEA,WAAO,SAAS;AAAA,EAClB;AAEI,MAAA,CAAC,QAAQ,UAAU;AACrB,YAAQ,MAAM,oCAAoC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAMC,YAAqB;AAAA,IACzB,QAAQ,QAAQ;AAAA,IAChB,YAAY;AAAA,MACV,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,IACpB;AAAA,EAAA;AAGE,MAAA,QAAQ,UAAU,QAAW;AACtB,IAAAA,UAAA,WAAW,MAAM,QAAQ,UAAU;AAAA,EAC9C;AAEO,SAAAA;AACT;AAEO,SAASC,kBAAgB,SAAkB;AAChD,MAAI,QAAQ,YAAY,CAAC,cAAc,SAAS,QAAQ,QAAQ,GAAG;AACzD,YAAA;AAAA,MACN,uBAAuB,QAAQ,QAAQ,qBAAqB,cAAc,KAAK,IAAI,CAAC;AAAA,IAAA;AAEtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAe,UAAU,OAAO,CAAC,QAAQ,OAAO,OAAO;AAC7D,QAAM,cAAc,UAAU,OAAO,CAAC,QAAQ,EAAE,OAAO,QAAQ;AAG7D,MAAA,aAAa,SAAS,KACtB,aAAa,WAAW,UAAU,UAClC,QAAQ,aAAa,UACrB;AACA,YAAQ,MAAM,4CAA4C,YAAY,KAAK,IAAI,CAAC,GAAG;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AC5FA,MAAM,cAAc,KAAK,MAAM,aAAa,QAAQ,WAAW,iBAAiB,GAAG,MAAM,CAAC;AAE1F,MAAM,UAAU,IAAI,UAAU,QAAQ,YAAY,IAAI;AAEtD,QACG,QAAQ,YAAY,OAAO,EAC3B,UAAU,aAAa,EACvB,MAAM,uBAAuB,EAC7B,OAAO,gBAAgB,sCAAsC,EAC7D,OAAO,YAAY,mDAAmD,EAGtE,OAAO,sBAAsB,kDAAkD,EAC/E,OAAO,sBAAsB,wCAAwC,EAGrE,OAAO,aAAa,wCAAwC,EAC5D,OAAO,cAAc,yCAAyC,EAC9D,OAAO,cAAc,yCAAyC,EAG9D,OAAO,yBAAyB,iBAAiB,EACjD,OAAO,qBAAqB,eAAe,EAC3C,OAAO,qBAAqB,eAAe,EAC3C,OAAO,qBAAqB,eAAe,EAC3C,OAAO,6BAA6B,mBAAmB,EACvD,OAAO,6BAA6B,mBAAmB,EACvD,OAAO,mBAAmB,cAAc,EACxC,OAAO,qBAAqB,+BAA+B,EAG3D,OAAO,4BAA4B,2BAA2B,EAC9D,YAAY,0BAA0B,EACtC,OAAO,CAACF,YAAW,YAAY;AAC9B,kBAAgBA,YAAW,OAAO;AACpC,CAAC,EACA,MAAM,QAAQ,IAAI;AAErB,eAAe,gBAAgBA,aAA+B,SAAkB;AAC9E,kBAAgB,OAAO;AAEnB,MAAA,QAAQ,cAAc,CAACA,aAAW;AACpC,YAAQ,MAAM,wEAAwE;AACtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAeA,eAAc,MAAMG;AAEzC,QAAM,aAAa;AAAA,IACjB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,cAAc,QAAQ;AAAA,EAAA;AAGpB,MAAA,QAAQ,eAAe,MAAM;AAC/B,eAAW,gBAAgB;AAAA,EAAA,WAClB,QAAQ,eAAe,MAAM;AACtC,eAAW,gBAAgB;AAAA,EAAA,OACtB;AACL,eAAW,gBAAgB,QAAQ,aAAa,OAAO,MAAMC;EAC/D;AAEI,MAAA,QAAQ,WAAW,MAAM;AAC3B,eAAW,iBAAiB;AAAA,EAAA,WACnB,QAAQ,YAAY,MAAM;AACnC,eAAW,iBAAiB;AAAA,EAAA,WACnB,QAAQ,YAAY,MAAM;AACnC,eAAW,iBAAiB;AAAA,EAAA,OACvB;AACL,eAAW,iBAAiB;EAC9B;AAEA,MAAI,QAAQ,eAAe,QAAQ,QAAQ,QAAQ,OAAO;AACxD,eAAW,SAAS;AAAA,EACtB;AAEA,aAAW,WAAW,MAAMC,iBAA0B,OAAO;AAE7D,SAAO,eAAe,UAAU,EAC7B,KAAK,MAAM;AACN,QAAA,QAAQ,aAAa,SAAS;AAChC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EAAA,CACD,EACA,MAAM,CAAC,UAAU;AAChB,YAAQ,MAAM,UAAU,MAAM,OAAO,EAAE;AACvC,YAAQ,KAAK,CAAC;AAAA,EAAA,CACf;AACL;AAEA,eAAe,gBAAgB,SAAkB;AACzC,QAAA,eAAe,QAClB,aACA,eAAe,OAAO,EACtB,OAAkC,CAAC,KAAK,EAAE,OAAO,WAAW,CAAC,GAAG,KAAK,OAAO,IAAI,GAAG,EAAE,EACrF,OAAO,OAAO;AAEjB,MAAI,QAAQ,YAAY,aAAa,SAAS,QAAQ,QAAQ,GAAG;AAC/D,YAAQ,MAAM,GAAG,QAAQ,QAAQ,0BAA0B;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,QAAQ,eAAe,QAAQ,QAAQ,eAAe,MAAM;AAC9D,YAAQ,MAAM,gFAAgF;AAC9F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,OAAO,EAAE,OAAO,OAAO,EAAE,SAAS,GAAG;AACzE,YAAA;AAAA,MACN;AAAA,IAAA;AAEF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEAC,oBAAyB,OAAO;AAClC;"}
1
+ {"version":3,"file":"create-strapi-app.mjs","sources":["../src/prompts.ts","../src/package-manager.ts","../src/db-questions.ts","../src/database.ts","../src/create-strapi-app.ts"],"sourcesContent":["import inquirer from 'inquirer';\n\nasync function directory() {\n const { directory } = await inquirer.prompt<{\n directory: string;\n }>([\n {\n type: 'input',\n default: 'my-strapi-project',\n name: 'directory',\n message: 'What is the name of your project?',\n },\n ]);\n\n return directory;\n}\n\nasync function typescript() {\n const { useTypescript } = await inquirer.prompt<{\n useTypescript: boolean;\n }>([\n {\n type: 'confirm',\n name: 'useTypescript',\n message: 'Do you want to use Typescript ?',\n default: true,\n },\n ]);\n\n return useTypescript;\n}\n\nexport { directory, typescript };\n","export type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\nexport const detectPackageManager = (): PackageManager => {\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n\n return 'npm';\n};\n","import type { Question } from 'inquirer';\nimport type { DBClient } from './types';\n\ninterface QuestionFactory {\n (options: { client: DBClient }): Question;\n}\n\nconst DEFAULT_PORTS = {\n postgres: 5432,\n mysql: 3306,\n sqlite: undefined,\n};\n\nconst database: QuestionFactory = () => ({\n type: 'input',\n name: 'database',\n message: 'Database name:',\n default: 'strapi',\n validate(value: string) {\n if (value.includes('.')) {\n return `The database name can't contain a \".\"`;\n }\n\n return true;\n },\n});\n\nconst host: QuestionFactory = () => ({\n type: 'input',\n name: 'host',\n message: 'Host:',\n default: '127.0.0.1',\n});\n\nconst port: QuestionFactory = ({ client }) => ({\n type: 'input',\n name: 'port',\n message: 'Port:',\n default: DEFAULT_PORTS[client],\n});\n\nconst username: QuestionFactory = () => ({\n type: 'input',\n name: 'username',\n message: 'Username:',\n});\n\nconst password: QuestionFactory = () => ({\n type: 'password',\n name: 'password',\n message: 'Password:',\n mask: '*',\n});\n\nconst ssl: QuestionFactory = () => ({\n type: 'confirm',\n name: 'ssl',\n message: 'Enable SSL connection:',\n default: false,\n});\n\nconst filename: QuestionFactory = () => ({\n type: 'input',\n name: 'filename',\n message: 'Filename:',\n default: '.tmp/data.db',\n});\n\nexport default {\n sqlite: [filename],\n postgres: [database, host, port, username, password, ssl],\n mysql: [database, host, port, username, password, ssl],\n};\n","import inquirer from 'inquirer';\n\nimport type { Options, DBClient, DBConfig } from './types';\nimport dbQuestions from './db-questions';\n\nconst DBOptions = ['dbclient', 'dbhost', 'dbport', 'dbname', 'dbusername', 'dbpassword'];\n\nconst VALID_CLIENTS = ['sqlite', 'mysql', 'postgres'] as const;\n\nconst DEFAULT_CONFIG: DBConfig = {\n client: 'sqlite',\n connection: {\n filename: '.tmp/data.db',\n },\n};\n\nasync function dbPrompt() {\n const { useDefault } = await inquirer.prompt<{ useDefault: boolean }>([\n {\n type: 'confirm',\n name: 'useDefault',\n message: 'Use the default database (sqlite) ?',\n default: true,\n },\n ]);\n\n if (useDefault) {\n return DEFAULT_CONFIG;\n }\n\n const { client } = await inquirer.prompt<{ client: DBClient }>([\n {\n type: 'list',\n name: 'client',\n message: 'Choose your default database client',\n choices: ['sqlite', 'postgres', 'mysql'],\n default: 'sqlite',\n },\n ]);\n\n const questions = dbQuestions[client].map((q) => q({ client }));\n\n const responses = await inquirer.prompt(questions);\n\n return {\n client,\n connection: responses,\n };\n}\n\nexport async function getDatabaseInfos(options: Options): Promise<DBConfig> {\n const hasDBOptions = DBOptions.some((key) => key in options);\n\n if (!hasDBOptions) {\n if (options.quickstart) {\n return DEFAULT_CONFIG;\n }\n\n return dbPrompt();\n }\n\n if (!options.dbclient) {\n console.error('Please specify the database client');\n process.exit(1);\n }\n\n const database: DBConfig = {\n client: options.dbclient,\n connection: {\n host: options.dbhost,\n port: options.dbport,\n database: options.dbname,\n username: options.dbusername,\n password: options.dbpassword,\n filename: options.dbfile,\n },\n };\n\n if (options.dbssl !== undefined) {\n database.connection.ssl = options.dbssl === 'true';\n }\n\n return database;\n}\n\nexport function validateOptions(options: Options) {\n if (options.dbclient && !VALID_CLIENTS.includes(options.dbclient)) {\n console.error(\n `Invalid --dbclient: ${options.dbclient}, expected one of ${VALID_CLIENTS.join(', ')}`\n );\n process.exit(1);\n }\n\n const matchingArgs = DBOptions.filter((key) => key in options);\n const missingArgs = DBOptions.filter((key) => !(key in options));\n\n if (\n matchingArgs.length > 0 &&\n matchingArgs.length !== DBOptions.length &&\n options.dbclient !== 'sqlite'\n ) {\n console.error(`Required database arguments are missing: ${missingArgs.join(', ')}.`);\n process.exit(1);\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport commander from 'commander';\nimport { generateNewApp, type Options as GenerateNewAppOptions } from '@strapi/generate-new';\n\nimport * as prompts from './prompts';\nimport type { Options } from './types';\nimport { detectPackageManager } from './package-manager';\nimport * as database from './database';\n\nconst packageJson = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf8'));\n\nconst command = new commander.Command(packageJson.name);\n\ncommand\n .version(packageJson.version)\n .arguments('[directory]')\n .usage('[directory] [options]')\n .option('--quickstart', 'Quickstart app creation (deprecated)')\n .option('--no-run', 'Do not start the application after it is created.')\n\n // setup options\n .option('--ts, --typescript', 'Initialize the project with TypeScript (default)')\n .option('--js, --javascript', 'Initialize the project with Javascript')\n\n // Package manager options\n .option('--use-npm', 'Use npm as the project package manager')\n .option('--use-yarn', 'Use yarn as the project package manager')\n .option('--use-pnpm', 'Use pnpm as the project package manager')\n\n // Database options\n .option('--dbclient <dbclient>', 'Database client')\n .option('--dbhost <dbhost>', 'Database host')\n .option('--dbport <dbport>', 'Database port')\n .option('--dbname <dbname>', 'Database name')\n .option('--dbusername <dbusername>', 'Database username')\n .option('--dbpassword <dbpassword>', 'Database password')\n .option('--dbssl <dbssl>', 'Database SSL')\n .option('--dbfile <dbfile>', 'Database file path for sqlite')\n\n // templates\n .option('--template <templateurl>', 'Specify a Strapi template')\n .description('create a new application')\n .action((directory, options) => {\n createStrapiApp(directory, options);\n })\n .parse(process.argv);\n\nasync function createStrapiApp(directory: string | undefined, options: Options) {\n validateOptions(options);\n\n if (options.quickstart && !directory) {\n console.error('Please specify the <directory> of your project when using --quickstart');\n process.exit(1);\n }\n\n const appDirectory = directory || (await prompts.directory());\n\n const appOptions = {\n directory: appDirectory,\n useTypescript: true,\n packageManager: 'npm',\n template: options.template,\n isQuickstart: options.quickstart,\n } as GenerateNewAppOptions;\n\n if (options.javascript === true) {\n appOptions.useTypescript = false;\n } else if (options.typescript === true) {\n appOptions.useTypescript = true;\n } else {\n appOptions.useTypescript = options.quickstart ? true : await prompts.typescript();\n }\n\n if (options.useNpm === true) {\n appOptions.packageManager = 'npm';\n } else if (options.usePnpm === true) {\n appOptions.packageManager = 'pnpm';\n } else if (options.useYarn === true) {\n appOptions.packageManager = 'yarn';\n } else {\n appOptions.packageManager = detectPackageManager();\n }\n\n if (options.quickstart === true && options.run !== false) {\n appOptions.runApp = true;\n }\n\n appOptions.database = await database.getDatabaseInfos(options);\n\n return generateNewApp(appOptions)\n .then(() => {\n if (process.platform === 'win32') {\n process.exit(0);\n }\n })\n .catch((error) => {\n console.error(`Error: ${error.message}`);\n process.exit(1);\n });\n}\n\nasync function validateOptions(options: Options) {\n const programFlags = command\n .createHelp()\n .visibleOptions(command)\n .reduce<Array<string | undefined>>((acc, { short, long }) => [...acc, short, long], [])\n .filter(Boolean);\n\n if (options.template && programFlags.includes(options.template)) {\n console.error(`${options.template} is not a valid template`);\n process.exit(1);\n }\n\n if (options.javascript === true && options.typescript === true) {\n console.error('You cannot use both --typescript (--ts) and --javascript (--js) flags together');\n process.exit(1);\n }\n\n if ([options.useNpm, options.usePnpm, options.useYarn].filter(Boolean).length > 1) {\n console.error(\n 'You cannot specify multiple package managers at the same time (--use-npm, --use-pnpm, --use-yarn)'\n );\n process.exit(1);\n }\n\n database.validateOptions(options);\n}\n"],"names":["directory","database","validateOptions","prompts.directory","prompts.typescript","database.getDatabaseInfos","database.validateOptions"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-strapi-app",
3
- "version": "5.0.0-beta.10",
3
+ "version": "5.0.0-beta.11",
4
4
  "description": "Generate a new Strapi application.",
5
5
  "keywords": [
6
6
  "create-strapi-app",
@@ -43,19 +43,19 @@
43
43
  "watch": "pack-up watch"
44
44
  },
45
45
  "dependencies": {
46
- "@strapi/generate-new": "5.0.0-beta.10",
46
+ "@strapi/generate-new": "5.0.0-beta.11",
47
47
  "commander": "8.3.0",
48
48
  "inquirer": "8.2.5"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@strapi/pack-up": "5.0.0",
52
52
  "@types/inquirer": "8.2.5",
53
- "eslint-config-custom": "5.0.0-beta.10",
54
- "tsconfig": "5.0.0-beta.10"
53
+ "eslint-config-custom": "5.0.0-beta.11",
54
+ "tsconfig": "5.0.0-beta.11"
55
55
  },
56
56
  "engines": {
57
57
  "node": ">=18.0.0 <=20.x.x",
58
58
  "npm": ">=6.0.0"
59
59
  },
60
- "gitHead": "d4542f0dccfa2eecb55026dbd795042e7d0004ba"
60
+ "gitHead": "0991f0ac0f739e43e6a5f9ac79acb8c774c359bf"
61
61
  }