@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
115 lines (113 loc) • 3.68 kB
JavaScript
import { generateHash } from "../../../utils/generate-hash.js";
import { defaultAdminPolicy, defaultAdminRole, defaultAdminUser } from "../../../utils/create-admin.js";
import run from "../../../database/migrations/run.js";
import runSeed from "../../../database/seeds/run.js";
import createDBConnection from "../../utils/create-db-connection.js";
import createEnv from "../../utils/create-env/index.js";
import { drivers, getDriverForClient } from "../../utils/drivers.js";
import { databaseQuestions } from "./questions.js";
import { randomUUID } from "node:crypto";
import Joi from "joi";
import chalk from "chalk";
import { execa } from "execa";
import inquirer from "inquirer";
import ora from "ora";
//#region src/cli/commands/init/index.ts
async function init() {
const rootPath = process.cwd();
const { client } = await inquirer.prompt([{
type: "list",
name: "client",
message: "Choose your database client",
choices: Object.values(drivers)
}]);
const dbClient = getDriverForClient(client);
const spinnerDriver = ora("Installing Database Driver...").start();
await execa("npm", [
"install",
dbClient,
"--production"
]);
spinnerDriver.stop();
let attemptsRemaining = 5;
const { credentials, db } = await trySeed();
async function trySeed() {
const credentials$1 = await inquirer.prompt(databaseQuestions[dbClient].map((question) => question({
client: dbClient,
filepath: rootPath
})));
const db$1 = createDBConnection(dbClient, credentials$1);
try {
await runSeed(db$1);
await run(db$1, "latest", false);
} catch (err) {
process.stdout.write("\nSomething went wrong while seeding the database:\n");
process.stdout.write(`\n${chalk.red(`[${err.code || "Error"}]`)} ${err.message}\n`);
process.stdout.write("\nPlease try again\n\n");
attemptsRemaining--;
if (attemptsRemaining > 0) return await trySeed();
else {
process.stdout.write("Couldn't seed the database. Exiting.\n");
process.exit(1);
}
}
return {
credentials: credentials$1,
db: db$1
};
}
await createEnv(dbClient, credentials, rootPath);
process.stdout.write("\nCreate your first admin user:\n\n");
const firstUser = await inquirer.prompt([{
type: "input",
name: "email",
message: "Email",
default: "admin@example.com",
validate: (input) => {
const { error } = Joi.string().email().required().validate(input.trim());
if (error) throw new Error("The email entered is not a valid email address!");
return true;
}
}, {
type: "password",
name: "password",
message: "Password",
mask: "*",
validate: (input) => {
if (input === null || input === "") throw new Error("The password cannot be empty!");
return true;
}
}]);
firstUser.password = await generateHash(firstUser.password);
const role = randomUUID();
const policy = randomUUID();
await db("directus_roles").insert({
...defaultAdminRole,
id: role
});
await db("directus_policies").insert({
...defaultAdminPolicy,
id: policy
});
await db("directus_access").insert({
id: randomUUID(),
role,
policy
});
await db("directus_users").insert({
...defaultAdminUser,
id: randomUUID(),
email: firstUser.email.trim(),
password: firstUser.password,
role
});
await db.destroy();
process.stdout.write(`\nYour project has been created at ${chalk.green(rootPath)}.\n`);
process.stdout.write(`\nThe configuration can be found in ${chalk.green(rootPath + "/.env")}\n`);
process.stdout.write(`\nStart Directus by running:\n`);
process.stdout.write(` ${chalk.blue("cd")} ${rootPath}\n`);
process.stdout.write(` ${chalk.blue("npx directus")} start\n`);
process.exit(0);
}
//#endregion
export { init as default };