UNPKG

@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.

194 lines 9.04 kB
import { FRONTEND_FRAMEWORKS } from '../../constants/default.js'; import { ASTRO_DEPENDENCIES, NEXT_DEPENDENCIES, SOLID_DEPENDENCIES, SVELTE_DEPENDENCIES, VANILLA_DEPENDENCIES, VUE_DEPENDENCIES, } from '../../constants/packages/frontend.js'; import { PathNotFoundError, UnidentifiedFrameworkError, } from '../../exceptions/error.js'; import { __unableOverwriteProject } from '../../exceptions/trigger.js'; import boxen from 'boxen'; import chalk from 'chalk'; import inquirer from 'inquirer'; import path from 'path'; import { MicroGenerator } from './micro.js'; export class FrontendGenerator { static #instance; constructor() { } static get instance() { if (!FrontendGenerator.#instance) { FrontendGenerator.#instance = new FrontendGenerator(); } return FrontendGenerator.#instance; } async generate(params) { const __frontendFrameworkSelection = await inquirer.prompt([ { name: 'frontendFramework', type: 'list', message: 'Which frontend framework do you want to use:', choices: FRONTEND_FRAMEWORKS.frameworks .sort((i, e) => i.name.toLowerCase().localeCompare(e.name.toLowerCase(), 'en-US')) .map((f) => f.name), default: 'astro', loop: false, when: () => typeof params.optionValues.frontend === 'undefined', }, ]); const __frontendFrameworkResource = typeof params.optionValues.frontend !== 'undefined' ? FRONTEND_FRAMEWORKS.frameworks.find((f) => f.name === params.optionValues.frontend) : FRONTEND_FRAMEWORKS.frameworks.find((f) => f.name === __frontendFrameworkSelection.frontendFramework); if (!__frontendFrameworkResource) { throw new UnidentifiedFrameworkError(`${chalk.bold('Unidentified framework project')}: Frontend framework resource is not defined.`); } const _frontendFrameworkFolder = params.templatesFiles.find((f) => f.name === __frontendFrameworkResource.templateName && f.isDirectory()); if (!_frontendFrameworkFolder) { throw new PathNotFoundError(`${chalk.bold('Path not found')}: Frontend framework folder not found.`); } const __frontendFrameworkTemplateSourcePath = path.join(_frontendFrameworkFolder.parentPath, _frontendFrameworkFolder.name); const __frontendFrameworkTemplateDesPath = path.join(params.optionValues.dir, params.projectName); __unableOverwriteProject(__frontendFrameworkTemplateDesPath, params.optionValues); const __frontendFrameworkMap = new Map([ [ 'astro', { name: 'astro', actualName: 'Astro.js', packages: ASTRO_DEPENDENCIES.packages, promptKey: 'astroDependencies', templateSource: __frontendFrameworkTemplateSourcePath, templateDest: __frontendFrameworkTemplateDesPath, }, ], [ 'next', { name: 'next', actualName: 'Next.js', packages: NEXT_DEPENDENCIES.packages, promptKey: 'nextDependencies', templateSource: __frontendFrameworkTemplateSourcePath, templateDest: __frontendFrameworkTemplateDesPath, }, ], [ 'solid', { name: 'solid', actualName: 'SolidJS', packages: SOLID_DEPENDENCIES.packages, promptKey: 'solidDependencies', templateSource: __frontendFrameworkTemplateSourcePath, templateDest: __frontendFrameworkTemplateDesPath, }, ], [ 'svelte', { name: 'svelte', actualName: 'Svelte', packages: SVELTE_DEPENDENCIES.packages, promptKey: 'svelteDependencies', templateSource: __frontendFrameworkTemplateSourcePath, templateDest: __frontendFrameworkTemplateDesPath, }, ], [ 'vue', { name: 'vue', actualName: 'Vue.js', packages: VUE_DEPENDENCIES.packages, promptKey: 'vueDependencies', templateSource: __frontendFrameworkTemplateSourcePath, templateDest: __frontendFrameworkTemplateDesPath, }, ], [ 'vanilla', { name: 'vanilla', actualName: 'VanillaJS', packages: VANILLA_DEPENDENCIES.packages, promptKey: 'vanillaDependencies', templateSource: __frontendFrameworkTemplateSourcePath, templateDest: __frontendFrameworkTemplateDesPath, }, ], ]); const __selectedFrontendFramework = typeof params.optionValues.frontend !== 'undefined' ? __frontendFrameworkMap.get(params.optionValues.frontend) : __frontendFrameworkMap.get(__frontendFrameworkSelection.frontendFramework); if (!__selectedFrontendFramework) { const errorMessage = typeof params.optionValues.frontend !== 'undefined' ? `Unsupported framework: ${params.optionValues.frontend}` : `Unsupported framework: ${__frontendFrameworkSelection.frontendFramework}`; throw new Error(errorMessage); } const microGenerator = MicroGenerator.instance; await microGenerator.setupProject({ spinner: params.spinner, projectName: params.projectName, selectedFramework: __selectedFrontendFramework.actualName, sourcePath: __selectedFrontendFramework.templateSource, desPath: __selectedFrontendFramework.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: __selectedFrontendFramework.templateDest, }); } } const __dependenciesSelection = await inquirer.prompt([ { name: __selectedFrontendFramework.promptKey, type: 'checkbox', message: 'Select dependencies to include in your project:', choices: __selectedFrontendFramework.packages .sort((i, e) => i.name.toLowerCase().localeCompare(e.name.toLowerCase(), 'en-US')) .map((p) => p.originName), loop: false, }, ]); const __selectedDependencies = __dependenciesSelection[__selectedFrontendFramework.promptKey]; await microGenerator.setupInstallation({ spinner: params.spinner, selectedDependencies: __selectedDependencies, selectedPackageManager: params.optionValues.pm, projectName: params.projectName, desPath: __selectedFrontendFramework.templateDest, }); await microGenerator.setupOthers({ spinner: params.spinner, optionValues: params.optionValues, projectType: params.projectType, projectName: params.projectName, selectedFramework: __frontendFrameworkSelection.frontendFramework, desPath: __selectedFrontendFramework.templateDest, }); console.log(boxen(`You can check the project on ${chalk.bold(__selectedFrontendFramework.templateDest)}`, { title: 'ⓘ Project Information ⓘ', titleAlignment: 'center', padding: 1, margin: 1, borderColor: 'blue', })); } } //# sourceMappingURL=frontend.js.map