UNPKG

redhot

Version:

TypeScript Monorepo Management

100 lines (86 loc) 3.29 kB
const { join } = require('path') const findConfig = require('find-config') const { exec, getRelative, logSeparator, isInitialized } = require('../util') exports.build = function build (program, config, workingDir) { program .command('build') .option('-o, --only <packageName>', 'Run the build only for a particular package') .description('Builds all managed projects with TypeScript') .action(options => buildLikeABoss(config, workingDir, options)) } function buildLikeABoss (config, workingDir, options) { isInitialized(config) const packages = options.only ? config.packages.filter(p => p === options.only) : config.packages packages.forEach(function (packageName) { const packageDir = join(workingDir, packageName) const tsconfig = findConfig.require('tsconfig.json', { home: false, cwd: packageDir }) const files = tsconfig.files.join(' ') const commonjs = commonjsOptions(tsconfig) const es2015 = es2015Options(tsconfig) const relative = getRelative(packageName) const bin = `${relative}/node_modules/.bin` const cmd = config => `${bin}/test ${config} ${files}` Promise.all([ exec(cmd(commonjs), { silent: true, cwd: packageDir }, () => logSeparator(packageName)), exec(cmd(es2015), { silent: true, cwd: packageDir }) ]).then(() => { console.log(` Successfully completed build of ${packageName}`) logSeparator() }).catch(err => console.error(err) || logSeparator()) }) } function commonjsOptions (tsconfig) { return buildOptions( Object.assign({}, tsconfig, { compilerOptions: Object.assign({}, tsconfig.compilerOptions, { target: 'commonjs', module: 'ES5', outDir: 'lib/' }) }).compilerOptions ) } function es2015Options (tsconfig) { return buildOptions( Object.assign({}, tsconfig, { compilerOptions: Object.assign({}, tsconfig.compilerOptions, { target: 'es2015', module: 'es2015', outDir: 'lib/' }) }).compilerOptions ) } const booleanOptions = [ 'allowJs', 'allowSyntheticDefaultImports', 'allowUnreachableCode', 'allowUnusedLabels', 'declaration', 'diagnostics', 'emitBOM', 'emitsDecoratorMetadata', 'experimentalDecorators', 'forceConsistentCasingInFileNames', 'inlineSourceMap', 'inlineSources', 'isolatedModules', 'listFiles', 'noEmit', 'noEmitHelpers', 'noEmitOnError', 'noFallthroughCasesInSwitch', 'noImplicitAny', 'noImplicitReturns', 'noImplicitThis', 'noImplicitUseString', 'noLib', 'noResolve', 'noUnusedLocals', 'noUnusedParameters', 'preserveConstEnums', 'pretty', 'removeComments', 'skipDefaultLibCheck', 'sourceMap', 'strictNullChecks', 'stripInternal', 'suppressExcessPropertyErrors', 'suppressImplicitAnyErrors', 'traceResolution' ] function buildOptions (compilerOptions) { let options = '' for (const option in compilerOptions) { const value = compilerOptions[option] if (booleanOptions.indexOf(option) > -1) { if (value) { options += ' --' + option } } else { if (Array.isArray(value)) { if (value.length === 0) continue options += ' --' + option + ' ' + value.join(',') } else { options += ' --' + option + ' ' + value } } } return options }