@myst-theme/jupyter 0.3.8 → 0.4.1

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.
Files changed (110) hide show
  1. package/dist/cjs/ErrorTray.d.ts +4 -4
  2. package/dist/cjs/ErrorTray.d.ts.map +1 -1
  3. package/dist/cjs/ErrorTray.js +11 -3
  4. package/dist/cjs/decoration.d.ts +11 -0
  5. package/dist/cjs/decoration.d.ts.map +1 -0
  6. package/dist/cjs/decoration.js +39 -0
  7. package/dist/cjs/embed.d.ts +3 -2
  8. package/dist/cjs/embed.d.ts.map +1 -1
  9. package/dist/cjs/embed.js +8 -22
  10. package/dist/cjs/execute/actions.d.ts +1 -1
  11. package/dist/cjs/execute/actions.d.ts.map +1 -1
  12. package/dist/cjs/execute/busy.d.ts +24 -2
  13. package/dist/cjs/execute/busy.d.ts.map +1 -1
  14. package/dist/cjs/execute/busy.js +86 -9
  15. package/dist/cjs/execute/hooks.d.ts +2 -2
  16. package/dist/cjs/execute/hooks.d.ts.map +1 -1
  17. package/dist/cjs/execute/hooks.js +14 -6
  18. package/dist/cjs/execute/provider.d.ts +2 -2
  19. package/dist/cjs/execute/provider.d.ts.map +1 -1
  20. package/dist/cjs/execute/provider.js +4 -4
  21. package/dist/cjs/execute/reducer.js +2 -2
  22. package/dist/cjs/execute/selectors.d.ts.map +1 -1
  23. package/dist/cjs/execute/selectors.js +8 -8
  24. package/dist/cjs/execute/types.d.ts +1 -1
  25. package/dist/cjs/execute/types.d.ts.map +1 -1
  26. package/dist/cjs/execute/utils.d.ts.map +1 -1
  27. package/dist/cjs/execute/utils.js +8 -7
  28. package/dist/cjs/figure.d.ts +5 -0
  29. package/dist/cjs/figure.d.ts.map +1 -0
  30. package/dist/cjs/figure.js +20 -0
  31. package/dist/cjs/index.d.ts +2 -0
  32. package/dist/cjs/index.d.ts.map +1 -1
  33. package/dist/cjs/index.js +2 -0
  34. package/dist/cjs/jupyter.d.ts.map +1 -1
  35. package/dist/cjs/jupyter.js +20 -6
  36. package/dist/cjs/output.d.ts +9 -1
  37. package/dist/cjs/output.d.ts.map +1 -1
  38. package/dist/cjs/output.js +17 -9
  39. package/dist/cjs/providers.d.ts +1 -1
  40. package/dist/cjs/providers.d.ts.map +1 -1
  41. package/dist/cjs/utils.js +2 -2
  42. package/dist/esm/ErrorTray.d.ts +4 -4
  43. package/dist/esm/ErrorTray.d.ts.map +1 -1
  44. package/dist/esm/ErrorTray.js +11 -3
  45. package/dist/esm/decoration.d.ts +11 -0
  46. package/dist/esm/decoration.d.ts.map +1 -0
  47. package/dist/esm/decoration.js +31 -0
  48. package/dist/esm/embed.d.ts +3 -2
  49. package/dist/esm/embed.d.ts.map +1 -1
  50. package/dist/esm/embed.js +9 -23
  51. package/dist/esm/execute/actions.d.ts +1 -1
  52. package/dist/esm/execute/actions.d.ts.map +1 -1
  53. package/dist/esm/execute/busy.d.ts +24 -2
  54. package/dist/esm/execute/busy.d.ts.map +1 -1
  55. package/dist/esm/execute/busy.js +84 -8
  56. package/dist/esm/execute/hooks.d.ts +2 -2
  57. package/dist/esm/execute/hooks.d.ts.map +1 -1
  58. package/dist/esm/execute/hooks.js +13 -5
  59. package/dist/esm/execute/provider.d.ts +2 -2
  60. package/dist/esm/execute/provider.d.ts.map +1 -1
  61. package/dist/esm/execute/provider.js +2 -2
  62. package/dist/esm/execute/reducer.js +1 -1
  63. package/dist/esm/execute/selectors.d.ts.map +1 -1
  64. package/dist/esm/execute/selectors.js +7 -7
  65. package/dist/esm/execute/types.d.ts +1 -1
  66. package/dist/esm/execute/types.d.ts.map +1 -1
  67. package/dist/esm/execute/utils.d.ts.map +1 -1
  68. package/dist/esm/execute/utils.js +8 -7
  69. package/dist/esm/figure.d.ts +5 -0
  70. package/dist/esm/figure.d.ts.map +1 -0
  71. package/dist/esm/figure.js +16 -0
  72. package/dist/esm/index.d.ts +2 -0
  73. package/dist/esm/index.d.ts.map +1 -1
  74. package/dist/esm/index.js +2 -0
  75. package/dist/esm/jupyter.d.ts.map +1 -1
  76. package/dist/esm/jupyter.js +16 -5
  77. package/dist/esm/output.d.ts +9 -1
  78. package/dist/esm/output.d.ts.map +1 -1
  79. package/dist/esm/output.js +15 -8
  80. package/dist/esm/providers.d.ts +1 -1
  81. package/dist/esm/providers.d.ts.map +1 -1
  82. package/dist/esm/utils.js +2 -2
  83. package/dist/types/ErrorTray.d.ts +4 -4
  84. package/dist/types/ErrorTray.d.ts.map +1 -1
  85. package/dist/types/decoration.d.ts +11 -0
  86. package/dist/types/decoration.d.ts.map +1 -0
  87. package/dist/types/embed.d.ts +3 -2
  88. package/dist/types/embed.d.ts.map +1 -1
  89. package/dist/types/execute/actions.d.ts +1 -1
  90. package/dist/types/execute/actions.d.ts.map +1 -1
  91. package/dist/types/execute/busy.d.ts +24 -2
  92. package/dist/types/execute/busy.d.ts.map +1 -1
  93. package/dist/types/execute/hooks.d.ts +2 -2
  94. package/dist/types/execute/hooks.d.ts.map +1 -1
  95. package/dist/types/execute/provider.d.ts +2 -2
  96. package/dist/types/execute/provider.d.ts.map +1 -1
  97. package/dist/types/execute/selectors.d.ts.map +1 -1
  98. package/dist/types/execute/types.d.ts +1 -1
  99. package/dist/types/execute/types.d.ts.map +1 -1
  100. package/dist/types/execute/utils.d.ts.map +1 -1
  101. package/dist/types/figure.d.ts +5 -0
  102. package/dist/types/figure.d.ts.map +1 -0
  103. package/dist/types/index.d.ts +2 -0
  104. package/dist/types/index.d.ts.map +1 -1
  105. package/dist/types/jupyter.d.ts.map +1 -1
  106. package/dist/types/output.d.ts +9 -1
  107. package/dist/types/output.d.ts.map +1 -1
  108. package/dist/types/providers.d.ts +1 -1
  109. package/dist/types/providers.d.ts.map +1 -1
  110. package/package.json +11 -9
@@ -28,8 +28,16 @@ function isNotebookPayload(payload) {
28
28
  payload.cellIds.every((id) => typeof id === 'string') &&
29
29
  typeof payload.kind === 'string');
30
30
  }
31
+ function isErrorPayload(payload) {
32
+ var _a, _b;
33
+ return ((typeof payload.pageSlug === 'string' &&
34
+ typeof payload.notebookSlug === 'string' &&
35
+ payload.errors === undefined) ||
36
+ ((_b = (Array.isArray(payload.errors) &&
37
+ ((_a = payload.errors) === null || _a === void 0 ? void 0 : _a.every((error) => typeof error === 'object')))) !== null && _b !== void 0 ? _b : false));
38
+ }
31
39
  export function reducer(state, action) {
32
- var _a, _b, _c, _d, _e;
40
+ var _a, _b, _c, _d, _e, _f, _g;
33
41
  switch (action.type) {
34
42
  case 'SET_CELL_BUSY': {
35
43
  if (!isCellPayload(action.payload)) {
@@ -47,16 +55,16 @@ export function reducer(state, action) {
47
55
  return state;
48
56
  }
49
57
  const { pageSlug, notebookSlug, cellId, kind } = action.payload;
50
- const _f = state[kind], _g = pageSlug, renderBusy = _f[_g], otherRenders = __rest(_f, [typeof _g === "symbol" ? _g : _g + ""]);
58
+ const _h = state[kind], _j = pageSlug, renderBusy = _h[_j], otherRenders = __rest(_h, [typeof _j === "symbol" ? _j : _j + ""]);
51
59
  if (!renderBusy)
52
60
  return state;
53
- const _h = renderBusy, _j = notebookSlug, notebookBusy = _h[_j], otherNotebooks = __rest(_h, [typeof _j === "symbol" ? _j : _j + ""]);
61
+ const _k = renderBusy, _l = notebookSlug, notebookBusy = _k[_l], otherNotebooks = __rest(_k, [typeof _l === "symbol" ? _l : _l + ""]);
54
62
  if (!notebookBusy)
55
63
  return state;
56
64
  if (!notebookBusy[cellId])
57
65
  return state;
58
66
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
59
- const _k = notebookBusy, _l = cellId, cellBusy = _k[_l], otherCells = __rest(_k, [typeof _l === "symbol" ? _l : _l + ""]);
67
+ const _m = notebookBusy, _o = cellId, cellBusy = _m[_o], otherCells = __rest(_m, [typeof _o === "symbol" ? _o : _o + ""]);
60
68
  // remove the render if it's empty
61
69
  if (Object.keys(otherCells).length === 0 && Object.keys(otherNotebooks).length === 0) {
62
70
  return Object.assign(Object.assign({}, state), { [kind]: otherRenders });
@@ -86,19 +94,54 @@ export function reducer(state, action) {
86
94
  if (!((_e = state[kind][pageSlug]) === null || _e === void 0 ? void 0 : _e[notebookSlug]))
87
95
  return state;
88
96
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
89
- const _m = state[kind][pageSlug], _o = notebookSlug, notebookBusy = _m[_o], otherNotebooks = __rest(_m, [typeof _o === "symbol" ? _o : _o + ""]);
97
+ const _p = state[kind][pageSlug], _q = notebookSlug, notebookBusy = _p[_q], otherNotebooks = __rest(_p, [typeof _q === "symbol" ? _q : _q + ""]);
90
98
  if (Object.keys(otherNotebooks).length === 0) {
91
99
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
92
- const _p = state[kind], _q = pageSlug, renderBusy = _p[_q], otherRenders = __rest(_p, [typeof _q === "symbol" ? _q : _q + ""]);
100
+ const _r = state[kind], _s = pageSlug, renderBusy = _r[_s], otherRenders = __rest(_r, [typeof _s === "symbol" ? _s : _s + ""]);
93
101
  return Object.assign(Object.assign({}, state), { [kind]: otherRenders });
94
102
  }
95
103
  return Object.assign(Object.assign({}, state), { [kind]: Object.assign(Object.assign({}, state[kind]), { [pageSlug]: Object.assign({}, otherNotebooks) }) });
96
104
  }
105
+ case 'SET_ERROR': {
106
+ if (!isErrorPayload(action.payload)) {
107
+ console.error('SET_ERROR payload must be an error payload', action.payload);
108
+ return state;
109
+ }
110
+ const { pageSlug, notebookSlug, errors } = action.payload;
111
+ if (!errors) {
112
+ console.error('SET_ERROR payload must have errors', action.payload);
113
+ return state;
114
+ }
115
+ if (state.error[pageSlug])
116
+ return state;
117
+ if ((_f = state.error[pageSlug]) === null || _f === void 0 ? void 0 : _f[notebookSlug])
118
+ return state;
119
+ return Object.assign(Object.assign({}, state), { error: Object.assign(Object.assign({}, state.error), { [pageSlug]: Object.assign(Object.assign({}, state.error[pageSlug]), { [notebookSlug]: errors }) }) });
120
+ }
121
+ case 'CLEAR_ERROR': {
122
+ if (!isErrorPayload(action.payload)) {
123
+ console.error('CLEAR_ERROR payload must be a error payload', action.payload);
124
+ return state;
125
+ }
126
+ const { pageSlug, notebookSlug } = action.payload;
127
+ if (!state.error[pageSlug])
128
+ return state;
129
+ if (!((_g = state.error[pageSlug]) === null || _g === void 0 ? void 0 : _g[notebookSlug]))
130
+ return state;
131
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
132
+ const _t = state.error[pageSlug], _u = notebookSlug, notebookErrors = _t[_u], otherNotebooks = __rest(_t, [typeof _u === "symbol" ? _u : _u + ""]);
133
+ if (Object.keys(otherNotebooks).length > 0) {
134
+ return Object.assign(Object.assign({}, state), { error: Object.assign(Object.assign({}, state.error), { [pageSlug]: Object.assign({}, otherNotebooks) }) });
135
+ }
136
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
137
+ const _v = state.error, _w = pageSlug, renderErrors = _v[_w], otherRenders = __rest(_v, [typeof _w === "symbol" ? _w : _w + ""]);
138
+ return Object.assign(Object.assign({}, state), { error: otherRenders });
139
+ }
97
140
  }
98
141
  return state;
99
142
  }
100
143
  export function BusyScopeProvider({ children }) {
101
- const [state, dispatch] = useReducer(reducer, { execute: {}, reset: {} });
144
+ const [state, dispatch] = useReducer(reducer, { execute: {}, reset: {}, error: {} });
102
145
  const memo = React.useMemo(() => ({ state, dispatch }), [state]);
103
146
  if (typeof window !== 'undefined') {
104
147
  window.busyScopeState = memo.state;
@@ -120,7 +163,40 @@ export function useBusyScope() {
120
163
  const clearCell = useCallback((pageSlug, notebookSlug, cellId, kind) => dispatch({ type: 'CLEAR_CELL_BUSY', payload: { pageSlug, notebookSlug, cellId, kind } }), [dispatch]);
121
164
  const setNotebook = useCallback((pageSlug, notebookSlug, cellIds, kind) => dispatch({ type: 'SET_NOTEBOOK_BUSY', payload: { pageSlug, notebookSlug, cellIds, kind } }), [dispatch]);
122
165
  const clearNotebook = useCallback((pageSlug, notebookSlug, kind) => dispatch({ type: 'CLEAR_NOTEBOOK_BUSY', payload: { pageSlug, notebookSlug, kind } }), [dispatch]);
123
- return { cell, notebook, page, setCell, clearCell, setNotebook, clearNotebook };
166
+ const setError = useCallback((pageSlug, notebookSlug, errors) => dispatch({ type: 'SET_ERROR', payload: { pageSlug, notebookSlug, errors } }), [dispatch]);
167
+ const clearError = useCallback((pageSlug, notebookSlug) => dispatch({ type: 'CLEAR_ERROR', payload: { pageSlug, notebookSlug } }), [dispatch]);
168
+ return {
169
+ cell,
170
+ notebook,
171
+ page,
172
+ setCell,
173
+ clearCell,
174
+ setNotebook,
175
+ clearNotebook,
176
+ setError,
177
+ clearError,
178
+ };
179
+ }
180
+ export function useBusyErrors(pageSlug) {
181
+ const context = React.useContext(BusyScopeContext);
182
+ if (context === undefined) {
183
+ throw new Error('useBusyScope must be used within a BusyScopeProvider');
184
+ }
185
+ const { state, dispatch } = context;
186
+ const clearErrors = () => {
187
+ Object.keys(state.error[pageSlug]).forEach((notebookSlug) => {
188
+ dispatch({ type: 'CLEAR_ERROR', payload: { pageSlug, notebookSlug } });
189
+ });
190
+ };
191
+ let items;
192
+ if (Object.keys(state.error).length > 0 && state.error[pageSlug]) {
193
+ items = Object.entries(state.error[pageSlug]).map(([notebookSlug, errors]) => ({
194
+ pageSlug,
195
+ notebookSlug,
196
+ errors,
197
+ }));
198
+ }
199
+ return { items, clearErrors };
124
200
  }
125
201
  export function selectCellIsBusy(state, pageSlug, notebookSlug, cellId, kind) {
126
202
  var _a, _b;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { IdOrKey } from './types';
3
3
  import type { IThebeCell } from 'thebe-core';
4
- import { SourceFileKind } from 'myst-common';
4
+ import { SourceFileKind } from 'myst-spec-ext';
5
5
  export declare function useExecutionScope({ clearOutputsOnExecute, }?: {
6
6
  clearOutputsOnExecute?: boolean;
7
7
  }): {
@@ -44,7 +44,7 @@ export declare function useNotebookExecution(id: IdOrKey, clearOutputsOnExecute?
44
44
  * @param id
45
45
  * @returns
46
46
  */
47
- export declare function useCellExecution(id: IdOrKey): {
47
+ export declare function useCellExecution(id: IdOrKey, clearOutputsOnExecute?: boolean): {
48
48
  canCompute: boolean;
49
49
  kind: SourceFileKind;
50
50
  ready: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/execute/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAA8C,MAAM,YAAY,CAAC;AAGzF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAgB,iBAAiB,CAAC,EAChC,qBAA6B,GAC9B,GAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO;;kBAUR,MAAM;yBAsD1B,MAAM;yBAYN,MAAM;oBAxDI,MAAM;;;;;;EAgF9B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,qBAAqB,UAAQ;;;;;;;;;;;;;;;;EA2G9E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO;;;;;;;;;;;EAgE3C;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO;;;;EAc/C;AAED,wBAAgB,iBAAiB,YAOhC"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/execute/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAA8C,MAAM,YAAY,CAAC;AAGzF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,wBAAgB,iBAAiB,CAAC,EAChC,qBAA6B,GAC9B,GAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO;;kBAUR,MAAM;yBAuD1B,MAAM;yBAYN,MAAM;oBAzDI,MAAM;;;;;;EAkF9B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,qBAAqB,UAAQ;;;;;;;;;;;;;;;;EAgH9E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,qBAAqB,UAAQ;;;;;;;;;;;EAgE1E;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO;;;;EAc/C;AAED,wBAAgB,iBAAiB,YAOhC"}
@@ -11,7 +11,7 @@ import React, { useCallback } from 'react';
11
11
  import { ExecuteScopeContext } from './provider';
12
12
  import { useBusyScope } from './busy';
13
13
  import { findErrors, useThebeConfig } from 'thebe-react';
14
- import { SourceFileKind } from 'myst-common';
14
+ import { SourceFileKind } from 'myst-spec-ext';
15
15
  import { selectNotebookForPage } from './selectors';
16
16
  export function useExecutionScope({ clearOutputsOnExecute = false, } = {}) {
17
17
  var _a;
@@ -34,6 +34,7 @@ export function useExecutionScope({ clearOutputsOnExecute = false, } = {}) {
34
34
  const execute = (slug) => {
35
35
  // set busy
36
36
  Object.entries(state.pages[slug].scopes).forEach(([notebookSlug, { notebook }]) => {
37
+ busy.clearError(slug, notebookSlug);
37
38
  busy.setNotebook(slug, notebookSlug, notebook.code.map((c) => c.id), 'execute');
38
39
  });
39
40
  if (clearOutputsOnExecute) {
@@ -78,6 +79,7 @@ export function useExecutionScope({ clearOutputsOnExecute = false, } = {}) {
78
79
  const resetAll = useCallback((pageSlug) => {
79
80
  var _a;
80
81
  Object.entries((_a = state.pages[pageSlug]) === null || _a === void 0 ? void 0 : _a.scopes).forEach(([notebookSlug, { notebook, session }]) => {
82
+ busy.clearError(pageSlug, notebookSlug);
81
83
  busy.setNotebook(pageSlug, notebookSlug, notebook.code.map((c) => c.id), 'reset');
82
84
  setTimeout(() => {
83
85
  var _a;
@@ -126,6 +128,7 @@ export function useNotebookExecution(id, clearOutputsOnExecute = false) {
126
128
  }
127
129
  const execute = () => {
128
130
  const nb = selectNotebookForPage(state, pageSlug, notebookSlug);
131
+ busy.clearError(pageSlug, notebookSlug);
129
132
  // set busy
130
133
  busy.setNotebook(pageSlug, notebookSlug, nb.code.map((c) => c.id), 'execute');
131
134
  if (clearOutputsOnExecute)
@@ -142,8 +145,11 @@ export function useNotebookExecution(id, clearOutputsOnExecute = false) {
142
145
  // execute all cells on the notebooks
143
146
  const execReturns = yield nb.executeAll(true);
144
147
  const errs = findErrors(execReturns);
145
- if (errs != null)
146
- console.error('errors', errs); // TODO: handle errors
148
+ if (errs != null) {
149
+ console.error('an error occurred during notebook execution');
150
+ busy.setError(pageSlug, notebookSlug, errs);
151
+ busy.clearNotebook(pageSlug, notebookSlug, 'execute');
152
+ }
147
153
  config === null || config === void 0 ? void 0 : config.events.off('status', handler);
148
154
  }), 100);
149
155
  };
@@ -160,6 +166,7 @@ export function useNotebookExecution(id, clearOutputsOnExecute = false) {
160
166
  */
161
167
  const reset = useCallback(() => {
162
168
  const nb = selectNotebookForPage(state, pageSlug, notebookSlug);
169
+ busy.clearError(pageSlug, notebookSlug);
163
170
  busy.setNotebook(pageSlug, notebookSlug, nb.code.map((c) => c.id), 'reset');
164
171
  setTimeout(() => {
165
172
  var _a, _b;
@@ -187,7 +194,7 @@ export function useNotebookExecution(id, clearOutputsOnExecute = false) {
187
194
  * @param id
188
195
  * @returns
189
196
  */
190
- export function useCellExecution(id) {
197
+ export function useCellExecution(id, clearOutputsOnExecute = false) {
191
198
  var _a, _b, _c, _d;
192
199
  const busy = useBusyScope();
193
200
  const context = React.useContext(ExecuteScopeContext);
@@ -213,7 +220,8 @@ export function useCellExecution(id) {
213
220
  }
214
221
  // set busy
215
222
  busy.setCell(pageSlug, notebookSlug, cell.id, 'execute');
216
- cell.clear();
223
+ if (clearOutputsOnExecute)
224
+ cell.clear();
217
225
  // let busy state update prior to launching execute
218
226
  setTimeout(() => {
219
227
  if (!cell)
@@ -1,5 +1,5 @@
1
- import type { Dependency } from 'myst-common';
2
- import { SourceFileKind } from 'myst-common';
1
+ import type { Dependency } from 'myst-spec-ext';
2
+ import { SourceFileKind } from 'myst-spec-ext';
3
3
  import type { Root } from 'mdast';
4
4
  import React from 'react';
5
5
  import type { ExecuteScopeAction } from './actions';
@@ -1 +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,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,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;IAC5B,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;KAAE,CAAC;CAC1C,CAAC;AA8DF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAAE,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC,2CAiGxD"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/execute/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,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;AASvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,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;IAC5B,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;KAAE,CAAC;CAC1C,CAAC;AA8DF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAAE,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC,2CAiGxD"}
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { SourceFileKind } from 'myst-common';
2
+ import { SourceFileKind } from 'myst-spec-ext';
3
3
  import React, { useEffect, useReducer, useRef } from 'react';
4
4
  import { selectAll } from 'unist-util-select';
5
5
  import { reducer } from './reducer';
6
6
  import { selectAreAllDependenciesReady, selectDependenciesToFetch, selectScopeNotebooksToBuild, selectSessionsToStart, } from './selectors';
7
7
  import { MdastFetcher, NotebookBuilder, ServerMonitor, SessionStarter } from './leaf';
8
- import { useCanCompute } from '..';
8
+ import { useCanCompute } from '../providers';
9
9
  export const ExecuteScopeContext = React.createContext(undefined);
10
10
  function useScopeNavigate({ contents: { slug, kind, mdast, dependencies }, state, dispatch, }) {
11
11
  useEffect(() => {
@@ -9,7 +9,7 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import { SourceFileKind } from 'myst-common';
12
+ import { SourceFileKind } from 'myst-spec-ext';
13
13
  import { isAddMdastPayload, isAddNotebookPayload, isAddSessionPayload, isBuildStatusPayload, isNavigatePayload, isSlugPayload, } from './actions';
14
14
  export function reducer(state, action) {
15
15
  var _a;
@@ -1 +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,QAAQ,EAAE,MAAM;;EAE5E;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,oDAGrB;AAED,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"}
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,QAAQ,EAAE,MAAM;;EAE5E;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,oDAGrB;AAED,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,WAInF;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAKrF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,WAMjF"}
@@ -1,4 +1,4 @@
1
- import { SourceFileKind } from 'myst-common';
1
+ import { SourceFileKind } from 'myst-spec-ext';
2
2
  export function selectScopeForPage(state, pageSlug) {
3
3
  var _a, _b;
4
4
  return (_b = (_a = state.pages[pageSlug]) === null || _a === void 0 ? void 0 : _a.scopes) !== null && _b !== void 0 ? _b : {};
@@ -34,11 +34,11 @@ export function selectDependenciesToFetch(state) {
34
34
  .reduce((targets, [slug]) => [
35
35
  ...targets,
36
36
  ...state.pages[slug].dependencies
37
- .filter((d) => { var _a; return !state.mdast[(_a = d.slug) !== null && _a !== void 0 ? _a : d.url]; })
37
+ .filter((d) => { var _a; return !state.mdast[((_a = d.slug) !== null && _a !== void 0 ? _a : d.url)]; })
38
38
  .map((d) => {
39
39
  var _a;
40
40
  return ({
41
- slug: (_a = d.slug) !== null && _a !== void 0 ? _a : d.url,
41
+ slug: ((_a = d.slug) !== null && _a !== void 0 ? _a : d.url),
42
42
  url: d.url,
43
43
  });
44
44
  }),
@@ -57,7 +57,7 @@ function makeSelectScopeEventStatus(statusName) {
57
57
  var _a;
58
58
  return ({
59
59
  pageSlug: slug,
60
- notebookSlug: (_a = d.slug) !== null && _a !== void 0 ? _a : d.url,
60
+ notebookSlug: ((_a = d.slug) !== null && _a !== void 0 ? _a : d.url),
61
61
  });
62
62
  }));
63
63
  return [...all, ...targets];
@@ -68,14 +68,14 @@ export const selectScopeNotebooksToBuild = makeSelectScopeEventStatus('build-not
68
68
  export const selectSessionsToStart = makeSelectScopeEventStatus('start-session');
69
69
  export function selectAreAllDependenciesReady(state, slug) {
70
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]; });
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
72
  }
73
73
  export function selectAreAllNotebookScopesBuilt(state, slug) {
74
74
  const rendering = state.pages[slug];
75
- 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]; });
75
+ 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)]; });
76
76
  }
77
77
  export function selectAreAllSessionsStarted(state, slug) {
78
78
  const rendering = state.pages[slug];
79
79
  // TODO is this working??
80
- 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); });
80
+ 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); });
81
81
  }
@@ -1,5 +1,5 @@
1
1
  import type { Root } from 'mdast';
2
- import type { SourceFileKind, Dependency } from 'myst-common';
2
+ import type { SourceFileKind, Dependency } from 'myst-spec-ext';
3
3
  import type { IRenderMimeRegistry, ThebeNotebook, ThebeSession } from 'thebe-core';
4
4
  export type BuildStatus = 'pending' | 'fetching' | 'build-notebooks' | 'wait-for-server' | 'start-session' | 'error';
5
5
  export type IdOrKey = string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/execute/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnF,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,UAAU,GACV,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,GACf,OAAO,CAAC;AAEZ,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAC5B,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACxF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,IAAI,EAAE,IAAI,CAAC;SACZ,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,CAAC,QAAQ,EAAE,MAAM,GAAG;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,cAAc,CAAC;YACrB,UAAU,EAAE,OAAO,CAAC;YACpB,YAAY,EAAE,UAAU,EAAE,CAAC;YAC3B,WAAW,EAAE,UAAU,EAAE,CAAC;YAC1B,KAAK,EAAE,OAAO,CAAC;YACf,MAAM,EAAE;gBACN,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,CAAC;aACxC,CAAC;SACH,CAAC;KACH,CAAC;IACF,MAAM,EAAE;QACN,CAAC,QAAQ,EAAE,MAAM,GAAG;YAClB,MAAM,EAAE,WAAW,CAAC;SACrB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,mBAAmB,CAAC;IAChC,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/execute/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnF,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,UAAU,GACV,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,GACf,OAAO,CAAC;AAEZ,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAC5B,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACxF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,IAAI,EAAE,IAAI,CAAC;SACZ,CAAC;KACH,CAAC;IACF,KAAK,EAAE;QACL,CAAC,QAAQ,EAAE,MAAM,GAAG;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,cAAc,CAAC;YACrB,UAAU,EAAE,OAAO,CAAC;YACpB,YAAY,EAAE,UAAU,EAAE,CAAC;YAC3B,WAAW,EAAE,UAAU,EAAE,CAAC;YAC1B,KAAK,EAAE,OAAO,CAAC;YACf,MAAM,EAAE;gBACN,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,CAAC;aACxC,CAAC;SACH,CAAC;KACH,CAAC;IACF,MAAM,EAAE;QACN,CAAC,QAAQ,EAAE,MAAM,GAAG;YAClB,MAAM,EAAE,WAAW,CAAC;SACrB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,mBAAmB,CAAC;IAChC,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/execute/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,SAAS,CAAC;AAExD;;;;;;;;;;;;;;;;;GAiBG;AAEH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,mBAAmB,oDAoDhC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/execute/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,SAAS,CAAC;AAExD;;;;;;;;;;;;;;;;;GAiBG;AAEH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,mBAAmB,oDAuDhC"}
@@ -37,20 +37,21 @@ export function notebookFromMdast(core, config, pageSlug, notebookSlug, mdast, i
37
37
  notebookSlug,
38
38
  cellId: block.key,
39
39
  };
40
- idkmap[block.key] = target;
41
- idkmap[codeCell.key] = target;
42
- idkmap[output.key] = target;
43
- // include block labels to enable lookup by from embedded blocks
44
- if (block.label)
45
- idkmap[block.label] = target;
40
+ idkmap[block.key] = target; // can reference from block in notebook views
41
+ idkmap[output.id] = target; // can reference from output in article views
42
+ // include identifiers to enable lookup by (normalized) labels
46
43
  if (block.identifier)
47
44
  idkmap[block.identifier] = target;
45
+ if (codeCell.identifier)
46
+ idkmap[codeCell.identifier] = target;
47
+ if (output.identifier)
48
+ idkmap[output.identifier] = target;
48
49
  return new core.ThebeCodeCell(target.cellId, notebook.id, (_a = codeCell.value) !== null && _a !== void 0 ? _a : '', config, (_b = block.data) !== null && _b !== void 0 ? _b : {}, notebook.rendermime);
49
50
  }
50
51
  else {
51
52
  // assume content - concatenate it
52
53
  // TODO inject cell metadata
53
- const cell = new core.ThebeNonExecutableCell(block.key, notebook.id, block.children.reduce((acc, child) => { var _a; return acc + '\n' + ((_a = child.value) !== null && _a !== void 0 ? _a : ''); }, ''), (_c = block.data) !== null && _c !== void 0 ? _c : {}, notebook.rendermime);
54
+ const cell = new core.ThebeMarkdownCell(block.key, notebook.id, block.children.reduce((acc, child) => { var _a; return acc + '\n' + ((_a = child.value) !== null && _a !== void 0 ? _a : ''); }, ''), (_c = block.data) !== null && _c !== void 0 ? _c : {}, notebook.rendermime);
54
55
  return cell;
55
56
  }
56
57
  });
@@ -0,0 +1,5 @@
1
+ import { type GenericNode } from 'myst-common';
2
+ export declare function Figure({ node }: {
3
+ node: GenericNode;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=figure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figure.d.ts","sourceRoot":"","sources":["../../src/figure.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,2CAoBrD"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { SourceFileKind } from 'myst-spec-ext';
3
+ import { DEFAULT_RENDERERS, MyST } from 'myst-to-react';
4
+ import { OutputDecoration } from './decoration';
5
+ export function Figure({ node }) {
6
+ var _a, _b, _c, _d, _e, _f;
7
+ const { container: Container } = DEFAULT_RENDERERS;
8
+ const isFromJupyer = ((_a = node.source) === null || _a === void 0 ? void 0 : _a.kind) === SourceFileKind.Notebook;
9
+ const output = (_b = node.children) === null || _b === void 0 ? void 0 : _b.find((child) => child.type === 'output');
10
+ if (isFromJupyer && !!output) {
11
+ const placeholder = (_c = node.children) === null || _c === void 0 ? void 0 : _c.find((child) => child.type === 'image' && child.placeholder);
12
+ const others = (_d = node.children) === null || _d === void 0 ? void 0 : _d.filter((child) => !(child.type === 'image' && child.placeholder));
13
+ return (_jsx(OutputDecoration, { outputId: output.id, placeholder: placeholder, title: (_e = node.source) === null || _e === void 0 ? void 0 : _e.title, url: (_f = node.source) === null || _f === void 0 ? void 0 : _f.url, children: _jsx(MyST, { ast: others }) }, node.key));
14
+ }
15
+ return _jsx(Container, { node: node });
16
+ }
@@ -1,8 +1,10 @@
1
1
  import { Embed } from './embed';
2
2
  import { Output } from './output';
3
+ import { Figure } from './figure';
3
4
  declare const OUTPUT_RENDERERS: {
4
5
  output: typeof Output;
5
6
  embed: typeof Embed;
7
+ container: typeof Figure;
6
8
  };
7
9
  export * from './BinderBadge';
8
10
  export * from './ErrorTray';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,QAAA,MAAM,gBAAgB;;;CAGrB,CAAC;AAEF,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAE3B,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,QAAA,MAAM,gBAAgB;;;;CAIrB,CAAC;AAEF,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAE3B,eAAe,gBAAgB,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { Embed } from './embed';
2
2
  import { Output } from './output';
3
+ import { Figure } from './figure';
3
4
  const OUTPUT_RENDERERS = {
4
5
  output: Output,
5
6
  embed: Embed,
7
+ container: Figure,
6
8
  };
7
9
  export * from './BinderBadge';
8
10
  export * from './ErrorTray';
@@ -1 +1 @@
1
- {"version":3,"file":"jupyter.d.ts","sourceRoot":"","sources":["../../src/jupyter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAmE3C,eAAO,MAAM,cAAc;QACD,MAAM;aAAW,cAAc,EAAE;8CAmD1D,CAAC"}
1
+ {"version":3,"file":"jupyter.d.ts","sourceRoot":"","sources":["../../src/jupyter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAsF3C,eAAO,MAAM,cAAc;QACD,MAAM;aAAW,cAAc,EAAE;8CAwD1D,CAAC"}
@@ -3,17 +3,22 @@ import React, { useEffect, useRef, useState } from 'react';
3
3
  import { useFetchAnyTruncatedContent } from './hooks';
4
4
  import { convertToIOutputs } from 'nbtx';
5
5
  import { fetchAndEncodeOutputImages } from './convertImages';
6
- import { SourceFileKind } from 'myst-common';
6
+ import { SourceFileKind } from 'myst-spec-ext';
7
7
  import { useXRefState } from '@myst-theme/providers';
8
8
  import { useThebeLoader } from 'thebe-react';
9
9
  import { useCellExecution } from './execute';
10
+ import { usePlaceholder } from './decoration';
11
+ import { MyST } from 'myst-to-react';
12
+ import classNames from 'classnames';
10
13
  function ActiveOutputRenderer({ id, initialData, core, }) {
14
+ var _a;
11
15
  const exec = useCellExecution(id);
16
+ const placeholder = usePlaceholder();
12
17
  const ref = useRef(null);
13
18
  useEffect(() => {
14
19
  var _a, _b, _c;
15
20
  if (!ref.current || !(exec === null || exec === void 0 ? void 0 : exec.cell)) {
16
- console.debug(`Jupyter: No cell ref available for cell ${(_a = exec === null || exec === void 0 ? void 0 : exec.cell) === null || _a === void 0 ? void 0 : _a.id}`);
21
+ console.debug(`Jupyter: No cell ref available for cell ${id}:${(_a = exec === null || exec === void 0 ? void 0 : exec.cell) === null || _a === void 0 ? void 0 : _a.id}`);
17
22
  return;
18
23
  }
19
24
  const verb = exec.cell.isAttachedToDOM ? 'reattaching' : 'attaching';
@@ -24,12 +29,14 @@ function ActiveOutputRenderer({ id, initialData, core, }) {
24
29
  });
25
30
  exec.cell.attachToDOM(ref.current);
26
31
  if (exec.cell.executionCount == null) {
27
- exec.cell.initOutputs((_c = core === null || core === void 0 ? void 0 : core.stripWidgets(initialData)) !== null && _c !== void 0 ? _c : initialData);
32
+ exec.cell.initOutputs((_c = core === null || core === void 0 ? void 0 : core.stripWidgets(initialData, true, placeholder ? () => '' : undefined)) !== null && _c !== void 0 ? _c : initialData);
28
33
  }
29
34
  }, [ref === null || ref === void 0 ? void 0 : ref.current, exec === null || exec === void 0 ? void 0 : exec.cell]);
30
- return _jsx("div", { ref: ref, "data-thebe-active-ref": "true", className: "relative" });
35
+ const executed = ((_a = exec === null || exec === void 0 ? void 0 : exec.cell) === null || _a === void 0 ? void 0 : _a.executionCount) != null;
36
+ console.debug(`Jupyter: Cell ${id} executed: ${executed}; Show output: ${executed || !placeholder}`);
37
+ return (_jsxs("div", { children: [_jsx("div", { ref: ref, "data-thebe-active-ref": "true", className: classNames('relative', { 'invisible h-0': !executed && placeholder }) }), placeholder && !executed && _jsx(MyST, { ast: placeholder })] }));
31
38
  }
32
- function PassiveOutputRenderer({ id, data, core, kind, }) {
39
+ function PassiveOutputRenderer({ id, data, core, }) {
33
40
  const cell = useRef(new core.PassiveCellRenderer(id, undefined, undefined));
34
41
  const ref = useRef(null);
35
42
  useEffect(() => {
@@ -47,6 +54,7 @@ export const JupyterOutputs = React.memo(({ id, outputs }) => {
47
54
  const { data, error } = useFetchAnyTruncatedContent(outputs);
48
55
  const [fullOutputs, setFullOutputs] = useState(null);
49
56
  const exec = useCellExecution(id);
57
+ const placeholder = usePlaceholder();
50
58
  useEffect(() => {
51
59
  if (core)
52
60
  return;
@@ -67,5 +75,8 @@ export const JupyterOutputs = React.memo(({ id, outputs }) => {
67
75
  if (!inCrossRef && (exec === null || exec === void 0 ? void 0 : exec.ready)) {
68
76
  return (_jsxs("div", { children: [!fullOutputs && _jsx("div", { className: "p-2.5", children: "Fetching full output data..." }), core && fullOutputs && (_jsx(ActiveOutputRenderer, { id: id, initialData: fullOutputs, core: core }, id))] }));
69
77
  }
78
+ if (placeholder) {
79
+ return _jsx(MyST, { ast: placeholder });
80
+ }
70
81
  return (_jsxs("div", { children: [!fullOutputs && _jsx("div", { className: "p-2.5", children: "Loading..." }), fullOutputs && core && (_jsx(PassiveOutputRenderer, { id: id, data: fullOutputs, core: core, kind: SourceFileKind.Notebook }))] }));
71
82
  });
@@ -3,5 +3,13 @@ import type { MinifiedOutput } from 'nbtx';
3
3
  export declare const DIRECT_OUTPUT_TYPES: Set<string>;
4
4
  export declare const DIRECT_MIME_TYPES: Set<string>;
5
5
  export declare function allOutputsAreSafe(outputs: MinifiedOutput[], directOutputTypes: Set<string>, directMimeTypes: Set<string>): boolean;
6
- export declare function Output(node: GenericNode): import("react/jsx-runtime").JSX.Element;
6
+ export declare function JupyterOutput({ outputId, identifier, data, align, }: {
7
+ outputId: string;
8
+ identifier?: string;
9
+ data: MinifiedOutput[];
10
+ align?: 'left' | 'center' | 'right';
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ export declare function Output({ node }: {
13
+ node: GenericNode;
14
+ }): import("react/jsx-runtime").JSX.Element;
7
15
  //# sourceMappingURL=output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/output.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,MAAM,CAAC;AAO/D,eAAO,MAAM,mBAAmB,aAA+B,CAAC;AAEhE,eAAO,MAAM,iBAAiB,aAMb,CAAC;AAElB,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EAAE,EACzB,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC9B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,WAY7B;AA6CD,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,2CAYvC"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/output.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,MAAM,CAAC;AAS/D,eAAO,MAAM,mBAAmB,aAA+B,CAAC;AAEhE,eAAO,MAAM,iBAAiB,aAMb,CAAC;AAElB,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EAAE,EACzB,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC9B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,WAY7B;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CACrC,2CAqCA;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,2CASrD"}
@@ -5,6 +5,8 @@ import { SafeOutputs } from './safe';
5
5
  import { JupyterOutputs } from './jupyter';
6
6
  import { useMemo } from 'react';
7
7
  import { useCellExecution } from './execute';
8
+ import { usePlaceholder } from './decoration';
9
+ import { MyST } from 'myst-to-react';
8
10
  export const DIRECT_OUTPUT_TYPES = new Set(['stream', 'error']);
9
11
  export const DIRECT_MIME_TYPES = new Set([
10
12
  KnownCellOutputMimeTypes.TextPlain,
@@ -25,24 +27,29 @@ export function allOutputsAreSafe(outputs, directOutputTypes, directMimeTypes) {
25
27
  return flag && safe;
26
28
  }, true);
27
29
  }
28
- function JupyterOutput({ nodeKey, nodeType, identifier, data, align, }) {
29
- const { ready } = useCellExecution(nodeKey);
30
+ export function JupyterOutput({ outputId, identifier, data, align, }) {
31
+ const { ready } = useCellExecution(outputId);
30
32
  const outputs = data;
31
33
  const allSafe = useMemo(() => allOutputsAreSafe(outputs, DIRECT_OUTPUT_TYPES, DIRECT_MIME_TYPES), [outputs]);
34
+ const placeholder = usePlaceholder();
32
35
  let component;
33
36
  if (allSafe && !ready) {
34
- component = _jsx(SafeOutputs, { keyStub: nodeKey, outputs: outputs });
37
+ if (placeholder && (!outputs || outputs.length === 0)) {
38
+ if (placeholder) {
39
+ return _jsx(MyST, { ast: placeholder });
40
+ }
41
+ }
42
+ component = _jsx(SafeOutputs, { keyStub: outputId, outputs: outputs });
35
43
  }
36
44
  else {
37
- component = _jsx(JupyterOutputs, { id: nodeKey, outputs: outputs });
45
+ component = _jsx(JupyterOutputs, { id: outputId, outputs: outputs });
38
46
  }
39
- return (_jsx("figure", { id: identifier || undefined, "data-mdast-node-type": nodeType, "data-mdast-node-id": nodeKey, className: classNames('max-w-full overflow-visible m-0 group not-prose relative', {
47
+ return (_jsx("figure", { id: identifier || undefined, "data-mdast-node-id": outputId, className: classNames('max-w-full overflow-y-visible overflow-x-auto m-0 group not-prose relative', {
40
48
  'text-left': !align || align === 'left',
41
49
  'text-center': align === 'center',
42
50
  'text-right': align === 'right',
43
51
  }), children: component }));
44
52
  }
45
- export function Output(node) {
46
- // Note, NodeRenderer's can't have hooks in it directly!
47
- return (_jsx(JupyterOutput, { nodeKey: node.key, nodeType: node.type, identifier: node.identifier, align: node.align, data: node.data }, node.key));
53
+ export function Output({ node }) {
54
+ return (_jsx(JupyterOutput, { outputId: node.id, identifier: node.identifier, align: node.align, data: node.data }));
48
55
  }
@@ -1,4 +1,4 @@
1
- import type { SourceFileKind } from 'myst-common';
1
+ import type { SourceFileKind } from 'myst-spec-ext';
2
2
  import React from 'react';
3
3
  import type { Root } from 'mdast';
4
4
  export declare function useComputeOptions(): {
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/providers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAIlC,wBAAgB,iBAAiB;;;;;;;;;;EAuBhC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAA;CAAE,WAGhG;AAED,wBAAgB,6BAA6B,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,iBAAiB,2CAalF;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;CACb,CAAC"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/providers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAIlC,wBAAgB,iBAAiB;;;;;;;;;;EAuBhC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAA;CAAE,WAGhG;AAED,wBAAgB,6BAA6B,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,iBAAiB,2CAalF;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;CACb,CAAC"}
package/dist/esm/utils.js CHANGED
@@ -48,7 +48,7 @@ export function thebeFrontmatterToOptions(fm, githubBadgeUrl, binderBadgeUrl) {
48
48
  thebeOptions.savedSessionOptions = { enabled: false };
49
49
  }
50
50
  // handle thebe.local.*
51
- // as local OVERIDES other binder and server settings, handle these first
51
+ // as local OVERRIDES other binder and server settings, handle these first
52
52
  // TODO need to expose NODE_ENV somehow via a loader
53
53
  let NODE_ENV = 'development';
54
54
  if (typeof window !== 'undefined') {
@@ -71,7 +71,7 @@ export function thebeFrontmatterToOptions(fm, githubBadgeUrl, binderBadgeUrl) {
71
71
  return thebeOptions;
72
72
  // else just fall through & return - TODO return early?
73
73
  }
74
- // handle additional optons
74
+ // handle additional options
75
75
  if (kernelName) {
76
76
  thebeOptions.kernelOptions = {
77
77
  kernelName: kernelName,