diff --git a/packages/lint/src/rules/adapters.test.ts b/packages/lint/src/rules/adapters.test.ts index 8e4f3ab51d..49e87835d7 100644 --- a/packages/lint/src/rules/adapters.test.ts +++ b/packages/lint/src/rules/adapters.test.ts @@ -107,6 +107,20 @@ describe("adapter rules", () => { expect(finding?.message).toContain("Three.js"); }); + it.each([ + ["missing_three_script", "const scene = new THREE.Scene();"], + ["missing_lottie_script", "lottie.loadAnimation({ container: document.body });"], + ])( + "does not report %s in a scene, since the parent document loads the library", + async (code, usage) => { + const html = ``; + const sub = await lintHyperframeHtml(html, { isSubComposition: true }); + const bare = await lintHyperframeHtml(html); + expect(sub.findings.map((f) => f.code)).not.toContain(code); + expect(bare.findings.map((f) => f.code)).not.toContain(code); + }, + ); + it("does not report missing_three_script when Three.js CDN script is present", async () => { const html = ` diff --git a/packages/lint/src/rules/adapters.ts b/packages/lint/src/rules/adapters.ts index 4de4b330b4..91b71635e1 100644 --- a/packages/lint/src/rules/adapters.ts +++ b/packages/lint/src/rules/adapters.ts @@ -1,9 +1,17 @@ import type { LintContext, HyperframeLintFinding } from "../context"; import { readAttr, extractScriptTextsAndSrcs } from "../utils"; +function inheritsLibrariesFromHost({ options, rawSource }: LintContext): boolean { + return ( + options.isSubComposition === true || rawSource.trimStart().toLowerCase().startsWith(" HyperframeLintFinding[]> = [ // missing_lottie_script - ({ tags, scripts }) => { + (ctx) => { + const { tags, scripts } = ctx; + if (inheritsLibrariesFromHost(ctx)) return []; const { texts, srcs } = extractScriptTextsAndSrcs(scripts); const hasLottieAttr = tags.some((t) => readAttr(t.raw, "data-lottie-src") !== null); @@ -26,7 +34,9 @@ export const adapterRules: Array<(ctx: LintContext) => HyperframeLintFinding[]> }, // missing_three_script - ({ scripts }) => { + (ctx) => { + const { scripts } = ctx; + if (inheritsLibrariesFromHost(ctx)) return []; const { texts, srcs } = extractScriptTextsAndSrcs(scripts); const usesThree = texts.some((t) => /\bTHREE\./.test(t));