diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.document.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.document.test.ts index ceaeec219d8..2359cda94fa 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.document.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.document.test.ts @@ -11,10 +11,10 @@ suite('Notebook Document', function () { const contentProvider = new class implements vscode.NotebookContentProvider { async openNotebook(uri: vscode.Uri, _openContext: vscode.NotebookDocumentOpenContext): Promise { - return { - cells: [{ cellKind: vscode.NotebookCellKind.Code, source: uri.toString(), language: 'javascript', metadata: new vscode.NotebookCellMetadata(), outputs: [] }], - metadata: new vscode.NotebookDocumentMetadata() - }; + return new vscode.NotebookData( + [new vscode.NotebookCellData(vscode.NotebookCellKind.Code, uri.toString(), 'javascript')], + new vscode.NotebookDocumentMetadata() + ); } async resolveNotebook(_document: vscode.NotebookDocument, _webview: vscode.NotebookCommunication) { // @@ -125,13 +125,13 @@ suite('Notebook Document', function () { { const edit = new vscode.WorkspaceEdit(); edit.replaceNotebookCells(document.uri, 0, 0, [{ - cellKind: vscode.NotebookCellKind.Markdown, + kind: vscode.NotebookCellKind.Markdown, language: 'markdown', metadata: undefined, outputs: [], source: 'new_markdown' }, { - cellKind: vscode.NotebookCellKind.Code, + kind: vscode.NotebookCellKind.Code, language: 'fooLang', metadata: undefined, outputs: [], @@ -162,13 +162,13 @@ suite('Notebook Document', function () { { const edit = new vscode.WorkspaceEdit(); edit.replaceNotebookCells(document.uri, 0, 1, [{ - cellKind: vscode.NotebookCellKind.Markdown, + kind: vscode.NotebookCellKind.Markdown, language: 'markdown', metadata: undefined, outputs: [], source: 'new2_markdown' }, { - cellKind: vscode.NotebookCellKind.Code, + kind: vscode.NotebookCellKind.Code, language: 'fooLang', metadata: undefined, outputs: [], @@ -198,13 +198,13 @@ suite('Notebook Document', function () { const edit = new vscode.WorkspaceEdit(); edit.replaceNotebookCells(document.uri, 0, 0, [{ - cellKind: vscode.NotebookCellKind.Markdown, + kind: vscode.NotebookCellKind.Markdown, language: 'markdown', metadata: undefined, outputs: [], source: 'new_markdown' }, { - cellKind: vscode.NotebookCellKind.Code, + kind: vscode.NotebookCellKind.Code, language: 'fooLang', metadata: undefined, outputs: [], @@ -306,13 +306,13 @@ suite('Notebook Document', function () { const edit = new vscode.WorkspaceEdit(); edit.replaceNotebookCells(notebook.uri, 0, 0, [{ - cellKind: vscode.NotebookCellKind.Markdown, + kind: vscode.NotebookCellKind.Markdown, language: 'markdown', metadata: undefined, outputs: [], source: 'new_markdown' }, { - cellKind: vscode.NotebookCellKind.Code, + kind: vscode.NotebookCellKind.Code, language: 'fooLang', metadata: undefined, outputs: [], diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts index a4717b091fa..9fccde765f9 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts @@ -11,10 +11,11 @@ suite('Notebook Editor', function () { const contentProvider = new class implements vscode.NotebookContentProvider { async openNotebook(uri: vscode.Uri, _openContext: vscode.NotebookDocumentOpenContext): Promise { - return { - cells: [{ cellKind: vscode.NotebookCellKind.Code, source: uri.toString(), language: 'javascript', metadata: new vscode.NotebookCellMetadata(), outputs: [] }], - metadata: new vscode.NotebookDocumentMetadata() - }; + return new vscode.NotebookData( + [new vscode.NotebookCellData(vscode.NotebookCellKind.Code, uri.toString(), 'javascript')], + new vscode.NotebookDocumentMetadata() + ); + } async resolveNotebook(_document: vscode.NotebookDocument, _webview: vscode.NotebookCommunication) { // diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts index ad209c97a85..83bd1c114cd 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.test.ts @@ -96,14 +96,14 @@ suite('Notebook API tests', function () { { source: 'test', language: 'typescript', - cellKind: vscode.NotebookCellKind.Code, + kind: vscode.NotebookCellKind.Code, outputs: [], metadata: new vscode.NotebookCellMetadata().with({ custom: { testCellMetadata: 123 } }) }, { source: 'test2', language: 'typescript', - cellKind: vscode.NotebookCellKind.Code, + kind: vscode.NotebookCellKind.Code, outputs: [ new vscode.NotebookCellOutput([ new vscode.NotebookCellOutputItem('text/plain', 'Hello World', { testOutputItemMetadata: true }) @@ -488,7 +488,7 @@ suite('Notebook API tests', function () { const cellMetadataChangeEvent = asPromise(vscode.notebook.onDidChangeCellMetadata); const version = vscode.window.activeNotebookEditor!.document.version; await vscode.window.activeNotebookEditor!.edit(editBuilder => { - editBuilder.replaceCells(1, 0, [{ cellKind: vscode.NotebookCellKind.Code, language: 'javascript', source: 'test 2', outputs: [], metadata: undefined }]); + editBuilder.replaceCells(1, 0, [{ kind: vscode.NotebookCellKind.Code, language: 'javascript', source: 'test 2', outputs: [], metadata: undefined }]); editBuilder.replaceCellMetadata(0, new vscode.NotebookCellMetadata().with({ runnable: false })); }); @@ -506,7 +506,7 @@ suite('Notebook API tests', function () { const cellMetadataChangeEvent = asPromise(vscode.notebook.onDidChangeCellMetadata); const version = vscode.window.activeNotebookEditor!.document.version; await vscode.window.activeNotebookEditor!.edit(editBuilder => { - editBuilder.replaceCells(1, 0, [{ cellKind: vscode.NotebookCellKind.Code, language: 'javascript', source: 'test 2', outputs: [], metadata: undefined }]); + editBuilder.replaceCells(1, 0, [{ kind: vscode.NotebookCellKind.Code, language: 'javascript', source: 'test 2', outputs: [], metadata: undefined }]); editBuilder.replaceCellMetadata(0, new vscode.NotebookCellMetadata().with({ runnable: false })); }); @@ -1187,7 +1187,7 @@ suite('Notebook API tests', function () { const cellsChangeEvent = asPromise(vscode.notebook.onDidChangeNotebookCells); await vscode.window.activeNotebookEditor!.edit(editBuilder => { - editBuilder.replaceCells(1, 0, [{ cellKind: vscode.NotebookCellKind.Code, language: 'javascript', source: 'test 2', outputs: [], metadata: undefined }]); + editBuilder.replaceCells(1, 0, [{ kind: vscode.NotebookCellKind.Code, language: 'javascript', source: 'test 2', outputs: [], metadata: undefined }]); }); const cellChangeEventRet = await cellsChangeEvent; diff --git a/extensions/vscode-notebook-tests/src/extension.ts b/extensions/vscode-notebook-tests/src/extension.ts index 55231411594..038b87fc44e 100644 --- a/extensions/vscode-notebook-tests/src/extension.ts +++ b/extensions/vscode-notebook-tests/src/extension.ts @@ -28,14 +28,14 @@ export function activate(context: vscode.ExtensionContext): any { { source: 'code()', language: 'typescript', - cellKind: vscode.NotebookCellKind.Code, + kind: vscode.NotebookCellKind.Code, outputs: [], metadata: new vscode.NotebookCellMetadata().with({ custom: { testCellMetadata: 123 } }) }, { source: 'Markdown Cell', language: 'markdown', - cellKind: vscode.NotebookCellKind.Markdown, + kind: vscode.NotebookCellKind.Markdown, outputs: [], metadata: new vscode.NotebookCellMetadata().with({ custom: { testCellMetadata: 123 } }) } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 0cd2f79a8da..3e50d9bc558 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -1352,21 +1352,22 @@ declare module 'vscode' { readonly visibleRanges: ReadonlyArray; } - // todo@API make class // todo@API support ids https://github.com/jupyter/enhancement-proposals/blob/master/62-cell-id/cell-id.md - export interface NotebookCellData { - readonly cellKind: NotebookCellKind; - readonly source: string; - readonly language: string; - // todo@API maybe use a separate data type? - readonly outputs: NotebookCellOutput[]; - readonly metadata: NotebookCellMetadata | undefined; + export class NotebookCellData { + kind: NotebookCellKind; + // todo@API better names: value? text? + source: string; + // todo@API how does language and MD relate? + language: string; + outputs?: NotebookCellOutput[]; + metadata?: NotebookCellMetadata; + constructor(kind: NotebookCellKind, source: string, language: string, outputs?: NotebookCellOutput[], metadata?: NotebookCellMetadata) } - // todo@API make class - export interface NotebookData { - readonly cells: NotebookCellData[]; - readonly metadata: NotebookDocumentMetadata; + export class NotebookData { + cells: NotebookCellData[]; + metadata?: NotebookDocumentMetadata; + constructor(cells: NotebookCellData[], metadata?: NotebookDocumentMetadata); } diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 2cf40bc81e2..7a338648351 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1230,6 +1230,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I NotebookCellRunState: extHostTypes.NotebookCellRunState, NotebookDocumentMetadata: extHostTypes.NotebookDocumentMetadata, NotebookCellMetadata: extHostTypes.NotebookCellMetadata, + NotebookCellData: extHostTypes.NotebookCellData, + NotebookData: extHostTypes.NotebookData, NotebookRunState: extHostTypes.NotebookRunState, NotebookCellStatusBarAlignment: extHostTypes.NotebookCellStatusBarAlignment, NotebookEditorRevealType: extHostTypes.NotebookEditorRevealType, diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 2d769cbf86a..5b885621c3f 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -1462,19 +1462,11 @@ export namespace NotebookCellData { export function from(data: vscode.NotebookCellData): notebooks.ICellDto2 { return { - cellKind: NotebookCellKind.from(data.cellKind), + cellKind: NotebookCellKind.from(data.kind), language: data.language, source: data.source, metadata: data.metadata, - outputs: data.outputs.map(output => ({ - outputId: output.id, - metadata: output.metadata, - outputs: (output.outputs || []).map(op => ({ - mime: op.mime, - value: op.value, - metadata: op.metadata - })) - })) + outputs: data.outputs ? data.outputs.map(NotebookCellOutput.from) : [] }; } } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 036ee6228fb..1613ff83ac5 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -3138,11 +3138,38 @@ export class NotebookDocumentMetadata { runState, trusted ); - - } } +export class NotebookCellData { + + kind: NotebookCellKind; + source: string; + language: string; + outputs?: NotebookCellOutput[]; + metadata?: NotebookCellMetadata; + + constructor(kind: NotebookCellKind, source: string, language: string, outputs?: NotebookCellOutput[], metadata?: NotebookCellMetadata) { + this.kind = kind; + this.source = source; + this.language = language; + this.outputs = outputs ?? []; + this.metadata = metadata; + } +} + +export class NotebookData { + + cells: NotebookCellData[]; + metadata?: NotebookDocumentMetadata; + + constructor(cells: NotebookCellData[], metadata?: NotebookDocumentMetadata) { + this.cells = cells; + this.metadata = metadata; + } +} + + export class NotebookCellOutputItem { static isNotebookCellOutputItem(obj: unknown): obj is vscode.NotebookCellOutputItem {