/* eslint-disable @typescript-eslint/no-var-requires */ const { resolve } = require("path"); const { exec } = require("child_process"); const { file } = require("tmp-promise"); const { writeFile } = require("fs-extra"); const toneJson = require("../docs/tone.json"); const eachLimit = require("async/eachLimit"); const os = require("os"); const cpuCount = os.cpus().length; /** * Get all of the examples */ function findExamples(obj) { let examples = []; for (let prop in obj) { if (Array.isArray(obj[prop])) { obj[prop].forEach(child => { examples = [...examples, ...findExamples(child)]; }); } else if (prop === "comment" && obj[prop].tags) { examples = [ ...examples, ...obj[prop].tags.filter(tag => tag.tag === "example").map(tag => tag.text) ]; } else if (typeof obj[prop] === "object") { examples = [...examples, ...findExamples(obj[prop])]; } else { // console.log(prop); } } // filter any repeats return [...new Set(examples)]; } /** * A promise version of exec */ function execPromise(cmd) { return new Promise((done, error) => { exec(cmd, (e, output) => { if (e) { error(output); } else { done(); } }); }); } /** * Run the string through the typescript compiler */ async function testExampleString(str) { str = str.replace("from \"tone\"", `from "${resolve(__dirname, "../")}"`); const { path, cleanup } = await file({ postfix: ".ts" }); // work with file here in fd await writeFile(path, str); try { await execPromise(`tsc --noEmit --target es5 --lib dom,ES2015 ${path}`); } finally { cleanup(); } } async function main() { const section = parseInt(process.env.TEST_EXAMPLES, 10); const examples = findExamples(toneJson); const half = Math.floor(examples.length/2); const split = section === 0 ? examples.slice(0, half) : examples.slice(half); let passed = 0; await eachLimit(split, cpuCount, async example => { try { await testExampleString(example); passed++; } catch (e) { console.log(example + "\n" + e); } }); console.log(`valid examples ${passed}/${split.length}`); } main();