Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 8x 8x 8x 8x 1x 1x 1x 7x 1x 7x 1x 14x 14x 14x 28x 14x 28x 14x 14x 14x 2x 12x 12x 8x 2x 6x 6x 12x 12x 4x 1x 8x 8x 1x 14x 1x 1x 7x 7x 1x | import * as os from 'os'; import * as path from 'path'; import * as crypto from 'crypto'; import * as fs from 'fs'; import * as childProcess from 'child_process'; import * as util from 'util'; /** creates a temp directory where inits npm and installs provided local module * via npm install <local-module>, then evaluates "require(<module-name>)" from * the temp directory using node, ensures that package is can be required * reliably, dependencies are listed in npm, and transpilation has occurred. */ export class RequireCheck { static async rmdir(location: string) { const entries = await fs.promises.readdir(location, {withFileTypes: true}); const promises = entries.map(entry => { const fullLocation = path.join(location, entry.name); return entry.isDirectory() ? RequireCheck.rmdir(fullLocation) : fs.promises.unlink(fullLocation); }); await Promise.all(promises); await fs.promises.rmdir(location); } static exec = util.promisify(childProcess.exec); static template = { name: 'require-check-template', version: '1.0.0', description: 'This is a temporary package.json to test', }; static async npmInstall(install: string, cwd: string) { return await RequireCheck.exec(`npm install ${install}`, {cwd}); } static async requireModule(pkg: {name: string}, cwd: string) { return await RequireCheck.exec(`node -e "require('${pkg.name}')"`, {cwd}); } static async check(modLocation: string) { const dir = os.tmpdir(); const id = crypto.randomBytes(20).toString('hex'); const destLocation = path.join(dir, 'require-check', id); await fs.promises.mkdir(destLocation, {recursive: true}); const destPkg = path.join(destLocation, 'package.json'); await fs.promises.writeFile( destPkg, JSON.stringify(RequireCheck.template, null, 2) ); modLocation = path.resolve(modLocation); const modStat = await fs.promises.lstat(modLocation); if (!modStat.isDirectory()) { throw new Error('module path is not a directory'); } const pkgLocation = path.join(modLocation, 'package.json'); const pkgStat = await fs.promises.lstat(pkgLocation); if (!pkgStat.isFile()) { throw new Error('package.json is not present in module'); } const pkgRaw = await fs.promises.readFile(pkgLocation, 'utf-8'); const pkg = JSON.parse(pkgRaw); await RequireCheck.npmInstall(modLocation, destLocation); await RequireCheck.requireModule(pkg, destLocation); await RequireCheck.rmdir(destLocation); } static async cli(process: NodeJS.Process) { const modLocation = process.argv.slice(2)[0]; try { if (typeof modLocation !== 'string') { throw new Error('invalid module location'); } await RequireCheck.check(modLocation); process.stdout.write('success, module passed required check\n'); process.exit(0); } catch (e) { process.stderr.write(`${e.message}\n`); process.exit(1); } } } |