@myst-theme/jupyter 0.3.3 → 0.3.5
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/dist/cjs/ConnectionStatusTray.d.ts.map +1 -1
- package/dist/cjs/ConnectionStatusTray.js +6 -4
- package/dist/cjs/ErrorTray.d.ts +5 -0
- package/dist/cjs/ErrorTray.d.ts.map +1 -0
- package/dist/cjs/ErrorTray.js +34 -0
- package/dist/cjs/controls/ArticleCellControls.d.ts +10 -0
- package/dist/cjs/controls/ArticleCellControls.d.ts.map +1 -0
- package/dist/cjs/controls/ArticleCellControls.js +33 -0
- package/dist/cjs/controls/Buttons.d.ts +47 -0
- package/dist/cjs/controls/Buttons.d.ts.map +1 -0
- package/dist/cjs/controls/Buttons.js +70 -0
- package/dist/cjs/controls/NotebookCellControls.d.ts +10 -0
- package/dist/cjs/controls/NotebookCellControls.d.ts.map +1 -0
- package/dist/cjs/controls/NotebookCellControls.js +27 -0
- package/dist/cjs/controls/NotebookToolbar.d.ts +4 -0
- package/dist/cjs/controls/NotebookToolbar.d.ts.map +1 -0
- package/dist/cjs/controls/NotebookToolbar.js +47 -0
- package/dist/cjs/controls/Spinner.d.ts +4 -0
- package/dist/cjs/controls/Spinner.d.ts.map +1 -0
- package/dist/cjs/controls/Spinner.js +8 -0
- package/dist/cjs/controls/index.d.ts +5 -0
- package/dist/cjs/controls/index.d.ts.map +1 -0
- package/dist/cjs/controls/index.js +20 -0
- package/dist/cjs/embed.d.ts +4 -0
- package/dist/cjs/embed.d.ts.map +1 -0
- package/dist/cjs/embed.js +24 -0
- package/dist/cjs/execute/actions.d.ts +55 -0
- package/dist/cjs/execute/actions.d.ts.map +1 -0
- package/dist/cjs/execute/actions.js +49 -0
- package/dist/cjs/execute/busy.d.ts +74 -0
- package/dist/cjs/execute/busy.d.ts.map +1 -0
- package/dist/cjs/execute/busy.js +182 -0
- package/dist/cjs/execute/hooks.d.ts +62 -0
- package/dist/cjs/execute/hooks.d.ts.map +1 -0
- package/dist/cjs/execute/hooks.js +308 -0
- package/dist/cjs/execute/index.d.ts +7 -0
- package/dist/cjs/execute/index.d.ts.map +1 -0
- package/dist/cjs/execute/index.js +22 -0
- package/dist/cjs/execute/leaf.d.ts +26 -0
- package/dist/cjs/execute/leaf.d.ts.map +1 -0
- package/dist/cjs/execute/leaf.js +154 -0
- package/dist/cjs/execute/provider.d.ts +29 -0
- package/dist/cjs/execute/provider.d.ts.map +1 -0
- package/dist/cjs/execute/provider.js +126 -0
- package/dist/cjs/execute/reducer.d.ts +4 -0
- package/dist/cjs/execute/reducer.d.ts.map +1 -0
- package/dist/cjs/execute/reducer.js +136 -0
- package/dist/cjs/execute/selectors.d.ts +22 -0
- package/dist/cjs/execute/selectors.d.ts.map +1 -0
- package/dist/cjs/execute/selectors.js +89 -0
- package/dist/cjs/execute/types.d.ts +49 -0
- package/dist/cjs/execute/types.d.ts.map +1 -0
- package/dist/cjs/execute/types.js +2 -0
- package/dist/cjs/execute/utils.d.ts +23 -0
- package/dist/cjs/execute/utils.d.ts.map +1 -0
- package/dist/cjs/execute/utils.js +62 -0
- package/dist/cjs/index.d.ts +6 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +6 -1
- package/dist/cjs/jupyter.d.ts.map +1 -1
- package/dist/cjs/jupyter.js +18 -19
- package/dist/cjs/output.js +2 -2
- package/dist/cjs/providers.d.ts +1 -48
- package/dist/cjs/providers.d.ts.map +1 -1
- package/dist/cjs/providers.js +4 -155
- package/dist/esm/ConnectionStatusTray.d.ts.map +1 -1
- package/dist/esm/ConnectionStatusTray.js +7 -5
- package/dist/esm/ErrorTray.d.ts +5 -0
- package/dist/esm/ErrorTray.d.ts.map +1 -0
- package/dist/esm/ErrorTray.js +30 -0
- package/dist/esm/controls/ArticleCellControls.d.ts +10 -0
- package/dist/esm/controls/ArticleCellControls.d.ts.map +1 -0
- package/dist/esm/controls/ArticleCellControls.js +27 -0
- package/dist/esm/controls/Buttons.d.ts +47 -0
- package/dist/esm/controls/Buttons.d.ts.map +1 -0
- package/dist/esm/controls/Buttons.js +57 -0
- package/dist/esm/controls/NotebookCellControls.d.ts +10 -0
- package/dist/esm/controls/NotebookCellControls.d.ts.map +1 -0
- package/dist/esm/controls/NotebookCellControls.js +21 -0
- package/dist/esm/controls/NotebookToolbar.d.ts +4 -0
- package/dist/esm/controls/NotebookToolbar.d.ts.map +1 -0
- package/dist/esm/controls/NotebookToolbar.js +40 -0
- package/dist/esm/controls/Spinner.d.ts +4 -0
- package/dist/esm/controls/Spinner.d.ts.map +1 -0
- package/dist/esm/controls/Spinner.js +4 -0
- package/dist/esm/controls/index.d.ts +5 -0
- package/dist/esm/controls/index.d.ts.map +1 -0
- package/dist/esm/controls/index.js +4 -0
- package/dist/esm/embed.d.ts +4 -0
- package/dist/esm/embed.d.ts.map +1 -0
- package/dist/esm/embed.js +20 -0
- package/dist/esm/execute/actions.d.ts +55 -0
- package/dist/esm/execute/actions.d.ts.map +1 -0
- package/dist/esm/execute/actions.js +38 -0
- package/dist/esm/execute/busy.d.ts +74 -0
- package/dist/esm/execute/busy.d.ts.map +1 -0
- package/dist/esm/execute/busy.js +150 -0
- package/dist/esm/execute/hooks.d.ts +62 -0
- package/dist/esm/execute/hooks.d.ts.map +1 -0
- package/dist/esm/execute/hooks.js +277 -0
- package/dist/esm/execute/index.d.ts +7 -0
- package/dist/esm/execute/index.d.ts.map +1 -0
- package/dist/esm/execute/index.js +6 -0
- package/dist/esm/execute/leaf.d.ts +26 -0
- package/dist/esm/execute/leaf.d.ts.map +1 -0
- package/dist/esm/execute/leaf.js +147 -0
- package/dist/esm/execute/provider.d.ts +29 -0
- package/dist/esm/execute/provider.d.ts.map +1 -0
- package/dist/esm/execute/provider.js +99 -0
- package/dist/esm/execute/reducer.d.ts +4 -0
- package/dist/esm/execute/reducer.d.ts.map +1 -0
- package/dist/esm/execute/reducer.js +132 -0
- package/dist/esm/execute/selectors.d.ts +22 -0
- package/dist/esm/execute/selectors.d.ts.map +1 -0
- package/dist/esm/execute/selectors.js +77 -0
- package/dist/esm/execute/types.d.ts +49 -0
- package/dist/esm/execute/types.d.ts.map +1 -0
- package/dist/esm/execute/types.js +1 -0
- package/dist/esm/execute/utils.d.ts +23 -0
- package/dist/esm/execute/utils.d.ts.map +1 -0
- package/dist/esm/execute/utils.js +58 -0
- package/dist/esm/index.d.ts +6 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/jupyter.d.ts.map +1 -1
- package/dist/esm/jupyter.js +16 -17
- package/dist/esm/output.js +2 -2
- package/dist/esm/providers.d.ts +1 -48
- package/dist/esm/providers.d.ts.map +1 -1
- package/dist/esm/providers.js +2 -126
- package/dist/types/ConnectionStatusTray.d.ts.map +1 -1
- package/dist/types/ErrorTray.d.ts +5 -0
- package/dist/types/ErrorTray.d.ts.map +1 -0
- package/dist/types/controls/ArticleCellControls.d.ts +10 -0
- package/dist/types/controls/ArticleCellControls.d.ts.map +1 -0
- package/dist/types/controls/Buttons.d.ts +47 -0
- package/dist/types/controls/Buttons.d.ts.map +1 -0
- package/dist/types/controls/NotebookCellControls.d.ts +10 -0
- package/dist/types/controls/NotebookCellControls.d.ts.map +1 -0
- package/dist/types/controls/NotebookToolbar.d.ts +4 -0
- package/dist/types/controls/NotebookToolbar.d.ts.map +1 -0
- package/dist/types/controls/Spinner.d.ts +4 -0
- package/dist/types/controls/Spinner.d.ts.map +1 -0
- package/dist/types/controls/index.d.ts +5 -0
- package/dist/types/controls/index.d.ts.map +1 -0
- package/dist/types/embed.d.ts +4 -0
- package/dist/types/embed.d.ts.map +1 -0
- package/dist/types/execute/actions.d.ts +55 -0
- package/dist/types/execute/actions.d.ts.map +1 -0
- package/dist/types/execute/busy.d.ts +74 -0
- package/dist/types/execute/busy.d.ts.map +1 -0
- package/dist/types/execute/hooks.d.ts +62 -0
- package/dist/types/execute/hooks.d.ts.map +1 -0
- package/dist/types/execute/index.d.ts +7 -0
- package/dist/types/execute/index.d.ts.map +1 -0
- package/dist/types/execute/leaf.d.ts +26 -0
- package/dist/types/execute/leaf.d.ts.map +1 -0
- package/dist/types/execute/provider.d.ts +29 -0
- package/dist/types/execute/provider.d.ts.map +1 -0
- package/dist/types/execute/reducer.d.ts +4 -0
- package/dist/types/execute/reducer.d.ts.map +1 -0
- package/dist/types/execute/selectors.d.ts +22 -0
- package/dist/types/execute/selectors.d.ts.map +1 -0
- package/dist/types/execute/types.d.ts +49 -0
- package/dist/types/execute/types.d.ts.map +1 -0
- package/dist/types/execute/utils.d.ts +23 -0
- package/dist/types/execute/utils.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/jupyter.d.ts.map +1 -1
- package/dist/types/providers.d.ts +1 -48
- package/dist/types/providers.d.ts.map +1 -1
- package/package.json +9 -8
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { ExecuteScopeAction } from './actions';
|
|
3
|
+
import type { IdKeyMap, ExecuteScopeState } from './types';
|
|
4
|
+
export declare function MdastFetcher({ slug, url, dispatch, }: {
|
|
5
|
+
slug: string;
|
|
6
|
+
url: string;
|
|
7
|
+
dispatch: React.Dispatch<ExecuteScopeAction>;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
9
|
+
export declare function NotebookBuilder({ pageSlug, notebookSlug, idkmap, state, dispatch, }: {
|
|
10
|
+
pageSlug: string;
|
|
11
|
+
notebookSlug: string;
|
|
12
|
+
idkmap: IdKeyMap;
|
|
13
|
+
state: ExecuteScopeState;
|
|
14
|
+
dispatch: React.Dispatch<ExecuteScopeAction>;
|
|
15
|
+
}): null;
|
|
16
|
+
export declare function SessionStarter({ pageSlug, notebookSlug, state, dispatch, }: {
|
|
17
|
+
pageSlug: string;
|
|
18
|
+
notebookSlug: string;
|
|
19
|
+
state: ExecuteScopeState;
|
|
20
|
+
dispatch: React.Dispatch<ExecuteScopeAction>;
|
|
21
|
+
}): null;
|
|
22
|
+
export declare function ServerMonitor({ state, dispatch, }: {
|
|
23
|
+
state: ExecuteScopeState;
|
|
24
|
+
dispatch: React.Dispatch<ExecuteScopeAction>;
|
|
25
|
+
}): null;
|
|
26
|
+
//# sourceMappingURL=leaf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaf.d.ts","sourceRoot":"","sources":["../../../src/execute/leaf.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAO3D,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,GAAG,EACH,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;CAC9C,kDAkBA;AAED,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,KAAK,EACL,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;CAC9C,QA8CA;AAED,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;CAC9C,QAoEA;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;CAC9C,QA4BA"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ServerMonitor = exports.SessionStarter = exports.NotebookBuilder = exports.MdastFetcher = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const thebe_react_1 = require("thebe-react");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
const selectors_1 = require("./selectors");
|
|
9
|
+
const myst_to_react_1 = require("myst-to-react");
|
|
10
|
+
function MdastFetcher({ slug, url, dispatch, }) {
|
|
11
|
+
const { data, error } = (0, myst_to_react_1.useFetchMdast)({ remote: true, dataUrl: `${url}.json` });
|
|
12
|
+
(0, react_1.useEffect)(() => {
|
|
13
|
+
if (!data)
|
|
14
|
+
return;
|
|
15
|
+
dispatch({ type: 'ADD_MDAST', payload: { slug, mdast: data.mdast } });
|
|
16
|
+
}, [data]);
|
|
17
|
+
if (error) {
|
|
18
|
+
return ((0, jsx_runtime_1.jsxs)("div", { children: ["error: ", slug, error.message] }));
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
exports.MdastFetcher = MdastFetcher;
|
|
23
|
+
function NotebookBuilder({ pageSlug, notebookSlug, idkmap, state, dispatch, }) {
|
|
24
|
+
var _a;
|
|
25
|
+
const { core } = (0, thebe_react_1.useThebeLoader)();
|
|
26
|
+
const { config } = (0, thebe_react_1.useThebeConfig)();
|
|
27
|
+
const lock = (0, react_1.useRef)(false); // TODO can be removed if we solve double render from provider
|
|
28
|
+
const scopeHasNotebook = !!((_a = state.pages[pageSlug]) === null || _a === void 0 ? void 0 : _a.scopes[notebookSlug]);
|
|
29
|
+
(0, react_1.useEffect)(() => {
|
|
30
|
+
var _a;
|
|
31
|
+
if (!core || !config || scopeHasNotebook || lock.current)
|
|
32
|
+
return;
|
|
33
|
+
lock.current = true;
|
|
34
|
+
console.debug(`Jupyter: NotebookBuilder - ${notebookSlug} being added to scope ${pageSlug}`);
|
|
35
|
+
const rendermime = core === null || core === void 0 ? void 0 : core.makeRenderMimeRegistry(config === null || config === void 0 ? void 0 : config.mathjax);
|
|
36
|
+
const notebook = (0, utils_1.notebookFromMdast)(core, config, pageSlug, notebookSlug, state.mdast[notebookSlug].root, idkmap, rendermime);
|
|
37
|
+
// hook up computable targets
|
|
38
|
+
const computables = (_a = state.pages[pageSlug]) === null || _a === void 0 ? void 0 : _a.computables;
|
|
39
|
+
computables === null || computables === void 0 ? void 0 : computables.forEach((c) => {
|
|
40
|
+
if (idkmap[c.label]) {
|
|
41
|
+
idkmap[c.outputKey] = idkmap[c.label];
|
|
42
|
+
idkmap[c.embedKey] = idkmap[c.label];
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
dispatch({
|
|
46
|
+
type: 'ADD_NOTEBOOK',
|
|
47
|
+
payload: { pageSlug, notebookSlug, rendermime, notebook },
|
|
48
|
+
});
|
|
49
|
+
}, [core, config, pageSlug, notebookSlug, scopeHasNotebook, lock]);
|
|
50
|
+
// TODO find a way to check if the all the notebooks are built and do a single dispatch
|
|
51
|
+
// potentilly use a move the loop down into this component
|
|
52
|
+
const allNotebooksAreBuilt = (0, selectors_1.selectAreAllNotebookScopesBuilt)(state, pageSlug);
|
|
53
|
+
(0, react_1.useEffect)(() => {
|
|
54
|
+
if (!allNotebooksAreBuilt)
|
|
55
|
+
return;
|
|
56
|
+
dispatch({ type: 'BUILD_STATUS', payload: { slug: pageSlug, status: 'wait-for-server' } });
|
|
57
|
+
}, [allNotebooksAreBuilt]);
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
exports.NotebookBuilder = NotebookBuilder;
|
|
61
|
+
function SessionStarter({ pageSlug, notebookSlug, state, dispatch, }) {
|
|
62
|
+
var _a;
|
|
63
|
+
const { core } = (0, thebe_react_1.useThebeLoader)();
|
|
64
|
+
const { config, server } = (0, thebe_react_1.useThebeServer)();
|
|
65
|
+
const lock = (0, react_1.useRef)(false); // TODO can be removed if we solve double render from provider
|
|
66
|
+
const scope = (_a = state.pages[pageSlug]) === null || _a === void 0 ? void 0 : _a.scopes[notebookSlug];
|
|
67
|
+
(0, react_1.useEffect)(() => {
|
|
68
|
+
if (!core || !server || scope.session || lock.current)
|
|
69
|
+
return;
|
|
70
|
+
lock.current = true;
|
|
71
|
+
console.debug(`Jupyter: Starting session for ${pageSlug}-${notebookSlug}`);
|
|
72
|
+
server.listRunningSessions().then((sessions) => {
|
|
73
|
+
console.debug('Jupyter: running sessions', sessions);
|
|
74
|
+
const path = `/${pageSlug}-${notebookSlug}.ipynb`;
|
|
75
|
+
const existing = sessions.find((s) => s.path === path);
|
|
76
|
+
if (existing) {
|
|
77
|
+
console.debug(`session already exists for ${pageSlug}-${notebookSlug}`, existing);
|
|
78
|
+
server.connectToExistingSession(existing, scope.rendermime).then((sesh) => {
|
|
79
|
+
var _a;
|
|
80
|
+
if (sesh == null) {
|
|
81
|
+
console.error(`Could not connect to session for ${pageSlug} ${notebookSlug}`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
console.debug(`reconnected to session for ${pageSlug}/${notebookSlug}`, sesh);
|
|
85
|
+
console.debug('restarting session', sesh);
|
|
86
|
+
(_a = sesh.kernel) === null || _a === void 0 ? void 0 : _a.restart().then(() => {
|
|
87
|
+
var _a;
|
|
88
|
+
const notebook = (_a = state.pages[pageSlug]) === null || _a === void 0 ? void 0 : _a.scopes[notebookSlug].notebook;
|
|
89
|
+
notebook.attachSession(sesh);
|
|
90
|
+
dispatch({ type: 'ADD_SESSION', payload: { pageSlug, notebookSlug, session: sesh } });
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
server
|
|
96
|
+
.startNewSession(scope.rendermime, Object.assign(Object.assign({}, config === null || config === void 0 ? void 0 : config.kernels), { name: `${pageSlug}-${notebookSlug}.ipynb`, path }))
|
|
97
|
+
.then((sesh) => {
|
|
98
|
+
var _a;
|
|
99
|
+
if (sesh == null) {
|
|
100
|
+
server === null || server === void 0 ? void 0 : server.getKernelSpecs().then((specs) => {
|
|
101
|
+
console.error(`Could not start session for ${pageSlug} ${notebookSlug}`);
|
|
102
|
+
console.debug(`Available kernels: ${Object.keys(specs)}`);
|
|
103
|
+
});
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
console.debug(`session started for ${pageSlug}/${notebookSlug}`, sesh);
|
|
107
|
+
const notebook = (_a = state.pages[pageSlug]) === null || _a === void 0 ? void 0 : _a.scopes[notebookSlug].notebook;
|
|
108
|
+
notebook.attachSession(sesh);
|
|
109
|
+
dispatch({ type: 'ADD_SESSION', payload: { pageSlug, notebookSlug, session: sesh } });
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}, [core, config, pageSlug, notebookSlug, lock]);
|
|
114
|
+
// TODO avoid multiple dispatch?
|
|
115
|
+
const allSessionsAreStarted = (0, selectors_1.selectAreAllSessionsStarted)(state, pageSlug);
|
|
116
|
+
(0, react_1.useEffect)(() => {
|
|
117
|
+
if (!allSessionsAreStarted)
|
|
118
|
+
return;
|
|
119
|
+
dispatch({
|
|
120
|
+
type: 'SET_RENDERING_READY',
|
|
121
|
+
payload: { slug: pageSlug },
|
|
122
|
+
});
|
|
123
|
+
}, [allSessionsAreStarted]);
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
exports.SessionStarter = SessionStarter;
|
|
127
|
+
function ServerMonitor({ state, dispatch, }) {
|
|
128
|
+
const { core, load, loading } = (0, thebe_react_1.useThebeLoader)();
|
|
129
|
+
const { ready, error } = (0, thebe_react_1.useThebeServer)();
|
|
130
|
+
(0, react_1.useEffect)(() => {
|
|
131
|
+
if (core || loading)
|
|
132
|
+
return;
|
|
133
|
+
load();
|
|
134
|
+
}, [core, load, loading]);
|
|
135
|
+
// When server is ready, move any waiting builds onto the start session step
|
|
136
|
+
(0, react_1.useEffect)(() => {
|
|
137
|
+
if (ready) {
|
|
138
|
+
// TODO optimize to do a single dispatch
|
|
139
|
+
Object.entries(state.builds).forEach(([slug, { status }]) => {
|
|
140
|
+
if (status === 'wait-for-server') {
|
|
141
|
+
dispatch({ type: 'BUILD_STATUS', payload: { slug, status: 'start-session' } });
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}, [ready, state]);
|
|
146
|
+
(0, react_1.useEffect)(() => {
|
|
147
|
+
if (!error)
|
|
148
|
+
return;
|
|
149
|
+
// TODO
|
|
150
|
+
// dispatch({ type: 'SERVER_ERROR', payload: error });
|
|
151
|
+
}, [error]);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
exports.ServerMonitor = ServerMonitor;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Dependency } from 'myst-common';
|
|
2
|
+
import { SourceFileKind } from 'myst-common';
|
|
3
|
+
import type { Root } from 'mdast';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import type { ExecuteScopeAction } from './actions';
|
|
6
|
+
import type { ExecuteScopeState, IdKeyMap } from './types';
|
|
7
|
+
export interface ExecuteScopeType {
|
|
8
|
+
slug: string;
|
|
9
|
+
state: ExecuteScopeState;
|
|
10
|
+
dispatch: React.Dispatch<ExecuteScopeAction>;
|
|
11
|
+
idkmap: IdKeyMap;
|
|
12
|
+
}
|
|
13
|
+
export declare const ExecuteScopeContext: React.Context<ExecuteScopeType | undefined>;
|
|
14
|
+
type ArticleContents = {
|
|
15
|
+
slug: string;
|
|
16
|
+
kind: SourceFileKind;
|
|
17
|
+
mdast: Root;
|
|
18
|
+
dependencies?: Dependency[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* The ExecuteScopeProvider is responsible for maintaining the state of the
|
|
22
|
+
* execution scope. It is also responsible for fetching the json for dependencies
|
|
23
|
+
* and adding them to the sources tree.
|
|
24
|
+
*/
|
|
25
|
+
export declare function ExecuteScopeProvider({ children, contents, }: React.PropsWithChildren<{
|
|
26
|
+
contents: ArticleContents;
|
|
27
|
+
}>): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/execute/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,KAAwC,MAAM,OAAO,CAAC;AAE7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,EAAc,iBAAiB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUvE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC7C,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,eAAO,MAAM,mBAAmB,6CAA+D,CAAC;AAEhG,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,IAAI,CAAC;IACZ,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;CAC7B,CAAC;AA8DF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAAE,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC,2CAgGxD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ExecuteScopeProvider = exports.ExecuteScopeContext = void 0;
|
|
27
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
28
|
+
const myst_common_1 = require("myst-common");
|
|
29
|
+
const react_1 = __importStar(require("react"));
|
|
30
|
+
const unist_util_select_1 = require("unist-util-select");
|
|
31
|
+
const reducer_1 = require("./reducer");
|
|
32
|
+
const selectors_1 = require("./selectors");
|
|
33
|
+
const leaf_1 = require("./leaf");
|
|
34
|
+
exports.ExecuteScopeContext = react_1.default.createContext(undefined);
|
|
35
|
+
function useScopeNavigate({ contents: { slug, kind, mdast, dependencies }, state, dispatch, }) {
|
|
36
|
+
(0, react_1.useEffect)(() => {
|
|
37
|
+
if (state.pages[slug]) {
|
|
38
|
+
console.debug(`Jupyter: ExecuteScopeProvider - ${slug} is already in scope`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const computables = (0, unist_util_select_1.selectAll)('container > embed', mdast).map((node) => {
|
|
42
|
+
const { key, label, source } = node;
|
|
43
|
+
const output = (0, unist_util_select_1.selectAll)('output', node);
|
|
44
|
+
if (output.length === 0)
|
|
45
|
+
console.error(`embed must have exactly one output ${key}`);
|
|
46
|
+
if (output.length > 1)
|
|
47
|
+
console.warn(`embed has more than one output block ${key}}`);
|
|
48
|
+
return { embedKey: key, outputKey: output[0].key, label, source };
|
|
49
|
+
});
|
|
50
|
+
dispatch({
|
|
51
|
+
type: 'NAVIGATE',
|
|
52
|
+
payload: {
|
|
53
|
+
kind: kind,
|
|
54
|
+
slug: slug,
|
|
55
|
+
mdast: mdast,
|
|
56
|
+
dependencies: dependencies !== null && dependencies !== void 0 ? dependencies : [],
|
|
57
|
+
computables,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}, [slug]);
|
|
61
|
+
}
|
|
62
|
+
function useExecutionScopeFetcher({ slug, state, dispatch, }) {
|
|
63
|
+
(0, react_1.useEffect)(() => {
|
|
64
|
+
if (!state.builds[slug])
|
|
65
|
+
return;
|
|
66
|
+
// TODO could be moved to the leaf
|
|
67
|
+
if (state.builds[slug].status === 'pending') {
|
|
68
|
+
dispatch({ type: 'BUILD_STATUS', payload: { slug, status: 'fetching' } });
|
|
69
|
+
}
|
|
70
|
+
// TODO could be moved to the leaf
|
|
71
|
+
if (state.builds[slug].status === 'fetching') {
|
|
72
|
+
if ((0, selectors_1.selectAreAllDependenciesReady)(state, slug)) {
|
|
73
|
+
dispatch({ type: 'BUILD_STATUS', payload: { slug, status: 'build-notebooks' } });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}, [state.builds, state.mdast]);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The ExecuteScopeProvider is responsible for maintaining the state of the
|
|
80
|
+
* execution scope. It is also responsible for fetching the json for dependencies
|
|
81
|
+
* and adding them to the sources tree.
|
|
82
|
+
*/
|
|
83
|
+
function ExecuteScopeProvider({ children, contents, }) {
|
|
84
|
+
var _a;
|
|
85
|
+
// compute incoming for first render
|
|
86
|
+
const computables = (0, unist_util_select_1.selectAll)('container > embed', contents.mdast).map((node) => {
|
|
87
|
+
const { key, label, source } = node;
|
|
88
|
+
const output = (0, unist_util_select_1.selectAll)('output', node);
|
|
89
|
+
if (output.length === 0)
|
|
90
|
+
console.error(`embed must have exactly one output ${key}`);
|
|
91
|
+
if (output.length > 1)
|
|
92
|
+
console.warn(`embed has mpre than one output block ${key}}`);
|
|
93
|
+
return { embedKey: key, outputKey: output[0].key, label, source };
|
|
94
|
+
});
|
|
95
|
+
const initialState = {
|
|
96
|
+
mdast: {
|
|
97
|
+
[contents.slug]: { root: contents.mdast },
|
|
98
|
+
},
|
|
99
|
+
pages: {
|
|
100
|
+
[contents.slug]: {
|
|
101
|
+
computable: computables.length > 0 || contents.kind === myst_common_1.SourceFileKind.Notebook,
|
|
102
|
+
kind: contents.kind,
|
|
103
|
+
slug: contents.slug,
|
|
104
|
+
dependencies: (_a = contents.dependencies) !== null && _a !== void 0 ? _a : [],
|
|
105
|
+
computables,
|
|
106
|
+
ready: false,
|
|
107
|
+
scopes: {},
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
builds: {},
|
|
111
|
+
};
|
|
112
|
+
const [state, dispatch] = (0, react_1.useReducer)(reducer_1.reducer, initialState);
|
|
113
|
+
const idkmap = (0, react_1.useRef)({});
|
|
114
|
+
useScopeNavigate({ contents, state: state, dispatch });
|
|
115
|
+
// TODO phase this out as it is based on the current slug only!
|
|
116
|
+
useExecutionScopeFetcher({ slug: contents.slug, state: state, dispatch });
|
|
117
|
+
const fetchTargets = (0, selectors_1.selectDependenciesToFetch)(state);
|
|
118
|
+
const notebookBuildTargets = (0, selectors_1.selectScopeNotebooksToBuild)(state);
|
|
119
|
+
const sessionStartTargets = (0, selectors_1.selectSessionsToStart)(state);
|
|
120
|
+
const memo = react_1.default.useMemo(() => ({ slug: contents.slug, state, dispatch, idkmap: idkmap.current }), [state, contents.slug]);
|
|
121
|
+
if (typeof window !== 'undefined') {
|
|
122
|
+
window.executeScope = memo;
|
|
123
|
+
}
|
|
124
|
+
return ((0, jsx_runtime_1.jsxs)(exports.ExecuteScopeContext.Provider, { value: memo, children: [(0, jsx_runtime_1.jsxs)("div", { className: "hidden", children: [fetchTargets.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "p-1 pl-4", children: fetchTargets.map(({ slug, url }) => ((0, jsx_runtime_1.jsx)(leaf_1.MdastFetcher, { slug: slug, url: url, dispatch: dispatch }, `fetch-${slug}`))) })), notebookBuildTargets.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "p-1 pl-4", children: notebookBuildTargets.map(({ pageSlug, notebookSlug }) => ((0, jsx_runtime_1.jsx)(leaf_1.NotebookBuilder, { pageSlug: pageSlug, notebookSlug: notebookSlug, idkmap: idkmap.current, state: state, dispatch: dispatch }, `build-${pageSlug}-${notebookSlug}`))) })), sessionStartTargets.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "p-1 pl-4", children: sessionStartTargets.map(({ pageSlug, notebookSlug }) => ((0, jsx_runtime_1.jsx)(leaf_1.SessionStarter, { pageSlug: pageSlug, notebookSlug: notebookSlug, state: state, dispatch: dispatch }, `session-${pageSlug}-${notebookSlug}`))) }))] }), (0, jsx_runtime_1.jsx)(leaf_1.ServerMonitor, { state: state, dispatch: dispatch }), children] }));
|
|
125
|
+
}
|
|
126
|
+
exports.ExecuteScopeProvider = ExecuteScopeProvider;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/execute/reducer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AASpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,wBAAgB,OAAO,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAuL/F"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.reducer = void 0;
|
|
15
|
+
const myst_common_1 = require("myst-common");
|
|
16
|
+
const actions_1 = require("./actions");
|
|
17
|
+
function reducer(state, action) {
|
|
18
|
+
switch (action.type) {
|
|
19
|
+
case 'NAVIGATE': {
|
|
20
|
+
if (!(0, actions_1.isNavigatePayload)(action.payload)) {
|
|
21
|
+
console.error(action.payload);
|
|
22
|
+
throw new Error('invalid NAVIGATE payload');
|
|
23
|
+
}
|
|
24
|
+
const { kind, slug, mdast, dependencies, computables } = action.payload;
|
|
25
|
+
if (state.pages[slug])
|
|
26
|
+
return state;
|
|
27
|
+
return Object.assign(Object.assign({}, state), { mdast: Object.assign(Object.assign({}, state.mdast), { [slug]: { root: mdast } }), pages: Object.assign(Object.assign({}, state.pages), { [slug]: {
|
|
28
|
+
kind,
|
|
29
|
+
slug,
|
|
30
|
+
dependencies,
|
|
31
|
+
computables,
|
|
32
|
+
computable: computables.length > 0 || kind === myst_common_1.SourceFileKind.Notebook,
|
|
33
|
+
ready: false,
|
|
34
|
+
scopes: {},
|
|
35
|
+
} }) });
|
|
36
|
+
}
|
|
37
|
+
case 'ADD_MDAST': {
|
|
38
|
+
if (!(0, actions_1.isAddMdastPayload)(action.payload)) {
|
|
39
|
+
console.error(action.payload);
|
|
40
|
+
throw new Error('invalid ADD_MDAST payload');
|
|
41
|
+
}
|
|
42
|
+
const { slug, mdast } = action.payload;
|
|
43
|
+
if (state.mdast[slug])
|
|
44
|
+
return state;
|
|
45
|
+
return Object.assign(Object.assign({}, state), { mdast: Object.assign(Object.assign({}, state.mdast), { [slug]: { root: mdast } }) });
|
|
46
|
+
}
|
|
47
|
+
case 'REQUEST_BUILD': {
|
|
48
|
+
if (!(0, actions_1.isSlugPayload)(action.payload)) {
|
|
49
|
+
console.error(action.payload);
|
|
50
|
+
throw new Error('invalid REQUEST_BUILD payload');
|
|
51
|
+
}
|
|
52
|
+
const { slug } = action.payload;
|
|
53
|
+
if (!!state.builds[slug] && state.builds[slug].status === 'pending')
|
|
54
|
+
return state;
|
|
55
|
+
return Object.assign(Object.assign({}, state), { builds: Object.assign(Object.assign({}, state.builds), { [slug]: {
|
|
56
|
+
status: 'pending',
|
|
57
|
+
} }) });
|
|
58
|
+
}
|
|
59
|
+
case 'BUILD_STATUS': {
|
|
60
|
+
if (!(0, actions_1.isBuildStatusPayload)(action.payload)) {
|
|
61
|
+
console.error(action.payload);
|
|
62
|
+
throw new Error('invalid BUILD_STATUS payload');
|
|
63
|
+
}
|
|
64
|
+
const { slug } = action.payload;
|
|
65
|
+
if (!state.builds[slug]) {
|
|
66
|
+
console.error(state, action.payload);
|
|
67
|
+
throw new Error('Trying to set build status when there is no build state');
|
|
68
|
+
}
|
|
69
|
+
if (state.builds[slug].status === action.payload.status)
|
|
70
|
+
return state;
|
|
71
|
+
return Object.assign(Object.assign({}, state), { builds: Object.assign(Object.assign({}, state.builds), { [slug]: Object.assign(Object.assign({}, state.builds[slug]), { status: action.payload.status }) }) });
|
|
72
|
+
}
|
|
73
|
+
case 'CLEAR_BUILD': {
|
|
74
|
+
if (!(0, actions_1.isSlugPayload)(action.payload)) {
|
|
75
|
+
console.error(action.payload);
|
|
76
|
+
throw new Error('invalid CLEAR_BUILD payload');
|
|
77
|
+
}
|
|
78
|
+
const { slug } = action.payload;
|
|
79
|
+
if (!state.builds[slug])
|
|
80
|
+
return state;
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
82
|
+
const _a = state.builds, _b = slug, _ = _a[_b], builds = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
|
|
83
|
+
return Object.assign(Object.assign({}, state), { builds });
|
|
84
|
+
}
|
|
85
|
+
case 'SET_RENDERING_READY': {
|
|
86
|
+
if (!(0, actions_1.isSlugPayload)(action.payload)) {
|
|
87
|
+
console.error(action.payload);
|
|
88
|
+
throw new Error('invalid SET_READY payload');
|
|
89
|
+
}
|
|
90
|
+
const { slug } = action.payload;
|
|
91
|
+
if (state.pages[slug].ready)
|
|
92
|
+
return state;
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
94
|
+
const _c = state.builds, _d = slug, _ = _c[_d], builds = __rest(_c, [typeof _d === "symbol" ? _d : _d + ""]);
|
|
95
|
+
const newState = Object.assign(Object.assign({}, state), { builds, pages: Object.assign(Object.assign({}, state.pages), { [slug]: Object.assign(Object.assign({}, state.pages[slug]), { ready: true }) }) });
|
|
96
|
+
return newState;
|
|
97
|
+
}
|
|
98
|
+
case 'ADD_NOTEBOOK': {
|
|
99
|
+
if (!(0, actions_1.isAddNotebookPayload)(action.payload)) {
|
|
100
|
+
console.error(action.payload);
|
|
101
|
+
throw new Error('invalid ADD_NOTEBOOK payload');
|
|
102
|
+
}
|
|
103
|
+
const { pageSlug, notebookSlug, notebook, rendermime } = action.payload;
|
|
104
|
+
if (!state.pages[pageSlug]) {
|
|
105
|
+
console.error(state, action.payload);
|
|
106
|
+
throw new Error('Trying to add notebook when there is no rendering state');
|
|
107
|
+
}
|
|
108
|
+
if (state.pages[pageSlug].scopes[notebookSlug]) {
|
|
109
|
+
console.warn('Trying to add notebook scope when rendering already has one', action.payload);
|
|
110
|
+
return state;
|
|
111
|
+
}
|
|
112
|
+
return Object.assign(Object.assign({}, state), { pages: Object.assign(Object.assign({}, state.pages), { [pageSlug]: Object.assign(Object.assign({}, state.pages[pageSlug]), { scopes: Object.assign(Object.assign({}, state.pages[pageSlug].scopes), { [notebookSlug]: {
|
|
113
|
+
notebook,
|
|
114
|
+
rendermime,
|
|
115
|
+
} }) }) }) });
|
|
116
|
+
}
|
|
117
|
+
case 'ADD_SESSION': {
|
|
118
|
+
if (!(0, actions_1.isAddSessionPayload)(action.payload)) {
|
|
119
|
+
console.error(action.payload);
|
|
120
|
+
throw new Error('invalid ADD_SESSION payload');
|
|
121
|
+
}
|
|
122
|
+
const { pageSlug, notebookSlug, session } = action.payload;
|
|
123
|
+
if (!state.pages[pageSlug]) {
|
|
124
|
+
console.error(state, action.payload);
|
|
125
|
+
throw new Error('Trying to add session when there is no rendering state');
|
|
126
|
+
}
|
|
127
|
+
if (state.pages[pageSlug].scopes[notebookSlug].session) {
|
|
128
|
+
console.warn('Trying to add session scope when rendering already has one', action.payload);
|
|
129
|
+
return state;
|
|
130
|
+
}
|
|
131
|
+
return Object.assign(Object.assign({}, state), { pages: Object.assign(Object.assign({}, state.pages), { [pageSlug]: Object.assign(Object.assign({}, state.pages[pageSlug]), { scopes: Object.assign(Object.assign({}, state.pages[pageSlug].scopes), { [notebookSlug]: Object.assign(Object.assign({}, state.pages[pageSlug].scopes[notebookSlug]), { session }) }) }) }) });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return state;
|
|
135
|
+
}
|
|
136
|
+
exports.reducer = reducer;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BuildStatus, ExecuteScopeState } from './types';
|
|
2
|
+
export declare function selectIsComputable(state: ExecuteScopeState, slug: string): boolean;
|
|
3
|
+
export declare function selectAreExecutionScopesReady(state: ExecuteScopeState, slug: string): boolean;
|
|
4
|
+
export declare function selectAreExecutionScopesBuilding(state: ExecuteScopeState, slug: string): boolean;
|
|
5
|
+
export declare function selectExecutionScopeStatus(state: ExecuteScopeState, slug: string): BuildStatus | "ready";
|
|
6
|
+
export declare function selectDependenciesToFetch(state: ExecuteScopeState): {
|
|
7
|
+
slug: string;
|
|
8
|
+
url: string;
|
|
9
|
+
}[];
|
|
10
|
+
export declare const selectScopeNotebooksToBuild: (state: ExecuteScopeState) => {
|
|
11
|
+
pageSlug: string;
|
|
12
|
+
notebookSlug: string;
|
|
13
|
+
}[];
|
|
14
|
+
export declare const selectSessionsToStart: (state: ExecuteScopeState) => {
|
|
15
|
+
pageSlug: string;
|
|
16
|
+
notebookSlug: string;
|
|
17
|
+
}[];
|
|
18
|
+
export declare function selectAreAllDependenciesReady(state: ExecuteScopeState, slug: string): boolean;
|
|
19
|
+
export declare function selectAreAllNotebookScopesBuilt(state: ExecuteScopeState, slug: string): boolean;
|
|
20
|
+
export declare function selectAreAllSessionsStarted(state: ExecuteScopeState, slug: string): boolean;
|
|
21
|
+
export declare function selectNotebookCellIds(state: ExecuteScopeState, pageSlug: string, notebookSlug: string): string[];
|
|
22
|
+
//# sourceMappingURL=selectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../src/execute/selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE9D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAExE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAEnF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAEtF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,yBAEhF;AAQD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB;UAKpD,MAAM;SACP,MAAM;IAclB;AAsBD,eAAO,MAAM,2BAA2B,UAlBvB,iBAAiB,KAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAkBS,CAAC;AACzF,eAAO,MAAM,qBAAqB,UAnBjB,iBAAiB,KAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAmBC,CAAC;AAEjF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAEnF;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAGrF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAIjF;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,YAGrB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectNotebookCellIds = exports.selectAreAllSessionsStarted = exports.selectAreAllNotebookScopesBuilt = exports.selectAreAllDependenciesReady = exports.selectSessionsToStart = exports.selectScopeNotebooksToBuild = exports.selectDependenciesToFetch = exports.selectExecutionScopeStatus = exports.selectAreExecutionScopesBuilding = exports.selectAreExecutionScopesReady = exports.selectIsComputable = void 0;
|
|
4
|
+
const myst_common_1 = require("myst-common");
|
|
5
|
+
function selectIsComputable(state, slug) {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
return (_b = (_a = state.pages[slug]) === null || _a === void 0 ? void 0 : _a.computable) !== null && _b !== void 0 ? _b : false;
|
|
8
|
+
}
|
|
9
|
+
exports.selectIsComputable = selectIsComputable;
|
|
10
|
+
function selectAreExecutionScopesReady(state, slug) {
|
|
11
|
+
var _a;
|
|
12
|
+
return (_a = state.pages[slug]) === null || _a === void 0 ? void 0 : _a.ready;
|
|
13
|
+
}
|
|
14
|
+
exports.selectAreExecutionScopesReady = selectAreExecutionScopesReady;
|
|
15
|
+
function selectAreExecutionScopesBuilding(state, slug) {
|
|
16
|
+
var _a;
|
|
17
|
+
return !((_a = state.pages[slug]) === null || _a === void 0 ? void 0 : _a.ready) && !!state.builds[slug];
|
|
18
|
+
}
|
|
19
|
+
exports.selectAreExecutionScopesBuilding = selectAreExecutionScopesBuilding;
|
|
20
|
+
function selectExecutionScopeStatus(state, slug) {
|
|
21
|
+
var _a, _b, _c;
|
|
22
|
+
return ((_a = state.pages[slug]) === null || _a === void 0 ? void 0 : _a.ready) ? 'ready' : (_c = (_b = state.builds[slug]) === null || _b === void 0 ? void 0 : _b.status) !== null && _c !== void 0 ? _c : 'unknown';
|
|
23
|
+
}
|
|
24
|
+
exports.selectExecutionScopeStatus = selectExecutionScopeStatus;
|
|
25
|
+
//
|
|
26
|
+
// The following teo functions are ripe for generaizing but also it would be good to
|
|
27
|
+
// see if we can memoize them, potentially with reselect.
|
|
28
|
+
//
|
|
29
|
+
// TODO Memoize?
|
|
30
|
+
function selectDependenciesToFetch(state) {
|
|
31
|
+
return Object.entries(state.builds)
|
|
32
|
+
.filter(([, { status }]) => status === 'fetching')
|
|
33
|
+
.reduce((targets, [slug]) => [
|
|
34
|
+
...targets,
|
|
35
|
+
...state.pages[slug].dependencies
|
|
36
|
+
.filter((d) => { var _a; return !state.mdast[(_a = d.slug) !== null && _a !== void 0 ? _a : d.url]; })
|
|
37
|
+
.map((d) => {
|
|
38
|
+
var _a;
|
|
39
|
+
return ({
|
|
40
|
+
slug: (_a = d.slug) !== null && _a !== void 0 ? _a : d.url,
|
|
41
|
+
url: d.url,
|
|
42
|
+
});
|
|
43
|
+
}),
|
|
44
|
+
], []);
|
|
45
|
+
}
|
|
46
|
+
exports.selectDependenciesToFetch = selectDependenciesToFetch;
|
|
47
|
+
// // TODO Memoize?
|
|
48
|
+
function makeSelectScopeEventStatus(statusName) {
|
|
49
|
+
return (state) => {
|
|
50
|
+
return Object.entries(state.builds)
|
|
51
|
+
.filter(([, { status }]) => status === statusName)
|
|
52
|
+
.reduce((all, [slug]) => {
|
|
53
|
+
const targets = [];
|
|
54
|
+
if (state.pages[slug].kind === myst_common_1.SourceFileKind.Notebook)
|
|
55
|
+
targets.push({ pageSlug: slug, notebookSlug: slug });
|
|
56
|
+
targets.push(...state.pages[slug].dependencies.map((d) => {
|
|
57
|
+
var _a;
|
|
58
|
+
return ({
|
|
59
|
+
pageSlug: slug,
|
|
60
|
+
notebookSlug: (_a = d.slug) !== null && _a !== void 0 ? _a : d.url,
|
|
61
|
+
});
|
|
62
|
+
}));
|
|
63
|
+
return [...all, ...targets];
|
|
64
|
+
}, []);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
exports.selectScopeNotebooksToBuild = makeSelectScopeEventStatus('build-notebooks');
|
|
68
|
+
exports.selectSessionsToStart = makeSelectScopeEventStatus('start-session');
|
|
69
|
+
function selectAreAllDependenciesReady(state, slug) {
|
|
70
|
+
var _a;
|
|
71
|
+
return (_a = state.pages[slug]) === null || _a === void 0 ? void 0 : _a.dependencies.every((dep) => { var _a; return !!state.mdast[(_a = dep.slug) !== null && _a !== void 0 ? _a : dep.url]; });
|
|
72
|
+
}
|
|
73
|
+
exports.selectAreAllDependenciesReady = selectAreAllDependenciesReady;
|
|
74
|
+
function selectAreAllNotebookScopesBuilt(state, slug) {
|
|
75
|
+
const rendering = state.pages[slug];
|
|
76
|
+
return rendering === null || rendering === void 0 ? void 0 : rendering.dependencies.every((dep) => { var _a; return !!rendering.scopes[(_a = dep.slug) !== null && _a !== void 0 ? _a : dep.url]; });
|
|
77
|
+
}
|
|
78
|
+
exports.selectAreAllNotebookScopesBuilt = selectAreAllNotebookScopesBuilt;
|
|
79
|
+
function selectAreAllSessionsStarted(state, slug) {
|
|
80
|
+
const rendering = state.pages[slug];
|
|
81
|
+
// TODO is this working??
|
|
82
|
+
return rendering === null || rendering === void 0 ? void 0 : rendering.dependencies.every((dep) => { var _a, _b; return !!((_b = rendering.scopes[(_a = dep.slug) !== null && _a !== void 0 ? _a : dep.url]) === null || _b === void 0 ? void 0 : _b.session); });
|
|
83
|
+
}
|
|
84
|
+
exports.selectAreAllSessionsStarted = selectAreAllSessionsStarted;
|
|
85
|
+
function selectNotebookCellIds(state, pageSlug, notebookSlug) {
|
|
86
|
+
var _a, _b, _c, _d;
|
|
87
|
+
return (_d = (_c = (_b = (_a = state.pages[pageSlug]) === null || _a === void 0 ? void 0 : _a.scopes[notebookSlug]) === null || _b === void 0 ? void 0 : _b.notebook) === null || _c === void 0 ? void 0 : _c.cells.map(({ id }) => id)) !== null && _d !== void 0 ? _d : [];
|
|
88
|
+
}
|
|
89
|
+
exports.selectNotebookCellIds = selectNotebookCellIds;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Root } from 'mdast';
|
|
2
|
+
import type { SourceFileKind, Dependency } from 'myst-common';
|
|
3
|
+
import type { IRenderMimeRegistry, ThebeNotebook, ThebeSession } from 'thebe-core';
|
|
4
|
+
export type BuildStatus = 'pending' | 'fetching' | 'build-notebooks' | 'wait-for-server' | 'start-session' | 'error';
|
|
5
|
+
export type IdOrKey = string;
|
|
6
|
+
export type CellId = string;
|
|
7
|
+
export type IdKeyMapTarget = {
|
|
8
|
+
pageSlug: string;
|
|
9
|
+
notebookSlug: string;
|
|
10
|
+
cellId: CellId;
|
|
11
|
+
};
|
|
12
|
+
export type IdKeyMap = Record<IdOrKey, IdKeyMapTarget>;
|
|
13
|
+
export interface ExecuteScopeState {
|
|
14
|
+
mdast: {
|
|
15
|
+
[slug: string]: {
|
|
16
|
+
root: Root;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
pages: {
|
|
20
|
+
[pageSlug: string]: {
|
|
21
|
+
slug: string;
|
|
22
|
+
kind: SourceFileKind;
|
|
23
|
+
computable: boolean;
|
|
24
|
+
dependencies: Dependency[];
|
|
25
|
+
computables: Computable[];
|
|
26
|
+
ready: boolean;
|
|
27
|
+
scopes: {
|
|
28
|
+
[notebookSlug: string]: ExecutionScope;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
builds: {
|
|
33
|
+
[pageSlug: string]: {
|
|
34
|
+
status: BuildStatus;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface ExecutionScope {
|
|
39
|
+
rendermime: IRenderMimeRegistry;
|
|
40
|
+
notebook: ThebeNotebook;
|
|
41
|
+
session?: ThebeSession;
|
|
42
|
+
}
|
|
43
|
+
export interface Computable {
|
|
44
|
+
embedKey: string;
|
|
45
|
+
outputKey: string;
|
|
46
|
+
label: string;
|
|
47
|
+
source: Dependency;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|