@@ -29,6 +29,26 @@ function getGitHubUrl(): string {
2929 return setting
3030}
3131
32+ type SlackMappingConfigurationItem = {
33+ domain : string
34+ channel : string
35+ team : string
36+ }
37+
38+ function getTeamMappingSlack ( ) {
39+ const setting =
40+ vscode . workspace
41+ . getConfiguration ( )
42+ . get < Array < SlackMappingConfigurationItem > > (
43+ "github-code-owners.team-mapping.slack" ,
44+ ) ?? [ ]
45+ const mapping : Record < string , SlackMappingConfigurationItem | undefined > = { }
46+ for ( const team of setting ) {
47+ mapping [ team . team ] = team
48+ }
49+ return mapping
50+ }
51+
3252/**
3353 * Add links to usernames in CODEOWNERS file that open on GitHub.
3454 */
@@ -38,6 +58,7 @@ export class GitHubUsernamesLinkProvider
3858 provideDocumentLinks (
3959 document : vscode . TextDocument ,
4060 ) : vscode . ProviderResult < vscode . DocumentLink [ ] > {
61+ const slackTeamMapping = getTeamMappingSlack ( )
4162 const links = [ ]
4263 for ( const range of findUsernameRanges ( document ) ) {
4364 if ( range ) {
@@ -52,9 +73,25 @@ export class GitHubUsernamesLinkProvider
5273 range ,
5374 githubUserToUrl ( username . replace ( / ^ @ / , "" ) ) ,
5475 )
55- link . tooltip = `View ${ username } on Github`
56-
76+ link . tooltip = `Open ${ username } on Github`
5777 links . push ( link )
78+
79+ const slackMapping = slackTeamMapping [ username ]
80+ if ( slackMapping ) {
81+ const linkslack = new vscode . DocumentLink (
82+ range ,
83+ // https://api.slack.com/reference/deep-linking
84+ // https://acme-corp.slack.com/channels/eng-frontend
85+ vscode . Uri . parse (
86+ `https://${
87+ slackMapping . domain
88+ } /app_redirect?channel=${ slackMapping . channel . replace ( / ^ # / , "" ) } `,
89+ ) ,
90+ )
91+ linkslack . tooltip = `Open ${ slackMapping . channel } on Slack`
92+
93+ links . push ( linkslack )
94+ }
5895 }
5996 }
6097 return links
0 commit comments