UNPKG

@fails-components/jupyter-filesystem-extension

Version:

A collection of extensions, that redirect's filesystems access to fails and let fails puppeteer Jupyter lite.

115 lines (101 loc) 3.86 kB
import { PageConfig, URLExt } from '@jupyterlab/coreutils'; import { Setting, SettingManager } from '@jupyterlab/services'; import { ISettingRegistry } from '@jupyterlab/settingregistry'; import * as json5 from 'json5'; // portions used from Jupyterlab: /* ----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ // This code contains portions from or is inspired by Jupyter lab and lite export type SettingsFile = 'all.json' | 'all_federated.json'; export class FailsSettings extends SettingManager implements Setting.IManager { // the following is copied from the original Jupyter Lite Settings Object static _overrides: Record< string, ISettingRegistry.IPlugin['schema']['default'] > = JSON.parse(PageConfig.getOption('settingsOverrides') || '{}'); static override(plugin: ISettingRegistry.IPlugin): ISettingRegistry.IPlugin { if (FailsSettings._overrides[plugin.id]) { if (!plugin.schema.properties) { // probably malformed, or only provides keyboard shortcuts, etc. plugin.schema.properties = {}; } for (const [prop, propDefault] of Object.entries( FailsSettings._overrides[plugin.id] || {} )) { plugin.schema.properties[prop].default = propDefault; } } return plugin; } constructor(options: SettingManager.IOptions) { super({ serverSettings: options.serverSettings }); } // copied from the original settings (updated) async fetch(pluginId: string): Promise<ISettingRegistry.IPlugin> { const all = await this.list(); const settings = all.values as ISettingRegistry.IPlugin[]; const setting = settings.find((setting: ISettingRegistry.IPlugin) => { return setting.id === pluginId; }); if (!setting) { throw new Error(`Setting ${pluginId} not found`); } return setting; } // copied from the original settings (updated) async list( query?: 'ids' ): Promise<{ ids: string[]; values: ISettingRegistry.IPlugin[] }> { const allCore = await this._getAll('all.json'); let allFederated: ISettingRegistry.IPlugin[] = []; try { allFederated = await this._getAll('all_federated.json'); } catch { // handle the case where there is no federated extension } // JupyterLab 4 expects all settings to be returned in one go // so append the settings from federated plugins to the core ones const all = allCore.concat(allFederated); // return existing user settings if they exist const settings = await Promise.all( all.map(async plugin => { // const { id } = plugin; const raw = /*((await storage.getItem(id)) as string) ?? */ plugin.raw; return { ...FailsSettings.override(plugin), raw, settings: json5.parse(raw) }; }) ); // format the settings const ids = settings.map((plugin: ISettingRegistry.IPlugin) => plugin.id) ?? []; let values: ISettingRegistry.IPlugin[] = []; if (!query) { values = settings.map((plugin: ISettingRegistry.IPlugin) => { plugin.data = { composite: {}, user: {} }; return plugin; }) ?? []; } return { ids, values }; } // one to one copy from settings of the original JupyterLite private async _getAll( file: SettingsFile ): Promise<ISettingRegistry.IPlugin[]> { const settingsUrl = PageConfig.getOption('settingsUrl') ?? '/'; const all = (await ( await fetch(URLExt.join(settingsUrl, file)) ).json()) as ISettingRegistry.IPlugin[]; return all; } async save(id: string, raw: string): Promise<void> { // we do nothing } }