// tools/check-pure.mjs: covers.js and render.js's generators load and run in node (a canvas stub stands in for the DOM). const noop = () => {}; const ctx = new Proxy({}, { get: (_, k) => k === "measureText" ? () => ({ width: 10 }) : k === "createLinearGradient" || k === "createRadialGradient" ? () => ({ addColorStop: noop }) : noop, set: () => true }); const canvas = () => ({ width: 64, height: 64, getContext: () => ctx }); globalThis.document = { createElement: canvas, documentElement: {} }; globalThis.getComputedStyle = () => ({ getPropertyValue: () => "" }); globalThis.localStorage = { getItem: () => null, setItem: noop }; globalThis.Audio = class { constructor() {} }; const covers = await import("../covers.js"); for (const look of covers.LOOKS) covers.drawCover(canvas(), { seed: "s", title: "t", tags: "x", bpm: 100, key: "A minor", energy: 0.5, look }); covers.drawCover(canvas(), { seed: "s", title: "t", tags: "x", bpm: 100, key: "C", energy: 0.5, break: "ident" }); const render = await import("../render.js"); const w = render.wavBlob(new Int16Array(80), 8000); if (w.size !== 44 + 160) throw new Error("wavBlob size " + w.size); const n = await render.makeNoise("pink", 1), t = await render.makeTone({ kind: "binaural", hz: 200, beat: 10 }, 1); console.log("covers ok, wav", w.size, "noise", n.size, "tone", t.size);