redhot
Version:
TypeScript Monorepo Management
70 lines (52 loc) • 1.71 kB
JavaScript
const { join } = require('path')
const { readdirSync } = require('fs')
const { isDirectory, isInitialized } = require('../util')
const Mocha = require('mocha')
exports.test = function test (program, config, workingDir) {
program
.command('test')
.option('-o, --only <packageName>', 'Run linting in a single package')
.description('Runs tests in all managed packages')
.action(options => testLikeABoss(config, workingDir, options))
}
function testLikeABoss (config, workingDir, options) {
isInitialized(config)
const packages = options.only
? config.packages.filter(p => p === options.only)
: config.packages
if (packages.length === 0) {
if (options.only) {
return console.log('Cannot find package ' + options.only)
}
return console.log('Cannot find any packages to test :(')
}
const tsconfig = require(join(workingDir, 'tsconfig.json'))
// this registers how to load .ts files
require('ts-node').register(tsconfig)
packages.forEach(function (packageName) {
const packageDir = join(workingDir, packageName)
const testDir = join(packageDir, 'test/')
runTests(testDir)
})
}
function runTests (testDir) {
const files = getAllTSFilesInDirectory(testDir)
const mocha = new Mocha()
files.forEach(function (file) {
mocha.addFile(file)
})
mocha.run()
}
function getAllTSFilesInDirectory (dir) {
let files = []
readdirSync(dir).filter(function (file) {
const abspath = join(dir, file)
if (isDirectory(abspath)) {
files.push(...getAllTSFilesInDirectory(abspath))
}
if (file.substr(-3) === '.ts' || file.substr(-4) === '.tsx') {
return files.push(abspath)
}
})
return files
}