pdftest
Version:
Client-side visual testing library for PDFs
100 lines (84 loc) • 3.25 kB
JavaScript
const { program } = require('commander')
const fs = require('fs')
const path = require('path')
const pdftest = require('../dist/pdftest.cjs.js')
const pkg = require('../package.json')
const datastore = path.resolve(__dirname, 'data.json');
program.version(pkg.version, '-v, --version')
program
.command('serve [port] [root]')
.description('Serve PDF files')
.option('--limit <file-size>', 'File size limit (default="100mb")')
.option('--silent', 'Silent mode')
.option('--debug', 'Debug mode')
.action(serve)
program
.command('start [port] [root]')
.description('Start a PDF server (non-blocking)')
.option('--limit <file-size>', 'File size limit (default="100mb")')
.option('--silent', 'Silent mode')
.option('--debug', 'Debug mode')
.action(start)
program
.command('stop [port]')
.description('Stop a PDF server created by pdftest start')
.option('--silent', 'Silent mode')
.action(stop)
program
.command('compare <file1> <file2>')
.description('Compare two PDF files')
.option('--silent', 'Silent mode')
.action(compare)
program.parse(process.argv)
async function compare(file1, file2, options) {
// TODO: Update pdftest.compare for Node compatibility:
// - avoid reference to File
// - use `npm install --save canvas`
// - see example:
// https://github.com/mozilla/pdf.js/blob/master/examples/node/pdf2png/pdf2png.js
const cleanedOptions = { verbose: !options.silent }
const data = [file1, file2].map(filename => {
return new Uint8Array(fs.readFileSync(filename))
})
const res = await pdftest.client.compare(data[0], data[1], cleanedOptions)
console.log(res)
}
function serve(port, root, options) {
const cleanedOptions = { limit: options.limit, verbose: !options.silent };
return pdftest.server.serve(port, root, cleanedOptions).catch(console.error)
}
function start(port = 'default (8000)', root, options) {
const { spawn } = require('child_process')
stop(port, options)
// Pass command-line arguments through to 'serve'.
const args = process.argv.slice(process.argv.indexOf('start') + 1);
!options.silent && console.log(`pdftest: Starting server on port ${port}`)
const serverProcess = spawn('node', [__filename, 'serve', ...args], {
stdio: options.debug ? 'pipe' : 'ignore',
detached: true,
})
serverProcess.unref()
if (options.debug) {
serverProcess.stdin.pipe(process.stdin)
serverProcess.stdout.pipe(process.stdout)
serverProcess.stderr.pipe(process.stderr)
}
const data = fs.existsSync(datastore) ? JSON.parse(fs.readFileSync(datastore) || '{}') : {}
data[port] = { pid: serverProcess.pid }
fs.writeFileSync(datastore, JSON.stringify(data))
}
function stop(port = 'all', options) {
const data = fs.existsSync(datastore) ? JSON.parse(fs.readFileSync(datastore) || '{}') : {}
const ports = port === 'all' ? Object.keys(data) : [ port ];
let anyChange = false;
ports.forEach(port => {
if (data[port]) {
!options.silent && console.log(`pdftest: Stopping server on port ${port}`)
try { process.kill(data[port].pid) } catch {}
delete data[port]
anyChange = true
}
});
anyChange && fs.writeFileSync(datastore, JSON.stringify(data))
}