{"version":3,"file":"database.mjs","sources":["../../src/utils/database.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport type { Question } from 'inquirer';\n\nimport type { Scope, Options, DBClient, DBConfig } from '../types';\nimport { logger } from './logger';\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: 'Do you want to 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  if (options.skipDb) {\n    return DEFAULT_CONFIG;\n  }\n\n  if (options.dbclient && !VALID_CLIENTS.includes(options.dbclient)) {\n    logger.fatal(\n      `Invalid --dbclient: ${options.dbclient}, expected one of ${VALID_CLIENTS.join(', ')}`\n    );\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    logger.fatal(`Required database arguments are missing: ${missingArgs.join(', ')}.`);\n  }\n\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    return logger.fatal('Please specify the database client');\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\nconst sqlClientModule = {\n  mysql: { mysql2: '3.9.8' },\n  postgres: { pg: '8.8.0' },\n  sqlite: { 'better-sqlite3': '11.3.0' },\n};\n\nexport function addDatabaseDependencies(scope: Scope) {\n  scope.dependencies = {\n    ...scope.dependencies,\n    ...sqlClientModule[scope.database.client],\n  };\n}\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\nconst dbQuestions = {\n  sqlite: [filename],\n  postgres: [database, host, port, username, password, ssl],\n  mysql: [database, host, port, username, password, ssl],\n};\n"],"names":["DBOptions","VALID_CLIENTS","DEFAULT_CONFIG","client","connection","filename","dbPrompt","useDefault","inquirer","prompt","type","name","message","default","choices","questions","dbQuestions","map","q","responses","getDatabaseInfos","options","skipDb","dbclient","includes","logger","fatal","join","matchingArgs","filter","key","missingArgs","length","hasDBOptions","some","quickstart","database","host","dbhost","port","dbport","dbname","username","dbusername","password","dbpassword","dbfile","dbssl","undefined","ssl","sqlClientModule","mysql","mysql2","postgres","pg","sqlite","addDatabaseDependencies","scope","dependencies","DEFAULT_PORTS","validate","value","mask"],"mappings":"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"}