create-strapi-app 5.0.0-beta.13 → 5.0.0-beta.15

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.
@@ -176,7 +176,7 @@ function validateOptions$1(options) {
176
176
  }
177
177
  const packageJson = JSON.parse(node_fs.readFileSync(node_path.resolve(__dirname, "../package.json"), "utf8"));
178
178
  const command = new commander__default.default.Command(packageJson.name);
179
- command.version(packageJson.version).arguments("[directory]").usage("[directory] [options]").option("--quickstart", "Quickstart app creation (deprecated)").option("--no-run", "Do not start the application after it is created.").option("--ts, --typescript", "Initialize the project with TypeScript (default)").option("--js, --javascript", "Initialize the project with Javascript").option("--use-npm", "Use npm as the project package manager").option("--use-yarn", "Use yarn as the project package manager").option("--use-pnpm", "Use pnpm as the project package manager").option("--dbclient <dbclient>", "Database client").option("--dbhost <dbhost>", "Database host").option("--dbport <dbport>", "Database port").option("--dbname <dbname>", "Database name").option("--dbusername <dbusername>", "Database username").option("--dbpassword <dbpassword>", "Database password").option("--dbssl <dbssl>", "Database SSL").option("--dbfile <dbfile>", "Database file path for sqlite").option("--template <templateurl>", "Specify a Strapi template").description("create a new application").action((directory2, options) => {
179
+ command.version(packageJson.version).arguments("[directory]").usage("[directory] [options]").option("--quickstart", "Quickstart app creation (deprecated)").option("--no-run", "Do not start the application after it is created.").option("--ts, --typescript", "Initialize the project with TypeScript (default)").option("--js, --javascript", "Initialize the project with Javascript").option("--use-npm", "Use npm as the project package manager").option("--use-yarn", "Use yarn as the project package manager").option("--use-pnpm", "Use pnpm as the project package manager").option("--dbclient <dbclient>", "Database client").option("--dbhost <dbhost>", "Database host").option("--dbport <dbport>", "Database port").option("--dbname <dbname>", "Database name").option("--dbusername <dbusername>", "Database username").option("--dbpassword <dbpassword>", "Database password").option("--dbssl <dbssl>", "Database SSL").option("--dbfile <dbfile>", "Database file path for sqlite").description("create a new application").action((directory2, options) => {
180
180
  createStrapiApp(directory2, options);
181
181
  }).parse(process.argv);
182
182
  async function createStrapiApp(directory$1, options) {
@@ -190,7 +190,7 @@ async function createStrapiApp(directory$1, options) {
190
190
  directory: appDirectory,
191
191
  useTypescript: true,
192
192
  packageManager: "npm",
193
- template: options.template,
193
+ // template: options.template,
194
194
  isQuickstart: options.quickstart
195
195
  };
196
196
  if (options.javascript === true) {
@@ -223,11 +223,6 @@ async function createStrapiApp(directory$1, options) {
223
223
  });
224
224
  }
225
225
  async function validateOptions(options) {
226
- const programFlags = command.createHelp().visibleOptions(command).reduce((acc, { short, long }) => [...acc, short, long], []).filter(Boolean);
227
- if (options.template && programFlags.includes(options.template)) {
228
- console.error(`${options.template} is not a valid template`);
229
- process.exit(1);
230
- }
231
226
  if (options.javascript === true && options.typescript === true) {
232
227
  console.error("You cannot use both --typescript (--ts) and --javascript (--js) flags together");
233
228
  process.exit(1);
@@ -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 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":";;;;;;;;;AAEA,eAAe,YAAY;AACzB,QAAM,EAAE,WAAAA,WAAc,IAAA,MAAMC,kBAAAA,QAAS,OAElC;AAAA,IACD;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EAAA,CACD;AAEMD,SAAAA;AACT;AAEA,eAAe,aAAa;AAC1B,QAAM,EAAE,cAAA,IAAkB,MAAMC,kBAAAA,QAAS,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;AAAA,IACV,UAAU;AAAA,EACZ;AACF;AAEA,eAAe,WAAW;AACxB,QAAM,EAAE,WAAA,IAAe,MAAMA,kBAAAA,QAAS,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,MAAMA,kBAAAA,QAAS,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,MAAMA,kBAAAA,QAAS,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;AC9FA,MAAM,cAAc,KAAK,MAAMC,qBAAaC,UAAAA,QAAQ,WAAW,iBAAiB,GAAG,MAAM,CAAC;AAE1F,MAAM,UAAU,IAAIC,mBAAU,QAAA,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,CAACN,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,MAAMO;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,SAAOC,2BAAe,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.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';\n\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// import { handleCloudProject } from './cloud';\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 // TODO V5: Uncomment when cloud-cli is ready\n // .option('--skip-cloud', 'Skip cloud login and project creation')\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 // TODO V5: Uncomment when cloud-cli is ready\n // if (!options.skipCloud) {\n // checkRequirements();\n // await handleCloudProject(projectName);\n // }\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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"}
@@ -172,7 +172,7 @@ function validateOptions$1(options) {
172
172
  }
173
173
  const packageJson = JSON.parse(readFileSync(resolve(__dirname, "../package.json"), "utf8"));
174
174
  const command = new commander.Command(packageJson.name);
175
- command.version(packageJson.version).arguments("[directory]").usage("[directory] [options]").option("--quickstart", "Quickstart app creation (deprecated)").option("--no-run", "Do not start the application after it is created.").option("--ts, --typescript", "Initialize the project with TypeScript (default)").option("--js, --javascript", "Initialize the project with Javascript").option("--use-npm", "Use npm as the project package manager").option("--use-yarn", "Use yarn as the project package manager").option("--use-pnpm", "Use pnpm as the project package manager").option("--dbclient <dbclient>", "Database client").option("--dbhost <dbhost>", "Database host").option("--dbport <dbport>", "Database port").option("--dbname <dbname>", "Database name").option("--dbusername <dbusername>", "Database username").option("--dbpassword <dbpassword>", "Database password").option("--dbssl <dbssl>", "Database SSL").option("--dbfile <dbfile>", "Database file path for sqlite").option("--template <templateurl>", "Specify a Strapi template").description("create a new application").action((directory2, options) => {
175
+ command.version(packageJson.version).arguments("[directory]").usage("[directory] [options]").option("--quickstart", "Quickstart app creation (deprecated)").option("--no-run", "Do not start the application after it is created.").option("--ts, --typescript", "Initialize the project with TypeScript (default)").option("--js, --javascript", "Initialize the project with Javascript").option("--use-npm", "Use npm as the project package manager").option("--use-yarn", "Use yarn as the project package manager").option("--use-pnpm", "Use pnpm as the project package manager").option("--dbclient <dbclient>", "Database client").option("--dbhost <dbhost>", "Database host").option("--dbport <dbport>", "Database port").option("--dbname <dbname>", "Database name").option("--dbusername <dbusername>", "Database username").option("--dbpassword <dbpassword>", "Database password").option("--dbssl <dbssl>", "Database SSL").option("--dbfile <dbfile>", "Database file path for sqlite").description("create a new application").action((directory2, options) => {
176
176
  createStrapiApp(directory2, options);
177
177
  }).parse(process.argv);
178
178
  async function createStrapiApp(directory$1, options) {
@@ -186,7 +186,7 @@ async function createStrapiApp(directory$1, options) {
186
186
  directory: appDirectory,
187
187
  useTypescript: true,
188
188
  packageManager: "npm",
189
- template: options.template,
189
+ // template: options.template,
190
190
  isQuickstart: options.quickstart
191
191
  };
192
192
  if (options.javascript === true) {
@@ -219,11 +219,6 @@ async function createStrapiApp(directory$1, options) {
219
219
  });
220
220
  }
221
221
  async function validateOptions(options) {
222
- const programFlags = command.createHelp().visibleOptions(command).reduce((acc, { short, long }) => [...acc, short, long], []).filter(Boolean);
223
- if (options.template && programFlags.includes(options.template)) {
224
- console.error(`${options.template} is not a valid template`);
225
- process.exit(1);
226
- }
227
222
  if (options.javascript === true && options.typescript === true) {
228
223
  console.error("You cannot use both --typescript (--ts) and --javascript (--js) flags together");
229
224
  process.exit(1);
@@ -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 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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"}
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';\n\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// import { handleCloudProject } from './cloud';\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 // TODO V5: Uncomment when cloud-cli is ready\n // .option('--skip-cloud', 'Skip cloud login and project creation')\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 // TODO V5: Uncomment when cloud-cli is ready\n // if (!options.skipCloud) {\n // checkRequirements();\n // await handleCloudProject(projectName);\n // }\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.13",
3
+ "version": "5.0.0-beta.15",
4
4
  "description": "Generate a new Strapi application.",
5
5
  "keywords": [
6
6
  "create-strapi-app",
@@ -43,19 +43,21 @@
43
43
  "watch": "pack-up watch"
44
44
  },
45
45
  "dependencies": {
46
- "@strapi/generate-new": "5.0.0-beta.13",
46
+ "@strapi/cloud-cli": "5.0.0-beta.15",
47
+ "@strapi/generate-new": "5.0.0-beta.15",
48
+ "chalk": "4.1.2",
47
49
  "commander": "8.3.0",
48
50
  "inquirer": "8.2.5"
49
51
  },
50
52
  "devDependencies": {
51
53
  "@strapi/pack-up": "5.0.0",
52
54
  "@types/inquirer": "8.2.5",
53
- "eslint-config-custom": "5.0.0-beta.13",
54
- "tsconfig": "5.0.0-beta.13"
55
+ "eslint-config-custom": "5.0.0-beta.15",
56
+ "tsconfig": "5.0.0-beta.15"
55
57
  },
56
58
  "engines": {
57
59
  "node": ">=18.0.0 <=20.x.x",
58
60
  "npm": ">=6.0.0"
59
61
  },
60
- "gitHead": "346110fac182d06b40f9089ee3e224352835b710"
62
+ "gitHead": "bdee57a0571da734d9a1c4b5c35b3bbdb26fda8b"
61
63
  }