Path: blob/main/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as glob from '../../../../base/common/glob.js';6import { Iterable } from '../../../../base/common/iterator.js';7import { joinPath } from '../../../../base/common/resources.js';8import { URI } from '../../../../base/common/uri.js';9import { ExtensionIdentifier, IExtensionDescription } from '../../../../platform/extensions/common/extensions.js';10import { INotebookRendererInfo, ContributedNotebookRendererEntrypoint, NotebookRendererMatch, RendererMessagingSpec, NotebookRendererEntrypoint, INotebookStaticPreloadInfo as INotebookStaticPreloadInfo } from './notebookCommon.js';1112class DependencyList {13private readonly value: ReadonlySet<string>;14public readonly defined: boolean;1516constructor(value: Iterable<string>) {17this.value = new Set(value);18this.defined = this.value.size > 0;19}2021/** Gets whether any of the 'available' dependencies match the ones in this list */22public matches(available: ReadonlyArray<string>) {23// For now this is simple, but this may expand to support globs later24// @see https://github.com/microsoft/vscode/issues/11989925return available.some(v => this.value.has(v));26}27}2829export class NotebookOutputRendererInfo implements INotebookRendererInfo {3031readonly id: string;32readonly entrypoint: NotebookRendererEntrypoint;33readonly displayName: string;34readonly extensionLocation: URI;35readonly extensionId: ExtensionIdentifier;36readonly hardDependencies: DependencyList;37readonly optionalDependencies: DependencyList;38readonly messaging: RendererMessagingSpec;3940readonly mimeTypes: readonly string[];41private readonly mimeTypeGlobs: glob.ParsedPattern[];4243readonly isBuiltin: boolean;4445constructor(descriptor: {46readonly id: string;47readonly displayName: string;48readonly entrypoint: ContributedNotebookRendererEntrypoint;49readonly mimeTypes: readonly string[];50readonly extension: IExtensionDescription;51readonly dependencies: readonly string[] | undefined;52readonly optionalDependencies: readonly string[] | undefined;53readonly requiresMessaging: RendererMessagingSpec | undefined;54}) {55this.id = descriptor.id;56this.extensionId = descriptor.extension.identifier;57this.extensionLocation = descriptor.extension.extensionLocation;58this.isBuiltin = descriptor.extension.isBuiltin;5960if (typeof descriptor.entrypoint === 'string') {61this.entrypoint = {62extends: undefined,63path: joinPath(this.extensionLocation, descriptor.entrypoint)64};65} else {66this.entrypoint = {67extends: descriptor.entrypoint.extends,68path: joinPath(this.extensionLocation, descriptor.entrypoint.path)69};70}7172this.displayName = descriptor.displayName;73this.mimeTypes = descriptor.mimeTypes;74this.mimeTypeGlobs = this.mimeTypes.map(pattern => glob.parse(pattern));75this.hardDependencies = new DependencyList(descriptor.dependencies ?? Iterable.empty());76this.optionalDependencies = new DependencyList(descriptor.optionalDependencies ?? Iterable.empty());77this.messaging = descriptor.requiresMessaging ?? RendererMessagingSpec.Never;78}7980public matchesWithoutKernel(mimeType: string) {81if (!this.matchesMimeTypeOnly(mimeType)) {82return NotebookRendererMatch.Never;83}8485if (this.hardDependencies.defined) {86return NotebookRendererMatch.WithHardKernelDependency;87}8889if (this.optionalDependencies.defined) {90return NotebookRendererMatch.WithOptionalKernelDependency;91}9293return NotebookRendererMatch.Pure;94}9596public matches(mimeType: string, kernelProvides: ReadonlyArray<string>) {97if (!this.matchesMimeTypeOnly(mimeType)) {98return NotebookRendererMatch.Never;99}100101if (this.hardDependencies.defined) {102return this.hardDependencies.matches(kernelProvides)103? NotebookRendererMatch.WithHardKernelDependency104: NotebookRendererMatch.Never;105}106107return this.optionalDependencies.matches(kernelProvides)108? NotebookRendererMatch.WithOptionalKernelDependency109: NotebookRendererMatch.Pure;110}111112private matchesMimeTypeOnly(mimeType: string) {113if (this.entrypoint.extends) { // We're extending another renderer114return false;115}116117return this.mimeTypeGlobs.some(pattern => pattern(mimeType)) || this.mimeTypes.some(pattern => pattern === mimeType);118}119}120121export class NotebookStaticPreloadInfo implements INotebookStaticPreloadInfo {122123readonly type: string;124readonly entrypoint: URI;125readonly extensionLocation: URI;126readonly localResourceRoots: readonly URI[];127128constructor(descriptor: {129readonly type: string;130readonly entrypoint: string;131readonly localResourceRoots: readonly string[];132readonly extension: IExtensionDescription;133}) {134this.type = descriptor.type;135136this.entrypoint = joinPath(descriptor.extension.extensionLocation, descriptor.entrypoint);137this.extensionLocation = descriptor.extension.extensionLocation;138this.localResourceRoots = descriptor.localResourceRoots.map(root => joinPath(descriptor.extension.extensionLocation, root));139}140}141142143