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 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) await test.run(consolereporter(), total) } console.log(total.msg()) } export { suite }