next-porto-cli
Version:
A cli for next.js to scaffold your application using porto architecture
344 lines (343 loc) • 12.3 kB
JavaScript
;
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;