@plugjs/expect5
Version:
Unit Testing for the PlugJS Build System ========================================
123 lines (94 loc) • 4.32 kB
text/typescript
import { async, find, logging, paths, pipe } from '@plugjs/plug'
import { main, yargsParser } from '@plugjs/tsrun'
import { Test } from './test'
const { $blu, $und, $gry, $wht } = logging
const $gnd = (s: string): string => $gry($und(s))
const $bnd = (s: string): string => $blu($und(s))
const $wnd = (s: string): string => $wht($und(s))
/** Version injected by esbuild, defaulted in case of dynamic transpilation */
const version = typeof __version === 'string' ? __version : '0.0.0-dev'
declare const __version: string | undefined
/* ========================================================================== *
* HELP SCREEN *
* ========================================================================== */
/** Show help screen */
function help(): void {
// eslint-disable-next-line no-console
console.log(`${$blu($und('Usage:'))}
${$wht('expect5')} ${$gry('[')}--options${$gry('] [...')}globs${$gry('...]')}
${$bnd('Options:')}
${$wht('-d --directory')} ${$gnd('dir')} Directory where tests are to be found
${$wht('-h --help ')} Help! You're reading it now!
${$wht(' --version ')} Version! This one: ${version}!
${$bnd('Globs:')}
Other arguments will be treated as globs, used to match test files in
the specified directory (defaults to the current directory).
If no globs are specified, the default will be to find all JavaScript
and TypeScript files in the ${$wnd('./test')} directory, prefixed by the ${$wnd('.test')}
extension ${$gry('(for example')} ${$und('foobar.test.ts')}${$gry(')')}.
${$bnd('Environment Variables:')}
${$wht('LOG_LEVEL ')} The default ${$wnd('notice')}, or ${$gnd('debug')}, ${$gnd('info')}, ${$gnd('warn')} or ${$gnd('error')}.
${$wht('NODE_V8_COVERAGE')} The directory where Node will write coverage data to.
${$bnd('TypeScript module format:')}
Normally our TypeScript loader will transpile ${$wnd('.ts')} files to the type
specified in ${$wnd('package.json')}, either ${$wnd('commonjs')} (the default) or ${$wnd('module')}.
To force a specific module format use one of the following flags:
${$wht('--force-esm')} Force transpilation of ${$wnd('.ts')} files to EcmaScript modules
${$wht('--force-cjs')} Force transpilation of ${$wnd('.ts')} files to CommonJS modules
`)
process.exit(0)
}
/* ========================================================================== *
* MAIN TEST RUNNER *
* ========================================================================== */
/** Parse command line and run tests */
main(import.meta.url, async (args): Promise<void> => {
logging.logOptions.spinner = false
const filename = paths.requireFilename(import.meta.url) // self, for context
const context = new pipe.Context(filename, '') // context for pipes
let directory = '.' // default directory to CWD
const globs: string[] = [] // empty globs list
const parsed = yargsParser(args, {
configuration: {
'camel-case-expansion': false,
'strip-aliased': true,
'strip-dashed': true,
},
alias: {
'directory': [ 'd' ],
'help': [ 'h' ],
},
string: [ 'directory' ],
boolean: [ 'help', 'version' ],
})
for (const [ key, value ] of Object.entries(parsed)) {
switch (key) {
case '_': // globs as args
globs.push(...value)
break
case 'directory':
directory = context.resolve(value)
break
case 'help':
return help()
case 'version':
return context.log.notice(`Expect5 ${$gry('ver.')} ${$wnd(version)}`)
default:
context.log.error(`Unsupported option ${$wnd(key)} (try ${$wnd('--help')})`)
process.exit(1)
}
}
// Default glob (all .test.xx files in the test directory)
const glob = globs.shift() || 'test/**/*.test.([cm])?[jt]s'
// Simply create the Test plug and pass everything to it
try {
process.exitCode = 0
await async.runAsync(context, () => {
return find(glob, ...globs, { directory }).plug(new Test())
})
} catch (error) {
context.log.error(error)
process.exit(1)
}
})