aboutsummaryrefslogtreecommitdiffstats
path: root/packages/monorepo-scripts/src/postpublish_utils.ts
blob: a36408ccd5991a17d553a848a90cb6239ab57c7d (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { execAsync } from 'async-child-process';
import * as promisify from 'es6-promisify';
import * as _ from 'lodash';
import * as publishRelease from 'publish-release';
import semverSort = require('semver-sort');

import { utils } from './utils';

const publishReleaseAsync = promisify(publishRelease);
const githubPersonalAccessToken = process.env.GITHUB_PERSONAL_ACCESS_TOKEN_0X_JS;
const generatedDocsDirectoryName = 'generated_docs';

export interface TagAndVersion {
    tag: string;
    version: string;
}

export const postpublishUtils = {
    async getLatestTagAndVersionAsync(subPackageName: string): Promise<TagAndVersion> {
        const subPackagePrefix = `${subPackageName}@`;
        const gitTagsCommand = `git tag -l "${subPackagePrefix}*"`;
        const result = await execAsync(gitTagsCommand);
        if (!_.isEmpty(result.stderr)) {
            throw new Error(result.stderr);
        }
        const tags = result.stdout.trim().split('\n');
        const versions = tags.map((tag: string) => {
            return tag.slice(subPackagePrefix.length);
        });
        const sortedVersions = semverSort.desc(versions);
        const latestVersion = sortedVersions[0];
        const latestTag = subPackagePrefix + latestVersion;
        return {
            tag: latestTag,
            version: latestVersion,
        };
    },
    async publishReleaseNotesAsync(tag: string, releaseName: string, assets: string[]) {
        utils.log('POSTPUBLISH: Releasing ', releaseName, '...');
        return publishReleaseAsync({
            token: githubPersonalAccessToken,
            owner: '0xProject',
            repo: '0x.js',
            tag,
            name: releaseName,
            notes: 'N/A',
            draft: false,
            prerelease: false,
            reuseRelease: true,
            reuseDraftOnly: false,
            assets,
        });
    },
    getReleaseName(subPackageName: string, version: string): string {
        const releaseName = `${subPackageName} v${version}`;
        return releaseName;
    },
    async standardPostPublishAsync(subPackageName: string): Promise<void> {
        const result: TagAndVersion = await this.getLatestTagAndVersionAsync(subPackageName);
        const releaseName = this.getReleaseName(subPackageName, result.version);
        const assets: string[] = [];
        await this.publishReleaseNotesAsync(result.tag, releaseName, assets);
    },
    adjustFileIncludePaths(fileIncludes: string[], cwd: string): string[] {
        const fileIncludesAdjusted = _.map(fileIncludes, fileInclude => {
            let path;
            if (_.startsWith(fileInclude, '../')) {
                path = `${cwd}/../${fileInclude}`;
            } else if (_.startsWith(fileInclude, './')) {
                path = `${cwd}/../${fileInclude.substr(2)}`;
            } else {
                path = `${cwd}/${fileInclude}`;
            }

            // HACK: tsconfig.json needs wildcard directory endings as `/**/*`
            // but TypeDoc needs it as `/**` in order to pick up files at the root
            if (_.endsWith(path, '/**/*')) {
                path = path.slice(0, -2);
            }
            return path;
        });
        return fileIncludesAdjusted;
    },
    async generateAndUploadDocsAsync(
        dirname: string,
        cwd: string,
        includedFiles: string[],
        version: string,
        S3BucketPath: string,
    ) {
        const jsonFilePath = `${dirname}/../${postpublishUtils.generatedDocsDirectoryName}/index.json`;
        const projectFiles = includedFiles.join(' ');
        const result = await execAsync(
            `JSON_FILE_PATH=${jsonFilePath} PROJECT_FILES="${projectFiles}" yarn docs:json`,
            {
                cwd,
            },
        );
        if (!_.isEmpty(result.stderr)) {
            throw new Error(result.stderr);
        }
        const fileName = `v${version}.json`;
        utils.log(`POSTPUBLISH: Doc generation successful, uploading docs... as ${fileName}`);
        const s3Url = S3BucketPath + fileName;
        await execAsync(`S3_URL=${s3Url} yarn upload_docs_json`, {
            cwd,
        });
        utils.log(`POSTPUBLISH: Docs uploaded to S3 bucket: ${S3BucketPath}`);
    },
    generatedDocsDirectoryName,
};