|
| 1 | +#!/usr/bin/env node |
| 2 | + |
| 3 | +const resolvePath = require('path').resolve |
| 4 | +const subarg = require('subarg') |
| 5 | +const glob = require('glob') |
| 6 | +const browserify = require('browserify') |
| 7 | +const fromArgs = require('browserify/bin/args') |
| 8 | +const run = require('tape-run') |
| 9 | +const pump = require('pump') |
| 10 | +const pkg = require('./package.json') |
| 11 | + |
| 12 | +let args = process.argv.slice(2) |
| 13 | + |
| 14 | +const opts = subarg(args, { |
| 15 | + '--': true, |
| 16 | + default: { |
| 17 | + ignore: ['node_modules/**', '.git/**'] |
| 18 | + }, |
| 19 | + alias: { |
| 20 | + version: ['v'], |
| 21 | + help: ['h'] |
| 22 | + } |
| 23 | +}) |
| 24 | + |
| 25 | +if (opts.help) { |
| 26 | + console.log(`Usage: |
| 27 | + vhs-tape '**/*.vhs.js' [opts] --tape-run [tape-run opts] -- [browserify opts] |
| 28 | +
|
| 29 | +Options: |
| 30 | + --help, -h show help message |
| 31 | + --version show version |
| 32 | + --tape-run tape-run subargs |
| 33 | + --ignore file globs to ignore default: 'node_modules/** .git/**' |
| 34 | + -- [browserify options] raw flags to pass to browserify`) |
| 35 | + process.exit(0) |
| 36 | +} |
| 37 | + |
| 38 | +if (opts.version) { |
| 39 | + console.log(`vhs-tape v${pkg.version}`) |
| 40 | + process.exit(0) |
| 41 | +} |
| 42 | + |
| 43 | +if (opts._.length < 1) { |
| 44 | + opts._.push('**/*.vhs.js') |
| 45 | +} |
| 46 | + |
| 47 | +const cwd = process.cwd() |
| 48 | + |
| 49 | +const fileSet = new Set() |
| 50 | + |
| 51 | +opts._.forEach(function (arg) { |
| 52 | + // If glob does not match, `files` will be an empty array. |
| 53 | + // Note: `glob.sync` may throw an error and crash the node process. |
| 54 | + var files = glob.sync(arg, { |
| 55 | + ignore: opts.ignore |
| 56 | + }) |
| 57 | + |
| 58 | + if (!Array.isArray(files)) { |
| 59 | + throw new TypeError('unknown error: glob.sync did not return an array or throw. Please report this.') |
| 60 | + } |
| 61 | + |
| 62 | + files.forEach(function (file) { |
| 63 | + fileSet.add(resolvePath(cwd, file)) |
| 64 | + }) |
| 65 | +}) |
| 66 | + |
| 67 | +if (Array.from(fileSet).length < 1) { |
| 68 | + console.error('No tests found') |
| 69 | + process.exit(1) |
| 70 | +} |
| 71 | + |
| 72 | +const browserifyArgs = opts['--'] |
| 73 | +const tapeRunOpts = opts['tape-run'] |
| 74 | + |
| 75 | +let bundler |
| 76 | +if (browserifyArgs && Array.isArray(browserifyArgs)) { |
| 77 | + // CLI args for browserify |
| 78 | + bundler = fromArgs(browserifyArgs, { |
| 79 | + entries: Array.from(fileSet) |
| 80 | + }) |
| 81 | +} else { |
| 82 | + // just assume JS only options |
| 83 | + bundler = browserify(Array.from(fileSet)) |
| 84 | +} |
| 85 | + |
| 86 | +const tapeRun = run(tapeRunOpts) |
| 87 | +tapeRun.on('results', (results) => { |
| 88 | + process.exit(Number(!results.ok)) |
| 89 | +}) |
| 90 | + |
| 91 | +pump(bundler.bundle(), tapeRun, process.stdout, (err) => { |
| 92 | + if (err) { |
| 93 | + console.error(err) |
| 94 | + process.exit(1) |
| 95 | + } |
| 96 | +}) |
0 commit comments