From 6fa252ad4d843d610a610a88090fed2fb655a2e5 Mon Sep 17 00:00:00 2001 From: Maksim Sinik Date: Wed, 4 Mar 2020 16:16:50 +0100 Subject: [PATCH] fix: add better error handling on ddoc bin --- .gitignore | 3 ++- bin/ddoc.js | 17 +++++++++++++---- package.json | 3 ++- src/bin/ddoc.ts | 23 ++++++++++++++++++----- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 65ddbec0..14bc0e75 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,7 @@ yarn.lock .coveralls.yml #misc -db/** +db/* !db/config.json +!db/designs .env diff --git a/bin/ddoc.js b/bin/ddoc.js index 64cf8250..42b8f7f2 100644 --- a/bin/ddoc.js +++ b/bin/ddoc.js @@ -12,10 +12,16 @@ const typescript_1 = __importDefault(require("typescript")); const require_from_string_1 = __importDefault(require("require-from-string")); const glob_1 = __importDefault(require("glob")); const mkdirp_1 = __importDefault(require("mkdirp")); +const chalk_1 = __importDefault(require("chalk")); const stat = util_1.promisify(fs_1.default.stat); const readFile = util_1.promisify(fs_1.default.readFile); const writeFile = util_1.promisify(fs_1.default.writeFile); +const unlink = util_1.promisify(fs_1.default.unlink); const glob = util_1.promisify(glob_1.default); +async function deleteOldDdocs(dest) { + const oldDdocs = await glob(path_1.default.join(dest, '**/*.json')); + return Promise.all(oldDdocs.map(file => unlink(file))); +} const prog = sade_1.default('ddoc'); prog.version('0.1.0'); prog @@ -47,14 +53,16 @@ prog } console.log(`> src directory is ${src}`); await mkdirp_1.default(dest); + await deleteOldDdocs(dest); console.log(`> destination directory is ${dest}`); const errors = []; await Promise.all(ddocs.map(async (srcPath) => { try { const sourceFile = (await readFile(srcPath)).toString(); const output = typescript_1.default.transpileModule(sourceFile, tsconfig); - const ddoc = require_from_string_1.default(output.outputText); const filename = path_1.default.basename(srcPath, '.ts'); + await writeFile(path_1.default.join(src, `${filename}.js`), output.outputText); + const ddoc = require_from_string_1.default(output.outputText); const stringifiedDesign = JSON.stringify(ddoc, (_, val) => { if (typeof val === 'function') { return val.toString(); @@ -63,13 +71,14 @@ prog }, 1); await writeFile(path_1.default.join(dest, `${filename}.json`), stringifiedDesign); } - catch (err) { - errors.push(err); + catch (error) { + errors.push({ file: srcPath, error }); } })); if (errors.length > 0) { errors.forEach(err => { - console.error(err); + var _a; + console.log(`\n${chalk_1.default.red('ddoc error')} - ${chalk_1.default.cyan(err.file)}${(_a = err.error.stack) === null || _a === void 0 ? void 0 : _a.toString()}\n`); }); throw new Error(`Compilation failed. Resolve errors in your code and try again.`); } diff --git a/package.json b/package.json index a387fd57..5029b339 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "url": "https://github.com/HospitalRun/hospitalrun-server.git" }, "scripts": { - "ddoc": "npm run build:bin && node bin/ddoc", + "ddoc": "node bin/ddoc", "commit": "npx git-cz", "build": "npm run clean && tsc -p ./tsconfig.json && npm run build:designs", "build:designs": "tsc -p ./src/db/tsconfig.json", @@ -56,6 +56,7 @@ "@types/sade": "~1.6.0", "@typescript-eslint/eslint-plugin": "~2.21.0", "@typescript-eslint/parser": "~2.21.0", + "chalk": "~3.0.0", "commitizen": "~4.0.3", "commitlint-config-cz": "~0.13.0", "coveralls": "~3.0.9", diff --git a/src/bin/ddoc.ts b/src/bin/ddoc.ts index d775d492..fa4fba65 100644 --- a/src/bin/ddoc.ts +++ b/src/bin/ddoc.ts @@ -8,12 +8,19 @@ import ts from 'typescript' import requireFromString from 'require-from-string' import originalGlob from 'glob' import mkdirp from 'mkdirp' +import chalk from 'chalk' const stat = promisify(fs.stat) const readFile = promisify(fs.readFile) const writeFile = promisify(fs.writeFile) +const unlink = promisify(fs.unlink) const glob = promisify(originalGlob) +async function deleteOldDdocs(dest: string) { + const oldDdocs = await glob(path.join(dest, '**/*.json')) + return Promise.all(oldDdocs.map(file => unlink(file))) +} + const prog = sade('ddoc') prog.version('0.1.0') @@ -52,16 +59,18 @@ prog console.log(`> src directory is ${src}`) await mkdirp(dest) + await deleteOldDdocs(dest) console.log(`> destination directory is ${dest}`) - const errors: Error[] = [] + const errors: { file: string; error: Error }[] = [] await Promise.all( ddocs.map(async srcPath => { try { const sourceFile = (await readFile(srcPath)).toString() const output = ts.transpileModule(sourceFile, tsconfig) - const ddoc = requireFromString(output.outputText) const filename = path.basename(srcPath, '.ts') + await writeFile(path.join(src, `${filename}.js`), output.outputText) + const ddoc = requireFromString(output.outputText) const stringifiedDesign = JSON.stringify( ddoc, (_, val) => { @@ -73,14 +82,18 @@ prog 1, ) await writeFile(path.join(dest, `${filename}.json`), stringifiedDesign) - } catch (err) { - errors.push(err) + } catch (error) { + errors.push({ file: srcPath, error }) } }), ) if (errors.length > 0) { errors.forEach(err => { - console.error(err) + console.log( + `\n${chalk.red('ddoc error')} - ${chalk.cyan( + err.file, + )}${err.error.stack?.toString()}\n`, + ) }) throw new Error(`Compilation failed. Resolve errors in your code and try again.`) }