create-strapi-app 5.0.0-rc.1 → 5.0.0-rc.2
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.
|
@@ -4,9 +4,12 @@ const node_path = require("node:path");
|
|
|
4
4
|
const commander = require("commander");
|
|
5
5
|
const generateNew = require("@strapi/generate-new");
|
|
6
6
|
const inquirer = require("inquirer");
|
|
7
|
+
const cloudCli = require("@strapi/cloud-cli");
|
|
8
|
+
const chalk = require("chalk");
|
|
7
9
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
8
10
|
const commander__default = /* @__PURE__ */ _interopDefault(commander);
|
|
9
11
|
const inquirer__default = /* @__PURE__ */ _interopDefault(inquirer);
|
|
12
|
+
const chalk__default = /* @__PURE__ */ _interopDefault(chalk);
|
|
10
13
|
async function directory() {
|
|
11
14
|
const { directory: directory2 } = await inquirer__default.default.prompt([
|
|
12
15
|
{
|
|
@@ -174,9 +177,77 @@ function validateOptions$1(options) {
|
|
|
174
177
|
process.exit(1);
|
|
175
178
|
}
|
|
176
179
|
}
|
|
180
|
+
const supportedStyles = {
|
|
181
|
+
magentaBright: chalk__default.default.magentaBright,
|
|
182
|
+
blueBright: chalk__default.default.blueBright,
|
|
183
|
+
yellowBright: chalk__default.default.yellowBright,
|
|
184
|
+
green: chalk__default.default.green,
|
|
185
|
+
red: chalk__default.default.red,
|
|
186
|
+
bold: chalk__default.default.bold,
|
|
187
|
+
italic: chalk__default.default.italic
|
|
188
|
+
};
|
|
189
|
+
function parseToChalk(template) {
|
|
190
|
+
let result = template;
|
|
191
|
+
for (const [color, chalkFunction] of Object.entries(supportedStyles)) {
|
|
192
|
+
const regex = new RegExp(`{${color}}(.*?){/${color}}`, "g");
|
|
193
|
+
result = result.replace(regex, (_, p1) => chalkFunction(p1.trim()));
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
function assertCloudError(e) {
|
|
198
|
+
if (e.response === void 0) {
|
|
199
|
+
throw Error("Expected CloudError");
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async function handleCloudLogin() {
|
|
203
|
+
const logger = cloudCli.services.createLogger({
|
|
204
|
+
silent: false,
|
|
205
|
+
debug: process.argv.includes("--debug"),
|
|
206
|
+
timestamp: false
|
|
207
|
+
});
|
|
208
|
+
const cloudApiService = await cloudCli.services.cloudApiFactory({ logger });
|
|
209
|
+
const defaultErrorMessage = "An error occurred while trying to interact with Strapi Cloud. Use strapi deploy command once the project is generated.";
|
|
210
|
+
try {
|
|
211
|
+
const { data: config } = await cloudApiService.config();
|
|
212
|
+
logger.log(parseToChalk(config.projectCreation.introText));
|
|
213
|
+
} catch (e) {
|
|
214
|
+
logger.debug(e);
|
|
215
|
+
logger.error(defaultErrorMessage);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const { userChoice } = await inquirer__default.default.prompt([
|
|
219
|
+
{
|
|
220
|
+
type: "list",
|
|
221
|
+
name: "userChoice",
|
|
222
|
+
message: `Please log in or sign up.`,
|
|
223
|
+
choices: ["Login/Sign up", "Skip"]
|
|
224
|
+
}
|
|
225
|
+
]);
|
|
226
|
+
if (userChoice !== "Skip") {
|
|
227
|
+
const cliContext = {
|
|
228
|
+
logger,
|
|
229
|
+
cwd: process.cwd()
|
|
230
|
+
};
|
|
231
|
+
try {
|
|
232
|
+
await cloudCli.cli.login.action(cliContext);
|
|
233
|
+
} catch (e) {
|
|
234
|
+
logger.debug(e);
|
|
235
|
+
try {
|
|
236
|
+
assertCloudError(e);
|
|
237
|
+
if (e.response.status === 403) {
|
|
238
|
+
const message = typeof e.response.data === "string" ? e.response.data : "We are sorry, but we are not able to log you into Strapi Cloud at the moment.";
|
|
239
|
+
logger.warn(message);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
} catch (e2) {
|
|
243
|
+
}
|
|
244
|
+
logger.error(defaultErrorMessage);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
177
248
|
const packageJson = JSON.parse(node_fs.readFileSync(node_path.resolve(__dirname, "../package.json"), "utf8"));
|
|
178
249
|
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").description("create a new application").action((directory2, options) => {
|
|
250
|
+
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("--skip-cloud", "Skip cloud login and project creation").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
251
|
createStrapiApp(directory2, options);
|
|
181
252
|
}).parse(process.argv);
|
|
182
253
|
async function createStrapiApp(directory$1, options) {
|
|
@@ -186,6 +257,9 @@ async function createStrapiApp(directory$1, options) {
|
|
|
186
257
|
process.exit(1);
|
|
187
258
|
}
|
|
188
259
|
const appDirectory = directory$1 || await directory();
|
|
260
|
+
if (!options.skipCloud) {
|
|
261
|
+
await handleCloudLogin();
|
|
262
|
+
}
|
|
189
263
|
const appOptions = {
|
|
190
264
|
directory: appDirectory,
|
|
191
265
|
useTypescript: true,
|
|
@@ -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';\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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"}
|
|
1
|
+
{"version":3,"file":"create-strapi-app.js","sources":["../src/prompts.ts","../src/package-manager.ts","../src/db-questions.ts","../src/database.ts","../src/utils/parse-to-chalk.ts","../src/cloud.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 chalk from 'chalk';\n\n// TODO: move styles to API\n\nconst supportedStyles = {\n magentaBright: chalk.magentaBright,\n blueBright: chalk.blueBright,\n yellowBright: chalk.yellowBright,\n green: chalk.green,\n red: chalk.red,\n bold: chalk.bold,\n italic: chalk.italic,\n};\n\nexport default function parseToChalk(template: string) {\n let result = template;\n\n for (const [color, chalkFunction] of Object.entries(supportedStyles)) {\n const regex = new RegExp(`{${color}}(.*?){/${color}}`, 'g');\n result = result.replace(regex, (_, p1) => chalkFunction(p1.trim()));\n }\n\n return result;\n}\n","import inquirer from 'inquirer';\nimport { cli as cloudCli, services as cloudServices } from '@strapi/cloud-cli';\nimport parseToChalk from './utils/parse-to-chalk';\n\ninterface CloudError {\n response: {\n status: number;\n data: string | object;\n };\n}\n\nfunction assertCloudError(e: unknown): asserts e is CloudError {\n if ((e as CloudError).response === undefined) {\n throw Error('Expected CloudError');\n }\n}\n\nexport async function handleCloudLogin(): Promise<void> {\n const logger = cloudServices.createLogger({\n silent: false,\n debug: process.argv.includes('--debug'),\n timestamp: false,\n });\n const cloudApiService = await cloudServices.cloudApiFactory({ logger });\n const defaultErrorMessage =\n 'An error occurred while trying to interact with Strapi Cloud. Use strapi deploy command once the project is generated.';\n\n try {\n const { data: config } = await cloudApiService.config();\n logger.log(parseToChalk(config.projectCreation.introText));\n } catch (e: unknown) {\n logger.debug(e);\n logger.error(defaultErrorMessage);\n return;\n }\n const { userChoice } = await inquirer.prompt<{ userChoice: string }>([\n {\n type: 'list',\n name: 'userChoice',\n message: `Please log in or sign up.`,\n choices: ['Login/Sign up', 'Skip'],\n },\n ]);\n\n if (userChoice !== 'Skip') {\n const cliContext = {\n logger,\n cwd: process.cwd(),\n };\n\n try {\n await cloudCli.login.action(cliContext);\n } catch (e: Error | CloudError | unknown) {\n logger.debug(e);\n try {\n assertCloudError(e);\n if (e.response.status === 403) {\n const message =\n typeof e.response.data === 'string'\n ? e.response.data\n : 'We are sorry, but we are not able to log you into Strapi Cloud at the moment.';\n logger.warn(message);\n return;\n }\n } catch (e) {\n /* empty */\n }\n logger.error(defaultErrorMessage);\n }\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';\nimport { handleCloudLogin } 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 // Cloud options\n .option('--skip-cloud', 'Skip cloud login and project creation')\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 if (!options.skipCloud) {\n await handleCloudLogin();\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","chalk","cloudServices","cloudCli","e","readFileSync","resolve","commander","prompts.directory","prompts.typescript","database.getDatabaseInfos","generateNewApp","database.validateOptions"],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import commander from "commander";
|
|
4
4
|
import { generateNewApp } from "@strapi/generate-new";
|
|
5
5
|
import inquirer from "inquirer";
|
|
6
|
+
import { services, cli } from "@strapi/cloud-cli";
|
|
7
|
+
import chalk from "chalk";
|
|
6
8
|
async function directory() {
|
|
7
9
|
const { directory: directory2 } = await inquirer.prompt([
|
|
8
10
|
{
|
|
@@ -170,9 +172,77 @@ function validateOptions$1(options) {
|
|
|
170
172
|
process.exit(1);
|
|
171
173
|
}
|
|
172
174
|
}
|
|
175
|
+
const supportedStyles = {
|
|
176
|
+
magentaBright: chalk.magentaBright,
|
|
177
|
+
blueBright: chalk.blueBright,
|
|
178
|
+
yellowBright: chalk.yellowBright,
|
|
179
|
+
green: chalk.green,
|
|
180
|
+
red: chalk.red,
|
|
181
|
+
bold: chalk.bold,
|
|
182
|
+
italic: chalk.italic
|
|
183
|
+
};
|
|
184
|
+
function parseToChalk(template) {
|
|
185
|
+
let result = template;
|
|
186
|
+
for (const [color, chalkFunction] of Object.entries(supportedStyles)) {
|
|
187
|
+
const regex = new RegExp(`{${color}}(.*?){/${color}}`, "g");
|
|
188
|
+
result = result.replace(regex, (_, p1) => chalkFunction(p1.trim()));
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
function assertCloudError(e) {
|
|
193
|
+
if (e.response === void 0) {
|
|
194
|
+
throw Error("Expected CloudError");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function handleCloudLogin() {
|
|
198
|
+
const logger = services.createLogger({
|
|
199
|
+
silent: false,
|
|
200
|
+
debug: process.argv.includes("--debug"),
|
|
201
|
+
timestamp: false
|
|
202
|
+
});
|
|
203
|
+
const cloudApiService = await services.cloudApiFactory({ logger });
|
|
204
|
+
const defaultErrorMessage = "An error occurred while trying to interact with Strapi Cloud. Use strapi deploy command once the project is generated.";
|
|
205
|
+
try {
|
|
206
|
+
const { data: config } = await cloudApiService.config();
|
|
207
|
+
logger.log(parseToChalk(config.projectCreation.introText));
|
|
208
|
+
} catch (e) {
|
|
209
|
+
logger.debug(e);
|
|
210
|
+
logger.error(defaultErrorMessage);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const { userChoice } = await inquirer.prompt([
|
|
214
|
+
{
|
|
215
|
+
type: "list",
|
|
216
|
+
name: "userChoice",
|
|
217
|
+
message: `Please log in or sign up.`,
|
|
218
|
+
choices: ["Login/Sign up", "Skip"]
|
|
219
|
+
}
|
|
220
|
+
]);
|
|
221
|
+
if (userChoice !== "Skip") {
|
|
222
|
+
const cliContext = {
|
|
223
|
+
logger,
|
|
224
|
+
cwd: process.cwd()
|
|
225
|
+
};
|
|
226
|
+
try {
|
|
227
|
+
await cli.login.action(cliContext);
|
|
228
|
+
} catch (e) {
|
|
229
|
+
logger.debug(e);
|
|
230
|
+
try {
|
|
231
|
+
assertCloudError(e);
|
|
232
|
+
if (e.response.status === 403) {
|
|
233
|
+
const message = typeof e.response.data === "string" ? e.response.data : "We are sorry, but we are not able to log you into Strapi Cloud at the moment.";
|
|
234
|
+
logger.warn(message);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
} catch (e2) {
|
|
238
|
+
}
|
|
239
|
+
logger.error(defaultErrorMessage);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
173
243
|
const packageJson = JSON.parse(readFileSync(resolve(__dirname, "../package.json"), "utf8"));
|
|
174
244
|
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").description("create a new application").action((directory2, options) => {
|
|
245
|
+
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("--skip-cloud", "Skip cloud login and project creation").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
246
|
createStrapiApp(directory2, options);
|
|
177
247
|
}).parse(process.argv);
|
|
178
248
|
async function createStrapiApp(directory$1, options) {
|
|
@@ -182,6 +252,9 @@ async function createStrapiApp(directory$1, options) {
|
|
|
182
252
|
process.exit(1);
|
|
183
253
|
}
|
|
184
254
|
const appDirectory = directory$1 || await directory();
|
|
255
|
+
if (!options.skipCloud) {
|
|
256
|
+
await handleCloudLogin();
|
|
257
|
+
}
|
|
185
258
|
const appOptions = {
|
|
186
259
|
directory: appDirectory,
|
|
187
260
|
useTypescript: true,
|
|
@@ -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';\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":";;;;;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;AAAA,IACV,UAAU;AAAA,EACZ;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,EAK9D,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,EAI3D,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;AAQzC,QAAM,aAAa;AAAA,IACjB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA;AAAA,IAEhB,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;AAY/C,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/utils/parse-to-chalk.ts","../src/cloud.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 chalk from 'chalk';\n\n// TODO: move styles to API\n\nconst supportedStyles = {\n magentaBright: chalk.magentaBright,\n blueBright: chalk.blueBright,\n yellowBright: chalk.yellowBright,\n green: chalk.green,\n red: chalk.red,\n bold: chalk.bold,\n italic: chalk.italic,\n};\n\nexport default function parseToChalk(template: string) {\n let result = template;\n\n for (const [color, chalkFunction] of Object.entries(supportedStyles)) {\n const regex = new RegExp(`{${color}}(.*?){/${color}}`, 'g');\n result = result.replace(regex, (_, p1) => chalkFunction(p1.trim()));\n }\n\n return result;\n}\n","import inquirer from 'inquirer';\nimport { cli as cloudCli, services as cloudServices } from '@strapi/cloud-cli';\nimport parseToChalk from './utils/parse-to-chalk';\n\ninterface CloudError {\n response: {\n status: number;\n data: string | object;\n };\n}\n\nfunction assertCloudError(e: unknown): asserts e is CloudError {\n if ((e as CloudError).response === undefined) {\n throw Error('Expected CloudError');\n }\n}\n\nexport async function handleCloudLogin(): Promise<void> {\n const logger = cloudServices.createLogger({\n silent: false,\n debug: process.argv.includes('--debug'),\n timestamp: false,\n });\n const cloudApiService = await cloudServices.cloudApiFactory({ logger });\n const defaultErrorMessage =\n 'An error occurred while trying to interact with Strapi Cloud. Use strapi deploy command once the project is generated.';\n\n try {\n const { data: config } = await cloudApiService.config();\n logger.log(parseToChalk(config.projectCreation.introText));\n } catch (e: unknown) {\n logger.debug(e);\n logger.error(defaultErrorMessage);\n return;\n }\n const { userChoice } = await inquirer.prompt<{ userChoice: string }>([\n {\n type: 'list',\n name: 'userChoice',\n message: `Please log in or sign up.`,\n choices: ['Login/Sign up', 'Skip'],\n },\n ]);\n\n if (userChoice !== 'Skip') {\n const cliContext = {\n logger,\n cwd: process.cwd(),\n };\n\n try {\n await cloudCli.login.action(cliContext);\n } catch (e: Error | CloudError | unknown) {\n logger.debug(e);\n try {\n assertCloudError(e);\n if (e.response.status === 403) {\n const message =\n typeof e.response.data === 'string'\n ? e.response.data\n : 'We are sorry, but we are not able to log you into Strapi Cloud at the moment.';\n logger.warn(message);\n return;\n }\n } catch (e) {\n /* empty */\n }\n logger.error(defaultErrorMessage);\n }\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';\nimport { handleCloudLogin } 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 // Cloud options\n .option('--skip-cloud', 'Skip cloud login and project creation')\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 if (!options.skipCloud) {\n await handleCloudLogin();\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","cloudServices","cloudCli","e","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-rc.
|
|
3
|
+
"version": "5.0.0-rc.2",
|
|
4
4
|
"description": "Generate a new Strapi application.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"create-strapi-app",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"watch": "pack-up watch"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@strapi/cloud-cli": "5.0.0-rc.
|
|
47
|
-
"@strapi/generate-new": "5.0.0-rc.
|
|
46
|
+
"@strapi/cloud-cli": "5.0.0-rc.2",
|
|
47
|
+
"@strapi/generate-new": "5.0.0-rc.2",
|
|
48
48
|
"chalk": "4.1.2",
|
|
49
49
|
"commander": "8.3.0",
|
|
50
50
|
"inquirer": "8.2.5"
|
|
@@ -52,12 +52,12 @@
|
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@strapi/pack-up": "5.0.0",
|
|
54
54
|
"@types/inquirer": "8.2.5",
|
|
55
|
-
"eslint-config-custom": "5.0.0-rc.
|
|
56
|
-
"tsconfig": "5.0.0-rc.
|
|
55
|
+
"eslint-config-custom": "5.0.0-rc.2",
|
|
56
|
+
"tsconfig": "5.0.0-rc.2"
|
|
57
57
|
},
|
|
58
58
|
"engines": {
|
|
59
59
|
"node": ">=18.0.0 <=20.x.x",
|
|
60
60
|
"npm": ">=6.0.0"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "c3f078328f8506cd543f6635b992d8648cb8c501"
|
|
63
63
|
}
|