create-nuxtus
Version:
npx command for generating a new Nuxtus boilerplate website.
158 lines • 5.98 kB
JavaScript
import * as fs from 'fs';
import * as path from 'path';
import { ProjectType, askOptions, cleanUp, updatePackageJson, } from './lib/util.js';
import { installDBDriver, installDirectus, installDirectusHook, } from './lib/directus.js';
import { installLocaltunnel, installNuxt } from './lib/nuxt.js';
import chalk from 'chalk';
import commandExistsSync from 'command-exists';
import createEnv from './lib/directus-init/create-env.js';
import { databaseQuestions } from './lib/directus-init/questions.js';
import { execSync } from 'child_process';
import figlet from 'figlet';
import { getDriverForClient } from './lib/directus-init/drivers.js';
import inquirer from 'inquirer';
import ora from 'ora';
/************
* Some initial checks if we can run Nuxtus install script
*/
const currentNodeVersion = process.versions.node;
const semver = currentNodeVersion.split('.');
const major = Number(semver[0]);
if (major < 22) {
console.error(chalk.red('You are running Node ' +
currentNodeVersion +
'.\n' +
'Create Nuxtus requires Node 22 or higher. \n' +
'Please update your version of Node.'));
process.exit(1);
}
if (!commandExistsSync('git')) {
console.log(chalk.red('Git is required to install Nuxtus. Please install Git and try again.'));
process.exit(1);
}
if (process.argv.length < 3) {
console.log(chalk.red('You have to provide a name for your app.'));
console.log('For example :');
console.log(' npx create-nuxtus ' + chalk.bold('my-app'));
process.exit(1);
}
let options = {
dbType: 'SQLite',
directusURL: 'http://localhost:8055',
email: 'admin@example.com',
password: 'password',
};
console.log(chalk.green(figlet.textSync('nuxtus', { horizontalLayout: 'full' })));
const projectName = process.argv[2];
const currentPath = process.cwd();
const projectPath = path.join(currentPath, projectName);
const git_repo = 'https://github.com/nuxtus/nuxtus';
const branch = process.env.NUXTUS_BRANCH || 'main';
try {
fs.mkdirSync(projectPath);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
}
catch (err) {
if (err.code === 'EEXIST') {
console.log(chalk.red(`The folder ${projectName} already exist in the current directory, please try another name.`));
}
else {
console.log(chalk.red(err));
}
process.exit(1);
}
let dbClient;
let credentials;
const rootPath = path.join(process.cwd(), projectName, 'server');
async function main() {
try {
options = await askOptions();
dbClient = await getDriverForClient(options.dbType);
await installDBDriver(dbClient);
credentials = await inquirer.prompt(databaseQuestions[dbClient].map((question) => question({ client: dbClient, filepath: rootPath })));
}
catch (error) {
if (error.isTtyError) {
console.log(chalk.red("Prompt couldn't be rendered in the current environment"));
}
else {
// Something else went wrong
console.log(chalk.red(error));
}
}
console.log(''); // empty line between Directus questions and status messages
const nuxtusSpinner = ora('Downloading Nuxtus boilerplate...').start();
try {
execSync(`git clone --depth 1 -b ${branch} ${git_repo} ${projectPath}`, {
stdio: 'ignore',
});
nuxtusSpinner.succeed('Nuxtus boilerplate downloaded.');
process.chdir(projectPath);
}
catch (error) {
nuxtusSpinner.fail(chalk.red(`Failed cloning Nuxtus repo: ${error}`));
process.exit();
}
const pending = new Set(['Directus', 'Nuxt', 'boilerplate']);
const spinner = ora(`Setting up ${[...pending].join(', ')}...`).start();
function taskDone(name) {
pending.delete(name);
if (pending.size > 0) {
spinner.text = `Setting up ${[...pending].join(', ')}...`;
}
}
const directus = installDirectus()
.then(async () => {
// Replace "name": "server" in package.json with "name": ${packageName}
await updatePackageJson(projectName, ProjectType.Directus);
await createEnv(dbClient, credentials, rootPath, {
email: options.email,
password: options.password,
});
// Run the boilerplate install script here
execSync('cd server && npm run cli bootstrap', {
stdio: 'ignore',
});
await installDirectusHook();
taskDone('Directus');
})
.catch((error) => {
spinner.fail(`Failed installing Directus: ${error}`);
process.exit(1);
});
const nuxt = installNuxt(options.directusURL, options.email, options.password)
.then(() => {
updatePackageJson(projectName, ProjectType.Nuxt);
if (options.directusURL !== 'http://localhost:8055') {
installLocaltunnel();
}
taskDone('Nuxt');
})
.catch((error) => {
spinner.fail(chalk.red(`Failed installing Nuxt: ${error}`));
process.exit(1);
});
const cleanup = cleanUp(projectName)
.then(() => {
taskDone('boilerplate');
})
.catch((error) => {
spinner.fail(chalk.red(`Failed removing unused files: ${error}`));
process.exit(1);
});
Promise.all([directus, nuxt, cleanup]).then(() => {
spinner.succeed('Setup complete.');
execSync(`npx rimraf ./templates`);
console.log('\n');
console.log(chalk.green('🚀 Nuxtus site is ready for use!\n\n') +
chalk.white.bold('Directus\n') +
chalk.magenta.underline(`${options.directusURL}\n\n`) +
chalk.white.bold('Nuxtus\n') +
chalk.green.underline('http://localhost:3000\n\n') +
chalk.white(`cd ${projectName}` + '\nnpm start\n\n') +
chalk.green('For documentation see: ', chalk.underline('https://docs.nuxtus.com\n')));
});
}
main();
//# sourceMappingURL=main.js.map