nfunc-mcp 0.3.0 → 0.5.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.
Files changed (69) hide show
  1. package/README.md +121 -379
  2. package/dist/index.js +4 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/mappers/a11yDedupe.js +38 -7
  5. package/dist/mappers/a11yDedupe.js.map +1 -1
  6. package/dist/mappers/defectFormatter.d.ts +9 -1
  7. package/dist/mappers/defectFormatter.js +53 -13
  8. package/dist/mappers/defectFormatter.js.map +1 -1
  9. package/dist/mappers/labFieldComparator.d.ts +62 -0
  10. package/dist/mappers/labFieldComparator.js +134 -0
  11. package/dist/mappers/labFieldComparator.js.map +1 -0
  12. package/dist/mappers/priorityMapper.d.ts +42 -0
  13. package/dist/mappers/priorityMapper.js +58 -0
  14. package/dist/mappers/priorityMapper.js.map +1 -1
  15. package/dist/mappers/psiAggregator.d.ts +130 -0
  16. package/dist/mappers/psiAggregator.js +293 -0
  17. package/dist/mappers/psiAggregator.js.map +1 -0
  18. package/dist/mappers/runComparator.d.ts +85 -0
  19. package/dist/mappers/runComparator.js +165 -0
  20. package/dist/mappers/runComparator.js.map +1 -0
  21. package/dist/mappers/wcagLevels.d.ts +73 -0
  22. package/dist/mappers/wcagLevels.js +320 -0
  23. package/dist/mappers/wcagLevels.js.map +1 -0
  24. package/dist/mappers/webVitalsMapper.d.ts +52 -0
  25. package/dist/mappers/webVitalsMapper.js +131 -0
  26. package/dist/mappers/webVitalsMapper.js.map +1 -0
  27. package/dist/tools/accessibility.d.ts +1 -0
  28. package/dist/tools/accessibility.js +488 -63
  29. package/dist/tools/accessibility.js.map +1 -1
  30. package/dist/tools/lighthouse.js +370 -102
  31. package/dist/tools/lighthouse.js.map +1 -1
  32. package/dist/tools/performanceAudit.d.ts +2 -0
  33. package/dist/tools/performanceAudit.js +446 -0
  34. package/dist/tools/performanceAudit.js.map +1 -0
  35. package/dist/tools/performanceAuditPlan.d.ts +2 -0
  36. package/dist/tools/performanceAuditPlan.js +438 -0
  37. package/dist/tools/performanceAuditPlan.js.map +1 -0
  38. package/dist/utils/batchState.d.ts +75 -0
  39. package/dist/utils/batchState.js +128 -0
  40. package/dist/utils/batchState.js.map +1 -0
  41. package/dist/utils/csvReader.d.ts +20 -0
  42. package/dist/utils/csvReader.js +172 -0
  43. package/dist/utils/csvReader.js.map +1 -0
  44. package/dist/utils/httpClient.d.ts +84 -0
  45. package/dist/utils/httpClient.js +171 -0
  46. package/dist/utils/httpClient.js.map +1 -0
  47. package/dist/utils/outputParsers.js +26 -30
  48. package/dist/utils/outputParsers.js.map +1 -1
  49. package/dist/utils/psiAuth.d.ts +26 -0
  50. package/dist/utils/psiAuth.js +36 -0
  51. package/dist/utils/psiAuth.js.map +1 -0
  52. package/dist/utils/psiParser.d.ts +135 -0
  53. package/dist/utils/psiParser.js +200 -0
  54. package/dist/utils/psiParser.js.map +1 -0
  55. package/dist/utils/publicUrl.d.ts +17 -0
  56. package/dist/utils/publicUrl.js +115 -0
  57. package/dist/utils/publicUrl.js.map +1 -0
  58. package/dist/utils/sitemapReader.d.ts +27 -0
  59. package/dist/utils/sitemapReader.js +272 -0
  60. package/dist/utils/sitemapReader.js.map +1 -0
  61. package/dist/utils/urlClassifier.d.ts +45 -0
  62. package/dist/utils/urlClassifier.js +267 -0
  63. package/dist/utils/urlClassifier.js.map +1 -0
  64. package/dist/utils/urlInput.d.ts +30 -0
  65. package/dist/utils/urlInput.js +130 -0
  66. package/dist/utils/urlInput.js.map +1 -0
  67. package/docs/manual.md +769 -0
  68. package/docs/psi-report-spec.md +174 -0
  69. package/package.json +13 -3
@@ -0,0 +1,130 @@
1
+ /**
2
+ * One input, three shapes.
3
+ *
4
+ * People arrive with a URL, a list they pasted from a spreadsheet, or a CSV
5
+ * export. Making them say which is which is a tax on the common case, and an
6
+ * agent relaying a user's request should not have to guess a parameter name.
7
+ * So the `url` input accepts any of the three and this module works out what it
8
+ * was given.
9
+ *
10
+ * Detection is by shape, not by a flag, and deliberately conservative: anything
11
+ * ambiguous is reported rather than guessed at, because silently auditing the
12
+ * wrong set of pages is worse than an error.
13
+ */
14
+ import { existsSync } from "node:fs";
15
+ import { readUrlsFromCsv } from "./csvReader.js";
16
+ const LOOKS_LIKE_URL = /^https?:\/\//i;
17
+ function normalise(raw) {
18
+ const trimmed = raw.trim().replace(/^['"]|['"]$/g, "");
19
+ if (!trimmed)
20
+ return null;
21
+ // A bare domain is what people actually paste; assume https rather than
22
+ // rejecting it, and say so in a warning.
23
+ const candidate = LOOKS_LIKE_URL.test(trimmed) ? trimmed : `https://${trimmed}`;
24
+ try {
25
+ return new URL(candidate).toString();
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ function looksLikeCsvPath(value) {
32
+ const trimmed = value.trim();
33
+ if (LOOKS_LIKE_URL.test(trimmed))
34
+ return false;
35
+ if (trimmed.includes(","))
36
+ return false; // a list, not a path
37
+ return /\.(csv|tsv|txt)$/i.test(trimmed) || existsSync(trimmed);
38
+ }
39
+ /**
40
+ * Resolve whatever was handed in into a URL list.
41
+ *
42
+ * Order matters: the CSV check runs first because a path can contain no commas
43
+ * and no scheme, which would otherwise be coerced into `https://./file.csv`.
44
+ */
45
+ export function resolveUrlInput(input) {
46
+ const warnings = [];
47
+ const raw = input.trim();
48
+ if (!raw)
49
+ throw new Error("No URL, list, or CSV path was provided.");
50
+ if (looksLikeCsvPath(raw)) {
51
+ if (!existsSync(raw)) {
52
+ throw new Error(`"${raw}" looks like a file path but does not exist. Pass a URL, a ` +
53
+ `comma-separated list of URLs, or the path to a readable CSV.`);
54
+ }
55
+ const csv = readUrlsFromCsv(raw);
56
+ warnings.push(...csv.warnings);
57
+ if (csv.urls.length === 0) {
58
+ throw new Error(`No usable URLs found in ${raw}.`);
59
+ }
60
+ return {
61
+ urls: csv.urls,
62
+ kind: "csv",
63
+ source: `${raw} (column "${csv.column}")`,
64
+ warnings,
65
+ };
66
+ }
67
+ // Split on commas and newlines — pasted lists arrive both ways, and a
68
+ // multi-line paste is the same intent as a comma-separated one.
69
+ const parts = raw
70
+ .split(/[,\n]/)
71
+ .map((p) => p.trim())
72
+ .filter(Boolean);
73
+ const urls = [];
74
+ const rejected = [];
75
+ const seen = new Set();
76
+ let coerced = 0;
77
+ for (const part of parts) {
78
+ const url = normalise(part);
79
+ if (!url) {
80
+ rejected.push(part);
81
+ continue;
82
+ }
83
+ if (!LOOKS_LIKE_URL.test(part.trim()))
84
+ coerced++;
85
+ if (seen.has(url))
86
+ continue;
87
+ seen.add(url);
88
+ urls.push(url);
89
+ }
90
+ if (urls.length === 0) {
91
+ throw new Error(`Could not read any URL from "${raw.slice(0, 120)}". Pass a URL, a ` +
92
+ `comma-separated list, or a path to a CSV.`);
93
+ }
94
+ if (rejected.length > 0) {
95
+ warnings.push(`Ignored ${rejected.length} unparseable entr${rejected.length === 1 ? "y" : "ies"}: ${rejected.slice(0, 3).join(", ")}`);
96
+ }
97
+ if (coerced > 0) {
98
+ warnings.push(`Assumed https:// for ${coerced} entr${coerced === 1 ? "y" : "ies"} that had no scheme.`);
99
+ }
100
+ if (parts.length > urls.length + rejected.length) {
101
+ warnings.push(`Removed ${parts.length - urls.length - rejected.length} duplicate URL(s).`);
102
+ }
103
+ return { urls, kind: urls.length === 1 ? "single" : "list", warnings };
104
+ }
105
+ /** Accept an explicit array too, for callers that already have one. */
106
+ export function resolveUrlInputs(input, urls) {
107
+ if (urls && urls.length > 0) {
108
+ const resolved = [];
109
+ const seen = new Set();
110
+ const warnings = [];
111
+ for (const raw of urls) {
112
+ const url = normalise(raw);
113
+ if (!url) {
114
+ warnings.push(`Ignored unparseable URL "${raw}".`);
115
+ continue;
116
+ }
117
+ if (seen.has(url))
118
+ continue;
119
+ seen.add(url);
120
+ resolved.push(url);
121
+ }
122
+ if (resolved.length === 0)
123
+ throw new Error("None of the supplied urls were parseable.");
124
+ return { urls: resolved, kind: resolved.length === 1 ? "single" : "list", warnings };
125
+ }
126
+ if (!input)
127
+ throw new Error("Provide `url` (a URL, comma-separated list, or CSV path) or `urls`.");
128
+ return resolveUrlInput(input);
129
+ }
130
+ //# sourceMappingURL=urlInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlInput.js","sourceRoot":"","sources":["../../src/utils/urlInput.ts"],"names":[],"mappings":"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"}