@@ -7,41 +7,27 @@ import { DeepnoteDataConverter } from './deepnoteDataConverter';
77
88export { DeepnoteProject , DeepnoteNotebook , DeepnoteBlock , DeepnoteOutput } from './deepnoteTypes' ;
99
10- export class DeepnoteNotebookSerializer implements NotebookSerializer {
11- private static manager = new DeepnoteNotebookManager ( ) ;
12- private static selector = new DeepnoteNotebookSelector ( ) ;
13- private static converter = new DeepnoteDataConverter ( ) ;
14-
15- static setSelectedNotebookForUri ( uri : string , notebookId : string ) {
16- DeepnoteNotebookSerializer . manager . setSelectedNotebookForUri ( uri , notebookId ) ;
17- }
18-
19- static getSelectedNotebookForUri ( uri : string ) : string | undefined {
20- return DeepnoteNotebookSerializer . manager . getSelectedNotebookForUri ( uri ) ;
21- }
22-
23- static shouldSkipPrompt ( uri : string ) : boolean {
24- return DeepnoteNotebookSerializer . manager . shouldSkipPrompt ( uri ) ;
25- }
10+ export type NotebookSelectionCallback = (
11+ projectId : string ,
12+ notebooks : DeepnoteNotebook [ ]
13+ ) => Promise < DeepnoteNotebook | undefined > ;
2614
27- static storeOriginalProject ( projectId : string , project : DeepnoteProject , notebookId : string ) {
28- DeepnoteNotebookSerializer . manager . storeOriginalProject ( projectId , project , notebookId ) ;
29- }
30-
31- static getOriginalProject ( projectId : string ) : DeepnoteProject | undefined {
32- return DeepnoteNotebookSerializer . manager . getOriginalProject ( projectId ) ;
33- }
15+ export class DeepnoteNotebookSerializer implements NotebookSerializer {
16+ private manager = new DeepnoteNotebookManager ( ) ;
17+ private selector = new DeepnoteNotebookSelector ( ) ;
18+ private converter = new DeepnoteDataConverter ( ) ;
19+ private notebookSelectionCallback ?: NotebookSelectionCallback ;
3420
35- static getCurrentNotebookId ( projectId : string ) : string | undefined {
36- return DeepnoteNotebookSerializer . manager . getCurrentNotebookId ( projectId ) ;
21+ getManager ( ) : DeepnoteNotebookManager {
22+ return this . manager ;
3723 }
3824
39- static getManager ( ) : DeepnoteNotebookManager {
40- return DeepnoteNotebookSerializer . manager ;
25+ getConverter ( ) : DeepnoteDataConverter {
26+ return this . converter ;
4127 }
4228
43- static getConverter ( ) : DeepnoteDataConverter {
44- return DeepnoteNotebookSerializer . converter ;
29+ setNotebookSelectionCallback ( callback : NotebookSelectionCallback ) {
30+ this . notebookSelectionCallback = callback ;
4531 }
4632
4733 async deserializeNotebook ( content : Uint8Array , _token : CancellationToken ) : Promise < NotebookData > {
@@ -53,23 +39,18 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
5339 throw new Error ( 'Invalid Deepnote file: no notebooks found' ) ;
5440 }
5541
56- const selectedNotebook = await this . selectNotebookForOpen (
57- deepnoteProject . project . id ,
58- deepnoteProject . project . notebooks
59- ) ;
42+ const selectedNotebook = this . notebookSelectionCallback
43+ ? await this . notebookSelectionCallback ( deepnoteProject . project . id , deepnoteProject . project . notebooks )
44+ : await this . selectNotebookForOpen ( deepnoteProject . project . id , deepnoteProject . project . notebooks ) ;
6045
6146 if ( ! selectedNotebook ) {
6247 throw new Error ( 'No notebook selected' ) ;
6348 }
6449
65- const cells = DeepnoteNotebookSerializer . converter . convertBlocksToCells ( selectedNotebook . blocks ) ;
50+ const cells = this . converter . convertBlocksToCells ( selectedNotebook . blocks ) ;
6651
6752 // Store the original project for later serialization
68- DeepnoteNotebookSerializer . manager . storeOriginalProject (
69- deepnoteProject . project . id ,
70- deepnoteProject ,
71- selectedNotebook . id
72- ) ;
53+ this . manager . storeOriginalProject ( deepnoteProject . project . id , deepnoteProject , selectedNotebook . id ) ;
7354
7455 return {
7556 cells,
@@ -97,14 +78,13 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
9778 throw new Error ( 'Missing Deepnote project ID in notebook metadata' ) ;
9879 }
9980
100- const originalProject = DeepnoteNotebookSerializer . manager . getOriginalProject ( projectId ) ;
81+ const originalProject = this . manager . getOriginalProject ( projectId ) ;
10182 if ( ! originalProject ) {
10283 throw new Error ( 'Original Deepnote project not found. Cannot save changes.' ) ;
10384 }
10485
10586 // Get the current notebook ID (may have changed due to switching)
106- const notebookId =
107- data . metadata ?. deepnoteNotebookId || DeepnoteNotebookSerializer . manager . getCurrentNotebookId ( projectId ) ;
87+ const notebookId = data . metadata ?. deepnoteNotebookId || this . manager . getCurrentNotebookId ( projectId ) ;
10888 if ( ! notebookId ) {
10989 throw new Error ( 'Cannot determine which notebook to save' ) ;
11090 }
@@ -119,7 +99,7 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
11999 const updatedProject = JSON . parse ( JSON . stringify ( originalProject ) ) as DeepnoteProject ;
120100
121101 // Convert cells back to blocks
122- const updatedBlocks = DeepnoteNotebookSerializer . converter . convertCellsToBlocks ( data . cells ) ;
102+ const updatedBlocks = this . converter . convertCellsToBlocks ( data . cells ) ;
123103
124104 // Update the notebook's blocks
125105 updatedProject . project . notebooks [ notebookIndex ] . blocks = updatedBlocks ;
@@ -136,7 +116,7 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
136116 } ) ;
137117
138118 // Store the updated project for future saves
139- DeepnoteNotebookSerializer . manager . storeOriginalProject ( projectId , updatedProject , notebookId ) ;
119+ this . manager . storeOriginalProject ( projectId , updatedProject , notebookId ) ;
140120
141121 return new TextEncoder ( ) . encode ( yamlString ) ;
142122 } catch ( error ) {
@@ -152,8 +132,8 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
152132 notebooks : DeepnoteNotebook [ ]
153133 ) : Promise < DeepnoteNotebook | undefined > {
154134 const fileId = projectId ;
155- const skipPrompt = DeepnoteNotebookSerializer . manager . shouldSkipPrompt ( fileId ) ;
156- const storedNotebookId = DeepnoteNotebookSerializer . manager . getSelectedNotebookForUri ( fileId ) ;
135+ const skipPrompt = this . manager . shouldSkipPrompt ( fileId ) ;
136+ const storedNotebookId = this . manager . getSelectedNotebookForUri ( fileId ) ;
157137
158138 if ( notebooks . length === 1 ) {
159139 return notebooks [ 0 ] ;
@@ -175,9 +155,9 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer {
175155 }
176156
177157 // Prompt user to select a notebook
178- const selected = await DeepnoteNotebookSerializer . selector . selectNotebook ( notebooks ) ;
158+ const selected = await this . selector . selectNotebook ( notebooks ) ;
179159 if ( selected ) {
180- DeepnoteNotebookSerializer . manager . setSelectedNotebookForUri ( fileId , selected . id ) ;
160+ this . manager . setSelectedNotebookForUri ( fileId , selected . id ) ;
181161 return selected ;
182162 }
183163
0 commit comments