@drowlink/aeo-linter-core 0.1.0 → 0.1.3
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/README.md +72 -0
- package/dist/__tests__/audit-contract.test.js +12 -13
- package/dist/__tests__/audit-contract.test.js.map +1 -1
- package/dist/__tests__/gatherers.test.js +11 -12
- package/dist/__tests__/gatherers.test.js.map +1 -1
- package/dist/__tests__/runner.test.js +12 -12
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/audits/ai-accessibility/ai-bot-sitemap.d.ts +1 -1
- package/dist/audits/ai-accessibility/ai-bot-sitemap.js +6 -6
- package/dist/audits/ai-accessibility/ai-bot-sitemap.js.map +1 -1
- package/dist/audits/ai-accessibility/ai-robots-txt.d.ts +1 -1
- package/dist/audits/ai-accessibility/ai-robots-txt.d.ts.map +1 -1
- package/dist/audits/ai-accessibility/ai-robots-txt.js +11 -12
- package/dist/audits/ai-accessibility/ai-robots-txt.js.map +1 -1
- package/dist/audits/ai-accessibility/ai-x-robots-tag.d.ts +1 -1
- package/dist/audits/ai-accessibility/ai-x-robots-tag.js +8 -8
- package/dist/audits/ai-accessibility/ai-x-robots-tag.js.map +1 -1
- package/dist/audits/audit.d.ts +13 -13
- package/dist/audits/audit.js +14 -14
- package/dist/audits/audit.js.map +1 -1
- package/dist/audits/content-chunking/chunk-token-density.d.ts +1 -1
- package/dist/audits/content-chunking/chunk-token-density.js +12 -12
- package/dist/audits/content-chunking/chunk-token-density.js.map +1 -1
- package/dist/audits/content-chunking/heading-hierarchy.d.ts +1 -1
- package/dist/audits/content-chunking/heading-hierarchy.js +13 -13
- package/dist/audits/content-chunking/heading-hierarchy.js.map +1 -1
- package/dist/audits/content-chunking/semantic-containers.d.ts +1 -1
- package/dist/audits/content-chunking/semantic-containers.js +7 -7
- package/dist/audits/content-chunking/semantic-containers.js.map +1 -1
- package/dist/audits/direct-answer-density/concise-answer-wordcount.d.ts +1 -1
- package/dist/audits/direct-answer-density/concise-answer-wordcount.js +11 -11
- package/dist/audits/direct-answer-density/concise-answer-wordcount.js.map +1 -1
- package/dist/audits/direct-answer-density/direct-definition-answering.d.ts +1 -1
- package/dist/audits/direct-answer-density/direct-definition-answering.js +12 -12
- package/dist/audits/direct-answer-density/direct-definition-answering.js.map +1 -1
- package/dist/audits/direct-answer-density/question-heading-alignment.d.ts +1 -1
- package/dist/audits/direct-answer-density/question-heading-alignment.js +7 -7
- package/dist/audits/direct-answer-density/question-heading-alignment.js.map +1 -1
- package/dist/audits/index.d.ts +1 -1
- package/dist/audits/index.js +1 -1
- package/dist/audits/structured-data/entity-sameas-links.d.ts +1 -1
- package/dist/audits/structured-data/entity-sameas-links.js +11 -11
- package/dist/audits/structured-data/entity-sameas-links.js.map +1 -1
- package/dist/audits/structured-data/jsonld-syntax-validity.d.ts +1 -1
- package/dist/audits/structured-data/jsonld-syntax-validity.js +12 -12
- package/dist/audits/structured-data/jsonld-syntax-validity.js.map +1 -1
- package/dist/audits/structured-data/rag-schema-presence.d.ts +1 -1
- package/dist/audits/structured-data/rag-schema-presence.js +13 -13
- package/dist/audits/structured-data/rag-schema-presence.js.map +1 -1
- package/dist/config/default-config.d.ts +2 -2
- package/dist/config/default-config.js +6 -6
- package/dist/config/default-config.js.map +1 -1
- package/dist/gather/driver/cheerio-driver.d.ts +1 -1
- package/dist/gather/driver/cheerio-driver.js +4 -4
- package/dist/gather/driver/cheerio-driver.js.map +1 -1
- package/dist/gather/gatherers/content-chunks-gatherer.d.ts +1 -1
- package/dist/gather/gatherers/content-chunks-gatherer.d.ts.map +1 -1
- package/dist/gather/gatherers/content-chunks-gatherer.js +4 -6
- package/dist/gather/gatherers/content-chunks-gatherer.js.map +1 -1
- package/dist/gather/gatherers/direct-answers-gatherer.d.ts +1 -1
- package/dist/gather/gatherers/direct-answers-gatherer.d.ts.map +1 -1
- package/dist/gather/gatherers/direct-answers-gatherer.js +4 -5
- package/dist/gather/gatherers/direct-answers-gatherer.js.map +1 -1
- package/dist/gather/gatherers/headings-hierarchy-gatherer.d.ts +1 -1
- package/dist/gather/gatherers/headings-hierarchy-gatherer.js +2 -2
- package/dist/gather/gatherers/headings-hierarchy-gatherer.js.map +1 -1
- package/dist/gather/gatherers/robots-txt-gatherer.d.ts +1 -1
- package/dist/gather/gatherers/robots-txt-gatherer.d.ts.map +1 -1
- package/dist/gather/gatherers/robots-txt-gatherer.js +2 -4
- package/dist/gather/gatherers/robots-txt-gatherer.js.map +1 -1
- package/dist/report/html-reporter.d.ts +2 -2
- package/dist/report/html-reporter.js +9 -9
- package/dist/report/html-reporter.js.map +1 -1
- package/dist/report/terminal-reporter.d.ts +1 -1
- package/dist/report/terminal-reporter.js +3 -3
- package/dist/report/terminal-reporter.js.map +1 -1
- package/dist/runner/aggregator.d.ts +3 -3
- package/dist/runner/aggregator.js +5 -5
- package/dist/runner/aggregator.js.map +1 -1
- package/dist/runner/runner.d.ts +7 -7
- package/dist/runner/runner.d.ts.map +1 -1
- package/dist/runner/runner.js +17 -18
- package/dist/runner/runner.js.map +1 -1
- package/dist/types/artifacts.d.ts +19 -21
- package/dist/types/artifacts.d.ts.map +1 -1
- package/dist/types/artifacts.js +3 -3
- package/dist/types/audit.d.ts +29 -29
- package/dist/types/audit.d.ts.map +1 -1
- package/dist/types/audit.js +2 -2
- package/dist/types/config.d.ts +21 -21
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +1 -1
- package/dist/types/gatherer.d.ts +6 -6
- package/dist/types/gatherer.d.ts.map +1 -1
- package/dist/types/gatherer.js +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-sameas-links.js","sourceRoot":"","sources":["../../../src/audits/structured-data/entity-sameas-links.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACxC,MAAM,CAAU,IAAI,GAAc;QACvC,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"entity-sameas-links.js","sourceRoot":"","sources":["../../../src/audits/structured-data/entity-sameas-links.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACxC,MAAM,CAAU,IAAI,GAAc;QACvC,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,qEAAqE;QAC5E,YAAY,EAAE,0CAA0C;QACxD,WAAW,EACT,uKAAuK;QACzK,iBAAiB,EAAE,CAAC,QAAQ,CAAC;KAC9B,CAAC;IAEK,MAAM,CAAU,KAAK,CAAC,KAAK,CAAC,SAAoB;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAErC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAElC,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,IAAI,SAAS,GAAG,yBAAyB,CAAC;YAC1C,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAAE,SAAS,GAAG,4BAA4B,CAAC;iBACtE,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAAE,SAAS,GAAG,6BAA6B,CAAC;iBAC7E,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,SAAS,GAAG,yBAAyB,CAAC;YAErI,OAAO;gBACL,GAAG;gBACH,IAAI,EAAE,SAAS;aAChB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAC9B,KAAK;YACL,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC,uBAAuB;YAC/F,OAAO,EAAE,SAAS;gBAChB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CACnB;oBACE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE;oBACrD,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE;iBACzD,EACD,UAAU,CACX;gBACH,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;IACL,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Audit validating the syntax and integrity of JSON-LD schema blocks
|
|
3
3
|
*/
|
|
4
4
|
import { Audit } from '../audit.js';
|
|
5
5
|
import type { Artifacts, AuditMeta, AuditResult } from '../../types/index.js';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Audit validating the syntax and integrity of JSON-LD schema blocks
|
|
3
3
|
*/
|
|
4
4
|
import { Audit } from '../audit.js';
|
|
5
5
|
export class JsonLdSyntaxValidityAudit extends Audit {
|
|
6
6
|
static meta = {
|
|
7
7
|
id: 'jsonld-syntax-validity',
|
|
8
|
-
title: '
|
|
9
|
-
failureTitle: '
|
|
10
|
-
description: '
|
|
8
|
+
title: 'All JSON-LD blocks have valid, error-free syntax',
|
|
9
|
+
failureTitle: 'Syntax errors detected in JSON-LD structured data blocks',
|
|
10
|
+
description: 'Malformed JSON prevents Answer Engine parsers and RAG pipelines from extracting structured entity information.',
|
|
11
11
|
requiredArtifacts: ['JSONLD'],
|
|
12
12
|
};
|
|
13
13
|
static async audit(artifacts) {
|
|
@@ -15,8 +15,8 @@ export class JsonLdSyntaxValidityAudit extends Audit {
|
|
|
15
15
|
if (jsonld.items.length === 0) {
|
|
16
16
|
return this.generateAuditResult({
|
|
17
17
|
score: 0.5,
|
|
18
|
-
displayValue: 'No
|
|
19
|
-
explanation: '
|
|
18
|
+
displayValue: 'No JSON-LD structured data blocks found on page',
|
|
19
|
+
explanation: 'Adding Schema.org structured data via <script type="application/ld+json"> is recommended.',
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
const invalidItems = jsonld.items.filter((item) => !item.isValid);
|
|
@@ -24,18 +24,18 @@ export class JsonLdSyntaxValidityAudit extends Audit {
|
|
|
24
24
|
const score = validCount / jsonld.items.length;
|
|
25
25
|
const tableItems = jsonld.items.map((item, idx) => ({
|
|
26
26
|
index: idx + 1,
|
|
27
|
-
type: item.type ? (Array.isArray(item.type) ? item.type.join(', ') : item.type) : '
|
|
28
|
-
status: item.isValid ? '
|
|
29
|
-
error: item.syntaxErrors ? item.syntaxErrors.join('; ') : '
|
|
27
|
+
type: item.type ? (Array.isArray(item.type) ? item.type.join(', ') : item.type) : 'Unknown',
|
|
28
|
+
status: item.isValid ? 'Valid' : 'Syntax Error',
|
|
29
|
+
error: item.syntaxErrors ? item.syntaxErrors.join('; ') : 'None',
|
|
30
30
|
}));
|
|
31
31
|
return this.generateAuditResult({
|
|
32
32
|
score,
|
|
33
|
-
displayValue: `${validCount}
|
|
33
|
+
displayValue: `${validCount} of ${jsonld.items.length} JSON-LD blocks are valid`,
|
|
34
34
|
details: this.makeTableDetails([
|
|
35
35
|
{ key: 'index', label: '#', valueType: 'numeric' },
|
|
36
36
|
{ key: 'type', label: '@type', valueType: 'code' },
|
|
37
|
-
{ key: 'status', label: '
|
|
38
|
-
{ key: 'error', label: '
|
|
37
|
+
{ key: 'status', label: 'Status', valueType: 'status' },
|
|
38
|
+
{ key: 'error', label: 'Detail', valueType: 'text' },
|
|
39
39
|
], tableItems),
|
|
40
40
|
});
|
|
41
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld-syntax-validity.js","sourceRoot":"","sources":["../../../src/audits/structured-data/jsonld-syntax-validity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAC3C,MAAM,CAAU,IAAI,GAAc;QACvC,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"jsonld-syntax-validity.js","sourceRoot":"","sources":["../../../src/audits/structured-data/jsonld-syntax-validity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAC3C,MAAM,CAAU,IAAI,GAAc;QACvC,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,kDAAkD;QACzD,YAAY,EAAE,0DAA0D;QACxE,WAAW,EACT,gHAAgH;QAClH,iBAAiB,EAAE,CAAC,QAAQ,CAAC;KAC9B,CAAC;IAEK,MAAM,CAAU,KAAK,CAAC,KAAK,CAAC,SAAoB;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAEhC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,mBAAmB,CAAC;gBAC9B,KAAK,EAAE,GAAG;gBACV,YAAY,EAAE,iDAAiD;gBAC/D,WAAW,EAAE,2FAA2F;aACzG,CAAC,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QAC7D,MAAM,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAE/C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAClD,KAAK,EAAE,GAAG,GAAG,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3F,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;YAC/C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;SACjE,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAC9B,KAAK;YACL,YAAY,EAAE,GAAG,UAAU,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,2BAA2B;YAChF,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAC5B;gBACE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE;gBAClD,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;gBAClD,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE;gBACvD,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE;aACrD,EACD,UAAU,CACX;SACF,CAAC,CAAC;IACL,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Audit evaluating presence of high-value schemas for RAG & Answer Engines
|
|
3
3
|
*/
|
|
4
4
|
import { Audit } from '../audit.js';
|
|
5
5
|
import type { Artifacts, AuditMeta, AuditResult } from '../../types/index.js';
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Audit evaluating presence of high-value schemas for RAG & Answer Engines
|
|
3
3
|
*/
|
|
4
4
|
import { Audit } from '../audit.js';
|
|
5
5
|
export class RagSchemaPresenceAudit extends Audit {
|
|
6
6
|
static meta = {
|
|
7
7
|
id: 'rag-schema-presence',
|
|
8
|
-
title: '
|
|
9
|
-
failureTitle: '
|
|
10
|
-
description: '
|
|
8
|
+
title: 'Page implements RAG-optimized JSON-LD schemas (FAQPage, HowTo, Article)',
|
|
9
|
+
failureTitle: 'Missing high-value structured schemas for RAG',
|
|
10
|
+
description: 'Schemas like FAQPage, HowTo, QAPage, and Article enable Answer Engines to extract Q&A pairs and step-by-step information directly into synthesized answers.',
|
|
11
11
|
requiredArtifacts: ['JSONLD'],
|
|
12
12
|
};
|
|
13
13
|
static async audit(artifacts) {
|
|
14
14
|
const jsonld = artifacts.JSONLD;
|
|
15
15
|
const ragSchemas = [
|
|
16
|
-
{ name: 'FAQPage', present: jsonld.hasFAQPage, value: '
|
|
17
|
-
{ name: 'HowTo / QAPage', present: jsonld.hasHowTo || jsonld.hasQAPage, value: '
|
|
18
|
-
{ name: 'Article / TechArticle', present: jsonld.hasArticle, value: '
|
|
19
|
-
{ name: 'Organization / Product', present: jsonld.hasOrganization || jsonld.hasProduct, value: '
|
|
16
|
+
{ name: 'FAQPage', present: jsonld.hasFAQPage, value: 'Direct Q&A pairs' },
|
|
17
|
+
{ name: 'HowTo / QAPage', present: jsonld.hasHowTo || jsonld.hasQAPage, value: 'Step-by-step instructional procedures' },
|
|
18
|
+
{ name: 'Article / TechArticle', present: jsonld.hasArticle, value: 'Authorship and content metadata' },
|
|
19
|
+
{ name: 'Organization / Product', present: jsonld.hasOrganization || jsonld.hasProduct, value: 'Business entity / product metadata' },
|
|
20
20
|
];
|
|
21
21
|
const presentCount = ragSchemas.filter((s) => s.present).length;
|
|
22
22
|
let score = 0;
|
|
@@ -31,16 +31,16 @@ export class RagSchemaPresenceAudit extends Audit {
|
|
|
31
31
|
}
|
|
32
32
|
const tableItems = ragSchemas.map((s) => ({
|
|
33
33
|
schema: s.name,
|
|
34
|
-
status: s.present ? '
|
|
34
|
+
status: s.present ? 'Implemented' : 'Not found',
|
|
35
35
|
benefit: s.value,
|
|
36
36
|
}));
|
|
37
37
|
return this.generateAuditResult({
|
|
38
38
|
score,
|
|
39
|
-
displayValue: `${presentCount}
|
|
39
|
+
displayValue: `${presentCount} RAG schema type(s) detected`,
|
|
40
40
|
details: this.makeTableDetails([
|
|
41
|
-
{ key: 'schema', label: '
|
|
42
|
-
{ key: 'status', label: '
|
|
43
|
-
{ key: 'benefit', label: '
|
|
41
|
+
{ key: 'schema', label: 'Schema Type', valueType: 'code' },
|
|
42
|
+
{ key: 'status', label: 'Status', valueType: 'status' },
|
|
43
|
+
{ key: 'benefit', label: 'Impact on RAG / AEO', valueType: 'text' },
|
|
44
44
|
], tableItems),
|
|
45
45
|
});
|
|
46
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rag-schema-presence.js","sourceRoot":"","sources":["../../../src/audits/structured-data/rag-schema-presence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACxC,MAAM,CAAU,IAAI,GAAc;QACvC,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"rag-schema-presence.js","sourceRoot":"","sources":["../../../src/audits/structured-data/rag-schema-presence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACxC,MAAM,CAAU,IAAI,GAAc;QACvC,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,yEAAyE;QAChF,YAAY,EAAE,+CAA+C;QAC7D,WAAW,EACT,6JAA6J;QAC/J,iBAAiB,EAAE,CAAC,QAAQ,CAAC;KAC9B,CAAC;IAEK,MAAM,CAAU,KAAK,CAAC,KAAK,CAAC,SAAoB;QACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAEhC,MAAM,UAAU,GAAG;YACjB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE;YAC1E,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,uCAAuC,EAAE;YACxH,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,iCAAiC,EAAE;YACvG,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,oCAAoC,EAAE;SACtI,CAAC;QAEF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAChE,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;aAAM,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YAC9B,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW;YAC/C,OAAO,EAAE,CAAC,CAAC,KAAK;SACjB,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAC9B,KAAK;YACL,YAAY,EAAE,GAAG,YAAY,8BAA8B;YAC3D,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAC5B;gBACE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE;gBAC1D,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE;gBACvD,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,EAAE;aACpE,EACD,UAAU,CACX;SACF,CAAC,CAAC;IACL,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview Default AEO Linter configuration with category weights and audit definitions.
|
|
3
|
+
* Follows the Google Lighthouse configuration model (categories + auditRefs with weights).
|
|
4
4
|
*/
|
|
5
5
|
import type { LinterConfig } from '../types/config.js';
|
|
6
6
|
export declare const defaultConfig: LinterConfig;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview Default AEO Linter configuration with category weights and audit definitions.
|
|
3
|
+
* Follows the Google Lighthouse configuration model (categories + auditRefs with weights).
|
|
4
4
|
*/
|
|
5
5
|
export const defaultConfig = {
|
|
6
6
|
settings: {
|
|
@@ -10,7 +10,7 @@ export const defaultConfig = {
|
|
|
10
10
|
categories: {
|
|
11
11
|
'ai-accessibility': {
|
|
12
12
|
title: 'AI Accessibility & Crawling',
|
|
13
|
-
description: '
|
|
13
|
+
description: 'Verifies that AI agents and search crawlers (GPTBot, PerplexityBot, ClaudeBot, Google-Extended, etc.) have unrestricted crawling permissions via robots.txt and HTTP headers.',
|
|
14
14
|
weight: 25,
|
|
15
15
|
auditRefs: [
|
|
16
16
|
{ id: 'ai-robots-txt', weight: 10, group: 'crawling' },
|
|
@@ -20,7 +20,7 @@ export const defaultConfig = {
|
|
|
20
20
|
},
|
|
21
21
|
'structured-data': {
|
|
22
22
|
title: 'Structured Data & RAG Schemas',
|
|
23
|
-
description: '
|
|
23
|
+
description: 'Audits JSON-LD schemas optimized for RAG (FAQPage, HowTo, Article, QAPage, sameAs) that enrich LLM knowledge graphs with structured entity data.',
|
|
24
24
|
weight: 25,
|
|
25
25
|
auditRefs: [
|
|
26
26
|
{ id: 'jsonld-syntax-validity', weight: 8, group: 'schema' },
|
|
@@ -30,7 +30,7 @@ export const defaultConfig = {
|
|
|
30
30
|
},
|
|
31
31
|
'content-chunking': {
|
|
32
32
|
title: 'Content Chunking & Semantic Structure',
|
|
33
|
-
description: '
|
|
33
|
+
description: 'Evaluates H1-H3 sequential hierarchy, semantic partitioning (<article>, <section>, <main>), and token density per block for optimal RAG embedding extraction.',
|
|
34
34
|
weight: 25,
|
|
35
35
|
auditRefs: [
|
|
36
36
|
{ id: 'heading-hierarchy', weight: 8, group: 'structure' },
|
|
@@ -40,7 +40,7 @@ export const defaultConfig = {
|
|
|
40
40
|
},
|
|
41
41
|
'direct-answer-density': {
|
|
42
42
|
title: 'Direct Answer Density',
|
|
43
|
-
description: '
|
|
43
|
+
description: 'Detects concise, direct definitions and answers to key user questions, optimizing extraction for Answer Engines (Perplexity, SearchGPT, AI Overviews).',
|
|
44
44
|
weight: 25,
|
|
45
45
|
auditRefs: [
|
|
46
46
|
{ id: 'direct-definition-answering', weight: 10, group: 'answers' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-config.js","sourceRoot":"","sources":["../../src/config/default-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO;QACf,iBAAiB,EAAE,KAAK;KACzB;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE;YAClB,KAAK,EAAE,6BAA6B;YACpC,WAAW,EACT
|
|
1
|
+
{"version":3,"file":"default-config.js","sourceRoot":"","sources":["../../src/config/default-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO;QACf,iBAAiB,EAAE,KAAK;KACzB;IACD,UAAU,EAAE;QACV,kBAAkB,EAAE;YAClB,KAAK,EAAE,6BAA6B;YACpC,WAAW,EACT,+KAA+K;YACjL,MAAM,EAAE,EAAE;YACV,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;gBACtD,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;gBACvD,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;aACvD;SACF;QACD,iBAAiB,EAAE;YACjB,KAAK,EAAE,+BAA+B;YACtC,WAAW,EACT,kJAAkJ;YACpJ,MAAM,EAAE,EAAE;YACV,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,wBAAwB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC5D,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACzD,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE;aACnE;SACF;QACD,kBAAkB,EAAE;YAClB,KAAK,EAAE,uCAAuC;YAC9C,WAAW,EACT,+JAA+J;YACjK,MAAM,EAAE,EAAE;YACV,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;gBAC1D,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;gBAC5D,EAAE,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;aAC9D;SACF;QACD,uBAAuB,EAAE;YACvB,KAAK,EAAE,uBAAuB;YAC9B,WAAW,EACT,wJAAwJ;YAC1J,MAAM,EAAE,EAAE;YACV,SAAS,EAAE;gBACT,EAAE,EAAE,EAAE,6BAA6B,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;gBACnE,EAAE,EAAE,EAAE,0BAA0B,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC/D,EAAE,EAAE,EAAE,4BAA4B,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;aAClE;SACF;KACF;IACD,MAAM,EAAE;QACN,mBAAmB;QACnB,eAAe;QACf,iBAAiB;QACjB,gBAAgB;QAChB,kBAAkB;QAClB,wBAAwB;QACxB,qBAAqB;QACrB,qBAAqB;QACrB,mBAAmB;QACnB,mBAAmB;QACnB,qBAAqB;QACrB,qBAAqB;QACrB,wBAAwB;QACxB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;KAC7B;CACF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Driver implementation based on Fetch + Cheerio for Node.js / CLI environments.
|
|
3
3
|
*/
|
|
4
4
|
import * as cheerio from 'cheerio';
|
|
5
5
|
import type { Driver } from '../../types/index.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Driver implementation based on Fetch + Cheerio for Node.js / CLI environments.
|
|
3
3
|
*/
|
|
4
4
|
import * as cheerio from 'cheerio';
|
|
5
5
|
export class CheerioDriver {
|
|
@@ -16,7 +16,7 @@ export class CheerioDriver {
|
|
|
16
16
|
static async createFromUrl(targetUrl, fetchFn = fetch, options) {
|
|
17
17
|
const defaultHeaders = {
|
|
18
18
|
'User-Agent': options?.userAgent ||
|
|
19
|
-
'Mozilla/5.0 (compatible; AEOLinter/1.0; +https://github.com/aeo-linter)',
|
|
19
|
+
'Mozilla/5.0 (compatible; AEOLinter/1.0; +https://github.com/DrowLink/aeo-audit-linter)',
|
|
20
20
|
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
21
21
|
...options?.headers,
|
|
22
22
|
};
|
|
@@ -25,7 +25,7 @@ export class CheerioDriver {
|
|
|
25
25
|
redirect: 'follow',
|
|
26
26
|
});
|
|
27
27
|
if (!res.ok) {
|
|
28
|
-
throw new Error(`
|
|
28
|
+
throw new Error(`HTTP ${res.status} error fetching ${targetUrl}: ${res.statusText}`);
|
|
29
29
|
}
|
|
30
30
|
const html = await res.text();
|
|
31
31
|
const finalUrl = res.url || targetUrl;
|
|
@@ -43,7 +43,7 @@ export class CheerioDriver {
|
|
|
43
43
|
if (typeof script === 'function') {
|
|
44
44
|
return script();
|
|
45
45
|
}
|
|
46
|
-
throw new Error('evaluate()
|
|
46
|
+
throw new Error('evaluate() with raw string is not supported in CheerioDriver');
|
|
47
47
|
}
|
|
48
48
|
async fetch(url, init) {
|
|
49
49
|
return fetch(url, init);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cheerio-driver.js","sourceRoot":"","sources":["../../../src/gather/driver/cheerio-driver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,MAAM,OAAO,aAAa;IAChB,GAAG,CAAS;IACZ,IAAI,CAAS;IACb,OAAO,CAAoC;IAC3C,CAAC,CAAqB;IAE9B,YAAY,OAIX;QACC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,aAAa,CAC/B,SAAiB,EACjB,UAAwB,KAAK,EAC7B,OAAkE;QAElE,MAAM,cAAc,GAAG;YACrB,YAAY,EACV,OAAO,EAAE,SAAS;gBAClB,
|
|
1
|
+
{"version":3,"file":"cheerio-driver.js","sourceRoot":"","sources":["../../../src/gather/driver/cheerio-driver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,MAAM,OAAO,aAAa;IAChB,GAAG,CAAS;IACZ,IAAI,CAAS;IACb,OAAO,CAAoC;IAC3C,CAAC,CAAqB;IAE9B,YAAY,OAIX;QACC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,aAAa,CAC/B,SAAiB,EACjB,UAAwB,KAAK,EAC7B,OAAkE;QAElE,MAAM,cAAc,GAAG;YACrB,YAAY,EACV,OAAO,EAAE,SAAS;gBAClB,wFAAwF;YAC1F,MAAM,EAAE,iEAAiE;YACzE,GAAG,OAAO,EAAE,OAAO;SACpB,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE;YACnC,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,mBAAmB,SAAS,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC;QAEtC,MAAM,aAAa,GAAsC,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/B,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,aAAa,CAAC;YACvB,GAAG,EAAE,QAAQ;YACb,IAAI;YACJ,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAI,MAA0B;QACjD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,OAAO,MAAM,EAAE,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,IAAkB;QAChD,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,MAAM;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview ContentChunksGatherer
|
|
2
|
+
* @fileoverview ContentChunksGatherer for semantic content chunking and token density estimation for RAG.
|
|
3
3
|
*/
|
|
4
4
|
import { Gatherer } from '../gatherer.js';
|
|
5
5
|
import type { ContentChunksArtifact, GathererContext } from '../../types/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-chunks-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAgB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEjG,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAClE,SAAyB,IAAI,EAAG,eAAe,CAAU;IAEnC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"content-chunks-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAgB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEjG,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAClE,SAAyB,IAAI,EAAG,eAAe,CAAU;IAEnC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAiG5F"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview ContentChunksGatherer
|
|
2
|
+
* @fileoverview ContentChunksGatherer for semantic content chunking and token density estimation for RAG.
|
|
3
3
|
*/
|
|
4
4
|
import * as cheerio from 'cheerio';
|
|
5
5
|
import { Gatherer } from '../gatherer.js';
|
|
@@ -8,7 +8,7 @@ export class ContentChunksGatherer extends Gatherer {
|
|
|
8
8
|
async getArtifact(context) {
|
|
9
9
|
const html = await context.driver.getHtml();
|
|
10
10
|
const $ = cheerio.load(html);
|
|
11
|
-
//
|
|
11
|
+
// Remove boilerplate non-content tags
|
|
12
12
|
$('script, style, noscript, svg, nav, footer, header').remove();
|
|
13
13
|
const semanticTagsUsed = [];
|
|
14
14
|
if ($('main').length > 0)
|
|
@@ -19,13 +19,11 @@ export class ContentChunksGatherer extends Gatherer {
|
|
|
19
19
|
semanticTagsUsed.push('section');
|
|
20
20
|
const chunks = [];
|
|
21
21
|
let chunkCounter = 0;
|
|
22
|
-
// Buscar secciones o elementos principales
|
|
23
22
|
const contentContainers = $('article, section, main');
|
|
24
23
|
const targetElements = contentContainers.length > 0 ? contentContainers : $('body');
|
|
25
24
|
targetElements.each((_, container) => {
|
|
26
25
|
const containerTag = container.tagName.toLowerCase();
|
|
27
26
|
const isSemantic = ['article', 'section', 'main'].includes(containerTag);
|
|
28
|
-
// Dividir el contenedor por encabezados internos o párrafos
|
|
29
27
|
const subNodes = $(container).children('h1, h2, h3, h4, p, ul, ol, table, pre');
|
|
30
28
|
let currentHeading = undefined;
|
|
31
29
|
let bufferText = '';
|
|
@@ -39,7 +37,7 @@ export class ContentChunksGatherer extends Gatherer {
|
|
|
39
37
|
const words = text.split(/\s+/).filter(Boolean);
|
|
40
38
|
const wordCount = words.length;
|
|
41
39
|
if (wordCount < 10)
|
|
42
|
-
return; //
|
|
40
|
+
return; // Ignore small noise fragments
|
|
43
41
|
const estimatedTokens = Math.round(wordCount * 1.3);
|
|
44
42
|
chunks.push({
|
|
45
43
|
id: `chunk-${++chunkCounter}`,
|
|
@@ -74,7 +72,7 @@ export class ContentChunksGatherer extends Gatherer {
|
|
|
74
72
|
if (tag === 'pre' || $(el).find('code').length > 0)
|
|
75
73
|
hasCode = true;
|
|
76
74
|
bufferText += ' ' + $(el).text().trim();
|
|
77
|
-
//
|
|
75
|
+
// Split into a subchunk if exceeding ~350 words for embeddings
|
|
78
76
|
if (bufferText.split(/\s+/).length > 350) {
|
|
79
77
|
flushChunk();
|
|
80
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-chunks-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,OAAO,qBAAsB,SAAQ,QAAyB;IACzC,IAAI,GAAG,eAAwB,CAAC;IAEzC,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,
|
|
1
|
+
{"version":3,"file":"content-chunks-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/content-chunks-gatherer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview DirectAnswersGatherer
|
|
2
|
+
* @fileoverview DirectAnswersGatherer to detect query patterns and immediate concise answers.
|
|
3
3
|
*/
|
|
4
4
|
import { Gatherer } from '../gatherer.js';
|
|
5
5
|
import type { DirectAnswersArtifact, GathererContext } from '../../types/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct-answers-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/direct-answers-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAoB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAErG,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAClE,SAAyB,IAAI,EAAG,eAAe,CAAU;IAEnC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"direct-answers-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/direct-answers-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAoB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAErG,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,eAAe,CAAC;IAClE,SAAyB,IAAI,EAAG,eAAe,CAAU;IAEnC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAwD5F"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview DirectAnswersGatherer
|
|
2
|
+
* @fileoverview DirectAnswersGatherer to detect query patterns and immediate concise answers.
|
|
3
3
|
*/
|
|
4
4
|
import * as cheerio from 'cheerio';
|
|
5
5
|
import { Gatherer } from '../gatherer.js';
|
|
@@ -10,19 +10,18 @@ export class DirectAnswersGatherer extends Gatherer {
|
|
|
10
10
|
const $ = cheerio.load(html);
|
|
11
11
|
const pairs = [];
|
|
12
12
|
let definitionPatternsFound = 0;
|
|
13
|
-
const questionWordsRegex = /^(
|
|
14
|
-
const definitionRegex = /\b(es un|es una|es el|es la|son los|son las|se refiere a|se define como|consiste en
|
|
13
|
+
const questionWordsRegex = /^(what|how|why|when|where|who|which|is|are|can|do|does|should|will|¿|\?|qué|que|cómo|como|por qué|porque|cuál|cual)\b/i;
|
|
14
|
+
const definitionRegex = /\b(is a|is an|is the|are the|refers to|is defined as|means|consists of|es un|es una|es el|es la|son los|son las|se refiere a|se define como|consiste en)\b/i;
|
|
15
15
|
$('h1, h2, h3, h4').each((_, el) => {
|
|
16
16
|
const headingText = $(el).text().trim();
|
|
17
17
|
const isQuestion = headingText.includes('?') || questionWordsRegex.test(headingText);
|
|
18
18
|
if (isQuestion) {
|
|
19
|
-
// Encontrar el siguiente párrafo o lista
|
|
20
19
|
const nextElem = $(el).nextAll('p, ul, ol').first();
|
|
21
20
|
if (nextElem.length > 0) {
|
|
22
21
|
const answerText = nextElem.text().trim().replace(/\s+/g, ' ');
|
|
23
22
|
const words = answerText.split(/\s+/).filter(Boolean);
|
|
24
23
|
const answerWordCount = words.length;
|
|
25
|
-
//
|
|
24
|
+
// Concise for Answer Engines: typically between 20 and 75 words (ideal 30-60)
|
|
26
25
|
const isConcise = answerWordCount >= 20 && answerWordCount <= 75;
|
|
27
26
|
const hasDirectDefinition = definitionRegex.test(answerText.slice(0, 150));
|
|
28
27
|
if (hasDirectDefinition) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct-answers-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/direct-answers-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,OAAO,qBAAsB,SAAQ,QAAyB;IACzC,IAAI,GAAG,eAAwB,CAAC;IAEzC,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,IAAI,uBAAuB,GAAG,CAAC,CAAC;QAEhC,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"direct-answers-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/direct-answers-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,OAAO,qBAAsB,SAAQ,QAAyB;IACzC,IAAI,GAAG,eAAwB,CAAC;IAEzC,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,IAAI,uBAAuB,GAAG,CAAC,CAAC;QAEhC,MAAM,kBAAkB,GAAG,wHAAwH,CAAC;QACpJ,MAAM,eAAe,GAAG,6JAA6J,CAAC;QAEtL,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACjC,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAErF,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;gBACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACtD,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC;oBAErC,8EAA8E;oBAC9E,MAAM,SAAS,GAAG,eAAe,IAAI,EAAE,IAAI,eAAe,IAAI,EAAE,CAAC;oBACjE,MAAM,mBAAmB,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBAE3E,IAAI,mBAAmB,EAAE,CAAC;wBACxB,uBAAuB,EAAE,CAAC;oBAC5B,CAAC;oBAED,IAAI,UAAU,GAAG,GAAG,CAAC;oBACrB,IAAI,SAAS;wBAAE,UAAU,IAAI,GAAG,CAAC;oBACjC,IAAI,mBAAmB;wBAAE,UAAU,IAAI,GAAG,CAAC;oBAE3C,KAAK,CAAC,IAAI,CAAC;wBACT,QAAQ,EAAE,WAAW;wBACrB,cAAc,EAAE,SAAS;wBACzB,UAAU;wBACV,eAAe;wBACf,SAAS;wBACT,mBAAmB;wBACnB,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;qBAC3C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACpE,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpF,OAAO;YACL,KAAK;YACL,iBAAiB;YACjB,mBAAmB;YACnB,uBAAuB;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview HeadingsHierarchyGatherer
|
|
2
|
+
* @fileoverview HeadingsHierarchyGatherer to evaluate H1-H6 sequential hierarchy and structure.
|
|
3
3
|
*/
|
|
4
4
|
import { Gatherer } from '../gatherer.js';
|
|
5
5
|
import type { HeadingsHierarchyArtifact, GathererContext } from '../../types/index.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview HeadingsHierarchyGatherer
|
|
2
|
+
* @fileoverview HeadingsHierarchyGatherer to evaluate H1-H6 sequential hierarchy and structure.
|
|
3
3
|
*/
|
|
4
4
|
import * as cheerio from 'cheerio';
|
|
5
5
|
import { Gatherer } from '../gatherer.js';
|
|
@@ -36,7 +36,7 @@ export class HeadingsHierarchyGatherer extends Gatherer {
|
|
|
36
36
|
for (let i = 1; i < headings.length; i++) {
|
|
37
37
|
const prev = headings[i - 1];
|
|
38
38
|
const curr = headings[i];
|
|
39
|
-
//
|
|
39
|
+
// A skipped level occurs when heading depth increases by more than 1 (e.g. h1 -> h3)
|
|
40
40
|
if (curr.level > prev.level + 1) {
|
|
41
41
|
isHierarchySequential = false;
|
|
42
42
|
skippedLevels.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headings-hierarchy-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/headings-hierarchy-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,OAAO,yBAA0B,SAAQ,QAA6B;IACjD,IAAI,GAAG,mBAA4B,CAAC;IAE7C,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,eAAe,GAAG,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACpD,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAyB,CAAC;YACtE,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACtD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE5B,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAE3B,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK;gBACL,IAAI;gBACJ,EAAE;gBACF,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAsD,EAAE,CAAC;QAC5E,IAAI,qBAAqB,GAAG,IAAI,CAAC;QAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEzB,
|
|
1
|
+
{"version":3,"file":"headings-hierarchy-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/headings-hierarchy-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,OAAO,yBAA0B,SAAQ,QAA6B;IACjD,IAAI,GAAG,mBAA4B,CAAC;IAE7C,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,eAAe,GAAG,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACpD,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAyB,CAAC;YACtE,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACtD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE5B,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAE3B,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK;gBACL,IAAI;gBACJ,EAAE;gBACF,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAsD,EAAE,CAAC;QAC5E,IAAI,qBAAqB,GAAG,IAAI,CAAC;QAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEzB,qFAAqF;YACrF,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBAChC,qBAAqB,GAAG,KAAK,CAAC;gBAC9B,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,IAAI,CAAC,KAAK;oBAChB,EAAE,EAAE,IAAI,CAAC,KAAK;oBACd,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ;YACR,OAAO;YACP,OAAO;YACP,OAAO;YACP,WAAW,EAAE,OAAO,KAAK,CAAC;YAC1B,qBAAqB;YACrB,aAAa;SACd,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview RobotsTxtGatherer
|
|
2
|
+
* @fileoverview RobotsTxtGatherer to fetch and parse robots.txt and evaluate AI bot directives.
|
|
3
3
|
*/
|
|
4
4
|
import { Gatherer } from '../gatherer.js';
|
|
5
5
|
import type { RobotsTxtArtifact, GathererContext } from '../../types/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots-txt-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/robots-txt-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAmB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEhG,qBAAa,iBAAkB,SAAQ,QAAQ,CAAC,WAAW,CAAC;IAC1D,SAAyB,IAAI,EAAG,WAAW,CAAU;IAE/B,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"robots-txt-gatherer.d.ts","sourceRoot":"","sources":["../../../src/gather/gatherers/robots-txt-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAmB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEhG,qBAAa,iBAAkB,SAAQ,QAAQ,CAAC,WAAW,CAAC;IAC1D,SAAyB,IAAI,EAAG,WAAW,CAAU;IAE/B,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqCvF,OAAO,CAAC,cAAc;IAgEtB,OAAO,CAAC,cAAc;CAgDvB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview RobotsTxtGatherer
|
|
2
|
+
* @fileoverview RobotsTxtGatherer to fetch and parse robots.txt and evaluate AI bot directives.
|
|
3
3
|
*/
|
|
4
4
|
import { Gatherer } from '../gatherer.js';
|
|
5
5
|
export class RobotsTxtGatherer extends Gatherer {
|
|
@@ -16,7 +16,7 @@ export class RobotsTxtGatherer extends Gatherer {
|
|
|
16
16
|
statusCode = response.status;
|
|
17
17
|
if (response.ok) {
|
|
18
18
|
const text = await response.text();
|
|
19
|
-
//
|
|
19
|
+
// Verify it is not an HTML 404 page masquerading as 200
|
|
20
20
|
if (!text.trim().toLowerCase().startsWith('<!doctype html') && !text.trim().toLowerCase().startsWith('<html')) {
|
|
21
21
|
rawContent = text;
|
|
22
22
|
exists = true;
|
|
@@ -24,7 +24,6 @@ export class RobotsTxtGatherer extends Gatherer {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
catch {
|
|
27
|
-
// Ignorar errores de red y marcar como no existente
|
|
28
27
|
exists = false;
|
|
29
28
|
}
|
|
30
29
|
const { rulesByAgent, sitemaps } = this.parseRobotsTxt(rawContent || '');
|
|
@@ -57,7 +56,6 @@ export class RobotsTxtGatherer extends Gatherer {
|
|
|
57
56
|
const value = line.slice(colonIdx + 1).trim();
|
|
58
57
|
if (key === 'user-agent') {
|
|
59
58
|
const agent = value.toLowerCase();
|
|
60
|
-
// Si veníamos procesando otro grupo, iniciamos nuevo grupo si no es consecutivo
|
|
61
59
|
currentAgents = [agent];
|
|
62
60
|
if (!rulesByAgent[agent]) {
|
|
63
61
|
rulesByAgent[agent] = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots-txt-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/robots-txt-gatherer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,OAAO,iBAAkB,SAAQ,QAAqB;IACjC,IAAI,GAAG,WAAoB,CAAC;IAErC,KAAK,CAAC,WAAW,CAAC,OAAwB;QACxD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,MAAM,aAAa,CAAC;QAEhD,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvD,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC7B,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,
|
|
1
|
+
{"version":3,"file":"robots-txt-gatherer.js","sourceRoot":"","sources":["../../../src/gather/gatherers/robots-txt-gatherer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Generates standalone interactive HTML reports inspired by Google Lighthouse.
|
|
3
3
|
*/
|
|
4
4
|
import type { AeoReportResult } from '../types/index.js';
|
|
5
5
|
export declare class HtmlReporter {
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Generates a self-contained HTML document with score gauges and audit breakdowns.
|
|
8
8
|
*/
|
|
9
9
|
static generate(report: AeoReportResult): string;
|
|
10
10
|
}
|