Skip to content

Commit 952f033

Browse files
Merge branch 'main' into robertbrignull/always_trigger_monitoring
2 parents 12d5255 + bf1e3c1 commit 952f033

31 files changed

+245
-57
lines changed

extensions/ql-vscode/.eslintignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.vscode-test/
2+
node_modules/
3+
out/
4+
5+
# Include the Storybook config
6+
!.storybook

extensions/ql-vscode/.eslintrc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module.exports = {
33
parserOptions: {
44
ecmaVersion: 2018,
55
sourceType: "module",
6-
project: ["tsconfig.json", "./src/**/tsconfig.json", "./gulpfile.ts/tsconfig.json"],
6+
project: ["tsconfig.json", "./src/**/tsconfig.json", "./gulpfile.ts/tsconfig.json", "./scripts/tsconfig.json", "./.storybook/tsconfig.json"],
77
},
88
plugins: ["@typescript-eslint"],
99
env: {

extensions/ql-vscode/.storybook/preview.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import '@vscode/codicons/dist/codicon.css';
77
// https://storybook.js.org/docs/react/configure/overview#configure-story-rendering
88
export const parameters = {
99
// All props starting with `on` will automatically receive an action as a prop
10-
actions: { argTypesRegex: "^on[A-Z].*" },
10+
actions: { argTypesRegex: '^on[A-Z].*' },
1111
// All props matching these names will automatically get the correct control
1212
controls: {
1313
matchers: {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export function config(entry = []) {
2-
return [...entry, require.resolve("./preview.ts")];
2+
return [...entry, require.resolve('./preview.ts')];
33
}
44

55
export function managerEntries(entry = []) {
6-
return [...entry, require.resolve("./manager.tsx")];
6+
return [...entry, require.resolve('./manager.tsx')];
77
}

extensions/ql-vscode/.storybook/vscode-theme-addon/theme.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ export enum VSCodeTheme {
66
export const themeNames: { [key in VSCodeTheme]: string } = {
77
[VSCodeTheme.Dark]: 'Dark+',
88
[VSCodeTheme.Light]: 'Light+',
9-
}
9+
};

extensions/ql-vscode/.storybook/vscode-theme-addon/withTheme.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import type { AnyFramework, PartialStoryFn as StoryFunction, StoryContext } from
44
import { VSCodeTheme } from './theme';
55

66
const themeFiles: { [key in VSCodeTheme]: string } = {
7+
// eslint-disable-next-line @typescript-eslint/no-var-requires
78
[VSCodeTheme.Dark]: require('!file-loader?modules!../../src/stories/vscode-theme-dark.css').default,
9+
// eslint-disable-next-line @typescript-eslint/no-var-requires
810
[VSCodeTheme.Light]: require('!file-loader?modules!../../src/stories/vscode-theme-light.css').default,
9-
}
11+
};
1012

1113
export const withTheme = (
1214
StoryFn: StoryFunction<AnyFramework>,
@@ -18,7 +20,7 @@ export const withTheme = (
1820
const styleSelectorId =
1921
context.viewMode === 'docs'
2022
? `addon-vscode-theme-docs-${context.id}`
21-
: `addon-vscode-theme-theme`;
23+
: 'addon-vscode-theme-theme';
2224

2325
const theme = Object.values(VSCodeTheme).includes(vscodeTheme) ? vscodeTheme as VSCodeTheme : VSCodeTheme.Dark;
2426

extensions/ql-vscode/package.json

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"onLanguage:ql",
3838
"onLanguage:ql-summary",
3939
"onView:codeQLDatabases",
40+
"onView:codeQLDatabasesExperimental",
4041
"onView:codeQLQueryHistory",
4142
"onView:codeQLAstViewer",
4243
"onView:codeQLEvalLogViewer",
@@ -1208,6 +1209,11 @@
12081209
"id": "codeQLDatabases",
12091210
"name": "Databases"
12101211
},
1212+
{
1213+
"id": "codeQLDatabasesExperimental",
1214+
"name": "Databases",
1215+
"when": "config.codeQL.canary && config.codeQL.newQueryRunExperience"
1216+
},
12111217
{
12121218
"id": "codeQLQueryHistory",
12131219
"name": "Query History"
@@ -1254,8 +1260,8 @@
12541260
"integration": "node ./out/vscode-tests/run-integration-tests.js no-workspace,minimal-workspace",
12551261
"cli-integration": "npm run preintegration && node ./out/vscode-tests/run-integration-tests.js cli-integration",
12561262
"update-vscode": "node ./node_modules/vscode/bin/install",
1257-
"format": "tsfmt -r && eslint src test --ext .ts,.tsx --fix",
1258-
"lint": "eslint src test --ext .ts,.tsx --max-warnings=0",
1263+
"format": "tsfmt -r && eslint . --ext .ts,.tsx --fix",
1264+
"lint": "eslint . --ext .ts,.tsx --max-warnings=0",
12591265
"format-staged": "lint-staged",
12601266
"storybook": "start-storybook -p 6006",
12611267
"build-storybook": "build-storybook",
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"$schema": "https://json.schemastore.org/tsconfig",
3+
"extends": "../tsconfig.json",
4+
"include": ["**/*.ts"],
5+
"exclude": []
6+
}

extensions/ql-vscode/src/abstract-webview.ts

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
ViewColumn,
66
Uri,
77
WebviewPanelOptions,
8-
WebviewOptions
8+
WebviewOptions,
99
} from 'vscode';
1010
import * as path from 'path';
1111

@@ -27,6 +27,8 @@ export abstract class AbstractWebview<ToMessage extends WebviewMessage, FromMess
2727
protected panelLoaded = false;
2828
protected panelLoadedCallBacks: (() => void)[] = [];
2929

30+
private panelResolves?: Array<(panel: WebviewPanel) => void>;
31+
3032
constructor(
3133
protected readonly ctx: ExtensionContext
3234
) {
@@ -35,20 +37,36 @@ export abstract class AbstractWebview<ToMessage extends WebviewMessage, FromMess
3537

3638
public async restoreView(panel: WebviewPanel): Promise<void> {
3739
this.panel = panel;
38-
this.setupPanel(panel);
40+
const config = await this.getPanelConfig();
41+
this.setupPanel(panel, config);
3942
}
4043

4144
protected get isShowingPanel() {
4245
return !!this.panel;
4346
}
4447

45-
protected getPanel(): WebviewPanel {
48+
protected async getPanel(): Promise<WebviewPanel> {
4649
if (this.panel == undefined) {
4750
const { ctx } = this;
4851

49-
const config = this.getPanelConfig();
52+
// This is an async method, so in theory this method can be called concurrently. To ensure that we don't
53+
// create two panels, we use a promise that resolves when the panel is created. This way, if the panel is
54+
// being created, the promise will resolve when it is done.
55+
if (this.panelResolves !== undefined) {
56+
return new Promise((resolve) => {
57+
if (this.panel !== undefined) {
58+
resolve(this.panel);
59+
return;
60+
}
61+
62+
this.panelResolves?.push(resolve);
63+
});
64+
}
65+
this.panelResolves = [];
66+
67+
const config = await this.getPanelConfig();
5068

51-
this.panel = Window.createWebviewPanel(
69+
const panel = Window.createWebviewPanel(
5270
config.viewId,
5371
config.title,
5472
{ viewColumn: config.viewColumn, preserveFocus: config.preserveFocus },
@@ -64,14 +82,17 @@ export abstract class AbstractWebview<ToMessage extends WebviewMessage, FromMess
6482
],
6583
}
6684
);
67-
this.setupPanel(this.panel);
85+
this.panel = panel;
86+
87+
this.setupPanel(panel, config);
88+
89+
this.panelResolves.forEach((resolve) => resolve(panel));
90+
this.panelResolves = undefined;
6891
}
6992
return this.panel;
7093
}
7194

72-
protected setupPanel(panel: WebviewPanel): void {
73-
const config = this.getPanelConfig();
74-
95+
protected setupPanel(panel: WebviewPanel, config: WebviewPanelConfig): void {
7596
this.push(
7697
panel.onDidDispose(
7798
() => {
@@ -101,7 +122,7 @@ export abstract class AbstractWebview<ToMessage extends WebviewMessage, FromMess
101122
);
102123
}
103124

104-
protected abstract getPanelConfig(): WebviewPanelConfig;
125+
protected abstract getPanelConfig(): WebviewPanelConfig | Promise<WebviewPanelConfig>;
105126

106127
protected abstract onPanelDispose(): void;
107128

@@ -123,8 +144,9 @@ export abstract class AbstractWebview<ToMessage extends WebviewMessage, FromMess
123144
this.panelLoadedCallBacks = [];
124145
}
125146

126-
protected postMessage(msg: ToMessage): Thenable<boolean> {
127-
return this.getPanel().webview.postMessage(msg);
147+
protected async postMessage(msg: ToMessage): Promise<boolean> {
148+
const panel = await this.getPanel();
149+
return panel.webview.postMessage(msg);
128150
}
129151

130152
public dispose(disposeHandler?: DisposeHandler) {

extensions/ql-vscode/src/compare/compare-view.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ export class CompareView extends AbstractWebview<ToCompareViewMessage, FromCompa
4646
selectedResultSetName?: string
4747
) {
4848
this.comparePair = { from, to };
49-
this.getPanel().reveal(undefined, true);
49+
const panel = await this.getPanel();
50+
panel.reveal(undefined, true);
5051

5152
await this.waitForPanelLoaded();
5253
const [

0 commit comments

Comments
 (0)