aboutsummaryrefslogtreecommitdiffstats
path: root/packages/monorepo-scripts/src/test_installation.ts
blob: d1f5ce65559baeeb4b2a80bd7fdf69bf413faf74 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env node

import * as fs from 'fs';
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/utils';

(async () => {
    const IS_LOCAL_PUBLISH = process.env.IS_LOCAL_PUBLISH === 'true';
    const registry = IS_LOCAL_PUBLISH ? 'http://localhost:4873/' : 'https://registry.npmjs.org/';
    const monorepoRootPath = path.join(__dirname, '../../..');
    const packages = utils.getTopologicallySortedPackages(monorepoRootPath);
    const preInstallablePackages = _.filter(
        packages,
        pkg => !pkg.packageJson.private && !_.isUndefined(pkg.packageJson.main) && pkg.packageJson.main.endsWith('.js'),
    );
    utils.log('Testing packages:');
    const installablePackages = _.filter(preInstallablePackages, pkg => {
        return pkg.packageJson.name === '0x.js';
    });
    _.map(installablePackages, pkg => utils.log(`* ${pkg.packageJson.name}`));
    for (const installablePackage of installablePackages) {
        const changelogPath = path.join(installablePackage.location, 'CHANGELOG.json');
        const lastChangelogVersion = JSON.parse(fs.readFileSync(changelogPath).toString())[0].version;
        const packageName = installablePackage.packageJson.name;
        utils.log(`Testing ${packageName}@${lastChangelogVersion}`);
        const testDirectory = path.join(monorepoRootPath, '../test-env');
        rimraf.sync(testDirectory);
        fs.mkdirSync(testDirectory);
        await execAsync('yarn init --yes', { cwd: testDirectory });
        const npmrcFilePath = path.join(testDirectory, '.npmrc');
        fs.writeFileSync(npmrcFilePath, `registry=${registry}`);
        utils.log(`Installing ${packageName}@${lastChangelogVersion}`);
        await execAsync(`npm install --save ${packageName}@${lastChangelogVersion} --registry=${registry}`, {
            cwd: testDirectory,
        });
        const indexFilePath = path.join(testDirectory, 'index.ts');
        fs.writeFileSync(indexFilePath, `import * as Package from '${packageName}';\nconsole.log(Package);\n`);
        const tsConfig = {
            compilerOptions: {
                typeRoots: ['node_modules/@0xproject/typescript-typings/types', 'node_modules/@types'],
                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, '\t'));
        utils.log(`Compiling ${packageName}`);
        const tscBinaryPath = path.join(monorepoRootPath, './node_modules/typescript/bin/tsc');
        await execAsync(tscBinaryPath, { cwd: testDirectory });
        utils.log(`Successfully compiled with ${packageName} as a dependency`);
        const transpiledIndexFilePath = path.join(testDirectory, 'index.js');
        utils.log(`Running test script with ${packageName} imported`);
        await execAsync(`node ${transpiledIndexFilePath}`);
        utils.log(`Successfilly ran test script with ${packageName} imported`);
        rimraf.sync(testDirectory);
    }
})().catch(err => {
    utils.log(err.stderr);
    utils.log(err.stdout);
    process.exit(1);
});