Skip to content

Commit 829d97e

Browse files
committed
Adds strong-typing for ContextKeys
1 parent 0c03c6f commit 829d97e

File tree

10 files changed

+81
-72
lines changed

10 files changed

+81
-72
lines changed

src/annotations/annotationProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export abstract class AnnotationProviderBase<TContext extends AnnotationContext
7575
return this._status;
7676
}
7777

78-
get statusContextValue(): string | undefined {
78+
get statusContextValue(): `${AnnotationStatus}+${FileAnnotationType}` | undefined {
7979
return this.status != null ? `${this.status}+${this.annotationType}` : undefined;
8080
}
8181

src/commands/git/search.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ export class SearchGitCommand extends QuickCommand<State> {
138138
repos: this.container.git.openRepositories,
139139
associatedView: this.container.searchAndCompareView,
140140
commit: undefined,
141-
hasVirtualFolders: getContext<boolean>('gitlens:hasVirtualFolders', false),
141+
hasVirtualFolders: getContext('gitlens:hasVirtualFolders', false),
142142
resultsKey: undefined,
143143
resultsPromise: undefined,
144144
title: this.title,

src/commands/git/stash.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ export class StashGitCommand extends QuickCommand<State> {
189189
repos: this.container.git.openRepositories,
190190
associatedView: this.container.stashesView,
191191
readonly:
192-
getContext<boolean>('gitlens:readonly', false) ||
193-
getContext<boolean>('gitlens:untrusted', false) ||
194-
getContext<boolean>('gitlens:hasVirtualFolders', false),
192+
getContext('gitlens:readonly', false) ||
193+
getContext('gitlens:untrusted', false) ||
194+
getContext('gitlens:hasVirtualFolders', false),
195195
title: this.title,
196196
};
197197

src/commands/gitCommands.utils.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,9 @@ export class PickCommandStep implements QuickPickStep<QuickCommand> {
5858
private readonly container: Container,
5959
args?: GitCommandsCommandArgs,
6060
) {
61-
const hasVirtualFolders = getContext<boolean>('gitlens:hasVirtualFolders', false);
61+
const hasVirtualFolders = getContext('gitlens:hasVirtualFolders', false);
6262
const readonly =
63-
hasVirtualFolders ||
64-
getContext<boolean>('gitlens:readonly', false) ||
65-
getContext<boolean>('gitlens:untrusted', false);
63+
hasVirtualFolders || getContext('gitlens:readonly', false) || getContext('gitlens:untrusted', false);
6664

6765
this.items = [
6866
readonly ? undefined : new BranchGitCommand(container, args?.command === 'branch' ? args : undefined),

src/constants.ts

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import type { AnthropicModels } from './ai/anthropicProvider';
22
import type { GeminiModels } from './ai/geminiProvider';
33
import type { OpenAIModels } from './ai/openaiProvider';
44
import type { VSCodeAIModels } from './ai/vscodeProvider';
5-
import type { ViewShowBranchComparison } from './config';
5+
import type { AnnotationStatus } from './annotations/annotationProvider';
6+
import type { FileAnnotationType, ViewShowBranchComparison } from './config';
67
import type { Environment } from './container';
78
import type { StoredSearchQuery } from './git/search';
8-
import type { Subscription, SubscriptionState } from './plus/gk/account/subscription';
9+
import type { Subscription, SubscriptionPlanId, SubscriptionState } from './plus/gk/account/subscription';
910
import type { Integration } from './plus/integrations/integration';
1011
import type { IntegrationId, IssueIntegrationId } from './plus/integrations/providers/models';
1112
import type { TelemetryEventData } from './telemetry/telemetry';
@@ -669,46 +670,46 @@ export type TreeViewNodeTypes =
669670
| 'worktree'
670671
| 'worktrees';
671672

672-
export type ContextKeys =
673-
| `${typeof extensionPrefix}:action:${string}`
674-
| `${typeof extensionPrefix}:key:${Keys}`
675-
| `${typeof extensionPrefix}:webview:${WebviewTypes | CustomEditorTypes}:visible`
676-
| `${typeof extensionPrefix}:webviewView:${WebviewViewTypes}:visible`
677-
| `${typeof extensionPrefix}:activeFileStatus`
678-
| `${typeof extensionPrefix}:annotationStatus`
679-
| `${typeof extensionPrefix}:debugging`
680-
| `${typeof extensionPrefix}:disabledToggleCodeLens`
681-
| `${typeof extensionPrefix}:disabled`
682-
| `${typeof extensionPrefix}:enabled`
683-
| `${typeof extensionPrefix}:gk:hasOrganizations`
684-
| `${typeof extensionPrefix}:gk:organization:ai:enabled`
685-
| `${typeof extensionPrefix}:gk:organization:drafts:byob`
686-
| `${typeof extensionPrefix}:gk:organization:drafts:enabled`
687-
| `${typeof extensionPrefix}:hasConnectedRemotes`
688-
| `${typeof extensionPrefix}:hasRemotes`
689-
| `${typeof extensionPrefix}:hasRichRemotes`
690-
| `${typeof extensionPrefix}:hasVirtualFolders`
691-
| `${typeof extensionPrefix}:prerelease`
692-
| `${typeof extensionPrefix}:readonly`
693-
| `${typeof extensionPrefix}:untrusted`
694-
| `${typeof extensionPrefix}:views:canCompare`
695-
| `${typeof extensionPrefix}:views:canCompare:file`
696-
| `${typeof extensionPrefix}:views:commits:filtered`
697-
| `${typeof extensionPrefix}:views:commits:hideMergeCommits`
698-
| `${typeof extensionPrefix}:views:contributors:hideMergeCommits`
699-
| `${typeof extensionPrefix}:views:fileHistory:canPin`
700-
| `${typeof extensionPrefix}:views:fileHistory:cursorFollowing`
701-
| `${typeof extensionPrefix}:views:fileHistory:editorFollowing`
702-
| `${typeof extensionPrefix}:views:lineHistory:editorFollowing`
703-
| `${typeof extensionPrefix}:views:patchDetails:mode`
704-
| `${typeof extensionPrefix}:views:pullRequest:visible`
705-
| `${typeof extensionPrefix}:views:repositories:autoRefresh`
706-
| `${typeof extensionPrefix}:vsls`
707-
| `${typeof extensionPrefix}:plus`
708-
| `${typeof extensionPrefix}:plus:disallowedRepos`
709-
| `${typeof extensionPrefix}:plus:enabled`
710-
| `${typeof extensionPrefix}:plus:required`
711-
| `${typeof extensionPrefix}:plus:state`;
673+
export type ContextKeys = {
674+
'gitlens:activeFileStatus': string;
675+
'gitlens:annotationStatus': AnnotationStatus | `${AnnotationStatus}+${FileAnnotationType}`;
676+
'gitlens:debugging': boolean;
677+
'gitlens:disabled': boolean;
678+
'gitlens:disabledToggleCodeLens': boolean;
679+
'gitlens:enabled': boolean;
680+
'gitlens:gk:hasOrganizations': boolean;
681+
'gitlens:gk:organization:ai:enabled': boolean;
682+
'gitlens:gk:organization:drafts:byob': boolean;
683+
'gitlens:gk:organization:drafts:enabled': boolean;
684+
'gitlens:hasConnectedRemotes': boolean;
685+
'gitlens:hasRemotes': boolean;
686+
'gitlens:hasRichRemotes': boolean;
687+
'gitlens:hasVirtualFolders': boolean;
688+
'gitlens:plus': SubscriptionPlanId;
689+
'gitlens:plus:disallowedRepos': string[];
690+
'gitlens:plus:enabled': boolean;
691+
'gitlens:plus:required': boolean;
692+
'gitlens:plus:state': SubscriptionState;
693+
'gitlens:prerelease': boolean;
694+
'gitlens:readonly': boolean;
695+
'gitlens:untrusted': boolean;
696+
'gitlens:views:canCompare': boolean;
697+
'gitlens:views:canCompare:file': boolean;
698+
'gitlens:views:commits:filtered': boolean;
699+
'gitlens:views:commits:hideMergeCommits': boolean;
700+
'gitlens:views:contributors:hideMergeCommits': boolean;
701+
'gitlens:views:fileHistory:canPin': boolean;
702+
'gitlens:views:fileHistory:cursorFollowing': boolean;
703+
'gitlens:views:fileHistory:editorFollowing': boolean;
704+
'gitlens:views:lineHistory:editorFollowing': boolean;
705+
'gitlens:views:patchDetails:mode': 'create' | 'view';
706+
'gitlens:views:pullRequest:visible': boolean;
707+
'gitlens:views:repositories:autoRefresh': boolean;
708+
'gitlens:vsls': boolean | 'host' | 'guest';
709+
} & Record<`gitlens:action:${string}`, number> &
710+
Record<`gitlens:key:${Keys}`, boolean> &
711+
Record<`gitlens:webview:${WebviewTypes | CustomEditorTypes}:visible`, boolean> &
712+
Record<`gitlens:webviewView:${WebviewViewTypes}:visible`, boolean>;
712713

713714
export type CoreCommands =
714715
| 'cursorMove'

src/plus/webviews/patchDetails/patchDetailsWebview.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ export class PatchDetailsWebviewProvider
346346
};
347347
}
348348

349-
private onContextChanged(key: ContextKeys) {
349+
private onContextChanged(key: keyof ContextKeys) {
350350
if (['gitlens:gk:organization:ai:enabled', 'gitlens:gk:organization:drafts:enabled'].includes(key)) {
351351
this._context.orgSettings = this.getOrgSettings();
352352
this.updateState();
@@ -355,8 +355,8 @@ export class PatchDetailsWebviewProvider
355355

356356
private getOrgSettings(): State['orgSettings'] {
357357
return {
358-
ai: getContext<boolean>('gitlens:gk:organization:ai:enabled', false),
359-
byob: getContext<boolean>('gitlens:gk:organization:drafts:byob', false),
358+
ai: getContext('gitlens:gk:organization:ai:enabled', false),
359+
byob: getContext('gitlens:gk:organization:drafts:byob', false),
360360
};
361361
}
362362

src/system/context.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,31 @@ import { EventEmitter } from 'vscode';
22
import type { ContextKeys } from '../constants';
33
import { executeCoreCommand } from './command';
44

5-
const contextStorage = new Map<string, unknown>();
5+
const contextStorage = new Map<keyof ContextKeys, unknown>();
66

7-
const _onDidChangeContext = new EventEmitter<ContextKeys>();
7+
const _onDidChangeContext = new EventEmitter<keyof ContextKeys>();
88
export const onDidChangeContext = _onDidChangeContext.event;
99

10-
export function getContext<T>(key: ContextKeys): T | undefined;
11-
export function getContext<T>(key: ContextKeys, defaultValue: T): T;
12-
export function getContext<T>(key: ContextKeys, defaultValue?: T): T | undefined {
13-
return (contextStorage.get(key) as T | undefined) ?? defaultValue;
10+
export function getContext<T extends keyof ContextKeys>(key: T): ContextKeys[T] | undefined;
11+
export function getContext<T extends keyof ContextKeys>(key: T, defaultValue: ContextKeys[T]): ContextKeys[T];
12+
export function getContext<T extends keyof ContextKeys>(
13+
key: T,
14+
defaultValue?: ContextKeys[T],
15+
): ContextKeys[T] | undefined {
16+
return (contextStorage.get(key) as ContextKeys[T] | undefined) ?? defaultValue;
1417
}
1518

16-
export async function setContext(key: ContextKeys, value: unknown): Promise<void> {
19+
export async function setContext<T extends keyof ContextKeys>(
20+
key: T,
21+
value: ContextKeys[T] | undefined,
22+
): Promise<void> {
1723
if (contextStorage.get(key) === value) return;
1824

19-
contextStorage.set(key, value);
20-
void (await executeCoreCommand('setContext', key, value));
25+
if (value == null) {
26+
contextStorage.delete(key);
27+
} else {
28+
contextStorage.set(key, value);
29+
}
30+
void (await executeCoreCommand('setContext', key, value ?? undefined));
2131
_onDidChangeContext.fire(key);
2232
}

src/webviews/commitDetails/commitDetailsWebview.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ export class CommitDetailsWebviewProvider
893893
};
894894
}
895895

896-
private onContextChanged(key: ContextKeys) {
896+
private onContextChanged(key: keyof ContextKeys) {
897897
if (['gitlens:gk:organization:ai:enabled', 'gitlens:gk:organization:drafts:enabled'].includes(key)) {
898898
this.updatePendingContext({ orgSettings: this.getOrgSettings() });
899899
this.updateState();
@@ -902,8 +902,8 @@ export class CommitDetailsWebviewProvider
902902

903903
private getOrgSettings(): State['orgSettings'] {
904904
return {
905-
ai: getContext<boolean>('gitlens:gk:organization:ai:enabled', false),
906-
drafts: getContext<boolean>('gitlens:gk:organization:drafts:enabled', false),
905+
ai: getContext('gitlens:gk:organization:ai:enabled', false),
906+
drafts: getContext('gitlens:gk:organization:drafts:enabled', false),
907907
};
908908
}
909909

@@ -1265,7 +1265,7 @@ export class CommitDetailsWebviewProvider
12651265
private async canAccessDrafts(): Promise<boolean> {
12661266
if ((await this.getHasAccount()) === false) return false;
12671267

1268-
return getContext<boolean>('gitlens:gk:organization:drafts:enabled', false);
1268+
return getContext('gitlens:gk:organization:drafts:enabled', false);
12691269
}
12701270

12711271
private async getCodeSuggestions(pullRequest: PullRequest, repository: Repository): Promise<Draft[]> {

src/webviews/home/homeWebview.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,11 @@ export class HomeWebviewProvider implements WebviewProvider<State> {
9292

9393
private getOrgSettings(): State['orgSettings'] {
9494
return {
95-
drafts: getContext<boolean>('gitlens:gk:organization:drafts:enabled', false),
95+
drafts: getContext('gitlens:gk:organization:drafts:enabled', false),
9696
};
9797
}
9898

99-
private onContextChanged(key: ContextKeys) {
99+
private onContextChanged(key: keyof ContextKeys) {
100100
if (key === 'gitlens:gk:organization:drafts:enabled') {
101101
this.notifyDidChangeOrgSettings();
102102
}

src/webviews/welcome/welcomeWebview.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ export class WelcomeWebviewProvider implements WebviewProvider<State> {
5050

5151
private getOrgSettings(): State['orgSettings'] {
5252
return {
53-
ai: getContext<boolean>('gitlens:gk:organization:ai:enabled', false),
54-
drafts: getContext<boolean>('gitlens:gk:organization:drafts:enabled', false),
53+
ai: getContext('gitlens:gk:organization:ai:enabled', false),
54+
drafts: getContext('gitlens:gk:organization:drafts:enabled', false),
5555
};
5656
}
5757

58-
private onContextChanged(key: ContextKeys) {
58+
private onContextChanged(key: keyof ContextKeys) {
5959
if (['gitlens:gk:organization:ai:enabled', 'gitlens:gk:organization:drafts:enabled'].includes(key)) {
6060
this.notifyDidChangeOrgSettings();
6161
}

0 commit comments

Comments
 (0)