Skip to content

Commit 07b860d

Browse files
IanMatthewHuffIan Huff
and
Ian Huff
authored
Update for new NotebookCellOutput changes (#35)
* update renderer types def * code changes for new API * support both types in error message Co-authored-by: Ian Huff <[email protected]>
1 parent f474253 commit 07b860d

File tree

3 files changed

+59
-38
lines changed

3 files changed

+59
-38
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
"@types/react-dom": "^16.9.8",
123123
"@types/uuid": "^8.0.0",
124124
"@types/vscode": "^1.45.0",
125-
"@types/vscode-notebook-renderer": "^1.48.0",
125+
"@types/vscode-notebook-renderer": "^1.55.0",
126126
"@typescript-eslint/eslint-plugin": "^3.1.0",
127127
"@typescript-eslint/parser": "^3.1.0",
128128
"cache-loader": "^4.1.0",

src/client/index.tsx

Lines changed: 55 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,59 +24,80 @@ const notebookApi = acquireNotebookRendererApi(JupyterNotebookRenderer);
2424

2525
notebookApi.onDidCreateOutput(renderOutput);
2626

27+
// Copy of vscode-notebook-renderer old types as of 1.48
28+
// Keep these so we can support both the old interface and the new interface
29+
// Interface change here: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/51675/files
30+
interface OldNotebookCellOutputMetadata {
31+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
32+
custom?: { [key: string]: any };
33+
}
34+
interface OldNotebookOutput {
35+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
36+
data: { [mimeType: string]: any };
37+
metadata?: OldNotebookCellOutputMetadata;
38+
}
39+
interface OldNotebookOutputEventParams {
40+
element: HTMLElement;
41+
outputId: string;
42+
output: OldNotebookOutput;
43+
mimeType: string;
44+
}
45+
2746
/**
2847
* Called from renderer to render output.
2948
* This will be exposed as a public method on window for renderer to render output.
3049
*/
3150
function renderOutput(request: NotebookOutputEventParams) {
51+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
52+
const mimeString = request.mime || (request as any).mimeType;
3253
try {
33-
console.error('request', request);
54+
console.log('request', request);
3455
const output = convertVSCodeOutputToExecutResultOrDisplayData(request);
35-
console.log(`Rendering mimeType ${request.mimeType}`, output);
36-
console.error('request output', output);
56+
console.log(`Rendering mimeType ${mimeString}`, output);
57+
console.log('request output', output);
3758

38-
ReactDOM.render(React.createElement(CellOutput, { mimeType: request.mimeType, output }, null), request.element);
59+
ReactDOM.render(React.createElement(CellOutput, { mimeType: mimeString, output }, null), request.element);
3960
} catch (ex) {
40-
console.error(`Failed to render mime type ${request.mimeType}`, ex);
61+
console.error(`Failed to render mime type ${mimeString}`, ex);
4162
}
4263
}
4364

4465
function convertVSCodeOutputToExecutResultOrDisplayData(
4566
request: NotebookOutputEventParams
4667
): nbformat.IExecuteResult | nbformat.IDisplayData {
47-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
48-
const metadata: Record<string, any> = {};
49-
// Send metadata only for the mimeType we are interested in.
50-
const customMetadata = request.output.metadata?.custom;
51-
if (customMetadata) {
52-
// Support for Old API
53-
if (customMetadata[request.mimeType]) {
54-
metadata[request.mimeType] = customMetadata[request.mimeType];
55-
}
56-
if (customMetadata.needs_background) {
57-
metadata.needs_background = customMetadata.needs_background;
58-
}
59-
if (customMetadata.unconfined) {
60-
metadata.unconfined = customMetadata.unconfined;
61-
}
68+
if ('mime' in request) {
69+
// New API
70+
return {
71+
data: {
72+
[request.mime]: request.value
73+
},
74+
metadata: request.metadata || {},
75+
execution_count: null,
76+
output_type: request.metadata?.outputType || 'execute_result'
77+
};
6278
} else {
63-
// New API.
79+
// Old API
6480
// eslint-disable-next-line @typescript-eslint/no-explicit-any
65-
const outputMetadata = request.output.metadata as Record<string, any> | undefined;
66-
if (outputMetadata && outputMetadata[request.mimeType] && outputMetadata[request.mimeType].metadata) {
81+
const metadata: Record<string, any> = {};
82+
83+
const oldRequest = (request as unknown) as OldNotebookOutputEventParams;
84+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
85+
const outputMetadata = oldRequest.output.metadata as Record<string, any> | undefined;
86+
if (outputMetadata && outputMetadata[oldRequest.mimeType] && outputMetadata[oldRequest.mimeType].metadata) {
6787
// eslint-disable-next-line @typescript-eslint/no-explicit-any
68-
Object.assign(metadata, outputMetadata[request.mimeType].metadata);
69-
if (request.mimeType in outputMetadata[request.mimeType].metadata) {
70-
Object.assign(metadata, outputMetadata[request.mimeType].metadata[request.mimeType]);
88+
Object.assign(metadata, outputMetadata[oldRequest.mimeType].metadata);
89+
if (oldRequest.mimeType in outputMetadata[oldRequest.mimeType].metadata) {
90+
Object.assign(metadata, outputMetadata[oldRequest.mimeType].metadata[oldRequest.mimeType]);
7191
}
7292
}
93+
94+
return {
95+
data: {
96+
[oldRequest.mimeType]: oldRequest.output.data[oldRequest.mimeType]
97+
},
98+
metadata,
99+
execution_count: null,
100+
output_type: oldRequest.output.metadata?.custom?.vscode?.outputType || 'execute_result'
101+
};
73102
}
74-
return {
75-
data: {
76-
[request.mimeType]: request.output.data[request.mimeType]
77-
},
78-
metadata,
79-
execution_count: null,
80-
output_type: request.output.metadata?.custom?.vscode?.outputType || 'execute_result'
81-
};
82103
}

0 commit comments

Comments
 (0)