Security News
GitHub Removes Malicious Pull Requests Targeting Open Source Repositories
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
eleventy-plugin-broken-links
Advanced tools
An Eleventy plugin to check for broken external links
This is an 11ty plugin to check for broken external links after a build.
Currently it only checks external links, but checking internal links might be added at some point.
eleventy-fetch
Under the hood, the plugin uses:
node-html-parser
to parse build output and gather linkseleventy-fetch
to cache resultsminimatch
to handle globbing for excluded input fileskleur
for log coloring / formattingvalid-url
to check if it's a valid uriNPM:
npm i -D eleventy-plugin-broken-links
Yarn:
yarn add -D eleventy-plugin-broken-links
.eleventy.js
configconst brokenLinksPlugin = require("eleventy-plugin-broken-links");
module.exports = (eleventyConfig) => {
eleventyConfig.addPlugin(brokenLinksPlugin);
// ... the rest of your config
};
.cache
to .gitignore
See this privacy notice in the eleventy-fetch
docs
about why we should ignore the .cache
directory. Unless you really know
what you're doing, it's probably a good idea.
.cache/
# ... the rest of your `.gitignore`
There are currently 7 possible keys to the optional options
object passed
with eleventyConfig.addPlugin()
:
Option | Default | Accepted values | Description |
---|---|---|---|
forbidden | "warn" | "warn" , "error" | Whether to warn or throw an error |
broken | "warn" | "warn" , "error" | (same as above) |
redirect | "warn" | "warn" , "error" | (same as above) |
cacheDuration | "1d" | any value accepted by eleventy-fetch | Set the duration of the cache |
loggingLevel | 2 | Integer 0 (silent) to 3 (all) | Set the logging level |
excludeUrls | ['http://localhost*', 'https://localhost*'] | Array of URL strings | Exclude specific URLs or wildcards |
excludeInputs | [] | Array of globs, relative to eleventyConfig.dir.input value | Exclude input files / globs |
callback | null | null or a function with signature (brokenLinks, redirectLinks) => {} | Custom callback after checking links |
Here's an example using all options, with the defaults:
const brokenLinksPlugin = require("eleventy-plugin-broken-links");
module.exports = (eleventyConfig) => {
// ... the rest of your config
eleventyConfig.addPlugin(brokenLinksPlugin, {
forbidden: "warn",
redirect: "warn",
broken: "warn",
cacheDuration: "1d",
loggingLevel: 2,
excludeUrls: [],
excludeInputs: [],
callback: null,
});
};
NOTE: If the broken
, redirect
or forbidden
options are set to error
, your
build will not be successful if there are broken/redirected links!
broken
, redirect
and forbidden
"warn"
"warn"
or "error"
Whether to warn
or error
if broken, redirect or forbidden links are found. If error
,
builds will not succeed if any are found.
cacheDuration
"1d"
eleventy-fetch
pluginSets the cache duration for checking URL status codes. See the
eleventy-fetch
plugin docs
for more info.
loggingLevel
2
0
to 3
Level | Result |
---|---|
0 | Silent |
1 | Only log broken links |
2 | Only log broken and redirect links |
3 | All (verbose) |
excludeUrls
['http://localhost*', 'https://localhost*']
(new in 2.0.0
)You can exclude specific URLs by specifying their fully-qualified uri:
excludeUrls: ["https://example.com"];
But you can also use a wildcard (*
) to exclude domains or sub-paths. Examples:
"https://example.com"; // excludes only the root URL,
// but sub-paths will be include,
// e.g. 'https://example.com/about'
"https://example.com/about"; // excludes only '/about', but root and other
// pages are included
"https://example.com/about/*"; // excludes any path nested under 'about',
// but includes 'about'
"https://example.com/about*"; // excludes any sub-path that begins
// with `about`, INCLUDING all nested paths
"https://example.com/*"; // excludes all paths, but includes the root
"https://example.com*"; // excludes the root and all paths
Note that the URLs specified need to be fully-qualified, so sub-domains need to be explicitly indicated.
excludeInputs
[]
dir.input
You can exclude specific input files by providing an array of files or globs.
Please note:
dir.input
value./
) is optional, and is stripped from the input
filenames and excludeInputs
values when normalized before processingTo illustrate these points:
// - `dir.input` not set in config (`undefined`)
["index.md"]["./index.md"][ // exclude only ./index.md // identical to above
// - `dir.input` = "src":
"index.md"
]; // exclude ./src/index.md
Globbing is handled by minimatch
under the hood. Some examples:
// Some globbing examples:
["**/index.md"]["**/*.md"]["notes/**"]["**/./*.md"]["**/+(foo|bar).md"]; // exclude all index.md files recursively // exclude all .md files recursively // exclude all files recursively in 'notes' // exclude all .md files in subdirectories only // exclude all files named "foo.md" or "bar.md"
callback
null
null
or a function with signature (brokenLinks, redirectLinks, forbiddenLinks) => {}
Custom callback for handling broken, redirect or forbidden links after checking and
logging results (and before throwing an error, if option is set). The three
arguments, brokenLinks
, redirectLinks
and forbiddenLinks
are arrays of instances of the
ExternalLink
class,
which has the following methods and properties:
url
propertygetHttpStatusCode()
, which returns the HTTP status codegetPages()
which returns an array of Eleventy inputPath
filenamesgetLinkCount()
, which returns the number of times the link is used in the
site's pagesThis allows for integration with third-party services, webhooks, etc. Here's a basic example:
// your project's .eleventy.js:
const thirdPartyService = require("service");
const brokenLinksPlugin = require("eleventy-plugin-broken-links");
module.exports = (eleventyConfig) => {
eleventyConfig.addPlugin(brokenLinksPlugin, {
callback: (brokenLinks, redirectLinks) => {
thirdPartyService.post({
msg: `Your eleventy build had broken links! Links: ${brokenLinks.map(link => link.url).join(", ")}`,
});
},
});
};
I don't have a specific roadmap or timeline for this project, but here is a general idea of what the next steps are. If you would like to contribute, please feel free to file an issue or feature request, or send a PR.
v1.1.0
)v1.3.0
)v1.4.0
)v1.5.0
)debug
to hook into the DEBUG=Eleventy*
workflow (Added in v2.0.0
)FAQs
An Eleventy plugin to check for broken external links
The npm package eleventy-plugin-broken-links receives a total of 374 weekly downloads. As such, eleventy-plugin-broken-links popularity was classified as not popular.
We found that eleventy-plugin-broken-links demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.