@pseolint/core 0.1.0 → 0.2.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 (116) hide show
  1. package/dist/ai/adapters/index.d.ts +53 -0
  2. package/dist/ai/adapters/index.d.ts.map +1 -0
  3. package/dist/ai/adapters/index.js +158 -0
  4. package/dist/ai/adapters/index.js.map +1 -0
  5. package/dist/ai/cache.d.ts +11 -0
  6. package/dist/ai/cache.d.ts.map +1 -0
  7. package/dist/ai/cache.js +40 -0
  8. package/dist/ai/cache.js.map +1 -0
  9. package/dist/ai/cost.d.ts +3 -0
  10. package/dist/ai/cost.d.ts.map +1 -0
  11. package/dist/ai/cost.js +22 -0
  12. package/dist/ai/cost.js.map +1 -0
  13. package/dist/ai/feedback-prompt.d.ts +22 -0
  14. package/dist/ai/feedback-prompt.d.ts.map +1 -0
  15. package/dist/ai/feedback-prompt.js +39 -0
  16. package/dist/ai/feedback-prompt.js.map +1 -0
  17. package/dist/ai/prompt.d.ts +10 -0
  18. package/dist/ai/prompt.d.ts.map +1 -0
  19. package/dist/ai/prompt.js +51 -0
  20. package/dist/ai/prompt.js.map +1 -0
  21. package/dist/ai/triage.d.ts +28 -0
  22. package/dist/ai/triage.d.ts.map +1 -0
  23. package/dist/ai/triage.js +136 -0
  24. package/dist/ai/triage.js.map +1 -0
  25. package/dist/ai/types.d.ts +27 -0
  26. package/dist/ai/types.d.ts.map +1 -0
  27. package/dist/ai/types.js +2 -0
  28. package/dist/ai/types.js.map +1 -0
  29. package/dist/auditor.d.ts.map +1 -1
  30. package/dist/auditor.js +399 -83
  31. package/dist/auditor.js.map +1 -1
  32. package/dist/cache.d.ts +44 -0
  33. package/dist/cache.d.ts.map +1 -0
  34. package/dist/cache.js +182 -0
  35. package/dist/cache.js.map +1 -0
  36. package/dist/data-source-loader.d.ts +14 -0
  37. package/dist/data-source-loader.d.ts.map +1 -0
  38. package/dist/data-source-loader.js +76 -0
  39. package/dist/data-source-loader.js.map +1 -0
  40. package/dist/enrich-findings.d.ts.map +1 -1
  41. package/dist/enrich-findings.js +4 -0
  42. package/dist/enrich-findings.js.map +1 -1
  43. package/dist/formatters/console.d.ts.map +1 -1
  44. package/dist/formatters/console.js +30 -0
  45. package/dist/formatters/console.js.map +1 -1
  46. package/dist/formatters/html.d.ts.map +1 -1
  47. package/dist/formatters/html.js +92 -70
  48. package/dist/formatters/html.js.map +1 -1
  49. package/dist/formatters/markdown.d.ts.map +1 -1
  50. package/dist/formatters/markdown.js +29 -0
  51. package/dist/formatters/markdown.js.map +1 -1
  52. package/dist/index.d.ts +20 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +11 -0
  55. package/dist/index.js.map +1 -1
  56. package/dist/rule-references.d.ts.map +1 -1
  57. package/dist/rule-references.js +3 -0
  58. package/dist/rule-references.js.map +1 -1
  59. package/dist/rules/data/data-binding.d.ts +4 -0
  60. package/dist/rules/data/data-binding.d.ts.map +1 -0
  61. package/dist/rules/data/data-binding.js +107 -0
  62. package/dist/rules/data/data-binding.js.map +1 -0
  63. package/dist/rules/tech/robots-sitemap-presence.d.ts +2 -1
  64. package/dist/rules/tech/robots-sitemap-presence.d.ts.map +1 -1
  65. package/dist/rules/tech/robots-sitemap-presence.js +101 -0
  66. package/dist/rules/tech/robots-sitemap-presence.js.map +1 -1
  67. package/dist/rules/tech/sitemap-completeness.d.ts.map +1 -1
  68. package/dist/rules/tech/sitemap-completeness.js +15 -0
  69. package/dist/rules/tech/sitemap-completeness.js.map +1 -1
  70. package/dist/state.d.ts +35 -0
  71. package/dist/state.d.ts.map +1 -0
  72. package/dist/state.js +64 -0
  73. package/dist/state.js.map +1 -0
  74. package/dist/stratified-sample.d.ts +3 -0
  75. package/dist/stratified-sample.d.ts.map +1 -0
  76. package/dist/stratified-sample.js +88 -0
  77. package/dist/stratified-sample.js.map +1 -0
  78. package/dist/telemetry/aggregator.d.ts +47 -0
  79. package/dist/telemetry/aggregator.d.ts.map +1 -0
  80. package/dist/telemetry/aggregator.js +77 -0
  81. package/dist/telemetry/aggregator.js.map +1 -0
  82. package/dist/telemetry/index.d.ts +5 -0
  83. package/dist/telemetry/index.d.ts.map +1 -0
  84. package/dist/telemetry/index.js +5 -0
  85. package/dist/telemetry/index.js.map +1 -0
  86. package/dist/telemetry/reader.d.ts +12 -0
  87. package/dist/telemetry/reader.d.ts.map +1 -0
  88. package/dist/telemetry/reader.js +35 -0
  89. package/dist/telemetry/reader.js.map +1 -0
  90. package/dist/telemetry/types.d.ts +126 -0
  91. package/dist/telemetry/types.d.ts.map +1 -0
  92. package/dist/telemetry/types.js +75 -0
  93. package/dist/telemetry/types.js.map +1 -0
  94. package/dist/telemetry/writer.d.ts +12 -0
  95. package/dist/telemetry/writer.d.ts.map +1 -0
  96. package/dist/telemetry/writer.js +38 -0
  97. package/dist/telemetry/writer.js.map +1 -0
  98. package/dist/types.d.ts +96 -0
  99. package/dist/types.d.ts.map +1 -1
  100. package/package.json +26 -6
  101. package/dist/algorithms/entity-mask.test.d.ts +0 -2
  102. package/dist/algorithms/entity-mask.test.d.ts.map +0 -1
  103. package/dist/algorithms/entity-mask.test.js +0 -23
  104. package/dist/algorithms/entity-mask.test.js.map +0 -1
  105. package/dist/algorithms/simhash.test.d.ts +0 -2
  106. package/dist/algorithms/simhash.test.d.ts.map +0 -1
  107. package/dist/algorithms/simhash.test.js +0 -23
  108. package/dist/algorithms/simhash.test.js.map +0 -1
  109. package/dist/auditor.test.d.ts +0 -2
  110. package/dist/auditor.test.d.ts.map +0 -1
  111. package/dist/auditor.test.js +0 -134
  112. package/dist/auditor.test.js.map +0 -1
  113. package/dist/parser.test.d.ts +0 -2
  114. package/dist/parser.test.d.ts.map +0 -1
  115. package/dist/parser.test.js +0 -37
  116. package/dist/parser.test.js.map +0 -1
@@ -1,134 +0,0 @@
1
- import { mkdtemp, rm, writeFile } from "node:fs/promises";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterEach, describe, expect, test } from "vitest";
5
- import { auditSource } from "./auditor.js";
6
- const tempDirs = [];
7
- afterEach(async () => {
8
- await Promise.all(tempDirs.map((dir) => rm(dir, { recursive: true, force: true })));
9
- tempDirs.length = 0;
10
- globalThis.fetch = originalFetch;
11
- });
12
- const originalFetch = globalThis.fetch;
13
- describe("auditSource", () => {
14
- test("audits an html directory and emits relationship findings", async () => {
15
- const dir = await mkdtemp(join(tmpdir(), "pseolint-audit-"));
16
- tempDirs.push(dir);
17
- const sharedLongContent = Array.from({ length: 70 }, () => "Step choose name file articles appoint agent submit report").join(" ");
18
- const pageA = `
19
- <html><body>
20
- <h1>California LLC Template</h1>
21
- <p>${sharedLongContent} California LLC filing guide with annual fee details.</p>
22
- </body></html>
23
- `;
24
- const pageB = `
25
- <html><body>
26
- <h1>Nevada LLC Template</h1>
27
- <p>${sharedLongContent} Nevada LLC filing guide with annual fee details.</p>
28
- </body></html>
29
- `;
30
- const pageThin = `<html><body><h1>Thin page</h1><p>tiny content only</p></body></html>`;
31
- await writeFile(join(dir, "california-llc.html"), pageA, "utf-8");
32
- await writeFile(join(dir, "nevada-llc.html"), pageB, "utf-8");
33
- await writeFile(join(dir, "thin.html"), pageThin, "utf-8");
34
- const summary = await auditSource(dir, {
35
- rules: { templateDiversityMinUniqueRatio: 0.8, boilerplateMaxRatio: 0.4 }
36
- });
37
- expect(summary.pageCount).toBe(3);
38
- expect(summary.findings.some((f) => f.ruleId === "spam/near-duplicate")).toBe(true);
39
- expect(summary.findings.some((f) => f.ruleId === "spam/entity-swap")).toBe(true);
40
- expect(summary.findings.some((f) => f.ruleId === "spam/thin-content")).toBe(true);
41
- expect(summary.findings.some((f) => f.ruleId === "spam/boilerplate-ratio")).toBe(true);
42
- expect(summary.findings.some((f) => f.ruleId === "spam/template-diversity")).toBe(true);
43
- expect(summary.score).toBeGreaterThan(0);
44
- });
45
- test("throws a clear error when source path does not exist", async () => {
46
- await expect(auditSource("D:/path/that/does/not/exist")).rejects.toThrow("Unable to access source");
47
- });
48
- test("expands sitemap urls and audits referenced pages", async () => {
49
- const pages = {
50
- "https://example.dev/page-a": `<html><body><h1>Page A</h1><p>${"alpha ".repeat(350)}</p></body></html>`,
51
- "https://example.dev/page-b": `<html><body><h1>Page B</h1><p>${"beta ".repeat(350)}</p></body></html>`
52
- };
53
- const sitemap = `<?xml version="1.0" encoding="UTF-8"?>
54
- <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
55
- <url><loc>https://example.dev/page-a</loc></url>
56
- <url><loc>https://example.dev/page-b</loc></url>
57
- </urlset>`;
58
- globalThis.fetch = (async (input) => {
59
- const url = typeof input === "string" ? input : input.toString();
60
- if (url === "https://example.dev/sitemap.xml") {
61
- return new Response(sitemap, { status: 200, headers: { "content-type": "application/xml" } });
62
- }
63
- const body = pages[url];
64
- if (!body) {
65
- return new Response("Not found", { status: 404 });
66
- }
67
- return new Response(body, { status: 200, headers: { "content-type": "text/html" } });
68
- });
69
- const summary = await auditSource("https://example.dev/sitemap.xml", {
70
- rules: { publicationVelocityMaxPerDay: 1 }
71
- });
72
- expect(summary.pageCount).toBe(2);
73
- expect(summary.findings.some((f) => f.ruleId === "spam/publication-velocity")).toBe(false);
74
- });
75
- test("throws a clear error for invalid non-html URL responses", async () => {
76
- globalThis.fetch = (async () => {
77
- return new Response('{"ok":true}', {
78
- status: 200,
79
- headers: { "content-type": "application/json" }
80
- });
81
- });
82
- await expect(auditSource("https://example.dev/data.json")).rejects.toThrow("does not look like HTML or sitemap XML");
83
- });
84
- test("flags publication velocity spikes from shared publish dates", async () => {
85
- const dir = await mkdtemp(join(tmpdir(), "pseolint-velocity-"));
86
- tempDirs.push(dir);
87
- const html = (title) => `
88
- <html>
89
- <head><meta property="article:published_time" content="2026-04-13" /></head>
90
- <body><h1>${title}</h1><p>${"gamma ".repeat(330)}</p></body>
91
- </html>`;
92
- await writeFile(join(dir, "a.html"), html("A"), "utf-8");
93
- await writeFile(join(dir, "b.html"), html("B"), "utf-8");
94
- await writeFile(join(dir, "c.html"), html("C"), "utf-8");
95
- const summary = await auditSource(dir, { rules: { publicationVelocityMaxPerDay: 2 } });
96
- expect(summary.findings.some((f) => f.ruleId === "spam/publication-velocity")).toBe(true);
97
- });
98
- test("flags content uniqueness, headings, and meta collisions", async () => {
99
- const dir = await mkdtemp(join(tmpdir(), "pseolint-content-"));
100
- tempDirs.push(dir);
101
- const duplicateMeta = "Generate your state LLC template quickly.";
102
- const pageA = `
103
- <html>
104
- <head>
105
- <title>California LLC Template</title>
106
- <meta name="description" content="${duplicateMeta}" />
107
- </head>
108
- <body>
109
- <h1>State LLC Template</h1>
110
- <h2>How It Works</h2>
111
- <p>${"shared flow ".repeat(350)}</p>
112
- </body>
113
- </html>`;
114
- const pageB = `
115
- <html>
116
- <head>
117
- <title>Nevada LLC Template</title>
118
- <meta name="description" content="${duplicateMeta}" />
119
- </head>
120
- <body>
121
- <h1>State LLC Template</h1>
122
- <h2>How It Works</h2>
123
- <p>${"shared flow ".repeat(350)}</p>
124
- </body>
125
- </html>`;
126
- await writeFile(join(dir, "ca.html"), pageA, "utf-8");
127
- await writeFile(join(dir, "nv.html"), pageB, "utf-8");
128
- const summary = await auditSource(dir);
129
- expect(summary.findings.some((f) => f.ruleId === "content/unique-value")).toBe(true);
130
- expect(summary.findings.some((f) => f.ruleId === "content/heading-uniqueness")).toBe(true);
131
- expect(summary.findings.some((f) => f.ruleId === "content/meta-uniqueness")).toBe(true);
132
- });
133
- });
134
- //# sourceMappingURL=auditor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auditor.test.js","sourceRoot":"","sources":["../src/auditor.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=parser.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../src/parser.test.ts"],"names":[],"mappings":""}
@@ -1,37 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { parseHtmlPage } from "./parser.js";
3
- describe("parseHtmlPage", () => {
4
- test("extracts title, metadata, headings, and cleaned content text", () => {
5
- const html = `
6
- <html>
7
- <head>
8
- <title>California LLC Template</title>
9
- <meta name="description" content="A practical filing guide." />
10
- <link rel="canonical" href="https://example.dev/templates/california-llc" />
11
- <meta property="article:published_time" content="2026-04-01" />
12
- </head>
13
- <body>
14
- <header>Global nav should be removed</header>
15
- <main>
16
- <h1>California LLC Template</h1>
17
- <h2>Filing Requirements</h2>
18
- <p>California has a publication rule in some counties.</p>
19
- </main>
20
- <footer>Footer should be removed</footer>
21
- </body>
22
- </html>
23
- `;
24
- const parsed = parseHtmlPage(html, "https://example.dev/templates/california-llc");
25
- expect(parsed.url).toBe("https://example.dev/templates/california-llc");
26
- expect(parsed.title).toBe("California LLC Template");
27
- expect(parsed.metaDescription).toBe("A practical filing guide.");
28
- expect(parsed.canonical).toBe("https://example.dev/templates/california-llc");
29
- expect(parsed.publishedDate).toBe("2026-04-01");
30
- expect(parsed.headings.h1).toEqual(["California LLC Template"]);
31
- expect(parsed.headings.h2).toEqual(["Filing Requirements"]);
32
- expect(parsed.structureSignature).toContain("h1:1");
33
- expect(parsed.contentText).toContain("California has a publication rule");
34
- expect(parsed.contentText).not.toContain("Global nav should be removed");
35
- });
36
- });
37
- //# sourceMappingURL=parser.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../src/parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACxE,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;KAkBZ,CAAC;QAEF,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,8CAA8C,CAAC,CAAC;QAEnF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}