Skip to content

Commit 88cb080

Browse files
authored
chore: achieve zero warnings across oxlint and typecheckers (#41)
1 parent b5b3d92 commit 88cb080

17 files changed

Lines changed: 38 additions & 23 deletions
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
"@forkpoint/agent-lighthouse-core": patch
3+
"@forkpoint/agent-lighthouse": patch
4+
---
5+
6+
Code hygiene and linter zero-warning hardening:
7+
- Configured `.oxlintrc.json` with ignore pattern for `.astro` templates (which are compiled and verified by `astro check`).
8+
- Resolved all unsafe optional chaining operations, redundant fallbacks in object spreads, and regex character escapes across core audits and test suites.
9+
- Removed unused imports and eliminated all compiler warnings in `content.config.ts`.
10+
- Brought `pnpm lint` and `pnpm typecheck` to 0 errors, 0 warnings, and 0 hints across the entire codebase.

.oxlintrc.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"$schema": "./node_modules/oxlint/configuration_schema.json",
3+
"ignorePatterns": ["**/*.astro"]
4+
}

packages/cli/src/options.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ export function parseCategoryAssertions(
191191
fileConfig: FileConfig & { assertCategories?: Record<string, number> } = {},
192192
): Record<string, number> {
193193
const out: Record<string, number> = {
194-
...(fileConfig.assertCategories ?? {}),
194+
...fileConfig.assertCategories,
195195
};
196196

197197
const record = (pair: string | undefined) => {

packages/core/src/audits/access-crawl-control/ai-usage-signal-coherence-across-channels.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ describe("AiUsageSignalCoherenceAcrossChannelsAudit", () => {
163163
}),
164164
);
165165
expect(result.status).toBe("pass");
166-
expect((result.details?.["notes"] as string[])[0]).toContain(
166+
expect((result.details!["notes"] as string[])[0]).toContain(
167167
"array of rules",
168168
);
169169
});

packages/core/src/audits/access-crawl-control/aipref-content-usage-declaration-validity.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ describe("AiprefContentUsageDeclarationValidityAudit", () => {
6363
site("User-agent: *\nAllow: /\nContent-Usage: ai-input=n\n"),
6464
);
6565
expect(result.status).toBe("fail");
66-
expect((result.details?.["syntaxErrors"] as string[])[0]).toContain(
66+
expect((result.details!["syntaxErrors"] as string[])[0]).toContain(
6767
"not an AIPREF category",
6868
);
6969
});
@@ -75,7 +75,7 @@ describe("AiprefContentUsageDeclarationValidityAudit", () => {
7575
site("User-agent: *\nAllow: /\nContent-Usage: train-ai=yes\n"),
7676
);
7777
expect(result.status).toBe("fail");
78-
expect((result.details?.["syntaxErrors"] as string[])[0]).toContain(
78+
expect((result.details!["syntaxErrors"] as string[])[0]).toContain(
7979
"legacy Content-Signal syntax",
8080
);
8181
});
@@ -87,7 +87,7 @@ describe("AiprefContentUsageDeclarationValidityAudit", () => {
8787
),
8888
);
8989
expect(result.status).toBe("fail");
90-
expect((result.details?.["inertDeclarations"] as string[])[0]).toContain(
90+
expect((result.details!["inertDeclarations"] as string[])[0]).toContain(
9191
'"disallow: /private/"',
9292
);
9393
});
@@ -109,7 +109,7 @@ describe("AiprefContentUsageDeclarationValidityAudit", () => {
109109
}),
110110
);
111111
expect(result.status).toBe("fail");
112-
expect((result.details?.["channelDisagreements"] as string[])[0]).toContain(
112+
expect((result.details!["channelDisagreements"] as string[])[0]).toContain(
113113
"train-ai over /",
114114
);
115115
});

packages/core/src/audits/agent-interfaces/ai-catalog-urls.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ async function pooled<T, R>(
5656
limit: number,
5757
worker: (item: T) => Promise<R>,
5858
): Promise<R[]> {
59-
const results = new Array<R>(items.length);
59+
const results = Array.from<R>({ length: items.length });
6060
let next = 0;
6161
const runners = Array.from(
6262
{ length: Math.min(limit, items.length) },

packages/core/src/audits/agent-interfaces/mcp-tool-contract-validity.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const MAX_PAGES = 4;
1616
/** Longest tool name the spec allows. */
1717
const MAX_NAME = 128;
1818
/** Tool names outside this need no escaping anywhere. */
19-
const NAME_PATTERN = /^[A-Za-z0-9_.\-]+$/;
19+
const NAME_PATTERN = /^[A-Za-z0-9_.-]+$/;
2020
/** RFC 9110 tchar: what a header value may be built from. */
2121
const TCHAR = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
2222
/** The only property types an `x-mcp-header` annotation may sit on. */

packages/core/src/audits/answer-readiness/chunk-boundary-referent-integrity.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ describe("ChunkBoundaryReferentIntegrityAudit", () => {
100100
]);
101101
const result = await audit.audit(ctx);
102102
expect(result.status).toBe("pass");
103-
expect((result.details?.["entities"] as string[]).length).toBeGreaterThan(
103+
expect((result.details!["entities"] as string[]).length).toBeGreaterThan(
104104
1,
105105
);
106106
});

packages/core/src/audits/answer-readiness/section-split-risk-profile.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ describe("SectionSplitRiskProfileAudit", () => {
101101
const result = await audit.audit(
102102
page(`<h2>Boiling</h2><p>${text}</p><h2>Care</h2><p>${prose(200)}</p>`),
103103
);
104-
const reported = Number((result.details?.["sectionTokens"] as string[])[0]);
104+
const reported = Number((result.details!["sectionTokens"] as string[])[0]);
105105
expect(reported).toBeCloseTo(countTokens(`Boiling ${text}`), -1);
106106
});
107107

packages/core/src/audits/answer-readiness/table-markdown-round-trip-loss.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ describe("TableMarkdownRoundTripLossAudit", () => {
6565
);
6666
expect(result.status).toBe("fail");
6767
expect(result.details?.["headerlessNumericTables"]).toBe(1);
68-
expect((result.details?.["findings"] as string[]).join(" ")).toContain(
68+
expect((result.details!["findings"] as string[]).join(" ")).toContain(
6969
"no header cell",
7070
);
7171
});
@@ -81,7 +81,7 @@ describe("TableMarkdownRoundTripLossAudit", () => {
8181
);
8282
expect(result.status).toBe("fail");
8383
expect(result.details?.["strandedUnitTables"]).toBe(1);
84-
expect((result.details?.["findings"] as string[]).join(" ")).toContain(
84+
expect((result.details!["findings"] as string[]).join(" ")).toContain(
8585
"arrive unitless",
8686
);
8787
});
@@ -94,7 +94,7 @@ describe("TableMarkdownRoundTripLossAudit", () => {
9494
</table>`),
9595
);
9696
expect(result.details?.["blockContentCells"]).toBe(1);
97-
expect((result.details?.["findings"] as string[]).join(" ")).toContain(
97+
expect((result.details!["findings"] as string[]).join(" ")).toContain(
9898
"block content",
9999
);
100100
});
@@ -108,7 +108,7 @@ describe("TableMarkdownRoundTripLossAudit", () => {
108108
</table>`),
109109
);
110110
expect(result.details?.["raggedRows"]).toBe(1);
111-
expect((result.details?.["findings"] as string[]).join(" ")).toContain(
111+
expect((result.details!["findings"] as string[]).join(" ")).toContain(
112112
"declares 2 cell(s)",
113113
);
114114
});

0 commit comments

Comments
 (0)