From 96c84a377ab0a3b9adab07af579418f164babb6c Mon Sep 17 00:00:00 2001 From: 43081j <43081j@users.noreply.github.com> Date: Sun, 13 Mar 2022 19:01:24 +0000 Subject: [PATCH 1/2] chore: cleanup eslint config --- .eslintrc.json | 23 +- package-lock.json | 361 ------------------ package.json | 1 - .../lib/index.ts | 4 +- .../parse5-sax-parser/test/sax-parser.test.ts | 3 +- .../lib/parser/formatting-element-list.ts | 8 +- packages/parse5/lib/parser/index.ts | 32 +- packages/parse5/lib/serializer/index.ts | 3 +- packages/parse5/lib/tokenizer/index.ts | 13 +- 9 files changed, 56 insertions(+), 392 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 628193dac..81f5c3aca 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,7 +4,7 @@ "node": true, "jest": true }, - "extends": ["eslint:recommended", "prettier", "plugin:unicorn/recommended"], + "extends": ["eslint:recommended", "prettier"], "rules": { "no-console": "error", "curly": ["error", "all"], @@ -21,16 +21,7 @@ } ], "prefer-template": "error", - "arrow-body-style": ["error", "as-needed"], - - "unicorn/no-null": "off", - "unicorn/prevent-abbreviations": "off", - "unicorn/prefer-string-slice": "off", - "unicorn/prefer-code-point": "off", - "unicorn/no-array-push-push": "off", - "unicorn/no-for-loop": "off", - "unicorn/consistent-destructuring": "off", - "unicorn/prefer-switch": ["error", { "emptyDefaultCase": "do-nothing-comment" }] + "arrow-body-style": ["error", "as-needed"] }, "parserOptions": { "sourceType": "module" @@ -39,6 +30,7 @@ { "files": "*.ts", "extends": [ + "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "prettier" @@ -47,8 +39,13 @@ "@typescript-eslint/no-non-null-assertion": "warn", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/explicit-function-return-type": "error", - - "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }] + "@typescript-eslint/no-unused-vars": "off" + } + }, + { + "files": "*.test.ts", + "rules": { + "@typescript-eslint/no-non-null-assertion": "off" } } ] diff --git a/package-lock.json b/package-lock.json index ea466db6e..611a3fb50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "@typescript-eslint/parser": "^5.14.0", "eslint": "^8.10.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-unicorn": "^41.0.0", "husky": "^7.0.4", "jest": "^27.5.1", "lint-staged": "^12.3.5", @@ -1118,11 +1117,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "dev": true, - "license": "MIT" - }, "node_modules/@types/prettier": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz", @@ -1748,17 +1742,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/builtin-modules": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/callsites": { "version": "3.1.0", "dev": true, @@ -1820,17 +1803,6 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -2405,118 +2377,6 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-unicorn": { - "version": "41.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-41.0.0.tgz", - "integrity": "sha512-xoJCaRc1uy5REg9DkVga1BkZV57jJxoqOcrU28QHZB89Lk5LdSqdVyTIt9JQVfHNKaiyJ7X+3iLlIn+VEHWEzA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "ci-info": "^3.3.0", - "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.1.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "safe-regex": "^2.1.1", - "semver": "^7.3.5", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.8.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/eslint-plugin-unicorn/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg-up": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/safe-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "regexp-tree": "~0.1.1" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/strip-indent": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -3186,17 +3046,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-builtin-module": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-modules": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/is-core-module": { "version": "2.8.0", "dev": true, @@ -4483,14 +4332,6 @@ "node": ">=6" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.0.4", "dev": true, @@ -4817,14 +4658,6 @@ "version": "1.3.6", "license": "MIT" }, - "node_modules/pluralize": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "dev": true, @@ -4936,14 +4769,6 @@ "dev": true, "license": "MIT" }, - "node_modules/regexp-tree": { - "version": "0.1.24", - "dev": true, - "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, "node_modules/regexpp": { "version": "3.2.0", "dev": true, @@ -5190,34 +5015,6 @@ "source-map": "^0.6.0" } }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.10", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/sprintf-js": { "version": "1.0.3", "dev": true, @@ -5750,15 +5547,6 @@ "node": ">= 8" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vscode-oniguruma": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", @@ -6850,10 +6638,6 @@ "version": "17.0.8", "dev": true }, - "@types/normalize-package-data": { - "version": "2.4.1", - "dev": true - }, "@types/prettier": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz", @@ -7277,10 +7061,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "builtin-modules": { - "version": "3.2.0", - "dev": true - }, "callsites": { "version": "3.1.0", "dev": true @@ -7319,13 +7099,6 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, - "clean-regexp": { - "version": "1.0.0", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -7770,89 +7543,6 @@ "dev": true, "requires": {} }, - "eslint-plugin-unicorn": { - "version": "41.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-41.0.0.tgz", - "integrity": "sha512-xoJCaRc1uy5REg9DkVga1BkZV57jJxoqOcrU28QHZB89Lk5LdSqdVyTIt9JQVfHNKaiyJ7X+3iLlIn+VEHWEzA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "ci-info": "^3.3.0", - "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.1.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "safe-regex": "^2.1.1", - "semver": "^7.3.5", - "strip-indent": "^3.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "read-pkg": { - "version": "5.2.0", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - } - }, - "read-pkg-up": { - "version": "7.0.1", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "dev": true - } - } - }, - "safe-regex": { - "version": "2.1.1", - "dev": true, - "requires": { - "regexp-tree": "~0.1.1" - } - }, - "strip-indent": { - "version": "3.0.0", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - } - } - }, "eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -8267,13 +7957,6 @@ "version": "0.2.1", "dev": true }, - "is-builtin-module": { - "version": "3.1.0", - "dev": true, - "requires": { - "builtin-modules": "^3.0.0" - } - }, "is-core-module": { "version": "2.8.0", "dev": true, @@ -9214,10 +8897,6 @@ "version": "2.1.0", "dev": true }, - "min-indent": { - "version": "1.0.1", - "dev": true - }, "minimatch": { "version": "3.0.4", "dev": true, @@ -9469,10 +9148,6 @@ "platform": { "version": "1.3.6" }, - "pluralize": { - "version": "8.0.0", - "dev": true - }, "prelude-ls": { "version": "1.2.1", "dev": true @@ -9538,10 +9213,6 @@ "version": "17.0.2", "dev": true }, - "regexp-tree": { - "version": "0.1.24", - "dev": true - }, "regexpp": { "version": "3.2.0", "dev": true @@ -9716,30 +9387,6 @@ "source-map": "^0.6.0" } }, - "spdx-correct": { - "version": "3.1.1", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "dev": true - }, "sprintf-js": { "version": "1.0.3", "dev": true @@ -10095,14 +9742,6 @@ } } }, - "validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "vscode-oniguruma": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", diff --git a/package.json b/package.json index f75e31fc1..8a342e5a9 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "@typescript-eslint/parser": "^5.14.0", "eslint": "^8.10.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-unicorn": "^41.0.0", "husky": "^7.0.4", "jest": "^27.5.1", "lint-staged": "^12.3.5", diff --git a/packages/parse5-htmlparser2-tree-adapter/lib/index.ts b/packages/parse5-htmlparser2-tree-adapter/lib/index.ts index 045912785..39f16c8c0 100644 --- a/packages/parse5-htmlparser2-tree-adapter/lib/index.ts +++ b/packages/parse5-htmlparser2-tree-adapter/lib/index.ts @@ -251,7 +251,9 @@ export function getNodeSourceCodeLocation(node: Node): ElementLocation | null | } export function updateNodeSourceCodeLocation(node: Node, endLocation: Partial): void { - if (endLocation.endOffset != null) node.endIndex = endLocation.endOffset; + if (endLocation.endOffset != null) { + node.endIndex = endLocation.endOffset; + } // TODO: Update types in `domhandler` node.sourceCodeLocation = { diff --git a/packages/parse5-sax-parser/test/sax-parser.test.ts b/packages/parse5-sax-parser/test/sax-parser.test.ts index 7205d6b40..a17fc0a91 100644 --- a/packages/parse5-sax-parser/test/sax-parser.test.ts +++ b/packages/parse5-sax-parser/test/sax-parser.test.ts @@ -71,8 +71,9 @@ const hugePage = new URL('../../../test/data/huge-page/huge-page.html', import.m describe('SAX parser', () => { //Basic tests - for (const [idx, data] of loadSAXParserTestData().entries()) + for (const [idx, data] of loadSAXParserTestData().entries()) { it(`${idx + 1}.${data.name}`, createBasicTest(data.src, data.expected)); + } it('Piping and .stop()', (done) => { const parser = new SAXParser(); diff --git a/packages/parse5/lib/parser/formatting-element-list.ts b/packages/parse5/lib/parser/formatting-element-list.ts index f59b7fed6..c90ca7542 100644 --- a/packages/parse5/lib/parser/formatting-element-list.ts +++ b/packages/parse5/lib/parser/formatting-element-list.ts @@ -68,12 +68,16 @@ export class FormattingElementList { } private _ensureNoahArkCondition(newElement: T['element']): void { - if (this.entries.length < NOAH_ARK_CAPACITY) return; + if (this.entries.length < NOAH_ARK_CAPACITY) { + return; + } const neAttrs = this.treeAdapter.getAttrList(newElement); const candidates = this._getNoahArkConditionCandidates(newElement, neAttrs); - if (candidates.length < NOAH_ARK_CAPACITY) return; + if (candidates.length < NOAH_ARK_CAPACITY) { + return; + } //NOTE: build attrs map for the new element, so we can perform fast lookups const neAttrsMap = new Map(neAttrs.map((neAttr: Attribute) => [neAttr.name, neAttr.value])); diff --git a/packages/parse5/lib/parser/index.ts b/packages/parse5/lib/parser/index.ts index 5035c2852..b47fc1a48 100644 --- a/packages/parse5/lib/parser/index.ts +++ b/packages/parse5/lib/parser/index.ts @@ -237,7 +237,9 @@ export class Parser implements TokenHandler, Stack //Errors _err(token: Token, code: ERR, beforeToken?: boolean): void { - if (!this.onParseError) return; + if (!this.onParseError) { + return; + } const loc = token.location ?? BASE_LOC; const err = { @@ -286,7 +288,9 @@ export class Parser implements TokenHandler, Stack //Stack events onItemPush(node: T['parentNode'], tid: number, isTop: boolean): void { this.treeAdapter.onItemPush?.(node); - if (isTop && this.openElements.stackTop > 0) this._setContextModes(node, tid); + if (isTop && this.openElements.stackTop > 0) { + this._setContextModes(node, tid); + } } onItemPop(node: T['parentNode'], isTop: boolean): void { @@ -451,12 +455,16 @@ export class Parser implements TokenHandler, Stack this.treeAdapter.setTemplateContent(tmpl, content); this._attachElementToTree(tmpl, token.location); this.openElements.push(tmpl, token.tagID); - if (this.options.sourceCodeLocationInfo) this.treeAdapter.setNodeSourceCodeLocation(content, null); + if (this.options.sourceCodeLocationInfo) { + this.treeAdapter.setNodeSourceCodeLocation(content, null); + } } _insertFakeRootElement(): void { const element = this.treeAdapter.createElement(TN.HTML, NS.HTML, []); - if (this.options.sourceCodeLocationInfo) this.treeAdapter.setNodeSourceCodeLocation(element, null); + if (this.options.sourceCodeLocationInfo) { + this.treeAdapter.setNodeSourceCodeLocation(element, null); + } this.treeAdapter.appendChild(this.openElements.current, element); this.openElements.push(element, $.HTML); @@ -489,7 +497,9 @@ export class Parser implements TokenHandler, Stack this.treeAdapter.insertText(parent, token.chars); } - if (!token.location) return; + if (!token.location) { + return; + } const siblings = this.treeAdapter.getChildNodes(parent); const textNodeIdx = beforeElement ? siblings.lastIndexOf(beforeElement) : siblings.length; @@ -541,7 +551,9 @@ export class Parser implements TokenHandler, Stack //Token processing private shouldProcessStartTagTokenInForeignContent(token: TagToken): boolean { // Check that neither current === document, or ns === NS.HTML - if (!this.currentNotInHTML) return false; + if (!this.currentNotInHTML) { + return false; + } let current: T['parentNode']; let currentTagId: number; @@ -1397,7 +1409,9 @@ function callAdoptionAgency(p: Parser, token: T const commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element); p.treeAdapter.detachNode(lastElement); - if (commonAncestor) aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement); + if (commonAncestor) { + aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement); + } aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry); } } @@ -2453,7 +2467,9 @@ function genericEndTagInBody(p: Parser, token: // Compare the tag name here, as the tag might not be a known tag with an ID. if (tid === elementId && (tid !== $.UNKNOWN || p.treeAdapter.getTagName(element) === tn)) { p.openElements.generateImpliedEndTagsWithExclusion(tid); - if (p.openElements.stackTop >= i) p.openElements.shortenToLength(i); + if (p.openElements.stackTop >= i) { + p.openElements.shortenToLength(i); + } break; } diff --git a/packages/parse5/lib/serializer/index.ts b/packages/parse5/lib/serializer/index.ts index aa158d49f..077281892 100644 --- a/packages/parse5/lib/serializer/index.ts +++ b/packages/parse5/lib/serializer/index.ts @@ -185,7 +185,7 @@ function serializeAttributes( if (!attr.namespace) { html += attr.name; - } else + } else { switch (attr.namespace) { case NS.XML: { html += `xml:${attr.name}`; @@ -207,6 +207,7 @@ function serializeAttributes( html += `${attr.prefix}:${attr.name}`; } } + } html += `="${escapeString(attr.value, true)}"`; } diff --git a/packages/parse5/lib/tokenizer/index.ts b/packages/parse5/lib/tokenizer/index.ts index 48397a61f..b68166c5f 100644 --- a/packages/parse5/lib/tokenizer/index.ts +++ b/packages/parse5/lib/tokenizer/index.ts @@ -579,7 +579,9 @@ export class Tokenizer { for (let i = 0, current = htmlDecodeTree[0]; i >= 0; cp = this._consume()) { i = determineBranch(htmlDecodeTree, current, i + 1, cp); - if (i < 0) break; + if (i < 0) { + break; + } excess += 1; @@ -1101,7 +1103,7 @@ export class Tokenizer { this._createStartTagToken(); this.state = State.TAG_NAME; this._stateTagName(cp); - } else + } else { switch (cp) { case $.EXCLAMATION_MARK: { this.state = State.MARKUP_DECLARATION_OPEN; @@ -1131,6 +1133,7 @@ export class Tokenizer { this._stateData(cp); } } + } } // End tag open state @@ -1140,7 +1143,7 @@ export class Tokenizer { this._createEndTagToken(); this.state = State.TAG_NAME; this._stateTagName(cp); - } else + } else { switch (cp) { case $.GREATER_THAN_SIGN: { this._err(ERR.missingEndTagName); @@ -1160,6 +1163,7 @@ export class Tokenizer { this._stateBogusComment(cp); } } + } } // Tag name state @@ -2285,7 +2289,7 @@ export class Tokenizer { if (isAsciiUpper(cp)) { this._createDoctypeToken(String.fromCharCode(toAsciiLower(cp))); this.state = State.DOCTYPE_NAME; - } else + } else { switch (cp) { case $.SPACE: case $.LINE_FEED: @@ -2323,6 +2327,7 @@ export class Tokenizer { this.state = State.DOCTYPE_NAME; } } + } } // DOCTYPE name state From f1a65f32944e333d69ee9fb4681a84013240b15a Mon Sep 17 00:00:00 2001 From: 43081j <43081j@users.noreply.github.com> Date: Sun, 13 Mar 2022 19:24:13 +0000 Subject: [PATCH 2/2] chore: set non-null-assertions rule to error --- .eslintrc.json | 2 +- packages/parse5-html-rewriting-stream/lib/index.ts | 6 ++++-- .../parse5-htmlparser2-tree-adapter/lib/index.ts | 9 +++++++-- packages/parse5-parser-stream/lib/index.ts | 2 +- .../parse5/lib/parser/formatting-element-list.ts | 6 +++++- packages/parse5/lib/parser/index.ts | 12 ++++++++---- packages/parse5/lib/tokenizer/preprocessor.ts | 6 +++++- 7 files changed, 31 insertions(+), 12 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 81f5c3aca..e0df25a9e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -36,7 +36,7 @@ "prettier" ], "rules": { - "@typescript-eslint/no-non-null-assertion": "warn", + "@typescript-eslint/no-non-null-assertion": "error", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/explicit-function-return-type": "error", "@typescript-eslint/no-unused-vars": "off" diff --git a/packages/parse5-html-rewriting-stream/lib/index.ts b/packages/parse5-html-rewriting-stream/lib/index.ts index e80303604..c6573687b 100644 --- a/packages/parse5-html-rewriting-stream/lib/index.ts +++ b/packages/parse5-html-rewriting-stream/lib/index.ts @@ -75,7 +75,8 @@ export class RewritingStream extends SAXParser { // Events protected override emitIfListenerExists(eventName: string, token: SaxToken): boolean { if (!super.emitIfListenerExists(eventName, token)) { - this.emitRaw(this._getRawHtml(token.sourceCodeLocation!)); + const html = token.sourceCodeLocation ? this._getRawHtml(token.sourceCodeLocation) : ''; + this.emitRaw(html); } // NOTE: don't skip new lines after `
` and other tags,
@@ -86,7 +87,8 @@ export class RewritingStream extends SAXParser {
 
     // Emitter API
     protected override _emitToken(eventName: string, token: SaxToken): void {
-        this.emit(eventName, token, this._getRawHtml(token.sourceCodeLocation!));
+        const html = token.sourceCodeLocation ? this._getRawHtml(token.sourceCodeLocation) : '';
+        this.emit(eventName, token, html);
     }
 
     /** Emits a serialized document type token into the output stream. */
diff --git a/packages/parse5-htmlparser2-tree-adapter/lib/index.ts b/packages/parse5-htmlparser2-tree-adapter/lib/index.ts
index 39f16c8c0..a2ce3b111 100644
--- a/packages/parse5-htmlparser2-tree-adapter/lib/index.ts
+++ b/packages/parse5-htmlparser2-tree-adapter/lib/index.ts
@@ -174,11 +174,16 @@ export function insertTextBefore(parentNode: NodeWithChildren, text: string, ref
 export function adoptAttributes(recipient: Element, attrs: Attribute[]): void {
     for (let i = 0; i < attrs.length; i++) {
         const attrName = attrs[i].name;
+        const { namespace, prefix } = attrs[i];
 
         if (typeof recipient.attribs[attrName] === 'undefined') {
             recipient.attribs[attrName] = attrs[i].value;
-            recipient['x-attribsNamespace']![attrName] = attrs[i].namespace!;
-            recipient['x-attribsPrefix']![attrName] = attrs[i].prefix!;
+            if (recipient['x-attribsNamespace'] && namespace) {
+                recipient['x-attribsNamespace'][attrName] = namespace;
+            }
+            if (recipient['x-attribsPrefix'] && prefix) {
+                recipient['x-attribsPrefix'][attrName] = prefix;
+            }
         }
     }
 }
diff --git a/packages/parse5-parser-stream/lib/index.ts b/packages/parse5-parser-stream/lib/index.ts
index d01f46b59..a2db609d6 100644
--- a/packages/parse5-parser-stream/lib/index.ts
+++ b/packages/parse5-parser-stream/lib/index.ts
@@ -76,7 +76,7 @@ export class ParserStream
         }
 
         while (this.pendingHtmlInsertions.length > 0) {
-            const html = this.pendingHtmlInsertions.pop()!;
+            const html = this.pendingHtmlInsertions.pop() ?? '';
 
             this.parser.tokenizer.insertHtmlAtCurrentPos(html);
         }
diff --git a/packages/parse5/lib/parser/formatting-element-list.ts b/packages/parse5/lib/parser/formatting-element-list.ts
index c90ca7542..1b5377f8e 100644
--- a/packages/parse5/lib/parser/formatting-element-list.ts
+++ b/packages/parse5/lib/parser/formatting-element-list.ts
@@ -114,7 +114,11 @@ export class FormattingElementList {
     }
 
     insertElementAfterBookmark(element: T['element'], token: TagToken): void {
-        const bookmarkIdx = this.entries.indexOf(this.bookmark!);
+        if (this.bookmark === null) {
+            return;
+        }
+
+        const bookmarkIdx = this.entries.indexOf(this.bookmark);
 
         this.entries.splice(bookmarkIdx, 0, {
             type: EntryType.Element,
diff --git a/packages/parse5/lib/parser/index.ts b/packages/parse5/lib/parser/index.ts
index b47fc1a48..7a6797072 100644
--- a/packages/parse5/lib/parser/index.ts
+++ b/packages/parse5/lib/parser/index.ts
@@ -294,8 +294,8 @@ export class Parser implements TokenHandler, Stack
     }
 
     onItemPop(node: T['parentNode'], isTop: boolean): void {
-        if (this.options.sourceCodeLocationInfo) {
-            this._setEndLocation(node, this.currentToken!);
+        if (this.options.sourceCodeLocationInfo && this.currentToken) {
+            this._setEndLocation(node, this.currentToken);
         }
 
         this.treeAdapter.onItemPop?.(node, this.openElements.current);
@@ -1729,9 +1729,13 @@ function startTagAfterHead(p: Parser, token: Ta
         case $.TEMPLATE:
         case $.TITLE: {
             p._err(token, ERR.abandonedHeadElementChild);
-            p.openElements.push(p.headElement!, $.HEAD);
+            if (p.headElement) {
+                p.openElements.push(p.headElement, $.HEAD);
+            }
             startTagInHead(p, token);
-            p.openElements.remove(p.headElement!);
+            if (p.headElement) {
+                p.openElements.remove(p.headElement);
+            }
             break;
         }
         case $.HEAD: {
diff --git a/packages/parse5/lib/tokenizer/preprocessor.ts b/packages/parse5/lib/tokenizer/preprocessor.ts
index b4165f29b..bc6204d80 100644
--- a/packages/parse5/lib/tokenizer/preprocessor.ts
+++ b/packages/parse5/lib/tokenizer/preprocessor.ts
@@ -235,7 +235,11 @@ export class Preprocessor {
         this.pos -= count;
 
         while (this.pos < this.lastGapPos) {
-            this.lastGapPos = this.gapStack.pop()!;
+            const lastGapPos = this.gapStack.pop();
+            if (lastGapPos === undefined) {
+                throw new Error('Gap stack was unexpectedly empty');
+            }
+            this.lastGapPos = lastGapPos;
             this.pos--;
         }