/
index.ts
76 lines (67 loc) · 2.2 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
/**
* @packageDocumentation
* @module javascript-extension
*/
import { RenderedJavaScript } from '@jupyterlab/rendermime';
import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
export const TEXT_JAVASCRIPT_MIMETYPE = 'text/javascript';
export const APPLICATION_JAVASCRIPT_MIMETYPE = 'application/javascript';
function evalInContext(
code: string,
element: Element,
document: Document,
window: Window
) {
// eslint-disable-next-line
return eval(code);
}
export class ExperimentalRenderedJavascript extends RenderedJavaScript {
render(model: IRenderMime.IMimeModel): Promise<void> {
const trans = this.translator.load('jupyterlab');
const renderJavascript = () => {
try {
const data = model.data[this.mimeType] as string | undefined;
if (data) {
evalInContext(data, this.node, document, window);
}
return Promise.resolve();
} catch (error) {
return Promise.reject(error);
}
};
if (!model.trusted) {
// If output is not trusted or if arbitrary Javascript execution is not enabled, render an informative error message
const pre = document.createElement('pre');
pre.textContent = trans.__(
'Are you sure that you want to run arbitrary Javascript within your JupyterLab session?'
);
const button = document.createElement('button');
button.textContent = trans.__('Run');
this.node.appendChild(pre);
this.node.appendChild(button);
button.onclick = event => {
this.node.textContent = '';
void renderJavascript();
};
return Promise.resolve();
}
return renderJavascript();
}
}
/**
* A mime renderer factory for text/javascript data.
*/
export const rendererFactory: IRenderMime.IRendererFactory = {
safe: false,
mimeTypes: [TEXT_JAVASCRIPT_MIMETYPE, APPLICATION_JAVASCRIPT_MIMETYPE],
createRenderer: options => new ExperimentalRenderedJavascript(options)
};
const extension: IRenderMime.IExtension = {
id: '@jupyterlab/javascript-extension:factory',
rendererFactory,
rank: 0,
dataType: 'string'
};
export default extension;