Files
azuredatastudio/extensions/markdown-language-features/src/markdownExtensions.ts
Karl Burtram 8a3d08f0de Merge vscode 1.67 (#20883)
* Fix initial build breaks from 1.67 merge (#2514)

* Update yarn lock files

* Update build scripts

* Fix tsconfig

* Build breaks

* WIP

* Update yarn lock files

* Misc breaks

* Updates to package.json

* Breaks

* Update yarn

* Fix breaks

* Breaks

* Build breaks

* Breaks

* Breaks

* Breaks

* Breaks

* Breaks

* Missing file

* Breaks

* Breaks

* Breaks

* Breaks

* Breaks

* Fix several runtime breaks (#2515)

* Missing files

* Runtime breaks

* Fix proxy ordering issue

* Remove commented code

* Fix breaks with opening query editor

* Fix post merge break

* Updates related to setup build and other breaks (#2516)

* Fix bundle build issues

* Update distro

* Fix distro merge and update build JS files

* Disable pipeline steps

* Remove stats call

* Update license name

* Make new RPM dependencies a warning

* Fix extension manager version checks

* Update JS file

* Fix a few runtime breaks

* Fixes

* Fix runtime issues

* Fix build breaks

* Update notebook tests (part 1)

* Fix broken tests

* Linting errors

* Fix hygiene

* Disable lint rules

* Bump distro

* Turn off smoke tests

* Disable integration tests

* Remove failing "activate" test

* Remove failed test assertion

* Disable other broken test

* Disable query history tests

* Disable extension unit tests

* Disable failing tasks
2022-10-19 19:13:18 -07:00

163 lines
5.5 KiB
TypeScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import * as arrays from './util/arrays';
import { Disposable } from './util/dispose';
function resolveExtensionResource(extension: vscode.Extension<any>, resourcePath: string): vscode.Uri {
return vscode.Uri.joinPath(extension.extensionUri, resourcePath);
}
function* resolveExtensionResources(extension: vscode.Extension<any>, resourcePaths: unknown): Iterable<vscode.Uri> {
if (Array.isArray(resourcePaths)) {
for (const resource of resourcePaths) {
try {
yield resolveExtensionResource(extension, resource);
} catch {
// noop
}
}
}
}
export interface MarkdownContributions {
readonly previewScripts: readonly vscode.Uri[];
readonly previewStyles: readonly vscode.Uri[];
readonly previewResourceRoots: readonly vscode.Uri[];
readonly markdownItPlugins: ReadonlyMap<string, Thenable<(md: any) => any>>;
}
export namespace MarkdownContributions {
export const Empty: MarkdownContributions = {
previewScripts: [],
previewStyles: [],
previewResourceRoots: [],
markdownItPlugins: new Map()
};
export function merge(a: MarkdownContributions, b: MarkdownContributions): MarkdownContributions {
return {
previewScripts: [...a.previewScripts, ...b.previewScripts],
previewStyles: [...a.previewStyles, ...b.previewStyles],
previewResourceRoots: [...a.previewResourceRoots, ...b.previewResourceRoots],
markdownItPlugins: new Map([...a.markdownItPlugins.entries(), ...b.markdownItPlugins.entries()]),
};
}
function uriEqual(a: vscode.Uri, b: vscode.Uri): boolean {
return a.toString() === b.toString();
}
export function equal(a: MarkdownContributions, b: MarkdownContributions): boolean {
return arrays.equals(a.previewScripts, b.previewScripts, uriEqual)
&& arrays.equals(a.previewStyles, b.previewStyles, uriEqual)
&& arrays.equals(a.previewResourceRoots, b.previewResourceRoots, uriEqual)
&& arrays.equals(Array.from(a.markdownItPlugins.keys()), Array.from(b.markdownItPlugins.keys()));
}
export function fromExtension(extension: vscode.Extension<any>): MarkdownContributions {
const contributions = extension.packageJSON?.contributes;
if (!contributions) {
return MarkdownContributions.Empty;
}
const previewStyles = Array.from(getContributedStyles(contributions, extension));
const previewScripts = Array.from(getContributedScripts(contributions, extension));
const previewResourceRoots = previewStyles.length || previewScripts.length ? [extension.extensionUri] : [];
const markdownItPlugins = getContributedMarkdownItPlugins(contributions, extension);
return {
previewScripts,
previewStyles,
previewResourceRoots,
markdownItPlugins
};
}
function getContributedMarkdownItPlugins(
contributes: any,
extension: vscode.Extension<any>
): Map<string, Thenable<(md: any) => any>> {
const map = new Map<string, Thenable<(md: any) => any>>();
if (contributes['markdown.markdownItPlugins']) {
map.set(extension.id, extension.activate().then(() => {
if (extension.exports && extension.exports.extendMarkdownIt) {
return (md: any) => extension.exports.extendMarkdownIt(md);
}
return (md: any) => md;
}));
}
return map;
}
function getContributedScripts(
contributes: any,
extension: vscode.Extension<any>
) {
return resolveExtensionResources(extension, contributes['markdown.previewScripts']);
}
function getContributedStyles(
contributes: any,
extension: vscode.Extension<any>
) {
return resolveExtensionResources(extension, contributes['markdown.previewStyles']);
}
}
export interface MarkdownContributionProvider {
readonly extensionUri: vscode.Uri;
readonly contributions: MarkdownContributions;
readonly onContributionsChanged: vscode.Event<this>;
dispose(): void;
}
class VSCodeExtensionMarkdownContributionProvider extends Disposable implements MarkdownContributionProvider {
private _contributions?: MarkdownContributions;
public constructor(
private readonly _extensionContext: vscode.ExtensionContext,
) {
super();
this._register(vscode.extensions.onDidChange(() => {
const currentContributions = this.getCurrentContributions();
const existingContributions = this._contributions || MarkdownContributions.Empty;
if (!MarkdownContributions.equal(existingContributions, currentContributions)) {
this._contributions = currentContributions;
this._onContributionsChanged.fire(this);
}
}));
}
public get extensionUri() {
return this._extensionContext.extensionUri;
}
private readonly _onContributionsChanged = this._register(new vscode.EventEmitter<this>());
public readonly onContributionsChanged = this._onContributionsChanged.event;
public get contributions(): MarkdownContributions {
if (!this._contributions) {
this._contributions = this.getCurrentContributions();
}
return this._contributions;
}
private getCurrentContributions(): MarkdownContributions {
return vscode.extensions.all
.map(MarkdownContributions.fromExtension)
.reduce(MarkdownContributions.merge, MarkdownContributions.Empty);
}
}
export function getMarkdownExtensionContributions(context: vscode.ExtensionContext): MarkdownContributionProvider {
return new VSCodeExtensionMarkdownContributionProvider(context);
}