#!/usr/bin/env node import * as fs from 'fs'; import lernaGetPackages = require('lerna-get-packages'); import * as _ from 'lodash'; import * as path from 'path'; import { exec as execAsync } from 'promisify-child-process'; import * as rimraf from 'rimraf'; import { utils } from './utils'; (async () => { const monorepoRootPath = path.join(__dirname, '../../..'); const lernaPackages = lernaGetPackages(monorepoRootPath); const installablePackages = _.filter( lernaPackages, lernaPackage => !lernaPackage.package.private && !_.isUndefined(lernaPackage.package.main) && lernaPackage.package.main.endsWith('.js'), ); for (const installableLernaPackage of installablePackages) { const packagePath = installableLernaPackage.location; const packageName = installableLernaPackage.package.name; utils.log(`Testing ${packageName}`); let result = await execAsync('npm pack', { cwd: packagePath }); const packedPackageFileName = result.stdout.trim(); const testDirectory = path.join(monorepoRootPath, '../test-env'); fs.mkdirSync(testDirectory); result = await execAsync('yarn init --yes', { cwd: testDirectory }); utils.log(`Installing ${packedPackageFileName}`); result = await execAsync(`yarn add ${packagePath}/${packedPackageFileName}`, { cwd: testDirectory }); const indexFilePath = path.join(testDirectory, 'index.ts'); fs.writeFileSync(indexFilePath, `import * as Package from '${packageName}'`); const tsConfig = { compilerOptions: { module: 'commonjs', target: 'es5', lib: ['es2017', 'dom'], declaration: true, noImplicitReturns: true, pretty: true, strict: true, }, include: ['index.ts'], }; const tsconfigFilePath = path.join(testDirectory, 'tsconfig.json'); fs.writeFileSync(tsconfigFilePath, JSON.stringify(tsConfig, null, 4)); utils.log(`Compiling ${packageName}`); await execAsync('../node_modules/typescript/bin/tsc', { cwd: testDirectory }); utils.log(`Successfully compiled with ${packageName} as a dependency`); rimraf.sync(testDirectory); } })().catch(err => { utils.log(err.stdout); process.exit(1); });