npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

textlint-rule-no-dead-link

v5.2.0

Published

A textlint rule to check if all links are alive

Downloads

31,574

Readme

textlint-rule-no-dead-link

textlint rule npm test

textlint rule to make sure every link in a document is available.

The primary target of this rule is Markdown documents, but it also works on plain text documents (See tests).

Installation

npm install textlint-rule-no-dead-link

Usage

npm install textlint textlint-rule-no-dead-link
textlint --rule textlint-rule-no-dead-link text-to-check.txt

Features

Dead Link Detection

Shows an error if a link is dead (i.e. its server returns one of the "non-ok" responses).

Obsolete Link Detection

Fixable

Shows an error if a link is obsolete or moved to another location (i.e. its server returns one of the "redirect" responses).

This error is fixable and textlint will automatically replace the obsolete links with their new ones if you run it with --fix option.

Relative Link Resolution

Sometimes your files contain relative URIs, which don't have domain information in an URI string. In this case, we have to somehow resolve the relative URIs and convert them into absolute URIs.

The resolution strategy is as follows:

  1. If baseURI is specified, use that path to resolve relative URIs (See the below section for details).
  2. If not, try to get the path of the file being linted and use its parent folder as the base path.
  3. If that's not available (e.g., when you are performing linting from API), put an error Unable to resolve the relative URI.

Options

Please write your configurations in .textlintrc.

The default options are:

{
  "rules": {
    "no-dead-link": {
      "checkRelative": true,
      "baseURI": null,
      "ignore": [],
      "dotInIgnore": false,
      "ignoreRedirects": false,
      "preferGET": [],
      "retry": 3,
      "userAgent": "textlint-rule-no-dead-link/1.0",
      "maxRetryTime": 10,
      "maxRetryAfterTime": 90
    }
  }
}

checkRelative

This rule checks the availability of relative URIs by default. You can turn off the checks by passing false to this option.

baseURI

The base URI to be used for resolving relative URIs.

Though its name, you can pass either an URI starting with http or https, or an file path starting with /.

Examples:

"no-dead-link": {
  "baseURI": "http://example.com/"
}
"no-dead-link": {
  "baseURI": "/Users/textlint/path/to/parent/folder/"
}

ignore

An array of URIs or globs to be ignored. These list will be skipped from the availability checks.

Example:

"no-dead-link": {
  "ignore": [
    "http://example.com/not-exist/index.html",
    "http://example.com/*" // glob format
  ]
}

dotInIgnore

This rule allows ignore patterns to match filenames starting with a period. For example, if the ignore option contains "http://example.com/**" and the dotInIgnore option is set to true, paths containing filenames that start with . (like "http://example.com/.hidden/index.html") will be ignored. You can disable this behavior by setting dotInIgnore to false.

cf, https://github.com/isaacs/minimatch?tab=readme-ov-file#dot

preferGET

An array of origins to lets the rule connect to the origin's URL by GET instead of default HEAD request.

Although the rule will fall back to GET method when HEAD request is failed (status code is not between 200 and 300), in order to shorten time to run your test, you can use this option when you are sure that target origin always returns 5xx for HEAD request.

Example:

"no-dead-link": {
  "preferGET": [
    "http://example.com"
  ]
}

ignoreRedirects

This rule checks for redirects (3xx status codes) and consider's them an error by default. To ignore redirects during checks, set this value to false.

retry

This rule checks the url with retry. The default max retry count is 3.

userAgent

Customize User-Agent http header.

maxRetryTime

The max of waiting seconds for retry. It is related to retry option.

:memo: It does affect to Retry-After header. If you want to max waiting seconds for Retry-After header, please use maxRetryAfterTime option.

Default: 10

maxRetryAfterTime

The max of allow waiting time second for Retry-After header value.

Some website like GitHub returns Retry-After header value with 429 too many requests. This maxRetryAfterTime option is for that Retry-After.

Default: 10

CI Integration

Probably, Link Checking take long times. We recommend to use cron job like GitHub Actions.

textlint + SARIF output + code scanning

Preparing:

# Install dependencies
npm install --save-dev textlint @microsoft/eslint-formatter-sarif textlint-rule-no-dead-link
# Create .textlintrc
npx textlint --init

Following actions check links and upload the status to code scanning.

You can see the result at https://github.com/{owner}/{repo}/security/code-scanning.

name: Link Check
on:
  workflow_dispatch:
  schedule:
    - cron: '45 15 * * *'

permissions:
  contents: read
  security-events: write

jobs:
  test:
    runs-on: ubuntu-latest
    name: Link Check
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm ci
      - run: npx textlint -f @microsoft/eslint-formatter-sarif -o textlint.sarif || exit 0 # workaround https://github.com/textlint/textlint/issues/103
      - name: Upload SARIF file
        uses: github/codeql-action/upload-sarif@v2
        with:
          sarif_file: textlint.sarif
          category: textlint

Tests

npm test

Contribution

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

License

MIT License (http://nodaguti.mit-license.org/)