From a8101c12b5bc7e3f6ef323f5fc59f58d448acdbe Mon Sep 17 00:00:00 2001 From: Matt Bierner <12821956+mjbvz@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:15:39 -0700 Subject: [PATCH 01/11] Fix any cases in md extension For #269213 --- .../notebook/index.ts | 12 ++++----- .../package-lock.json | 17 ++++++------ .../markdown-language-features/package.json | 6 ++--- .../preview-src/index.ts | 14 +++++----- .../src/client/protocol.ts | 3 +-- .../src/languageFeatures/diagnostics.ts | 3 +-- .../src/markdownEngine.ts | 26 +++++++++---------- 7 files changed, 39 insertions(+), 42 deletions(-) diff --git a/extensions/markdown-language-features/notebook/index.ts b/extensions/markdown-language-features/notebook/index.ts index 1c6e68f4de8..3d11a7574bd 100644 --- a/extensions/markdown-language-features/notebook/index.ts +++ b/extensions/markdown-language-features/notebook/index.ts @@ -5,7 +5,6 @@ import DOMPurify from 'dompurify'; import MarkdownIt from 'markdown-it'; -import type * as MarkdownItToken from 'markdown-it/lib/token'; import type { ActivationFunction } from 'vscode-notebook-renderer'; const allowedHtmlTags = Object.freeze(['a', @@ -352,11 +351,11 @@ export const activate: ActivationFunction = (ctx) => { }; -function addNamedHeaderRendering(md: InstanceType): void { +function addNamedHeaderRendering(md: MarkdownIt): void { const slugCounter = new Map(); const originalHeaderOpen = md.renderer.rules.heading_open; - md.renderer.rules.heading_open = (tokens: MarkdownItToken[], idx: number, options, env, self) => { + md.renderer.rules.heading_open = (tokens: MarkdownIt.Token[], idx: number, options, env, self) => { const title = tokens[idx + 1].children!.reduce((acc, t) => acc + t.content, ''); let slug = slugify(title); @@ -378,17 +377,16 @@ function addNamedHeaderRendering(md: InstanceType): void { }; const originalRender = md.render; - md.render = function () { + md.render = function (str: string, env?: unknown) { slugCounter.clear(); - // eslint-disable-next-line local/code-no-any-casts - return originalRender.apply(this, arguments as any); + return originalRender.call(this, str, env); }; } function addLinkRenderer(md: MarkdownIt): void { const original = md.renderer.rules.link_open; - md.renderer.rules.link_open = (tokens: MarkdownItToken[], idx: number, options, env, self) => { + md.renderer.rules.link_open = (tokens: MarkdownIt.Token[], idx: number, options, env, self) => { const token = tokens[idx]; const href = token.attrGet('href'); if (typeof href === 'string' && href.startsWith('#')) { diff --git a/extensions/markdown-language-features/package-lock.json b/extensions/markdown-language-features/package-lock.json index d8169c35e67..44fee9edb84 100644 --- a/extensions/markdown-language-features/package-lock.json +++ b/extensions/markdown-language-features/package-lock.json @@ -14,7 +14,7 @@ "highlight.js": "^11.8.0", "markdown-it": "^12.3.2", "markdown-it-front-matter": "^0.2.4", - "morphdom": "^2.7.4", + "morphdom": "^2.7.7", "picomatch": "^2.3.1", "punycode": "^2.3.1", "vscode-languageclient": "^8.0.2", @@ -25,7 +25,7 @@ "devDependencies": { "@types/dompurify": "^3.0.5", "@types/lodash.throttle": "^4.1.3", - "@types/markdown-it": "12.2.3", + "@types/markdown-it": "14.1.0", "@types/picomatch": "^2.3.0", "@types/vscode-notebook-renderer": "^1.60.0", "@types/vscode-webview": "^1.57.0", @@ -193,10 +193,11 @@ } }, "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-B/o5iMXxpIAl1+792pO4ryhrNNiAus9HhrTs+Gt2m+6SIdEUEvyOIs0iqDNjTSRgbelWvyeek3UxfYYOKDaWfA==", "dev": true, + "license": "MIT", "dependencies": { "@types/linkify-it": "*", "@types/mdurl": "*" @@ -511,9 +512,9 @@ } }, "node_modules/morphdom": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.4.tgz", - "integrity": "sha512-ATTbWMgGa+FaMU3FhnFYB6WgulCqwf6opOll4CBzmVDTLvPMmUPrEv8CudmLPK0MESa64+6B89fWOxP3+YIlxQ==", + "version": "2.7.7", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.7.tgz", + "integrity": "sha512-04GmsiBcalrSCNmzfo+UjU8tt3PhZJKzcOy+r1FlGA7/zri8wre3I1WkYN9PT3sIeIKfW9bpyElA+VzOg2E24g==", "license": "MIT" }, "node_modules/node-html-parser": { diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index 922fe087af5..d4b197e9496 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -756,7 +756,7 @@ ] }, "scripts": { - "compile": "gulp compile-extension:markdown-language-features-languageService && gulp compile-extension:markdown-language-features && npm run build-preview && npm run build-notebook", + "compile": "gulp compile-extension:markdown-language-features && npm run build-preview && npm run build-notebook", "watch": "npm run build-preview && gulp watch-extension:markdown-language-features watch-extension:markdown-language-features-languageService", "vscode:prepublish": "npm run build-ext && npm run build-preview", "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:markdown-language-features ./tsconfig.json", @@ -771,7 +771,7 @@ "highlight.js": "^11.8.0", "markdown-it": "^12.3.2", "markdown-it-front-matter": "^0.2.4", - "morphdom": "^2.7.4", + "morphdom": "^2.7.7", "picomatch": "^2.3.1", "punycode": "^2.3.1", "vscode-languageclient": "^8.0.2", @@ -782,7 +782,7 @@ "devDependencies": { "@types/dompurify": "^3.0.5", "@types/lodash.throttle": "^4.1.3", - "@types/markdown-it": "12.2.3", + "@types/markdown-it": "14.1.0", "@types/picomatch": "^2.3.0", "@types/vscode-notebook-renderer": "^1.60.0", "@types/vscode-webview": "^1.57.0", diff --git a/extensions/markdown-language-features/preview-src/index.ts b/extensions/markdown-language-features/preview-src/index.ts index b6200b8ceb9..08475ad7fa4 100644 --- a/extensions/markdown-language-features/preview-src/index.ts +++ b/extensions/markdown-language-features/preview-src/index.ts @@ -23,8 +23,12 @@ let documentResource = settings.settings.source; const vscode = acquireVsCodeApi(); -// eslint-disable-next-line local/code-no-any-casts -const originalState = vscode.getState() ?? {} as any; +interface State { + scrollProgress?: number; + resource?: string; +} + +const originalState: State = vscode.getState() ?? {}; const state = { ...originalState, ...getData('data-state') @@ -250,7 +254,6 @@ window.addEventListener('message', async event => { } newRoot.prepend(...styles); - // eslint-disable-next-line local/code-no-any-casts morphdom(root, newRoot, { childrenOnly: true, onBeforeElUpdated: (fromEl: Element, toEl: Element) => { @@ -287,7 +290,7 @@ window.addEventListener('message', async event => { domEval(childNode); } } - } as any); + }); } ++documentVersion; @@ -441,8 +444,7 @@ function domEval(el: Element): void { for (const key of preservedScriptAttributes) { const val = node.getAttribute?.(key); if (val) { - // eslint-disable-next-line local/code-no-any-casts - scriptTag.setAttribute(key, val as any); + scriptTag.setAttribute(key, val); } } diff --git a/extensions/markdown-language-features/src/client/protocol.ts b/extensions/markdown-language-features/src/client/protocol.ts index 69d162f8262..a822327f9ff 100644 --- a/extensions/markdown-language-features/src/client/protocol.ts +++ b/extensions/markdown-language-features/src/client/protocol.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import type Token = require('markdown-it/lib/token'); import * as vscode from 'vscode'; import { FileRename, RequestType } from 'vscode-languageclient'; import type * as lsp from 'vscode-languageserver-types'; @@ -16,7 +15,7 @@ export type ResolvedDocumentLinkTarget = | { readonly kind: 'external'; readonly uri: vscode.Uri }; //#region From server -export const parse = new RequestType<{ uri: string; text?: string }, Token[], any>('markdown/parse'); +export const parse = new RequestType<{ uri: string; text?: string }, md.Token[], any>('markdown/parse'); export const fs_readFile = new RequestType<{ uri: string }, number[], any>('markdown/fs/readFile'); export const fs_readDirectory = new RequestType<{ uri: string }, [string, { isDirectory: boolean }][], any>('markdown/fs/readDirectory'); diff --git a/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts b/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts index 793ea7f64ec..0ffab0b01fb 100644 --- a/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts +++ b/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts @@ -50,8 +50,7 @@ class AddToIgnoreLinksQuickFixProvider implements vscode.CodeActionProvider { case DiagnosticCode.link_noSuchHeaderInOwnFile: case DiagnosticCode.link_noSuchFile: case DiagnosticCode.link_noSuchHeaderInFile: { - // eslint-disable-next-line local/code-no-any-casts - const hrefText = (diagnostic as any).data?.hrefText; + const hrefText = (diagnostic as unknown as Record).data?.hrefText; if (hrefText) { const fix = new vscode.CodeAction( vscode.l10n.t("Exclude '{0}' from link validation.", hrefText), diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts index 733fcf9e437..6a655da5500 100644 --- a/extensions/markdown-language-features/src/markdownEngine.ts +++ b/extensions/markdown-language-features/src/markdownEngine.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import type MarkdownIt = require('markdown-it'); -import type Token = require('markdown-it/lib/token'); import * as vscode from 'vscode'; import { ILogger } from './logging'; import { MarkdownContributionProvider } from './markdownExtensions'; @@ -50,9 +49,9 @@ class TokenCache { readonly version: number; readonly config: MarkdownItConfig; }; - private _tokens?: Token[]; + private _tokens?: MarkdownIt.Token[]; - public tryGetCached(document: ITextDocument, config: MarkdownItConfig): Token[] | undefined { + public tryGetCached(document: ITextDocument, config: MarkdownItConfig): MarkdownIt.Token[] | undefined { if (this._cachedDocument && this._cachedDocument.uri.toString() === document.uri.toString() && document.version >= 0 && this._cachedDocument.version === document.version @@ -64,7 +63,7 @@ class TokenCache { return undefined; } - public update(document: ITextDocument, config: MarkdownItConfig, tokens: Token[]) { + public update(document: ITextDocument, config: MarkdownItConfig, tokens: MarkdownIt.Token[]) { this._cachedDocument = { uri: document.uri, version: document.version, @@ -93,7 +92,7 @@ interface RenderEnv { export interface IMdParser { readonly slugifier: Slugifier; - tokenize(document: ITextDocument): Promise; + tokenize(document: ITextDocument): Promise; } export class MarkdownItEngine implements IMdParser { @@ -143,8 +142,7 @@ export class MarkdownItEngine implements IMdParser { const frontMatterPlugin = await import('markdown-it-front-matter'); // Extract rules from front matter plugin and apply at a lower precedence let fontMatterRule: any; - // eslint-disable-next-line local/code-no-any-casts - frontMatterPlugin.default({ + frontMatterPlugin.default({ block: { ruler: { before: (_id: any, _id2: any, rule: any) => { fontMatterRule = rule; } @@ -180,7 +178,7 @@ export class MarkdownItEngine implements IMdParser { document: ITextDocument, config: MarkdownItConfig, engine: MarkdownIt - ): Token[] { + ): MarkdownIt.Token[] { const cached = this._tokenCache.tryGetCached(document, config); if (cached) { this._resetSlugCount(); @@ -228,7 +226,7 @@ export class MarkdownItEngine implements IMdParser { }; } - public async tokenize(document: ITextDocument): Promise { + public async tokenize(document: ITextDocument): Promise { const config = this._getConfig(document.uri); const engine = await this._getEngine(config); return this._tokenizeDocument(document, config, engine); @@ -249,7 +247,7 @@ export class MarkdownItEngine implements IMdParser { private _addImageRenderer(md: MarkdownIt): void { const original = md.renderer.rules.image; - md.renderer.rules.image = (tokens: Token[], idx: number, options, env: RenderEnv, self) => { + md.renderer.rules.image = (tokens: MarkdownIt.Token[], idx: number, options, env: RenderEnv, self) => { const token = tokens[idx]; const src = token.attrGet('src'); if (src) { @@ -271,7 +269,7 @@ export class MarkdownItEngine implements IMdParser { private _addFencedRenderer(md: MarkdownIt): void { const original = md.renderer.rules['fenced']; - md.renderer.rules['fenced'] = (tokens: Token[], idx: number, options, env, self) => { + md.renderer.rules['fenced'] = (tokens: MarkdownIt.Token[], idx: number, options, env, self) => { const token = tokens[idx]; if (token.map?.length) { token.attrJoin('class', 'hljs'); @@ -313,7 +311,7 @@ export class MarkdownItEngine implements IMdParser { private _addNamedHeaders(md: MarkdownIt): void { const original = md.renderer.rules.heading_open; - md.renderer.rules.heading_open = (tokens: Token[], idx: number, options, env, self) => { + md.renderer.rules.heading_open = (tokens: MarkdownIt.Token[], idx: number, options, env, self) => { const title = this._tokenToPlainText(tokens[idx + 1]); let slug = this.slugifier.fromHeading(title); @@ -335,7 +333,7 @@ export class MarkdownItEngine implements IMdParser { }; } - private _tokenToPlainText(token: Token): string { + private _tokenToPlainText(token: MarkdownIt.Token): string { if (token.children) { return token.children.map(x => this._tokenToPlainText(x)).join(''); } @@ -353,7 +351,7 @@ export class MarkdownItEngine implements IMdParser { private _addLinkRenderer(md: MarkdownIt): void { const original = md.renderer.rules.link_open; - md.renderer.rules.link_open = (tokens: Token[], idx: number, options, env, self) => { + md.renderer.rules.link_open = (tokens: MarkdownIt.Token[], idx: number, options, env, self) => { const token = tokens[idx]; const href = token.attrGet('href'); // A string, including empty string, may be `href`. From 2de481e6cc45e3f036f360a34bbd00e52090f076 Mon Sep 17 00:00:00 2001 From: Matt Bierner <12821956+mjbvz@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:18:29 -0700 Subject: [PATCH 02/11] Also update watch script --- extensions/markdown-language-features/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index d4b197e9496..0210681bd14 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -757,7 +757,7 @@ }, "scripts": { "compile": "gulp compile-extension:markdown-language-features && npm run build-preview && npm run build-notebook", - "watch": "npm run build-preview && gulp watch-extension:markdown-language-features watch-extension:markdown-language-features-languageService", + "watch": "npm run build-preview && gulp watch-extension:markdown-language-features", "vscode:prepublish": "npm run build-ext && npm run build-preview", "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:markdown-language-features ./tsconfig.json", "build-notebook": "node ./esbuild-notebook.mjs", From 1443559d93517d8339ce3eab65dcd1d877984fc0 Mon Sep 17 00:00:00 2001 From: Elijah King Date: Thu, 12 Feb 2026 11:42:37 -0800 Subject: [PATCH 03/11] non-responsive panel content motion (#295011) * fixes animation, non-responsive panels * Improve error handling during view layout in SplitView animations --- src/vs/base/browser/ui/splitview/splitview.ts | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index c6ac50b2ded..2c72bd8d869 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -908,13 +908,18 @@ export class SplitView