Skip to content

Commit bbe4cbe

Browse files
committed
Use proper bokehjs' type in src/widgets.ts
1 parent 560c2ed commit bbe4cbe

File tree

5 files changed

+64
-100
lines changed

5 files changed

+64
-100
lines changed

.eslintrc.js

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,5 @@ module.exports = {
1111
},
1212
plugins: ['@typescript-eslint'],
1313
rules: {
14-
'@typescript-eslint/naming-convention': [
15-
'warn',
16-
{
17-
'selector': 'interface',
18-
'format': ['PascalCase'],
19-
'custom': {
20-
'regex': '^I[A-Z]',
21-
'match': true
22-
}
23-
}
24-
],
25-
'@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }],
26-
'@typescript-eslint/no-explicit-any': 'off',
27-
'@typescript-eslint/no-namespace': 'off',
28-
'@typescript-eslint/no-use-before-define': 'off',
29-
'@typescript-eslint/quotes': [
30-
'error',
31-
'single',
32-
{ avoidEscape: true, allowTemplateLiterals: false }
33-
],
34-
curly: ['error', 'all'],
35-
semi: ['warn', 'never'],
36-
eqeqeq: 'warn',
37-
'prefer-arrow-callback': 'error'
3814
}
39-
};
15+
}

package-lock.json

Lines changed: 11 additions & 0 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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"style-loader": "^2.0.0"
5959
},
6060
"devDependencies": {
61+
"@bokeh/bokehjs": "^3.1.0rc.1",
6162
"@jupyterlab/builder": "^3.0.0",
6263
"@typescript-eslint/eslint-plugin": "^4.8.1",
6364
"@typescript-eslint/parser": "^4.8.1",

src/widgets.ts

Lines changed: 45 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,43 @@
1-
import { DOMWidgetModel, DOMWidgetView } from '@jupyter-widgets/base'
1+
import {DOMWidgetModel, DOMWidgetView} from "@jupyter-widgets/base"
22

3-
//import {Document, DocumentChangedEvent, ModelChangedEvent} from "document"
4-
//import {Receiver, Fragment} from "protocol/receiver"
5-
//import {keys, values} from "core/util/object"
3+
// Use only `import type`, so that all imports are erased at run time
4+
import type {Document, DocJson, Patch, DocumentChangedEvent} from "@bokeh/bokehjs/document"
5+
import type {DocumentChanged} from "@bokeh/bokehjs/document/events"
6+
import type {Receiver, Fragment} from "@bokeh/bokehjs/protocol/receiver"
7+
import type {RenderItem} from "@bokeh/bokehjs/embed/json"
8+
import type {Serializer} from "@bokeh/bokehjs/core/serialization"
9+
import type {add_document_standalone} from "@bokeh/bokehjs/embed/standalone"
610

7-
import { name, version } from './metadata'
11+
import {name, version} from './metadata'
812

9-
function bk_require(name: string): any {
10-
return (window as any).Bokeh.require(name)
13+
declare const Bokeh: {require(name: string): unknown}
14+
15+
function bk_require<T>(name: string): T {
16+
return Bokeh.require(name) as T
1117
}
1218

13-
type DocsJson = any
14-
type RenderItem = any
15-
type Document = any
16-
type DocumentChangedEvent = any
17-
type Receiver = any
18-
type Fragment = any
19+
declare const Jupyter: {notebook?: unknown}
20+
21+
declare function require(name: string): unknown
1922

20-
const { keys, values } = Object
23+
const {keys, values} = Object
2124

2225
const version_range = `^${version}`
2326

2427
export type RenderBundle = {
25-
docs_json: DocsJson
28+
docs_json: DocJson[]
2629
render_items: RenderItem[]
2730
div: string
2831
}
2932

30-
export interface DocumentChanged {
31-
event: 'jsevent'
32-
kind: string
33-
}
34-
35-
export interface ModelChanged extends DocumentChanged {
36-
event: 'jsevent'
37-
kind: 'ModelChanged'
38-
id: string
39-
new: unknown
40-
attr: string
41-
}
42-
43-
export interface MessageSent extends DocumentChanged {
44-
event: 'jsevent'
45-
kind: 'MessageSent'
46-
msg_data: {
47-
event_name: string
48-
event_values: {
49-
model: { id: string }
50-
[other: string]: any
51-
}
52-
}
53-
msg_type: string
33+
/*
34+
declare interface DocumentChanged {
35+
event: "jsevent"
5436
}
37+
*/
5538

5639
export class BokehModel extends DOMWidgetModel {
57-
defaults(): any {
40+
defaults(): {[key: string]: unknown} {
5841
return {
5942
...super.defaults(),
6043

@@ -67,7 +50,7 @@ export class BokehModel extends DOMWidgetModel {
6750
_view_module_version: version_range,
6851

6952
combine_events: false,
70-
render_bundle: {}
53+
render_bundle: {},
7154
}
7255
}
7356

@@ -80,7 +63,7 @@ export class BokehView extends DOMWidgetView {
8063
private _document: Document | null
8164
private _receiver: Receiver
8265
private _blocked: boolean
83-
private _msgs: any[]
66+
private _msgs: DocumentChanged[]
8467
private _idle: boolean
8568
private _combine: boolean
8669

@@ -91,15 +74,12 @@ export class BokehView extends DOMWidgetView {
9174
this._idle = true
9275
this._combine = true
9376
this._msgs = []
94-
const { Receiver } = bk_require('protocol/receiver')
77+
const {Receiver} = bk_require('protocol/receiver')
9578
this._receiver = new Receiver()
9679
this.model.on('change:render_bundle', () => this.render())
97-
if (
98-
(window as any).Jupyter != null &&
99-
(window as any).Jupyter.notebook != null
100-
) {
80+
if (Jupyter?.notebook != null) {
10181
// Handle classic Jupyter notebook
102-
const events = (window as any).require('base/js/events')
82+
const events = require('base/js/events')
10383
events.on('kernel_idle.Kernel', () => this._process_msg())
10484
} else if ((this.model.widget_manager as any).context != null) {
10585
// Handle JupyterLab and Voila
@@ -115,15 +95,11 @@ export class BokehView extends DOMWidgetView {
11595
}
11696
})
11797
} else if (this.model.get('combine_events')) {
118-
console.warn(
119-
'BokehView cannot combine events because Kernel idle status cannot be determined.'
120-
)
98+
console.warn('BokehView cannot combine events because Kernel idle status cannot be determined.')
12199
this._combine = false
122100
}
123101
} else if (this.model.get('combine_events')) {
124-
console.warn(
125-
'BokehView cannot combine events because Kernel idle status cannot be determined.'
126-
)
102+
console.warn('BokehView cannot combine events because Kernel idle status cannot be determined.')
127103
this._combine = false
128104
}
129105
this.listenTo(this.model, 'msg:custom', (content, buffers) =>
@@ -145,23 +121,21 @@ export class BokehView extends DOMWidgetView {
145121
this.el.innerHTML = div
146122
const element = this.el.children[0]
147123
const json = values(docs_json)[0]
148-
const { Document } = bk_require('document')
149-
const { add_document_standalone } = bk_require('embed/standalone')
150-
this._document = Document.from_json(json)
124+
const document = bk_require<{Document: typeof Document}>('document')
125+
const standalone = bk_require<{add_document_standalone: typeof add_document_standalone}>('embed/standalone')
126+
this._document = document.Document.from_json(json)
151127
for (const item of render_items) {
152-
const roots: { [key: string]: Element } = {}
128+
const roots: {[key: string]: Element} = {}
153129
for (const root_id in item.roots) {
154130
roots[root_id] = element
155131
}
156-
add_document_standalone(this._document, element, roots)
132+
standalone.add_document_standalone(this._document, element, roots)
157133
}
158-
this._document.on_change((event: any) => this._change_event(event))
134+
this._document.on_change((event) => this._change_event(event))
159135
}
160136

161-
_combine_events(
162-
new_msg: ModelChanged | MessageSent
163-
): (ModelChanged | MessageSent)[] {
164-
const new_msgs = []
137+
_combine_events(new_msg: DocumentChanged): DocumentChanged[] {
138+
const new_msgs: DocumentChanged[] = []
165139
for (const msg of this._msgs) {
166140
if (new_msg.kind != msg.kind) {
167141
new_msgs.push(msg)
@@ -184,7 +158,7 @@ export class BokehView extends DOMWidgetView {
184158
return new_msgs
185159
}
186160

187-
_send(msg: ModelChanged | MessageSent): void {
161+
_send(msg: DocumentChanged): void {
188162
if (!this._idle && this._combine && this.model.get('combine_events')) {
189163
// Queue event and drop previous events on same model attribute
190164
this._msgs = this._combine_events(msg)
@@ -198,17 +172,14 @@ export class BokehView extends DOMWidgetView {
198172
if (this._blocked) {
199173
return
200174
}
201-
const { Serializer } = bk_require('core/serialization')
202-
const serializer = new Serializer()
203-
const event_rep = serializer.encode(event)
204-
event_rep.event = 'jsevent'
175+
const serialization = bk_require<{Serializer: typeof Serializer}>("core/serialization")
176+
const serializer = new serialization.Serializer()
177+
const event_rep = serializer.encode(event) as DocumentChanged & {event: "jsevent"}
178+
event_rep.event = "jsevent"
205179
this._send(event_rep)
206180
}
207181

208-
protected _consume_patch(
209-
content: { msg: 'patch'; payload?: Fragment },
210-
buffers: DataView[]
211-
): void {
182+
protected _consume_patch(content: {msg: 'patch'; payload?: Fragment}, buffers: DataView[]): void {
212183
if (this._document == null) {
213184
return
214185
}
@@ -219,7 +190,7 @@ export class BokehView extends DOMWidgetView {
219190
if (comm_msg != null && keys(comm_msg.content).length > 0) {
220191
this._blocked = true
221192
try {
222-
this._document.apply_json_patch(comm_msg.content, comm_msg.buffers)
193+
this._document.apply_json_patch(comm_msg.content as Patch, comm_msg.buffers)
223194
} finally {
224195
this._blocked = false
225196
}

tsconfig.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@
1919
"strict": true,
2020
"strictNullChecks": false,
2121
"target": "es2017",
22-
"types": []
22+
"types": [],
23+
"paths": {
24+
"@bokeh/bokehjs/*": [
25+
"./node_modules/@bokeh/bokehjs/build/js/lib/*"
26+
]
27+
}
2328
},
2429
"include": ["src/*"]
2530
}

0 commit comments

Comments
 (0)