From dedd90e20ca68d711af06c2c7e151aca9e87313f Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Fri, 26 Jun 2020 16:08:32 -0700 Subject: [PATCH] vscode-notebook-renderer: init (#45731) * vscode-notebook-renderer: init * fixup! bad username link --- types/vscode-notebook-renderer/index.d.ts | 49 +++++++++++++++++++ types/vscode-notebook-renderer/tsconfig.json | 24 +++++++++ types/vscode-notebook-renderer/tslint.json | 6 +++ .../vscode-notebook-renderer-tests.ts | 35 +++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 types/vscode-notebook-renderer/index.d.ts create mode 100644 types/vscode-notebook-renderer/tsconfig.json create mode 100644 types/vscode-notebook-renderer/tslint.json create mode 100644 types/vscode-notebook-renderer/vscode-notebook-renderer-tests.ts diff --git a/types/vscode-notebook-renderer/index.d.ts b/types/vscode-notebook-renderer/index.d.ts new file mode 100644 index 0000000000..314d15fbc2 --- /dev/null +++ b/types/vscode-notebook-renderer/index.d.ts @@ -0,0 +1,49 @@ +// Type definitions for non-npm package vscode-notebook-renderer 1.47 +// Project: https://github.com/microsoft/vscode-docs/blob/notebook/api/extension-guides/notebook.md +// Definitions by: Connor Peet +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// Minimum TypeScript Version: 3.0 + +// todo: update "Project" link above to docs site, once it becomes available + +export interface Disposable { + dispose(): void; +} + +export interface VSCodeEvent { + (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]): Disposable; +} + +export interface NotebookRendererApi { + setState(value: T): void; + getState(): T | undefined; + + /** + * Sends a message to the renderer extension code. Can be received in + * the `onDidReceiveMessage` event in `NotebookCommunication`. + */ + postMessage(msg: unknown): void; + + /** + * Fired before an output is destroyed, with its output ID, or undefined if + * all cells are about to unmount. + */ + onWillDestroyOutput: VSCodeEvent<{ outputId: string } | undefined>; + + /** + * Fired when an output is rendered. The `outputId` provided is the same + * as the one given in `NotebookOutputRenderer.render` in the extension + * API, and `onWillDestroyOutput`. + */ + onDidCreateOutput: VSCodeEvent<{ element: HTMLElement; outputId: string }>; + + /** + * Called when the renderer uses `postMessage` on the NotebookCommunication + * instance for this renderer. + */ + onDidReceiveMessage: VSCodeEvent; +} + +declare global { + function acquireNotebookRendererApi(rendererId: string): NotebookRendererApi; +} diff --git a/types/vscode-notebook-renderer/tsconfig.json b/types/vscode-notebook-renderer/tsconfig.json new file mode 100644 index 0000000000..86582179d4 --- /dev/null +++ b/types/vscode-notebook-renderer/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6", + "DOM" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "vscode-notebook-renderer-tests.ts" + ] +} diff --git a/types/vscode-notebook-renderer/tslint.json b/types/vscode-notebook-renderer/tslint.json new file mode 100644 index 0000000000..5c1c77d301 --- /dev/null +++ b/types/vscode-notebook-renderer/tslint.json @@ -0,0 +1,6 @@ +{ + "extends": "dtslint/dt.json", + "rules": { + "npm-naming": false + } +} diff --git a/types/vscode-notebook-renderer/vscode-notebook-renderer-tests.ts b/types/vscode-notebook-renderer/vscode-notebook-renderer-tests.ts new file mode 100644 index 0000000000..1c63e4e710 --- /dev/null +++ b/types/vscode-notebook-renderer/vscode-notebook-renderer-tests.ts @@ -0,0 +1,35 @@ +import { NotebookRendererApi } from 'vscode-notebook-renderer'; + +const notebookApi: NotebookRendererApi<{ cool: boolean }> = acquireNotebookRendererApi('myRendererId'); + +const prevState = notebookApi.getState(); + +// $ExpectError +prevState.cool; + +if (prevState) { + console.log('cool?', prevState.cool); +} + +notebookApi.setState({ cool: true }); + +const listener = notebookApi.onDidCreateOutput(({ element, outputId }) => { + // $ExpectType string + outputId; + // $ExpectType HTMLElement + element; +}); + +listener.dispose(); + +notebookApi.onDidReceiveMessage(msg => { + // $ExpectType any + msg; + + notebookApi.postMessage(msg); +}); + +notebookApi.onWillDestroyOutput(evt => { + // $ExpectType { outputId: string; } | undefined + evt; +});