-
-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
index.ts
123 lines (114 loc) · 4.13 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
/**
* @packageDocumentation
* @module completer-extension
*/
import {
JupyterFrontEnd,
JupyterFrontEndPlugin
} from '@jupyterlab/application';
import {
CompletionProviderManager,
ContextCompleterProvider,
ICompletionProviderManager,
KernelCompleterProvider
} from '@jupyterlab/completer';
import { ISettingRegistry } from '@jupyterlab/settingregistry';
import {
IFormRenderer,
IFormRendererRegistry
} from '@jupyterlab/ui-components';
import type { FieldProps } from '@rjsf/utils';
import { renderAvailableProviders } from './renderer';
const COMPLETION_MANAGER_PLUGIN = '@jupyterlab/completer-extension:manager';
const defaultProvider: JupyterFrontEndPlugin<void> = {
id: '@jupyterlab/completer-extension:base-service',
requires: [ICompletionProviderManager],
autoStart: true,
activate: (
app: JupyterFrontEnd,
completionManager: ICompletionProviderManager
): void => {
completionManager.registerProvider(new ContextCompleterProvider());
completionManager.registerProvider(new KernelCompleterProvider());
}
};
const manager: JupyterFrontEndPlugin<ICompletionProviderManager> = {
id: COMPLETION_MANAGER_PLUGIN,
requires: [ISettingRegistry],
optional: [IFormRendererRegistry],
provides: ICompletionProviderManager,
autoStart: true,
activate: (
app: JupyterFrontEnd,
settings: ISettingRegistry,
editorRegistry: IFormRendererRegistry | null
): ICompletionProviderManager => {
const AVAILABLE_PROVIDERS = 'availableProviders';
const PROVIDER_TIMEOUT = 'providerTimeout';
const SHOW_DOCUMENT_PANEL = 'showDocumentationPanel';
const CONTINUOUS_HINTING = 'autoCompletion';
const manager = new CompletionProviderManager();
const updateSetting = (
settingValues: ISettingRegistry.ISettings,
availableProviders: string[]
): void => {
const providersData = settingValues.get(AVAILABLE_PROVIDERS);
const timeout = settingValues.get(PROVIDER_TIMEOUT);
const showDoc = settingValues.get(SHOW_DOCUMENT_PANEL);
const continuousHinting = settingValues.get(CONTINUOUS_HINTING);
manager.setTimeout(timeout.composite as number);
manager.setShowDocumentationPanel(showDoc.composite as boolean);
manager.setContinuousHinting(continuousHinting.composite as boolean);
const selectedProviders = providersData.user ?? providersData.composite;
const sortedProviders = Object.entries(selectedProviders ?? {})
.filter(val => val[1] >= 0 && availableProviders.includes(val[0]))
.sort(([, rank1], [, rank2]) => rank2 - rank1)
.map(item => item[0]);
manager.activateProvider(sortedProviders);
};
app.restored
.then(() => {
const availableProviders = [...manager.getProviders().keys()];
settings.transform(COMPLETION_MANAGER_PLUGIN, {
fetch: plugin => {
const schema = plugin.schema.properties!;
const defaultValue: { [key: string]: number } = {};
availableProviders.forEach((item, index) => {
defaultValue[item] = (index + 1) * 100;
});
schema[AVAILABLE_PROVIDERS]['default'] = defaultValue;
return plugin;
}
});
const settingsPromise = settings.load(COMPLETION_MANAGER_PLUGIN);
settingsPromise
.then(settingValues => {
updateSetting(settingValues, availableProviders);
settingValues.changed.connect(newSettings => {
updateSetting(newSettings, availableProviders);
});
})
.catch(console.error);
})
.catch(console.error);
if (editorRegistry) {
const renderer: IFormRenderer = {
fieldRenderer: (props: FieldProps) => {
return renderAvailableProviders(props);
}
};
editorRegistry.addRenderer(
`${COMPLETION_MANAGER_PLUGIN}.availableProviders`,
renderer
);
}
return manager;
}
};
/**
* Export the plugins as default.
*/
const plugins: JupyterFrontEndPlugin<any>[] = [manager, defaultProvider];
export default plugins;