@salesforce/plugin-release-management
Version:
A plugin for preparing and publishing npm packages
81 lines • 3.79 kB
JavaScript
/*
* Copyright (c) 2023, salesforce.com, inc.
* All rights reserved.
* Licensed under the BSD 3-Clause license.
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
import { Messages } from '@salesforce/core';
import { Octokit } from '@octokit/core';
import { throttling } from '@octokit/plugin-throttling';
import { ensureString, isObject } from '@salesforce/ts-types';
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
const messages = Messages.loadMessages('@salesforce/plugin-release-management', 'github.check.closed');
export default class GithubCheckClosed extends SfCommand {
static summary = messages.getMessage('summary');
static description = messages.getMessage('description');
static examples = messages.getMessages('examples');
static flags = {
gus: Flags.requiredOrg({
summary: messages.getMessage('flags.gus.summary'),
required: true,
}),
'github-token': Flags.string({
summary: messages.getMessage('flags.github-token.summary'),
env: 'GITHUB_TOKEN',
required: true,
}),
};
async run() {
const { flags } = await this.parse(GithubCheckClosed);
const ThrottledOctokit = Octokit.plugin(throttling);
const octokit = new ThrottledOctokit({
auth: flags['github-token'],
throttle: {
onRateLimit: () => true,
onSecondaryRateLimit: () => true,
},
});
// search open issues for W- in any comments
const issues = await octokit.request('GET /search/issues', {
q: 'is:open is:issue repo:forcedotcom/cli W- in:comments',
});
// get all comments for those issues
const commentsWithWI = (await Promise.all(issues.data.items.map((issue) => octokit.request('GET /repos/{owner}/{repo}/issues/{issue_number}/comments', {
// eslint-disable-next-line camelcase
issue_number: issue.number,
owner: 'forcedotcom',
repo: 'cli',
}))))
// comment includes W-
.map((issueComments) => issueComments.data.find((comment) => comment.body?.includes('W-')))
.filter(isObject)
// extract url and WI number
.map((comment) => ({ issueUrl: comment?.issue_url, workItem: comment?.body?.match(/W-[0-9]{8,9}/g) }))
.filter((item) => item.workItem?.length)
.map((item) => ({ issueUrl: item.issueUrl, workItem: item.workItem?.[0] }))
.filter((item) => typeof item.issueUrl === 'string' && typeof item.workItem === 'string');
const wiToQuery = commentsWithWI.map((item) => item.workItem);
// query all those WI in GUS, and turn into a Map
const wiQueryResult = new Map((await flags.gus
// eslint-disable-next-line sf-plugin/get-connection-with-version
.getConnection()
.sobject('ADM_Work__c')
.find({ Name: { $in: wiToQuery } })).map((item) => [item.Name, item.Status__c]));
// join GH and GUS results
const results = commentsWithWI
.map((item) => ({
...item,
status: ensureString(wiQueryResult.get(item.workItem)),
issueUrl: item.issueUrl.replace('api.', '').replace('repos/', ''),
}))
.filter((item) => item.status);
this.table({
data: results,
columns: [{ key: 'issueUrl', name: 'github issue' }, { key: 'workItem', name: 'work item' }, 'status'],
sort: { status: 'asc' },
});
return results;
}
}
//# sourceMappingURL=closed.js.map