@marimo-team/islands 0.25.3-dev4 → 0.25.3-dev40
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/{ConnectedDataExplorerComponent-CNSxdKyJ.js → ConnectedDataExplorerComponent-COS3f8io.js} +14 -14
- package/dist/{ErrorBoundary-CuU5CuVr.js → ErrorBoundary-C7__jAZL.js} +9 -9
- package/dist/{abnfDiagram-VCTEODGH-DQDjNXt3.js → abnfDiagram-VCTEODGH-DQ4bKxYa.js} +2 -2
- package/dist/any-language-editor-DQItQSua.js +75 -0
- package/dist/{architectureDiagram-5GKGNRK7-Nmls7Wxn.js → architectureDiagram-5GKGNRK7-BA7-SI7Q.js} +1 -1
- package/dist/{arrays-CN1djC4k.js → arrays-R6JsImiT.js} +8 -0
- package/dist/{button-CvjkwdSk.js → button-BxB3RDjN.js} +1 -1
- package/dist/{capabilities-CQ5IjhzL.js → capabilities-BgR0osfN.js} +2 -2
- package/dist/{chat-ui-BDpymeoe.js → chat-ui-DGpBSln7.js} +1152 -1153
- package/dist/{check-EDwSwP89.js → check-C209OH-W.js} +1 -1
- package/dist/{chunk-IMKFNOWR-CoIFEo-1.js → chunk-IMKFNOWR-DPY3kqOV.js} +1 -1
- package/dist/{chunk-SHT3W25Y-lHiGx3ZC.js → chunk-SHT3W25Y-C14Ikodf.js} +1 -1
- package/dist/{chunk-SVP7TREG-BvsHIrY_.js → chunk-SVP7TREG-BKu0HO4I.js} +1 -1
- package/dist/{chunk-TICWLB2K-BC8YIm_n.js → chunk-TICWLB2K-iJDDWGtE.js} +1 -1
- package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
- package/dist/{classDiagram-ZZMXUADV-Bt98lkkv.js → classDiagram-ZZMXUADV-HuJXQI0F.js} +2 -2
- package/dist/{classDiagram-v2-VYDZK3BY-D9bfbcC3.js → classDiagram-v2-VYDZK3BY-CpmmpTbC.js} +2 -2
- package/dist/{code-visibility-Lu0dkrFO.js → code-visibility-DO4MlViW.js} +17 -17
- package/dist/{common-DiWGWDIM.js → common-Ci7TC3e0.js} +6683 -6454
- package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-L-mFk59e.js} +3 -3
- package/dist/{cynefinDiagram-5FMLGOSQ-CgWra7wt.js → cynefinDiagram-5FMLGOSQ-uh0puAW2.js} +1 -1
- package/dist/{dagre-GXQ25YYZ-CFZ8-35c.js → dagre-GXQ25YYZ-4LBeAAMz.js} +1 -1
- package/dist/{data-grid-overlay-editor-ga7ytgbj.js → data-grid-overlay-editor-DpH_AKdC.js} +5 -5
- package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-lCNQrW7d.js → diagram-S7CK7UJ4-BXPmZ2sX.js} +1 -1
- package/dist/{diagram-UQ7AKVKN-CQPQ6pP_.js → diagram-UQ7AKVKN--Xz9UNpC.js} +1 -1
- package/dist/{diagram-VX7I27RA-Cf3b0llz.js → diagram-VX7I27RA-rt8VIRNT.js} +1 -1
- package/dist/{diagram-Z3DM3KII-Bt4QLrpn.js → diagram-Z3DM3KII-Cs1GqfDD.js} +1 -1
- package/dist/{dialog-CEBFZNyc.js → dialog-CDbPtWUD.js} +25 -25
- package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
- package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-ugNoZmKx.js} +828 -828
- package/dist/{ebnfDiagram-PWID7BFC-D3NAyPFY.js → ebnfDiagram-PWID7BFC-CgTsgbmZ.js} +2 -2
- package/dist/{erDiagram-RLTQ6QDP-Tlu09_Nm.js → erDiagram-RLTQ6QDP-CFoADGzT.js} +1 -1
- package/dist/{error-banner-Da600cwz.js → error-banner-DMIrHA-R.js} +27 -22
- package/dist/{cells-C8iCYvLU.js → error-entries-D576fzV9.js} +1378 -1322
- package/dist/{feedback-button-DQA-pzxi.js → feedback-button-BV5AJ3nl.js} +122 -123
- package/dist/{flowDiagram-HODETNUW-CAYbpJmV.js → flowDiagram-HODETNUW-BM2lvKuH.js} +2 -2
- package/dist/{formats-BGh2thRc.js → formats-DIVMVjeV.js} +3 -3
- package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
- package/dist/{glide-data-editor-Bv75MH6g.js → glide-data-editor-CRK-O0KE.js} +370 -368
- package/dist/{glide-utils-DJyqh0EM.js → glide-utils-Q2ZsuA3h.js} +16 -16
- package/dist/{globals-EDQGFIvi.js → globals-H_ILLmr7.js} +3 -3
- package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
- package/dist/{html-to-image-CZY1pIZH.js → html-to-image-D3m5Ob5H.js} +69 -69
- package/dist/{infoDiagram-27XIBGKW-XrDxhr0x.js → infoDiagram-27XIBGKW-Crwjiywp.js} +1 -1
- package/dist/{ishikawaDiagram-5VMMS53U-CD1muzov.js → ishikawaDiagram-5VMMS53U-D4US2ShV.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-Dg9W142_.js → kanban-definition-UXKFOSKX-Bk097CUX.js} +1 -1
- package/dist/{label-BDKF3Afc.js → label-CuEjBqYP.js} +2 -2
- package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
- package/dist/{loader-BQOfjTIJ.js → loader-Bm8cy3e8.js} +12 -12
- package/dist/main.js +2696 -2646
- package/dist/{mermaid-CiAXjLpA.js → mermaid-6EkeBlhr.js} +38 -38
- package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
- package/dist/{mindmap-definition-YA3MSWOX-DgCidgYJ.js → mindmap-definition-YA3MSWOX-DmORzfXQ.js} +1 -1
- package/dist/{number-overlay-editor-BCP3MxhC.js → number-overlay-editor-BQ2UqdED.js} +3 -3
- package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
- package/dist/{once-BtE-wKRL.js → once-eG8Vmvjd.js} +1 -1
- package/dist/{pegDiagram-XKGWAZYB-coOYYKB6.js → pegDiagram-XKGWAZYB-DT5TL02S.js} +2 -2
- package/dist/{pieDiagram-E7YTZNPT-BnXTc3bj.js → pieDiagram-E7YTZNPT-B1NwGcuH.js} +1 -1
- package/dist/precisionRound-DhAzeRcm.js +49 -0
- package/dist/{process-output-e4jj9Ijt.js → process-output-C6qc7hPS.js} +5 -5
- package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
- package/dist/{railroadDiagram-O6MQD6OU-B28-u83n.js → railroadDiagram-O6MQD6OU-BxoycdEu.js} +2 -2
- package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
- package/dist/{requirementDiagram-BXWQKSXE-CdYCTMu0.js → requirementDiagram-BXWQKSXE-DHq_eRrm.js} +1 -1
- package/dist/{reveal-component-DO5BJB9l.js → reveal-component-Cs-0GwxY.js} +10 -10
- package/dist/{select-BButFi-d.js → select-D2iqeJYk.js} +200 -200
- package/dist/{sequenceDiagram-WJ2MYXX4-CM3aRAe_.js → sequenceDiagram-WJ2MYXX4-Ba11BAOu.js} +1 -1
- package/dist/{spec-BwarBpUJ.js → spec-BCCcvWPS.js} +4 -4
- package/dist/{stateDiagram-D77RDMKH-DOZUMVj8.js → stateDiagram-D77RDMKH-OHQbvkbP.js} +2 -2
- package/dist/{stateDiagram-v2-MP3YSRHH-CISYxma6.js → stateDiagram-v2-MP3YSRHH-BlIquvFJ.js} +2 -2
- package/dist/style.css +1 -1
- package/dist/{swimlanes-42K2YHIH-BkSppxp8.js → swimlanes-42K2YHIH-DSlitS4s.js} +1 -1
- package/dist/{swimlanesDiagram-VR7AAH4N-c8G5pGxC.js → swimlanesDiagram-VR7AAH4N-ClwuzFNO.js} +2 -2
- package/dist/{swiper-component-DKntyn8p.js → swiper-component-DfhRvAFi.js} +2 -2
- package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
- package/dist/{timeline-definition-24CTP7MA-CaMQayqK.js → timeline-definition-24CTP7MA-hAzc5VkT.js} +1 -1
- package/dist/toDate-CSY-j1Fi.js +1185 -0
- package/dist/{toast-B9UMEi8u.js → toast-DxVfYlCp.js} +222 -222
- package/dist/{tooltip-BO1REbqs.js → tooltip-BCntm-jf.js} +52 -52
- package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-BhXhsNLV.js} +2 -2
- package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-BbuzBAUp.js} +15 -14
- package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-6AHbIR-J.js} +2 -2
- package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-da5A3c-Y.js} +1 -1
- package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-BkdeVdXC.js} +1 -1
- package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-C3nT1kwI.js} +3 -3
- package/dist/{useTheme-CRnjkku0.js → useTheme-BC8Lof0B.js} +87 -87
- package/dist/{vega-component-DG29TAB7.js → vega-component-Df45z17m.js} +147 -147
- package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
- package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
- package/dist/{vennDiagram-4TSXK5OY-CF8pfaK3.js → vennDiagram-4TSXK5OY-CINKaJgr.js} +1 -1
- package/dist/{wardleyDiagram-VM6X3IG4-dGPu39d-.js → wardleyDiagram-VM6X3IG4-KG2tlXg_.js} +1 -1
- package/dist/{xychartDiagram-S5SC5T6Z-CP6-9q56.js → xychartDiagram-S5SC5T6Z-XIH5cwgI.js} +2 -2
- package/package.json +4 -2
- package/src/__tests__/fixtures/{pair-preview.ts → pair-config.ts} +3 -2
- package/src/__tests__/mount.test.ts +28 -8
- package/src/components/app-config/ai-config.tsx +5 -1
- package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
- package/src/components/data-table/__tests__/export-actions.test.tsx +329 -6
- package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
- package/src/components/data-table/columns.tsx +2 -1
- package/src/components/data-table/date-popover.tsx +6 -4
- package/src/components/data-table/export-actions.tsx +192 -116
- package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
- package/src/components/data-table/schemas.ts +14 -36
- package/src/components/editor/Output.tsx +9 -2
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
- package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +80 -252
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +186 -34
- package/src/components/editor/actions/pair-with-agent-commands.ts +42 -51
- package/src/components/editor/actions/pair-with-agent-modal.tsx +96 -36
- package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
- package/src/components/editor/chrome/panels/error-panel.tsx +1 -0
- package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +366 -0
- package/src/components/editor/chrome/wrapper/footer-item.tsx +32 -24
- package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +237 -0
- package/src/components/editor/chrome/wrapper/footer.tsx +2 -0
- package/src/components/editor/connections/components.tsx +1 -1
- package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
- package/src/components/editor/controls/command-palette.tsx +22 -10
- package/src/components/editor/dynamic-favicon.tsx +21 -40
- package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +537 -0
- package/src/components/editor/errors/send-error-report-button.tsx +69 -0
- package/src/components/editor/output/MarimoErrorOutput.tsx +21 -5
- package/src/components/editor/output/MarimoTracebackOutput.tsx +36 -21
- package/src/components/editor/output/__tests__/ansi-reduce.test.ts +18 -0
- package/src/components/editor/output/ansi-reduce.ts +6 -0
- package/src/components/pages/home-page.tsx +4 -4
- package/src/components/tracing/tracing.tsx +2 -2
- package/src/core/attachments/__tests__/toast.test.tsx +58 -0
- package/src/core/attachments/state.ts +18 -0
- package/src/core/attachments/toast.ts +15 -0
- package/src/core/cells/__tests__/cells.test.ts +52 -0
- package/src/core/cells/__tests__/error-report.test.ts +139 -0
- package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
- package/src/core/cells/__tests__/session.test.ts +50 -1
- package/src/core/cells/cells.ts +2 -1
- package/src/core/cells/error-report.ts +63 -0
- package/src/core/cells/pending-delete-service.ts +2 -6
- package/src/core/cells/session.ts +28 -1
- package/src/core/config/pair.ts +5 -3
- package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
- package/src/core/datasets/data-source-discovery.ts +4 -6
- package/src/core/edit-app.tsx +2 -2
- package/src/core/host/AGENTS.md +5 -0
- package/src/core/host/__tests__/attachments.test.ts +57 -0
- package/src/core/host/__tests__/document.test.ts +124 -0
- package/src/core/host/__tests__/events.test.ts +46 -0
- package/src/core/host/__tests__/fixtures.ts +39 -0
- package/src/core/host/__tests__/notebook-client.test.ts +433 -0
- package/src/core/host/__tests__/protocol.test.ts +15 -0
- package/src/core/host/__tests__/stream.test.ts +209 -0
- package/src/core/host/connection.ts +81 -0
- package/src/core/host/events.ts +61 -0
- package/src/core/host/notebook-client.ts +290 -0
- package/src/core/host/protocol.ts +11 -6
- package/src/core/host/resources/attachments.ts +19 -0
- package/src/core/host/resources/document.ts +101 -0
- package/src/core/host/resources/resource.ts +47 -0
- package/src/core/host/stream.ts +211 -0
- package/src/core/hotkeys/actions.ts +2 -4
- package/src/core/network/connection.ts +4 -2
- package/src/core/run-app.tsx +2 -2
- package/src/core/runtime/__tests__/runtime.test.ts +55 -11
- package/src/core/runtime/runtime.ts +18 -5
- package/src/core/runtime/types.ts +2 -0
- package/src/core/websocket/__tests__/{useMarimoKernelConnection.test.ts → connection-state.test.ts} +15 -17
- package/src/core/websocket/__tests__/{useWebSocket.test.ts → createConnectionTransport.test.ts} +1 -1
- package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +170 -0
- package/src/core/websocket/__tests__/{useMarimoKernelConnection.hook.test.tsx → useNotebookSession.hook.test.tsx} +181 -65
- package/src/core/websocket/connection-state.ts +70 -0
- package/src/core/websocket/state.ts +7 -0
- package/src/core/websocket/transports/__tests__/sse.test.ts +1 -4
- package/src/core/websocket/transports/create.ts +31 -0
- package/src/core/websocket/transports/transport.ts +12 -23
- package/src/core/websocket/types.ts +9 -39
- package/src/core/websocket/useNotebookClient.ts +88 -0
- package/src/core/websocket/{useMarimoKernelConnection.tsx → useNotebookSession.tsx} +59 -225
- package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
- package/src/hooks/useAsyncData.ts +3 -3
- package/src/hooks/useDataSourceDiscovery.ts +6 -4
- package/src/hooks/useElapsedTime.ts +3 -3
- package/src/mount.tsx +7 -3
- package/src/plugins/core/registerReactComponent.tsx +1 -1
- package/src/plugins/impl/DropdownPlugin.tsx +2 -6
- package/src/plugins/impl/FormPlugin.tsx +1 -1
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +84 -0
- package/src/plugins/impl/code/any-language-editor.tsx +2 -2
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
- package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
- package/src/plugins/impl/vega/make-selectable.ts +3 -6
- package/src/utils/__tests__/arrays.test.ts +35 -0
- package/src/utils/__tests__/numbers.test.ts +48 -1
- package/src/utils/__tests__/objects.test.ts +21 -0
- package/src/utils/arrays.ts +10 -0
- package/src/utils/numbers.ts +28 -17
- package/src/utils/objects.ts +3 -7
- package/src/utils/once.ts +19 -19
- package/dist/any-language-editor-B9REGlD9.js +0 -76
- package/dist/error-entries-CzoYkIQZ.js +0 -56
- package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
- package/dist/precisionRound-DMIVQrt2.js +0 -97
- package/dist/toDate-BNJf01u1.js +0 -703
- package/src/core/websocket/useWebSocket.tsx +0 -88
|
@@ -136,6 +136,90 @@ describe("LoadingDataTableComponent", () => {
|
|
|
136
136
|
expect(downloadGeoJSON).toHaveBeenCalledTimes(1);
|
|
137
137
|
});
|
|
138
138
|
|
|
139
|
+
it("refreshes export metadata when a dataframe transform changes the data", async () => {
|
|
140
|
+
const host = document.createElement("div");
|
|
141
|
+
const metadataFor = (name: string) => ({
|
|
142
|
+
geometry_columns: [{ name, encoding: "objects", crs: "EPSG:4326" }],
|
|
143
|
+
primary_geometry_column: name,
|
|
144
|
+
default_geometry_column: name,
|
|
145
|
+
formats: {
|
|
146
|
+
parquet: { available: true, reason: null, missing_packages: [] },
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
const getExportMetadata = vi
|
|
150
|
+
.fn()
|
|
151
|
+
.mockResolvedValueOnce(metadataFor("before"))
|
|
152
|
+
.mockResolvedValueOnce(metadataFor("after"));
|
|
153
|
+
const view = (data: string) => (
|
|
154
|
+
<Provider store={store}>
|
|
155
|
+
<TooltipProvider>
|
|
156
|
+
<LoadingDataTableComponent
|
|
157
|
+
label={null}
|
|
158
|
+
totalRows={1}
|
|
159
|
+
pagination={false}
|
|
160
|
+
pageSize={10}
|
|
161
|
+
selection={null}
|
|
162
|
+
showDownload={true}
|
|
163
|
+
showFilters={false}
|
|
164
|
+
showColumnSummaries={false}
|
|
165
|
+
showDataTypes={false}
|
|
166
|
+
showPageSizeSelector={false}
|
|
167
|
+
showColumnExplorer={false}
|
|
168
|
+
showRowExplorer={false}
|
|
169
|
+
showChartBuilder={false}
|
|
170
|
+
rowHeaders={[]}
|
|
171
|
+
fieldTypes={undefined}
|
|
172
|
+
totalColumns={1}
|
|
173
|
+
maxColumns="all"
|
|
174
|
+
hasStableRowId={false}
|
|
175
|
+
lazy={false}
|
|
176
|
+
host={host}
|
|
177
|
+
showSearch={false}
|
|
178
|
+
value={[]}
|
|
179
|
+
setValue={vi.fn()}
|
|
180
|
+
data={data}
|
|
181
|
+
search={vi.fn().mockResolvedValue({
|
|
182
|
+
data,
|
|
183
|
+
total_rows: 1,
|
|
184
|
+
cell_styles: null,
|
|
185
|
+
cell_hover_texts: null,
|
|
186
|
+
})}
|
|
187
|
+
download_as={vi.fn()}
|
|
188
|
+
download_geojson={vi.fn()}
|
|
189
|
+
get_export_metadata={getExportMetadata}
|
|
190
|
+
get_column_summaries={vi.fn()}
|
|
191
|
+
get_data_url={vi.fn() as GetDataUrl}
|
|
192
|
+
get_row_ids={vi.fn() as GetRowIds}
|
|
193
|
+
get_size_bytes={vi.fn().mockResolvedValue({ size_bytes: null })}
|
|
194
|
+
/>
|
|
195
|
+
</TooltipProvider>
|
|
196
|
+
</Provider>
|
|
197
|
+
);
|
|
198
|
+
const { rerender } = render(
|
|
199
|
+
view(JSON.stringify([{ before: "POINT (1 2)" }])),
|
|
200
|
+
);
|
|
201
|
+
await waitFor(() =>
|
|
202
|
+
expect(
|
|
203
|
+
screen.getByRole("columnheader", { name: "before" }),
|
|
204
|
+
).toBeInTheDocument(),
|
|
205
|
+
);
|
|
206
|
+
fireEvent.click(screen.getByTestId("export-button"));
|
|
207
|
+
await waitFor(() =>
|
|
208
|
+
expect(screen.getByTestId("export-summary-parquet")).toHaveTextContent(
|
|
209
|
+
"before",
|
|
210
|
+
),
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
rerender(view(JSON.stringify([{ after: "POINT (3 4)" }])));
|
|
214
|
+
|
|
215
|
+
await waitFor(() =>
|
|
216
|
+
expect(screen.getByTestId("export-summary-parquet")).toHaveTextContent(
|
|
217
|
+
"after",
|
|
218
|
+
),
|
|
219
|
+
);
|
|
220
|
+
expect(getExportMetadata).toHaveBeenCalledTimes(2);
|
|
221
|
+
});
|
|
222
|
+
|
|
139
223
|
it("does not log duplicate keys when a pivot becomes empty", async () => {
|
|
140
224
|
const host = document.createElement("div");
|
|
141
225
|
const consoleError = vi
|
|
@@ -53,14 +53,14 @@ const AnyLanguageCodeMirror: React.FC<
|
|
|
53
53
|
extensions?: readonly Extension[];
|
|
54
54
|
}
|
|
55
55
|
> = ({
|
|
56
|
-
language,
|
|
56
|
+
language: requestedLanguage,
|
|
57
57
|
hideUnsupportedLanguageErrors,
|
|
58
58
|
showCopyButton,
|
|
59
59
|
extensions = EMPTY_EXTENSIONS,
|
|
60
60
|
...props
|
|
61
61
|
}) => {
|
|
62
62
|
// Maybe normalize the language to the extension
|
|
63
|
-
language = LANGUAGE_MAP[
|
|
63
|
+
const language = LANGUAGE_MAP[requestedLanguage || ""] || requestedLanguage;
|
|
64
64
|
|
|
65
65
|
const isSupported = isSupportedLanguage(language);
|
|
66
66
|
if (!isSupported) {
|
|
@@ -73,12 +73,16 @@ export const GlideDataEditor = ({
|
|
|
73
73
|
});
|
|
74
74
|
|
|
75
75
|
const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});
|
|
76
|
+
const editableColumnSet = useMemo(
|
|
77
|
+
() => (editableColumns === "all" ? null : new Set(editableColumns)),
|
|
78
|
+
[editableColumns],
|
|
79
|
+
);
|
|
76
80
|
|
|
77
81
|
const columns: ModifiedGridColumn[] = useMemo(() => {
|
|
78
82
|
const columns: ModifiedGridColumn[] = [];
|
|
79
83
|
for (const [columnName, fieldType] of columnFields) {
|
|
80
84
|
const editable =
|
|
81
|
-
|
|
85
|
+
editableColumnSet === null || editableColumnSet.has(columnName);
|
|
82
86
|
|
|
83
87
|
columns.push({
|
|
84
88
|
id: columnName,
|
|
@@ -100,7 +104,7 @@ export const GlideDataEditor = ({
|
|
|
100
104
|
}
|
|
101
105
|
|
|
102
106
|
return columns;
|
|
103
|
-
}, [columnFields, columnWidths,
|
|
107
|
+
}, [columnFields, columnWidths, editableColumnSet, theme]);
|
|
104
108
|
|
|
105
109
|
const getCellContent = useCallback(
|
|
106
110
|
(cell: Item): GridCell => {
|
|
@@ -110,8 +114,7 @@ export const GlideDataEditor = ({
|
|
|
110
114
|
const dataItem = dataRow[columns[col].title];
|
|
111
115
|
const columnKind = columns[col].kind;
|
|
112
116
|
const editable =
|
|
113
|
-
|
|
114
|
-
editableColumns.includes(columns[col].title);
|
|
117
|
+
editableColumnSet === null || editableColumnSet.has(columns[col].title);
|
|
115
118
|
|
|
116
119
|
if (columnKind === GridCellKind.Boolean) {
|
|
117
120
|
const value = Boolean(dataItem);
|
|
@@ -141,7 +144,7 @@ export const GlideDataEditor = ({
|
|
|
141
144
|
data: String(dataItem),
|
|
142
145
|
};
|
|
143
146
|
},
|
|
144
|
-
[columns, data,
|
|
147
|
+
[columns, data, editableColumnSet],
|
|
145
148
|
);
|
|
146
149
|
|
|
147
150
|
const onCellEdited = useCallback(
|
|
@@ -147,6 +147,8 @@ export function pasteCells(options: {
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
const edits: Edits["edits"] = [];
|
|
150
|
+
const editableColumnSet =
|
|
151
|
+
editableColumns === "all" ? null : new Set(editableColumns);
|
|
150
152
|
|
|
151
153
|
for (const [rowIndex, dataRow] of parsedData.entries()) {
|
|
152
154
|
if (!dataRow) {
|
|
@@ -175,7 +177,7 @@ export function pasteCells(options: {
|
|
|
175
177
|
const column = columns[targetColIdx];
|
|
176
178
|
const columnType = column.dataType;
|
|
177
179
|
const editable =
|
|
178
|
-
|
|
180
|
+
editableColumnSet === null || editableColumnSet.has(column.title);
|
|
179
181
|
|
|
180
182
|
if (!editable) {
|
|
181
183
|
continue;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import type { TopLevelSpec } from "vega-lite";
|
|
4
4
|
import type { NonNormalizedSpec } from "vega-lite/types_unstable/spec/index.js";
|
|
5
5
|
import type { TopLevelParameter } from "vega-lite/types_unstable/spec/toplevel.js";
|
|
6
|
+
import { Arrays } from "@/utils/arrays";
|
|
6
7
|
|
|
7
8
|
import { findEncodedFields, makeEncodingInteractive } from "./encodings";
|
|
8
9
|
import { Marks } from "./marks";
|
|
@@ -357,9 +358,7 @@ export function makeSelectable<T extends VegaLiteSpec>(
|
|
|
357
358
|
|
|
358
359
|
// If fieldSelection is an array, filter the fields
|
|
359
360
|
if (Array.isArray(fieldSelection)) {
|
|
360
|
-
legendFields =
|
|
361
|
-
fieldSelection.includes(field),
|
|
362
|
-
);
|
|
361
|
+
legendFields = Arrays.intersection(legendFields, fieldSelection);
|
|
363
362
|
}
|
|
364
363
|
}
|
|
365
364
|
|
|
@@ -420,9 +419,7 @@ function makeLegendSelectable(
|
|
|
420
419
|
let legendFields = findEncodedFields(spec);
|
|
421
420
|
// If fieldSelection is an array, we filter the fields
|
|
422
421
|
if (Array.isArray(fieldSelection)) {
|
|
423
|
-
legendFields =
|
|
424
|
-
fieldSelection.includes(field),
|
|
425
|
-
);
|
|
422
|
+
legendFields = Arrays.intersection(legendFields, fieldSelection);
|
|
426
423
|
}
|
|
427
424
|
|
|
428
425
|
const legendParams = legendFields.map((field) => Params.legend(field));
|
|
@@ -16,6 +16,41 @@ import {
|
|
|
16
16
|
} from "../arrays";
|
|
17
17
|
|
|
18
18
|
describe("arrays", () => {
|
|
19
|
+
describe.each([
|
|
20
|
+
["intersection", Arrays.intersection, [3, 3, 2], [Number.NaN]],
|
|
21
|
+
["difference", Arrays.difference, [1], [1]],
|
|
22
|
+
] as const)("%s", (_name, operation, expected, expectedWithNaN) => {
|
|
23
|
+
it("preserves order and duplicates without mutating readonly inputs", () => {
|
|
24
|
+
const values = Object.freeze([3, 1, 3, 2]);
|
|
25
|
+
const other = Object.freeze([2, 3, 3]);
|
|
26
|
+
expect(operation(values, other)).toEqual(expected);
|
|
27
|
+
expect(values).toEqual([3, 1, 3, 2]);
|
|
28
|
+
expect(other).toEqual([2, 3, 3]);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("uses the same equality as array membership, including NaN", () => {
|
|
32
|
+
expect(operation([Number.NaN, 1], [Number.NaN])).toEqual(expectedWithNaN);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("handles an empty source", () => {
|
|
36
|
+
expect(operation([], [1])).toEqual([]);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("handles empty membership lists", () => {
|
|
41
|
+
expect(Arrays.intersection([1, 1, 2], [])).toEqual([]);
|
|
42
|
+
expect(Arrays.difference([1, 1, 2], [])).toEqual([1, 1, 2]);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("compares objects by identity", () => {
|
|
46
|
+
const shared = { id: 1 };
|
|
47
|
+
const distinct = { id: 1 };
|
|
48
|
+
expect(Arrays.intersection([shared, distinct], [shared])).toEqual([shared]);
|
|
49
|
+
expect(Arrays.difference([shared, distinct], [shared])).toEqual([distinct]);
|
|
50
|
+
expect(Arrays.intersection([shared, distinct], [shared])[0]).toBe(shared);
|
|
51
|
+
expect(Arrays.difference([shared, distinct], [shared])[0]).toBe(distinct);
|
|
52
|
+
});
|
|
53
|
+
|
|
19
54
|
describe("arrayDelete", () => {
|
|
20
55
|
it("should delete an element at the specified index", () => {
|
|
21
56
|
expect(arrayDelete([1, 2, 3], 1)).toEqual([1, 3]);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
3
|
import {
|
|
4
4
|
countFractionDigits,
|
|
5
5
|
maxFractionDigitsForSteps,
|
|
@@ -20,6 +20,53 @@ describe("prettyNumber", () => {
|
|
|
20
20
|
|
|
21
21
|
const options = { locale };
|
|
22
22
|
|
|
23
|
+
describe("formatter reuse", () => {
|
|
24
|
+
it.each([
|
|
25
|
+
{
|
|
26
|
+
name: "scientific",
|
|
27
|
+
value: 0.000_123_4,
|
|
28
|
+
format: (value: number, locale: string) =>
|
|
29
|
+
prettyScientificNumber(value, { locale }),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "rounded",
|
|
33
|
+
value: 1234.567,
|
|
34
|
+
format: (value: number, locale: string) =>
|
|
35
|
+
prettyScientificNumber(value, { locale, shouldRound: true }),
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "engineering",
|
|
39
|
+
value: 12_345,
|
|
40
|
+
format: prettyEngineeringNumber,
|
|
41
|
+
},
|
|
42
|
+
])(
|
|
43
|
+
"reuses the $name formatter until the locale changes",
|
|
44
|
+
({ format, value }) => {
|
|
45
|
+
const NumberFormat = Intl.NumberFormat;
|
|
46
|
+
const constructor = vi
|
|
47
|
+
.spyOn(Intl, "NumberFormat")
|
|
48
|
+
.mockImplementation(function (locales, options) {
|
|
49
|
+
return new NumberFormat(locales, options);
|
|
50
|
+
});
|
|
51
|
+
try {
|
|
52
|
+
const first = format(value, "fr-FR");
|
|
53
|
+
expect(format(value, "fr-FR")).toBe(first);
|
|
54
|
+
format(value * 2, "fr-FR");
|
|
55
|
+
expect(constructor).toHaveBeenCalledTimes(1);
|
|
56
|
+
|
|
57
|
+
format(value, "de-DE");
|
|
58
|
+
expect(constructor).toHaveBeenCalledTimes(2);
|
|
59
|
+
expect(constructor).toHaveBeenLastCalledWith(
|
|
60
|
+
"de-DE",
|
|
61
|
+
expect.any(Object),
|
|
62
|
+
);
|
|
63
|
+
} finally {
|
|
64
|
+
constructor.mockRestore();
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
|
|
23
70
|
describe("prettyScientificNumber", () => {
|
|
24
71
|
it("should handle special cases", () => {
|
|
25
72
|
expect(prettyScientificNumber(0, options)).toBe("0");
|
|
@@ -204,6 +204,27 @@ describe("Objects", () => {
|
|
|
204
204
|
});
|
|
205
205
|
|
|
206
206
|
describe("filter", () => {
|
|
207
|
+
it.each([42, { base_url: "https://example.com" }])(
|
|
208
|
+
"preserves an own __proto__ property with value %j",
|
|
209
|
+
(value) => {
|
|
210
|
+
const obj = { ["__proto__"]: value, removed: value };
|
|
211
|
+
const result = Objects.filter(obj, (_, key) => key !== "removed");
|
|
212
|
+
|
|
213
|
+
expect(Object.entries(result)).toEqual([["__proto__", value]]);
|
|
214
|
+
expect(Object.getPrototypeOf(result)).toBe(Object.prototype);
|
|
215
|
+
expect(Object.getOwnPropertyDescriptor(result, "__proto__")).toEqual({
|
|
216
|
+
value,
|
|
217
|
+
writable: true,
|
|
218
|
+
enumerable: true,
|
|
219
|
+
configurable: true,
|
|
220
|
+
});
|
|
221
|
+
expect(Object.keys(obj)).toEqual(["__proto__", "removed"]);
|
|
222
|
+
expect(Objects.filter(obj, (_, key) => key !== "__proto__")).toEqual({
|
|
223
|
+
removed: value,
|
|
224
|
+
});
|
|
225
|
+
},
|
|
226
|
+
);
|
|
227
|
+
|
|
207
228
|
it("should filter object entries by predicate", () => {
|
|
208
229
|
const obj = { a: 1, b: 2, c: 3, d: 4 };
|
|
209
230
|
const result = Objects.filter(obj, (v) => v % 2 === 0);
|
package/src/utils/arrays.ts
CHANGED
|
@@ -55,6 +55,16 @@ export function arrayShallowEquals<T>(a: T[], b: T[]): boolean {
|
|
|
55
55
|
export const Arrays = {
|
|
56
56
|
// oxlint-disable-next-line typescript/no-explicit-any
|
|
57
57
|
EMPTY: [] as any,
|
|
58
|
+
/** Keep values present in both arrays, preserving the first array's order and duplicates. */
|
|
59
|
+
intersection<T>(values: readonly T[], included: readonly T[]): T[] {
|
|
60
|
+
const includedSet = new Set(included);
|
|
61
|
+
return values.filter((value) => includedSet.has(value));
|
|
62
|
+
},
|
|
63
|
+
/** Remove values present in the second array, preserving order and duplicates. */
|
|
64
|
+
difference<T>(values: readonly T[], excluded: readonly T[]): T[] {
|
|
65
|
+
const excludedSet = new Set(excluded);
|
|
66
|
+
return values.filter((value) => !excludedSet.has(value));
|
|
67
|
+
},
|
|
58
68
|
zip: <T, U>(a: T[], b: U[]): [T, U][] => {
|
|
59
69
|
invariant(a.length === b.length, "Arrays must be the same length");
|
|
60
70
|
return a.map((item, i) => [item, b[i]]);
|
package/src/utils/numbers.ts
CHANGED
|
@@ -23,6 +23,31 @@ export const maxFractionalDigits = memoizeLastValue((locale: string) => {
|
|
|
23
23
|
return 0;
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
const getScientificFormatter = memoizeLastValue(
|
|
27
|
+
(locale: string) =>
|
|
28
|
+
new Intl.NumberFormat(locale, {
|
|
29
|
+
minimumFractionDigits: 1,
|
|
30
|
+
maximumFractionDigits: 1,
|
|
31
|
+
notation: "scientific",
|
|
32
|
+
}),
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const getRoundedFormatter = memoizeLastValue(
|
|
36
|
+
(locale: string) =>
|
|
37
|
+
new Intl.NumberFormat(locale, {
|
|
38
|
+
minimumFractionDigits: 0,
|
|
39
|
+
maximumFractionDigits: 2,
|
|
40
|
+
}),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const getEngineeringFormatter = memoizeLastValue(
|
|
44
|
+
(locale: string) =>
|
|
45
|
+
new Intl.NumberFormat(locale, {
|
|
46
|
+
notation: "engineering",
|
|
47
|
+
maximumSignificantDigits: 3,
|
|
48
|
+
}),
|
|
49
|
+
);
|
|
50
|
+
|
|
26
51
|
/** Decimal places needed to display `n` without float noise. */
|
|
27
52
|
export function countFractionDigits(n: number): number {
|
|
28
53
|
if (!Number.isFinite(n) || n === 0) {
|
|
@@ -108,23 +133,14 @@ export function prettyScientificNumber(
|
|
|
108
133
|
// Determine if the number should be in scientific notation
|
|
109
134
|
const absValue = Math.abs(value);
|
|
110
135
|
if (absValue < 1e-2 || absValue >= 1e6) {
|
|
111
|
-
return
|
|
112
|
-
minimumFractionDigits: 1,
|
|
113
|
-
maximumFractionDigits: 1,
|
|
114
|
-
notation: "scientific",
|
|
115
|
-
})
|
|
116
|
-
.format(value)
|
|
117
|
-
.toLowerCase();
|
|
136
|
+
return getScientificFormatter(opts.locale).format(value).toLowerCase();
|
|
118
137
|
}
|
|
119
138
|
|
|
120
139
|
const { shouldRound, locale } = opts;
|
|
121
140
|
|
|
122
141
|
if (shouldRound) {
|
|
123
142
|
// Number has an integer part, format with 2 decimal places
|
|
124
|
-
return
|
|
125
|
-
minimumFractionDigits: 0,
|
|
126
|
-
maximumFractionDigits: 2,
|
|
127
|
-
}).format(value);
|
|
143
|
+
return getRoundedFormatter(locale).format(value);
|
|
128
144
|
}
|
|
129
145
|
|
|
130
146
|
// Don't round
|
|
@@ -161,12 +177,7 @@ export function prettyEngineeringNumber(value: number, locale: string): string {
|
|
|
161
177
|
return specialCase;
|
|
162
178
|
}
|
|
163
179
|
|
|
164
|
-
const [mant, exp] =
|
|
165
|
-
notation: "engineering",
|
|
166
|
-
maximumSignificantDigits: 3,
|
|
167
|
-
})
|
|
168
|
-
.format(value)
|
|
169
|
-
.split("E");
|
|
180
|
+
const [mant, exp] = getEngineeringFormatter(locale).format(value).split("E");
|
|
170
181
|
|
|
171
182
|
if (exp in prefixes) {
|
|
172
183
|
return mant + prefixes[exp as keyof typeof prefixes];
|
package/src/utils/objects.ts
CHANGED
|
@@ -89,13 +89,9 @@ export const Objects = {
|
|
|
89
89
|
obj: Record<K, V>,
|
|
90
90
|
predicate: (value: V, key: K) => boolean,
|
|
91
91
|
): Record<K, V> {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
result[key] = obj[key];
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return result;
|
|
92
|
+
return Objects.fromEntries(
|
|
93
|
+
Objects.entries(obj).filter(([key, value]) => predicate(value, key)),
|
|
94
|
+
);
|
|
99
95
|
},
|
|
100
96
|
|
|
101
97
|
omit<V extends object, K extends keyof V>(
|
package/src/utils/once.ts
CHANGED
|
@@ -2,36 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
import { arrayShallowEquals } from "./arrays";
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
export function once<
|
|
7
|
-
|
|
5
|
+
export function once<F extends (...args: never[]) => unknown>(fn: F): F;
|
|
6
|
+
export function once<Args extends unknown[], Result, This>(
|
|
7
|
+
fn: (this: This, ...args: Args) => Result,
|
|
8
|
+
): (this: This, ...args: Args) => Result {
|
|
9
|
+
let result: Result;
|
|
8
10
|
let called = false;
|
|
9
|
-
return function (
|
|
10
|
-
this: ThisParameterType<T>,
|
|
11
|
-
...args: Parameters<T>
|
|
12
|
-
): ReturnType<T> {
|
|
11
|
+
return function (this: This, ...args: Args): Result {
|
|
13
12
|
if (!called) {
|
|
14
13
|
called = true;
|
|
15
|
-
result = fn.apply(this, args)
|
|
14
|
+
result = fn.apply(this, args);
|
|
16
15
|
}
|
|
17
16
|
return result;
|
|
18
|
-
}
|
|
17
|
+
};
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
export function memoizeLastValue<F extends (...args: never[]) => unknown>(
|
|
21
|
+
fn: F,
|
|
22
|
+
): F;
|
|
23
|
+
export function memoizeLastValue<Args extends unknown[], Result, This>(
|
|
24
|
+
fn: (this: This, ...args: Args) => Result,
|
|
25
|
+
): (this: This, ...args: Args) => Result {
|
|
26
|
+
let result: Result;
|
|
27
|
+
let lastArgs: Args | undefined;
|
|
25
28
|
let lastError: unknown;
|
|
26
29
|
let hasError = false;
|
|
27
30
|
|
|
28
|
-
return function (
|
|
29
|
-
this: ThisParameterType<T>,
|
|
30
|
-
...args: Parameters<T>
|
|
31
|
-
): ReturnType<T> {
|
|
31
|
+
return function (this: This, ...args: Args): Result {
|
|
32
32
|
if (lastArgs === undefined || !arrayShallowEquals(args, lastArgs)) {
|
|
33
33
|
try {
|
|
34
|
-
result = fn.apply(this, args)
|
|
34
|
+
result = fn.apply(this, args);
|
|
35
35
|
hasError = false;
|
|
36
36
|
lastError = undefined;
|
|
37
37
|
} catch (error) {
|
|
@@ -45,5 +45,5 @@ export function memoizeLastValue<T extends (...args: any[]) => any>(fn: T): T {
|
|
|
45
45
|
throw lastError;
|
|
46
46
|
}
|
|
47
47
|
return result;
|
|
48
|
-
}
|
|
48
|
+
};
|
|
49
49
|
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import "./rolldown-runtime-Cb76FRpK.js";
|
|
2
|
-
import { g as e } from "./button-CvjkwdSk.js";
|
|
3
|
-
import { t } from "./react-sHtZdjeP.js";
|
|
4
|
-
import { t as n } from "./compiler-runtime-CldRdSsv.js";
|
|
5
|
-
import { t as r } from "./copy-icon-Ft7t9bqz.js";
|
|
6
|
-
import { t as i } from "./jsx-runtime-3BD1kT0s.js";
|
|
7
|
-
import { n as a } from "./error-banner-Da600cwz.js";
|
|
8
|
-
import { t as o } from "./esm-AMFssoNp.js";
|
|
9
|
-
import { n as s, t as c } from "./esm-D2gTsXEV.js";
|
|
10
|
-
//#region src/plugins/impl/code/any-language-editor.tsx
|
|
11
|
-
var l = n();
|
|
12
|
-
t();
|
|
13
|
-
var u = i(), d = {
|
|
14
|
-
python: "py",
|
|
15
|
-
python3: "py",
|
|
16
|
-
javascript: "js",
|
|
17
|
-
typescript: "ts",
|
|
18
|
-
shell: "sh",
|
|
19
|
-
bash: "sh",
|
|
20
|
-
unknown: "text",
|
|
21
|
-
undefined: "text"
|
|
22
|
-
}, f = [];
|
|
23
|
-
function p(e) {
|
|
24
|
-
return e ? e in c : !1;
|
|
25
|
-
}
|
|
26
|
-
var m = (t) => {
|
|
27
|
-
let n = (0, l.c)(29), i, m, h, g, _, v;
|
|
28
|
-
if (n[0] !== t) {
|
|
29
|
-
let { language: e, hideUnsupportedLanguageErrors: r, showCopyButton: a, extensions: o, ...s } = t;
|
|
30
|
-
m = r, _ = a, g = s, h = e, i = o === void 0 ? f : o, h = d[h || ""] || h, v = p(h), n[0] = t, n[1] = i, n[2] = m, n[3] = h, n[4] = g, n[5] = _, n[6] = v;
|
|
31
|
-
} else i = n[1], m = n[2], h = n[3], g = n[4], _ = n[5], v = n[6];
|
|
32
|
-
let y = v;
|
|
33
|
-
y || e.warn(`Language ${h} not found in CodeMirror.`);
|
|
34
|
-
let b;
|
|
35
|
-
bb0: {
|
|
36
|
-
if (!p(h)) {
|
|
37
|
-
b = i;
|
|
38
|
-
break bb0;
|
|
39
|
-
}
|
|
40
|
-
let e;
|
|
41
|
-
n[7] === h ? e = n[8] : (e = s(h), n[7] = h, n[8] = e);
|
|
42
|
-
let t;
|
|
43
|
-
n[9] !== i || n[10] !== e ? (t = [e, ...i].filter(Boolean), n[9] = i, n[10] = e, n[11] = t) : t = n[11], b = t;
|
|
44
|
-
}
|
|
45
|
-
let x = b, S;
|
|
46
|
-
n[12] !== m || n[13] !== y || n[14] !== h ? (S = !y && !m && /* @__PURE__ */ (0, u.jsx)(a, {
|
|
47
|
-
className: "mb-1 rounded-sm",
|
|
48
|
-
error: `Language ${h} not supported. Supported languages are: ${Object.keys(c).join(", ")}`
|
|
49
|
-
}), n[12] = m, n[13] = y, n[14] = h, n[15] = S) : S = n[15];
|
|
50
|
-
let C;
|
|
51
|
-
n[16] !== y || n[17] !== g || n[18] !== _ ? (C = _ && y && /* @__PURE__ */ (0, u.jsx)(r, {
|
|
52
|
-
tooltip: !1,
|
|
53
|
-
buttonClassName: "absolute top-2 right-2 z-10 hover-action",
|
|
54
|
-
className: "h-4 w-4 text-muted-foreground",
|
|
55
|
-
value: g.value || "",
|
|
56
|
-
toastTitle: "Copied to clipboard"
|
|
57
|
-
}), n[16] = y, n[17] = g, n[18] = _, n[19] = C) : C = n[19];
|
|
58
|
-
let w;
|
|
59
|
-
n[20] === x ? w = n[21] : (w = [...x], n[20] = x, n[21] = w);
|
|
60
|
-
let T;
|
|
61
|
-
n[22] !== g || n[23] !== w ? (T = /* @__PURE__ */ (0, u.jsx)(o, {
|
|
62
|
-
...g,
|
|
63
|
-
extensions: w
|
|
64
|
-
}), n[22] = g, n[23] = w, n[24] = T) : T = n[24];
|
|
65
|
-
let E;
|
|
66
|
-
return n[25] !== S || n[26] !== C || n[27] !== T ? (E = /* @__PURE__ */ (0, u.jsxs)("div", {
|
|
67
|
-
className: "relative w-full group hover-actions-parent",
|
|
68
|
-
children: [
|
|
69
|
-
S,
|
|
70
|
-
C,
|
|
71
|
-
T
|
|
72
|
-
]
|
|
73
|
-
}), n[25] = S, n[26] = C, n[27] = T, n[28] = E) : E = n[28], E;
|
|
74
|
-
};
|
|
75
|
-
//#endregion
|
|
76
|
-
export { d as LANGUAGE_MAP, m as default };
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { At as e, N as t, b as n, d as r, jt as i, kt as a } from "./cells-C8iCYvLU.js";
|
|
2
|
-
import { C as o } from "./select-BButFi-d.js";
|
|
3
|
-
//#region src/core/errors/error-entries.ts
|
|
4
|
-
function s(t) {
|
|
5
|
-
if (e(t.mimetype)) {
|
|
6
|
-
if (!Array.isArray(t.data)) return null;
|
|
7
|
-
let e = t.data.filter((e) => !e.type.includes("ancestor"));
|
|
8
|
-
return e.length === 0 ? null : { errorData: e };
|
|
9
|
-
}
|
|
10
|
-
return i(t.mimetype) ? typeof t.data != "string" || t.data.length === 0 ? null : {
|
|
11
|
-
errorData: [],
|
|
12
|
-
tracebackHtml: t.data
|
|
13
|
-
} : null;
|
|
14
|
-
}
|
|
15
|
-
function c(e) {
|
|
16
|
-
return e.some((e) => "traceback" in e && e.traceback);
|
|
17
|
-
}
|
|
18
|
-
function l(e) {
|
|
19
|
-
let t = e?.find((e) => i(e.mimetype));
|
|
20
|
-
if (!(!t || typeof t.data != "string" || t.data.length === 0)) return t.data;
|
|
21
|
-
}
|
|
22
|
-
function u(e, t) {
|
|
23
|
-
if (e.tracebackHtml) return e.tracebackHtml;
|
|
24
|
-
if (!c(e.errorData)) return l(t);
|
|
25
|
-
}
|
|
26
|
-
function d(e) {
|
|
27
|
-
let { cellIds: n, cellRuntime: i, cellData: o } = e.get(r), c = [];
|
|
28
|
-
for (let [e, r] of n.inOrderIds.entries()) {
|
|
29
|
-
let n = i[r], l = n.output;
|
|
30
|
-
if (!l || !a(l.mimetype)) continue;
|
|
31
|
-
let d = s(l);
|
|
32
|
-
if (!d) continue;
|
|
33
|
-
let f = t(o[r].name, e), p = o[r].lastCodeRun ?? o[r].code;
|
|
34
|
-
c.push({
|
|
35
|
-
cellId: r,
|
|
36
|
-
cellName: f,
|
|
37
|
-
cellCode: p,
|
|
38
|
-
errorData: d.errorData,
|
|
39
|
-
tracebackHtml: u(d, n.consoleOutputs)
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return c;
|
|
43
|
-
}
|
|
44
|
-
function f(e) {
|
|
45
|
-
return e.type === "setup-refs" ? "The setup cell cannot have references" : e.type === "cycle" ? "This cell is in a cycle" : e.type === "multiple-defs" ? `The variable '${e.name}' was defined by another cell` : e.type === "import-star" || e.type === "ancestor-stopped" || e.type === "ancestor-prevented" || e.type === "exception" || e.type === "strict-exception" ? e.msg : e.type === "interruption" ? "This cell was interrupted and needs to be re-run" : e.type === "syntax" || e.type === "unknown" || e.type === "sql-error" ? e.msg : e.type === "internal" ? e.msg || "An internal error occurred" : (o(e), "Unknown error");
|
|
46
|
-
}
|
|
47
|
-
function p(e) {
|
|
48
|
-
let t = f(e);
|
|
49
|
-
return "traceback" in e && e.traceback && (t += `\n\nTraceback:\n${n(e.traceback)}`), t;
|
|
50
|
-
}
|
|
51
|
-
function m(e) {
|
|
52
|
-
let t = [e.cellName];
|
|
53
|
-
return e.tracebackHtml && t.push(n(e.tracebackHtml)), e.errorData.length > 0 && t.push(e.errorData.map(p).join("\n\n")), t.join("\n\n");
|
|
54
|
-
}
|
|
55
|
-
//#endregion
|
|
56
|
-
export { d as i, m as n, p as r, f as t };
|