@jupyterlab/testutils 4.0.0-alpha.2 → 4.0.0-alpha.20

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.
@@ -1,193 +0,0 @@
1
- "use strict";
2
- // Copyright (c) Jupyter Development Team.
3
- // Distributed under the terms of the Modified BSD License.
4
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
- if (k2 === undefined) k2 = k;
6
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
7
- }) : (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- o[k2] = m[k];
10
- }));
11
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
12
- Object.defineProperty(o, "default", { enumerable: true, value: v });
13
- }) : function(o, v) {
14
- o["default"] = v;
15
- });
16
- var __importStar = (this && this.__importStar) || function (mod) {
17
- if (mod && mod.__esModule) return mod;
18
- var result = {};
19
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
20
- __setModuleDefault(result, mod);
21
- return result;
22
- };
23
- Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.NBTestUtils = void 0;
25
- const coreutils_1 = require("@lumino/coreutils");
26
- const codemirror_1 = require("@jupyterlab/codemirror");
27
- const codeeditor_1 = require("@jupyterlab/codeeditor");
28
- const apputils_1 = require("@jupyterlab/apputils");
29
- const docregistry_1 = require("@jupyterlab/docregistry");
30
- const notebook_1 = require("@jupyterlab/notebook");
31
- const cells_1 = require("@jupyterlab/cells");
32
- const rendermime_1 = require("./rendermime");
33
- const Mock = __importStar(require("./mock"));
34
- /**
35
- * The default notebook content.
36
- */
37
- // tslint:disable-next-line
38
- var NBTestUtils;
39
- (function (NBTestUtils) {
40
- /**
41
- * The default outputs used for testing.
42
- */
43
- NBTestUtils.DEFAULT_OUTPUTS = [
44
- {
45
- name: 'stdout',
46
- output_type: 'stream',
47
- text: ['hello world\n', '0\n', '1\n', '2\n']
48
- },
49
- {
50
- name: 'stderr',
51
- output_type: 'stream',
52
- text: ['output to stderr\n']
53
- },
54
- {
55
- name: 'stderr',
56
- output_type: 'stream',
57
- text: ['output to stderr2\n']
58
- },
59
- {
60
- output_type: 'execute_result',
61
- execution_count: 1,
62
- data: { 'text/plain': 'foo' },
63
- metadata: {}
64
- },
65
- {
66
- output_type: 'display_data',
67
- data: { 'text/plain': 'hello, world' },
68
- metadata: {}
69
- },
70
- {
71
- output_type: 'error',
72
- ename: 'foo',
73
- evalue: 'bar',
74
- traceback: ['fizz', 'buzz']
75
- }
76
- ];
77
- NBTestUtils.DEFAULT_CONTENT = require('../default.json');
78
- NBTestUtils.DEFAULT_CONTENT_45 = require('../default-45.json');
79
- NBTestUtils.defaultEditorConfig = Object.assign({}, notebook_1.StaticNotebook.defaultEditorConfig);
80
- NBTestUtils.editorFactory = codemirror_1.editorServices.factoryService.newInlineEditor.bind(codemirror_1.editorServices.factoryService);
81
- NBTestUtils.mimeTypeService = codemirror_1.editorServices.mimeTypeService;
82
- /**
83
- * Get a copy of the default rendermime instance.
84
- */
85
- function defaultRenderMime() {
86
- return (0, rendermime_1.defaultRenderMime)();
87
- }
88
- NBTestUtils.defaultRenderMime = defaultRenderMime;
89
- NBTestUtils.clipboard = apputils_1.Clipboard.getInstance();
90
- /**
91
- * Create a base cell content factory.
92
- */
93
- function createBaseCellFactory() {
94
- return new cells_1.Cell.ContentFactory({ editorFactory: NBTestUtils.editorFactory });
95
- }
96
- NBTestUtils.createBaseCellFactory = createBaseCellFactory;
97
- /**
98
- * Create a new code cell content factory.
99
- */
100
- function createCodeCellFactory() {
101
- return new cells_1.Cell.ContentFactory({ editorFactory: NBTestUtils.editorFactory });
102
- }
103
- NBTestUtils.createCodeCellFactory = createCodeCellFactory;
104
- /**
105
- * Create a cell editor widget.
106
- */
107
- function createCellEditor(model) {
108
- return new codeeditor_1.CodeEditorWrapper({
109
- model: model || new cells_1.CodeCellModel({}),
110
- factory: NBTestUtils.editorFactory
111
- });
112
- }
113
- NBTestUtils.createCellEditor = createCellEditor;
114
- /**
115
- * Create a default notebook content factory.
116
- */
117
- function createNotebookFactory() {
118
- return new notebook_1.Notebook.ContentFactory({ editorFactory: NBTestUtils.editorFactory });
119
- }
120
- NBTestUtils.createNotebookFactory = createNotebookFactory;
121
- /**
122
- * Create a default notebook panel content factory.
123
- */
124
- function createNotebookPanelFactory() {
125
- return new notebook_1.NotebookPanel.ContentFactory({ editorFactory: NBTestUtils.editorFactory });
126
- }
127
- NBTestUtils.createNotebookPanelFactory = createNotebookPanelFactory;
128
- /**
129
- * Create a notebook widget.
130
- */
131
- function createNotebook() {
132
- return new notebook_1.Notebook({
133
- rendermime: defaultRenderMime(),
134
- contentFactory: createNotebookFactory(),
135
- mimeTypeService: NBTestUtils.mimeTypeService
136
- });
137
- }
138
- NBTestUtils.createNotebook = createNotebook;
139
- /**
140
- * Create a notebook panel widget.
141
- */
142
- function createNotebookPanel(context) {
143
- return new notebook_1.NotebookPanel({
144
- content: createNotebook(),
145
- context
146
- });
147
- }
148
- NBTestUtils.createNotebookPanel = createNotebookPanel;
149
- /**
150
- * Populate a notebook with default content.
151
- */
152
- function populateNotebook(notebook) {
153
- const model = new notebook_1.NotebookModel();
154
- model.fromJSON(NBTestUtils.DEFAULT_CONTENT);
155
- notebook.model = model;
156
- }
157
- NBTestUtils.populateNotebook = populateNotebook;
158
- function createNotebookWidgetFactory(toolbarFactory) {
159
- return new notebook_1.NotebookWidgetFactory({
160
- name: 'notebook',
161
- fileTypes: ['notebook'],
162
- rendermime: defaultRenderMime(),
163
- toolbarFactory,
164
- contentFactory: createNotebookPanelFactory(),
165
- mimeTypeService: NBTestUtils.mimeTypeService,
166
- editorConfig: NBTestUtils.defaultEditorConfig
167
- });
168
- }
169
- NBTestUtils.createNotebookWidgetFactory = createNotebookWidgetFactory;
170
- /**
171
- * Create a context for a file.
172
- */
173
- async function createMockContext(startKernel = false) {
174
- const path = coreutils_1.UUID.uuid4() + '.txt';
175
- const manager = new Mock.ServiceManagerMock();
176
- const factory = new notebook_1.NotebookModelFactory({});
177
- const context = new docregistry_1.Context({
178
- manager,
179
- factory,
180
- path,
181
- kernelPreference: {
182
- shouldStart: startKernel,
183
- canStart: startKernel,
184
- autoStartDefault: startKernel
185
- }
186
- });
187
- await context.initialize(true);
188
- await context.sessionContext.initialize();
189
- return context;
190
- }
191
- NBTestUtils.createMockContext = createMockContext;
192
- })(NBTestUtils = exports.NBTestUtils || (exports.NBTestUtils = {}));
193
- //# sourceMappingURL=notebook-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notebook-utils.js","sourceRoot":"","sources":["../src/notebook-utils.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import { RenderMimeRegistry } from '@jupyterlab/rendermime';
2
- /**
3
- * Get a copy of the default rendermime instance.
4
- */
5
- export declare function defaultRenderMime(): RenderMimeRegistry;
package/lib/rendermime.js DELETED
@@ -1,46 +0,0 @@
1
- "use strict";
2
- // Copyright (c) Jupyter Development Team.
3
- // Distributed under the terms of the Modified BSD License.
4
- var __importDefault = (this && this.__importDefault) || function (mod) {
5
- return (mod && mod.__esModule) ? mod : { "default": mod };
6
- };
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.defaultRenderMime = void 0;
9
- const json_to_html_1 = __importDefault(require("json-to-html"));
10
- const rendermime_1 = require("@jupyterlab/rendermime");
11
- /**
12
- * Get a copy of the default rendermime instance.
13
- */
14
- function defaultRenderMime() {
15
- return Private.rendermime.clone();
16
- }
17
- exports.defaultRenderMime = defaultRenderMime;
18
- /**
19
- * A namespace for private data.
20
- */
21
- var Private;
22
- (function (Private) {
23
- class JSONRenderer extends rendermime_1.RenderedHTML {
24
- constructor() {
25
- super(...arguments);
26
- this.mimeType = 'text/html';
27
- }
28
- renderModel(model) {
29
- const source = model.data['application/json'];
30
- model.setData({ data: { 'text/html': (0, json_to_html_1.default)(source) } });
31
- return super.renderModel(model);
32
- }
33
- }
34
- const jsonRendererFactory = {
35
- mimeTypes: ['application/json'],
36
- safe: true,
37
- createRenderer(options) {
38
- return new JSONRenderer(options);
39
- }
40
- };
41
- Private.rendermime = new rendermime_1.RenderMimeRegistry({
42
- initialFactories: rendermime_1.standardRendererFactories
43
- });
44
- Private.rendermime.addFactory(jsonRendererFactory, 10);
45
- })(Private || (Private = {}));
46
- //# sourceMappingURL=rendermime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rendermime.js","sourceRoot":"","sources":["../src/rendermime.ts"],"names":[],"mappings":";AAAA,0CAA0C;AAC1C,2DAA2D;;;;;;AAE3D,gEAAqC;AAErC,uDAKgC;AAEhC;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;AACpC,CAAC;AAFD,8CAEC;AAED;;GAEG;AACH,IAAU,OAAO,CAyBhB;AAzBD,WAAU,OAAO;IACf,MAAM,YAAa,SAAQ,yBAAY;QAAvC;;YACE,aAAQ,GAAG,WAAW,CAAC;QAOzB,CAAC;QALC,WAAW,CAAC,KAA6B;YACvC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC9C,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAA,sBAAS,EAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;KACF;IAED,MAAM,mBAAmB,GAAG;QAC1B,SAAS,EAAE,CAAC,kBAAkB,CAAC;QAC/B,IAAI,EAAE,IAAI;QACV,cAAc,CACZ,OAAqC;YAErC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;IAEW,kBAAU,GAAG,IAAI,+BAAkB,CAAC;QAC/C,gBAAgB,EAAE,sCAAyB;KAC5C,CAAC,CAAC;IACH,QAAA,UAAU,CAAC,UAAU,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC,EAzBS,OAAO,KAAP,OAAO,QAyBhB"}
@@ -1,62 +0,0 @@
1
- import { JSONObject } from '@lumino/coreutils';
2
- /**
3
- * A Jupyter Server that runs as a child process.
4
- *
5
- * ### Notes
6
- * There can only be one running server at a time, since
7
- * PageConfig is global. Any classes that use `ServerConnection.ISettings`
8
- * such as `ServiceManager` should be instantiated after the server
9
- * has fully started so they pick up the right `PageConfig`.
10
- *
11
- * #### Example
12
- * ```typescript
13
- * const server = new JupyterServer();
14
- *
15
- * beforeAll(async () => {
16
- * await server.start();
17
- * });
18
- *
19
- * afterAll(async () => {
20
- * await server.shutdown();
21
- * });
22
- * ```
23
- *
24
- */
25
- export declare class JupyterServer {
26
- /**
27
- * Start the server.
28
- *
29
- * @returns A promise that resolves with the url of the server
30
- *
31
- * @throws Error if another server is still running.
32
- */
33
- start(options?: Partial<JupyterServer.IOptions>): Promise<string>;
34
- /**
35
- * Shut down the server, waiting for it to exit gracefully.
36
- */
37
- shutdown(): Promise<void>;
38
- }
39
- /**
40
- * A namespace for JupyterServer static values.
41
- */
42
- export declare namespace JupyterServer {
43
- /**
44
- * Options used to create a new JupyterServer instance.
45
- */
46
- interface IOptions {
47
- /**
48
- * Additional Page Config values.
49
- */
50
- pageConfig: {
51
- [name: string]: string;
52
- };
53
- /**
54
- * Additional traitlet config data.
55
- */
56
- configData: JSONObject;
57
- /**
58
- * Map of additional kernelspec names to kernel.json dictionaries
59
- */
60
- additionalKernelSpecs: JSONObject;
61
- }
62
- }
@@ -1,316 +0,0 @@
1
- "use strict";
2
- /* eslint-disable camelcase */
3
- // Copyright (c) Jupyter Development Team.
4
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
- if (k2 === undefined) k2 = k;
6
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
7
- }) : (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- o[k2] = m[k];
10
- }));
11
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
12
- Object.defineProperty(o, "default", { enumerable: true, value: v });
13
- }) : function(o, v) {
14
- o["default"] = v;
15
- });
16
- var __importStar = (this && this.__importStar) || function (mod) {
17
- if (mod && mod.__esModule) return mod;
18
- var result = {};
19
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
20
- __setModuleDefault(result, mod);
21
- return result;
22
- };
23
- var __importDefault = (this && this.__importDefault) || function (mod) {
24
- return (mod && mod.__esModule) ? mod : { "default": mod };
25
- };
26
- Object.defineProperty(exports, "__esModule", { value: true });
27
- exports.JupyterServer = void 0;
28
- const child_process_1 = require("child_process");
29
- const deepmerge_1 = __importDefault(require("deepmerge"));
30
- const fs = __importStar(require("fs"));
31
- const path = __importStar(require("path"));
32
- const coreutils_1 = require("@jupyterlab/coreutils");
33
- const coreutils_2 = require("@lumino/coreutils");
34
- const common_1 = require("./common");
35
- /**
36
- * A Jupyter Server that runs as a child process.
37
- *
38
- * ### Notes
39
- * There can only be one running server at a time, since
40
- * PageConfig is global. Any classes that use `ServerConnection.ISettings`
41
- * such as `ServiceManager` should be instantiated after the server
42
- * has fully started so they pick up the right `PageConfig`.
43
- *
44
- * #### Example
45
- * ```typescript
46
- * const server = new JupyterServer();
47
- *
48
- * beforeAll(async () => {
49
- * await server.start();
50
- * });
51
- *
52
- * afterAll(async () => {
53
- * await server.shutdown();
54
- * });
55
- * ```
56
- *
57
- */
58
- class JupyterServer {
59
- /**
60
- * Start the server.
61
- *
62
- * @returns A promise that resolves with the url of the server
63
- *
64
- * @throws Error if another server is still running.
65
- */
66
- async start(options = {}) {
67
- if (Private.child !== null) {
68
- throw Error('Previous server was not disposed');
69
- }
70
- const startDelegate = new coreutils_2.PromiseDelegate();
71
- const env = {
72
- JUPYTER_CONFIG_DIR: Private.handleConfig(options),
73
- JUPYTER_DATA_DIR: Private.handleData(options),
74
- JUPYTER_RUNTIME_DIR: Private.mktempDir('jupyter_runtime'),
75
- IPYTHONDIR: Private.mktempDir('ipython'),
76
- PATH: process.env.PATH
77
- };
78
- // Create the child process for the server.
79
- const child = (Private.child = (0, child_process_1.spawn)('jupyter-lab', { env }));
80
- let started = false;
81
- // Handle server output.
82
- const handleOutput = (output) => {
83
- console.debug(output);
84
- if (started) {
85
- return;
86
- }
87
- const baseUrl = Private.handleStartup(output);
88
- if (baseUrl) {
89
- console.debug('Jupyter Server started');
90
- started = true;
91
- void Private.connect(baseUrl, startDelegate);
92
- }
93
- };
94
- child.stdout.on('data', data => {
95
- handleOutput(String(data));
96
- });
97
- child.stderr.on('data', data => {
98
- handleOutput(String(data));
99
- });
100
- const url = await startDelegate.promise;
101
- return url;
102
- }
103
- /**
104
- * Shut down the server, waiting for it to exit gracefully.
105
- */
106
- async shutdown() {
107
- if (!Private.child) {
108
- return Promise.resolve(void 0);
109
- }
110
- const stopDelegate = new coreutils_2.PromiseDelegate();
111
- const child = Private.child;
112
- child.on('exit', code => {
113
- Private.child = null;
114
- if (code !== null && code !== 0) {
115
- stopDelegate.reject('child process exited with code ' + String(code));
116
- }
117
- else {
118
- stopDelegate.resolve(void 0);
119
- }
120
- });
121
- child.kill();
122
- window.setTimeout(() => {
123
- if (Private.child) {
124
- Private.child.kill(9);
125
- }
126
- }, 3000);
127
- return stopDelegate.promise;
128
- }
129
- }
130
- exports.JupyterServer = JupyterServer;
131
- /**
132
- * A namespace for module private data.
133
- */
134
- var Private;
135
- (function (Private) {
136
- Private.child = null;
137
- /**
138
- * Make a temporary directory.
139
- *
140
- * @param suffix the last portion of the dir naem.
141
- */
142
- function mktempDir(suffix) {
143
- const pathPrefix = '/tmp/jupyterServer';
144
- if (!fs.existsSync(pathPrefix)) {
145
- fs.mkdirSync(pathPrefix);
146
- }
147
- return fs.mkdtempSync(`${pathPrefix}/${suffix}`);
148
- }
149
- Private.mktempDir = mktempDir;
150
- /**
151
- * Install a spec in the data directory.
152
- */
153
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
154
- function installSpec(dataDir, name, spec) {
155
- const specDir = path.join(dataDir, 'kernels', name);
156
- fs.mkdirSync(specDir, { recursive: true });
157
- fs.writeFileSync(path.join(specDir, 'kernel.json'), JSON.stringify(spec));
158
- coreutils_1.PageConfig.setOption(`__kernelSpec_${name}`, JSON.stringify(spec));
159
- }
160
- Private.installSpec = installSpec;
161
- /**
162
- * Create and populate a notebook directory.
163
- */
164
- function createNotebookDir() {
165
- const nbDir = mktempDir('notebook');
166
- fs.mkdirSync(path.join(nbDir, 'src'));
167
- fs.writeFileSync(path.join(nbDir, 'src', 'temp.txt'), 'hello');
168
- const roFilepath = path.join(nbDir, 'src', 'readonly-temp.txt');
169
- fs.writeFileSync(roFilepath, 'hello from a ready only file', {
170
- mode: 0o444
171
- });
172
- return nbDir;
173
- }
174
- /**
175
- * Create a temporary directory for schemas.
176
- */
177
- function createAppDir() {
178
- const appDir = mktempDir('app');
179
- // Add a fake static/index.html for `ensure_app_check()`
180
- fs.mkdirSync(path.join(appDir, 'static'));
181
- fs.writeFileSync(path.join(appDir, 'static', 'index.html'), 'foo');
182
- // Add the apputils schema.
183
- const schemaDir = path.join(appDir, 'schemas');
184
- fs.mkdirSync(schemaDir, { recursive: true });
185
- const extensionDir = path.join(schemaDir, '@jupyterlab', 'apputils-extension');
186
- fs.mkdirSync(extensionDir, { recursive: true });
187
- // Get schema content.
188
- const schema = {
189
- title: 'Theme',
190
- description: 'Theme manager settings.',
191
- properties: {
192
- theme: {
193
- type: 'string',
194
- title: 'Selected Theme',
195
- default: 'JupyterLab Light'
196
- }
197
- },
198
- type: 'object'
199
- };
200
- fs.writeFileSync(path.join(extensionDir, 'themes.json'), JSON.stringify(schema));
201
- return appDir;
202
- }
203
- /**
204
- * Handle configuration.
205
- */
206
- function handleConfig(options) {
207
- // Set up configuration.
208
- const token = coreutils_2.UUID.uuid4();
209
- coreutils_1.PageConfig.setOption('token', token);
210
- coreutils_1.PageConfig.setOption('terminalsAvailable', 'true');
211
- if (options.pageConfig) {
212
- Object.keys(options.pageConfig).forEach(key => {
213
- coreutils_1.PageConfig.setOption(key, options.pageConfig[key]);
214
- });
215
- }
216
- const configDir = mktempDir('config');
217
- const configPath = path.join(configDir, 'jupyter_server_config.json');
218
- const root_dir = createNotebookDir();
219
- const app_dir = createAppDir();
220
- const user_settings_dir = mktempDir('settings');
221
- const workspaces_dir = mktempDir('workspaces');
222
- const configData = (0, deepmerge_1.default)({
223
- LabApp: {
224
- user_settings_dir,
225
- workspaces_dir,
226
- app_dir,
227
- open_browser: false,
228
- log_level: 'DEBUG'
229
- },
230
- ServerApp: {
231
- token,
232
- root_dir,
233
- log_level: 'DEBUG'
234
- },
235
- MultiKernelManager: {
236
- default_kernel_name: 'echo'
237
- },
238
- KernelManager: {
239
- shutdown_wait_time: 1.0
240
- }
241
- }, options.configData || {});
242
- coreutils_1.PageConfig.setOption('__configData', JSON.stringify(configData));
243
- fs.writeFileSync(configPath, JSON.stringify(configData));
244
- return configDir;
245
- }
246
- Private.handleConfig = handleConfig;
247
- /**
248
- * Handle data.
249
- */
250
- function handleData(options) {
251
- const dataDir = mktempDir('data');
252
- // Install custom specs.
253
- installSpec(dataDir, 'echo', {
254
- argv: [
255
- 'python',
256
- '-m',
257
- 'jupyterlab.tests.echo_kernel',
258
- '-f',
259
- '{connection_file}'
260
- ],
261
- display_name: 'Echo Kernel',
262
- language: 'echo'
263
- });
264
- installSpec(dataDir, 'ipython', {
265
- argv: ['python', '-m', 'ipykernel_launcher', '-f', '{connection_file}'],
266
- display_name: 'Python 3',
267
- language: 'python'
268
- });
269
- if (options.additionalKernelSpecs) {
270
- Object.keys(options.additionalKernelSpecs).forEach(key => {
271
- installSpec(dataDir, key, options.additionalKernelSpecs[key]);
272
- });
273
- }
274
- return dataDir;
275
- }
276
- Private.handleData = handleData;
277
- /**
278
- * Handle process startup.
279
- *
280
- * @param output the process output
281
- *
282
- * @returns The baseUrl of the server or `null`.
283
- */
284
- function handleStartup(output) {
285
- let baseUrl = null;
286
- output.split('\n').forEach(line => {
287
- const baseUrlMatch = line.match(/(http:\/\/localhost:\d+\/[^?]*)/);
288
- if (baseUrlMatch) {
289
- baseUrl = baseUrlMatch[1].replace('/lab', '');
290
- coreutils_1.PageConfig.setOption('baseUrl', baseUrl);
291
- }
292
- });
293
- return baseUrl;
294
- }
295
- Private.handleStartup = handleStartup;
296
- /**
297
- * Connect to the Jupyter server.
298
- */
299
- async function connect(baseUrl, startDelegate) {
300
- // eslint-disable-next-line
301
- while (true) {
302
- try {
303
- await fetch(coreutils_1.URLExt.join(baseUrl, 'api'));
304
- startDelegate.resolve(baseUrl);
305
- return;
306
- }
307
- catch (e) {
308
- // spin until we can connect to the server.
309
- console.warn(e);
310
- await (0, common_1.sleep)(1000);
311
- }
312
- }
313
- }
314
- Private.connect = connect;
315
- })(Private || (Private = {}));
316
- //# sourceMappingURL=start_jupyter_server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"start_jupyter_server.js","sourceRoot":"","sources":["../src/start_jupyter_server.ts"],"names":[],"mappings":"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"}