diff --git a/.eslintrc.json b/.eslintrc.json index 54dbab3..0059662 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,11 @@ { "extends": ["conventions", "prettier"], - "plugins": ["prettier"], + "plugins": ["prettier", "import", "unicorn"], + "parserOptions": { + "project": "./tsconfig.json" + }, "rules": { - "prettier/prettier": "error" + "prettier/prettier": "error", + "import/extensions": ["error", "always"] } } diff --git a/jsconfig.json b/jsconfig.json index c3e1fb3..c82d356 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -9,6 +9,7 @@ "noEmit": true, "rootDir": ".", "baseUrl": ".", + "skipLibCheck": true, "strict": true, "allowUnusedLabels": false, "allowUnreachableCode": false, @@ -19,8 +20,6 @@ "noUncheckedIndexedAccess": true, "noUnusedLocals": true, "noUnusedParameters": true, - "forceConsistentCasingInFileNames": true, - "maxNodeModuleJsDepth": 0 - }, - "exclude": ["node_modules"] + "forceConsistentCasingInFileNames": true + } } diff --git a/package-lock.json b/package-lock.json index 84a457f..5d152cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,27 +10,25 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "markdown-it": "14.0.0", - "markdownlint-rule-helpers": "0.24.0" + "markdown-it": "14.0.0" }, "devDependencies": { "@commitlint/cli": "18.4.4", "@commitlint/config-conventional": "18.4.4", "@types/markdown-it": "13.0.7", - "@types/node": "20.10.8", + "@types/node": "20.11.0", "editorconfig-checker": "5.1.2", "eslint": "8.56.0", "eslint-config-conventions": "13.1.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", - "eslint-plugin-prettier": "5.1.2", + "eslint-plugin-prettier": "5.1.3", "eslint-plugin-promise": "6.1.1", "eslint-plugin-unicorn": "50.0.1", "husky": "8.0.3", "lint-staged": "15.2.0", "markdownlint": "0.33.0", "markdownlint-cli2": "0.11.0", - "markdownlint-rule-helpers": "0.24.0", "pinst": "3.0.0", "prettier": "3.1.1", "semantic-release": "22.0.12", @@ -559,13 +557,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -586,9 +584,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@nodelib/fs.scandir": { @@ -1327,9 +1325,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.8.tgz", - "integrity": "sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==", + "version": "20.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2424,9 +2422,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.625", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.625.tgz", - "integrity": "sha512-DENMhh3MFgaPDoXWrVIqSPInQoLImywfCwrSmVl3cf9QHzoZSiutHwGaB/Ql3VkqcQV30rzgdM+BjKqBAJxo5Q==", + "version": "1.4.628", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.628.tgz", + "integrity": "sha512-2k7t5PHvLsufpP6Zwk0nof62yLOsCf032wZx7/q0mv8gwlXjhcxI3lz6f0jBr0GrnWKcm3burXzI3t5IrcdUxw==", "dev": true }, "node_modules/emoji-regex": { @@ -2913,9 +2911,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz", - "integrity": "sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", @@ -5176,30 +5174,6 @@ "url": "https://github.com/sponsors/DavidAnson" } }, - "node_modules/markdownlint-rule-helpers": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.24.0.tgz", - "integrity": "sha512-Q7l/VO0ro3+oK7ZzB0aODVFwD0/X+S3JXM9ItdTTgo23yqsv7XzGHx+cGp/zlqD1W8+uiSoXflMVXzh5KSKskA==", - "dev": true, - "dependencies": { - "markdownlint-micromark": "0.1.2" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, - "node_modules/markdownlint-rule-helpers/node_modules/markdownlint-micromark": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.2.tgz", - "integrity": "sha512-jRxlQg8KpOfM2IbCL9RXM8ZiYWz2rv6DlZAnGv8ASJQpUh6byTBnEsbuMZ6T2/uIgntyf7SKg/mEaEBo1164fQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, "node_modules/marked": { "version": "9.1.6", "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", @@ -5436,9 +5410,9 @@ } }, "node_modules/npm": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.5.tgz", - "integrity": "sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.3.0.tgz", + "integrity": "sha512-9u5GFc1UqI2DLlGI7QdjkpIaBs3UhTtY8KoCqYJK24gV/j/tByaI4BA4R7RkOc+ASqZMzFPKt4Pj2Z8JcGo//A==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -5520,12 +5494,12 @@ "@npmcli/fs": "^3.1.0", "@npmcli/map-workspaces": "^3.0.4", "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.2", + "@npmcli/promise-spawn": "^7.0.1", + "@npmcli/run-script": "^7.0.3", "@sigstore/tuf": "^2.2.0", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^18.0.1", + "cacache": "^18.0.2", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", @@ -5679,7 +5653,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.2.2", + "version": "7.3.0", "dev": true, "inBundle": true, "license": "ISC", @@ -5726,7 +5700,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.0.3", + "version": "8.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -5784,7 +5758,7 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.3", + "version": "5.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -5885,7 +5859,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -5909,7 +5883,7 @@ } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "7.0.2", + "version": "7.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -6013,18 +5987,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/npm/node_modules/agent-base": { "version": "7.1.0", "dev": true, @@ -6087,14 +6049,10 @@ "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.1", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -6105,26 +6063,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/bin-links": { "version": "4.0.3", "dev": true, @@ -6158,30 +6096,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", "dev": true, @@ -6192,7 +6106,7 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.1", + "version": "18.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -6487,12 +6401,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", "dev": true, @@ -6539,24 +6447,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, @@ -6752,26 +6642,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/npm/node_modules/ignore-walk": { "version": "6.0.4", "dev": true, @@ -6963,7 +6833,7 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.4", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -6983,7 +6853,7 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.5", + "version": "7.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -7005,7 +6875,7 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.2", + "version": "5.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -7043,7 +6913,7 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.4", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -7468,7 +7338,7 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -7636,7 +7506,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", + "version": "6.0.15", "dev": true, "inBundle": true, "license": "MIT", @@ -7657,15 +7527,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", "dev": true, @@ -7772,22 +7633,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.4.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", "dev": true, @@ -7797,26 +7642,6 @@ "node": ">= 4" } }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, @@ -7987,15 +7812,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -9322,9 +9138,9 @@ "dev": true }, "node_modules/safe-regex-test": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.1.tgz", - "integrity": "sha512-Y5NejJTTliTyY4H7sipGqY+RX5P87i3F7c4Rcepy72nq+mNLhIsD0W4c7kEmduMDQCSqtPsXPlSTsFhh2LQv+g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", "dev": true, "dependencies": { "call-bind": "^1.0.5", diff --git a/package.json b/package.json index d7b2391..4d11139 100644 --- a/package.json +++ b/package.json @@ -44,27 +44,25 @@ "postpublish": "pinst --enable" }, "dependencies": { - "markdown-it": "14.0.0", - "markdownlint-rule-helpers": "0.24.0" + "markdown-it": "14.0.0" }, "devDependencies": { "@commitlint/cli": "18.4.4", "@commitlint/config-conventional": "18.4.4", "@types/markdown-it": "13.0.7", - "@types/node": "20.10.8", + "@types/node": "20.11.0", "editorconfig-checker": "5.1.2", "eslint": "8.56.0", "eslint-config-conventions": "13.1.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", - "eslint-plugin-prettier": "5.1.2", + "eslint-plugin-prettier": "5.1.3", "eslint-plugin-promise": "6.1.1", "eslint-plugin-unicorn": "50.0.1", "husky": "8.0.3", "lint-staged": "15.2.0", "markdownlint": "0.33.0", "markdownlint-cli2": "0.11.0", - "markdownlint-rule-helpers": "0.24.0", "pinst": "3.0.0", "prettier": "3.1.1", "semantic-release": "22.0.12", diff --git a/src/index.js b/src/index.js index ae30d5a..0e7c9bd 100644 --- a/src/index.js +++ b/src/index.js @@ -3,8 +3,8 @@ const { pathToFileURL } = require("node:url") const fs = require("node:fs") +const { filterTokens } = require("./markdownlint-rule-helpers/helpers.js") const { - filterTokens, convertHeadingToHTMLFragment, getMarkdownHeadings, getMarkdownIdOrAnchorNameFragments, diff --git a/src/markdownlint-rule-helpers/helpers.js b/src/markdownlint-rule-helpers/helpers.js new file mode 100644 index 0000000..5949867 --- /dev/null +++ b/src/markdownlint-rule-helpers/helpers.js @@ -0,0 +1,38 @@ +/** + * Dependency Vendoring of `markdownlint-rule-helpers` + * @see https://www.npmjs.com/package/markdownlint-rule-helpers + */ + +/** @typedef {import('markdownlint').RuleParams} MarkdownLintRuleParams */ +/** @typedef {import('markdownlint').MarkdownItToken} MarkdownItToken */ + +/** + * Calls the provided function for each matching token. + * + * @param {MarkdownLintRuleParams} params RuleParams instance. + * @param {string} type Token type identifier. + * @param {(token: MarkdownItToken) => void} handler Callback function. + * @returns {void} + */ +const filterTokens = (params, type, handler) => { + for (const token of params.tokens) { + if (token.type === type) { + handler(token) + } + } +} + +/** + * Gets a Regular Expression for matching the specified HTML attribute. + * + * @param {string} name HTML attribute name. + * @returns {RegExp} Regular Expression for matching. + */ +const getHtmlAttributeRe = (name) => { + return new RegExp(`\\s${name}\\s*=\\s*['"]?([^'"\\s>]*)`, "iu") +} + +module.exports = { + filterTokens, + getHtmlAttributeRe, +} diff --git a/src/utils.js b/src/utils.js index efdc641..e0c7f5a 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,25 +1,6 @@ const MarkdownIt = require("markdown-it") -// @ts-ignore -const { getHtmlAttributeRe } = require("markdownlint-rule-helpers") -/** @typedef {import('markdownlint').RuleParams} MarkdownLintRuleParams */ -/** @typedef {import('markdownlint').MarkdownItToken} MarkdownItToken */ - -/** - * Calls the provided function for each matching token. - * - * @param {MarkdownLintRuleParams} params RuleParams instance. - * @param {string} type Token type identifier. - * @param {(token: MarkdownItToken) => void} handler Callback function. - * @returns {void} - */ -const filterTokens = (params, type, handler) => { - for (const token of params.tokens) { - if (token.type === type) { - handler(token) - } - } -} +const { getHtmlAttributeRe } = require("./markdownlint-rule-helpers/helpers.js") /** * Converts a Markdown heading into an HTML fragment according to the rules @@ -114,12 +95,12 @@ const getMarkdownIdOrAnchorNameFragments = (content) => { for (const token of tokens) { const anchorMatch = anchorIdRe.exec(token.content) || anchorNameRe.exec(token.content) - if (!anchorMatch || anchorMatch.length === 0) { + if (anchorMatch == null) { continue } const anchorIdOrName = anchorMatch[1] - if (anchorIdOrName.length <= 0) { + if (anchorIdOrName == null || anchorIdOrName.length <= 0) { continue } @@ -133,7 +114,6 @@ const getMarkdownIdOrAnchorNameFragments = (content) => { } module.exports = { - filterTokens, convertHeadingToHTMLFragment, getMarkdownHeadings, getMarkdownIdOrAnchorNameFragments,