diff --git a/.eslintrc.js b/.eslintrc.js index cf0d440..1ab6b5b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,132 +1,87 @@ module.exports = { - "env": { - "browser": true, - "es6": true + env: { + browser: true, + es6: true }, - "extends": [ + extends: [ "plugin:jsdoc/recommended", "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking" ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": [ + parser: "@typescript-eslint/parser", + parserOptions: { + project: [ "tsconfig.json", "tsconfig.internal.json" ], - "sourceType": "module" + sourceType: "module" }, - "plugins": [ + plugins: [ "jsdoc", "@typescript-eslint", "prefer-arrow" ], - "settings": { - "jsdoc": { - "mode": "typescript", - "tagNamePreference": { - "arg": "param", - "return": "returns" - } - } - }, - "rules": { - "no-duplicate-imports": "error", - "arrow-spacing": "error", - "sort-keys": "error", - "template-curly-spacing": ["error", "never"], - "rest-spread-spacing": ["error", "always"], - "sort-imports": ["error", { ignoreCase: true }], - "keyword-spacing": ["error", { before: true, after: true }], - "space-before-blocks": ["error", "always"], - "block-spacing": ["error", "always"], - "space-before-function-paren": ["error", "always"], - "array-bracket-spacing": ["error", "always", { "singleValue": false }], - "object-curly-spacing": ["error", "always"], - "computed-property-spacing": ["error", "never"], - "brace-style": ["error", "1tbs", { "allowSingleLine": true }], - "jsdoc/check-types": 0, - "jsdoc/require-returns-type": 0, - "jsdoc/require-param-type": 0, - "@typescript-eslint/no-misused-promises": ["error", { checksVoidReturn: false }], + rules: { "@typescript-eslint/array-type": "error", "@typescript-eslint/indent": "error", "@typescript-eslint/member-delimiter-style": [ "error", { - "multiline": { - "delimiter": "none", - "requireLast": true + multiline: { + delimiter: "none", + requireLast: true }, - "singleline": { - "delimiter": "semi", - "requireLast": false + singleline: { + delimiter: "semi", + requireLast: false } } ], "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-misused-promises": [ "error", { checksVoidReturn: false } ], "@typescript-eslint/no-parameter-properties": "off", "@typescript-eslint/no-use-before-define": "error", "@typescript-eslint/prefer-for-of": "error", "@typescript-eslint/prefer-function-type": "error", - "@typescript-eslint/quotes": [ - "error", - "double" - ], - "semi": "off", - "@typescript-eslint/semi": [ "error" ], + "@typescript-eslint/quotes": [ "error", "double" ], + "@typescript-eslint/semi": "error", "@typescript-eslint/unified-signatures": "error", + "array-bracket-spacing": [ "error", "always", { singleValue: false } ], + "arrow-spacing": "error", + "block-spacing": [ "error", "always" ], + "brace-style": [ "error", "1tbs", { allowSingleLine: true } ], "camelcase": "error", "comma-dangle": "error", - "complexity": ["error", { "max": 10 }], + "complexity": [ "error", { max: 10 } ], + "computed-property-spacing": [ "error", "never" ], "constructor-super": "error", "dot-notation": "error", - "eqeqeq": [ - "error", - "smart" - ], + "eqeqeq": [ "error", "smart" ], "guard-for-in": "error", - "id-blacklist": [ - "error", - "any", - "number", - "string", - "Boolean", - "boolean" - ], + "id-blacklist": [ "error", "any", "number", "string", "Boolean", "boolean" ], "id-match": "error", - "linebreak-style": [ - "error", - "unix" - ], - "max-classes-per-file": [ - "error", - 1 - ], - "max-len": [ - "error", - { - "code": 120 - } - ], + "jsdoc/check-types": 0, + "jsdoc/require-param-type": 0, + "jsdoc/require-returns-type": 0, + "keyword-spacing": [ "error", { after: true, before: true } ], + "linebreak-style": [ "error", "unix" ], + "max-classes-per-file": [ "error", 1 ], + "max-len": [ "error", { code: 120 } ], "new-parens": "error", "no-bitwise": "error", "no-caller": "error", "no-cond-assign": "error", - "no-console": ["error", { "allow": ["warn", "error"] }], + "no-console": [ "error", { allow: [ "warn", "error" ] } ], "no-debugger": "error", + "no-duplicate-imports": "error", "no-empty": "error", "no-eval": "error", "no-fallthrough": "off", "no-invalid-this": "off", "no-irregular-whitespace": "error", "no-new-wrappers": "error", - "no-shadow": [ - "error", - { - "hoist": "all" - } - ], + "no-shadow": [ "error", { hoist: "all" } ], "no-throw-literal": "error", "no-trailing-spaces": "error", "no-undef-init": "error", @@ -134,15 +89,29 @@ module.exports = { "no-unsafe-finally": "error", "no-unused-expressions": "error", "no-unused-labels": "error", + "object-curly-spacing": [ "error", "always" ], "object-shorthand": "error", - "one-var": [ - "error", - "never" - ], + "one-var": [ "error", "never" ], "prefer-arrow/prefer-arrow-functions": "error", "radix": "error", + "rest-spread-spacing": [ "error", "always" ], + "semi": "off", + "sort-imports": [ "error", { ignoreCase: true } ], + "sort-keys": "error", + "space-before-blocks": [ "error", "always" ], + "space-before-function-paren": [ "error", "always" ], "spaced-comment": "error", + "template-curly-spacing": [ "error", "never" ], "use-isnan": "error", - "valid-typeof": "off", + "valid-typeof": "off" + }, + settings: { + jsdoc: { + mode: "typescript", + tagNamePreference: { + arg: "param", + return: "returns" + } + } } }; diff --git a/docs/createDocs.ts b/docs/createDocs.ts index c2f41e5..b0aeae1 100644 --- a/docs/createDocs.ts +++ b/docs/createDocs.ts @@ -8,35 +8,43 @@ import { ScriptTarget } from "typescript"; export const defaultDocsOutputDir = path.join(__dirname, "dist", "site"); // First create typedoc README -createTypedocReadme().then(() => { - - const app = new Application(); - - // If you want TypeDoc to load tsconfig.json / typedoc.json files - app.options.addReader(new TSConfigReader()); - app.options.addReader(new TypeDocReader()); - - app.bootstrap({ - categorizeByGroup: true, - exclude: [ - "node_modules/**/*", - "docs/**/*", - "dist/**/*", - "tests/**/*" - ], - experimentalDecorators: true, - ignoreCompilerErrors: false, - mode: SourceFileMode.Modules, - name: "MarkTeX Modules", - readme: path.join(__dirname, "dist", "README.md"), - target: ScriptTarget.ESNext - }); - - const project = app.convert(app.expandInputFiles(["src"])); - - if (project) { - app.generateDocs(project, defaultDocsOutputDir); - } else { - console.error("TypeDoc documentation was not successful"); +(async (): Promise => { + try { + await createTypedocReadme(); + + const app = new Application(); + + // If you want TypeDoc to load tsconfig.json / typedoc.json files + app.options.addReader(new TSConfigReader()); + app.options.addReader(new TypeDocReader()); + + app.bootstrap({ + categorizeByGroup: true, + exclude: [ + "node_modules/**/*", + "docs/**/*", + "dist/**/*", + "tests/**/*" + ], + experimentalDecorators: true, + ignoreCompilerErrors: false, + mode: SourceFileMode.Modules, + name: "MarkTeX Modules", + readme: path.join(__dirname, "dist", "README.md"), + target: ScriptTarget.ESNext + }); + + const project = app.convert(app.expandInputFiles(["src"])); + + if (project) { + app.generateDocs(project, defaultDocsOutputDir); + } else { + throw Error("TypeDoc documentation generation was not successful"); + } + } catch (error) { + throw error; } +})().catch(error => { + console.error(error); + process.exit(1); }); diff --git a/docs/openDocs.ts b/docs/openDocs.ts index eefc08f..242a60d 100644 --- a/docs/openDocs.ts +++ b/docs/openDocs.ts @@ -21,13 +21,20 @@ const startStaticDocumentationServer = (port = 8081): Promise => new Pro await fs.access(defaultDocsOutputDir); } catch (err) { if (err.code === "ENOENT") { - console.error(`Error: Docs output directory was not found (${defaultDocsOutputDir}).`); + throw Error(`Docs output directory was not found (${defaultDocsOutputDir}).`); } else { - console.error(err); + throw err; } - return process.exit(1); } - const url = await startStaticDocumentationServer(); - // Opens the main page of the documentation - await open(url); -})(); + + try { + const url = await startStaticDocumentationServer(); + // Opens the main page of the documentation + await open(url); + } catch (err) { + throw err; + } +})().catch(error => { + console.error(error); + process.exit(1); +}); diff --git a/package-lock.json b/package-lock.json index 51910c7..7b38efa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2998,9 +2998,9 @@ } }, "eslint-plugin-jsdoc": { - "version": "24.0.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-24.0.6.tgz", - "integrity": "sha512-WDzUgShMK7Zg9N6s19LxUqy71At/PxCuMEXaKyBzybhABq6iU4DaZtWZ+4fkCMBvMzMwMAPa2oRD/+fQGORMhg==", + "version": "25.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-25.2.0.tgz", + "integrity": "sha512-P+3zIyu5fSEZlAtoKI+pGxO8XWwWG7RlO7Zm25+sZTcWUb4jGteYSYLt04ChMauHjoDJSzhwfTXhAn2gVUijpQ==", "dev": true, "requires": { "comment-parser": "^0.7.4", @@ -5096,9 +5096,9 @@ } }, "leasot": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/leasot/-/leasot-10.3.0.tgz", - "integrity": "sha512-EQ3p0l1YHLo75+W/0jx8XlC9lg4+owUP5qHMgQTXL02KuzMKUXUgjJ7WuSCNyBqYWOg3nSG0zkGkbzHreQ5fZA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/leasot/-/leasot-10.4.0.tgz", + "integrity": "sha512-y9k31hcr8JgV5JLmMbJx93Q7vr2TeIQY1R/tiMwPNabaeIeoWkDjdQ7rS1yT9h/M5aRfFCG6apY8oY1RabCQxQ==", "dev": true, "requires": { "async": "^3.2.0", @@ -7213,9 +7213,9 @@ "dev": true }, "regextras": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.0.tgz", - "integrity": "sha512-ds+fL+Vhl918gbAUb0k2gVKbTZLsg84Re3DI6p85Et0U0tYME3hyW4nMK8Px4dtDaBA2qNjvG5uWyW7eK5gfmw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", "dev": true }, "registry-auth-token": { @@ -8763,9 +8763,9 @@ } }, "ts-loader": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.3.tgz", - "integrity": "sha512-BXAHfPjm3J//20ibuI30M+xgLpdIng68p2H952QqbbmDk7SW72HV42k9Gop7rMxuHvrXWjazWhKuyr9D9kKe3A==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.4.tgz", + "integrity": "sha512-5du6OQHl+4ZjO4crEyoYUyWSrmmo7bAO+inkaILZ68mvahqrfoa4nn0DRmpQ4ruT4l+cuJCgF0xD7SBIyLeeow==", "dev": true, "requires": { "chalk": "^2.3.0", diff --git a/package.json b/package.json index b924efc..efe2033 100644 --- a/package.json +++ b/package.json @@ -107,18 +107,18 @@ "@types/spdy": "^3.4.4", "@types/sqlite3": "^3.1.6", "@types/webpack": "^4.41.12", - "@typescript-eslint/eslint-plugin": "^2.31.0", - "@typescript-eslint/eslint-plugin-tslint": "^2.31.0", - "@typescript-eslint/parser": "^2.31.0", + "@typescript-eslint/eslint-plugin": "2.31.0", + "@typescript-eslint/eslint-plugin-tslint": "2.31.0", + "@typescript-eslint/parser": "2.31.0", "chai": "^4.2.0", "chai-http": "^4.3.0", "compression-webpack-plugin": "^3.1.0", "cross-env": "^7.0.2", "eslint": "^7.0.0", - "eslint-plugin-jsdoc": "^24.0.6", + "eslint-plugin-jsdoc": "^25.2.0", "eslint-plugin-prefer-arrow": "^1.2.1", "glob": "^7.1.6", - "leasot": "^10.3.0", + "leasot": "^10.4.0", "mocha": "^7.1.2", "nodemon": "^2.0.3", "npm-run-all": "^4.1.5", @@ -126,7 +126,7 @@ "open": "^7.0.3", "raw-loader": "^4.0.1", "shelljs": "^0.8.4", - "ts-loader": "^7.0.3", + "ts-loader": "^7.0.4", "ts-node": "^8.10.1", "tslint": "^5.0.0", "typedoc": "^0.17.6", diff --git a/src/index.ts b/src/index.ts index 3262a39..6b9ef86 100644 --- a/src/index.ts +++ b/src/index.ts @@ -144,7 +144,9 @@ const databasePath = process.env.DATABASE_PATH && process.env.DATABASE_PATH !== } } catch (error) { - console.error(error); - process.exit(1); + throw error; } -})(); +})().catch(error => { + console.error(error); + process.exit(1); +}); diff --git a/src/modules/inkscape/pdf2svg.ts b/src/modules/inkscape/pdf2svg.ts index f1da7a5..8108a55 100644 --- a/src/modules/inkscape/pdf2svg.ts +++ b/src/modules/inkscape/pdf2svg.ts @@ -51,16 +51,21 @@ export const pdf2Svg = async (input: InkscapePdf2SvgInput): Promise { bufferStdout.push(chunk); }); child.stderr.on("data", (chunk: Buffer) => { bufferStderr.push(chunk); }); return new Promise((resolve, reject) => { - child.on("close", code => { + child.on("close", async (code) => { const stderr = bufferStderr.toString(); if (code !== 0) { - helper.fileSystem.rmDirRecursive(workingDirName); + await helper.fileSystem.rmDirRecursive(workingDirName); return reject(Error(`Child process exited with code ${code} (stderr=${stderr})`)); } const stdout = bufferStdout.toString(); - fs.readFile(temporarySvg, { encoding: "utf8" }).then(svgData => { + try { + const svgData = await fs.readFile(temporarySvg, { encoding: "utf8" }); + await helper.fileSystem.rmDirRecursive(workingDirName); resolve({ stderr, stdout, svgData }); - }).catch(reject).then(() => helper.fileSystem.rmDirRecursive(workingDirName)); + } catch (error) { + await helper.fileSystem.rmDirRecursive(workingDirName); + return reject(error); + } }); }); }; diff --git a/src/modules/latex/latex2pdf.ts b/src/modules/latex/latex2pdf.ts index 153ff95..c52ec58 100644 --- a/src/modules/latex/latex2pdf.ts +++ b/src/modules/latex/latex2pdf.ts @@ -60,18 +60,24 @@ export const tex2Pdf = async (input: Tex2PdfInput): Promise => { child.stdout.on("data", (chunk: Buffer) => { bufferStdout.push(chunk); }); child.stderr.on("data", (chunk: Buffer) => { bufferStderr.push(chunk); }); return new Promise((resolve, reject) => { - child.on("close", code => { + child.on("close", async (code) => { debug(`tex2Pdf finished out='${temporaryPdf}'`); const stderr = bufferStderr.toString(); const stdout = bufferStdout.toString(); if (code !== 0) { - helper.fileSystem.rmDirRecursive(workingDirName); + await helper.fileSystem.rmDirRecursive(workingDirName); return reject(Error(`Child process exited with code ${code} (stderr=${stderr},` + `stdout=${stdout})`)); } - fs.readFile(temporaryPdf).then(pdfData => { + + try { + const pdfData = await fs.readFile(temporaryPdf); + await helper.fileSystem.rmDirRecursive(workingDirName); resolve({ pdfData, stderr, stdout }); - }).catch(reject).then(() => helper.fileSystem.rmDirRecursive(workingDirName)); + } catch (error) { + await helper.fileSystem.rmDirRecursive(workingDirName); + return reject(error); + } }); }); }; diff --git a/tests/inkscape.test.shell.ts b/tests/inkscape.test.shell.ts index 925bd26..73644ca 100644 --- a/tests/inkscape.test.shell.ts +++ b/tests/inkscape.test.shell.ts @@ -18,7 +18,6 @@ describe("inkscape [shell]", () => { chai.expect(version.minor).to.be.a("number"); chai.expect(version.minor).to.satisfy(Number.isInteger); chai.expect(version.patch).to.be.a("string"); - chai.expect(version.patch.length).to.be.greaterThan(0); }); it("convert pdf to svg", async () => { const files: pandoc.PandocMd2PdfInputFile[] = [ diff --git a/tests/openCoverage.ts b/tests/openCoverage.ts index 38e3d99..a0e8937 100644 --- a/tests/openCoverage.ts +++ b/tests/openCoverage.ts @@ -29,7 +29,14 @@ const startStaticCoverageServer = (port = 8082): Promise => new Promise( } return process.exit(1); } - const url = await startStaticCoverageServer(); - // Opens the main page of the documentation - await open(url); -})(); + try { + const url = await startStaticCoverageServer(); + // Opens the main page of the documentation + await open(url); + } catch (err) { + throw err; + } +})().catch(error => { + console.error(error); + process.exit(1); +}); diff --git a/tests/server_routes/browser.ts b/tests/server_routes/browser.ts index ea7f043..50b5d93 100644 --- a/tests/server_routes/browser.ts +++ b/tests/server_routes/browser.ts @@ -11,8 +11,8 @@ chai.should(); export default (databasePath: string, APP: Express): Mocha.Suite => { return describe("browser", () => { - describe("GET (not logged in)", () => { - api.database.reset(databasePath); + describe("GET (not logged in)", async () => { + await api.database.reset(databasePath); it("/ (home)", async () => { await chai.request(APP) .get("/")