@faisalrmdhn08/allin-cli
Version:
A modern full-stack CLI tool based on Typescript designed to accelerate your app development process — setup your entire stack in one seamless command.
183 lines • 8.56 kB
JavaScript
import { BACKEND_FRAMEWORKS } from '../../constants/default.js';
import { EXPRESS_DEPENDENCIES, FASTIFY_DEPENDENCIES, KOA_DEPENDENCIES, NEST_DEPENDENCIES, NODE_DEPENDENCIES, } from '../../constants/packages/backend.js';
import { PathNotFoundError, UnidentifiedFrameworkError, } from '../../exceptions/error.js';
import { __unableOverwriteProject } from '../../exceptions/trigger.js';
import chalk from 'chalk';
import inquirer from 'inquirer';
import path from 'path';
import { MicroGenerator } from './micro.js';
import boxen from 'boxen';
export class BackendGenerator {
static #instance;
constructor() { }
static get instance() {
if (!BackendGenerator.#instance) {
BackendGenerator.#instance = new BackendGenerator();
}
return BackendGenerator.#instance;
}
async generate(params) {
const __backendFrameworkQuestion = await inquirer.prompt([
{
name: 'backendFramework',
type: 'list',
message: 'Which backend framework do you want to use:',
choices: BACKEND_FRAMEWORKS.frameworks
.sort((i, e) => i.name.toLowerCase().localeCompare(e.name.toLowerCase(), 'en-US'))
.map((f) => f.name),
default: 'express',
loop: false,
when: () => typeof params.optionValues.backend === 'undefined',
},
]);
const __backendFrameworkResource = typeof params.optionValues.backend !== 'undefined'
? BACKEND_FRAMEWORKS.frameworks.find((f) => f.name === params.optionValues.backend)
: BACKEND_FRAMEWORKS.frameworks.find((f) => f.name === __backendFrameworkQuestion.backendFramework);
if (!__backendFrameworkResource) {
throw new UnidentifiedFrameworkError(`${chalk.bold('Unidentified framework project')}: Backend framework resource is not defined.`);
}
const __backendFrameworkTemplateFolder = params.templatesFiles.find((f) => f.name === __backendFrameworkResource.templateName && f.isDirectory());
if (!__backendFrameworkTemplateFolder) {
throw new PathNotFoundError(`${chalk.bold('Path not found')}: Backend framework folder not found.`);
}
const __backendFrameworkTemplateSourcePath = path.join(__backendFrameworkTemplateFolder.parentPath, __backendFrameworkTemplateFolder.name);
const __backendFrameworkTemplateDesPath = path.join(params.optionValues.dir, params.projectName);
__unableOverwriteProject(__backendFrameworkTemplateDesPath, params.optionValues);
const __backendFrameworkMap = new Map([
[
'express',
{
name: 'express',
actualName: 'Express.js',
packages: EXPRESS_DEPENDENCIES.packages,
promptKey: 'expressDependencies',
templateSource: __backendFrameworkTemplateSourcePath,
templateDest: __backendFrameworkTemplateDesPath,
},
],
[
'fastify',
{
name: 'fastify',
actualName: 'Fastify',
packages: FASTIFY_DEPENDENCIES.packages,
promptKey: 'fastifyDependencies',
templateSource: __backendFrameworkTemplateSourcePath,
templateDest: __backendFrameworkTemplateDesPath,
},
],
[
'nest',
{
name: 'nest',
actualName: 'NestJS',
packages: NEST_DEPENDENCIES.packages,
promptKey: 'nestDependencies',
templateSource: __backendFrameworkTemplateSourcePath,
templateDest: __backendFrameworkTemplateDesPath,
},
],
[
'node',
{
name: 'node',
actualName: 'Node.js',
packages: NODE_DEPENDENCIES.packages,
promptKey: 'nodeDependencies',
templateSource: __backendFrameworkTemplateSourcePath,
templateDest: __backendFrameworkTemplateDesPath,
},
],
[
'koa',
{
name: 'koa',
actualName: 'Koa',
packages: KOA_DEPENDENCIES.packages,
promptKey: 'koaDependencies',
templateSource: __backendFrameworkTemplateSourcePath,
templateDest: __backendFrameworkTemplateDesPath,
},
],
]);
const __selectedBackendFramework = typeof params.optionValues.backend !== 'undefined'
? __backendFrameworkMap.get(params.optionValues.backend)
: __backendFrameworkMap.get(__backendFrameworkQuestion.backendFramework);
if (!__selectedBackendFramework) {
const errorMessage = typeof params.optionValues.backend !== 'undefined'
? `Unsupported framework: ${params.optionValues.backend}`
: `Unsupported framework: ${__backendFrameworkQuestion.backendFramework}`;
throw new Error(errorMessage);
}
const microGenerator = MicroGenerator.instance;
await microGenerator.setupProject({
spinner: params.spinner,
projectName: params.projectName,
selectedFramework: __selectedBackendFramework.actualName,
sourcePath: __selectedBackendFramework.templateSource,
desPath: __selectedBackendFramework.templateDest,
optionValues: params.optionValues,
});
if (params.optionValues.docker) {
const __dockerQuestion = await inquirer.prompt([
{
name: 'addDocker',
type: 'confirm',
message: 'Do you want us to add docker to your project? (optional)',
default: false,
},
{
name: 'addDockerBake',
type: 'confirm',
message: 'Do you want us to add docker bake too? (optional)',
default: false,
when: (a) => a.addDocker !== false,
},
]);
if (__dockerQuestion.addDocker) {
await microGenerator.setupDocker({
spinner: params.spinner,
isAddingDocker: __dockerQuestion.addDocker,
isAddingBake: __dockerQuestion.addDockerBake,
selectedPackageManager: params.optionValues.pm,
desPath: __selectedBackendFramework.templateDest,
});
}
}
const __dependenciesSelection = await inquirer.prompt([
{
name: __selectedBackendFramework.promptKey,
type: 'checkbox',
message: 'Select dependencies to include in your project:',
choices: __selectedBackendFramework.packages
.sort((i, e) => i.name.toLowerCase().localeCompare(e.name.toLowerCase(), 'en-US'))
.map((p) => p.originName),
loop: false,
},
]);
const __selectedDependencies = __dependenciesSelection[__selectedBackendFramework.promptKey];
await microGenerator.setupInstallation({
spinner: params.spinner,
selectedDependencies: __selectedDependencies,
selectedPackageManager: params.optionValues.pm,
projectName: params.projectName,
desPath: __selectedBackendFramework.templateDest,
});
await microGenerator.setupOthers({
spinner: params.spinner,
optionValues: params.optionValues,
projectType: params.projectType,
projectName: params.projectName,
selectedFramework: __backendFrameworkQuestion.backendFramework,
desPath: __selectedBackendFramework.templateDest,
});
console.log(boxen(`You can check the project on ${chalk.bold(__selectedBackendFramework.templateDest)}`, {
title: 'ⓘ Project Information ⓘ',
titleAlignment: 'center',
padding: 1,
margin: 1,
borderColor: 'blue',
}));
}
}
//# sourceMappingURL=backend.js.map