UNPKG

next-porto-cli

Version:

A cli for next.js to scaffold your application using porto architecture

344 lines (343 loc) 12.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.appcontainersGenerator = exports.pagesApiGenerator = exports.pagesGenerator = exports.stylesGenerator = exports.actionsGenerator = exports.hooksGenerator = exports.helpersGenerator = exports.componentsGenerator = exports.configsGenerator = exports.assetsGenerator = exports.runGenerator = exports.generateFromPaths = void 0; /* eslint-disable @typescript-eslint/no-this-alias */ /* eslint-disable unicorn/no-this-assignment */ /* eslint-disable node/no-extraneous-import */ /* eslint-disable no-prototype-builtins */ /* eslint-disable unicorn/prefer-module */ require("module-alias/register"); const _ = require("lodash"); const path = require("node:path"); const core_1 = require("@oclif/core"); const path_1 = require("@helpers/path"); const str = require("@helpers/string"); const config_1 = require("./config"); const filesystem = require("@helpers/filesystem"); // * Objects // * Types // * context of parent this const _this = this; // * files to generate in a container const mapFilesContent = { appcontainers: '.gitkeep', assets: '.gitkeep', configs: '-config.{{ext}}s', components: '.gitkeep', helpers: '.gitkeep', hooks: '.gitkeep', actions: '.gitkeep', styles: '{{container}}.css', pages: 'index.{{ext}}sx', api: 'index.{{ext}}s', }; const checkExt = async () => { const configFile = await (0, config_1.checkConfigFile)(path.resolve((0, path_1.getPath)('src'))); return configFile.toLowerCase().includes('jsonconfig') ? 'j' : 't'; }; /** * Create files from paths * @param _paths object containing the file paths to scaffold * @returns void */ const generateFromPaths = async (_paths) => { // * reference to be used later _this.refContainersPaths = _paths; // * core_1.CliUx.ux.action.start('Creating files...'); try { // * loop through the scaffold paths & create necessary files & directories for (const [key, path] of Object.entries(_paths)) { // * const lowerKey = key.toLowerCase(); // * map file contents for (const [pathKey] of Object.entries(mapFilesContent)) { if (lowerKey.includes(pathKey)) { if (pathKey === 'pages' && lowerKey === 'pagesapipath') { continue; } const callFuncString = pathKey === 'api' ? 'pagesApiGenerator' : `${pathKey}Generator`; // * run generator file runGenerator(callFuncString, path); } } } } catch (error) { core_1.CliUx.ux.action.stop('Error occured.'); console.log({ error }); } // * core_1.CliUx.ux.action.stop('Done.'); }; exports.generateFromPaths = generateFromPaths; /** * Run file generator function base on the ff. parameters * @param _generator generator name function * @param _path path to generate the file * @returns void */ const runGenerator = async (_generator, _path) => { // * check if the function exists if (_this.hasOwnProperty(_generator) && _this[_generator] instanceof Function) { // * run generator await _this[_generator](_path); // * test for pages & api page generators only // if (['pagesGenerator', 'pagesApiGenerator'].includes(_generator)) { // await _this[_generator](_path); // } } }; exports.runGenerator = runGenerator; /** * Read stub template file * @param _stubPath path to template file * @returns string */ const getStubContent = async (_stubPath) => { return filesystem.readFile(_stubPath); }; const appcontainersGenerator = async (_path) => { try { await filesystem.write({ filename: mapFilesContent.appcontainers, path: _path, content: '', }); } catch (error) { console.log({ error }); throw new Error('Unable to create app containers directory'); } }; exports.appcontainersGenerator = appcontainersGenerator; /** * Generate assets directory * @param _path path to generate the file * @returns void */ const assetsGenerator = async (_path) => { // * no stub content // * create file try { console.log('Generating assets directory...'); await filesystem.write({ filename: mapFilesContent.assets, path: _path, content: '', }); } catch (error) { console.log({ error }); throw new Error('Unable to create assets directory'); } }; exports.assetsGenerator = assetsGenerator; /** * Generate configs directory * @param _path path to generate the file * @returns void */ const configsGenerator = async (_path) => { // * no stub content // * create file try { console.log('Generating configs directory...'); await filesystem.write({ filename: _.toLower(_this.refContainersPaths.container) + mapFilesContent.configs.replace('{{ext}}', await checkExt()), path: _path, content: await getStubContent(path.resolve(path_1.PKG_ROOT, `stubs${path.sep}config${path.sep}default.stub`)), }); } catch (error) { console.log({ error }); throw new Error('Unable to create configs directory'); } }; exports.configsGenerator = configsGenerator; /** * Generate components directory * @param _path path to generate the file * @returns void */ const componentsGenerator = async (_path) => { // * no stub content // * create file try { console.log('Generating components directory...'); await filesystem.write({ filename: mapFilesContent.components, path: _path, content: '', }); } catch (error) { console.log({ error }); throw new Error('Unable to create components directory'); } }; exports.componentsGenerator = componentsGenerator; /** * Generate helpers directory * @param _path path to generate the file * @returns void */ const helpersGenerator = async (_path) => { // * no stub content // * create file try { console.log('Generating helpers directory...'); await filesystem.write({ filename: mapFilesContent.helpers, path: _path, content: '', }); } catch (error) { console.log({ error }); throw new Error('Unable to create helpers directory'); } }; exports.helpersGenerator = helpersGenerator; /** * Generate hooks directory * @param _path path to generate the file * @returns void */ const hooksGenerator = async (_path) => { // * no stub content // * create file try { console.log('Generating hooks directory...'); await filesystem.write({ filename: mapFilesContent.hooks, path: _path, content: '', }); } catch (error) { console.log({ error }); throw new Error('Unable to create hooks directory'); } }; exports.hooksGenerator = hooksGenerator; /** * Generate actions directory * @param _path path to generate the file * @returns void */ const actionsGenerator = async (_path) => { // * no stub content // * create file try { console.log('Generating actions directory...'); await filesystem.write({ filename: mapFilesContent.actions, path: _path, content: '', }); } catch (error) { console.log({ error }); throw new Error('Unable to create hooks directory'); } }; exports.actionsGenerator = actionsGenerator; /** * Generate styles directory * @param _path path to generate the file * @returns void */ const stylesGenerator = async (_path) => { // * no stub content // * create file try { console.log('Generating styles directory...'); await filesystem.write({ filename: mapFilesContent.styles.replace('{{container}}', _this.refContainersPaths.container.toLowerCase()), path: _path, content: await getStubContent(path.resolve(path_1.PKG_ROOT, `stubs${path.sep}styles${path.sep}default.stub`)), }); } catch (error) { console.log({ error }); throw new Error('Unable to create hooks directory'); } }; exports.stylesGenerator = stylesGenerator; /** * Generate pages directory for container & bootstrap it to root pages directory * @param _path path to generate the file * @returns void */ const pagesGenerator = async (_path) => { try { console.log('Generating pages directory...'); // * container stub content const containerStubContent = await str.parseStub(await getStubContent(path.resolve(path_1.PKG_ROOT, `stubs${path.sep}pages${path.sep}container.stub`)), { pageClass: _path.slice(_path.lastIndexOf(path.sep)).replace(path.sep, '') }, { capitalize: (val) => _.capitalize(val) }); // * bootstrap stub content const bootstrapStubContent = await str.parseStub(await getStubContent(path.resolve(path_1.PKG_ROOT, `stubs${path.sep}pages${path.sep}bootstrap.stub`)), { pagePath: _path.split('pages' + path.sep)[1], pageClass: _path.slice(_path.lastIndexOf(path.sep)).replace(path.sep, ''), sectionName: _this.refContainersPaths.section, containerName: _this.refContainersPaths.container, }, { capitalize: (val) => _.capitalize(val) }); // * create file for container await filesystem.write({ filename: mapFilesContent.pages.replace('{{ext}}', await checkExt()), path: _path, content: containerStubContent, }); // * create file for bootstrap await filesystem.write({ filename: mapFilesContent.pages.replace('{{ext}}', await checkExt()), path: path.join(path.resolve(_path.slice(0, _path.lastIndexOf('src')), 'pages'), _path.split('pages' + path.sep)[1]), content: bootstrapStubContent, }); } catch (error) { console.log({ error }); } }; exports.pagesGenerator = pagesGenerator; /** * Generate pages api directory * @param _path path to generate the file * @returns void */ const pagesApiGenerator = async (_path) => { try { console.log('Generating pages api directory...'); // * bootstrap stub content const bootstrapStubContent = await str.parseStub(await getStubContent(path.resolve(path_1.PKG_ROOT, (await checkExt()) === 't' ? `stubs${path.sep}pages${path.sep}api${path.sep}ts${path.sep}bootstrap.stub` : `stubs${path.sep}pages${path.sep}api${path.sep}bootstrap.stub`)), { apiClass: _path.slice(_path.lastIndexOf(path.sep)).replace(path.sep, ''), apiPath: _path.split(`pages${path.sep}api${path.sep}`)[1], sectionName: _this.refContainersPaths.section, containerName: _this.refContainersPaths.container, }, { capitalize: (val) => _.capitalize(val) }); // * container stub content const containerStubContent = await str.parseStub(await getStubContent(path.resolve(path_1.PKG_ROOT, (await checkExt()) === 't' ? `stubs${path.sep}pages${path.sep}api${path.sep}ts${path.sep}container.stub` : `stubs${path.sep}pages${path.sep}api${path.sep}container.stub`)), { apiClass: _path.slice(_path.lastIndexOf(path.sep)).replace(path.sep, '') }, { capitalize: (val) => _.capitalize(val) }); // * create file for container await filesystem.write({ filename: mapFilesContent.api.replace('{{ext}}', await checkExt()), path: _path, content: containerStubContent, }); // * create file for bootstrap await filesystem.write({ filename: mapFilesContent.api.replace('{{ext}}', await checkExt()), path: path.join(path.resolve(_path.slice(0, _path.lastIndexOf('src')), `pages${path.sep}api`), _path.split(`pages${path.sep}api${path.sep}`)[1]), content: bootstrapStubContent, }); } catch (error) { console.log({ error }); } }; exports.pagesApiGenerator = pagesApiGenerator;