Compare commits

...

157 Commits

Author SHA1 Message Date
Koen Vlaswinkel
82e98c5d5a Merge pull request #3939 from github/github-action/bump-cli
Some checks failed
Build Storybook / build (push) Has been cancelled
Code Scanning - CodeQL / codeql (actions) (push) Has been cancelled
Code Scanning - CodeQL / codeql (javascript) (push) Has been cancelled
Run E2E Playwright tests / E2E Test (push) Has been cancelled
Build Extension / Build (ubuntu-latest) (push) Has been cancelled
Build Extension / Build (windows-latest) (push) Has been cancelled
Build Extension / Lint (push) Has been cancelled
Build Extension / Check generated code (push) Has been cancelled
Build Extension / Unit Test (ubuntu-latest) (push) Has been cancelled
Build Extension / Unit Test (windows-latest) (push) Has been cancelled
Build Extension / Test (ubuntu-latest) (push) Has been cancelled
Build Extension / Test (windows-latest) (push) Has been cancelled
Build Extension / Get latest CLI version (push) Has been cancelled
Build Storybook / deploy (push) Has been cancelled
Build Extension / CLI Test (ubuntu-latest) (push) Has been cancelled
Build Extension / CLI Test (windows-latest) (push) Has been cancelled
Bump CLI Version to v2.20.5 for integration tests
2025-02-21 09:54:25 +01:00
Angela P Wen
56ca7fb705 Merge pull request #3934 from github/dependabot/docker/extensions/ql-vscode/test/e2e/docker/codercom/code-server-4.97.2
Bump codercom/code-server from 4.96.4 to 4.97.2 in /extensions/ql-vscode/test/e2e/docker
2025-02-20 11:18:46 -08:00
Nora
7c2cce9e10 Merge branch 'main' into dependabot/docker/extensions/ql-vscode/test/e2e/docker/codercom/code-server-4.97.2 2025-02-20 17:40:11 +01:00
Nora
0b10736527 Merge pull request #3938 from github/nora/add-workflow-dispatch-to-e2e-tests
Add workflow dispatch to e2e tests
2025-02-20 17:39:53 +01:00
github-actions[bot]
3b8cf1ad7c Bump CLI version from v2.20.4 to v2.20.5 for integration tests 2025-02-20 15:38:46 +00:00
Nora
24ec26f17e Add workflow dispatch to e2e tests 2025-02-20 14:29:23 +00:00
Nora
95374c6401 Merge pull request #3935 from github/dependabot/npm_and_yarn/extensions/ql-vscode/octokit-579ad91fd7
Bump the octokit group in /extensions/ql-vscode with 2 updates
2025-02-20 15:25:00 +01:00
Nora
c62afadff8 Merge pull request #3936 from github/dependabot/npm_and_yarn/extensions/ql-vscode/storybook-a4341f8bf6
Bump the storybook group in /extensions/ql-vscode with 12 updates
2025-02-20 15:23:51 +01:00
Nora
0e396012d3 Merge pull request #3937 from github/dependabot/npm_and_yarn/extensions/ql-vscode/typescript-eslint-8f52371f03
Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
2025-02-20 15:23:17 +01:00
dependabot[bot]
bbc9054c64 Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
Bumps the typescript-eslint group in /extensions/ql-vscode with 2 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).


Updates `@typescript-eslint/eslint-plugin` from 8.24.0 to 8.24.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.24.1/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.24.0 to 8.24.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.24.1/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: typescript-eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: typescript-eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-20 13:43:05 +00:00
dependabot[bot]
ece53b8b58 Bump the storybook group in /extensions/ql-vscode with 12 updates
Bumps the storybook group in /extensions/ql-vscode with 12 updates:

| Package | From | To |
| --- | --- | --- |
| [@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y) | `8.5.5` | `8.5.8` |
| [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/actions) | `8.5.5` | `8.5.8` |
| [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.5.5` | `8.5.8` |
| [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.5.5` | `8.5.8` |
| [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.5.5` | `8.5.8` |
| [@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks) | `8.5.5` | `8.5.8` |
| [@storybook/components](https://github.com/storybookjs/storybook/tree/HEAD/code/deprecated/components) | `8.5.5` | `8.5.8` |
| [@storybook/manager-api](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/manager-api) | `8.5.5` | `8.5.8` |
| [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.5.5` | `8.5.8` |
| [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) | `8.5.5` | `8.5.8` |
| [@storybook/theming](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/theming) | `8.5.5` | `8.5.8` |
| [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli) | `8.5.5` | `8.5.8` |


Updates `@storybook/addon-a11y` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/addons/a11y)

Updates `@storybook/addon-actions` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/addons/actions)

Updates `@storybook/addon-essentials` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/addons/essentials)

Updates `@storybook/addon-interactions` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/addons/interactions)

Updates `@storybook/addon-links` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/addons/links)

Updates `@storybook/blocks` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/lib/blocks)

Updates `@storybook/components` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/deprecated/components)

Updates `@storybook/manager-api` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/lib/manager-api)

Updates `@storybook/react` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/renderers/react)

Updates `@storybook/react-vite` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/frameworks/react-vite)

Updates `@storybook/theming` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/lib/theming)

Updates `storybook` from 8.5.5 to 8.5.8
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.8/code/lib/cli)

---
updated-dependencies:
- dependency-name: "@storybook/addon-a11y"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-essentials"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-interactions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/blocks"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/components"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/manager-api"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react-vite"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/theming"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-20 13:42:30 +00:00
dependabot[bot]
579866bb2e Bump the octokit group in /extensions/ql-vscode with 2 updates
Bumps the octokit group in /extensions/ql-vscode with 2 updates: [@octokit/plugin-retry](https://github.com/octokit/plugin-retry.js) and [@octokit/rest](https://github.com/octokit/rest.js).


Updates `@octokit/plugin-retry` from 7.1.3 to 7.1.4
- [Release notes](https://github.com/octokit/plugin-retry.js/releases)
- [Commits](https://github.com/octokit/plugin-retry.js/compare/v7.1.3...v7.1.4)

Updates `@octokit/rest` from 21.1.0 to 21.1.1
- [Release notes](https://github.com/octokit/rest.js/releases)
- [Commits](https://github.com/octokit/rest.js/compare/v21.1.0...v21.1.1)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-retry"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: octokit
- dependency-name: "@octokit/rest"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: octokit
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-20 13:39:52 +00:00
Koen Vlaswinkel
31c708039f Merge pull request #3933 from github/koesie10/build-storybook
Add workflow for building and deploying Storybook
2025-02-20 14:39:04 +01:00
dependabot[bot]
7f260d42fd Bump codercom/code-server in /extensions/ql-vscode/test/e2e/docker
Bumps codercom/code-server from 4.96.4 to 4.97.2.

---
updated-dependencies:
- dependency-name: codercom/code-server
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-20 13:36:15 +00:00
Koen Vlaswinkel
cd2a8d6846 Merge pull request #3932 from github/koesie10/upgrade-vite-node
Upgrade to vite-node v3
2025-02-19 13:13:02 +01:00
Koen Vlaswinkel
7a3782510c Merge pull request #3930 from github/koesie10/fix-acorn
Fix package-lock.json to have `acorn` as a direct dependency
2025-02-19 13:12:47 +01:00
Koen Vlaswinkel
94e8283c00 Add workflow for building and deploying Storybook 2025-02-19 11:39:44 +01:00
Koen Vlaswinkel
24deccf779 Merge pull request #3931 from github/koesie10/fix-storybook
Fix Storybook build
2025-02-19 11:30:22 +01:00
Koen Vlaswinkel
b91b00ce64 Upgrade to vite-node v3 2025-02-19 10:40:55 +01:00
Koen Vlaswinkel
cf911233dc Fix package-lock.json to have acorn as a dependency 2025-02-19 09:56:16 +01:00
Koen Vlaswinkel
4f934b5670 Fix Storybook build 2025-02-19 09:53:47 +01:00
Andrew Eisenberg
cd9dc9dd51 Merge pull request #3929 from github/aeisenberg/more-permissions
More permissions changes
2025-02-14 10:21:34 -08:00
Andrew Eisenberg
b50a59fea4 More permissions changes
Just two things I missed before.
2025-02-14 18:06:10 +00:00
Andrew Eisenberg
93645dee57 Merge pull request #3927 from github/aeisenberg/add-permissions-actions
Add permissions block and actions analysis
2025-02-14 09:44:33 -08:00
Koen Vlaswinkel
18dba23d4f Merge pull request #3928 from github/github-action/bump-node-version
Bump Node version to v20.18.1
2025-02-14 13:44:47 +01:00
github-actions[bot]
5bc1b229e7 Bump Node version to v20.18.1 2025-02-14 12:26:08 +00:00
Koen Vlaswinkel
50aad9e071 Merge pull request #3899 from github/dependabot/npm_and_yarn/extensions/ql-vscode/octokit-c675e4ebdd
Bump the octokit group in /extensions/ql-vscode with 3 updates
2025-02-14 10:28:25 +01:00
dependabot[bot]
0bdd4c205a Bump the octokit group in /extensions/ql-vscode with 3 updates
Bumps the octokit group in /extensions/ql-vscode with 3 updates: [@octokit/plugin-retry](https://github.com/octokit/plugin-retry.js), [@octokit/plugin-throttling](https://github.com/octokit/plugin-throttling.js) and [@octokit/rest](https://github.com/octokit/rest.js).


Updates `@octokit/plugin-retry` from 7.1.2 to 7.1.3
- [Release notes](https://github.com/octokit/plugin-retry.js/releases)
- [Commits](https://github.com/octokit/plugin-retry.js/compare/v7.1.2...v7.1.3)

Updates `@octokit/plugin-throttling` from 9.3.2 to 9.4.0
- [Release notes](https://github.com/octokit/plugin-throttling.js/releases)
- [Commits](https://github.com/octokit/plugin-throttling.js/compare/v9.3.2...v9.4.0)

Updates `@octokit/rest` from 21.0.2 to 21.1.0
- [Release notes](https://github.com/octokit/rest.js/releases)
- [Commits](https://github.com/octokit/rest.js/compare/v21.0.2...v21.1.0)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-retry"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: octokit
- dependency-name: "@octokit/plugin-throttling"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: octokit
- dependency-name: "@octokit/rest"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: octokit
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-14 08:41:02 +00:00
Andrew Eisenberg
acc46cef30 Add permissions block and actions analysis
This change does two things. If it is complicated to review
I will split up.

First, this ensures that all workflows have minimal permissions
blocks. Second, this adds actions analysis.
2025-02-13 22:32:46 +00:00
Koen Vlaswinkel
e9003a07cd Merge pull request #3926 from github/dependabot/npm_and_yarn/extensions/ql-vscode/typescript-eslint-036bed0af0
Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
2025-02-13 14:54:56 +01:00
Koen Vlaswinkel
3e45c06dbf Merge pull request #3925 from github/dependabot/npm_and_yarn/extensions/ql-vscode/storybook-6994aaf8be
Bump the storybook group in /extensions/ql-vscode with 12 updates
2025-02-13 14:54:23 +01:00
dependabot[bot]
fab37f38f7 Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
Bumps the typescript-eslint group in /extensions/ql-vscode with 2 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).


Updates `@typescript-eslint/eslint-plugin` from 8.23.0 to 8.24.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.24.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.23.0 to 8.24.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.24.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-13 13:39:46 +00:00
dependabot[bot]
9d9ec0a288 Bump the storybook group in /extensions/ql-vscode with 12 updates
Bumps the storybook group in /extensions/ql-vscode with 12 updates:

| Package | From | To |
| --- | --- | --- |
| [@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y) | `8.5.3` | `8.5.5` |
| [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/actions) | `8.5.3` | `8.5.5` |
| [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.5.3` | `8.5.5` |
| [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.5.3` | `8.5.5` |
| [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.5.3` | `8.5.5` |
| [@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks) | `8.5.3` | `8.5.5` |
| [@storybook/components](https://github.com/storybookjs/storybook/tree/HEAD/code/deprecated/components) | `8.5.3` | `8.5.5` |
| [@storybook/manager-api](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/manager-api) | `8.5.3` | `8.5.5` |
| [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.5.3` | `8.5.5` |
| [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) | `8.5.3` | `8.5.5` |
| [@storybook/theming](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/theming) | `8.5.3` | `8.5.5` |
| [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli) | `8.5.3` | `8.5.5` |


Updates `@storybook/addon-a11y` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/addons/a11y)

Updates `@storybook/addon-actions` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/addons/actions)

Updates `@storybook/addon-essentials` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/addons/essentials)

Updates `@storybook/addon-interactions` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/addons/interactions)

Updates `@storybook/addon-links` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/addons/links)

Updates `@storybook/blocks` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/lib/blocks)

Updates `@storybook/components` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/deprecated/components)

Updates `@storybook/manager-api` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/lib/manager-api)

Updates `@storybook/react` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/renderers/react)

Updates `@storybook/react-vite` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/frameworks/react-vite)

Updates `@storybook/theming` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/lib/theming)

Updates `storybook` from 8.5.3 to 8.5.5
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.5/code/lib/cli)

---
updated-dependencies:
- dependency-name: "@storybook/addon-a11y"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-essentials"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-interactions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/blocks"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/components"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/manager-api"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react-vite"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/theming"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-13 13:39:13 +00:00
Koen Vlaswinkel
9763bbf48d Merge pull request #3924 from github/github-action/bump-node-version
Bump Node version to v20.18.1
2025-02-13 13:42:06 +01:00
github-actions[bot]
efa87ccdd7 Bump Node version to v20.18.1 2025-02-13 12:26:07 +00:00
Nora Dimitrijević
70cc4ed1ab Merge pull request #3923 from d10c/d10c/compare-performance-rtjo
ComparePerformance: fix crash in RTJO mode
2025-02-11 13:54:10 +01:00
Nora Dimitrijević
8102750f5c ComparePerformance: fix crash in RTJO mode
With `--dynamic-join-order-mode=all`, both `first` and `second` are
undefined, leading to a crash. Until RTJO mode gets proper tuple
counting, this change prevents a crash when unfurling the steps of a
predicate.
2025-02-11 12:21:06 +00:00
Koen Vlaswinkel
824bf308de Merge pull request #3922 from github/dependabot/npm_and_yarn/extensions/ql-vscode/typescript-eslint-9dae2f82d5
Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
2025-02-06 14:48:32 +01:00
Koen Vlaswinkel
84e37bf62b Merge pull request #3921 from github/dependabot/npm_and_yarn/extensions/ql-vscode/storybook-0fd4b30345
Bump the storybook group in /extensions/ql-vscode with 12 updates
2025-02-06 14:48:16 +01:00
dependabot[bot]
feb2cf1c86 Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
Bumps the typescript-eslint group in /extensions/ql-vscode with 2 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).


Updates `@typescript-eslint/eslint-plugin` from 8.22.0 to 8.23.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.23.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.22.0 to 8.23.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.23.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-06 13:18:27 +00:00
dependabot[bot]
fc37ba53b8 Bump the storybook group in /extensions/ql-vscode with 12 updates
Bumps the storybook group in /extensions/ql-vscode with 12 updates:

| Package | From | To |
| --- | --- | --- |
| [@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y) | `8.5.2` | `8.5.3` |
| [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/actions) | `8.5.2` | `8.5.3` |
| [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.5.2` | `8.5.3` |
| [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.5.2` | `8.5.3` |
| [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.5.2` | `8.5.3` |
| [@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks) | `8.5.2` | `8.5.3` |
| [@storybook/components](https://github.com/storybookjs/storybook/tree/HEAD/code/deprecated/components) | `8.5.2` | `8.5.3` |
| [@storybook/manager-api](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/manager-api) | `8.5.2` | `8.5.3` |
| [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.5.2` | `8.5.3` |
| [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) | `8.5.2` | `8.5.3` |
| [@storybook/theming](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/theming) | `8.5.2` | `8.5.3` |
| [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli) | `8.5.2` | `8.5.3` |


Updates `@storybook/addon-a11y` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/a11y)

Updates `@storybook/addon-actions` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/actions)

Updates `@storybook/addon-essentials` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/essentials)

Updates `@storybook/addon-interactions` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/interactions)

Updates `@storybook/addon-links` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/links)

Updates `@storybook/blocks` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/lib/blocks)

Updates `@storybook/components` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/deprecated/components)

Updates `@storybook/manager-api` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/lib/manager-api)

Updates `@storybook/react` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/renderers/react)

Updates `@storybook/react-vite` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/frameworks/react-vite)

Updates `@storybook/theming` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/lib/theming)

Updates `storybook` from 8.5.2 to 8.5.3
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.3/code/lib/cli)

---
updated-dependencies:
- dependency-name: "@storybook/addon-a11y"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-essentials"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-interactions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/blocks"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/components"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/manager-api"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react-vite"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/theming"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-06 13:17:53 +00:00
Koen Vlaswinkel
d0d292296f Merge pull request #3920 from github/github-action/bump-cli
Bump CLI Version to v2.20.4 for integration tests
2025-02-06 12:45:42 +01:00
github-actions[bot]
38d88f92d7 Bump CLI version from v2.20.3 to v2.20.4 for integration tests 2025-02-06 11:15:54 +00:00
Koen Vlaswinkel
5e5708d0b3 Merge pull request #3919 from github/github-action/bump-node-version
Bump Node version to v20.18.1
2025-02-04 13:47:24 +01:00
github-actions[bot]
e4933fd356 Bump Node version to v20.18.1 2025-02-04 12:26:12 +00:00
Robert
3d56b2c22d Merge pull request #3918 from github/dependabot/npm_and_yarn/extensions/ql-vscode/typescript-eslint-ba93ac6f42
Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
2025-01-30 16:12:17 +00:00
Robert
0bbe5f190e Merge pull request #3917 from github/dependabot/npm_and_yarn/extensions/ql-vscode/storybook-a069e3357d
Bump the storybook group in /extensions/ql-vscode with 13 updates
2025-01-30 16:11:03 +00:00
dependabot[bot]
f2ce32e5f2 Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
Bumps the typescript-eslint group in /extensions/ql-vscode with 2 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).


Updates `@typescript-eslint/eslint-plugin` from 8.21.0 to 8.22.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.22.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.21.0 to 8.22.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.22.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-30 14:02:25 +00:00
dependabot[bot]
dcb2b99fa7 Bump the storybook group in /extensions/ql-vscode with 13 updates
Bumps the storybook group in /extensions/ql-vscode with 13 updates:

| Package | From | To |
| --- | --- | --- |
| [@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y) | `8.5.1` | `8.5.2` |
| [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/actions) | `8.5.1` | `8.5.2` |
| [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.5.1` | `8.5.2` |
| [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.5.1` | `8.5.2` |
| [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.5.1` | `8.5.2` |
| [@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks) | `8.5.1` | `8.5.2` |
| [@storybook/components](https://github.com/storybookjs/storybook/tree/HEAD/code/deprecated/components) | `8.5.1` | `8.5.2` |
| [@storybook/icons](https://github.com/storybookjs/icons) | `1.3.1` | `1.3.2` |
| [@storybook/manager-api](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/manager-api) | `8.5.1` | `8.5.2` |
| [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.5.1` | `8.5.2` |
| [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) | `8.5.1` | `8.5.2` |
| [@storybook/theming](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/theming) | `8.5.1` | `8.5.2` |
| [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli) | `8.5.1` | `8.5.2` |


Updates `@storybook/addon-a11y` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/a11y)

Updates `@storybook/addon-actions` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/actions)

Updates `@storybook/addon-essentials` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/essentials)

Updates `@storybook/addon-interactions` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/interactions)

Updates `@storybook/addon-links` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/links)

Updates `@storybook/blocks` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/lib/blocks)

Updates `@storybook/components` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/deprecated/components)

Updates `@storybook/icons` from 1.3.1 to 1.3.2
- [Release notes](https://github.com/storybookjs/icons/releases)
- [Changelog](https://github.com/storybookjs/icons/blob/main/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/icons/compare/v1.3.1...v1.3.2)

Updates `@storybook/manager-api` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/lib/manager-api)

Updates `@storybook/react` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/renderers/react)

Updates `@storybook/react-vite` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/frameworks/react-vite)

Updates `@storybook/theming` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/lib/theming)

Updates `storybook` from 8.5.1 to 8.5.2
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/lib/cli)

---
updated-dependencies:
- dependency-name: "@storybook/addon-a11y"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-essentials"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-interactions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/blocks"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/components"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/icons"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/manager-api"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react-vite"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/theming"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-30 14:01:50 +00:00
Dave Bartolomeo
b790a81619 Merge pull request #3916 from github/github-action/bump-cli
Bump CLI Version to v2.20.3 for integration tests
2025-01-27 03:11:20 -05:00
github-actions[bot]
3e2d5c299e Bump CLI version from v2.20.2 to v2.20.3 for integration tests 2025-01-24 15:58:08 +00:00
Koen Vlaswinkel
4027b1d3aa Merge pull request #3915 from github/koesie10/simplify-bump-cli
Simplify usage of the bump CLI workflow
2025-01-24 13:20:28 +01:00
Andrew Eisenberg
588441d157 Merge pull request #3903 from slevithan/fix-regex
Fix regex in CodeQL TextMate grammar that was silently failing
2025-01-23 11:09:31 -08:00
Angela P Wen
a4a6e0283b Merge pull request #3913 from github/dependabot/docker/extensions/ql-vscode/test/e2e/docker/codercom/code-server-4.96.4
Bump codercom/code-server from 4.96.2 to 4.96.4 in /extensions/ql-vscode/test/e2e/docker
2025-01-23 09:09:55 -08:00
Angela P Wen
218e9c1e57 Merge pull request #3912 from github/dependabot/npm_and_yarn/extensions/ql-vscode/storybook-3fa07714dd
Bump the storybook group in /extensions/ql-vscode with 13 updates
2025-01-23 09:09:25 -08:00
Angela P Wen
e74e020a74 Merge pull request #3910 from github/dependabot/npm_and_yarn/extensions/ql-vscode/typescript-eslint-55638e145f
Bump the typescript-eslint group across 1 directory with 2 updates
2025-01-23 09:08:42 -08:00
Koen Vlaswinkel
7f35a4b7ed Simplify usage of the bump CLI workflow 2025-01-23 16:41:53 +01:00
Robert
f5435783c0 Merge pull request #3914 from github/version/bump-to-v1.17.2
Bump version to v1.17.2
2025-01-23 14:58:44 +00:00
Koen Vlaswinkel
de3cfc8797 Merge pull request #3909 from github/github-action/bump-node-version
Bump Node version to v20.18.1
2025-01-23 15:45:46 +01:00
github-actions[bot]
622d78a20a Bump version to v1.17.2 2025-01-23 14:19:03 +00:00
Robert
db9d60cf6b Merge pull request #3908 from github/v1.17.1
Release v1.17.1
2025-01-23 14:17:19 +00:00
dependabot[bot]
483932da1e Bump codercom/code-server in /extensions/ql-vscode/test/e2e/docker
Bumps codercom/code-server from 4.96.2 to 4.96.4.

---
updated-dependencies:
- dependency-name: codercom/code-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-23 13:48:16 +00:00
dependabot[bot]
b1b03be890 Bump the storybook group in /extensions/ql-vscode with 13 updates
Bumps the storybook group in /extensions/ql-vscode with 13 updates:

| Package | From | To |
| --- | --- | --- |
| [@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y) | `8.5.0` | `8.5.1` |
| [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/actions) | `8.5.0` | `8.5.1` |
| [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.5.0` | `8.5.1` |
| [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.5.0` | `8.5.1` |
| [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.5.0` | `8.5.1` |
| [@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks) | `8.5.0` | `8.5.1` |
| [@storybook/components](https://github.com/storybookjs/storybook/tree/HEAD/code/deprecated/components) | `8.5.0` | `8.5.1` |
| [@storybook/icons](https://github.com/storybookjs/icons) | `1.3.0` | `1.3.1` |
| [@storybook/manager-api](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/manager-api) | `8.5.0` | `8.5.1` |
| [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.5.0` | `8.5.1` |
| [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) | `8.5.0` | `8.5.1` |
| [@storybook/theming](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/theming) | `8.5.0` | `8.5.1` |
| [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli) | `8.5.0` | `8.5.1` |


Updates `@storybook/addon-a11y` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/addons/a11y)

Updates `@storybook/addon-actions` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/addons/actions)

Updates `@storybook/addon-essentials` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/addons/essentials)

Updates `@storybook/addon-interactions` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/addons/interactions)

Updates `@storybook/addon-links` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/addons/links)

Updates `@storybook/blocks` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/lib/blocks)

Updates `@storybook/components` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/deprecated/components)

Updates `@storybook/icons` from 1.3.0 to 1.3.1
- [Release notes](https://github.com/storybookjs/icons/releases)
- [Changelog](https://github.com/storybookjs/icons/blob/main/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/icons/compare/v1.3.0...v1.3.1)

Updates `@storybook/manager-api` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/lib/manager-api)

Updates `@storybook/react` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/renderers/react)

Updates `@storybook/react-vite` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/frameworks/react-vite)

Updates `@storybook/theming` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/lib/theming)

Updates `storybook` from 8.5.0 to 8.5.1
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.1/code/lib/cli)

---
updated-dependencies:
- dependency-name: "@storybook/addon-a11y"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-essentials"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-interactions"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/blocks"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/components"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/icons"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/manager-api"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/react-vite"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/theming"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-23 13:39:06 +00:00
dependabot[bot]
0d4e3ef617 Bump the typescript-eslint group across 1 directory with 2 updates
Bumps the typescript-eslint group with 2 updates in the /extensions/ql-vscode directory: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).


Updates `@typescript-eslint/eslint-plugin` from 8.19.0 to 8.21.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.21.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.19.0 to 8.21.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.21.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-23 13:36:37 +00:00
github-actions[bot]
3b0efb84b7 Bump Node version to v20.18.1 2025-01-23 12:26:12 +00:00
Robert
edc2fe8454 v1.17.1
Some checks failed
Release / Release (push) Has been cancelled
Release / Publish to VS Code Marketplace (push) Has been cancelled
Release / Publish to Open VSX Registry (push) Has been cancelled
2025-01-23 12:06:33 +00:00
Koen Vlaswinkel
427c6031fe Merge pull request #3907 from github/github-action/bump-cli
Bump CLI Version to v2.20.2 for integration tests
2025-01-23 11:11:14 +01:00
Koen Vlaswinkel
6687669aad Fix supported CLI versions file 2025-01-23 10:56:02 +01:00
github-actions[bot]
2d3b62a021 Bump CLI version from v2.20.1 to v2.20.2 for integration tests 2025-01-22 14:52:43 +00:00
Koen Vlaswinkel
f8d010ad10 Merge pull request #3906 from github/koesie10/update-release-docs
Update release docs
2025-01-22 11:40:21 +01:00
Koen Vlaswinkel
c35f927436 Update release docs 2025-01-22 11:24:58 +01:00
Asger F
ffed4b634f Merge pull request #3843 from asgerf/asgerf/compare-perf-view
Add 'compare performance' view
2025-01-22 11:01:59 +01:00
Koen Vlaswinkel
13389358ac Merge pull request #3905 from github/koesie10/upgrade-vite
Upgrade vite
2025-01-22 09:48:27 +01:00
Koen Vlaswinkel
60f392cceb Upgrade vite 2025-01-22 09:29:23 +01:00
Andrew Eisenberg
a6266bbcc8 Remove empty newliines 2025-01-20 09:49:31 -08:00
Koen Vlaswinkel
6f8d6f2541 Merge pull request #3904 from github/dependabot/npm_and_yarn/extensions/ql-vscode/npm_and_yarn-7064c9a8ac
Bump katex from 0.16.18 to 0.16.21 in /extensions/ql-vscode in the npm_and_yarn group
2025-01-20 10:40:52 +01:00
dependabot[bot]
3fbbf4045d Bump katex in /extensions/ql-vscode in the npm_and_yarn group
Bumps the npm_and_yarn group in /extensions/ql-vscode with 1 update: [katex](https://github.com/KaTeX/KaTeX).


Updates `katex` from 0.16.18 to 0.16.21
- [Release notes](https://github.com/KaTeX/KaTeX/releases)
- [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md)
- [Commits](https://github.com/KaTeX/KaTeX/compare/v0.16.18...v0.16.21)

---
updated-dependencies:
- dependency-name: katex
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 09:25:53 +00:00
Steven Levithan
7086d1b707 Fix regex in CodeQL TextMate grammar that was silently failing 2025-01-19 20:46:39 +01:00
Asger F
666c26e6a1 Permit performance comparisons across DBs
The snippet seems to have been copied from 'findOtherQueryToCompare'
where it makes sense, but in the context of a performance comparison
we don't need this restriction.
2025-01-17 12:42:11 +01:00
Asger F
bba31c030a Add comment to clarify reverse parsing 2025-01-17 11:47:35 +01:00
Asger F
8b8d174781 Clean up some more TODOs 2025-01-17 11:36:08 +01:00
Asger F
370b17c0f5 Remove TODOs 2025-01-17 11:35:16 +01:00
Asger F
37dcd0822b Remove TODO that was just resolved 2025-01-17 11:34:54 +01:00
Asger F
f09210b033 Only record cache hits prior to first evaluation 2025-01-17 11:26:40 +01:00
Asger F
44d33d6d31 Merge branch 'asgerf/compare-perf-view' of github.com:asgerf/vscode-codeql into asgerf/compare-perf-view 2025-01-17 10:53:03 +01:00
Asger F
08bffab05f Add more description of the "struct of arrays" layout 2025-01-17 10:51:49 +01:00
Asger F
2293cc3537 Update extensions/ql-vscode/src/log-insights/log-scanner.ts
Co-authored-by: Andrew Eisenberg <aeisenberg@github.com>
2025-01-17 10:43:15 +01:00
Asger F
6f461e75a7 Update extensions/ql-vscode/package.json
Restrict to Canary

Co-authored-by: Andrew Eisenberg <aeisenberg@github.com>
2025-01-17 10:40:09 +01:00
dependabot[bot]
8b0a16ea14 Bump the storybook group in /extensions/ql-vscode with 12 updates (#3900)
Bumps the storybook group in /extensions/ql-vscode with 12 updates:

| Package | From | To |
| --- | --- | --- |
| [@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y) | `8.4.7` | `8.5.0` |
| [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/actions) | `8.4.7` | `8.5.0` |
| [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.4.7` | `8.5.0` |
| [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.4.7` | `8.5.0` |
| [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.4.7` | `8.5.0` |
| [@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks) | `8.4.7` | `8.5.0` |
| [@storybook/components](https://github.com/storybookjs/storybook/tree/HEAD/code/deprecated/components) | `8.4.7` | `8.5.0` |
| [@storybook/manager-api](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/manager-api) | `8.4.7` | `8.5.0` |
| [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.4.7` | `8.5.0` |
| [@storybook/react-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite) | `8.4.7` | `8.5.0` |
| [@storybook/theming](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/theming) | `8.4.7` | `8.5.0` |
| [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli) | `8.4.7` | `8.5.0` |


Updates `@storybook/addon-a11y` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/a11y)

Updates `@storybook/addon-actions` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/actions)

Updates `@storybook/addon-essentials` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/essentials)

Updates `@storybook/addon-interactions` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/interactions)

Updates `@storybook/addon-links` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/links)

Updates `@storybook/blocks` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/lib/blocks)

Updates `@storybook/components` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/deprecated/components)

Updates `@storybook/manager-api` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/lib/manager-api)

Updates `@storybook/react` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/renderers/react)

Updates `@storybook/react-vite` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/frameworks/react-vite)

Updates `@storybook/theming` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/lib/theming)

Updates `storybook` from 8.4.7 to 8.5.0
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/lib/cli)

---
updated-dependencies:
- dependency-name: "@storybook/addon-a11y"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/addon-actions"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/addon-essentials"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/addon-interactions"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/blocks"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/components"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/manager-api"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/react"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/react-vite"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: "@storybook/theming"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
- dependency-name: storybook
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-16 16:07:03 +00:00
Koen Vlaswinkel
c086a80384 Merge pull request #3898 from github/github-action/bump-node-version
Bump Node version to v20.18.1
2025-01-16 13:47:16 +01:00
github-actions[bot]
e947756a5a Bump Node version to v20.18.1 2025-01-16 12:25:55 +00:00
Koen Vlaswinkel
6cafa5d905 Merge pull request #3897 from github/github-action/bump-node-version
Bump Node version to v20.18.1
2025-01-15 16:15:09 +01:00
Koen Vlaswinkel
4607a452bd Fix type errors 2025-01-15 15:43:05 +01:00
github-actions[bot]
276405f743 Bump Node version to v20.18.1 2025-01-15 12:25:54 +00:00
Koen Vlaswinkel
056e45ad1e Merge pull request #3893 from github/dependabot/npm_and_yarn/extensions/ql-vscode/vscode/vsce-3.2.1
Bump @vscode/vsce from 2.24.0 to 3.2.1 in /extensions/ql-vscode
2025-01-14 12:00:56 +01:00
Koen Vlaswinkel
575628990e Fix qltest-discovery test after tmp upgrade 2025-01-13 16:58:32 +01:00
Koen Vlaswinkel
9f0a5f0daa Clean up files property and .vscodeignore file 2025-01-13 15:25:56 +01:00
Dave Bartolomeo
92e5181dd6 Merge pull request #3896 from github/github-action/bump-cli
Bump CLI Version to v2.20.1 for integration tests
2025-01-09 17:16:07 -05:00
github-actions[bot]
88924f1556 Bump CLI version from v2.20.0 to v2.20.1 for integration tests 2025-01-09 21:56:26 +00:00
Koen Vlaswinkel
26edfa5c43 Merge pull request #3890 from github/github-action/bump-node-version
Bump Node version to v20.18.1
2025-01-09 12:15:01 +01:00
github-actions[bot]
17bae27c34 Bump Node version to v20.18.1 2025-01-08 12:26:08 +00:00
Charis Kyriakou
49839a1a52 Remove support for CodeQL CLI versions older than v2.18.4 (#3895)
* Remove support for CodeQL CLI versions older than v2.18.4

* Update CHANGELOG
2025-01-06 11:37:39 +00:00
dependabot[bot]
60754a81d6 Bump @vscode/vsce from 2.24.0 to 3.2.1 in /extensions/ql-vscode
Bumps [@vscode/vsce](https://github.com/Microsoft/vsce) from 2.24.0 to 3.2.1.
- [Release notes](https://github.com/Microsoft/vsce/releases)
- [Commits](https://github.com/Microsoft/vsce/compare/v2.24.0...v3.2.1)

---
updated-dependencies:
- dependency-name: "@vscode/vsce"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-02 17:45:12 +00:00
Angela P Wen
bda74b83c0 Merge pull request #3894 from github/dependabot/npm_and_yarn/extensions/ql-vscode/lint-staged-15.3.0
Bump lint-staged from 15.2.10 to 15.3.0 in /extensions/ql-vscode
2025-01-02 09:44:15 -08:00
Angela P Wen
055c53aba1 Merge pull request #3892 from github/dependabot/npm_and_yarn/extensions/ql-vscode/gulp-esbuild-0.14.0
Bump gulp-esbuild from 0.12.1 to 0.14.0 in /extensions/ql-vscode
2025-01-02 09:43:05 -08:00
Angela P Wen
8e5f331cb5 Merge pull request #3891 from github/dependabot/npm_and_yarn/extensions/ql-vscode/typescript-eslint-7c217e476c
Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
2025-01-02 09:42:35 -08:00
dependabot[bot]
b4d925bbb2 Bump lint-staged from 15.2.10 to 15.3.0 in /extensions/ql-vscode
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 15.2.10 to 15.3.0.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v15.2.10...v15.3.0)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-02 14:02:40 +00:00
dependabot[bot]
a9879d2da3 Bump gulp-esbuild from 0.12.1 to 0.14.0 in /extensions/ql-vscode
Bumps [gulp-esbuild](https://github.com/ym-project/gulp-esbuild) from 0.12.1 to 0.14.0.
- [Release notes](https://github.com/ym-project/gulp-esbuild/releases)
- [Commits](https://github.com/ym-project/gulp-esbuild/compare/v0.12.1...v0.14.0)

---
updated-dependencies:
- dependency-name: gulp-esbuild
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-02 13:58:53 +00:00
dependabot[bot]
3dcfefa0ae Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
Bumps the typescript-eslint group in /extensions/ql-vscode with 2 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).


Updates `@typescript-eslint/eslint-plugin` from 8.18.2 to 8.19.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.19.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.18.2 to 8.19.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.19.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: typescript-eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-02 13:58:41 +00:00
Angela P Wen
e81dda377a Merge pull request #3889 from github/dependabot/docker/extensions/ql-vscode/test/e2e/docker/codercom/code-server-4.96.2
Bump codercom/code-server from 4.96.1 to 4.96.2 in /extensions/ql-vscode/test/e2e/docker
2024-12-26 10:12:59 -08:00
Angela P Wen
1faaaff59e Merge pull request #3888 from github/dependabot/npm_and_yarn/extensions/ql-vscode/markdownlint-cli2-0.17.0
Bump markdownlint-cli2 from 0.13.0 to 0.17.0 in /extensions/ql-vscode
2024-12-26 10:12:37 -08:00
Angela P Wen
75f77bcfca Merge pull request #3886 from github/dependabot/npm_and_yarn/extensions/ql-vscode/typescript-eslint-d4fe8e2025
Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
2024-12-26 10:12:09 -08:00
Angela P Wen
94c576b255 Merge pull request #3885 from github/dependabot/npm_and_yarn/extensions/ql-vscode/storybook-c0121e82ca
Bump @storybook/csf from 0.1.12 to 0.1.13 in /extensions/ql-vscode in the storybook group
2024-12-26 10:11:48 -08:00
dependabot[bot]
acf7ccdf6a Bump codercom/code-server in /extensions/ql-vscode/test/e2e/docker
Bumps codercom/code-server from 4.96.1 to 4.96.2.

---
updated-dependencies:
- dependency-name: codercom/code-server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-26 13:52:29 +00:00
dependabot[bot]
b24aedea99 Bump markdownlint-cli2 from 0.13.0 to 0.17.0 in /extensions/ql-vscode
Bumps [markdownlint-cli2](https://github.com/DavidAnson/markdownlint-cli2) from 0.13.0 to 0.17.0.
- [Changelog](https://github.com/DavidAnson/markdownlint-cli2/blob/main/CHANGELOG.md)
- [Commits](https://github.com/DavidAnson/markdownlint-cli2/compare/v0.13.0...v0.17.0)

---
updated-dependencies:
- dependency-name: markdownlint-cli2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-26 13:16:22 +00:00
dependabot[bot]
29b0269a40 Bump the typescript-eslint group in /extensions/ql-vscode with 2 updates
Bumps the typescript-eslint group in /extensions/ql-vscode with 2 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).


Updates `@typescript-eslint/eslint-plugin` from 8.18.1 to 8.18.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.18.2/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.18.1 to 8.18.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.18.2/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: typescript-eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: typescript-eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-26 13:12:31 +00:00
dependabot[bot]
00e27195d9 Bump @storybook/csf in /extensions/ql-vscode in the storybook group
Bumps the storybook group in /extensions/ql-vscode with 1 update: [@storybook/csf](https://github.com/ComponentDriven/csf).


Updates `@storybook/csf` from 0.1.12 to 0.1.13
- [Release notes](https://github.com/ComponentDriven/csf/releases)
- [Changelog](https://github.com/ComponentDriven/csf/blob/v0.1.13/CHANGELOG.md)
- [Commits](https://github.com/ComponentDriven/csf/compare/v0.1.12...v0.1.13)

---
updated-dependencies:
- dependency-name: "@storybook/csf"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-26 13:11:51 +00:00
Andrew Eisenberg
e54805fb06 Merge pull request #3884 from github/version/bump-to-v1.17.1
Bump version to v1.17.1
2024-12-20 14:15:19 -08:00
github-actions[bot]
6fc8b726f4 Bump version to v1.17.1 2024-12-20 20:28:17 +00:00
Andrew Eisenberg
daf1096389 Merge pull request #3883 from github/v1.17.0
v1.17.0
2024-12-20 12:27:07 -08:00
Asger F
aa528c6037 Remove unused export 2024-11-27 14:14:52 +01:00
Asger F
c99bf5bb9f Only warn about cache hits in comparison mode 2024-11-27 14:14:52 +01:00
Asger F
afa3d558c6 Factor header rows into a component 2024-11-27 14:14:51 +01:00
Asger F
b9d15511cb Hide "sort by" dropdown when there is no delta to sort by 2024-11-27 14:14:51 +01:00
Asger F
8a58279e67 Move "total" row to the top and render the metric 2024-11-27 14:14:51 +01:00
Asger F
d37469fc94 Add 'per evaluation' option next to metric 2024-11-27 14:14:51 +01:00
Asger F
2cae71c657 Add predicate-renaming support 2024-11-27 14:14:51 +01:00
Asger F
568f0827b2 Fix some crashes when pretty-printing an empty name
Predicate names can't be empty, but it can happen with the renaming feature added in the next commit.
2024-11-27 13:47:57 +01:00
Asger F
4a835b8711 Factor out rendering of table body to a memoized component 2024-11-27 13:47:57 +01:00
Asger F
ab00152ce2 Group together rows by fingerprinting 2024-11-27 13:47:57 +01:00
Asger F
48954c7d22 Rename TRow -> Row 2024-11-27 13:47:57 +01:00
Asger F
9a0699f50a Refactor predicate row into a separate component 2024-11-27 13:47:57 +01:00
Asger F
eec42c5532 Split renderAbsoluteValue into renderOptionalValue and renderPredicateMetric 2024-11-27 13:47:57 +01:00
Asger F
d008963602 Refactor OptionalValue 2024-11-27 13:47:57 +01:00
Asger F
9800fa1333 Use interface instead of type alias for TRow 2024-11-27 13:47:57 +01:00
Asger F
62f3b4f696 Reformat code again
Only contains formatting changes
2024-11-27 13:47:57 +01:00
Asger F
6f7eb74496 Reset hasCacheMismatch when rebuilding 'rows' 2024-11-27 13:47:57 +01:00
Asger F
6568b569a1 Also useMemo the 'total' row computation 2024-11-27 13:47:57 +01:00
Asger F
558d957eb7 Reformat code 2024-11-27 13:47:57 +01:00
Asger F
20f6e3d45c Use useMemo a few places to speed up UI interactions 2024-11-27 13:47:57 +01:00
Asger F
b05ec33ba3 Use useMemo for 'nameSet' 2024-11-27 13:47:57 +01:00
Asger F
1d2c2cfcf9 Allow word wrap to break anywhere 2024-11-27 13:47:56 +01:00
Taus
e039f6bc52 Simplify view when not in comparison mode 2024-11-27 13:47:56 +01:00
Taus
6d4427e59c compare-perf: Add support for selecting a single run as input
A very hacky implementation that simply instantiates an empty
`PerformanceOverviewScanner` as the "from" column (i.e. with all values
empty). To see it in action, select a single query run in the query
history and pick "Compare Performance" from the context menu. Then
select the "Single run" option when prompted.
2024-11-27 13:47:56 +01:00
Esben Sparre Andreasen
412338c717 feat: parallel log scanning 2024-11-27 13:47:56 +01:00
Asger F
ccf2dc64ac Simplify datasets assignment 2024-11-27 13:47:56 +01:00
Asger F
453aa833f2 Check for nullness of 'data' in a separate component
This ensures we can use hooks after the check in the main component
2024-11-27 13:47:56 +01:00
Asger F
260bf0e8d1 Add option to choose metric 2024-11-27 13:47:56 +01:00
Taus
876c5b6091 Colorize positive/negative deltas 2024-11-27 13:47:56 +01:00
Asger F
317e52c0e7 Also abbreviate RA names in predicate overview 2024-11-27 13:47:56 +01:00
Asger F
03ca407713 Make "..." clickable to reveal abbreviated name 2024-11-27 13:47:56 +01:00
Asger F
58afeba1ac Apply a background color to the pipeline header rows 2024-11-27 13:47:56 +01:00
Asger F
8268d6812f Apply styling to RA predicate names 2024-11-27 13:47:56 +01:00
Asger F
70ec5704c8 Make RAPrettyPrinter generate JSX fragments 2024-11-27 13:47:55 +01:00
Taus
aaf23eae72 compare-perf: Add support for sorting options
Adds a dropdown with (at present) two options: sorting by delta and
sorting by absolute delta.
2024-11-27 13:47:55 +01:00
Asger F
96aa770e85 Show evaluation and iteration counts in table 2024-11-27 13:47:55 +01:00
Asger F
3b0697771d Add Compare Performance command (WIP) 2024-11-27 13:47:55 +01:00
45 changed files with 4319 additions and 1352 deletions

57
.github/workflows/build-storybook.yml vendored Normal file
View File

@@ -0,0 +1,57 @@
name: Build Storybook
on:
workflow_dispatch:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
push:
branches:
- main
permissions: {}
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: extensions/ql-vscode/.nvmrc
- name: Install dependencies
run: |
cd extensions/ql-vscode
npm ci
shell: bash
- name: Build Storybook
run: |
cd extensions/ql-vscode
npm run build-storybook
shell: bash
- name: Upload to GitHub Pages
id: deployment
uses: actions/upload-pages-artifact@v3
with:
path: extensions/ql-vscode/storybook-static
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
id-token: write
pages: write
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

View File

@@ -1,25 +1,12 @@
name: Bump CLI version
on:
workflow_dispatch:
inputs:
option:
description: "Option"
required: true
default: 'replace'
type: choice
options:
- prepend
- replace
version:
description: |
The version to prepend to the supported versions file. This should be in the form: `vA.B.C`.
required: false
type: string
pull_request:
branches: [main]
paths:
- .github/actions/create-pr/action.yml
- .github/workflows/bump-cli.yml
- extensions/ql-vscode/scripts/bump-supported-cli-versions.ts
schedule:
- cron: 0 0 */14 * * # run every 14 days
@@ -34,28 +21,31 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
fetch-depth: 1
node-version-file: extensions/ql-vscode/.nvmrc
cache: 'npm'
cache-dependency-path: extensions/ql-vscode/package-lock.json
- name: Install dependencies
working-directory: extensions/ql-vscode
run: |
npm ci
shell: bash
- name: Bump CLI
if: ${{ inputs.option == 'replace' }}
working-directory: extensions/ql-vscode
id: bump-cli
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
scripts/replace-cli-version.sh
- name: Prepend another version
if: ${{ inputs.option == 'prepend' }}
run: |
cat extensions/ql-vscode/supported_cli_versions.json | jq '. |= ["${{ inputs.version }}"] + .' > supported_cli_versions_temp.json
mv supported_cli_versions_temp.json extensions/ql-vscode/supported_cli_versions.json
echo "LATEST_VERSION=${{ inputs.version }}" >> $GITHUB_ENV
echo "PREVIOUS_VERSION=`jq -r '.[1]' extensions/ql-vscode/supported_cli_versions.json`" >> $GITHUB_ENV
npx vite-node scripts/bump-supported-cli-versions.ts
shell: bash
- name: Commit, Push and Open a PR
uses: ./.github/actions/create-pr
with:
token: ${{ secrets.GITHUB_TOKEN }}
base-branch: main
head-branch: github-action/bump-cli
commit-message: Bump CLI version from ${{ env.PREVIOUS_VERSION }} to ${{ env.LATEST_VERSION }} for integration tests
title: Bump CLI Version to ${{ env.LATEST_VERSION }} for integration tests
commit-message: Bump CLI version from ${{ steps.bump-cli.outputs.PREVIOUS_VERSION }} to ${{ steps.bump-cli.outputs.LATEST_VERSION }} for integration tests
title: Bump CLI Version to ${{ steps.bump-cli.outputs.LATEST_VERSION }} for integration tests
body: >
Bumps CLI version from ${{ env.PREVIOUS_VERSION }} to ${{ env.LATEST_VERSION }}
Bumps CLI version from ${{ steps.bump-cli.outputs.PREVIOUS_VERSION }} to ${{ steps.bump-cli.outputs.LATEST_VERSION }}

View File

@@ -17,6 +17,8 @@ jobs:
find-nightly:
name: Find Nightly Release
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
url: ${{ steps.get-url.outputs.nightly-url }}
steps:
@@ -33,6 +35,8 @@ jobs:
set-matrix:
name: Set Matrix for cli-test
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -47,6 +51,8 @@ jobs:
runs-on: ${{ matrix.os }}
needs: [find-nightly, set-matrix]
timeout-minutes: 30
permissions:
contents: read
strategy:
matrix:
os: [ubuntu-latest, windows-latest]

View File

@@ -11,6 +11,12 @@ on:
jobs:
codeql:
runs-on: ubuntu-latest
strategy:
matrix:
language:
- javascript
- actions
fail-fast: false
permissions:
contents: read
@@ -24,7 +30,7 @@ jobs:
- name: Initialize CodeQL
uses: github/codeql-action/init@main
with:
languages: javascript
languages: ${{ matrix.language }}
config-file: ./.github/codeql/codeql-config.yml
tools: latest

View File

@@ -1,10 +1,14 @@
name: Run E2E Playwright tests
on:
workflow_dispatch:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
jobs:
e2e-test:
name: E2E Test

View File

@@ -3,6 +3,9 @@ on:
issues:
types: [opened]
permissions:
issues: write
jobs:
label:
name: Label issue

View File

@@ -7,6 +7,9 @@ on:
branches:
- main
permissions:
contents: read
jobs:
build:
name: Build
@@ -56,6 +59,9 @@ jobs:
lint:
name: Lint
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- name: Checkout
uses: actions/checkout@v4

View File

@@ -12,6 +12,9 @@ on:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+*'
permissions:
contents: read
jobs:
build:
name: Release
@@ -156,6 +159,8 @@ jobs:
needs: build
environment: publish-open-vsx
runs-on: ubuntu-latest
permissions:
contents: read
env:
OPEN_VSX_TOKEN: ${{ secrets.OPEN_VSX_TOKEN }}
steps:

5
.gitignore vendored
View File

@@ -22,4 +22,7 @@ artifacts/
# E2E Reports
**/playwright-report/**
**/test-results/**
**/test-results/**
# Storybook artifacts
**/storybook-static/**

View File

@@ -1,6 +1,5 @@
# Releasing (write access required)
1. Make sure the needed authentication keys are valid. Most likely the Azure DevOps PAT needs to be regenerated. See below.
1. Determine the new version number. We default to increasing the patch version number, but make our own judgement about whether a change is big enough to warrant a minor version bump. Common reasons for a minor bump could include:
- Making substantial new features available to all users. This can include lifting a feature flag.
- Breakage in compatibility with recent versions of the CLI.
@@ -61,7 +60,7 @@
## Secrets and authentication for publishing
Repository administrators, will need to manage the authentication keys for publishing to the VS Code marketplace and Open VSX. Each requires an authentication token.
Repository administrators will need to manage the authentication keys for publishing to the VS Code marketplace and Open VSX. Each requires an authentication token.
To regenerate the Open VSX token:

View File

@@ -1,17 +1 @@
.vs/**
.vscode/**
.vscode-test/**
typings/**
out/test/**
out/vscode-tests/**
**/@types/**
**/*.ts
test/**
src/**
**/*.map
.gitignore
gulpfile.js/**
tsconfig.json
.prettierrc
vsc-extension-quickstart.md
node_modules/**

View File

@@ -1,6 +1,13 @@
# CodeQL for Visual Studio Code: Changelog
## 1.7.0 - 20 December 2024
## [UNRELEASED]
## 1.17.1 - 23 January 2025
- Remove support for CodeQL CLI versions older than 2.18.4. [#3895](https://github.com/github/vscode-codeql/pull/3895)
- Fix regex in CodeQL TextMate grammar that was silently failing. [#3903](https://github.com/github/vscode-codeql/pull/3903)
## 1.17.0 - 20 December 2024
- Add a palette command that allows importing all databases directly inside of a parent folder. [#3797](https://github.com/github/vscode-codeql/pull/3797)
- Only use VS Code telemetry settings instead of using `codeQL.telemetry.enableTelemetry` [#3853](https://github.com/github/vscode-codeql/pull/3853)

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
"description": "CodeQL for Visual Studio Code",
"author": "GitHub",
"private": true,
"version": "1.17.0",
"version": "1.17.2",
"publisher": "GitHub",
"license": "MIT",
"icon": "media/VS-marketplace-CodeQL-icon.png",
@@ -42,13 +42,6 @@
"workspaceContains:.git"
],
"main": "./out/extension",
"files": [
"gen/*.js",
"media/**",
"out/**",
"package.json",
"language-configuration.json"
],
"contributes": {
"configurationDefaults": {
"[ql]": {
@@ -949,6 +942,10 @@
"command": "codeQLQueryHistory.compareWith",
"title": "Compare Results"
},
{
"command": "codeQLQueryHistory.comparePerformanceWith",
"title": "Compare Performance"
},
{
"command": "codeQLQueryHistory.openOnGithub",
"title": "View Logs"
@@ -1220,6 +1217,11 @@
"group": "3_queryHistory@0",
"when": "viewItem == rawResultsItem || viewItem == interpretedResultsItem"
},
{
"command": "codeQLQueryHistory.comparePerformanceWith",
"group": "3_queryHistory@1",
"when": "viewItem == rawResultsItem && config.codeQL.canary || viewItem == interpretedResultsItem && config.codeQL.canary"
},
{
"command": "codeQLQueryHistory.showQueryLog",
"group": "4_queryHistory@4",
@@ -1723,6 +1725,10 @@
"command": "codeQLQueryHistory.compareWith",
"when": "false"
},
{
"command": "codeQLQueryHistory.comparePerformanceWith",
"when": "false"
},
{
"command": "codeQLQueryHistory.sortByName",
"when": "false"
@@ -1963,9 +1969,9 @@
},
"dependencies": {
"@floating-ui/react": "^0.27.0",
"@octokit/plugin-retry": "^7.1.2",
"@octokit/plugin-throttling": "^9.3.2",
"@octokit/rest": "^21.0.2",
"@octokit/plugin-retry": "^7.1.4",
"@octokit/plugin-throttling": "^9.4.0",
"@octokit/rest": "^21.1.1",
"@vscode/codicons": "^0.0.36",
"@vscode/debugadapter": "^1.59.0",
"@vscode/debugprotocol": "^1.68.0",
@@ -2006,18 +2012,18 @@
"@github/markdownlint-github": "^0.6.3",
"@microsoft/eslint-formatter-sarif": "^3.1.0",
"@playwright/test": "^1.49.0",
"@storybook/addon-a11y": "^8.4.7",
"@storybook/addon-actions": "^8.4.7",
"@storybook/addon-essentials": "^8.4.7",
"@storybook/addon-interactions": "^8.4.7",
"@storybook/addon-links": "^8.4.7",
"@storybook/addon-a11y": "^8.5.8",
"@storybook/addon-actions": "^8.5.8",
"@storybook/addon-essentials": "^8.5.8",
"@storybook/addon-interactions": "^8.5.8",
"@storybook/addon-links": "^8.5.8",
"@storybook/blocks": "^8.0.2",
"@storybook/components": "^8.4.7",
"@storybook/csf": "^0.1.12",
"@storybook/icons": "^1.3.0",
"@storybook/manager-api": "^8.4.7",
"@storybook/react": "^8.4.7",
"@storybook/react-vite": "^8.4.7",
"@storybook/components": "^8.5.8",
"@storybook/csf": "^0.1.13",
"@storybook/icons": "^1.3.2",
"@storybook/manager-api": "^8.5.8",
"@storybook/react": "^8.5.8",
"@storybook/react-vite": "^8.5.8",
"@storybook/theming": "^8.2.4",
"@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^6.6.3",
@@ -2045,10 +2051,10 @@
"@types/tmp": "^0.2.6",
"@types/vscode": "1.90.0",
"@types/yauzl": "^2.10.3",
"@typescript-eslint/eslint-plugin": "^8.18.1",
"@typescript-eslint/parser": "^8.18.1",
"@typescript-eslint/eslint-plugin": "^8.24.1",
"@typescript-eslint/parser": "^8.24.1",
"@vscode/test-electron": "^2.3.9",
"@vscode/vsce": "^2.24.0",
"@vscode/vsce": "^3.2.1",
"ansi-colors": "^4.1.1",
"applicationinsights": "^2.9.5",
"cosmiconfig": "^9.0.0",
@@ -2069,20 +2075,20 @@
"eslint-plugin-storybook": "^0.8.0",
"glob": "^11.0.0",
"gulp": "^5.0.0",
"gulp-esbuild": "^0.12.1",
"gulp-esbuild": "^0.14.0",
"gulp-replace": "^1.1.3",
"gulp-typescript": "^5.0.1",
"husky": "^9.1.5",
"jest": "^29.0.3",
"jest-environment-jsdom": "^29.0.3",
"jest-runner-vscode": "^3.0.1",
"lint-staged": "^15.2.10",
"markdownlint-cli2": "^0.13.0",
"lint-staged": "^15.3.0",
"markdownlint-cli2": "^0.17.0",
"markdownlint-cli2-formatter-pretty": "^0.0.7",
"npm-run-all": "^4.1.5",
"patch-package": "^8.0.0",
"prettier": "^3.2.5",
"storybook": "^8.4.7",
"storybook": "^8.5.8",
"tar-stream": "^3.1.7",
"through2": "^4.0.2",
"ts-jest": "^29.2.5",
@@ -2091,7 +2097,7 @@
"ts-unused-exports": "^10.1.0",
"typescript": "^5.6.2",
"vite": "^6.0.1",
"vite-node": "^2.0.5"
"vite-node": "^3.0.6"
},
"lint-staged": {
"./**/*.{json,css,scss}": [

View File

@@ -0,0 +1,95 @@
import { spawnSync } from "child_process";
import { resolve } from "path";
import { appendFile, outputJson, readJson } from "fs-extra";
import { SemVer } from "semver";
const supportedCliVersionsPath = resolve(
__dirname,
"..",
"supported_cli_versions.json",
);
async function bumpSupportedCliVersions() {
const existingVersions = (await readJson(
supportedCliVersionsPath,
)) as string[];
const release = runGhJSON<Release>([
"release",
"view",
"--json",
"id,name",
"--repo",
"github/codeql-cli-binaries",
]);
// There are two cases:
// - Replace the version if it's the same major and minor version
// - Prepend the version if it's a new major or minor version
const latestSupportedVersion = new SemVer(existingVersions[0]);
const latestReleaseVersion = new SemVer(release.name);
if (latestSupportedVersion.compare(latestReleaseVersion) === 0) {
console.log("No need to update supported CLI versions");
return;
}
if (process.env.GITHUB_OUTPUT) {
await appendFile(
process.env.GITHUB_OUTPUT,
`PREVIOUS_VERSION=${existingVersions[0]}\n`,
{
encoding: "utf-8",
},
);
}
if (
latestSupportedVersion.major === latestReleaseVersion.major &&
latestSupportedVersion.minor === latestReleaseVersion.minor
) {
existingVersions[0] = release.name;
console.log(`Replaced latest supported CLI version with ${release.name}`);
} else {
existingVersions.unshift(release.name);
console.log(`Added latest supported CLI version ${release.name}`);
}
await outputJson(supportedCliVersionsPath, existingVersions, {
spaces: 2,
finalEOL: true,
});
if (process.env.GITHUB_OUTPUT) {
await appendFile(
process.env.GITHUB_OUTPUT,
`LATEST_VERSION=${existingVersions[0]}\n`,
{
encoding: "utf-8",
},
);
}
}
bumpSupportedCliVersions().catch((e: unknown) => {
console.error(e);
process.exit(2);
});
function runGh(args: readonly string[]): string {
const gh = spawnSync("gh", args);
if (gh.status !== 0) {
throw new Error(`Failed to run gh ${args.join(" ")}: ${gh.stderr}`);
}
return gh.stdout.toString("utf-8");
}
function runGhJSON<T>(args: readonly string[]): T {
return JSON.parse(runGh(args));
}
type Release = {
id: string;
name: string;
};

View File

@@ -1904,7 +1904,7 @@ function shouldDebugCliServer() {
export class CliVersionConstraint {
// The oldest version of the CLI that we support. This is used to determine
// whether to show a warning about the CLI being too old on startup.
public static OLDEST_SUPPORTED_CLI_VERSION = new SemVer("2.16.6");
public static OLDEST_SUPPORTED_CLI_VERSION = new SemVer("2.18.4");
constructor(private readonly cli: CodeQLCliServer) {
/**/

View File

@@ -180,6 +180,7 @@ export type QueryHistoryCommands = {
"codeQLQueryHistory.removeHistoryItemContextInline": TreeViewContextMultiSelectionCommandFunction<QueryHistoryInfo>;
"codeQLQueryHistory.renameItem": TreeViewContextMultiSelectionCommandFunction<QueryHistoryInfo>;
"codeQLQueryHistory.compareWith": TreeViewContextMultiSelectionCommandFunction<QueryHistoryInfo>;
"codeQLQueryHistory.comparePerformanceWith": TreeViewContextMultiSelectionCommandFunction<QueryHistoryInfo>;
"codeQLQueryHistory.showEvalLog": TreeViewContextMultiSelectionCommandFunction<QueryHistoryInfo>;
"codeQLQueryHistory.showEvalLogSummary": TreeViewContextMultiSelectionCommandFunction<QueryHistoryInfo>;
"codeQLQueryHistory.showEvalLogViewer": TreeViewContextMultiSelectionCommandFunction<QueryHistoryInfo>;

View File

@@ -27,6 +27,7 @@ import type {
} from "./raw-result-types";
import type { AccessPathSuggestionOptions } from "../model-editor/suggestions";
import type { ModelEvaluationRunState } from "../model-editor/shared/model-evaluation-run-state";
import type { PerformanceComparisonDataFromLog } from "../log-insights/performance-comparison";
/**
* This module contains types and code that are shared between
@@ -396,6 +397,17 @@ export interface SetComparisonsMessage {
readonly message: string | undefined;
}
export type ToComparePerformanceViewMessage = SetPerformanceComparisonQueries;
export interface SetPerformanceComparisonQueries {
readonly t: "setPerformanceComparison";
readonly from: PerformanceComparisonDataFromLog;
readonly to: PerformanceComparisonDataFromLog;
readonly comparison: boolean;
}
export type FromComparePerformanceViewMessage = CommonFromViewMessages;
export type QueryCompareResult =
| RawQueryCompareResult
| InterpretedQueryCompareResult;

View File

@@ -24,7 +24,12 @@ export async function readJsonlFile<T>(
return new Promise((resolve, reject) => {
const stream = createReadStream(path, { encoding: "utf8" });
let buffer = "";
stream.on("data", async (chunk: string) => {
stream.on("data", async (chunk: string | Buffer) => {
if (typeof chunk !== "string") {
// This should never happen because we specify the encoding as "utf8".
throw new Error("Invalid chunk");
}
const parts = (buffer + chunk).split(doubleLineBreakRegexp);
buffer = parts.pop()!;
if (parts.length > 0) {

View File

@@ -41,6 +41,13 @@ export abstract class AbstractWebview<
constructor(protected readonly app: App) {}
public hidePanel() {
if (this.panel !== undefined) {
this.panel.dispose();
this.panel = undefined;
}
}
public async restoreView(panel: WebviewPanel): Promise<void> {
this.panel = panel;
const config = await this.getPanelConfig();

View File

@@ -7,6 +7,7 @@ import type { App } from "../app";
export type WebviewKind =
| "results"
| "compare"
| "compare-performance"
| "variant-analysis"
| "data-flow-paths"
| "model-editor"

View File

@@ -0,0 +1,108 @@
import { statSync } from "fs";
import { ViewColumn } from "vscode";
import type { App } from "../common/app";
import { redactableError } from "../common/errors";
import type {
FromComparePerformanceViewMessage,
ToComparePerformanceViewMessage,
} from "../common/interface-types";
import type { Logger } from "../common/logging";
import { showAndLogExceptionWithTelemetry } from "../common/logging";
import { extLogger } from "../common/logging/vscode";
import type { WebviewPanelConfig } from "../common/vscode/abstract-webview";
import { AbstractWebview } from "../common/vscode/abstract-webview";
import { withProgress } from "../common/vscode/progress";
import { telemetryListener } from "../common/vscode/telemetry";
import type { HistoryItemLabelProvider } from "../query-history/history-item-label-provider";
import { PerformanceOverviewScanner } from "../log-insights/performance-comparison";
import { scanLog } from "../log-insights/log-scanner";
import type { ResultsView } from "../local-queries";
export class ComparePerformanceView extends AbstractWebview<
ToComparePerformanceViewMessage,
FromComparePerformanceViewMessage
> {
constructor(
app: App,
public logger: Logger,
public labelProvider: HistoryItemLabelProvider,
private resultsView: ResultsView,
) {
super(app);
}
async showResults(fromJsonLog: string, toJsonLog: string) {
const panel = await this.getPanel();
panel.reveal(undefined, false);
// Close the results viewer as it will have opened when the user clicked the query in the history view
// (which they must do as part of the UI interaction for opening the performance view).
// The performance view generally needs a lot of width so it's annoying to have the result viewer open.
this.resultsView.hidePanel();
await this.waitForPanelLoaded();
function scanLogWithProgress(log: string, logDescription: string) {
const bytes = statSync(log).size;
return withProgress(
async (progress) =>
scanLog(log, new PerformanceOverviewScanner(), progress),
{
title: `Scanning evaluator log ${logDescription} (${(bytes / 1024 / 1024).toFixed(1)} MB)`,
},
);
}
const [fromPerf, toPerf] = await Promise.all([
fromJsonLog === ""
? new PerformanceOverviewScanner()
: scanLogWithProgress(fromJsonLog, "1/2"),
scanLogWithProgress(toJsonLog, fromJsonLog === "" ? "1/1" : "2/2"),
]);
await this.postMessage({
t: "setPerformanceComparison",
from: fromPerf.getData(),
to: toPerf.getData(),
comparison: fromJsonLog !== "",
});
}
protected getPanelConfig(): WebviewPanelConfig {
return {
viewId: "comparePerformanceView",
title: "Compare CodeQL Performance",
viewColumn: ViewColumn.Active,
preserveFocus: true,
view: "compare-performance",
};
}
protected onPanelDispose(): void {}
protected async onMessage(
msg: FromComparePerformanceViewMessage,
): Promise<void> {
switch (msg.t) {
case "viewLoaded":
this.onWebViewLoaded();
break;
case "telemetry":
telemetryListener?.sendUIInteraction(msg.action);
break;
case "unhandledError":
void showAndLogExceptionWithTelemetry(
extLogger,
telemetryListener,
redactableError(
msg.error,
)`Unhandled error in performance comparison view: ${msg.error.message}`,
);
break;
}
}
}

View File

@@ -135,6 +135,7 @@ import { LanguageContextStore } from "./language-context-store";
import { LanguageSelectionPanel } from "./language-selection-panel/language-selection-panel";
import { GitHubDatabasesModule } from "./databases/github-databases";
import { DatabaseFetcher } from "./databases/database-fetcher";
import { ComparePerformanceView } from "./compare-performance/compare-performance-view";
/**
* extension.ts
@@ -928,6 +929,11 @@ async function activateWithInstalledDistribution(
from: CompletedLocalQueryInfo,
to: CompletedLocalQueryInfo,
): Promise<void> => showResultsForComparison(compareView, from, to),
async (
from: CompletedLocalQueryInfo,
to: CompletedLocalQueryInfo | undefined,
): Promise<void> =>
showPerformanceComparison(comparePerformanceView, from, to),
);
ctx.subscriptions.push(qhm);
@@ -953,6 +959,15 @@ async function activateWithInstalledDistribution(
);
ctx.subscriptions.push(compareView);
void extLogger.log("Initializing performance comparison view.");
const comparePerformanceView = new ComparePerformanceView(
app,
queryServerLogger,
labelProvider,
localQueryResultsView,
);
ctx.subscriptions.push(comparePerformanceView);
void extLogger.log("Initializing source archive filesystem provider.");
archiveFilesystemProvider_activate(ctx, dbm);
@@ -1191,6 +1206,30 @@ async function showResultsForComparison(
}
}
async function showPerformanceComparison(
view: ComparePerformanceView,
from: CompletedLocalQueryInfo,
to: CompletedLocalQueryInfo | undefined,
): Promise<void> {
let fromLog = from.evaluatorLogPaths?.jsonSummary;
let toLog = to?.evaluatorLogPaths?.jsonSummary;
if (to === undefined) {
toLog = fromLog;
fromLog = "";
}
if (fromLog === undefined || toLog === undefined) {
return extLogger.showWarningMessage(
`Cannot compare performance as the structured logs are missing. Did they queries complete normally?`,
);
}
await extLogger.log(
`Comparing performance of ${from.getQueryName()} and ${to?.getQueryName() ?? "baseline"}`,
);
await view.showResults(fromLog, toLog);
}
function addUnhandledRejectionListener() {
const handler = (error: unknown) => {
// This listener will be triggered for errors from other extensions as

View File

@@ -1,6 +1,7 @@
import type { SummaryEvent } from "./log-summary";
import { readJsonlFile } from "../common/jsonl-reader";
import type { Disposable } from "../common/disposable-object";
import { readJsonlFile } from "../common/jsonl-reader";
import type { ProgressCallback } from "../common/vscode/progress";
import type { SummaryEvent } from "./log-summary";
/**
* Callback interface used to report diagnostics from a log scanner.
@@ -112,3 +113,27 @@ export class EvaluationLogScannerSet {
scanners.forEach((scanner) => scanner.onDone());
}
}
/**
* Scan the evaluator summary log using the given scanner. For convenience, returns the scanner.
*
* @param jsonSummaryLocation The file path of the JSON summary log.
* @param scanner The scanner to process events from the log
*/
export async function scanLog<T extends EvaluationLogScanner>(
jsonSummaryLocation: string,
scanner: T,
progress?: ProgressCallback,
): Promise<T> {
progress?.({
// all scans have step 1 - the backing progress tracker allows increments instead of steps - but for now we are happy with a tiny UI that says what is happening
message: `Scanning ...`,
step: 1,
maxStep: 2,
});
await readJsonlFile<SummaryEvent>(jsonSummaryLocation, async (obj) => {
scanner.onEvent(obj);
});
scanner.onDone();
return scanner;
}

View File

@@ -33,6 +33,7 @@ interface ResultEventBase extends SummaryEventBase {
export interface ComputeSimple extends ResultEventBase {
evaluationStrategy: "COMPUTE_SIMPLE";
ra: Ra;
millis: number;
pipelineRuns?: [PipelineRun];
queryCausingWork?: string;
dependencies: { [key: string]: string };
@@ -42,6 +43,7 @@ export interface ComputeRecursive extends ResultEventBase {
evaluationStrategy: "COMPUTE_RECURSIVE";
deltaSizes: number[];
ra: Ra;
millis: number;
pipelineRuns: PipelineRun[];
queryCausingWork?: string;
dependencies: { [key: string]: string };

View File

@@ -0,0 +1,183 @@
import type { EvaluationLogScanner } from "./log-scanner";
import type { SummaryEvent } from "./log-summary";
export interface PipelineSummary {
steps: string[];
/** Total counts for each step in the RA array, across all iterations */
counts: number[];
}
/**
* Data extracted from a log for the purpose of doing a performance comparison.
*
* Memory compactness is important since we keep this data in memory; once for
* each side of the comparison.
*
* This object must be able to survive a `postMessage` transfer from the extension host
* to a web view (which rules out `Map` values, for example).
*/
export interface PerformanceComparisonDataFromLog {
/**
* Names of predicates mentioned in the log.
*
* For compactness, details of these predicates are stored in a "struct of arrays" style.
*
* All fields (except those ending with `Indices`) should contain an array of the same length as `names`;
* details of a given predicate should be stored at the same index in each of those arrays.
*/
names: string[];
/** Number of milliseconds spent evaluating the `i`th predicate from the `names` array. */
timeCosts: number[];
/** Number of tuples seen in pipelines evaluating the `i`th predicate from the `names` array. */
tupleCosts: number[];
/** Number of iterations seen when evaluating the `i`th predicate from the `names` array. */
iterationCounts: number[];
/** Number of executions of pipelines evaluating the `i`th predicate from the `names` array. */
evaluationCounts: number[];
/**
* List of indices into the `names` array for which we have seen a cache hit.
*/
cacheHitIndices: number[];
/**
* List of indices into the `names` array where the predicate was deemed empty due to a sentinel check.
*/
sentinelEmptyIndices: number[];
/**
* All the pipeline runs seen for the `i`th predicate from the `names` array.
*/
pipelineSummaryList: Array<Record<string, PipelineSummary>>;
}
export class PerformanceOverviewScanner implements EvaluationLogScanner {
private readonly nameToIndex = new Map<string, number>();
private readonly data: PerformanceComparisonDataFromLog = {
names: [],
timeCosts: [],
tupleCosts: [],
cacheHitIndices: [],
sentinelEmptyIndices: [],
pipelineSummaryList: [],
evaluationCounts: [],
iterationCounts: [],
};
private getPredicateIndex(name: string): number {
const { nameToIndex } = this;
let index = nameToIndex.get(name);
if (index === undefined) {
index = nameToIndex.size;
nameToIndex.set(name, index);
const {
names,
timeCosts,
tupleCosts,
iterationCounts,
evaluationCounts,
pipelineSummaryList,
} = this.data;
names.push(name);
timeCosts.push(0);
tupleCosts.push(0);
iterationCounts.push(0);
evaluationCounts.push(0);
pipelineSummaryList.push({});
}
return index;
}
getData(): PerformanceComparisonDataFromLog {
return this.data;
}
onEvent(event: SummaryEvent): void {
if (
event.completionType !== undefined &&
event.completionType !== "SUCCESS"
) {
return; // Skip any evaluation that wasn't successful
}
switch (event.evaluationStrategy) {
case "EXTENSIONAL":
case "COMPUTED_EXTENSIONAL": {
break;
}
case "CACHE_HIT":
case "CACHACA": {
// Record a cache hit, but only if the predicate has not been seen before.
// We're mainly interested in the reuse of caches from an earlier query run as they can distort comparisons.
if (!this.nameToIndex.has(event.predicateName)) {
this.data.cacheHitIndices.push(
this.getPredicateIndex(event.predicateName),
);
}
break;
}
case "SENTINEL_EMPTY": {
this.data.sentinelEmptyIndices.push(
this.getPredicateIndex(event.predicateName),
);
break;
}
case "COMPUTE_RECURSIVE":
case "COMPUTE_SIMPLE":
case "IN_LAYER": {
const index = this.getPredicateIndex(event.predicateName);
let totalTime = 0;
let totalTuples = 0;
if (event.evaluationStrategy !== "IN_LAYER") {
totalTime += event.millis;
} else {
// IN_LAYER events do no record of their total time.
// Make a best-effort estimate by adding up the positive iteration times (they can be negative).
for (const millis of event.predicateIterationMillis ?? []) {
if (millis > 0) {
totalTime += millis;
}
}
}
const {
timeCosts,
tupleCosts,
iterationCounts,
evaluationCounts,
pipelineSummaryList,
} = this.data;
const pipelineSummaries = pipelineSummaryList[index];
for (const { counts, raReference } of event.pipelineRuns ?? []) {
// Get or create the pipeline summary for this RA
const pipelineSummary = (pipelineSummaries[raReference] ??= {
steps: event.ra[raReference],
counts: counts.map(() => 0),
});
const { counts: totalTuplesPerStep } = pipelineSummary;
for (let i = 0, length = counts.length; i < length; ++i) {
const count = counts[i];
if (count < 0) {
// Empty RA lines have a tuple count of -1. Do not count them when aggregating.
// But retain the fact that this step had a negative count for rendering purposes.
totalTuplesPerStep[i] = count;
continue;
}
totalTuples += count;
totalTuplesPerStep[i] += count;
}
}
timeCosts[index] += totalTime;
tupleCosts[index] += totalTuples;
iterationCounts[index] += event.pipelineRuns?.length ?? 0;
evaluationCounts[index] += 1;
break;
}
}
}
onDone(): void {}
}

View File

@@ -149,6 +149,10 @@ export class QueryHistoryManager extends DisposableObject {
from: CompletedLocalQueryInfo,
to: CompletedLocalQueryInfo,
) => Promise<void>,
private readonly doComparePerformanceCallback: (
from: CompletedLocalQueryInfo,
to: CompletedLocalQueryInfo | undefined,
) => Promise<void>,
) {
super();
@@ -263,6 +267,8 @@ export class QueryHistoryManager extends DisposableObject {
"query",
),
"codeQLQueryHistory.compareWith": this.handleCompareWith.bind(this),
"codeQLQueryHistory.comparePerformanceWith":
this.handleComparePerformanceWith.bind(this),
"codeQLQueryHistory.showEvalLog": createSingleSelectionCommand(
this.app.logger,
this.handleShowEvalLog.bind(this),
@@ -679,6 +685,39 @@ export class QueryHistoryManager extends DisposableObject {
}
}
async handleComparePerformanceWith(
singleItem: QueryHistoryInfo,
multiSelect: QueryHistoryInfo[] | undefined,
) {
multiSelect ||= [singleItem];
if (
!this.isSuccessfulCompletedLocalQueryInfo(singleItem) ||
!multiSelect.every(this.isSuccessfulCompletedLocalQueryInfo)
) {
throw new Error(
"Please only select local queries that have completed successfully.",
);
}
const fromItem = this.getFromQueryToCompare(singleItem, multiSelect);
let toItem: CompletedLocalQueryInfo | undefined = undefined;
try {
toItem = await this.findOtherQueryToComparePerformance(
fromItem,
multiSelect,
);
} catch (e) {
void showAndLogErrorMessage(
this.app.logger,
`Failed to compare queries: ${getErrorMessage(e)}`,
);
}
await this.doComparePerformanceCallback(fromItem, toItem);
}
async handleItemClicked(item: QueryHistoryInfo) {
this.treeDataProvider.setCurrentItem(item);
@@ -1076,6 +1115,7 @@ export class QueryHistoryManager extends DisposableObject {
detail: item.completedQuery.message,
query: item,
}));
if (comparableQueryLabels.length < 1) {
throw new Error("No other queries available to compare with.");
}
@@ -1084,6 +1124,52 @@ export class QueryHistoryManager extends DisposableObject {
return choice?.query;
}
private async findOtherQueryToComparePerformance(
fromItem: CompletedLocalQueryInfo,
allSelectedItems: CompletedLocalQueryInfo[],
): Promise<CompletedLocalQueryInfo | undefined> {
// If exactly 2 items are selected, return the one that
// isn't being used as the "from" item.
if (allSelectedItems.length === 2) {
const otherItem =
fromItem === allSelectedItems[0]
? allSelectedItems[1]
: allSelectedItems[0];
return otherItem;
}
if (allSelectedItems.length > 2) {
throw new Error("Please select no more than 2 queries.");
}
// Otherwise, present a dialog so the user can choose the item they want to use.
const comparableQueryLabels = this.treeDataProvider.allHistory
.filter(this.isSuccessfulCompletedLocalQueryInfo)
.filter((otherItem) => otherItem !== fromItem)
.map((item) => ({
label: this.labelProvider.getLabel(item),
description: item.databaseName,
detail: item.completedQuery.message,
query: item,
}));
const comparableQueryLabelsWithDefault = [
{
label: "Single run",
description:
"Look at the performance of this run, compared to a trivial baseline",
detail: undefined,
query: undefined,
},
...comparableQueryLabels,
];
if (comparableQueryLabelsWithDefault.length < 1) {
throw new Error("No other queries available to compare with.");
}
const choice = await window.showQuickPick(comparableQueryLabelsWithDefault);
return choice?.query;
}
/**
* Updates the compare with source query. This ensures that all compare command invocations
* when exactly 2 queries are selected always have the proper _from_ query. Always use

View File

@@ -0,0 +1,31 @@
import { styled } from "styled-components";
import { WarningIcon } from "./icon/WarningIcon";
const WarningBoxDiv = styled.div`
max-width: 100em;
padding: 0.5em 1em;
border: 1px solid var(--vscode-widget-border);
box-shadow: var(--vscode-widget-shadow) 0px 3px 8px;
display: flex;
`;
const IconPane = styled.p`
width: 3em;
flex-shrink: 0;
text-align: center;
`;
export interface WarningBoxProps {
children: React.ReactNode;
}
export function WarningBox(props: WarningBoxProps) {
return (
<WarningBoxDiv>
<IconPane>
<WarningIcon />
</IconPane>
<p>{props.children}</p>
</WarningBoxDiv>
);
}

View File

@@ -6,3 +6,4 @@ export * from "./HorizontalSpace";
export * from "./SectionTitle";
export * from "./VerticalSpace";
export * from "./ViewTitle";
export * from "./WarningBox";

View File

@@ -0,0 +1,862 @@
import type { ChangeEvent } from "react";
import {
Fragment,
memo,
useDeferredValue,
useMemo,
useRef,
useState,
} from "react";
import type {
SetPerformanceComparisonQueries,
ToComparePerformanceViewMessage,
} from "../../common/interface-types";
import { useMessageFromExtension } from "../common/useMessageFromExtension";
import type {
PerformanceComparisonDataFromLog,
PipelineSummary,
} from "../../log-insights/performance-comparison";
import { formatDecimal } from "../../common/number";
import { styled } from "styled-components";
import { Codicon, ViewTitle, WarningBox } from "../common";
import { abbreviateRANames, abbreviateRASteps } from "./RAPrettyPrinter";
import { Renaming, RenamingInput } from "./RenamingInput";
const enum AbsentReason {
NotSeen = "NotSeen",
CacheHit = "CacheHit",
Sentinel = "Sentinel",
}
type Optional<T> = AbsentReason | T;
function isPresent<T>(x: Optional<T>): x is T {
return typeof x !== "string";
}
interface PredicateInfo {
tuples: number;
evaluationCount: number;
iterationCount: number;
timeCost: number;
pipelines: Record<string, PipelineSummary>;
}
class ComparisonDataset {
public nameToIndex = new Map<string, number>();
public cacheHitIndices: Set<number>;
public sentinelEmptyIndices: Set<number>;
constructor(public data: PerformanceComparisonDataFromLog) {
const { names } = data;
const { nameToIndex } = this;
for (let i = 0; i < names.length; i++) {
nameToIndex.set(names[i], i);
}
this.cacheHitIndices = new Set(data.cacheHitIndices);
this.sentinelEmptyIndices = new Set(data.sentinelEmptyIndices);
}
getTupleCountInfo(name: string): Optional<PredicateInfo> {
const { data, nameToIndex, cacheHitIndices, sentinelEmptyIndices } = this;
const index = nameToIndex.get(name);
if (index == null) {
return AbsentReason.NotSeen;
}
const tupleCost = data.tupleCosts[index];
if (tupleCost === 0) {
if (sentinelEmptyIndices.has(index)) {
return AbsentReason.Sentinel;
} else if (cacheHitIndices.has(index)) {
return AbsentReason.CacheHit;
}
}
return {
evaluationCount: data.evaluationCounts[index],
iterationCount: data.iterationCounts[index],
timeCost: data.timeCosts[index],
tuples: tupleCost,
pipelines: data.pipelineSummaryList[index],
};
}
}
function renderOptionalValue(x: Optional<number>, unit?: string) {
switch (x) {
case AbsentReason.NotSeen:
return <AbsentNumberCell>n/a</AbsentNumberCell>;
case AbsentReason.CacheHit:
return <AbsentNumberCell>cache hit</AbsentNumberCell>;
case AbsentReason.Sentinel:
return <AbsentNumberCell>sentinel empty</AbsentNumberCell>;
default:
return (
<NumberCell>
{formatDecimal(x)}
{renderUnit(unit)}
</NumberCell>
);
}
}
function renderPredicateMetric(
x: Optional<PredicateInfo>,
metric: Metric,
isPerEvaluation: boolean,
) {
return renderOptionalValue(
metricGetOptional(metric, x, isPerEvaluation),
metric.unit,
);
}
function renderDelta(x: number, unit?: string) {
const sign = x > 0 ? "+" : "";
return (
<NumberCell className={x > 0 ? "bad-value" : x < 0 ? "good-value" : ""}>
{sign}
{formatDecimal(x)}
{renderUnit(unit)}
</NumberCell>
);
}
function renderUnit(unit: string | undefined) {
return unit == null ? "" : ` ${unit}`;
}
function orderBy<T>(fn: (x: T) => number | string) {
return (x: T, y: T) => {
const fx = fn(x);
const fy = fn(y);
return fx === fy ? 0 : fx < fy ? -1 : 1;
};
}
const ChevronCell = styled.td`
width: 1em !important;
`;
const NameHeader = styled.th`
text-align: left;
`;
const NumberHeader = styled.th`
text-align: right;
width: 10em !important;
`;
const NameCell = styled.td``;
const NumberCell = styled.td`
text-align: right;
width: 10em !important;
&.bad-value {
color: var(--vscode-problemsErrorIcon-foreground);
tr.expanded & {
color: inherit;
}
}
&.good-value {
color: var(--vscode-problemsInfoIcon-foreground);
tr.expanded & {
color: inherit;
}
}
`;
const AbsentNumberCell = styled.td`
text-align: right;
color: var(--vscode-disabledForeground);
tr.expanded & {
color: inherit;
}
width: 10em !important;
`;
const Table = styled.table`
border-collapse: collapse;
width: 100%;
border-spacing: 0;
background-color: var(--vscode-background);
color: var(--vscode-foreground);
& td {
padding: 0.5em;
}
& th {
padding: 0.5em;
}
&.expanded {
border: 1px solid var(--vscode-list-activeSelectionBackground);
margin-bottom: 1em;
}
word-break: break-all;
`;
const PredicateTR = styled.tr`
cursor: pointer;
&.expanded {
background-color: var(--vscode-list-activeSelectionBackground);
color: var(--vscode-list-activeSelectionForeground);
position: sticky;
top: 0;
}
& .codicon-chevron-right {
visibility: hidden;
}
&:hover:not(.expanded) {
background-color: var(--vscode-list-hoverBackground);
& .codicon-chevron-right {
visibility: visible;
}
}
`;
const PipelineStepTR = styled.tr`
& td {
padding-top: 0.3em;
padding-bottom: 0.3em;
}
`;
const Dropdown = styled.select``;
interface PipelineStepProps {
before: number | undefined;
after: number | undefined;
comparison: boolean;
step: React.ReactNode;
}
/**
* Row with details of a pipeline step, or one of the high-level stats appearing above the pipelines (evaluation/iteration counts).
*/
function PipelineStep(props: PipelineStepProps) {
let { before, after, comparison, step } = props;
if (before != null && before < 0) {
before = undefined;
}
if (after != null && after < 0) {
after = undefined;
}
const delta = before != null && after != null ? after - before : undefined;
return (
<PipelineStepTR>
<ChevronCell />
{comparison && (
<NumberCell>{before != null ? formatDecimal(before) : ""}</NumberCell>
)}
<NumberCell>{after != null ? formatDecimal(after) : ""}</NumberCell>
{comparison && (delta != null ? renderDelta(delta) : <td></td>)}
<NameCell>{step}</NameCell>
</PipelineStepTR>
);
}
const HeaderTR = styled.tr`
background-color: var(--vscode-sideBar-background);
`;
interface HeaderRowProps {
hasBefore?: boolean;
hasAfter?: boolean;
comparison: boolean;
title: React.ReactNode;
}
function HeaderRow(props: HeaderRowProps) {
const { comparison, hasBefore, hasAfter, title } = props;
return (
<HeaderTR>
<ChevronCell />
{comparison ? (
<>
<NumberHeader>{hasBefore ? "Before" : ""}</NumberHeader>
<NumberHeader>{hasAfter ? "After" : ""}</NumberHeader>
<NumberHeader>{hasBefore && hasAfter ? "Delta" : ""}</NumberHeader>
</>
) : (
<NumberHeader>Value</NumberHeader>
)}
<NameHeader>{title}</NameHeader>
</HeaderTR>
);
}
interface HighLevelStatsProps {
before: Optional<PredicateInfo>;
after: Optional<PredicateInfo>;
comparison: boolean;
}
function HighLevelStats(props: HighLevelStatsProps) {
const { before, after, comparison } = props;
const hasBefore = isPresent(before);
const hasAfter = isPresent(after);
const showEvaluationCount =
(hasBefore && before.evaluationCount > 1) ||
(hasAfter && after.evaluationCount > 1);
return (
<>
<HeaderRow
hasBefore={hasBefore}
hasAfter={hasAfter}
title="Stats"
comparison={comparison}
/>
{showEvaluationCount && (
<PipelineStep
before={hasBefore ? before.evaluationCount : undefined}
after={hasAfter ? after.evaluationCount : undefined}
comparison={comparison}
step="Number of evaluations"
/>
)}
<PipelineStep
before={
hasBefore ? before.iterationCount / before.evaluationCount : undefined
}
after={
hasAfter ? after.iterationCount / after.evaluationCount : undefined
}
comparison={comparison}
step={
showEvaluationCount
? "Number of iterations per evaluation"
: "Number of iterations"
}
/>
</>
);
}
interface Row {
name: string;
before: Optional<PredicateInfo>;
after: Optional<PredicateInfo>;
diff: number;
}
/**
* A set of predicates that have been grouped together because their names have the same fingerprint.
*/
interface RowGroup {
name: string;
rows: Row[];
before: Optional<number>;
after: Optional<number>;
diff: number;
}
function getSortOrder(sortOrder: "delta" | "absDelta") {
if (sortOrder === "absDelta") {
return orderBy((row: { diff: number }) => -Math.abs(row.diff));
}
return orderBy((row: { diff: number }) => row.diff);
}
interface Metric {
title: string;
get(info: PredicateInfo): number;
unit?: string;
}
const metrics: Record<string, Metric> = {
tuples: {
title: "Tuple count",
get: (info) => info.tuples,
},
time: {
title: "Time spent",
get: (info) => info.timeCost,
unit: "ms",
},
evaluations: {
title: "Evaluations",
get: (info) => info.evaluationCount,
},
iterationsTotal: {
title: "Iterations",
get: (info) => info.iterationCount,
},
};
function metricGetOptional(
metric: Metric,
info: Optional<PredicateInfo>,
isPerEvaluation: boolean,
): Optional<number> {
if (!isPresent(info)) {
return info;
}
const value = metric.get(info);
return isPerEvaluation ? (value / info.evaluationCount) | 0 : value;
}
function addOptionals(a: Optional<number>, b: Optional<number>) {
if (isPresent(a) && isPresent(b)) {
return a + b;
}
if (isPresent(a)) {
return a;
}
if (isPresent(b)) {
return b;
}
if (a === b) {
return a; // If absent for the same reason, preserve that reason
}
return 0; // Otherwise collapse to zero
}
/**
* Returns a "fingerprint" from the given name, which is used to group together similar names.
*/
function getNameFingerprint(name: string, renamings: Renaming[]) {
for (const { patternRegexp, replacement } of renamings) {
if (patternRegexp != null) {
name = name.replace(patternRegexp, replacement);
}
}
return name;
}
function Chevron({ expanded }: { expanded: boolean }) {
return <Codicon name={expanded ? "chevron-down" : "chevron-right"} />;
}
function union<T>(a: Set<T> | T[], b: Set<T> | T[]) {
const result = new Set(a);
for (const x of b) {
result.add(x);
}
return result;
}
export function ComparePerformance(_: Record<string, never>) {
const [data, setData] = useState<
SetPerformanceComparisonQueries | undefined
>();
useMessageFromExtension<ToComparePerformanceViewMessage>(
(msg) => {
setData(msg);
},
[setData],
);
if (!data) {
return <div>Loading performance comparison...</div>;
}
return <ComparePerformanceWithData data={data} />;
}
function ComparePerformanceWithData(props: {
data: SetPerformanceComparisonQueries;
}) {
const { data } = props;
const { from, to } = useMemo(
() => ({
from: new ComparisonDataset(data.from),
to: new ComparisonDataset(data.to),
}),
[data],
);
const comparison = data?.comparison;
const [hideCacheHits, setHideCacheHits] = useState(false);
const [sortOrder, setSortOrder] = useState<"delta" | "absDelta">("absDelta");
const [metric, setMetric] = useState<Metric>(metrics.tuples);
const [isPerEvaluation, setPerEvaluation] = useState(false);
const nameSet = useMemo(
() => union(from.data.names, to.data.names),
[from, to],
);
const hasCacheHitMismatch = useRef(false);
const rows: Row[] = useMemo(() => {
hasCacheHitMismatch.current = false;
return Array.from(nameSet)
.map((name) => {
const before = from.getTupleCountInfo(name);
const after = to.getTupleCountInfo(name);
const beforeValue = metricGetOptional(metric, before, isPerEvaluation);
const afterValue = metricGetOptional(metric, after, isPerEvaluation);
if (beforeValue === afterValue) {
return undefined!;
}
if (
before === AbsentReason.CacheHit ||
after === AbsentReason.CacheHit
) {
hasCacheHitMismatch.current = true;
if (hideCacheHits) {
return undefined!;
}
}
const diff =
(isPresent(afterValue) ? afterValue : 0) -
(isPresent(beforeValue) ? beforeValue : 0);
return { name, before, after, diff } satisfies Row;
})
.filter((x) => !!x)
.sort(getSortOrder(sortOrder));
}, [nameSet, from, to, metric, hideCacheHits, sortOrder, isPerEvaluation]);
const { totalBefore, totalAfter, totalDiff } = useMemo(() => {
let totalBefore = 0;
let totalAfter = 0;
let totalDiff = 0;
for (const row of rows) {
totalBefore += isPresent(row.before) ? metric.get(row.before) : 0;
totalAfter += isPresent(row.after) ? metric.get(row.after) : 0;
totalDiff += row.diff;
}
return { totalBefore, totalAfter, totalDiff };
}, [rows, metric]);
const [renamings, setRenamings] = useState<Renaming[]>(() => [
new Renaming("#[0-9a-f]{8}(?![0-9a-f])", "#"),
]);
// Use deferred value to avoid expensive re-rendering for every keypress in the renaming editor
const deferredRenamings = useDeferredValue(renamings);
const rowGroups = useMemo(() => {
const groupedRows = new Map<string, Row[]>();
for (const row of rows) {
const fingerprint = getNameFingerprint(row.name, deferredRenamings);
const rows = groupedRows.get(fingerprint);
if (rows) {
rows.push(row);
} else {
groupedRows.set(fingerprint, [row]);
}
}
return Array.from(groupedRows.entries())
.map(([fingerprint, rows]) => {
const before = rows
.map((row) => metricGetOptional(metric, row.before, isPerEvaluation))
.reduce(addOptionals);
const after = rows
.map((row) => metricGetOptional(metric, row.after, isPerEvaluation))
.reduce(addOptionals);
return {
name: rows.length === 1 ? rows[0].name : fingerprint,
before,
after,
diff:
(isPresent(after) ? after : 0) - (isPresent(before) ? before : 0),
rows,
} satisfies RowGroup;
})
.sort(getSortOrder(sortOrder));
}, [rows, metric, sortOrder, deferredRenamings, isPerEvaluation]);
const rowGroupNames = useMemo(
() => abbreviateRANames(rowGroups.map((group) => group.name)),
[rowGroups],
);
return (
<>
<ViewTitle>Performance comparison</ViewTitle>
{comparison && hasCacheHitMismatch.current && (
<WarningBox>
<strong>Inconsistent cache hits</strong>
<br />
Some predicates had a cache hit on one side but not the other. For
more accurate results, try running the{" "}
<strong>CodeQL: Clear Cache</strong> command before each query.
<br />
<br />
<label>
<input
type="checkbox"
checked={hideCacheHits}
onChange={() => setHideCacheHits(!hideCacheHits)}
/>
Hide predicates with cache hits
</label>
</WarningBox>
)}
<RenamingInput renamings={renamings} setRenamings={setRenamings} />
Compare{" "}
<Dropdown
onChange={(e: ChangeEvent<HTMLSelectElement>) =>
setMetric(metrics[e.target.value])
}
>
{Object.entries(metrics).map(([key, value]) => (
<option key={key} value={key}>
{value.title}
</option>
))}
</Dropdown>{" "}
<Dropdown
onChange={(e: ChangeEvent<HTMLSelectElement>) =>
setPerEvaluation(e.target.value === "per-evaluation")
}
>
<option value="total">Overall</option>
<option value="per-evaluation">Per evaluation</option>
</Dropdown>{" "}
{comparison && (
<>
sorted by{" "}
<Dropdown
onChange={(e: ChangeEvent<HTMLSelectElement>) =>
setSortOrder(e.target.value as "delta" | "absDelta")
}
value={sortOrder}
>
<option value="delta">Delta</option>
<option value="absDelta">Absolute delta</option>
</Dropdown>
</>
)}
<Table>
<thead>
<HeaderRow comparison={comparison} title="Predicate" />
</thead>
<tbody>
<tr key="total">
<ChevronCell />
{comparison && renderOptionalValue(totalBefore, metric.unit)}
{renderOptionalValue(totalAfter, metric.unit)}
{comparison && renderDelta(totalDiff, metric.unit)}
<NameCell>
<strong>TOTAL</strong>
</NameCell>
</tr>
<tr key="spacing">
<td colSpan={5} style={{ height: "1em" }}></td>
</tr>
</tbody>
</Table>
<PredicateTable
rowGroups={rowGroups}
rowGroupNames={rowGroupNames}
comparison={comparison}
metric={metric}
isPerEvaluation={isPerEvaluation}
/>
</>
);
}
interface PredicateTableProps {
rowGroups: RowGroup[];
rowGroupNames: React.ReactNode[];
comparison: boolean;
metric: Metric;
isPerEvaluation: boolean;
}
function PredicateTableRaw(props: PredicateTableProps) {
const { comparison, metric, rowGroupNames, rowGroups, isPerEvaluation } =
props;
return rowGroups.map((rowGroup, rowGroupIndex) => (
<PredicateRowGroup
key={rowGroupIndex}
renderedName={rowGroupNames[rowGroupIndex]}
rowGroup={rowGroup}
comparison={comparison}
metric={metric}
isPerEvaluation={isPerEvaluation}
/>
));
}
const PredicateTable = memo(PredicateTableRaw);
interface PredicateRowGroupProps {
renderedName: React.ReactNode;
rowGroup: RowGroup;
comparison: boolean;
metric: Metric;
isPerEvaluation: boolean;
}
function PredicateRowGroup(props: PredicateRowGroupProps) {
const { renderedName, rowGroup, comparison, metric, isPerEvaluation } = props;
const [isExpanded, setExpanded] = useState(false);
const rowNames = useMemo(
() => abbreviateRANames(rowGroup.rows.map((row) => row.name)),
[rowGroup],
);
if (rowGroup.rows.length === 1) {
return <PredicateRow row={rowGroup.rows[0]} {...props} />;
}
return (
<Table className={isExpanded ? "expanded" : ""}>
<tbody>
<PredicateTR
className={isExpanded ? "expanded" : ""}
key={"main"}
onClick={() => setExpanded(!isExpanded)}
>
<ChevronCell>
<Chevron expanded={isExpanded} />
</ChevronCell>
{comparison && renderOptionalValue(rowGroup.before)}
{renderOptionalValue(rowGroup.after)}
{comparison && renderDelta(rowGroup.diff, metric.unit)}
<NameCell>
{renderedName} ({rowGroup.rows.length} predicates)
</NameCell>
</PredicateTR>
{isExpanded &&
rowGroup.rows.map((row, rowIndex) => (
<tr key={rowIndex}>
<td colSpan={5}>
<PredicateRow
renderedName={rowNames[rowIndex]}
row={row}
comparison={comparison}
metric={metric}
isPerEvaluation={isPerEvaluation}
/>
</td>
</tr>
))}
</tbody>
</Table>
);
}
interface PredicateRowProps {
renderedName: React.ReactNode;
row: Row;
comparison: boolean;
metric: Metric;
isPerEvaluation: boolean;
}
function PredicateRow(props: PredicateRowProps) {
const [isExpanded, setExpanded] = useState(false);
const { renderedName, row, comparison, metric, isPerEvaluation } = props;
const evaluationFactorBefore =
isPerEvaluation && isPresent(row.before) ? row.before.evaluationCount : 1;
const evaluationFactorAfter =
isPerEvaluation && isPresent(row.after) ? row.after.evaluationCount : 1;
return (
<Table className={isExpanded ? "expanded" : ""}>
<tbody>
<PredicateTR
className={isExpanded ? "expanded" : ""}
key={"main"}
onClick={() => setExpanded(!isExpanded)}
>
<ChevronCell>
<Chevron expanded={isExpanded} />
</ChevronCell>
{comparison &&
renderPredicateMetric(row.before, metric, isPerEvaluation)}
{renderPredicateMetric(row.after, metric, isPerEvaluation)}
{comparison && renderDelta(row.diff, metric.unit)}
<NameCell>{renderedName}</NameCell>
</PredicateTR>
{isExpanded && (
<>
<HighLevelStats
before={row.before}
after={row.after}
comparison={comparison}
/>
{collatePipelines(
isPresent(row.before) ? row.before.pipelines : {},
isPresent(row.after) ? row.after.pipelines : {},
).map(({ name, first, second }, pipelineIndex) => (
<Fragment key={pipelineIndex}>
<HeaderRow
hasBefore={first != null}
hasAfter={second != null}
comparison={comparison}
title={
<>
Tuple counts for &apos;{name}&apos; pipeline
{comparison &&
(first == null
? " (after)"
: second == null
? " (before)"
: "")}
</>
}
/>
{abbreviateRASteps(first?.steps ?? second?.steps ?? []).map(
(step, index) => (
<PipelineStep
key={index}
before={
first &&
(first.counts[index] / evaluationFactorBefore) | 0
}
after={
second &&
(second.counts[index] / evaluationFactorAfter) | 0
}
comparison={comparison}
step={step}
/>
),
)}
</Fragment>
))}
</>
)}
</tbody>
</Table>
);
}
interface PipelinePair {
name: string;
first: PipelineSummary | undefined;
second: PipelineSummary | undefined;
}
function collatePipelines(
before: Record<string, PipelineSummary>,
after: Record<string, PipelineSummary>,
): PipelinePair[] {
const result: PipelinePair[] = [];
for (const [name, first] of Object.entries(before)) {
const second = after[name];
if (second == null) {
result.push({ name, first, second: undefined });
} else if (samePipeline(first.steps, second.steps)) {
result.push({ name, first, second });
} else {
result.push({ name, first, second: undefined });
result.push({ name, first: undefined, second });
}
}
for (const [name, second] of Object.entries(after)) {
if (before[name] == null) {
result.push({ name, first: undefined, second });
}
}
return result;
}
function samePipeline(a: string[], b: string[]) {
return a.length === b.length && a.every((x, i) => x === b[i]);
}

View File

@@ -0,0 +1,282 @@
import { Fragment, useState } from "react";
import { styled } from "styled-components";
/**
* A set of names, for generating unambiguous abbreviations.
*/
class NameSet {
private readonly abbreviations = new Map<string, React.ReactNode>();
constructor(readonly names: string[]) {
const qnames = names.map(parseName);
const builder = new TrieBuilder();
qnames
.map((qname) => builder.visitQName(qname))
.forEach((r, index) => {
this.abbreviations.set(names[index], r.abbreviate(true));
});
}
public getAbbreviation(name: string): React.ReactNode {
return this.abbreviations.get(name) ?? name;
}
}
/** Name parsed into the form `prefix::name<args>` */
interface QualifiedName {
prefix?: QualifiedName;
name: string;
args?: QualifiedName[];
}
function qnameToString(name: QualifiedName): string {
const parts: string[] = [];
if (name.prefix != null) {
parts.push(qnameToString(name.prefix));
parts.push("::");
}
parts.push(name.name);
if (name.args != null && name.args.length > 0) {
parts.push("<");
parts.push(name.args.map(qnameToString).join(","));
parts.push(">");
}
return parts.join("");
}
function tokeniseName(text: string) {
return Array.from(text.matchAll(/:+|<|>|,|"[^"]+"|`[^`]+`|[^:<>,"`]+/g));
}
function parseName(text: string): QualifiedName {
const tokens = tokeniseName(text);
function next() {
return tokens.pop()![0];
}
function peek() {
return tokens[tokens.length - 1][0];
}
function skipToken(token: string) {
if (tokens.length > 0 && peek() === token) {
tokens.pop();
return true;
} else {
return false;
}
}
function parseQName(): QualifiedName {
// Note that the tokens stream is parsed in reverse order. This is simpler, but may look confusing initially.
let args: QualifiedName[] | undefined;
if (skipToken(">")) {
args = [];
while (tokens.length > 0 && peek() !== "<") {
args.push(parseQName());
skipToken(",");
}
args.reverse();
skipToken("<");
}
const name = tokens.length === 0 ? "" : next();
const prefix = skipToken("::") ? parseQName() : undefined;
return {
prefix,
name,
args,
};
}
const result = parseQName();
if (tokens.length > 0) {
// It's a parse error if we did not consume all tokens.
// Just treat the whole text as the 'name'.
return { prefix: undefined, name: text, args: undefined };
}
return result;
}
class TrieNode {
children = new Map<string, TrieNode>();
constructor(readonly index: number) {}
}
interface VisitResult {
node: TrieNode;
abbreviate: (isRoot?: boolean) => React.ReactNode;
}
class TrieBuilder {
root = new TrieNode(0);
nextId = 1;
getOrCreate(trieNode: TrieNode, child: string) {
const { children } = trieNode;
let node = children.get(child);
if (node == null) {
node = new TrieNode(this.nextId++);
children.set(child, node);
}
return node;
}
visitQName(qname: QualifiedName): VisitResult {
const prefix =
qname.prefix != null ? this.visitQName(qname.prefix) : undefined;
const trieNodeBeforeArgs = this.getOrCreate(
prefix?.node ?? this.root,
qname.name,
);
let trieNode = trieNodeBeforeArgs;
const args = qname.args?.map((arg) => this.visitQName(arg));
if (args != null) {
const argKey = args.map((arg) => arg.node.index).join(",");
trieNode = this.getOrCreate(trieNodeBeforeArgs, argKey);
}
return {
node: trieNode,
abbreviate: (isRoot = false) => {
const result: React.ReactNode[] = [];
if (prefix != null) {
result.push(prefix.abbreviate());
result.push("::");
}
const { name } = qname;
const hash = name.indexOf("#");
if (hash !== -1 && isRoot) {
const shortName = name.substring(0, hash);
result.push(<IdentifierSpan>{shortName}</IdentifierSpan>);
result.push(name.substring(hash));
} else {
result.push(isRoot ? <IdentifierSpan>{name}</IdentifierSpan> : name);
}
if (args != null) {
result.push("<");
if (trieNodeBeforeArgs.children.size === 1) {
const argsText = qname
.args!.map((arg) => qnameToString(arg))
.join(",");
result.push(<ExpandableNamePart>{argsText}</ExpandableNamePart>);
} else {
let first = true;
for (const arg of args) {
result.push(arg.abbreviate());
if (first) {
first = false;
} else {
result.push(",");
}
}
}
result.push(">");
}
return result;
},
};
}
}
const ExpandableTextButton = styled.button`
background: none;
border: none;
cursor: pointer;
padding: 0;
color: inherit;
&:hover {
background-color: rgba(128, 128, 128, 0.2);
}
`;
interface ExpandableNamePartProps {
children: React.ReactNode;
}
function ExpandableNamePart(props: ExpandableNamePartProps) {
const [isExpanded, setExpanded] = useState(false);
return (
<ExpandableTextButton
onClick={(event: Event) => {
setExpanded(!isExpanded);
event.stopPropagation();
}}
>
{isExpanded ? props.children : "..."}
</ExpandableTextButton>
);
}
/**
* Span enclosing an entire qualified name.
*
* Can be used to gray out uninteresting parts of the name, though this looks worse than expected.
*/
const QNameSpan = styled.span`
/* color: var(--vscode-disabledForeground); */
`;
/** Span enclosing the innermost identifier, e.g. the `foo` in `A::B<X>::foo#abc` */
const IdentifierSpan = styled.span`
font-weight: 600;
`;
/** Span enclosing keywords such as `JOIN` and `WITH`. */
const KeywordSpan = styled.span`
font-weight: 500;
`;
const nameTokenRegex = /\b[^ (]+\b/g;
function traverseMatches(
text: string,
regex: RegExp,
callbacks: {
onMatch: (match: RegExpMatchArray) => void;
onText: (text: string) => void;
},
) {
const matches = Array.from(text.matchAll(regex));
let lastIndex = 0;
for (const match of matches) {
const before = text.substring(lastIndex, match.index);
if (before !== "") {
callbacks.onText(before);
}
callbacks.onMatch(match);
lastIndex = match.index + match[0].length;
}
const after = text.substring(lastIndex);
if (after !== "") {
callbacks.onText(after);
}
}
export function abbreviateRASteps(steps: string[]): React.ReactNode[] {
const nameTokens = steps.flatMap((step) =>
Array.from(step.matchAll(nameTokenRegex)).map((tok) => tok[0]),
);
const nameSet = new NameSet(nameTokens.filter((name) => name.includes("::")));
return steps.map((step, index) => {
const result: React.ReactNode[] = [];
traverseMatches(step, nameTokenRegex, {
onMatch(match) {
const text = match[0];
if (text.includes("::")) {
result.push(<QNameSpan>{nameSet.getAbbreviation(text)}</QNameSpan>);
} else if (/[A-Z]+/.test(text)) {
result.push(<KeywordSpan>{text}</KeywordSpan>);
} else {
result.push(match[0]);
}
},
onText(text) {
result.push(text);
},
});
return <Fragment key={index}>{result}</Fragment>;
});
}
export function abbreviateRANames(names: string[]): React.ReactNode[] {
const nameSet = new NameSet(names);
return names.map((name) => nameSet.getAbbreviation(name));
}

View File

@@ -0,0 +1,106 @@
import type { ChangeEvent } from "react";
import { styled } from "styled-components";
import {
VSCodeButton,
VSCodeTextField,
} from "@vscode/webview-ui-toolkit/react";
import { Codicon } from "../common";
export class Renaming {
patternRegexp: RegExp | undefined;
constructor(
public pattern: string,
public replacement: string,
) {
this.patternRegexp = tryCompilePattern(pattern);
}
}
function tryCompilePattern(pattern: string): RegExp | undefined {
try {
return new RegExp(pattern, "i");
} catch {
return undefined;
}
}
const Input = styled(VSCodeTextField)`
width: 20em;
`;
const Row = styled.div`
display: flex;
padding-bottom: 0.25em;
`;
const Details = styled.details`
padding: 1em;
`;
interface RenamingInputProps {
renamings: Renaming[];
setRenamings: (renamings: Renaming[]) => void;
}
export function RenamingInput(props: RenamingInputProps) {
const { renamings, setRenamings } = props;
return (
<Details>
<summary>Predicate renaming</summary>
<p>
The following regexp replacements are applied to every predicate name on
both sides. Predicates whose names clash after renaming are grouped
together. Can be used to correlate predicates that were renamed between
the two runs.
<br />
Can also be used to group related predicates, for example, renaming{" "}
<code>.*ssa.*</code> to <code>SSA</code> will group all SSA-related
predicates together.
</p>
{renamings.map((renaming, index) => (
<Row key={index}>
<Input
value={renaming.pattern}
placeholder="Pattern"
onInput={(e: ChangeEvent<HTMLInputElement>) => {
const newRenamings = [...renamings];
newRenamings[index] = new Renaming(
e.target.value,
renaming.replacement,
);
setRenamings(newRenamings);
}}
>
<Codicon name="search" slot="start" />
</Input>
<Input
value={renaming.replacement}
placeholder="Replacement"
onInput={(e: ChangeEvent<HTMLInputElement>) => {
const newRenamings = [...renamings];
newRenamings[index] = new Renaming(
renaming.pattern,
e.target.value,
);
setRenamings(newRenamings);
}}
></Input>
<VSCodeButton
onClick={() =>
setRenamings(renamings.filter((_, i) => i !== index))
}
>
<Codicon name="trash" />
</VSCodeButton>
<br />
</Row>
))}
<VSCodeButton
onClick={() => setRenamings([...renamings, new Renaming("", "")])}
>
Add renaming rule
</VSCodeButton>
</Details>
);
}

View File

@@ -0,0 +1,8 @@
import type { WebviewDefinition } from "../webview-definition";
import { ComparePerformance } from "./ComparePerformance";
const definition: WebviewDefinition = {
component: <ComparePerformance />,
};
export default definition;

View File

@@ -6,6 +6,7 @@ import { registerUnhandledErrorListener } from "./common/errors";
import type { WebviewDefinition } from "./webview-definition";
import compareView from "./compare";
import comparePerformance from "./compare-performance";
import dataFlowPathsView from "./data-flow-paths";
import methodModelingView from "./method-modeling";
import modelEditorView from "./model-editor";
@@ -18,6 +19,7 @@ import "@vscode/codicons/dist/codicon.css";
const views: Record<string, WebviewDefinition> = {
compare: compareView,
"compare-performance": comparePerformance,
"data-flow-paths": dataFlowPathsView,
"method-modeling": methodModelingView,
"model-editor": modelEditorView,

View File

@@ -1,9 +1,6 @@
[
"v2.20.0",
"v2.20.5",
"v2.19.4",
"v2.19.3",
"v2.18.4",
"v2.17.6",
"v2.16.6",
"nightly"
]

View File

@@ -1065,7 +1065,7 @@ repository:
beginPattern: '#as'
# Ends after the first identifier we encounter.
# REVIEW: Make similar to import-as-clause.
end: '(?<=(?#id-character)(?#end-of-id))'
end: '(?<=(?#id-character))(?#end-of-id)'
match: meta.block.select-as-clause.ql
patterns:
- include: '#non-context-sensitive'

View File

@@ -1,4 +1,4 @@
FROM codercom/code-server:4.96.1
FROM codercom/code-server:4.97.2
USER root

View File

@@ -1,5 +1,4 @@
import type { ExtensionPack } from "../../../src/model-editor/shared/extension-pack";
import { join } from "path";
export function createMockExtensionPack({
path = "/path/to/extension-pack",
@@ -7,7 +6,7 @@ export function createMockExtensionPack({
}: Partial<ExtensionPack> = {}): ExtensionPack {
return {
path,
yamlPath: join(path, "codeql-pack.yml"),
yamlPath: `${path}/codeql-pack.yml`,
name: "sql2o",
version: "0.0.0",
language: "java",

View File

@@ -3,6 +3,7 @@ import { Uri } from "vscode";
import { remove } from "fs-extra";
import { join } from "path";
import { isIOError } from "../../../../src/common/files";
import { QLTestDiscovery } from "../../../../src/query-testing/qltest-discovery";
import type { DirectoryResult } from "tmp-promise";
import { dir } from "tmp-promise";
@@ -49,7 +50,15 @@ describe("qltest-discovery", () => {
});
afterEach(async () => {
await directory.cleanup();
try {
await directory.cleanup();
} catch (e) {
if (isIOError(e) && e.code === "ENOENT") {
// This is fine, the directory was already removed
} else {
throw e;
}
}
});
it("should run discovery", async () => {

View File

@@ -38,6 +38,7 @@ describe("HistoryTreeDataProvider", () => {
let app: App;
let configListener: QueryHistoryConfigListener;
const doCompareCallback = jest.fn();
const doComparePerformanceCallback = jest.fn();
let queryHistoryManager: QueryHistoryManager;
@@ -506,6 +507,7 @@ describe("HistoryTreeDataProvider", () => {
}),
languageContext,
doCompareCallback,
doComparePerformanceCallback,
);
(qhm.treeDataProvider as any).history = [...allHistory];
await workspace.saveAll();

View File

@@ -40,6 +40,7 @@ describe("QueryHistoryManager", () => {
typeof variantAnalysisManagerStub.cancelVariantAnalysis
>;
const doCompareCallback = jest.fn();
const doComparePerformanceCallback = jest.fn();
let executeCommand: jest.MockedFn<
(commandName: string, ...args: any[]) => Promise<any>
@@ -939,6 +940,7 @@ describe("QueryHistoryManager", () => {
}),
new LanguageContextStore(mockApp),
doCompareCallback,
doComparePerformanceCallback,
);
(qhm.treeDataProvider as any).history = [...allHistory];
await workspace.saveAll();

View File

@@ -105,6 +105,7 @@ describe("Variant Analyses and QueryHistoryManager", () => {
}),
new LanguageContextStore(app),
asyncNoop,
asyncNoop,
);
disposables.push(qhm);

View File

@@ -291,7 +291,7 @@ describe("query-results", () => {
});
const finished = new Promise((res, rej) => {
validSarifStream.addListener("close", res);
validSarifStream.addListener("close", () => res(undefined));
validSarifStream.addListener("error", rej);
});
@@ -357,7 +357,7 @@ describe("query-results", () => {
});
const finished = new Promise((res, rej) => {
invalidSarifStream.addListener("close", res);
invalidSarifStream.addListener("close", () => res(undefined));
invalidSarifStream.addListener("error", rej);
});

View File

@@ -1,12 +0,0 @@
#!/bin/bash
VERSIONS=$(gh api -H "Accept: application/vnd.github+json" /repos/github/codeql-cli-binaries/releases | jq -r '.[].tag_name' | head -2)
# we are exporting these variables so that we can access these variables in the workflow
LATEST_VERSION=$(echo $VERSIONS | awk '{ print $1 }')
PREVIOUS_VERSION=$(echo $VERSIONS | awk '{ print $2 }')
echo "LATEST_VERSION=$LATEST_VERSION" >> $GITHUB_ENV
echo "PREVIOUS_VERSION=$PREVIOUS_VERSION" >> $GITHUB_ENV
sed -i "s/$PREVIOUS_VERSION/$LATEST_VERSION/g" extensions/ql-vscode/supported_cli_versions.json

View File

@@ -675,9 +675,6 @@
"begin": "(?x)(?<=/\\*\\*)([^*]|\\*(?!/))*$",
"while": "(?x)(^|\\G)\\s*([^*]|\\*(?!/))(?=([^*]|[*](?!/))*$)",
"patterns": [
{
"match": "(?x)\\G\\s* (@\\S+)",
"name": "keyword.tag.ql"
@@ -1469,7 +1466,7 @@
}
},
"select-as-clause": {
"end": "(?x)(?<=(?:[0-9A-Za-z_])(?:(?!(?:[0-9A-Za-z_]))))",
"end": "(?x)(?<=(?:[0-9A-Za-z_]))(?:(?!(?:[0-9A-Za-z_])))",
"match": "(?x)meta.block.select-as-clause.ql",
"patterns": [
{
@@ -1540,4 +1537,4 @@
"name": "constant.character.escape.ql"
}
}
}
}