@afzalimdad9/express-generator-typescript
Version:
Generate new Express applications similar to express-generate which but sets it up to use TypeScript instead
119 lines (106 loc) • 3.63 kB
JavaScript
const path = require("path"),
editJsonFile = require("edit-json-file"),
childProcess = require("child_process"),
ncp = require("ncp").ncp,
fs = require("fs");
/******************************************************************************
Constants
******************************************************************************/
// Project folder paths
const PROJECT_FOLDER_PATH = "./project-files";
// Project-folder dependencies
const DEPENDENCIES =
"express dotenv morgan cookie-parser jet-logger " +
"module-alias helmet jsonfile inserturlparams jet-paths dayjs jet-env " +
"jet-validators",
DEV_DEPENDENCIES =
"ts-node typescript nodemon find supertest vitest " +
"@types/node @types/find @types/morgan @types/cookie-parser " +
"@types/supertest fs-extra tsconfig-paths jiti @swc/core @types/jsonfile " +
"@types/fs-extra @types/module-alias @stylistic/eslint-plugin-js eslint " +
"@eslint/js typescript-eslint eslint-plugin-n @stylistic/eslint-plugin-ts";
// "ncp" options
const ncpOpts = {
filter: (fileName) => {
return !(fileName === "package-lock.json" || fileName === "node_modules");
},
};
/******************************************************************************
Functions
******************************************************************************/
/**
* Entry point
*/
async function expressGenTs(destination, useYarn) {
try {
await copyProjectFiles(destination);
updatePackageJson(destination);
await renameGitigoreFile(destination);
downloadNodeModules(destination, useYarn);
} catch (err) {
console.error(err);
}
}
/**
* Copy project files
*/
function copyProjectFiles(destination) {
const source = path.join(__dirname, PROJECT_FOLDER_PATH);
return /** @type {Promise<void>} */ (
new Promise((res, rej) => {
return ncp(source, destination, ncpOpts, (err) => {
return !!err ? rej(err) : res();
});
})
);
}
/**
* Set update the package.json file.
*/
function updatePackageJson(destination) {
let file = editJsonFile(destination + "/package.json", {
autosave: true,
});
file.set("name", path.basename(destination));
file.set("dependencies", {});
file.set("devDependencies", {});
}
/**
* Because npm does not allow .gitignore to be published.
*/
function renameGitigoreFile(destination) {
return /** @type {Promise<void>} */ (
new Promise((res, rej) =>
fs.rename(
destination + "/gitignore",
destination + "/.gitignore",
(err) => (!!err ? rej(err) : res())
)
)
);
}
/**
* Download the dependencies.
*/
function downloadNodeModules(destination, useYarn) {
const options = { cwd: destination };
// Setup dependencies string
let depStr = DEPENDENCIES,
devDepStr = DEV_DEPENDENCIES;
// Setup download command
let downloadLibCmd, downloadDepCmd;
if (useYarn) {
downloadLibCmd = "yarn add " + depStr;
downloadDepCmd = "yarn add " + devDepStr + " -D";
} else {
downloadLibCmd = "npm i -s " + depStr;
downloadDepCmd = "npm i -D " + devDepStr;
}
// Execute command
childProcess.execSync(downloadLibCmd, options);
childProcess.execSync(downloadDepCmd, options);
}
/******************************************************************************
Export
******************************************************************************/
module.exports = expressGenTs;