60 lines
1.5 KiB
JavaScript
60 lines
1.5 KiB
JavaScript
|
import { readdir } from 'node:fs/promises'
|
||
|
import { join } from 'node:path'
|
||
|
const walkDir = async function* (dir) {
|
||
|
const files = await readdir(dir, { withFileTypes: true })
|
||
|
|
||
|
for (const file of files) {
|
||
|
if (file.isDirectory()) {
|
||
|
yield* walkDir(join(dir, file.name))
|
||
|
} else {
|
||
|
yield join(dir, file.name)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
import { fileURLToPath } from 'node:url'
|
||
|
import { dirname } from 'node:path'
|
||
|
const getStackAbsolutePaths = () => {
|
||
|
const old = Error.prepareStackTrace
|
||
|
Error.prepareStackTrace = (_, stack) => stack
|
||
|
const stack = new Error().stack
|
||
|
Error.prepareStackTrace = old
|
||
|
|
||
|
return stack
|
||
|
.map(cs => cs.getFileName())
|
||
|
.filter(filename => filename?.startsWith('file://'))
|
||
|
.map(filename => dirname(fileURLToPath(filename)))
|
||
|
}
|
||
|
|
||
|
import { consolereporter, totalreporter } from 'metaltest'
|
||
|
const suite = async (folder = '.') => {
|
||
|
const absolutePaths = getStackAbsolutePaths()
|
||
|
const absolutePath = absolutePaths[2]
|
||
|
const fileIgnored = []
|
||
|
|
||
|
const total = totalreporter()
|
||
|
|
||
|
for await (const file of walkDir(folder)) {
|
||
|
if (file.includes('node_modules')) continue
|
||
|
if (file.startsWith('.git')) continue
|
||
|
if (!file.endsWith('test.js')) continue
|
||
|
|
||
|
const module = join(absolutePath, file)
|
||
|
const { test } = await import(module)
|
||
|
|
||
|
if (test === undefined) {
|
||
|
fileIgnored.push(file)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
await test.run(consolereporter(), total)
|
||
|
}
|
||
|
|
||
|
for (const file of fileIgnored) {
|
||
|
console.log(`The file ${file} doesn't export the metaltest object`)
|
||
|
}
|
||
|
|
||
|
console.log(total.msg())
|
||
|
}
|
||
|
|
||
|
export { suite }
|