forked from jasonnutter/vscode-codeowners
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathgithub-usernames-link-provider.ts
More file actions
76 lines (69 loc) · 2.17 KB
/
github-usernames-link-provider.ts
File metadata and controls
76 lines (69 loc) · 2.17 KB
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
import vscode from "vscode"
import { findUsernameRanges } from "./owner-name-completion-item-provider"
import {
SlackMappingConfigurationItem,
getGitHubUrl,
getTeamMappingSlack,
} from "./configuration"
function githubUserToUrl(username: string): vscode.Uri {
const isTeamName = username.includes("/")
const gitHubUrl = getGitHubUrl()
if (isTeamName) {
const [org, name] = username.split(/\//)
return vscode.Uri.parse(gitHubUrl + `/orgs/${org}/teams/${name}`)
}
return vscode.Uri.parse(gitHubUrl + `/${username}`)
}
function buildMappingSlack() {
const setting = getTeamMappingSlack()
const mapping: Record<string, SlackMappingConfigurationItem | undefined> = {}
for (const team of setting) {
mapping[team.username] = team
}
return mapping
}
/**
* Add links to usernames in CODEOWNERS file that open on GitHub.
*/
export class GitHubUsernamesLinkProvider
implements vscode.DocumentLinkProvider
{
provideDocumentLinks(
document: vscode.TextDocument,
): vscode.ProviderResult<vscode.DocumentLink[]> {
const slackTeamMapping = buildMappingSlack()
const links = []
for (const range of findUsernameRanges(document)) {
if (range) {
const username = document.getText(range)
// don't make emails clickable
// e.g. docs@example.com
if (!username.startsWith("@")) {
continue
}
const link = new vscode.DocumentLink(
range,
githubUserToUrl(username.replace(/^@/, "")),
)
link.tooltip = `Open ${username} on Github`
links.push(link)
const slackMapping = slackTeamMapping[username]
if (slackMapping) {
const linkslack = new vscode.DocumentLink(
range,
// https://api.slack.com/reference/deep-linking
// https://acme-corp.slack.com/channels/eng-frontend
vscode.Uri.parse(
`https://${
slackMapping.domain
}/app_redirect?channel=${slackMapping.channel.replace(/^#/, "")}`,
),
)
linkslack.tooltip = `Open ${slackMapping.channel} on Slack`
links.push(linkslack)
}
}
}
return links
}
}