@mnaoumov/typescript-dev-toolkit 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/link-check-skip.cjs +166 -0
- package/dist/lib/cjs/link-check-skip.d.cts +109 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +2 -1
- package/dist/lib/cjs/linters/eslint-rules/import-fix.cjs +116 -0
- package/dist/lib/cjs/linters/eslint-rules/import-fix.d.cts +49 -0
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +3 -1
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +7 -1
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +2 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-dedent.cjs +189 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-dedent.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +7 -30
- package/dist/lib/cjs/linters/markdownlint.cjs +42 -13
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/link-check-skip.d.mts +109 -0
- package/dist/lib/esm/link-check-skip.mjs +125 -0
- package/dist/lib/esm/linters/eslint-config.mjs +2 -1
- package/dist/lib/esm/linters/eslint-rules/import-fix.d.mts +49 -0
- package/dist/lib/esm/linters/eslint-rules/import-fix.mjs +90 -0
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +3 -1
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +2 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +5 -1
- package/dist/lib/esm/linters/eslint-rules/prefer-dedent.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-dedent.mjs +168 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +11 -30
- package/dist/lib/esm/linters/markdownlint.mjs +54 -15
- package/linters/eslint-rules/import-fix/package.json +6 -0
- package/linters/eslint-rules/prefer-dedent/package.json +6 -0
- package/package.json +1 -1
package/dist/lib/cjs/index.cjs
CHANGED
|
@@ -53,6 +53,7 @@ __export(index_exports, {
|
|
|
53
53
|
git: () => git,
|
|
54
54
|
json: () => json,
|
|
55
55
|
"library-build": () => library_build,
|
|
56
|
+
"link-check-skip": () => link_check_skip,
|
|
56
57
|
linters: () => linters,
|
|
57
58
|
"nano-staged-config": () => nano_staged_config,
|
|
58
59
|
npm: () => npm,
|
|
@@ -92,6 +93,7 @@ var gate = __toESM(((module) => module && module.__esModule && 'default' in modu
|
|
|
92
93
|
var git = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./git.cjs')), 1);
|
|
93
94
|
var json = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./json.cjs')), 1);
|
|
94
95
|
var library_build = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./library-build.cjs')), 1);
|
|
96
|
+
var link_check_skip = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./link-check-skip.cjs')), 1);
|
|
95
97
|
var linters = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./linters/index.cjs')), 1);
|
|
96
98
|
var nano_staged_config = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./nano-staged-config.cjs')), 1);
|
|
97
99
|
var npm_publish = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./npm-publish.cjs')), 1);
|
|
@@ -131,6 +133,7 @@ var version = __toESM(((module) => module && module.__esModule && 'default' in m
|
|
|
131
133
|
git,
|
|
132
134
|
json,
|
|
133
135
|
"library-build": null,
|
|
136
|
+
"link-check-skip": null,
|
|
134
137
|
linters,
|
|
135
138
|
"nano-staged-config": null,
|
|
136
139
|
npm,
|
|
@@ -149,4 +152,4 @@ var version = __toESM(((module) => module && module.__esModule && 'default' in m
|
|
|
149
152
|
"validate-dependencies": null,
|
|
150
153
|
version
|
|
151
154
|
});
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidWxrLWNvbmN1cnJlbmN5JyBmcm9tICcuL2J1bGstY29uY3VycmVuY3kudHMnO1xuZXhwb3J0ICogYXMgJ2J1bmRsZXJzJyBmcm9tICcuL2J1bmRsZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdjaGVjay1wcm9qZWN0LXR5cGVzJyBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuZXhwb3J0ICogYXMgJ2NsaS11dGlscycgZnJvbSAnLi9jbGktdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ2NvZGUtZ2VuZXJhdG9yJyBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LWNvbmZpZycgZnJvbSAnLi9jb21taXRsaW50LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtbGludC1tZC1oZWFkZXInIGZyb20gJy4vY29tbWl0bGludC1saW50LW1kLWhlYWRlci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlcicgZnJvbSAnLi9jb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUnIGZyb20gJy4vZG9jcy1zaXRlL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2ZvcmJpZGRlbi1wYXR0ZXJucy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpYnJhcnktYnVpbGQnIGZyb20gJy4vbGlicmFyeS1idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnbGluay1jaGVjay1za2lwJyBmcm9tICcuL2xpbmstY2hlY2stc2tpcC50cyc7XG5leHBvcnQgKiBhcyAnbGludGVycycgZnJvbSAnLi9saW50ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICduYW5vLXN0YWdlZC1jb25maWcnIGZyb20gJy4vbmFuby1zdGFnZWQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICducG0tcHVibGlzaCcgZnJvbSAnLi9ucG0tcHVibGlzaC50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXJ1bicgZnJvbSAnLi9ucG0tcnVuLnRzJztcbmV4cG9ydCAqIGFzICducG0nIGZyb20gJy4vbnBtLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLWxvY2staW50ZWdyaXR5JyBmcm9tICcuL3BhY2thZ2UtbG9jay1pbnRlZ3JpdHkudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3JlbGVhc2VkLWlzc3VlcycgZnJvbSAnLi9yZWxlYXNlZC1pc3N1ZXMudHMnO1xuZXhwb3J0ICogYXMgJ3JlcG8tcGF0aHMnIGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncm9vdCcgZnJvbSAnLi9yb290LnRzJztcbmV4cG9ydCAqIGFzICdzaGFyZWQtY29uZmlnLWZpbGVzJyBmcm9tICcuL3NoYXJlZC1jb25maWctZmlsZXMudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMtY2xpJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMtY2xpLnRzJztcbmV4cG9ydCAqIGFzICd1cHN0cmVhbS1zeW5jJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlcGVuZGVuY2llcycgZnJvbSAnLi92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSw0QkFBQUE7QUFBQSxFQUFBO0FBQUEsK0JBQUFDO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLG1DQUFBQztBQUFBLEVBQUEsc0NBQUFDO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLG9CQUFBQztBQUFBLEVBQUE7QUFBQSw4QkFBQUM7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx5QkFBQUM7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUE7QUFBQSw4QkFBQUM7QUFBQSxFQUFBO0FBQUEsdUJBQUFDO0FBQUEsRUFBQSxpQkFBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEseUJBQUFDO0FBQUEsRUFBQSx5QkFBQUM7QUFBQSxFQUFBLG9CQUFBQztBQUFBLEVBQUE7QUFBQSwrQkFBQUM7QUFBQSxFQUFBLHNCQUFBQztBQUFBLEVBQUEsdUJBQUFDO0FBQUEsRUFBQSwyQkFBQUM7QUFBQSxFQUFBLCtCQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFFQSxZQUF5QjtBQUN6QixJQUFBekIsbUJBQW9DO0FBQ3BDLGVBQTRCO0FBQzVCLElBQUFDLHNCQUF1QztBQUN2QyxJQUFBQyxZQUE2QjtBQUM3QixJQUFBQyxpQkFBa0M7QUFDbEMsSUFBQUMsb0JBQXFDO0FBQ3JDLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyw0QkFBNkM7QUFDN0MsSUFBQUMsK0JBQWdEO0FBQ2hELElBQUFDLFlBQTZCO0FBQzdCLElBQUFDLGFBQThCO0FBQzlCLFdBQXdCO0FBQ3hCLElBQUFDLHFCQUFzQztBQUN0QyxpQkFBOEI7QUFDOUIsU0FBc0I7QUFDdEIsV0FBd0I7QUFDeEIsVUFBdUI7QUFDdkIsV0FBd0I7QUFDeEIsSUFBQUMsZ0JBQWlDO0FBQ2pDLElBQUFDLGtCQUFtQztBQUNuQyxjQUEyQjtBQUMzQixJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsVUFBMkI7QUFDM0IsVUFBdUI7QUFDdkIsSUFBQUMseUJBQTBDO0FBQzFDLElBQUFDLGtCQUFtQztBQUNuQyxJQUFBQyxrQkFBbUM7QUFDbkMsSUFBQUMsYUFBOEI7QUFDOUIsV0FBd0I7QUFDeEIsSUFBQUMsc0JBQXVDO0FBQ3ZDLElBQUFDLGVBQWdDO0FBQ2hDLElBQUFFLG9CQUFxQztBQUNyQyxJQUFBRCxnQkFBaUM7QUFDakMsSUFBQUUsd0JBQXlDO0FBQ3pDLElBQUFDLHdCQUF5QztBQUN6QyxjQUEyQjsiLAogICJuYW1lcyI6IFsiYnVsay1jb25jdXJyZW5jeSIsICJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJjb21taXRsaW50LWZvcmJpZGRlbi1wYXR0ZXJucyIsICJjb21taXRsaW50LWxpbnQtbWQtaGVhZGVyIiwgImNvbW1pdGxpbnQtc3BlbGxjaGVjay1oZWFkZXIiLCAiZG9jcy1zaXRlIiwgImVudi10b2dnbGUiLCAiZm9yYmlkZGVuLXBhdHRlcm5zIiwgImxpYnJhcnktYnVpbGQiLCAibGluay1jaGVjay1za2lwIiwgIm5hbm8tc3RhZ2VkLWNvbmZpZyIsICJucG0tcHVibGlzaCIsICJucG0tcnVuIiwgInBhY2thZ2UtbG9jay1pbnRlZ3JpdHkiLCAicGFja2FnZS1tYW5hZ2VyIiwgInJlbGVhc2VkLWlzc3VlcyIsICJyZXBvLXBhdGhzIiwgInNoYXJlZC1jb25maWctZmlsZXMiLCAidGVzdC1ydW5uZXJzIiwgInVwc3RyZWFtLXN5bmMiLCAidXBzdHJlYW0tc3luYy1jbGkiLCAidmFsaWRhdGUtZGVjbGFyYXRpb25zIiwgInZhbGlkYXRlLWRlcGVuZGVuY2llcyJdCn0K
|
package/dist/lib/cjs/index.d.cts
CHANGED
|
@@ -23,6 +23,7 @@ export * as 'gate' from './gate.cjs';
|
|
|
23
23
|
export * as 'git' from './git.cjs';
|
|
24
24
|
export * as 'json' from './json.cjs';
|
|
25
25
|
export * as 'library-build' from './library-build.cjs';
|
|
26
|
+
export * as 'link-check-skip' from './link-check-skip.cjs';
|
|
26
27
|
export * as 'linters' from './linters/index.cjs';
|
|
27
28
|
export * as 'nano-staged-config' from './nano-staged-config.cjs';
|
|
28
29
|
export * as 'npm-publish' from './npm-publish.cjs';
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return '/';
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: 'android'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const existingProcess = globalThis.process;
|
|
17
|
+
|
|
18
|
+
if (!existingProcess) {
|
|
19
|
+
globalThis.process = browserProcess;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (existingProcess.versions?.node) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const existingProcessRecord = existingProcess;
|
|
28
|
+
|
|
29
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
30
|
+
existingProcessRecord[key] ??= value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
existingProcessRecord['browser'] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ensureBrowserProcess();
|
|
37
|
+
})();
|
|
38
|
+
|
|
39
|
+
"use strict";
|
|
40
|
+
var __create = Object.create;
|
|
41
|
+
var __defProp = Object.defineProperty;
|
|
42
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
43
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
44
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
45
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
46
|
+
var __export = (target, all) => {
|
|
47
|
+
for (var name in all)
|
|
48
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
49
|
+
};
|
|
50
|
+
var __copyProps = (to, from, except, desc) => {
|
|
51
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
52
|
+
for (let key of __getOwnPropNames(from))
|
|
53
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
54
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
55
|
+
}
|
|
56
|
+
return to;
|
|
57
|
+
};
|
|
58
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
59
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
60
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
61
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
62
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
63
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
64
|
+
mod
|
|
65
|
+
));
|
|
66
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
67
|
+
var link_check_skip_exports = {};
|
|
68
|
+
__export(link_check_skip_exports, {
|
|
69
|
+
LINK_CHECK_SKIP_ENV_VARIABLE: () => LINK_CHECK_SKIP_ENV_VARIABLE,
|
|
70
|
+
doesLinkCheckSkipEntryMatch: () => doesLinkCheckSkipEntryMatch,
|
|
71
|
+
extractUrls: () => extractUrls,
|
|
72
|
+
getLinkCheckSkipWarnings: () => getLinkCheckSkipWarnings,
|
|
73
|
+
mergeLinkinatorSkipConfig: () => mergeLinkinatorSkipConfig,
|
|
74
|
+
parseLinkCheckSkipEntries: () => parseLinkCheckSkipEntries,
|
|
75
|
+
readLinkCheckSkipEntries: () => readLinkCheckSkipEntries,
|
|
76
|
+
toLinkinatorSkipPattern: () => toLinkinatorSkipPattern
|
|
77
|
+
});
|
|
78
|
+
module.exports = __toCommonJS(link_check_skip_exports);
|
|
79
|
+
var import_reg_exp = require('@mnaoumov/typescript-lib/reg-exp');
|
|
80
|
+
var import_node_process = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('node:process')), 1);
|
|
81
|
+
var import_env_toggle = require('./env-toggle.cjs');
|
|
82
|
+
const LINK_CHECK_SKIP_ENV_VARIABLE = "LINK_CHECK_SKIP";
|
|
83
|
+
const HOST_REG_EXP = /^[a-z\d-]+(?:\.[a-z\d-]+)*$/i;
|
|
84
|
+
const URL_REG_EXP = /\bhttps?:\/\/[^\s<>()[\]{}"'`]+/gi;
|
|
85
|
+
const URL_TRAILING_PUNCTUATION_REG_EXP = /[.,;:!?*_~]+$/;
|
|
86
|
+
function doesLinkCheckSkipEntryMatch(url, entry) {
|
|
87
|
+
return entry.kind === "prefix" ? url.startsWith(entry.value) : URL.parse(url)?.hostname === entry.value;
|
|
88
|
+
}
|
|
89
|
+
function extractUrls(text) {
|
|
90
|
+
return Array.from(text.matchAll(URL_REG_EXP), (match) => match[0].replace(URL_TRAILING_PUNCTUATION_REG_EXP, ""));
|
|
91
|
+
}
|
|
92
|
+
function getLinkCheckSkipWarnings(entries, files) {
|
|
93
|
+
const warnings = [];
|
|
94
|
+
const usedEntries = /* @__PURE__ */ new Set();
|
|
95
|
+
for (const file of files) {
|
|
96
|
+
for (const url of new Set(extractUrls(file.content))) {
|
|
97
|
+
const entry = entries.find((candidate) => doesLinkCheckSkipEntryMatch(url, candidate));
|
|
98
|
+
if (!entry) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
usedEntries.add(entry);
|
|
102
|
+
warnings.push(`WARNING: ${LINK_CHECK_SKIP_ENV_VARIABLE} skips ${url} in ${file.path} (entry ${entry.value}).`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
for (const entry of entries) {
|
|
106
|
+
if (!usedEntries.has(entry)) {
|
|
107
|
+
warnings.push(`WARNING: ${LINK_CHECK_SKIP_ENV_VARIABLE} entry ${entry.value} matched no link; remove it.`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (entries.length > 0) {
|
|
111
|
+
warnings.push(
|
|
112
|
+
`WARNING: ${LINK_CHECK_SKIP_ENV_VARIABLE} is set. Set it for one command only, never in .env: a lasting skip lets links go stale unnoticed.`
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return warnings;
|
|
116
|
+
}
|
|
117
|
+
function mergeLinkinatorSkipConfig(projectConfig, entries) {
|
|
118
|
+
const config = projectConfig ?? {};
|
|
119
|
+
if (typeof config !== "object" || Array.isArray(config)) {
|
|
120
|
+
throw new TypeError("The project linkinator.config.json is not a JSON object.");
|
|
121
|
+
}
|
|
122
|
+
const record = config;
|
|
123
|
+
const projectSkip = record["skip"];
|
|
124
|
+
const existingSkip = projectSkip === void 0 ? [] : [projectSkip].flat();
|
|
125
|
+
return { ...record, skip: [...existingSkip, ...entries.map((entry) => toLinkinatorSkipPattern(entry))] };
|
|
126
|
+
}
|
|
127
|
+
function parseLinkCheckSkipEntries(value) {
|
|
128
|
+
const entries = [];
|
|
129
|
+
for (const rawEntry of value.split(",")) {
|
|
130
|
+
const entry = rawEntry.trim();
|
|
131
|
+
if (entry === "") {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (entry.includes("://")) {
|
|
135
|
+
entries.push({ kind: "prefix", value: entry });
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (!HOST_REG_EXP.test(entry)) {
|
|
139
|
+
throw new Error(`${LINK_CHECK_SKIP_ENV_VARIABLE} entry ${entry} is neither a host name nor a URL prefix (one holding ://).`);
|
|
140
|
+
}
|
|
141
|
+
entries.push({ kind: "host", value: entry.toLowerCase() });
|
|
142
|
+
}
|
|
143
|
+
return entries;
|
|
144
|
+
}
|
|
145
|
+
function readLinkCheckSkipEntries() {
|
|
146
|
+
(0, import_env_toggle.loadEnvFileIfExists)();
|
|
147
|
+
return parseLinkCheckSkipEntries(import_node_process.default.env[LINK_CHECK_SKIP_ENV_VARIABLE] ?? "");
|
|
148
|
+
}
|
|
149
|
+
function toLinkinatorSkipPattern(entry) {
|
|
150
|
+
if (entry.kind === "prefix") {
|
|
151
|
+
return `^${(0, import_reg_exp.escapeRegExp)(entry.value)}`;
|
|
152
|
+
}
|
|
153
|
+
return String.raw`^https?://(?:[^/?#@]*@)?${(0, import_reg_exp.escapeRegExp)(entry.value)}(?::\d+)?(?:[/?#]|$)`;
|
|
154
|
+
}
|
|
155
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
156
|
+
0 && (module.exports = {
|
|
157
|
+
LINK_CHECK_SKIP_ENV_VARIABLE,
|
|
158
|
+
doesLinkCheckSkipEntryMatch,
|
|
159
|
+
extractUrls,
|
|
160
|
+
getLinkCheckSkipWarnings,
|
|
161
|
+
mergeLinkinatorSkipConfig,
|
|
162
|
+
parseLinkCheckSkipEntries,
|
|
163
|
+
readLinkCheckSkipEntries,
|
|
164
|
+
toLinkinatorSkipPattern
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saW5rLWNoZWNrLXNraXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExpbmtzIHRoZSBtYXJrZG93biBsaW5rIGNoZWNrIGxlYXZlcyB1bmNoZWNrZWQgZm9yIG9uZSBydW4sIG5hbWVkIGJ5IHRoZSB7QGxpbmsgTElOS19DSEVDS19TS0lQX0VOVl9WQVJJQUJMRX1cbiAqIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIFR3byBjYXNlcyBuZWVkIGl0OiBhIGhvc3QgdGhlIGN1cnJlbnQgbmV0d29yayBjYW5ub3QgcmVhY2ggYWx0aG91Z2ggaXQgaXMgdXAgKGEgcHJvdmlkZXIgYmxvY2tpbmcgaXQpLCBhbmQgYVxuICogcmVsZWFzZSB3aG9zZSBkb2N1bWVudGF0aW9uIGxpbmtzIHRvIHNvbWV0aGluZyBvbmx5IHRoYXQgc2FtZSByZWxlYXNlIHB1c2hlcy4gQm90aCBhcmUgdGVtcG9yYXJ5LCBzbyB0aGVcbiAqIHZhcmlhYmxlIGJlbG9uZ3Mgb24gdGhlIG9uZSBjb21tYW5kIHRoYXQgbmVlZHMgaXQsIG5ldmVyIGluIGAuZW52YDogYSBza2lwIGxlZnQgaW4gcGxhY2UgbGV0cyBhIGxpbmsgZ28gc3RhbGVcbiAqIHdpdGggbm90aGluZyB0byBzYXkgc28uIEl0IGlzIHJlYWQgbGlrZSBldmVyeSBvdGhlciB2YXJpYWJsZSBoZXJlLCBgLmVudmAgaW5jbHVkZWQsIGFuZCBldmVyeSBza2lwcGVkIGxpbmssXG4gKiBsaWtlIGV2ZXJ5IGVudHJ5IHRoYXQgc2tpcHBlZCBub3RoaW5nLCBwcmludHMgYSB3YXJuaW5nLCBzbyBhIHNraXAgaXMgbmV2ZXIgc2lsZW50LlxuICpcbiAqIEVudHJpZXMgYXJlIGNvbW1hLXNlcGFyYXRlZC4gQW4gZW50cnkgaG9sZGluZyBgOi8vYCBpcyBhIFVSTCBwcmVmaXggYW5kIG1hdGNoZXMgZXZlcnkgbGluayBzdGFydGluZyB3aXRoIGl0OyBhbnlcbiAqIG90aGVyIGVudHJ5IGlzIGEgaG9zdCBhbmQgbWF0Y2hlcyB0aGUgbGlua3MgdG8gZXhhY3RseSB0aGF0IGhvc3QgKGBtYWlsLnRtYCBkb2VzIG5vdCBtYXRjaCBgZG9jcy5tYWlsLnRtYCkuXG4gKi9cblxuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3JlZy1leHAnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHsgbG9hZEVudkZpbGVJZkV4aXN0cyB9IGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWluZyB0aGUgbGlua3MgdG8gc2tpcC5cbiAqL1xuZXhwb3J0IGNvbnN0IExJTktfQ0hFQ0tfU0tJUF9FTlZfVkFSSUFCTEUgPSAnTElOS19DSEVDS19TS0lQJztcblxuLyoqXG4gKiBPbmUgZW50cnkgb2Yge0BsaW5rIExJTktfQ0hFQ0tfU0tJUF9FTlZfVkFSSUFCTEV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtDaGVja1NraXBFbnRyeSB7XG4gIC8qKlxuICAgKiBgaG9zdGAgbWF0Y2hlcyBsaW5rcyB0byBleGFjdGx5IHRoYXQgaG9zdDsgYHByZWZpeGAgbWF0Y2hlcyBsaW5rcyBzdGFydGluZyB3aXRoIHtAbGluayB2YWx1ZX0uXG4gICAqL1xuICByZWFkb25seSBraW5kOiAnaG9zdCcgfCAncHJlZml4JztcblxuICAvKipcbiAgICogVGhlIGVudHJ5IGFzIHdyaXR0ZW4sIGEgaG9zdCBsb3dlcmNhc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgdGV4dCBvZiBvbmUgbWFya2Rvd24gZmlsZSB0aGUgbGluayBjaGVjayByZWFkcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rQ2hlY2tTb3VyY2VGaWxlIHtcbiAgLyoqXG4gICAqIFRoZSBmaWxlJ3MgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpbGUncyBwYXRoLCBhcyB0aGUgd2FybmluZ3MgbmFtZSBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuY29uc3QgSE9TVF9SRUdfRVhQID0gL15bYS16XFxkLV0rKD86XFwuW2EtelxcZC1dKykqJC9pO1xuY29uc3QgVVJMX1JFR19FWFAgPSAvXFxiaHR0cHM/OlxcL1xcL1teXFxzPD4oKVtcXF17fVwiJ2BdKy9naTtcbmNvbnN0IFVSTF9UUkFJTElOR19QVU5DVFVBVElPTl9SRUdfRVhQID0gL1suLDs6IT8qX35dKyQvO1xuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgYW4gZW50cnkgbWF0Y2hlcyBhIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTC5cbiAqIEBwYXJhbSBlbnRyeSAtIFRoZSBlbnRyeS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGEgYHByZWZpeGAgZW50cnkgc3RhcnRzIHRoZSBVUkwsIG9yIGEgYGhvc3RgIGVudHJ5IGlzIGV4YWN0bHkgdGhlIFVSTCdzIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzTGlua0NoZWNrU2tpcEVudHJ5TWF0Y2godXJsOiBzdHJpbmcsIGVudHJ5OiBMaW5rQ2hlY2tTa2lwRW50cnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVudHJ5LmtpbmQgPT09ICdwcmVmaXgnID8gdXJsLnN0YXJ0c1dpdGgoZW50cnkudmFsdWUpIDogVVJMLnBhcnNlKHVybCk/Lmhvc3RuYW1lID09PSBlbnRyeS52YWx1ZTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgYWJzb2x1dGUgYGh0dHBgL2BodHRwc2AgVVJMcyB3cml0dGVuIGluIGEgdGV4dC5cbiAqXG4gKiBJdCBpcyBhIHRleHR1YWwgc2Nhbiwgc28gaXQgYWxzbyBmaW5kcyBhIFVSTCBpbnNpZGUgYSBjb2RlIHNwYW4sIHdoaWNoIGBsaW5raW5hdG9yYCBkb2VzIG5vdCBjaGVjay5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIHNjYW4uXG4gKiBAcmV0dXJucyBUaGUgVVJMcywgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZSwgdHJhaWxpbmcgcHVuY3R1YXRpb24gZHJvcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVcmxzKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGV4dC5tYXRjaEFsbChVUkxfUkVHX0VYUCksIChtYXRjaCkgPT4gbWF0Y2hbMF0ucmVwbGFjZShVUkxfVFJBSUxJTkdfUFVOQ1RVQVRJT05fUkVHX0VYUCwgJycpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHdhcm5pbmdzIGZvciBhIHJ1biB3aXRoIHNraXAgZW50cmllczogb25lIHBlciBkaXN0aW5jdCBsaW5rIGVhY2ggZmlsZSBsb3NlcyB0byBhbiBlbnRyeSwgYW5kIG9uZSBwZXJcbiAqIGVudHJ5IHRoYXQgbWF0Y2hlZCBubyBsaW5rIGF0IGFsbC5cbiAqXG4gKiBAcGFyYW0gZW50cmllcyAtIFRoZSBlbnRyaWVzLCBhcyB7QGxpbmsgcGFyc2VMaW5rQ2hlY2tTa2lwRW50cmllc30gcmV0dXJuZWQgdGhlbS5cbiAqIEBwYXJhbSBmaWxlcyAtIFRoZSBtYXJrZG93biBmaWxlcyB0aGUgbGluayBjaGVjayBpcyBoYW5kZWQuXG4gKiBAcmV0dXJucyBUaGUgd2FybmluZyBsaW5lcywgd2l0aG91dCBhIHRyYWlsaW5nIG5ld2xpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5rQ2hlY2tTa2lwV2FybmluZ3MoZW50cmllczogcmVhZG9ubHkgTGlua0NoZWNrU2tpcEVudHJ5W10sIGZpbGVzOiByZWFkb25seSBMaW5rQ2hlY2tTb3VyY2VGaWxlW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB1c2VkRW50cmllcyA9IG5ldyBTZXQ8TGlua0NoZWNrU2tpcEVudHJ5PigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGZvciAoY29uc3QgdXJsIG9mIG5ldyBTZXQoZXh0cmFjdFVybHMoZmlsZS5jb250ZW50KSkpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKChjYW5kaWRhdGUpID0+IGRvZXNMaW5rQ2hlY2tTa2lwRW50cnlNYXRjaCh1cmwsIGNhbmRpZGF0ZSkpO1xuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdXNlZEVudHJpZXMuYWRkKGVudHJ5KTtcbiAgICAgIHdhcm5pbmdzLnB1c2goYFdBUk5JTkc6ICR7TElOS19DSEVDS19TS0lQX0VOVl9WQVJJQUJMRX0gc2tpcHMgJHt1cmx9IGluICR7ZmlsZS5wYXRofSAoZW50cnkgJHtlbnRyeS52YWx1ZX0pLmApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmICghdXNlZEVudHJpZXMuaGFzKGVudHJ5KSkge1xuICAgICAgd2FybmluZ3MucHVzaChgV0FSTklORzogJHtMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFfSBlbnRyeSAke2VudHJ5LnZhbHVlfSBtYXRjaGVkIG5vIGxpbms7IHJlbW92ZSBpdC5gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGBXQVJOSU5HOiAke0xJTktfQ0hFQ0tfU0tJUF9FTlZfVkFSSUFCTEV9IGlzIHNldC4gU2V0IGl0IGZvciBvbmUgY29tbWFuZCBvbmx5LCBuZXZlciBpbiAuZW52OiBhIGxhc3Rpbmcgc2tpcCBsZXRzIGxpbmtzIGdvIHN0YWxlIHVubm90aWNlZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB3YXJuaW5ncztcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBlbnRyaWVzIHRvIGEgYGxpbmtpbmF0b3JgIGNvbmZpZywga2VlcGluZyB3aGF0ZXZlciB0aGUgcHJvamVjdCdzIG93biBjb25maWcgYWxyZWFkeSBza2lwcy5cbiAqXG4gKiBUaGUgc2tpcCBsaXN0IGdvZXMgdG8gYGxpbmtpbmF0b3JgIGFzIGEgY29uZmlnIGZpbGUgYmVjYXVzZSBgLS1jb25maWdgIHJlcGxhY2VzIHRoZSBwcm9qZWN0J3NcbiAqIGBsaW5raW5hdG9yLmNvbmZpZy5qc29uYCByYXRoZXIgdGhhbiBhZGRpbmcgdG8gaXQsIHNvIHRoZSBwcm9qZWN0J3Mgc2V0dGluZ3MgaGF2ZSB0byBiZSBjYXJyaWVkIG92ZXIuXG4gKlxuICogQHBhcmFtIHByb2plY3RDb25maWcgLSBUaGUgcGFyc2VkIHByb2plY3QgYGxpbmtpbmF0b3IuY29uZmlnLmpzb25gLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAcGFyYW0gZW50cmllcyAtIFRoZSBlbnRyaWVzLlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB0byB3cml0ZS5cbiAqIEB0aHJvd3MgSWYgdGhlIHByb2plY3QgY29uZmlnIGlzIG5vdCBhIEpTT04gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMaW5raW5hdG9yU2tpcENvbmZpZyhwcm9qZWN0Q29uZmlnOiB1bmtub3duLCBlbnRyaWVzOiByZWFkb25seSBMaW5rQ2hlY2tTa2lwRW50cnlbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgY29uZmlnID0gcHJvamVjdENvbmZpZyA/PyB7fTtcbiAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoY29uZmlnKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBwcm9qZWN0IGxpbmtpbmF0b3IuY29uZmlnLmpzb24gaXMgbm90IGEgSlNPTiBvYmplY3QuJyk7XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBjb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHByb2plY3RTa2lwID0gcmVjb3JkWydza2lwJ107XG4gIGNvbnN0IGV4aXN0aW5nU2tpcCA9IHByb2plY3RTa2lwID09PSB1bmRlZmluZWQgPyBbXSA6IFtwcm9qZWN0U2tpcF0uZmxhdCgpO1xuICByZXR1cm4geyAuLi5yZWNvcmQsIHNraXA6IFsuLi5leGlzdGluZ1NraXAsIC4uLmVudHJpZXMubWFwKChlbnRyeSkgPT4gdG9MaW5raW5hdG9yU2tpcFBhdHRlcm4oZW50cnkpKV0gfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIHZhbHVlIG9mIHtAbGluayBMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFfS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29tbWEtc2VwYXJhdGVkIHZhbHVlOyBibGFuayBlbnRyaWVzIGFyZSBpZ25vcmVkLlxuICogQHJldHVybnMgVGhlIGVudHJpZXMuXG4gKiBAdGhyb3dzIElmIGFuIGVudHJ5IGlzIG5laXRoZXIgYSBVUkwgcHJlZml4IG5vciBhIGhvc3QgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlua0NoZWNrU2tpcEVudHJpZXModmFsdWU6IHN0cmluZyk6IExpbmtDaGVja1NraXBFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogTGlua0NoZWNrU2tpcEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0VudHJ5IG9mIHZhbHVlLnNwbGl0KCcsJykpIHtcbiAgICBjb25zdCBlbnRyeSA9IHJhd0VudHJ5LnRyaW0oKTtcbiAgICBpZiAoZW50cnkgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkuaW5jbHVkZXMoJzovLycpKSB7XG4gICAgICBlbnRyaWVzLnB1c2goeyBraW5kOiAncHJlZml4JywgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFIT1NUX1JFR19FWFAudGVzdChlbnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFfSBlbnRyeSAke2VudHJ5fSBpcyBuZWl0aGVyIGEgaG9zdCBuYW1lIG5vciBhIFVSTCBwcmVmaXggKG9uZSBob2xkaW5nIDovLykuYCk7XG4gICAgfVxuXG4gICAgZW50cmllcy5wdXNoKHsga2luZDogJ2hvc3QnLCB2YWx1ZTogZW50cnkudG9Mb3dlckNhc2UoKSB9KTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBlbnRyaWVzIG9mIHtAbGluayBMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFfSwgbG9hZGluZyB0aGUgb3B0aW9uYWwgYC5lbnZgIGZpcnN0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBlbnRyaWVzOyBub25lIHdoZW4gdGhlIHZhcmlhYmxlIGlzIHVuc2V0IG9yIGJsYW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZExpbmtDaGVja1NraXBFbnRyaWVzKCk6IExpbmtDaGVja1NraXBFbnRyeVtdIHtcbiAgbG9hZEVudkZpbGVJZkV4aXN0cygpO1xuICByZXR1cm4gcGFyc2VMaW5rQ2hlY2tTa2lwRW50cmllcyhwcm9jZXNzLmVudltMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFXSA/PyAnJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gZW50cnkgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGhlIGBza2lwYCBsaXN0IG9mIGEgYGxpbmtpbmF0b3JgIGNvbmZpZyBmaWxlLlxuICpcbiAqIE5ldmVyIHBhc3MgaXQgYXMgYSBgLS1za2lwYCBhcmd1bWVudDogb24gV2luZG93cyB0aGUgY29tbWFuZCBsaW5lIHBhc3NlcyB0aHJvdWdoIHRoZSBgbnB4YCBhbmQgYC5iaW5gIHNoaW1zLFxuICogd2hpY2ggcmUtZXhwYW5kIGl0IHVucXVvdGVkLCBzbyB0aGUgYHxgIGluIGl0IHBpcGVzIGludG8gYSBjb21tYW5kIG5hbWVkIGJ5IHdoYXQgZm9sbG93cy5cbiAqXG4gKiBAcGFyYW0gZW50cnkgLSBUaGUgZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgcmVndWxhciBleHByZXNzaW9uIHNvdXJjZTogYW4gYW5jaG9yZWQgcHJlZml4LCBvciB0aGUgc2NoZW1lLCBvcHRpb25hbCBjcmVkZW50aWFscywgdGhlIGhvc3QgYW5kIGFuXG4gKiBvcHRpb25hbCBwb3J0IGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIGF1dGhvcml0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTGlua2luYXRvclNraXBQYXR0ZXJuKGVudHJ5OiBMaW5rQ2hlY2tTa2lwRW50cnkpOiBzdHJpbmcge1xuICBpZiAoZW50cnkua2luZCA9PT0gJ3ByZWZpeCcpIHtcbiAgICByZXR1cm4gYF4ke2VzY2FwZVJlZ0V4cChlbnRyeS52YWx1ZSl9YDtcbiAgfVxuXG4gIC8vIGBsaW5raW5hdG9yYCBtYXRjaGVzIHRoZSBVUkwgaXQgaGFzIG5vcm1hbGl6ZWQsIHdob3NlIHNjaGVtZSBhbmQgaG9zdCBhcmUgbG93ZXJjYXNlIGFscmVhZHkuXG4gIHJldHVybiBTdHJpbmcucmF3YF5odHRwcz86Ly8oPzpbXi8/I0BdKkApPyR7ZXNjYXBlUmVnRXhwKGVudHJ5LnZhbHVlKX0oPzo6XFxkKyk/KD86Wy8/I118JClgO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEscUJBQTZCO0FBQzdCLDBCQUFvQjtBQUVwQix3QkFBb0M7QUFLN0IsTUFBTSwrQkFBK0I7QUFnQzVDLE1BQU0sZUFBZTtBQUNyQixNQUFNLGNBQWM7QUFDcEIsTUFBTSxtQ0FBbUM7QUFTbEMsU0FBUyw0QkFBNEIsS0FBYSxPQUFvQztBQUMzRixTQUFPLE1BQU0sU0FBUyxXQUFXLElBQUksV0FBVyxNQUFNLEtBQUssSUFBSSxJ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
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Links the markdown link check leaves unchecked for one run, named by the {@link LINK_CHECK_SKIP_ENV_VARIABLE}
|
|
6
|
+
* environment variable.
|
|
7
|
+
*
|
|
8
|
+
* Two cases need it: a host the current network cannot reach although it is up (a provider blocking it), and a
|
|
9
|
+
* release whose documentation links to something only that same release pushes. Both are temporary, so the
|
|
10
|
+
* variable belongs on the one command that needs it, never in `.env`: a skip left in place lets a link go stale
|
|
11
|
+
* with nothing to say so. It is read like every other variable here, `.env` included, and every skipped link,
|
|
12
|
+
* like every entry that skipped nothing, prints a warning, so a skip is never silent.
|
|
13
|
+
*
|
|
14
|
+
* Entries are comma-separated. An entry holding `://` is a URL prefix and matches every link starting with it; any
|
|
15
|
+
* other entry is a host and matches the links to exactly that host (`mail.tm` does not match `docs.mail.tm`).
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* The environment variable naming the links to skip.
|
|
19
|
+
*/
|
|
20
|
+
export declare const LINK_CHECK_SKIP_ENV_VARIABLE = "LINK_CHECK_SKIP";
|
|
21
|
+
/**
|
|
22
|
+
* One entry of {@link LINK_CHECK_SKIP_ENV_VARIABLE}.
|
|
23
|
+
*/
|
|
24
|
+
export interface LinkCheckSkipEntry {
|
|
25
|
+
/**
|
|
26
|
+
* `host` matches links to exactly that host; `prefix` matches links starting with {@link value}.
|
|
27
|
+
*/
|
|
28
|
+
readonly kind: 'host' | 'prefix';
|
|
29
|
+
/**
|
|
30
|
+
* The entry as written, a host lowercased.
|
|
31
|
+
*/
|
|
32
|
+
readonly value: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The text of one markdown file the link check reads.
|
|
36
|
+
*/
|
|
37
|
+
export interface LinkCheckSourceFile {
|
|
38
|
+
/**
|
|
39
|
+
* The file's content.
|
|
40
|
+
*/
|
|
41
|
+
readonly content: string;
|
|
42
|
+
/**
|
|
43
|
+
* The file's path, as the warnings name it.
|
|
44
|
+
*/
|
|
45
|
+
readonly path: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Tells whether an entry matches a URL.
|
|
49
|
+
*
|
|
50
|
+
* @param url - The URL.
|
|
51
|
+
* @param entry - The entry.
|
|
52
|
+
* @returns `true` when a `prefix` entry starts the URL, or a `host` entry is exactly the URL's host.
|
|
53
|
+
*/
|
|
54
|
+
export declare function doesLinkCheckSkipEntryMatch(url: string, entry: LinkCheckSkipEntry): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Finds the absolute `http`/`https` URLs written in a text.
|
|
57
|
+
*
|
|
58
|
+
* It is a textual scan, so it also finds a URL inside a code span, which `linkinator` does not check.
|
|
59
|
+
*
|
|
60
|
+
* @param text - The text to scan.
|
|
61
|
+
* @returns The URLs, in order of appearance, trailing punctuation dropped.
|
|
62
|
+
*/
|
|
63
|
+
export declare function extractUrls(text: string): string[];
|
|
64
|
+
/**
|
|
65
|
+
* Builds the warnings for a run with skip entries: one per distinct link each file loses to an entry, and one per
|
|
66
|
+
* entry that matched no link at all.
|
|
67
|
+
*
|
|
68
|
+
* @param entries - The entries, as {@link parseLinkCheckSkipEntries} returned them.
|
|
69
|
+
* @param files - The markdown files the link check is handed.
|
|
70
|
+
* @returns The warning lines, without a trailing newline.
|
|
71
|
+
*/
|
|
72
|
+
export declare function getLinkCheckSkipWarnings(entries: readonly LinkCheckSkipEntry[], files: readonly LinkCheckSourceFile[]): string[];
|
|
73
|
+
/**
|
|
74
|
+
* Adds the entries to a `linkinator` config, keeping whatever the project's own config already skips.
|
|
75
|
+
*
|
|
76
|
+
* The skip list goes to `linkinator` as a config file because `--config` replaces the project's
|
|
77
|
+
* `linkinator.config.json` rather than adding to it, so the project's settings have to be carried over.
|
|
78
|
+
*
|
|
79
|
+
* @param projectConfig - The parsed project `linkinator.config.json`, or `undefined` when there is none.
|
|
80
|
+
* @param entries - The entries.
|
|
81
|
+
* @returns The config to write.
|
|
82
|
+
* @throws If the project config is not a JSON object.
|
|
83
|
+
*/
|
|
84
|
+
export declare function mergeLinkinatorSkipConfig(projectConfig: unknown, entries: readonly LinkCheckSkipEntry[]): Record<string, unknown>;
|
|
85
|
+
/**
|
|
86
|
+
* Parses the value of {@link LINK_CHECK_SKIP_ENV_VARIABLE}.
|
|
87
|
+
*
|
|
88
|
+
* @param value - The comma-separated value; blank entries are ignored.
|
|
89
|
+
* @returns The entries.
|
|
90
|
+
* @throws If an entry is neither a URL prefix nor a host name.
|
|
91
|
+
*/
|
|
92
|
+
export declare function parseLinkCheckSkipEntries(value: string): LinkCheckSkipEntry[];
|
|
93
|
+
/**
|
|
94
|
+
* Reads the entries of {@link LINK_CHECK_SKIP_ENV_VARIABLE}, loading the optional `.env` first.
|
|
95
|
+
*
|
|
96
|
+
* @returns The entries; none when the variable is unset or blank.
|
|
97
|
+
*/
|
|
98
|
+
export declare function readLinkCheckSkipEntries(): LinkCheckSkipEntry[];
|
|
99
|
+
/**
|
|
100
|
+
* Converts an entry into a regular expression for the `skip` list of a `linkinator` config file.
|
|
101
|
+
*
|
|
102
|
+
* Never pass it as a `--skip` argument: on Windows the command line passes through the `npx` and `.bin` shims,
|
|
103
|
+
* which re-expand it unquoted, so the `|` in it pipes into a command named by what follows.
|
|
104
|
+
*
|
|
105
|
+
* @param entry - The entry.
|
|
106
|
+
* @returns The regular expression source: an anchored prefix, or the scheme, optional credentials, the host and an
|
|
107
|
+
* optional port followed by the end of the authority.
|
|
108
|
+
*/
|
|
109
|
+
export declare function toLinkinatorSkipPattern(entry: LinkCheckSkipEntry): string;
|