// Sanity checks for the VS Code extension assets. Run with `node test/validate.mjs`. // Verifies the JSON contribution files parse and that the bundled compiler both // accepts valid .wrn and reports an offset for invalid .wrn (what diagnostics need). import { readFileSync } from "node:fs"; import { fileURLToPath } from "node:url"; import { dirname, join } from "node:path"; import { createRequire } from "node:module"; const here = dirname(fileURLToPath(import.meta.url)); const root = join(here, ".."); const require = createRequire(import.meta.url); let failures = 0; const ok = (name) => console.log(` ok ${name}`); const bad = (name, detail) => { failures++; console.error(` FAIL ${name}${detail ? " — " + detail : ""}`); }; // 1. All JSON contribution files parse. for (const rel of [ "package.json", "language-configuration.json", "syntaxes/wrn.tmLanguage.json", "syntaxes/wrn.injection.tmLanguage.json", "snippets/wrn.json", ]) { try { JSON.parse(readFileSync(join(root, rel), "utf8")); ok(`json parses: ${rel}`); } catch (e) { bad(`json parses: ${rel}`, e.message); } } // 2. Grammar wires up the right scope + embedded languages. const grammar = JSON.parse(readFileSync(join(root, "syntaxes/wrn.tmLanguage.json"), "utf8")); grammar.scopeName === "source.wrn" ? ok("grammar scopeName") : bad("grammar scopeName"); // 3. Marketplace metadata and the gallery icon meet vsce requirements. try { const manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf8")); manifest.publisher === "wrnexus" ? ok("publisher id") : bad("publisher id"); manifest.icon?.endsWith(".png") ? ok("Marketplace icon is PNG") : bad("Marketplace icon is PNG"); const icon = readFileSync(join(root, manifest.icon)); const isPng = icon.subarray(1, 4).toString("ascii") === "PNG"; const width = isPng ? icon.readUInt32BE(16) : 0; const height = isPng ? icon.readUInt32BE(20) : 0; isPng && width >= 128 && height >= 128 ? ok(`Marketplace icon dimensions (${width}x${height})`) : bad("Marketplace icon is at least 128x128 PNG"); for (const rel of ["README.md", "CHANGELOG.md", "SUPPORT.md", "LICENSE"]) { readFileSync(join(root, rel), "utf8"); ok(`Marketplace document exists: ${rel}`); } } catch (e) { bad("Marketplace metadata", e.message); } // 4. Bundled compiler: valid source compiles, invalid source throws with an offset. try { const compiler = require(join(root, "src/compiler.cjs")); const good = `page Home {\n view {