1
- import { DOMWidgetModel , DOMWidgetView } from ' @jupyter-widgets/base'
1
+ import { DOMWidgetModel , DOMWidgetView } from " @jupyter-widgets/base"
2
2
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"
6
10
7
- import { name , version } from './metadata'
11
+ import { name , version } from './metadata'
8
12
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
11
17
}
12
18
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
19
22
20
- const { keys, values } = Object
23
+ const { keys, values} = Object
21
24
22
25
const version_range = `^${ version } `
23
26
24
27
export type RenderBundle = {
25
- docs_json : DocsJson
28
+ docs_json : DocJson [ ]
26
29
render_items : RenderItem [ ]
27
30
div : string
28
31
}
29
32
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"
54
36
}
37
+ */
55
38
56
39
export class BokehModel extends DOMWidgetModel {
57
- defaults ( ) : any {
40
+ defaults ( ) : { [ key : string ] : unknown } {
58
41
return {
59
42
...super . defaults ( ) ,
60
43
@@ -67,7 +50,7 @@ export class BokehModel extends DOMWidgetModel {
67
50
_view_module_version : version_range ,
68
51
69
52
combine_events : false ,
70
- render_bundle : { }
53
+ render_bundle : { } ,
71
54
}
72
55
}
73
56
@@ -80,7 +63,7 @@ export class BokehView extends DOMWidgetView {
80
63
private _document : Document | null
81
64
private _receiver : Receiver
82
65
private _blocked : boolean
83
- private _msgs : any [ ]
66
+ private _msgs : DocumentChanged [ ]
84
67
private _idle : boolean
85
68
private _combine : boolean
86
69
@@ -91,15 +74,12 @@ export class BokehView extends DOMWidgetView {
91
74
this . _idle = true
92
75
this . _combine = true
93
76
this . _msgs = [ ]
94
- const { Receiver } = bk_require ( 'protocol/receiver' )
77
+ const { Receiver} = bk_require ( 'protocol/receiver' )
95
78
this . _receiver = new Receiver ( )
96
79
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 ) {
101
81
// Handle classic Jupyter notebook
102
- const events = ( window as any ) . require ( 'base/js/events' )
82
+ const events = require ( 'base/js/events' )
103
83
events . on ( 'kernel_idle.Kernel' , ( ) => this . _process_msg ( ) )
104
84
} else if ( ( this . model . widget_manager as any ) . context != null ) {
105
85
// Handle JupyterLab and Voila
@@ -115,15 +95,11 @@ export class BokehView extends DOMWidgetView {
115
95
}
116
96
} )
117
97
} 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.' )
121
99
this . _combine = false
122
100
}
123
101
} 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.' )
127
103
this . _combine = false
128
104
}
129
105
this . listenTo ( this . model , 'msg:custom' , ( content , buffers ) =>
@@ -145,23 +121,21 @@ export class BokehView extends DOMWidgetView {
145
121
this . el . innerHTML = div
146
122
const element = this . el . children [ 0 ]
147
123
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 )
151
127
for ( const item of render_items ) {
152
- const roots : { [ key : string ] : Element } = { }
128
+ const roots : { [ key : string ] : Element } = { }
153
129
for ( const root_id in item . roots ) {
154
130
roots [ root_id ] = element
155
131
}
156
- add_document_standalone ( this . _document , element , roots )
132
+ standalone . add_document_standalone ( this . _document , element , roots )
157
133
}
158
- this . _document . on_change ( ( event : any ) => this . _change_event ( event ) )
134
+ this . _document . on_change ( ( event ) => this . _change_event ( event ) )
159
135
}
160
136
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 [ ] = [ ]
165
139
for ( const msg of this . _msgs ) {
166
140
if ( new_msg . kind != msg . kind ) {
167
141
new_msgs . push ( msg )
@@ -184,7 +158,7 @@ export class BokehView extends DOMWidgetView {
184
158
return new_msgs
185
159
}
186
160
187
- _send ( msg : ModelChanged | MessageSent ) : void {
161
+ _send ( msg : DocumentChanged ) : void {
188
162
if ( ! this . _idle && this . _combine && this . model . get ( 'combine_events' ) ) {
189
163
// Queue event and drop previous events on same model attribute
190
164
this . _msgs = this . _combine_events ( msg )
@@ -198,17 +172,14 @@ export class BokehView extends DOMWidgetView {
198
172
if ( this . _blocked ) {
199
173
return
200
174
}
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"
205
179
this . _send ( event_rep )
206
180
}
207
181
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 {
212
183
if ( this . _document == null ) {
213
184
return
214
185
}
@@ -219,7 +190,7 @@ export class BokehView extends DOMWidgetView {
219
190
if ( comm_msg != null && keys ( comm_msg . content ) . length > 0 ) {
220
191
this . _blocked = true
221
192
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 )
223
194
} finally {
224
195
this . _blocked = false
225
196
}
0 commit comments