@jupyterlab/filebrowser 0.18.2 → 0.18.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/model.js +64 -85
- package/lib/model.js.map +1 -1
- package/package.json +6 -6
package/lib/model.js
CHANGED
|
@@ -205,60 +205,66 @@ class FileBrowserModel {
|
|
|
205
205
|
* @returns A promise with the contents of the directory.
|
|
206
206
|
*/
|
|
207
207
|
cd(newValue = '.') {
|
|
208
|
-
|
|
209
|
-
newValue
|
|
210
|
-
|
|
211
|
-
else {
|
|
212
|
-
newValue = this._pendingPath || this._model.path;
|
|
213
|
-
}
|
|
214
|
-
// Collapse requests to the same directory.
|
|
215
|
-
if (newValue === this._pendingPath && this._pending) {
|
|
216
|
-
return this._pending;
|
|
217
|
-
}
|
|
218
|
-
let oldValue = this.path;
|
|
219
|
-
let options = { content: true };
|
|
220
|
-
this._pendingPath = newValue;
|
|
221
|
-
if (oldValue !== newValue) {
|
|
222
|
-
this._sessions.length = 0;
|
|
223
|
-
}
|
|
224
|
-
let services = this.manager.services;
|
|
225
|
-
this._pending = services.contents
|
|
226
|
-
.get(newValue, options)
|
|
227
|
-
.then(contents => {
|
|
228
|
-
if (this.isDisposed) {
|
|
229
|
-
return;
|
|
208
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
209
|
+
if (newValue !== '.') {
|
|
210
|
+
newValue = Private.normalizePath(this.manager.services.contents, this._model.path, newValue);
|
|
230
211
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
this._pendingPath = null;
|
|
234
|
-
if (oldValue !== newValue) {
|
|
235
|
-
// If there is a state database and a unique key, save the new path.
|
|
236
|
-
if (this._state && this._key) {
|
|
237
|
-
this._state.save(this._key, { path: newValue });
|
|
238
|
-
}
|
|
239
|
-
this._pathChanged.emit({
|
|
240
|
-
name: 'path',
|
|
241
|
-
oldValue,
|
|
242
|
-
newValue
|
|
243
|
-
});
|
|
212
|
+
else {
|
|
213
|
+
newValue = this._pendingPath || this._model.path;
|
|
244
214
|
}
|
|
245
|
-
this.
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
console.error(error);
|
|
253
|
-
this._connectionFailure.emit(error);
|
|
254
|
-
this.cd('/');
|
|
215
|
+
if (this._pending) {
|
|
216
|
+
// Collapse requests to the same directory.
|
|
217
|
+
if (newValue === this._pendingPath) {
|
|
218
|
+
return this._pending;
|
|
219
|
+
}
|
|
220
|
+
// Otherwise wait for the pending request to complete before continuing.
|
|
221
|
+
yield this._pending;
|
|
255
222
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
223
|
+
let oldValue = this.path;
|
|
224
|
+
let options = { content: true };
|
|
225
|
+
this._pendingPath = newValue;
|
|
226
|
+
if (oldValue !== newValue) {
|
|
227
|
+
this._sessions.length = 0;
|
|
259
228
|
}
|
|
229
|
+
let services = this.manager.services;
|
|
230
|
+
this._pending = services.contents
|
|
231
|
+
.get(newValue, options)
|
|
232
|
+
.then(contents => {
|
|
233
|
+
if (this.isDisposed) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
this._refreshDuration = this._baseRefreshDuration;
|
|
237
|
+
this._handleContents(contents);
|
|
238
|
+
this._pendingPath = null;
|
|
239
|
+
if (oldValue !== newValue) {
|
|
240
|
+
// If there is a state database and a unique key, save the new path.
|
|
241
|
+
if (this._state && this._key) {
|
|
242
|
+
this._state.save(this._key, { path: newValue });
|
|
243
|
+
}
|
|
244
|
+
this._pathChanged.emit({
|
|
245
|
+
name: 'path',
|
|
246
|
+
oldValue,
|
|
247
|
+
newValue
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
this._onRunningChanged(services.sessions, services.sessions.running());
|
|
251
|
+
this._refreshed.emit(void 0);
|
|
252
|
+
})
|
|
253
|
+
.catch(error => {
|
|
254
|
+
this._pendingPath = null;
|
|
255
|
+
if (error.message === 'Not Found') {
|
|
256
|
+
error.message = `Directory not found: "${this._model.path}"`;
|
|
257
|
+
console.error(error);
|
|
258
|
+
this._connectionFailure.emit(error);
|
|
259
|
+
return this.cd('/');
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
this._refreshDuration = this._baseRefreshDuration * 10;
|
|
263
|
+
this._connectionFailure.emit(error);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
return this._pending;
|
|
260
267
|
});
|
|
261
|
-
return this._pending;
|
|
262
268
|
}
|
|
263
269
|
/**
|
|
264
270
|
* Download a file.
|
|
@@ -334,9 +340,7 @@ class FileBrowserModel {
|
|
|
334
340
|
return __awaiter(this, void 0, void 0, function* () {
|
|
335
341
|
const supportsChunked = coreutils_1.PageConfig.getNotebookVersion() >= [5, 1, 0];
|
|
336
342
|
const largeFile = file.size > exports.LARGE_FILE_SIZE;
|
|
337
|
-
|
|
338
|
-
const canSendChunked = supportsChunked && !isNotebook;
|
|
339
|
-
if (largeFile && !canSendChunked) {
|
|
343
|
+
if (largeFile && !supportsChunked) {
|
|
340
344
|
let msg = `Cannot upload file (>${exports.LARGE_FILE_SIZE / (1024 * 1024)} MB). ${file.name}`;
|
|
341
345
|
console.warn(msg);
|
|
342
346
|
throw msg;
|
|
@@ -354,7 +358,7 @@ class FileBrowserModel {
|
|
|
354
358
|
}
|
|
355
359
|
yield this._uploadCheckDisposed();
|
|
356
360
|
const chunkedUpload = supportsChunked && file.size > exports.CHUNK_SIZE;
|
|
357
|
-
return yield this._upload(file,
|
|
361
|
+
return yield this._upload(file, chunkedUpload);
|
|
358
362
|
});
|
|
359
363
|
}
|
|
360
364
|
_shouldUploadLarge(file) {
|
|
@@ -370,34 +374,31 @@ class FileBrowserModel {
|
|
|
370
374
|
/**
|
|
371
375
|
* Perform the actual upload.
|
|
372
376
|
*/
|
|
373
|
-
_upload(file,
|
|
377
|
+
_upload(file, chunked) {
|
|
374
378
|
return __awaiter(this, void 0, void 0, function* () {
|
|
375
379
|
// Gather the file model parameters.
|
|
376
380
|
let path = this._model.path;
|
|
377
381
|
path = path ? path + '/' + file.name : file.name;
|
|
378
382
|
let name = file.name;
|
|
379
|
-
let type =
|
|
380
|
-
let format =
|
|
383
|
+
let type = 'file';
|
|
384
|
+
let format = 'base64';
|
|
381
385
|
const uploadInner = (blob, chunk) => __awaiter(this, void 0, void 0, function* () {
|
|
382
386
|
yield this._uploadCheckDisposed();
|
|
383
387
|
let reader = new FileReader();
|
|
384
|
-
|
|
385
|
-
reader.readAsText(blob);
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
388
|
-
reader.readAsArrayBuffer(blob);
|
|
389
|
-
}
|
|
388
|
+
reader.readAsDataURL(blob);
|
|
390
389
|
yield new Promise((resolve, reject) => {
|
|
391
390
|
reader.onload = resolve;
|
|
392
391
|
reader.onerror = event => reject(`Failed to upload "${file.name}":` + event);
|
|
393
392
|
});
|
|
394
393
|
yield this._uploadCheckDisposed();
|
|
394
|
+
// remove header https://stackoverflow.com/a/24289420/907060
|
|
395
|
+
const content = reader.result.split(',')[1];
|
|
395
396
|
let model = {
|
|
396
397
|
type,
|
|
397
398
|
format,
|
|
398
399
|
name,
|
|
399
400
|
chunk,
|
|
400
|
-
content
|
|
401
|
+
content
|
|
401
402
|
};
|
|
402
403
|
return yield this.manager.services.contents.save(path, model);
|
|
403
404
|
});
|
|
@@ -564,28 +565,6 @@ exports.FileBrowserModel = FileBrowserModel;
|
|
|
564
565
|
*/
|
|
565
566
|
var Private;
|
|
566
567
|
(function (Private) {
|
|
567
|
-
/**
|
|
568
|
-
* Parse the content of a `FileReader`.
|
|
569
|
-
*
|
|
570
|
-
* If the result is an `ArrayBuffer`, return a Base64-encoded string.
|
|
571
|
-
* Otherwise, return the JSON parsed result.
|
|
572
|
-
*/
|
|
573
|
-
function getContent(reader) {
|
|
574
|
-
if (reader.result instanceof ArrayBuffer) {
|
|
575
|
-
// Base64-encode binary file data.
|
|
576
|
-
let bytes = '';
|
|
577
|
-
let buf = new Uint8Array(reader.result);
|
|
578
|
-
let nbytes = buf.byteLength;
|
|
579
|
-
for (let i = 0; i < nbytes; i++) {
|
|
580
|
-
bytes += String.fromCharCode(buf[i]);
|
|
581
|
-
}
|
|
582
|
-
return btoa(bytes);
|
|
583
|
-
}
|
|
584
|
-
else {
|
|
585
|
-
return JSON.parse(reader.result);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
Private.getContent = getContent;
|
|
589
568
|
/**
|
|
590
569
|
* Normalize a path based on a root directory, accounting for relative paths.
|
|
591
570
|
*/
|
package/lib/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../filebrowser/src/model.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n\nimport {\n IChangedArgs,\n IStateDB,\n PathExt,\n PageConfig\n} from '@jupyterlab/coreutils';\n\nimport { IDocumentManager, shouldOverwrite } from '@jupyterlab/docmanager';\n\nimport { Contents, Kernel, Session } from '@jupyterlab/services';\n\nimport {\n ArrayIterator,\n each,\n find,\n IIterator,\n IterableOrArrayLike,\n ArrayExt\n} from '@phosphor/algorithm';\n\nimport { PromiseDelegate, ReadonlyJSONObject } from '@phosphor/coreutils';\n\nimport { IDisposable } from '@phosphor/disposable';\n\nimport { ISignal, Signal } from '@phosphor/signaling';\n\nimport { showDialog, Dialog } from '@jupyterlab/apputils';\n\n/**\n * The default duration of the auto-refresh in ms\n */\nconst DEFAULT_REFRESH_INTERVAL = 10000;\n\n/**\n * The enforced time between refreshes in ms.\n */\nconst MIN_REFRESH = 1000;\n\n/**\n * The maximum upload size (in bytes) for notebook version < 5.1.0\n */\nexport const LARGE_FILE_SIZE = 15 * 1024 * 1024;\n\n/**\n * The size (in bytes) of the biggest chunk we should upload at once.\n */\nexport const CHUNK_SIZE = 1024 * 1024;\n\n/**\n * An upload progress event for a file at `path`.\n */\nexport interface IUploadModel {\n path: string;\n /**\n * % uploaded [0, 1)\n */\n progress: number;\n}\n\n/**\n * An implementation of a file browser model.\n *\n * #### Notes\n * All paths parameters without a leading `'/'` are interpreted as relative to\n * the current directory. Supports `'../'` syntax.\n */\nexport class FileBrowserModel implements IDisposable {\n /**\n * Construct a new file browser model.\n */\n constructor(options: FileBrowserModel.IOptions) {\n this.manager = options.manager;\n this._driveName = options.driveName || '';\n let rootPath = this._driveName ? this._driveName + ':' : '';\n this._model = {\n path: rootPath,\n name: PathExt.basename(rootPath),\n type: 'directory',\n content: undefined,\n writable: false,\n created: 'unknown',\n last_modified: 'unknown',\n mimetype: 'text/plain',\n format: 'text'\n };\n this._state = options.state || null;\n this._baseRefreshDuration =\n options.refreshInterval || DEFAULT_REFRESH_INTERVAL;\n\n const { services } = options.manager;\n services.contents.fileChanged.connect(this._onFileChanged, this);\n services.sessions.runningChanged.connect(this._onRunningChanged, this);\n\n this._unloadEventListener = (e: Event) => {\n if (this._uploads.length > 0) {\n const confirmationMessage = 'Files still uploading';\n\n (e as any).returnValue = confirmationMessage;\n return confirmationMessage;\n }\n };\n window.addEventListener('beforeunload', this._unloadEventListener);\n this._scheduleUpdate();\n this._startTimer();\n }\n\n /**\n * The document manager instance used by the file browser model.\n */\n readonly manager: IDocumentManager;\n\n /**\n * A signal emitted when the file browser model loses connection.\n */\n get connectionFailure(): ISignal<this, Error> {\n return this._connectionFailure;\n }\n\n /**\n * The drive name that gets prepended to the path.\n */\n get driveName(): string {\n return this._driveName;\n }\n\n /**\n * A promise that resolves when the model is first restored.\n */\n get restored(): Promise<void> {\n return this._restored.promise;\n }\n\n /**\n * Get the file path changed signal.\n */\n get fileChanged(): ISignal<this, Contents.IChangedArgs> {\n return this._fileChanged;\n }\n\n /**\n * Get the current path.\n */\n get path(): string {\n return this._model ? this._model.path : '';\n }\n\n /**\n * A signal emitted when the path changes.\n */\n get pathChanged(): ISignal<this, IChangedArgs<string>> {\n return this._pathChanged;\n }\n\n /**\n * A signal emitted when the directory listing is refreshed.\n */\n get refreshed(): ISignal<this, void> {\n return this._refreshed;\n }\n\n /**\n * Get the kernel spec models.\n */\n get specs(): Kernel.ISpecModels | null {\n return this.manager.services.sessions.specs;\n }\n\n /**\n * Get whether the model is disposed.\n */\n get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n /**\n * A signal emitted when an upload progresses.\n */\n get uploadChanged(): ISignal<this, IChangedArgs<IUploadModel>> {\n return this._uploadChanged;\n }\n\n /**\n * Create an iterator over the status of all in progress uploads.\n */\n uploads(): IIterator<IUploadModel> {\n return new ArrayIterator(this._uploads);\n }\n\n /**\n * Dispose of the resources held by the model.\n */\n dispose(): void {\n if (this.isDisposed) {\n return;\n }\n window.removeEventListener('beforeunload', this._unloadEventListener);\n this._isDisposed = true;\n clearTimeout(this._timeoutId);\n this._sessions.length = 0;\n this._items.length = 0;\n Signal.clearData(this);\n }\n\n /**\n * Create an iterator over the model's items.\n *\n * @returns A new iterator over the model's items.\n */\n items(): IIterator<Contents.IModel> {\n return new ArrayIterator(this._items);\n }\n\n /**\n * Create an iterator over the active sessions in the directory.\n *\n * @returns A new iterator over the model's active sessions.\n */\n sessions(): IIterator<Session.IModel> {\n return new ArrayIterator(this._sessions);\n }\n\n /**\n * Force a refresh of the directory contents.\n */\n refresh(): Promise<void> {\n this._lastRefresh = new Date().getTime();\n this._requested = false;\n return this.cd('.');\n }\n\n /**\n * Change directory.\n *\n * @param path - The path to the file or directory.\n *\n * @returns A promise with the contents of the directory.\n */\n cd(newValue = '.'): Promise<void> {\n if (newValue !== '.') {\n newValue = Private.normalizePath(\n this.manager.services.contents,\n this._model.path,\n newValue\n );\n } else {\n newValue = this._pendingPath || this._model.path;\n }\n // Collapse requests to the same directory.\n if (newValue === this._pendingPath && this._pending) {\n return this._pending;\n }\n let oldValue = this.path;\n let options: Contents.IFetchOptions = { content: true };\n this._pendingPath = newValue;\n if (oldValue !== newValue) {\n this._sessions.length = 0;\n }\n let services = this.manager.services;\n this._pending = services.contents\n .get(newValue, options)\n .then(contents => {\n if (this.isDisposed) {\n return;\n }\n this._refreshDuration = this._baseRefreshDuration;\n this._handleContents(contents);\n this._pendingPath = null;\n if (oldValue !== newValue) {\n // If there is a state database and a unique key, save the new path.\n if (this._state && this._key) {\n this._state.save(this._key, { path: newValue });\n }\n\n this._pathChanged.emit({\n name: 'path',\n oldValue,\n newValue\n });\n }\n this._onRunningChanged(services.sessions, services.sessions.running());\n this._refreshed.emit(void 0);\n })\n .catch(error => {\n this._pendingPath = null;\n if (error.message === 'Not Found') {\n error.message = `Directory not found: \"${this._model.path}\"`;\n console.error(error);\n this._connectionFailure.emit(error);\n this.cd('/');\n } else {\n this._refreshDuration = this._baseRefreshDuration * 10;\n this._connectionFailure.emit(error);\n }\n });\n return this._pending;\n }\n\n /**\n * Download a file.\n *\n * @param path - The path of the file to be downloaded.\n *\n * @returns A promise which resolves when the file has begun\n * downloading.\n */\n download(path: string): Promise<void> {\n return this.manager.services.contents.getDownloadUrl(path).then(url => {\n let element = document.createElement('a');\n document.body.appendChild(element);\n element.setAttribute('href', url);\n element.setAttribute('download', '');\n element.click();\n document.body.removeChild(element);\n return void 0;\n });\n }\n\n /**\n * Restore the state of the file browser.\n *\n * @param id - The unique ID that is used to construct a state database key.\n *\n * @returns A promise when restoration is complete.\n *\n * #### Notes\n * This function will only restore the model *once*. If it is called multiple\n * times, all subsequent invocations are no-ops.\n */\n restore(id: string): Promise<void> {\n const state = this._state;\n const restored = !!this._key;\n if (!state || restored) {\n return Promise.resolve(void 0);\n }\n\n const manager = this.manager;\n const key = `file-browser-${id}:cwd`;\n const ready = manager.services.ready;\n return Promise.all([state.fetch(key), ready])\n .then(([cwd]) => {\n if (!cwd) {\n this._restored.resolve(void 0);\n return;\n }\n\n const path = (cwd as ReadonlyJSONObject)['path'] as string;\n const localPath = manager.services.contents.localPath(path);\n return manager.services.contents\n .get(path)\n .then(() => this.cd(localPath))\n .catch(() => state.remove(key));\n })\n .catch(() => state.remove(key))\n .then(() => {\n this._key = key;\n this._restored.resolve(void 0);\n }); // Set key after restoration is done.\n }\n\n /**\n * Upload a `File` object.\n *\n * @param file - The `File` object to upload.\n *\n * @returns A promise containing the new file contents model.\n *\n * #### Notes\n * On Notebook version < 5.1.0, this will fail to upload files that are too\n * big to be sent in one request to the server. On newer versions, it will\n * ask for confirmation then upload the file in 1 MB chunks.\n */\n async upload(file: File): Promise<Contents.IModel> {\n const supportsChunked = PageConfig.getNotebookVersion() >= [5, 1, 0];\n const largeFile = file.size > LARGE_FILE_SIZE;\n const isNotebook = file.name.indexOf('.ipynb') !== -1;\n const canSendChunked = supportsChunked && !isNotebook;\n\n if (largeFile && !canSendChunked) {\n let msg = `Cannot upload file (>${LARGE_FILE_SIZE / (1024 * 1024)} MB). ${\n file.name\n }`;\n console.warn(msg);\n throw msg;\n }\n\n const err = 'File not uploaded';\n if (largeFile && !await this._shouldUploadLarge(file)) {\n throw 'Cancelled large file upload';\n }\n await this._uploadCheckDisposed();\n await this.refresh();\n await this._uploadCheckDisposed();\n if (\n find(this._items, i => i.name === file.name) &&\n !await shouldOverwrite(file.name)\n ) {\n throw err;\n }\n await this._uploadCheckDisposed();\n const chunkedUpload = supportsChunked && file.size > CHUNK_SIZE;\n return await this._upload(file, isNotebook, chunkedUpload);\n }\n\n private async _shouldUploadLarge(file: File): Promise<boolean> {\n const { button } = await showDialog({\n title: 'Large file size warning',\n body: `The file size is ${Math.round(\n file.size / (1024 * 1024)\n )} MB. Do you still want to upload it?`,\n buttons: [Dialog.cancelButton(), Dialog.warnButton({ label: 'UPLOAD' })]\n });\n return button.accept;\n }\n\n /**\n * Perform the actual upload.\n */\n private async _upload(\n file: File,\n isNotebook: boolean,\n chunked: boolean\n ): Promise<Contents.IModel> {\n // Gather the file model parameters.\n let path = this._model.path;\n path = path ? path + '/' + file.name : file.name;\n let name = file.name;\n let type: Contents.ContentType = isNotebook ? 'notebook' : 'file';\n let format: Contents.FileFormat = isNotebook ? 'json' : 'base64';\n\n const uploadInner = async (\n blob: Blob,\n chunk?: number\n ): Promise<Contents.IModel> => {\n await this._uploadCheckDisposed();\n let reader = new FileReader();\n if (isNotebook) {\n reader.readAsText(blob);\n } else {\n reader.readAsArrayBuffer(blob);\n }\n await new Promise((resolve, reject) => {\n reader.onload = resolve;\n reader.onerror = event =>\n reject(`Failed to upload \"${file.name}\":` + event);\n });\n await this._uploadCheckDisposed();\n\n let model: Partial<Contents.IModel> = {\n type,\n format,\n name,\n chunk,\n content: Private.getContent(reader)\n };\n return await this.manager.services.contents.save(path, model);\n };\n\n if (!chunked) {\n try {\n return await uploadInner(file);\n } catch (err) {\n ArrayExt.removeFirstWhere(this._uploads, uploadIndex => {\n return file.name === uploadIndex.path;\n });\n throw err;\n }\n }\n\n let finalModel: Contents.IModel;\n\n let upload = { path, progress: 0 };\n this._uploadChanged.emit({\n name: 'start',\n newValue: upload,\n oldValue: null\n });\n\n for (let start = 0; !finalModel; start += CHUNK_SIZE) {\n const end = start + CHUNK_SIZE;\n const lastChunk = end >= file.size;\n const chunk = lastChunk ? -1 : end / CHUNK_SIZE;\n\n const newUpload = { path, progress: start / file.size };\n this._uploads.splice(this._uploads.indexOf(upload));\n this._uploads.push(newUpload);\n this._uploadChanged.emit({\n name: 'update',\n newValue: newUpload,\n oldValue: upload\n });\n upload = newUpload;\n\n let currentModel: Contents.IModel;\n try {\n currentModel = await uploadInner(file.slice(start, end), chunk);\n } catch (err) {\n ArrayExt.removeFirstWhere(this._uploads, uploadIndex => {\n return file.name === uploadIndex.path;\n });\n\n this._uploadChanged.emit({\n name: 'failure',\n newValue: upload,\n oldValue: null\n });\n\n throw err;\n }\n\n if (lastChunk) {\n finalModel = currentModel;\n }\n }\n\n this._uploads.splice(this._uploads.indexOf(upload));\n this._uploadChanged.emit({\n name: 'finish',\n newValue: null,\n oldValue: upload\n });\n\n return finalModel;\n }\n\n private _uploadCheckDisposed(): Promise<void> {\n if (this.isDisposed) {\n return Promise.reject('Filemanager disposed. File upload canceled');\n }\n return Promise.resolve();\n }\n\n /**\n * Handle an updated contents model.\n */\n private _handleContents(contents: Contents.IModel): void {\n // Update our internal data.\n this._model = {\n name: contents.name,\n path: contents.path,\n type: contents.type,\n content: undefined,\n writable: contents.writable,\n created: contents.created,\n last_modified: contents.last_modified,\n mimetype: contents.mimetype,\n format: contents.format\n };\n this._items = contents.content;\n this._paths.clear();\n contents.content.forEach((model: Contents.IModel) => {\n this._paths.add(model.path);\n });\n }\n\n /**\n * Handle a change to the running sessions.\n */\n private _onRunningChanged(\n sender: Session.IManager,\n models: IterableOrArrayLike<Session.IModel>\n ): void {\n this._populateSessions(models);\n this._refreshed.emit(void 0);\n }\n\n /**\n * Handle a change on the contents manager.\n */\n private _onFileChanged(\n sender: Contents.IManager,\n change: Contents.IChangedArgs\n ): void {\n let path = this._model.path;\n let { sessions } = this.manager.services;\n let { oldValue, newValue } = change;\n let value =\n oldValue && oldValue.path && PathExt.dirname(oldValue.path) === path\n ? oldValue\n : newValue && newValue.path && PathExt.dirname(newValue.path) === path\n ? newValue\n : undefined;\n\n // If either the old value or the new value is in the current path, update.\n if (value) {\n this._scheduleUpdate();\n this._populateSessions(sessions.running());\n this._fileChanged.emit(change);\n return;\n }\n }\n\n /**\n * Populate the model's sessions collection.\n */\n private _populateSessions(models: IterableOrArrayLike<Session.IModel>): void {\n this._sessions.length = 0;\n each(models, model => {\n if (this._paths.has(model.path)) {\n this._sessions.push(model);\n }\n });\n }\n\n /**\n * Start the internal refresh timer.\n */\n private _startTimer(): void {\n this._timeoutId = window.setInterval(() => {\n if (this._requested) {\n this.refresh();\n return;\n }\n if (document.hidden) {\n // Don't poll when nobody's looking.\n return;\n }\n let date = new Date().getTime();\n if (date - this._lastRefresh > this._refreshDuration) {\n this.refresh();\n }\n }, MIN_REFRESH);\n }\n\n /**\n * Handle internal model refresh logic.\n */\n private _scheduleUpdate(): void {\n let date = new Date().getTime();\n if (date - this._lastRefresh > MIN_REFRESH) {\n this.refresh();\n } else {\n this._requested = true;\n }\n }\n\n private _connectionFailure = new Signal<this, Error>(this);\n private _fileChanged = new Signal<this, Contents.IChangedArgs>(this);\n private _items: Contents.IModel[] = [];\n private _key: string = '';\n private _model: Contents.IModel;\n private _pathChanged = new Signal<this, IChangedArgs<string>>(this);\n private _paths = new Set<string>();\n private _pending: Promise<void> | null = null;\n private _pendingPath: string | null = null;\n private _refreshed = new Signal<this, void>(this);\n private _lastRefresh = -1;\n private _requested = false;\n private _sessions: Session.IModel[] = [];\n private _state: IStateDB | null = null;\n private _timeoutId = -1;\n private _refreshDuration: number;\n private _baseRefreshDuration: number;\n private _driveName: string;\n private _isDisposed = false;\n private _restored = new PromiseDelegate<void>();\n private _uploads: IUploadModel[] = [];\n private _uploadChanged = new Signal<this, IChangedArgs<IUploadModel>>(this);\n private _unloadEventListener: (e: Event) => string;\n}\n\n/**\n * The namespace for the `FileBrowserModel` class statics.\n */\nexport namespace FileBrowserModel {\n /**\n * An options object for initializing a file browser.\n */\n export interface IOptions {\n /**\n * A document manager instance.\n */\n manager: IDocumentManager;\n\n /**\n * An optional `Contents.IDrive` name for the model.\n * If given, the model will prepend `driveName:` to\n * all paths used in file operations.\n */\n driveName?: string;\n\n /**\n * An optional state database. If provided, the model will restore which\n * folder was last opened when it is restored.\n */\n state?: IStateDB;\n\n /**\n * The time interval for browser refreshing, in ms.\n */\n refreshInterval?: number;\n }\n}\n\n/**\n * The namespace for the file browser model private data.\n */\nnamespace Private {\n /**\n * Parse the content of a `FileReader`.\n *\n * If the result is an `ArrayBuffer`, return a Base64-encoded string.\n * Otherwise, return the JSON parsed result.\n */\n export function getContent(reader: FileReader): any {\n if (reader.result instanceof ArrayBuffer) {\n // Base64-encode binary file data.\n let bytes = '';\n let buf = new Uint8Array(reader.result);\n let nbytes = buf.byteLength;\n for (let i = 0; i < nbytes; i++) {\n bytes += String.fromCharCode(buf[i]);\n }\n return btoa(bytes);\n } else {\n return JSON.parse(reader.result);\n }\n }\n\n /**\n * Normalize a path based on a root directory, accounting for relative paths.\n */\n export function normalizePath(\n contents: Contents.IManager,\n root: string,\n path: string\n ): string {\n const driveName = contents.driveName(root);\n const localPath = contents.localPath(root);\n const resolved = PathExt.resolve(localPath, path);\n return driveName ? `${driveName}:${resolved}` : resolved;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../filebrowser/src/model.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n\nimport {\n IChangedArgs,\n IStateDB,\n PathExt,\n PageConfig\n} from '@jupyterlab/coreutils';\n\nimport { IDocumentManager, shouldOverwrite } from '@jupyterlab/docmanager';\n\nimport { Contents, Kernel, Session } from '@jupyterlab/services';\n\nimport {\n ArrayIterator,\n each,\n find,\n IIterator,\n IterableOrArrayLike,\n ArrayExt\n} from '@phosphor/algorithm';\n\nimport { PromiseDelegate, ReadonlyJSONObject } from '@phosphor/coreutils';\n\nimport { IDisposable } from '@phosphor/disposable';\n\nimport { ISignal, Signal } from '@phosphor/signaling';\n\nimport { showDialog, Dialog } from '@jupyterlab/apputils';\n\n/**\n * The default duration of the auto-refresh in ms\n */\nconst DEFAULT_REFRESH_INTERVAL = 10000;\n\n/**\n * The enforced time between refreshes in ms.\n */\nconst MIN_REFRESH = 1000;\n\n/**\n * The maximum upload size (in bytes) for notebook version < 5.1.0\n */\nexport const LARGE_FILE_SIZE = 15 * 1024 * 1024;\n\n/**\n * The size (in bytes) of the biggest chunk we should upload at once.\n */\nexport const CHUNK_SIZE = 1024 * 1024;\n\n/**\n * An upload progress event for a file at `path`.\n */\nexport interface IUploadModel {\n path: string;\n /**\n * % uploaded [0, 1)\n */\n progress: number;\n}\n\n/**\n * An implementation of a file browser model.\n *\n * #### Notes\n * All paths parameters without a leading `'/'` are interpreted as relative to\n * the current directory. Supports `'../'` syntax.\n */\nexport class FileBrowserModel implements IDisposable {\n /**\n * Construct a new file browser model.\n */\n constructor(options: FileBrowserModel.IOptions) {\n this.manager = options.manager;\n this._driveName = options.driveName || '';\n let rootPath = this._driveName ? this._driveName + ':' : '';\n this._model = {\n path: rootPath,\n name: PathExt.basename(rootPath),\n type: 'directory',\n content: undefined,\n writable: false,\n created: 'unknown',\n last_modified: 'unknown',\n mimetype: 'text/plain',\n format: 'text'\n };\n this._state = options.state || null;\n this._baseRefreshDuration =\n options.refreshInterval || DEFAULT_REFRESH_INTERVAL;\n\n const { services } = options.manager;\n services.contents.fileChanged.connect(this._onFileChanged, this);\n services.sessions.runningChanged.connect(this._onRunningChanged, this);\n\n this._unloadEventListener = (e: Event) => {\n if (this._uploads.length > 0) {\n const confirmationMessage = 'Files still uploading';\n\n (e as any).returnValue = confirmationMessage;\n return confirmationMessage;\n }\n };\n window.addEventListener('beforeunload', this._unloadEventListener);\n this._scheduleUpdate();\n this._startTimer();\n }\n\n /**\n * The document manager instance used by the file browser model.\n */\n readonly manager: IDocumentManager;\n\n /**\n * A signal emitted when the file browser model loses connection.\n */\n get connectionFailure(): ISignal<this, Error> {\n return this._connectionFailure;\n }\n\n /**\n * The drive name that gets prepended to the path.\n */\n get driveName(): string {\n return this._driveName;\n }\n\n /**\n * A promise that resolves when the model is first restored.\n */\n get restored(): Promise<void> {\n return this._restored.promise;\n }\n\n /**\n * Get the file path changed signal.\n */\n get fileChanged(): ISignal<this, Contents.IChangedArgs> {\n return this._fileChanged;\n }\n\n /**\n * Get the current path.\n */\n get path(): string {\n return this._model ? this._model.path : '';\n }\n\n /**\n * A signal emitted when the path changes.\n */\n get pathChanged(): ISignal<this, IChangedArgs<string>> {\n return this._pathChanged;\n }\n\n /**\n * A signal emitted when the directory listing is refreshed.\n */\n get refreshed(): ISignal<this, void> {\n return this._refreshed;\n }\n\n /**\n * Get the kernel spec models.\n */\n get specs(): Kernel.ISpecModels | null {\n return this.manager.services.sessions.specs;\n }\n\n /**\n * Get whether the model is disposed.\n */\n get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n /**\n * A signal emitted when an upload progresses.\n */\n get uploadChanged(): ISignal<this, IChangedArgs<IUploadModel>> {\n return this._uploadChanged;\n }\n\n /**\n * Create an iterator over the status of all in progress uploads.\n */\n uploads(): IIterator<IUploadModel> {\n return new ArrayIterator(this._uploads);\n }\n\n /**\n * Dispose of the resources held by the model.\n */\n dispose(): void {\n if (this.isDisposed) {\n return;\n }\n window.removeEventListener('beforeunload', this._unloadEventListener);\n this._isDisposed = true;\n clearTimeout(this._timeoutId);\n this._sessions.length = 0;\n this._items.length = 0;\n Signal.clearData(this);\n }\n\n /**\n * Create an iterator over the model's items.\n *\n * @returns A new iterator over the model's items.\n */\n items(): IIterator<Contents.IModel> {\n return new ArrayIterator(this._items);\n }\n\n /**\n * Create an iterator over the active sessions in the directory.\n *\n * @returns A new iterator over the model's active sessions.\n */\n sessions(): IIterator<Session.IModel> {\n return new ArrayIterator(this._sessions);\n }\n\n /**\n * Force a refresh of the directory contents.\n */\n refresh(): Promise<void> {\n this._lastRefresh = new Date().getTime();\n this._requested = false;\n return this.cd('.');\n }\n\n /**\n * Change directory.\n *\n * @param path - The path to the file or directory.\n *\n * @returns A promise with the contents of the directory.\n */\n async cd(newValue = '.'): Promise<void> {\n if (newValue !== '.') {\n newValue = Private.normalizePath(\n this.manager.services.contents,\n this._model.path,\n newValue\n );\n } else {\n newValue = this._pendingPath || this._model.path;\n }\n if (this._pending) {\n // Collapse requests to the same directory.\n if (newValue === this._pendingPath) {\n return this._pending;\n }\n // Otherwise wait for the pending request to complete before continuing.\n await this._pending;\n }\n let oldValue = this.path;\n let options: Contents.IFetchOptions = { content: true };\n this._pendingPath = newValue;\n if (oldValue !== newValue) {\n this._sessions.length = 0;\n }\n let services = this.manager.services;\n this._pending = services.contents\n .get(newValue, options)\n .then(contents => {\n if (this.isDisposed) {\n return;\n }\n this._refreshDuration = this._baseRefreshDuration;\n this._handleContents(contents);\n this._pendingPath = null;\n if (oldValue !== newValue) {\n // If there is a state database and a unique key, save the new path.\n if (this._state && this._key) {\n this._state.save(this._key, { path: newValue });\n }\n\n this._pathChanged.emit({\n name: 'path',\n oldValue,\n newValue\n });\n }\n this._onRunningChanged(services.sessions, services.sessions.running());\n this._refreshed.emit(void 0);\n })\n .catch(error => {\n this._pendingPath = null;\n if (error.message === 'Not Found') {\n error.message = `Directory not found: \"${this._model.path}\"`;\n console.error(error);\n this._connectionFailure.emit(error);\n return this.cd('/');\n } else {\n this._refreshDuration = this._baseRefreshDuration * 10;\n this._connectionFailure.emit(error);\n }\n });\n return this._pending;\n }\n\n /**\n * Download a file.\n *\n * @param path - The path of the file to be downloaded.\n *\n * @returns A promise which resolves when the file has begun\n * downloading.\n */\n download(path: string): Promise<void> {\n return this.manager.services.contents.getDownloadUrl(path).then(url => {\n let element = document.createElement('a');\n document.body.appendChild(element);\n element.setAttribute('href', url);\n element.setAttribute('download', '');\n element.click();\n document.body.removeChild(element);\n return void 0;\n });\n }\n\n /**\n * Restore the state of the file browser.\n *\n * @param id - The unique ID that is used to construct a state database key.\n *\n * @returns A promise when restoration is complete.\n *\n * #### Notes\n * This function will only restore the model *once*. If it is called multiple\n * times, all subsequent invocations are no-ops.\n */\n restore(id: string): Promise<void> {\n const state = this._state;\n const restored = !!this._key;\n if (!state || restored) {\n return Promise.resolve(void 0);\n }\n\n const manager = this.manager;\n const key = `file-browser-${id}:cwd`;\n const ready = manager.services.ready;\n return Promise.all([state.fetch(key), ready])\n .then(([cwd]) => {\n if (!cwd) {\n this._restored.resolve(void 0);\n return;\n }\n\n const path = (cwd as ReadonlyJSONObject)['path'] as string;\n const localPath = manager.services.contents.localPath(path);\n return manager.services.contents\n .get(path)\n .then(() => this.cd(localPath))\n .catch(() => state.remove(key));\n })\n .catch(() => state.remove(key))\n .then(() => {\n this._key = key;\n this._restored.resolve(void 0);\n }); // Set key after restoration is done.\n }\n\n /**\n * Upload a `File` object.\n *\n * @param file - The `File` object to upload.\n *\n * @returns A promise containing the new file contents model.\n *\n * #### Notes\n * On Notebook version < 5.1.0, this will fail to upload files that are too\n * big to be sent in one request to the server. On newer versions, it will\n * ask for confirmation then upload the file in 1 MB chunks.\n */\n async upload(file: File): Promise<Contents.IModel> {\n const supportsChunked = PageConfig.getNotebookVersion() >= [5, 1, 0];\n const largeFile = file.size > LARGE_FILE_SIZE;\n\n if (largeFile && !supportsChunked) {\n let msg = `Cannot upload file (>${LARGE_FILE_SIZE / (1024 * 1024)} MB). ${\n file.name\n }`;\n console.warn(msg);\n throw msg;\n }\n\n const err = 'File not uploaded';\n if (largeFile && !await this._shouldUploadLarge(file)) {\n throw 'Cancelled large file upload';\n }\n await this._uploadCheckDisposed();\n await this.refresh();\n await this._uploadCheckDisposed();\n if (\n find(this._items, i => i.name === file.name) &&\n !await shouldOverwrite(file.name)\n ) {\n throw err;\n }\n await this._uploadCheckDisposed();\n const chunkedUpload = supportsChunked && file.size > CHUNK_SIZE;\n return await this._upload(file, chunkedUpload);\n }\n\n private async _shouldUploadLarge(file: File): Promise<boolean> {\n const { button } = await showDialog({\n title: 'Large file size warning',\n body: `The file size is ${Math.round(\n file.size / (1024 * 1024)\n )} MB. Do you still want to upload it?`,\n buttons: [Dialog.cancelButton(), Dialog.warnButton({ label: 'UPLOAD' })]\n });\n return button.accept;\n }\n\n /**\n * Perform the actual upload.\n */\n private async _upload(\n file: File,\n chunked: boolean\n ): Promise<Contents.IModel> {\n // Gather the file model parameters.\n let path = this._model.path;\n path = path ? path + '/' + file.name : file.name;\n let name = file.name;\n let type: Contents.ContentType = 'file';\n let format: Contents.FileFormat = 'base64';\n\n const uploadInner = async (\n blob: Blob,\n chunk?: number\n ): Promise<Contents.IModel> => {\n await this._uploadCheckDisposed();\n let reader = new FileReader();\n reader.readAsDataURL(blob);\n await new Promise((resolve, reject) => {\n reader.onload = resolve;\n reader.onerror = event =>\n reject(`Failed to upload \"${file.name}\":` + event);\n });\n await this._uploadCheckDisposed();\n\n // remove header https://stackoverflow.com/a/24289420/907060\n const content = (reader.result as string).split(',')[1];\n\n let model: Partial<Contents.IModel> = {\n type,\n format,\n name,\n chunk,\n content\n };\n return await this.manager.services.contents.save(path, model);\n };\n\n if (!chunked) {\n try {\n return await uploadInner(file);\n } catch (err) {\n ArrayExt.removeFirstWhere(this._uploads, uploadIndex => {\n return file.name === uploadIndex.path;\n });\n throw err;\n }\n }\n\n let finalModel: Contents.IModel;\n\n let upload = { path, progress: 0 };\n this._uploadChanged.emit({\n name: 'start',\n newValue: upload,\n oldValue: null\n });\n\n for (let start = 0; !finalModel; start += CHUNK_SIZE) {\n const end = start + CHUNK_SIZE;\n const lastChunk = end >= file.size;\n const chunk = lastChunk ? -1 : end / CHUNK_SIZE;\n\n const newUpload = { path, progress: start / file.size };\n this._uploads.splice(this._uploads.indexOf(upload));\n this._uploads.push(newUpload);\n this._uploadChanged.emit({\n name: 'update',\n newValue: newUpload,\n oldValue: upload\n });\n upload = newUpload;\n\n let currentModel: Contents.IModel;\n try {\n currentModel = await uploadInner(file.slice(start, end), chunk);\n } catch (err) {\n ArrayExt.removeFirstWhere(this._uploads, uploadIndex => {\n return file.name === uploadIndex.path;\n });\n\n this._uploadChanged.emit({\n name: 'failure',\n newValue: upload,\n oldValue: null\n });\n\n throw err;\n }\n\n if (lastChunk) {\n finalModel = currentModel;\n }\n }\n\n this._uploads.splice(this._uploads.indexOf(upload));\n this._uploadChanged.emit({\n name: 'finish',\n newValue: null,\n oldValue: upload\n });\n\n return finalModel;\n }\n\n private _uploadCheckDisposed(): Promise<void> {\n if (this.isDisposed) {\n return Promise.reject('Filemanager disposed. File upload canceled');\n }\n return Promise.resolve();\n }\n\n /**\n * Handle an updated contents model.\n */\n private _handleContents(contents: Contents.IModel): void {\n // Update our internal data.\n this._model = {\n name: contents.name,\n path: contents.path,\n type: contents.type,\n content: undefined,\n writable: contents.writable,\n created: contents.created,\n last_modified: contents.last_modified,\n mimetype: contents.mimetype,\n format: contents.format\n };\n this._items = contents.content;\n this._paths.clear();\n contents.content.forEach((model: Contents.IModel) => {\n this._paths.add(model.path);\n });\n }\n\n /**\n * Handle a change to the running sessions.\n */\n private _onRunningChanged(\n sender: Session.IManager,\n models: IterableOrArrayLike<Session.IModel>\n ): void {\n this._populateSessions(models);\n this._refreshed.emit(void 0);\n }\n\n /**\n * Handle a change on the contents manager.\n */\n private _onFileChanged(\n sender: Contents.IManager,\n change: Contents.IChangedArgs\n ): void {\n let path = this._model.path;\n let { sessions } = this.manager.services;\n let { oldValue, newValue } = change;\n let value =\n oldValue && oldValue.path && PathExt.dirname(oldValue.path) === path\n ? oldValue\n : newValue && newValue.path && PathExt.dirname(newValue.path) === path\n ? newValue\n : undefined;\n\n // If either the old value or the new value is in the current path, update.\n if (value) {\n this._scheduleUpdate();\n this._populateSessions(sessions.running());\n this._fileChanged.emit(change);\n return;\n }\n }\n\n /**\n * Populate the model's sessions collection.\n */\n private _populateSessions(models: IterableOrArrayLike<Session.IModel>): void {\n this._sessions.length = 0;\n each(models, model => {\n if (this._paths.has(model.path)) {\n this._sessions.push(model);\n }\n });\n }\n\n /**\n * Start the internal refresh timer.\n */\n private _startTimer(): void {\n this._timeoutId = window.setInterval(() => {\n if (this._requested) {\n this.refresh();\n return;\n }\n if (document.hidden) {\n // Don't poll when nobody's looking.\n return;\n }\n let date = new Date().getTime();\n if (date - this._lastRefresh > this._refreshDuration) {\n this.refresh();\n }\n }, MIN_REFRESH);\n }\n\n /**\n * Handle internal model refresh logic.\n */\n private _scheduleUpdate(): void {\n let date = new Date().getTime();\n if (date - this._lastRefresh > MIN_REFRESH) {\n this.refresh();\n } else {\n this._requested = true;\n }\n }\n\n private _connectionFailure = new Signal<this, Error>(this);\n private _fileChanged = new Signal<this, Contents.IChangedArgs>(this);\n private _items: Contents.IModel[] = [];\n private _key: string = '';\n private _model: Contents.IModel;\n private _pathChanged = new Signal<this, IChangedArgs<string>>(this);\n private _paths = new Set<string>();\n private _pending: Promise<void> | null = null;\n private _pendingPath: string | null = null;\n private _refreshed = new Signal<this, void>(this);\n private _lastRefresh = -1;\n private _requested = false;\n private _sessions: Session.IModel[] = [];\n private _state: IStateDB | null = null;\n private _timeoutId = -1;\n private _refreshDuration: number;\n private _baseRefreshDuration: number;\n private _driveName: string;\n private _isDisposed = false;\n private _restored = new PromiseDelegate<void>();\n private _uploads: IUploadModel[] = [];\n private _uploadChanged = new Signal<this, IChangedArgs<IUploadModel>>(this);\n private _unloadEventListener: (e: Event) => string;\n}\n\n/**\n * The namespace for the `FileBrowserModel` class statics.\n */\nexport namespace FileBrowserModel {\n /**\n * An options object for initializing a file browser.\n */\n export interface IOptions {\n /**\n * A document manager instance.\n */\n manager: IDocumentManager;\n\n /**\n * An optional `Contents.IDrive` name for the model.\n * If given, the model will prepend `driveName:` to\n * all paths used in file operations.\n */\n driveName?: string;\n\n /**\n * An optional state database. If provided, the model will restore which\n * folder was last opened when it is restored.\n */\n state?: IStateDB;\n\n /**\n * The time interval for browser refreshing, in ms.\n */\n refreshInterval?: number;\n }\n}\n\n/**\n * The namespace for the file browser model private data.\n */\nnamespace Private {\n /**\n * Normalize a path based on a root directory, accounting for relative paths.\n */\n export function normalizePath(\n contents: Contents.IManager,\n root: string,\n path: string\n ): string {\n const driveName = contents.driveName(root);\n const localPath = contents.localPath(root);\n const resolved = PathExt.resolve(localPath, path);\n return driveName ? `${driveName}:${resolved}` : resolved;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupyterlab/filebrowser",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.6",
|
|
4
4
|
"description": "JupyterLab - FileBrowser Widget",
|
|
5
5
|
"homepage": "https://github.com/jupyterlab/jupyterlab",
|
|
6
6
|
"bugs": {
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"watch": "tsc -w --listEmittedFiles"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@jupyterlab/apputils": "^0.18.
|
|
34
|
-
"@jupyterlab/coreutils": "^2.1.
|
|
35
|
-
"@jupyterlab/docmanager": "^0.18.
|
|
36
|
-
"@jupyterlab/docregistry": "^0.18.
|
|
37
|
-
"@jupyterlab/services": "^3.1.
|
|
33
|
+
"@jupyterlab/apputils": "^0.18.4",
|
|
34
|
+
"@jupyterlab/coreutils": "^2.1.4",
|
|
35
|
+
"@jupyterlab/docmanager": "^0.18.4",
|
|
36
|
+
"@jupyterlab/docregistry": "^0.18.4",
|
|
37
|
+
"@jupyterlab/services": "^3.1.4",
|
|
38
38
|
"@phosphor/algorithm": "^1.1.2",
|
|
39
39
|
"@phosphor/commands": "^1.5.0",
|
|
40
40
|
"@phosphor/coreutils": "^1.3.0",
|