mirror of
				https://github.com/theoludwig/markdownlint-rule-relative-links.git
				synced 2025-09-09 19:39:29 +02:00 
			
		
		
		
	feat: usage of ESM modules imports (instead of CommonJS)
Fixes #10 BREAKING CHANGE: This package is now pure ESM BREAKING CHANGE: minimum supported Node.js >= 22.0.0
This commit is contained in:
		
							
								
								
									
										8
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							| @@ -10,10 +10,10 @@ jobs: | ||||
|   lint: | ||||
|     runs-on: "ubuntu-latest" | ||||
|     steps: | ||||
|       - uses: "actions/checkout@v4.1.7" | ||||
|       - uses: "actions/checkout@v4.2.2" | ||||
|  | ||||
|       - name: "Setup Node.js" | ||||
|         uses: "actions/setup-node@v4.0.3" | ||||
|         uses: "actions/setup-node@v4.1.0" | ||||
|         with: | ||||
|           node-version: "lts/*" | ||||
|           cache: "npm" | ||||
| @@ -30,6 +30,6 @@ jobs: | ||||
|   commitlint: | ||||
|     runs-on: "ubuntu-latest" | ||||
|     steps: | ||||
|       - uses: "actions/checkout@v4.1.7" | ||||
|       - uses: "actions/checkout@v4.2.2" | ||||
|  | ||||
|       - uses: "wagoid/commitlint-github-action@v6.1.2" | ||||
|       - uses: "wagoid/commitlint-github-action@v6.2.0" | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -13,13 +13,13 @@ jobs: | ||||
|       pull-requests: "write" | ||||
|       id-token: "write" | ||||
|     steps: | ||||
|       - uses: "actions/checkout@v4.1.7" | ||||
|       - uses: "actions/checkout@v4.2.2" | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|           persist-credentials: false | ||||
|  | ||||
|       - name: "Setup Node.js" | ||||
|         uses: "actions/setup-node@v4.0.3" | ||||
|         uses: "actions/setup-node@v4.1.0" | ||||
|         with: | ||||
|           node-version: "lts/*" | ||||
|           cache: "npm" | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @@ -10,10 +10,10 @@ jobs: | ||||
|   test: | ||||
|     runs-on: "ubuntu-latest" | ||||
|     steps: | ||||
|       - uses: "actions/checkout@v4.1.7" | ||||
|       - uses: "actions/checkout@v4.2.2" | ||||
|  | ||||
|       - name: "Setup Node.js" | ||||
|         uses: "actions/setup-node@v4.0.3" | ||||
|         uses: "actions/setup-node@v4.1.0" | ||||
|         with: | ||||
|           node-version: "lts/*" | ||||
|           cache: "npm" | ||||
|   | ||||
| @@ -66,7 +66,7 @@ Contributions are welcome to improve the rule, and to alleviate these limitation | ||||
|  | ||||
| ## Prerequisites | ||||
|  | ||||
| [Node.js](https://nodejs.org/) >= 16.0.0 | ||||
| [Node.js](https://nodejs.org/) >= 22.0.0 | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
|   | ||||
							
								
								
									
										2341
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2341
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										30
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								package.json
									
									
									
									
									
								
							| @@ -18,6 +18,8 @@ | ||||
|     "markdownlint-rule" | ||||
|   ], | ||||
|   "main": "src/index.js", | ||||
|   "types": "src/index.d.ts", | ||||
|   "type": "module", | ||||
|   "files": [ | ||||
|     "src" | ||||
|   ], | ||||
| @@ -26,7 +28,7 @@ | ||||
|     "provenance": true | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": ">=16.0.0" | ||||
|     "node": ">=22.0.0" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "lint:editorconfig": "editorconfig-checker", | ||||
| @@ -42,19 +44,19 @@ | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/markdown-it": "14.1.2", | ||||
|     "@types/node": "22.9.0", | ||||
|     "@types/node": "22.10.2", | ||||
|     "editorconfig-checker": "6.0.0", | ||||
|     "eslint": "9.14.0", | ||||
|     "eslint-config-conventions": "17.0.0", | ||||
|     "eslint-plugin-promise": "7.1.0", | ||||
|     "eslint-plugin-unicorn": "56.0.0", | ||||
|     "eslint-plugin-import-x": "4.4.0", | ||||
|     "globals": "15.12.0", | ||||
|     "markdownlint": "0.36.1", | ||||
|     "markdownlint-cli2": "0.15.0", | ||||
|     "prettier": "3.3.3", | ||||
|     "semantic-release": "23.1.1", | ||||
|     "typescript-eslint": "8.13.0", | ||||
|     "typescript": "5.6.3" | ||||
|     "eslint": "9.17.0", | ||||
|     "eslint-config-conventions": "18.0.0", | ||||
|     "eslint-plugin-promise": "7.2.1", | ||||
|     "eslint-plugin-unicorn": "56.0.1", | ||||
|     "eslint-plugin-import-x": "4.6.1", | ||||
|     "globals": "15.14.0", | ||||
|     "markdownlint": "0.37.2", | ||||
|     "markdownlint-cli2": "0.17.0", | ||||
|     "prettier": "3.4.2", | ||||
|     "semantic-release": "24.2.0", | ||||
|     "typescript-eslint": "8.18.2", | ||||
|     "typescript": "5.7.2" | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										5
									
								
								src/index.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/index.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| import type { Rule } from "markdownlint" | ||||
|  | ||||
| declare const relativeLinksRule: Rule | ||||
|  | ||||
| export default relativeLinksRule | ||||
							
								
								
									
										16
									
								
								src/index.js
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/index.js
									
									
									
									
									
								
							| @@ -1,10 +1,8 @@ | ||||
| "use strict" | ||||
| import { pathToFileURL } from "node:url" | ||||
| import fs from "node:fs" | ||||
|  | ||||
| const { pathToFileURL } = require("node:url") | ||||
| const fs = require("node:fs") | ||||
|  | ||||
| const { filterTokens } = require("./markdownlint-rule-helpers/helpers.js") | ||||
| const { | ||||
| import { filterTokens } from "./markdownlint-rule-helpers/helpers.js" | ||||
| import { | ||||
|   convertHeadingToHTMLFragment, | ||||
|   getMarkdownHeadings, | ||||
|   getMarkdownIdOrAnchorNameFragments, | ||||
| @@ -12,14 +10,14 @@ const { | ||||
|   getNumberOfLines, | ||||
|   getLineNumberStringFromFragment, | ||||
|   lineFragmentRe, | ||||
| } = require("./utils.js") | ||||
| } from "./utils.js" | ||||
|  | ||||
| /** @typedef {import('markdownlint').Rule} MarkdownLintRule */ | ||||
|  | ||||
| /** | ||||
|  * @type {MarkdownLintRule} | ||||
|  */ | ||||
| const customRule = { | ||||
| const relativeLinksRule = { | ||||
|   names: ["relative-links"], | ||||
|   description: "Relative links should be valid", | ||||
|   tags: ["links"], | ||||
| @@ -172,4 +170,4 @@ const customRule = { | ||||
|   }, | ||||
| } | ||||
|  | ||||
| module.exports = customRule | ||||
| export default relativeLinksRule | ||||
|   | ||||
| @@ -14,7 +14,7 @@ | ||||
|  * @param {(token: MarkdownItToken) => void} handler Callback function. | ||||
|  * @returns {void} | ||||
|  */ | ||||
| const filterTokens = (params, type, handler) => { | ||||
| export const filterTokens = (params, type, handler) => { | ||||
|   for (const token of params.parsers.markdownit.tokens) { | ||||
|     if (token.type === type) { | ||||
|       handler(token) | ||||
| @@ -28,11 +28,6 @@ const filterTokens = (params, type, handler) => { | ||||
|  * @param {string} name HTML attribute name. | ||||
|  * @returns {RegExp} Regular Expression for matching. | ||||
|  */ | ||||
| const getHtmlAttributeRe = (name) => { | ||||
| export const getHtmlAttributeRe = (name) => { | ||||
|   return new RegExp(`\\s${name}\\s*=\\s*['"]?([^'"\\s>]*)`, "iu") | ||||
| } | ||||
|  | ||||
| module.exports = { | ||||
|   filterTokens, | ||||
|   getHtmlAttributeRe, | ||||
| } | ||||
|   | ||||
							
								
								
									
										28
									
								
								src/utils.js
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/utils.js
									
									
									
									
									
								
							| @@ -1,10 +1,10 @@ | ||||
| const MarkdownIt = require("markdown-it") | ||||
| import MarkdownIt from "markdown-it" | ||||
|  | ||||
| const { getHtmlAttributeRe } = require("./markdownlint-rule-helpers/helpers.js") | ||||
| import { getHtmlAttributeRe } from "./markdownlint-rule-helpers/helpers.js" | ||||
|  | ||||
| const markdownIt = new MarkdownIt({ html: true }) | ||||
|  | ||||
| const lineFragmentRe = /^#(?:L\d+(?:C\d+)?-L\d+(?:C\d+)?|L\d+)$/ | ||||
| export const lineFragmentRe = /^#(?:L\d+(?:C\d+)?-L\d+(?:C\d+)?|L\d+)$/ | ||||
|  | ||||
| /** | ||||
|  * Converts a Markdown heading into an HTML fragment according to the rules | ||||
| @@ -14,7 +14,7 @@ const lineFragmentRe = /^#(?:L\d+(?:C\d+)?-L\d+(?:C\d+)?|L\d+)$/ | ||||
|  * @param {string} inlineText Inline token for heading. | ||||
|  * @returns {string} Fragment string for heading. | ||||
|  */ | ||||
| const convertHeadingToHTMLFragment = (inlineText) => { | ||||
| export const convertHeadingToHTMLFragment = (inlineText) => { | ||||
|   return ( | ||||
|     "#" + | ||||
|     encodeURIComponent( | ||||
| @@ -40,7 +40,7 @@ const ignoredTokens = new Set(["heading_open", "heading_close"]) | ||||
|  * @param {string} content | ||||
|  * @returns {string[]} | ||||
|  */ | ||||
| const getMarkdownHeadings = (content) => { | ||||
| export const getMarkdownHeadings = (content) => { | ||||
|   const tokens = markdownIt.parse(content, {}) | ||||
|  | ||||
|   /** @type {string[]} */ | ||||
| @@ -88,7 +88,7 @@ const idHTMLAttributeRegex = getHtmlAttributeRe("id") | ||||
|  * @param {string} content | ||||
|  * @returns {string[]} | ||||
|  */ | ||||
| const getMarkdownIdOrAnchorNameFragments = (content) => { | ||||
| export const getMarkdownIdOrAnchorNameFragments = (content) => { | ||||
|   const tokens = markdownIt.parse(content, {}) | ||||
|  | ||||
|   /** @type {string[]} */ | ||||
| @@ -128,7 +128,7 @@ const getMarkdownIdOrAnchorNameFragments = (content) => { | ||||
|  * @example isValidIntegerString("1abc") // false | ||||
|  * @example isValidIntegerString("1.0") // false | ||||
|  */ | ||||
| const isValidIntegerString = (value) => { | ||||
| export const isValidIntegerString = (value) => { | ||||
|   const regex = /^\d+$/ | ||||
|   return regex.test(value) | ||||
| } | ||||
| @@ -138,7 +138,7 @@ const isValidIntegerString = (value) => { | ||||
|  * @param {string} content | ||||
|  * @returns {number} | ||||
|  */ | ||||
| const getNumberOfLines = (content) => { | ||||
| export const getNumberOfLines = (content) => { | ||||
|   return content.split("\n").length | ||||
| } | ||||
|  | ||||
| @@ -148,16 +148,6 @@ const getNumberOfLines = (content) => { | ||||
|  * @returns {string} | ||||
|  * @example getLineNumberStringFromFragment("#L50") // 50 | ||||
|  */ | ||||
| const getLineNumberStringFromFragment = (fragment) => { | ||||
| export const getLineNumberStringFromFragment = (fragment) => { | ||||
|   return fragment.slice(2) | ||||
| } | ||||
|  | ||||
| module.exports = { | ||||
|   lineFragmentRe, | ||||
|   convertHeadingToHTMLFragment, | ||||
|   getMarkdownHeadings, | ||||
|   getMarkdownIdOrAnchorNameFragments, | ||||
|   isValidIntegerString, | ||||
|   getNumberOfLines, | ||||
|   getLineNumberStringFromFragment, | ||||
| } | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| const { test } = require("node:test") | ||||
| const assert = require("node:assert/strict") | ||||
| import { test } from "node:test" | ||||
| import assert from "node:assert/strict" | ||||
|  | ||||
| const { markdownlint } = require("markdownlint").promises | ||||
| import * as markdownlint from "markdownlint/promise" | ||||
|  | ||||
| const relativeLinksRule = require("../src/index.js") | ||||
| import relativeLinksRule from "../src/index.js" | ||||
|  | ||||
| /** | ||||
|  * | ||||
| @@ -11,7 +11,7 @@ const relativeLinksRule = require("../src/index.js") | ||||
|  * @returns | ||||
|  */ | ||||
| const validateMarkdownLint = async (fixtureFile) => { | ||||
|   const lintResults = await markdownlint({ | ||||
|   const lintResults = await markdownlint.lint({ | ||||
|     files: [fixtureFile], | ||||
|     config: { | ||||
|       default: false, | ||||
|   | ||||
| @@ -1,14 +1,14 @@ | ||||
| const { test } = require("node:test") | ||||
| const assert = require("node:assert/strict") | ||||
| import { test } from "node:test" | ||||
| import assert from "node:assert/strict" | ||||
|  | ||||
| const { | ||||
| import { | ||||
|   convertHeadingToHTMLFragment, | ||||
|   getMarkdownHeadings, | ||||
|   getMarkdownIdOrAnchorNameFragments, | ||||
|   isValidIntegerString, | ||||
|   getNumberOfLines, | ||||
|   getLineNumberStringFromFragment, | ||||
| } = require("../src/utils.js") | ||||
| } from "../src/utils.js" | ||||
|  | ||||
| test("utils", async (t) => { | ||||
|   await t.test("convertHeadingToHTMLFragment", async () => { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user