diff --git a/src/sql/base/common/locConstants.ts b/src/sql/base/common/locConstants.ts index e7484a62b6..49b3099614 100644 --- a/src/sql/base/common/locConstants.ts +++ b/src/sql/base/common/locConstants.ts @@ -48,3 +48,4 @@ export const desktopContributionMiinstallVsix = localize({ key: 'miinstallVsix', export const workspaceTrustDescription = localize('workspace.trust.description', "Controls whether or not workspace trust is enabled within Azure Data Studio."); export function workspaceTrustEmptyWindowDescription(settingName: string): string { return localize('workspace.trust.emptyWindow.description', "Controls whether or not the empty window is trusted by default within Azure Data Studio. When used with `#{0}#`, you can enable the full functionality of Azure Data Studio without prompting in an empty window.", settingName); } export const functionalityNotSupportedError = localize('vscodeFunctionalityNotSupportedError', "This VS Code functionality is not supported in Azure Data Studio."); +export const invalidArgumentsError = localize('vscodeInvalidArgumentsError', "Invalid arguments"); diff --git a/src/sql/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.ts b/src/sql/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.ts index 867d0a64ce..95a8630a4d 100644 --- a/src/sql/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.ts +++ b/src/sql/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.ts @@ -27,6 +27,8 @@ import { localize } from 'vs/nls'; import { IFileService } from 'vs/platform/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { NotebookEditor } from 'sql/workbench/contrib/notebook/browser/notebookEditor'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { NewNotebookAction } from 'sql/workbench/contrib/notebook/browser/notebookActions'; class MainThreadNotebookEditor extends Disposable { private _contentChangedEmitter = new Emitter(); @@ -320,7 +322,8 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements @IInstantiationService private _instantiationService: IInstantiationService, @INotebookService private readonly _notebookService: INotebookService, @IFileService private readonly _fileService: IFileService, - @ITextFileService private readonly _textFileService: ITextFileService + @ITextFileService private readonly _textFileService: ITextFileService, + @ICommandService private readonly _commandService: ICommandService ) { super(); if (extHostContext) { @@ -709,4 +712,12 @@ export class MainThreadNotebookDocumentsAndEditors extends Disposable implements } }); } + + $createNotebookDocument(providerId: string, contents: azdata.nb.INotebookContents): Promise { + return this._commandService.executeCommand(NewNotebookAction.INTERNAL_NEW_NOTEBOOK_CMD_ID, { + providerId: providerId, + initialContent: contents, + initialDirtyState: false + }); + } } diff --git a/src/sql/workbench/api/common/extHostNotebook.ts b/src/sql/workbench/api/common/extHostNotebook.ts index 4241045486..3f7dc4e9f7 100644 --- a/src/sql/workbench/api/common/extHostNotebook.ts +++ b/src/sql/workbench/api/common/extHostNotebook.ts @@ -13,10 +13,10 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { ExtHostNotebookShape, MainThreadNotebookShape, SqlMainContext } from 'sql/workbench/api/common/sqlExtHost.protocol'; import { IExecuteManagerDetails, INotebookSessionDetails, INotebookKernelDetails, INotebookFutureDetails, FutureMessageType, ISerializationManagerDetails } from 'sql/workbench/api/common/sqlExtHostTypes'; -import { VSCodeSerializationProvider } from 'sql/workbench/api/common/vscodeSerializationProvider'; +import { VSCodeSerializationProvider } from 'sql/workbench/api/common/notebooks/vscodeSerializationProvider'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { ADSNotebookController } from 'sql/workbench/api/common/adsNotebookController'; -import { VSCodeExecuteProvider } from 'sql/workbench/api/common/vscodeExecuteProvider'; +import { ADSNotebookController } from 'sql/workbench/api/common/notebooks/adsNotebookController'; +import { VSCodeExecuteProvider } from 'sql/workbench/api/common/notebooks/vscodeExecuteProvider'; import { ExtHostNotebookDocumentsAndEditors } from 'sql/workbench/api/common/extHostNotebookDocumentsAndEditors'; type Adapter = azdata.nb.NotebookSerializationProvider | azdata.nb.SerializationManager | azdata.nb.NotebookExecuteProvider | azdata.nb.ExecuteManager | azdata.nb.ISession | azdata.nb.IKernel | azdata.nb.IFuture; diff --git a/src/sql/workbench/api/common/extHostNotebookDocumentsAndEditors.ts b/src/sql/workbench/api/common/extHostNotebookDocumentsAndEditors.ts index 9c394bf609..67f9ae6613 100644 --- a/src/sql/workbench/api/common/extHostNotebookDocumentsAndEditors.ts +++ b/src/sql/workbench/api/common/extHostNotebookDocumentsAndEditors.ts @@ -21,7 +21,7 @@ import { } from 'sql/workbench/api/common/sqlExtHost.protocol'; import { ExtHostNotebookDocumentData } from 'sql/workbench/api/common/extHostNotebookDocumentData'; import { ExtHostNotebookEditor } from 'sql/workbench/api/common/extHostNotebookEditor'; -import { VSCodeNotebookDocument } from 'sql/workbench/api/common/vscodeNotebookDocument'; +import { VSCodeNotebookDocument } from 'sql/workbench/api/common/notebooks/vscodeNotebookDocument'; type Adapter = azdata.nb.NavigationProvider; @@ -266,5 +266,8 @@ export class ExtHostNotebookDocumentsAndEditors implements ExtHostNotebookDocume }); } + createNotebookDocument(providerId: string, contents: azdata.nb.INotebookContents): Promise { + return this._proxy.$createNotebookDocument(providerId, contents); + } //#endregion } diff --git a/src/sql/workbench/api/common/adsNotebookController.ts b/src/sql/workbench/api/common/notebooks/adsNotebookController.ts similarity index 99% rename from src/sql/workbench/api/common/adsNotebookController.ts rename to src/sql/workbench/api/common/notebooks/adsNotebookController.ts index 5ca5d2d1f0..836cb1149b 100644 --- a/src/sql/workbench/api/common/adsNotebookController.ts +++ b/src/sql/workbench/api/common/notebooks/adsNotebookController.ts @@ -13,7 +13,7 @@ import { ExtHostNotebookDocumentsAndEditors } from 'sql/workbench/api/common/ext import { URI } from 'vs/base/common/uri'; import { NotebookCellExecutionTaskState } from 'vs/workbench/api/common/extHostNotebookKernels'; import { asArray } from 'vs/base/common/arrays'; -import { convertToADSCellOutput } from 'sql/workbench/api/common/vscodeSerializationProvider'; +import { convertToADSCellOutput } from 'sql/workbench/api/common/notebooks/notebookUtils'; type SelectionChangedEvent = { selected: boolean, notebook: vscode.NotebookDocument; }; type MessageReceivedEvent = { editor: vscode.NotebookEditor, message: any; }; diff --git a/src/sql/workbench/api/common/notebooks/notebookUtils.ts b/src/sql/workbench/api/common/notebooks/notebookUtils.ts new file mode 100644 index 0000000000..9d9048aaa5 --- /dev/null +++ b/src/sql/workbench/api/common/notebooks/notebookUtils.ts @@ -0,0 +1,127 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type * as vscode from 'vscode'; +import type * as azdata from 'azdata'; +import { URI } from 'vs/base/common/uri'; +import { asArray } from 'vs/base/common/arrays'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { OutputTypes } from 'sql/workbench/services/notebook/common/contracts'; +import { NBFORMAT, NBFORMAT_MINOR } from 'sql/workbench/common/constants'; +import { NotebookCellKind } from 'vs/workbench/api/common/extHostTypes'; + +export function convertToVSCodeNotebookCell(cellSource: string | string[], index: number, uri: URI, language: string): vscode.NotebookCell { + return { + index: index, + document: { + uri: uri, + languageId: language, + getText: () => Array.isArray(cellSource) ? cellSource.join('') : cellSource, + }, + notebook: { + uri: uri + } + }; +} + +export function convertToADSCellOutput(outputs: vscode.NotebookCellOutput | vscode.NotebookCellOutput[], executionOrder?: number): azdata.nb.IDisplayResult[] { + return asArray(outputs).map(output => { + let outputData = {}; + for (let item of output.items) { + outputData[item.mime] = VSBuffer.wrap(item.data).toString(); + } + return { + output_type: 'execute_result', + data: outputData, + execution_count: executionOrder, + metadata: output.metadata, + id: output.id + }; + }); +} + +export function convertToVSCodeCellOutput(output: azdata.nb.ICellOutput): vscode.NotebookCellOutput { + let convertedOutputItems: vscode.NotebookCellOutputItem[]; + switch (output.output_type) { + case OutputTypes.ExecuteResult: + case OutputTypes.DisplayData: + case OutputTypes.UpdateDisplayData: + let displayOutput = output as azdata.nb.IDisplayResult; + convertedOutputItems = Object.keys(displayOutput.data).map(key => { + return { + mime: key, + data: VSBuffer.fromString(displayOutput.data[key]).buffer + }; + }); + break; + case OutputTypes.Stream: + let streamOutput = output as azdata.nb.IStreamResult; + convertedOutputItems = [{ + mime: 'text/html', + data: VSBuffer.fromString(Array.isArray(streamOutput.text) ? streamOutput.text.join('') : streamOutput.text).buffer + }]; + break; + case OutputTypes.Error: + let errorOutput = output as azdata.nb.IErrorResult; + let errorString = errorOutput.ename + ': ' + errorOutput.evalue + (errorOutput.traceback ? '\n' + errorOutput.traceback?.join('\n') : ''); + convertedOutputItems = [{ + mime: 'text/html', + data: VSBuffer.fromString(errorString).buffer + }]; + break; + } + return { + items: convertedOutputItems, + metadata: output.metadata, + id: output.id + }; +} + +export function convertToADSNotebookContents(notebookData: vscode.NotebookData): azdata.nb.INotebookContents { + let result = { + cells: notebookData.cells?.map(cell => { + let executionOrder = cell.executionSummary?.executionOrder; + return { + cell_type: cell.kind === NotebookCellKind.Code ? 'code' : 'markdown', + source: cell.value, + metadata: { + language: cell.languageId + }, + execution_count: executionOrder, + outputs: cell.outputs ? convertToADSCellOutput(cell.outputs, executionOrder) : undefined + }; + }), + metadata: notebookData.metadata ?? {}, + nbformat: notebookData.metadata?.custom?.nbformat ?? NBFORMAT, + nbformat_minor: notebookData.metadata?.custom?.nbformat_minor ?? NBFORMAT_MINOR + }; + + // Clear out extra lingering vscode custom metadata + delete result.metadata.custom; + + return result; +} + +export function convertToVSCodeNotebookData(notebook: azdata.nb.INotebookContents): vscode.NotebookData { + let result: vscode.NotebookData = { + cells: notebook.cells?.map(cell => { + return { + kind: cell.cell_type === 'code' ? NotebookCellKind.Code : NotebookCellKind.Markup, + value: Array.isArray(cell.source) ? cell.source.join('\n') : cell.source, + languageId: cell.metadata?.language, + outputs: cell.outputs?.map(output => convertToVSCodeCellOutput(output)), + executionSummary: { + executionOrder: cell.execution_count + } + }; + }), + metadata: notebook.metadata + }; + result.metadata.custom = { + nbformat: notebook.nbformat, + nbformat_minor: notebook.nbformat_minor + }; + return result; +} diff --git a/src/sql/workbench/api/common/vscodeExecuteProvider.ts b/src/sql/workbench/api/common/notebooks/vscodeExecuteProvider.ts similarity index 94% rename from src/sql/workbench/api/common/vscodeExecuteProvider.ts rename to src/sql/workbench/api/common/notebooks/vscodeExecuteProvider.ts index fb2b32ee9c..f46766897d 100644 --- a/src/sql/workbench/api/common/vscodeExecuteProvider.ts +++ b/src/sql/workbench/api/common/notebooks/vscodeExecuteProvider.ts @@ -5,9 +5,9 @@ import type * as vscode from 'vscode'; import type * as azdata from 'azdata'; -import { ADSNotebookController } from 'sql/workbench/api/common/adsNotebookController'; +import { ADSNotebookController } from 'sql/workbench/api/common/notebooks/adsNotebookController'; import * as nls from 'vs/nls'; -import { URI } from 'vs/base/common/uri'; +import { convertToVSCodeNotebookCell } from 'sql/workbench/api/common/notebooks/notebookUtils'; class VSCodeFuture implements azdata.nb.IFuture { private _inProgress = true; @@ -305,17 +305,3 @@ export class VSCodeExecuteProvider implements azdata.nb.NotebookExecuteProvider // No-op } } - -export function convertToVSCodeNotebookCell(cellSource: string | string[], index: number, uri: URI, language: string): vscode.NotebookCell { - return { - index: index, - document: { - uri: uri, - languageId: language, - getText: () => Array.isArray(cellSource) ? cellSource.join('') : cellSource, - }, - notebook: { - uri: uri - } - }; -} diff --git a/src/sql/workbench/api/common/vscodeNotebookDocument.ts b/src/sql/workbench/api/common/notebooks/vscodeNotebookDocument.ts similarity index 98% rename from src/sql/workbench/api/common/vscodeNotebookDocument.ts rename to src/sql/workbench/api/common/notebooks/vscodeNotebookDocument.ts index 66524f42d1..9449cd59b7 100644 --- a/src/sql/workbench/api/common/vscodeNotebookDocument.ts +++ b/src/sql/workbench/api/common/notebooks/vscodeNotebookDocument.ts @@ -5,7 +5,7 @@ import type * as vscode from 'vscode'; import type * as azdata from 'azdata'; -import { convertToVSCodeNotebookCell } from 'sql/workbench/api/common/vscodeExecuteProvider'; +import { convertToVSCodeNotebookCell } from 'sql/workbench/api/common/notebooks/notebookUtils'; export class VSCodeNotebookDocument implements vscode.NotebookDocument { private readonly _convertedCells: vscode.NotebookCell[]; diff --git a/src/sql/workbench/api/common/vscodeNotebookEditor.ts b/src/sql/workbench/api/common/notebooks/vscodeNotebookEditor.ts similarity index 97% rename from src/sql/workbench/api/common/vscodeNotebookEditor.ts rename to src/sql/workbench/api/common/notebooks/vscodeNotebookEditor.ts index c1c7837645..52fb4eed2e 100644 --- a/src/sql/workbench/api/common/vscodeNotebookEditor.ts +++ b/src/sql/workbench/api/common/notebooks/vscodeNotebookEditor.ts @@ -5,7 +5,7 @@ import type * as vscode from 'vscode'; import type * as azdata from 'azdata'; -import { VSCodeNotebookDocument } from 'sql/workbench/api/common/vscodeNotebookDocument'; +import { VSCodeNotebookDocument } from 'sql/workbench/api/common/notebooks/vscodeNotebookDocument'; import { functionalityNotSupportedError } from 'sql/base/common/locConstants'; export class VSCodeNotebookEditor implements vscode.NotebookEditor { diff --git a/src/sql/workbench/api/common/notebooks/vscodeSerializationProvider.ts b/src/sql/workbench/api/common/notebooks/vscodeSerializationProvider.ts new file mode 100644 index 0000000000..7cbe7bd4c5 --- /dev/null +++ b/src/sql/workbench/api/common/notebooks/vscodeSerializationProvider.ts @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type * as vscode from 'vscode'; +import type * as azdata from 'azdata'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { convertToADSNotebookContents, convertToVSCodeNotebookData } from 'sql/workbench/api/common/notebooks/notebookUtils'; + +export class VSCodeContentManager implements azdata.nb.ContentManager { + constructor(private readonly _serializer: vscode.NotebookSerializer) { + } + + public async deserializeNotebook(contents: string): Promise { + let buffer = VSBuffer.fromString(contents); + let notebookData = await this._serializer.deserializeNotebook(buffer.buffer, new CancellationTokenSource().token); + return convertToADSNotebookContents(notebookData); + } + + public async serializeNotebook(notebook: azdata.nb.INotebookContents): Promise { + let notebookData = convertToVSCodeNotebookData(notebook); + let bytes = await this._serializer.serializeNotebook(notebookData, new CancellationTokenSource().token); + let buffer = VSBuffer.wrap(bytes); + return buffer.toString(); + } +} + +class VSCodeSerializationManager implements azdata.nb.SerializationManager { + private _manager: VSCodeContentManager; + + constructor(serializer: vscode.NotebookSerializer) { + this._manager = new VSCodeContentManager(serializer); + } + + public get contentManager(): azdata.nb.ContentManager { + return this._manager; + } +} + +/** + * A Notebook Serialization Provider that is used to convert VS Code notebook extension APIs into ADS equivalents. + */ +export class VSCodeSerializationProvider implements azdata.nb.NotebookSerializationProvider { + private _manager: VSCodeSerializationManager; + + constructor(public readonly providerId: string, serializer: vscode.NotebookSerializer) { + this._manager = new VSCodeSerializationManager(serializer); + } + + public getSerializationManager(notebookUri: vscode.Uri): Thenable { + return Promise.resolve(this._manager); + } +} diff --git a/src/sql/workbench/api/common/sqlExtHost.protocol.ts b/src/sql/workbench/api/common/sqlExtHost.protocol.ts index 73b22209bd..d7cb3e9654 100644 --- a/src/sql/workbench/api/common/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/common/sqlExtHost.protocol.ts @@ -1007,6 +1007,7 @@ export interface MainThreadNotebookDocumentsAndEditorsShape extends IDisposable $clearAllOutputs(id: string): Promise; $changeKernel(id: string, kernel: azdata.nb.IKernelSpec): Promise; $registerNavigationProvider(providerId: string, handle: number); + $createNotebookDocument(providerId: string, contents: azdata.nb.INotebookContents): Promise; } export interface ExtHostExtensionManagementShape { diff --git a/src/sql/workbench/api/common/vscodeSerializationProvider.ts b/src/sql/workbench/api/common/vscodeSerializationProvider.ts deleted file mode 100644 index c1ea93960e..0000000000 --- a/src/sql/workbench/api/common/vscodeSerializationProvider.ts +++ /dev/null @@ -1,150 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import type * as vscode from 'vscode'; -import type * as azdata from 'azdata'; -import { VSBuffer } from 'vs/base/common/buffer'; -import { NotebookCellKind } from 'vs/workbench/api/common/extHostTypes'; -import { CancellationTokenSource } from 'vs/base/common/cancellation'; -import { OutputTypes } from 'sql/workbench/services/notebook/common/contracts'; -import { asArray } from 'vs/base/common/arrays'; -import { NBFORMAT, NBFORMAT_MINOR } from 'sql/workbench/common/constants'; - -export class VSCodeContentManager implements azdata.nb.ContentManager { - constructor(private readonly _serializer: vscode.NotebookSerializer) { - } - - public async deserializeNotebook(contents: string): Promise { - let buffer = VSBuffer.fromString(contents); - let notebookData = await this._serializer.deserializeNotebook(buffer.buffer, new CancellationTokenSource().token); - let result = { - cells: notebookData.cells?.map(cell => { - let executionOrder = cell.executionSummary?.executionOrder; - return { - cell_type: cell.kind === NotebookCellKind.Code ? 'code' : 'markdown', - source: cell.value, - metadata: { - language: cell.languageId - }, - execution_count: executionOrder, - outputs: cell.outputs ? convertToADSCellOutput(cell.outputs, executionOrder) : undefined - }; - }), - metadata: notebookData.metadata ?? {}, - nbformat: notebookData.metadata?.custom?.nbformat ?? NBFORMAT, - nbformat_minor: notebookData.metadata?.custom?.nbformat_minor ?? NBFORMAT_MINOR - }; - - // Clear out extra lingering vscode custom metadata - delete result.metadata.custom; - - return result; - } - - public async serializeNotebook(notebook: azdata.nb.INotebookContents): Promise { - let notebookData: vscode.NotebookData = { - cells: notebook.cells?.map(cell => { - return { - kind: cell.cell_type === 'code' ? NotebookCellKind.Code : NotebookCellKind.Markup, - value: Array.isArray(cell.source) ? cell.source.join('\n') : cell.source, - languageId: cell.metadata?.language, - outputs: cell.outputs?.map(output => convertToVSCodeCellOutput(output)), - executionSummary: { - executionOrder: cell.execution_count - } - }; - }), - metadata: notebook.metadata - }; - notebookData.metadata.custom = { - nbformat: notebook.nbformat, - nbformat_minor: notebook.nbformat_minor - }; - - let bytes = await this._serializer.serializeNotebook(notebookData, new CancellationTokenSource().token); - let buffer = VSBuffer.wrap(bytes); - return buffer.toString(); - } -} - -class VSCodeSerializationManager implements azdata.nb.SerializationManager { - private _manager: VSCodeContentManager; - - constructor(serializer: vscode.NotebookSerializer) { - this._manager = new VSCodeContentManager(serializer); - } - - public get contentManager(): azdata.nb.ContentManager { - return this._manager; - } -} - -/** - * A Notebook Serialization Provider that is used to convert VS Code notebook extension APIs into ADS equivalents. - */ -export class VSCodeSerializationProvider implements azdata.nb.NotebookSerializationProvider { - private _manager: VSCodeSerializationManager; - - constructor(public readonly providerId: string, serializer: vscode.NotebookSerializer) { - this._manager = new VSCodeSerializationManager(serializer); - } - - public getSerializationManager(notebookUri: vscode.Uri): Thenable { - return Promise.resolve(this._manager); - } -} - -export function convertToADSCellOutput(outputs: vscode.NotebookCellOutput | vscode.NotebookCellOutput[], executionOrder?: number): azdata.nb.IDisplayResult[] { - return asArray(outputs).map(output => { - let outputData = {}; - for (let item of output.items) { - outputData[item.mime] = VSBuffer.wrap(item.data).toString(); - } - return { - output_type: 'execute_result', - data: outputData, - execution_count: executionOrder, - metadata: output.metadata, - id: output.id - }; - }); -} - -export function convertToVSCodeCellOutput(output: azdata.nb.ICellOutput): vscode.NotebookCellOutput { - let convertedOutputItems: vscode.NotebookCellOutputItem[]; - switch (output.output_type) { - case OutputTypes.ExecuteResult: - case OutputTypes.DisplayData: - case OutputTypes.UpdateDisplayData: - let displayOutput = output as azdata.nb.IDisplayResult; - convertedOutputItems = Object.keys(displayOutput.data).map(key => { - return { - mime: key, - data: VSBuffer.fromString(displayOutput.data[key]).buffer - }; - }); - break; - case OutputTypes.Stream: - let streamOutput = output as azdata.nb.IStreamResult; - convertedOutputItems = [{ - mime: 'text/html', - data: VSBuffer.fromString(Array.isArray(streamOutput.text) ? streamOutput.text.join('') : streamOutput.text).buffer - }]; - break; - case OutputTypes.Error: - let errorOutput = output as azdata.nb.IErrorResult; - let errorString = errorOutput.ename + ': ' + errorOutput.evalue + (errorOutput.traceback ? '\n' + errorOutput.traceback?.join('\n') : ''); - convertedOutputItems = [{ - mime: 'text/html', - data: VSBuffer.fromString(errorString).buffer - }]; - break; - } - return { - items: convertedOutputItems, - metadata: output.metadata, - id: output.id - }; -} diff --git a/src/sql/workbench/test/electron-browser/api/vscodeNotebookApi.test.ts b/src/sql/workbench/test/electron-browser/api/vscodeNotebookApi.test.ts index d703458124..fac8229066 100644 --- a/src/sql/workbench/test/electron-browser/api/vscodeNotebookApi.test.ts +++ b/src/sql/workbench/test/electron-browser/api/vscodeNotebookApi.test.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { convertToVSCodeCellOutput, VSCodeContentManager, convertToADSCellOutput } from 'sql/workbench/api/common/vscodeSerializationProvider'; +import { VSCodeContentManager } from 'sql/workbench/api/common/notebooks/vscodeSerializationProvider'; import type * as vscode from 'vscode'; import type * as azdata from 'azdata'; import * as sinon from 'sinon'; @@ -12,10 +12,10 @@ import { VSBuffer } from 'vs/base/common/buffer'; import * as assert from 'assert'; import { OutputTypes } from 'sql/workbench/services/notebook/common/contracts'; import { NBFORMAT, NBFORMAT_MINOR } from 'sql/workbench/common/constants'; -import { convertToVSCodeNotebookCell } from 'sql/workbench/api/common/vscodeExecuteProvider'; -import { VSCodeNotebookDocument } from 'sql/workbench/api/common/vscodeNotebookDocument'; +import { convertToVSCodeNotebookCell, convertToVSCodeCellOutput, convertToADSCellOutput } from 'sql/workbench/api/common/notebooks/notebookUtils'; +import { VSCodeNotebookDocument } from 'sql/workbench/api/common/notebooks/vscodeNotebookDocument'; import { URI } from 'vs/base/common/uri'; -import { VSCodeNotebookEditor } from 'sql/workbench/api/common/vscodeNotebookEditor'; +import { VSCodeNotebookEditor } from 'sql/workbench/api/common/notebooks/vscodeNotebookEditor'; class MockNotebookSerializer implements vscode.NotebookSerializer { deserializeNotebook(content: Uint8Array, token: vscode.CancellationToken): vscode.NotebookData | Thenable { diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index d1bed35dea..304dd4b84e 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -50,6 +50,7 @@ import { throwProposedApiError, checkProposedApiEnabled } from 'vs/workbench/ser import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import type * as vscode from 'vscode'; +import type * as azdata from 'azdata'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { values } from 'vs/base/common/collections'; import { ExtHostEditorInsets } from 'vs/workbench/api/common/extHostCodeInsets'; @@ -92,10 +93,11 @@ import { matchesScheme } from 'vs/platform/opener/common/opener'; // import { ExtHostNotebookDocuments } from 'vs/workbench/api/common/extHostNotebookDocuments'; {{SQL CARBON EDIT}} Disable VS Code notebooks // import { ExtHostInteractive } from 'vs/workbench/api/common/extHostInteractive'; {{SQL CARBON EDIT}} Remove until we need it import { ExtHostNotebook } from 'sql/workbench/api/common/extHostNotebook'; -import { functionalityNotSupportedError } from 'sql/base/common/locConstants'; +import { functionalityNotSupportedError, invalidArgumentsError } from 'sql/base/common/locConstants'; import { ExtHostNotebookDocumentsAndEditors } from 'sql/workbench/api/common/extHostNotebookDocumentsAndEditors'; -import { VSCodeNotebookDocument } from 'sql/workbench/api/common/vscodeNotebookDocument'; -import { VSCodeNotebookEditor } from 'sql/workbench/api/common/vscodeNotebookEditor'; +import { VSCodeNotebookDocument } from 'sql/workbench/api/common/notebooks/vscodeNotebookDocument'; +import { VSCodeNotebookEditor } from 'sql/workbench/api/common/notebooks/vscodeNotebookEditor'; +import { convertToADSNotebookContents } from 'sql/workbench/api/common/notebooks/notebookUtils'; export interface IExtensionApiFactory { (extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode; @@ -751,11 +753,19 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor, ex // checkProposedApiEnabled(extension); // return extHostNotebookEditors.onDidChangeNotebookEditorVisibleRanges(listener, thisArgs, disposables); }, - showNotebookDocument(uriOrDocument, options?) { - // {{SQL CARBON EDIT}} Disable VS Code notebooks - throw new Error(functionalityNotSupportedError); - // checkProposedApiEnabled(extension); - // return extHostNotebook.showNotebookDocument(uriOrDocument, options); + showNotebookDocument(uriOrDocument: URI | vscode.NotebookDocument, options?: vscode.NotebookDocumentShowOptions): Thenable { + // {{SQL CARBON EDIT}} Use our own notebooks + let targetUri: URI; + if (URI.isUri(uriOrDocument)) { + targetUri = uriOrDocument; + } else { + targetUri = uriOrDocument.uri; + } + return extHostNotebookDocumentsAndEditors.showNotebookDocument(targetUri, { + viewColumn: options?.viewColumn, + preserveFocus: options?.preserveFocus, + preview: options?.preview + }).then(editor => new VSCodeNotebookEditor(editor)); }, registerExternalUriOpener(id: string, opener: vscode.ExternalUriOpener, metadata: vscode.ExternalUriOpenerMetadata) { checkProposedApiEnabled(extension); @@ -887,19 +897,19 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor, ex // {{SQL CARBON EDIT}} Use our own notebooks return extHostNotebookDocumentsAndEditors.getAllDocuments().map(doc => new VSCodeNotebookDocument(doc.document)); }, - async openNotebookDocument(uriOrType?: URI | string, content?: vscode.NotebookData) { - // {{SQL CARBON EDIT}} Disable VS Code notebooks - throw new Error(functionalityNotSupportedError); - // let uri: URI; - // if (URI.isUri(uriOrType)) { - // uri = uriOrType; - // await extHostNotebook.openNotebookDocument(uriOrType); - // } else if (typeof uriOrType === 'string') { - // uri = URI.revive(await extHostNotebook.createNotebookDocument({ viewType: uriOrType, content })); - // } else { - // throw new Error('Invalid arguments'); - // } - // return extHostNotebook.getNotebookDocument(uri).apiNotebook; + async openNotebookDocument(uriOrType?: URI | string, content?: vscode.NotebookData): Promise { + // {{SQL CARBON EDIT}} Use our own notebooks + let doc: azdata.nb.NotebookDocument; + if (URI.isUri(uriOrType)) { + let editor = await extHostNotebookDocumentsAndEditors.showNotebookDocument(uriOrType, {}); + doc = editor.document; + } else if (typeof uriOrType === 'string') { + let convertedContents = convertToADSNotebookContents(content); + doc = await extHostNotebookDocumentsAndEditors.createNotebookDocument(uriOrType, convertedContents); + } else { + throw new Error(invalidArgumentsError); + } + return new VSCodeNotebookDocument(doc); }, get onDidOpenNotebookDocument(): Event { // {{SQL CARBON EDIT}} Use our own notebooks