forked from cliffordfajardo/baretest
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.js
More file actions
executable file
·60 lines (50 loc) · 2.01 KB
/
cli.js
File metadata and controls
executable file
·60 lines (50 loc) · 2.01 KB
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
#!/usr/bin/env node
import { run } from './beartest.js'
import { promises } from 'node:fs'
import { sep, resolve, isAbsolute, parse, relative } from 'node:path'
const INCLUDE = ['**/*.{test,spec}.{js,ts,jsx,tsx}']
const EXCLUDE = ['**/node_modules/**', '**/dist/**', '**/.git/**', '**/build/**', '**/coverage/**']
const hasGlob = (s) => /[*?\[\]{}()!]/.test(s)
const norm = (p) => p.split(sep).join('/')
async function discoverAll() {
const seen = new Set()
for (const pat of INCLUDE) {
for await (const f of promises.glob(pat, { ignore: EXCLUDE })) seen.add(norm(f))
}
return [...seen].sort()
}
async function applyFilters(files, args) {
if (!args.length) return files
let out = files
for (const arg of args) {
if (hasGlob(arg)) {
const gset = new Set()
for await (const f of promises.glob(arg, { ignore: EXCLUDE })) gset.add(norm(f))
out = out.filter((f) => gset.has(f)) // glob filter
} else {
const needle = norm(arg)
out = out.filter((f) => f.includes(needle)) // substring filter
}
}
return out
}
async function cli() {
const discovered = await discoverAll()
const selected = await applyFilters(discovered, process.argv.slice(2))
for await (let event of run({ files: selected.map((f) => resolve(f)) })) {
const prefix = ' '.repeat(event.data.nesting)
if (event.type === 'test:start' && event.data.type === 'suite') {
if (isAbsolute(event.data.name)) {
console.log(`\x1b[36m${prefix}${parse(event.data.name).name} (${relative('./', event.data.name)})\x1b[0m`)
} else {
console.log(`\x1b[36m${prefix}${event.data.name}\x1b[0m`)
}
} else if (event.type === 'test:pass' && event.data.details.type === 'test' && !event.data.skip) {
process.stdout.write(`\x1b[32m${prefix}✓\x1b[0m\x1b[90m ${event.data.name}\n\x1b[0m`)
} else if (event.type === 'test:fail' && event.data.details.type === 'test') {
process.stdout.write(`\x1b[31m\n${prefix}✗ ${event.data.name} \n\n\x1b[0m`)
}
}
process.exit(0)
}
cli()