nuxt-link-checker 4.2.0 → 4.3.1

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.
Files changed (61) hide show
  1. package/dist/client/200.html +12 -12
  2. package/dist/client/404.html +12 -12
  3. package/dist/client/_nuxt/3w_68AFy.js +1 -0
  4. package/dist/client/_nuxt/BMMyXqK5.js +1 -0
  5. package/dist/client/_nuxt/Cp-IABpG.js +1 -0
  6. package/dist/client/_nuxt/DhVqxY3H.js +1 -0
  7. package/dist/client/_nuxt/Dt-P3YVb.js +181 -0
  8. package/dist/client/_nuxt/{BFWaZzNn.js → Qizr_0i3.js} +1 -1
  9. package/dist/client/_nuxt/builds/latest.json +1 -1
  10. package/dist/client/_nuxt/builds/meta/f6a7da00-2cca-4db0-b8d5-690f99691ca5.json +1 -0
  11. package/dist/client/_nuxt/{entry.xKNhWsNM.css → entry.ycyXFUel.css} +1 -1
  12. package/dist/client/_nuxt/error-404.uLshya7R.css +1 -0
  13. package/dist/client/_nuxt/error-500.Dm5awy8c.css +1 -0
  14. package/dist/client/_nuxt/wWkaIY0j.js +1 -0
  15. package/dist/client/index.html +12 -12
  16. package/dist/module.d.mts +2 -1
  17. package/dist/module.json +3 -3
  18. package/dist/module.mjs +222 -46
  19. package/dist/runtime/app/plugins/view/Main.vue +20 -28
  20. package/dist/runtime/app/plugins/view/Main.vue.d.ts +9 -0
  21. package/dist/runtime/app/plugins/view/Squiggle.vue +16 -20
  22. package/dist/runtime/app/plugins/view/Squiggle.vue.d.ts +7 -0
  23. package/dist/runtime/server/content-compat.d.ts +1 -0
  24. package/dist/runtime/server/content-compat.js +2 -0
  25. package/dist/runtime/server/providers/content-v3.d.ts +5 -1
  26. package/dist/runtime/server/providers/content-v3.js +2 -2
  27. package/dist/runtime/server/routes/__link-checker__/inspect.d.ts +1 -1
  28. package/dist/runtime/shared/crawl.d.ts +10 -6
  29. package/dist/runtime/shared/crawl.js +37 -10
  30. package/dist/runtime/shared/inspections/absolute-site-urls.d.ts +1 -1
  31. package/dist/runtime/shared/inspections/link-text.d.ts +1 -1
  32. package/dist/runtime/shared/inspections/missing-hash.d.ts +1 -1
  33. package/dist/runtime/shared/inspections/no-baseless.d.ts +1 -1
  34. package/dist/runtime/shared/inspections/no-double-slashes.d.ts +1 -1
  35. package/dist/runtime/shared/inspections/no-duplicate-query-params.d.ts +1 -1
  36. package/dist/runtime/shared/inspections/no-error-response.d.ts +1 -1
  37. package/dist/runtime/shared/inspections/no-error-response.js +1 -1
  38. package/dist/runtime/shared/inspections/no-javascript.d.ts +1 -1
  39. package/dist/runtime/shared/inspections/no-missing-href.d.ts +1 -1
  40. package/dist/runtime/shared/inspections/no-non-ascii-chars.d.ts +1 -1
  41. package/dist/runtime/shared/inspections/no-underscores.d.ts +1 -1
  42. package/dist/runtime/shared/inspections/no-uppercase-chars.d.ts +1 -1
  43. package/dist/runtime/shared/inspections/no-whitespace.d.ts +1 -1
  44. package/dist/runtime/shared/inspections/trailing-slash.d.ts +1 -1
  45. package/dist/runtime/shared/inspections/util.js +2 -1
  46. package/dist/runtime/shared/redirects.d.ts +1 -1
  47. package/dist/runtime/shared/redirects.js +1 -1
  48. package/dist/types.d.mts +4 -2
  49. package/package.json +39 -32
  50. package/dist/client/_nuxt/5p_Oaa9g.js +0 -181
  51. package/dist/client/_nuxt/B9GrqE__.js +0 -1
  52. package/dist/client/_nuxt/BGB1r09n.js +0 -1
  53. package/dist/client/_nuxt/BLmTiKMJ.js +0 -1
  54. package/dist/client/_nuxt/Cj6XDDRd.js +0 -1
  55. package/dist/client/_nuxt/DFxyEsuO.js +0 -1
  56. package/dist/client/_nuxt/builds/meta/cdbc357b-6180-4103-97aa-19c53e0b9c3c.json +0 -1
  57. package/dist/client/_nuxt/error-404.C6U-TOR-.css +0 -1
  58. package/dist/client/_nuxt/error-500.BAgFwF30.css +0 -1
  59. package/dist/module.cjs +0 -5
  60. package/dist/module.d.ts +0 -92
  61. package/dist/types.d.ts +0 -7
@@ -1,31 +1,48 @@
1
- import { $fetch } from "ofetch";
2
1
  import { isNonFetchableLink } from "./inspections/util.js";
3
2
  const responses = {};
3
+ const MockSuccessResponse = Promise.resolve({ status: 200, statusText: "OK", headers: {} });
4
4
  export async function getLinkResponse({ link, timeout, fetchRemoteUrls, baseURL, isInStorage }) {
5
5
  if (link.includes("#") && !link.startsWith("#"))
6
6
  link = link.split("#")[0];
7
7
  link = decodeURI(link);
8
- const response = responses[link];
9
- if (!response) {
10
- if (isNonFetchableLink(link) || link.startsWith("http") && !fetchRemoteUrls || isInStorage()) {
11
- responses[link] = Promise.resolve({ status: 200, statusText: "OK", headers: {} });
12
- } else {
13
- responses[link] = crawlFetch(link, { timeout, baseURL });
14
- }
8
+ if (link in responses) {
9
+ return responses[link];
10
+ }
11
+ if (isNonFetchableLink(link)) {
12
+ return null;
13
+ }
14
+ if (isInStorage()) {
15
+ responses[link] = Promise.resolve({ status: 200, statusText: "OK", headers: { "X-Nuxt-Prerendered": true } });
16
+ return responses[link];
17
+ }
18
+ if (link.startsWith("http") || link.startsWith("//")) {
19
+ responses[link] = fetchRemoteUrls ? crawlFetch(link, { timeout, baseURL }) : MockSuccessResponse;
20
+ return responses[link];
15
21
  }
22
+ responses[link] = crawlFetch(link, { timeout, baseURL });
16
23
  return responses[link];
17
24
  }
18
25
  export function setLinkResponse(link, response) {
19
26
  responses[link] = response;
20
27
  }
28
+ export async function getResolvedLinkResponses() {
29
+ const data = {};
30
+ for (const link in responses) {
31
+ data[link] = await responses[link];
32
+ }
33
+ return data;
34
+ }
21
35
  export async function crawlFetch(link, options = {}) {
22
36
  const timeout = options.timeout || 5e3;
23
37
  const timeoutController = new AbortController();
24
38
  const abortRequestTimeout = setTimeout(() => timeoutController.abort(), timeout);
25
- return await $fetch.raw(encodeURI(link), {
39
+ const start = Date.now();
40
+ return await globalThis.$fetch.raw(encodeURI(link), {
26
41
  baseURL: options.baseURL,
27
42
  method: "HEAD",
28
43
  signal: timeoutController.signal,
44
+ retry: 3,
45
+ retryDelay: 250,
29
46
  headers: {
30
47
  "user-agent": "Nuxt Link Checker"
31
48
  }
@@ -33,5 +50,15 @@ export async function crawlFetch(link, options = {}) {
33
50
  if (error.name === "AbortError")
34
51
  return { status: 408, statusText: "Request Timeout", headers: {} };
35
52
  return { status: 404, statusText: "Not Found", headers: {} };
36
- }).finally(() => clearTimeout(abortRequestTimeout)).then((res) => ({ status: res.status, statusText: res.statusText, headers: res.headers }));
53
+ }).finally(() => clearTimeout(abortRequestTimeout)).then((res) => {
54
+ let headersObj = {};
55
+ if (res.headers) {
56
+ if (typeof res.headers.entries === "function") {
57
+ headersObj = Object.fromEntries(Array.from(res.headers.entries()));
58
+ } else if (typeof res.headers === "object") {
59
+ headersObj = { ...res.headers };
60
+ }
61
+ }
62
+ return { status: res.status, statusText: res.statusText, headers: headersObj, time: Date.now() - start };
63
+ });
37
64
  }
@@ -1 +1 @@
1
- export default function RuleAbsoluteSiteUrls(): import("../../types").Rule;
1
+ export default function RuleAbsoluteSiteUrls(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleDescriptiveLinkText(): import("../../types").Rule;
1
+ export default function RuleDescriptiveLinkText(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleMissingHash(): import("../../types").Rule;
1
+ export default function RuleMissingHash(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoDocumentRelative(): import("../../types").Rule;
1
+ export default function RuleNoDocumentRelative(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoDoubleSlashes(): import("../../types").Rule;
1
+ export default function RuleNoDoubleSlashes(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoDuplicateQueryParams(): import("../../types").Rule;
1
+ export default function RuleNoDuplicateQueryParams(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoErrorResponse(): import("../../types").Rule;
1
+ export default function RuleNoErrorResponse(): import("../../types.js").Rule;
@@ -4,7 +4,7 @@ export default function RuleNoErrorResponse() {
4
4
  id: "no-error-response",
5
5
  externalLinks: true,
6
6
  test({ link, response, report, pageSearch }) {
7
- if (!response.status || response.status.toString().startsWith("2") || response.status.toString().startsWith("3") || isNonFetchableLink(link))
7
+ if (!response?.status || response.status.toString().startsWith("2") || response.status.toString().startsWith("3") || isNonFetchableLink(link))
8
8
  return;
9
9
  const payload = {
10
10
  name: "no-error-response",
@@ -1 +1 @@
1
- export default function RuleNoJavascript(): import("../../types").Rule;
1
+ export default function RuleNoJavascript(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoMissingHref(): import("../../types").Rule;
1
+ export default function RuleNoMissingHref(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoNonAsciiChars(): import("../../types").Rule;
1
+ export default function RuleNoNonAsciiChars(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoUnderscores(): import("../../types").Rule;
1
+ export default function RuleNoUnderscores(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoUppercaseChars(): import("../../types").Rule;
1
+ export default function RuleNoUppercaseChars(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleNoWhitespace(): import("../../types").Rule;
1
+ export default function RuleNoWhitespace(): import("../../types.js").Rule;
@@ -1 +1 @@
1
- export default function RuleTrailingSlash(): import("../../types").Rule;
1
+ export default function RuleTrailingSlash(): import("../../types.js").Rule;
@@ -2,5 +2,6 @@ export function defineRule(rule) {
2
2
  return rule;
3
3
  }
4
4
  export function isNonFetchableLink(link) {
5
- return link.startsWith("javascript:") || link.startsWith("blob:") || link.startsWith("data:") || link.startsWith("mailto:") || link.startsWith("tel:") || link.startsWith("#");
5
+ const trimmedLink = link.trim().toLowerCase();
6
+ return trimmedLink.startsWith("javascript:") || trimmedLink.startsWith("blob:") || trimmedLink.startsWith("data:") || trimmedLink.startsWith("mailto:") || trimmedLink.startsWith("tel:") || trimmedLink.startsWith("vbscript:") || trimmedLink.startsWith("#");
6
7
  }
@@ -1 +1 @@
1
- export default function RuleRedirects(): import("../types").Rule;
1
+ export default function RuleRedirects(): import("../types.js").Rule;
@@ -3,7 +3,7 @@ export default function RuleRedirects() {
3
3
  return defineRule({
4
4
  id: "redirects",
5
5
  test({ report, response }) {
6
- if (response.status !== 301 && response.status !== 302)
6
+ if (response?.status !== 301 && response?.status !== 302)
7
7
  return;
8
8
  const payload = {
9
9
  name: "redirects",
package/dist/types.d.mts CHANGED
@@ -1,7 +1,9 @@
1
- import type { ModuleHooks } from './module.js'
1
+ import type { ModuleHooks } from './module.mjs'
2
2
 
3
3
  declare module '@nuxt/schema' {
4
4
  interface NuxtHooks extends ModuleHooks {}
5
5
  }
6
6
 
7
- export { type ModuleHooks, type ModuleOptions, default } from './module.js'
7
+ export { default } from './module.mjs'
8
+
9
+ export { type ModuleHooks, type ModuleOptions } from './module.mjs'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-link-checker",
3
3
  "type": "module",
4
- "version": "4.2.0",
4
+ "version": "4.3.1",
5
5
  "description": "Find and magically fix links that may be negatively effecting your Nuxt sites SEO.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -20,59 +20,66 @@
20
20
  },
21
21
  "exports": {
22
22
  ".": {
23
- "types": "./dist/types.d.ts",
24
- "import": "./dist/module.mjs",
25
- "require": "./dist/module.cjs"
23
+ "types": "./dist/types.d.mts",
24
+ "import": "./dist/module.mjs"
26
25
  }
27
26
  },
28
27
  "build": {
29
28
  "externals": [
30
- "ofetch",
31
- "std-env",
32
- "unstorage",
33
29
  "unstorage/drivers/fs"
34
30
  ]
35
31
  },
36
- "main": "./dist/module.cjs",
37
- "types": "./dist/types.d.ts",
32
+ "main": "./dist/module.mjs",
33
+ "types": "./dist/types.d.mts",
34
+ "typesVersions": {
35
+ "*": {
36
+ ".": [
37
+ "./dist/types.d.mts"
38
+ ]
39
+ }
40
+ },
38
41
  "files": [
39
42
  "dist"
40
43
  ],
41
44
  "dependencies": {
42
- "@nuxt/devtools-kit": "^2.3.0",
43
- "@nuxt/kit": "^3.16.0",
44
- "@vueuse/core": "^13.0.0",
45
- "consola": "^3.4.0",
46
- "diff": "^7.0.0",
45
+ "@nuxt/devtools-kit": "^2.5.0",
46
+ "@nuxt/kit": "^3.17.5",
47
+ "@vueuse/core": "^13.3.0",
48
+ "consola": "^3.4.2",
49
+ "diff": "^8.0.2",
47
50
  "fuse.js": "^7.1.0",
48
51
  "magic-string": "^0.30.17",
49
- "nuxt-site-config": "^3.1.5",
52
+ "nuxt-site-config": "^3.2.0",
53
+ "ofetch": "^1.4.1",
50
54
  "pathe": "^2.0.3",
51
55
  "pkg-types": "^2.1.0",
52
56
  "radix3": "^1.1.2",
53
57
  "sirv": "^3.0.1",
54
- "ufo": "^1.5.4",
55
- "ultrahtml": "^1.5.3"
58
+ "std-env": "^3.9.0",
59
+ "ufo": "^1.6.1",
60
+ "ultrahtml": "^1.6.0",
61
+ "unstorage": "^1.16.0"
56
62
  },
57
63
  "devDependencies": {
58
- "@antfu/eslint-config": "^4.10.1",
59
- "@nuxt/content": "3.3.0",
60
- "@nuxt/devtools": "^2.3.0",
61
- "@nuxt/module-builder": "^0.8.4",
62
- "@nuxt/test-utils": "^3.17.2",
64
+ "@antfu/eslint-config": "^4.14.1",
65
+ "@nuxt/content": "^3.6.0",
66
+ "@nuxt/devtools": "^2.5.0",
67
+ "@nuxt/module-builder": "^1.0.1",
68
+ "@nuxt/test-utils": "^3.19.1",
63
69
  "@nuxtjs/eslint-config-typescript": "^12.1.0",
64
- "@nuxtjs/sitemap": "^7.2.9",
65
- "@types/diff": "^7.0.1",
66
- "bumpp": "^10.1.0",
67
- "eslint": "^9.22.0",
68
- "execa": "^9.5.2",
69
- "nuxt": "^3.16.0",
70
- "typescript": "5.8.2",
71
- "vitest": "^3.0.8"
70
+ "@nuxtjs/sitemap": "^7.4.0",
71
+ "@types/diff": "^8.0.0",
72
+ "better-sqlite3": "^11.10.0",
73
+ "bumpp": "^10.1.1",
74
+ "eslint": "^9.29.0",
75
+ "execa": "^9.6.0",
76
+ "nuxt": "^3.17.5",
77
+ "typescript": "5.8.3",
78
+ "vitest": "^3.2.3",
79
+ "vue-tsc": "^2.2.10"
72
80
  },
73
81
  "resolutions": {
74
- "nuxt-link-checker": "workspace:*",
75
- "typescript": "5.6.3"
82
+ "nuxt-link-checker": "workspace:*"
76
83
  },
77
84
  "scripts": {
78
85
  "build": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxt-module-build build && npm run client:build",