diff --git a/src/client/common/application/notebook.ts b/src/client/common/application/notebook.ts index 9bc3e7258af1..529718ac414d 100644 --- a/src/client/common/application/notebook.ts +++ b/src/client/common/application/notebook.ts @@ -5,6 +5,7 @@ import { inject, injectable } from 'inversify'; import { Disposable, Event, EventEmitter } from 'vscode'; import type { notebook, + NotebookCellMetadata, NotebookCellsChangeEvent as VSCNotebookCellsChangeEvent, NotebookContentProvider, NotebookDocument, @@ -96,8 +97,15 @@ export class VSCodeNotebook implements IVSCodeNotebook { this.canUseNotebookApi = true; } } - public registerNotebookContentProvider(notebookType: string, provider: NotebookContentProvider): Disposable { - return this.notebook.registerNotebookContentProvider(notebookType, provider); + public registerNotebookContentProvider( + notebookType: string, + provider: NotebookContentProvider, + options?: { + transientOutputs: boolean; + transientMetadata: { [K in keyof NotebookCellMetadata]?: boolean }; + } + ): Disposable { + return this.notebook.registerNotebookContentProvider(notebookType, provider, options); } public registerNotebookKernelProvider( selector: NotebookDocumentFilter, diff --git a/src/client/common/application/types.ts b/src/client/common/application/types.ts index 3f493d69d27b..8efd114e7d29 100644 --- a/src/client/common/application/types.ts +++ b/src/client/common/application/types.ts @@ -60,6 +60,7 @@ import { } from 'vscode'; import type { NotebookCellLanguageChangeEvent as VSCNotebookCellLanguageChangeEvent, + NotebookCellMetadata, NotebookCellOutputsChangeEvent as VSCNotebookCellOutputsChangeEvent, NotebookCellsChangeEvent as VSCNotebookCellsChangeEvent, NotebookContentProvider, @@ -1541,7 +1542,22 @@ export interface IVSCodeNotebook { readonly onDidChangeNotebookDocument: Event; readonly notebookEditors: Readonly; readonly activeNotebookEditor: NotebookEditor | undefined; - registerNotebookContentProvider(notebookType: string, provider: NotebookContentProvider): Disposable; + registerNotebookContentProvider( + notebookType: string, + provider: NotebookContentProvider, + options?: { + /** + * Controls if outputs change will trigger notebook document content change and if it will be used in the diff editor + * Default to false. If the content provider doesn't persisit the outputs in the file document, this should be set to true. + */ + transientOutputs: boolean; + /** + * Controls if a meetadata property change will trigger notebook document content change and if it will be used in the diff editor + * Default to false. If the content provider doesn't persisit a metadata property in the file document, it should be set to true. + */ + transientMetadata: { [K in keyof NotebookCellMetadata]?: boolean }; + } + ): Disposable; registerNotebookKernelProvider(selector: NotebookDocumentFilter, provider: NotebookKernelProvider): Disposable; } diff --git a/src/client/datascience/notebook/integration.ts b/src/client/datascience/notebook/integration.ts index a34df9413e97..6daa924eed8e 100644 --- a/src/client/datascience/notebook/integration.ts +++ b/src/client/datascience/notebook/integration.ts @@ -56,7 +56,23 @@ export class NotebookIntegration implements IExtensionSingleActivationService { } try { this.disposables.push( - this.vscNotebook.registerNotebookContentProvider(JupyterNotebookView, this.notebookContentProvider) + this.vscNotebook.registerNotebookContentProvider(JupyterNotebookView, this.notebookContentProvider, { + transientOutputs: false, + transientMetadata: { + breakpointMargin: true, + editable: true, + hasExecutionOrder: true, + inputCollapsed: true, + lastRunDuration: true, + outputCollapsed: true, + runStartTime: true, + runnable: true, + executionOrder: false, + custom: false, + runState: false, + statusMessage: false + } + }) ); this.disposables.push( this.vscNotebook.registerNotebookKernelProvider(