@marimo-team/frontend 0.22.1-dev38 → 0.22.1-dev39

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 (229) hide show
  1. package/dist/assets/{CellStatus-DKyVv7Zj.js → CellStatus-Cf0Jlrcs.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-BUc9LHJJ.js → ConnectedDataExplorerComponent-DUxaLoL7.js} +1 -1
  3. package/dist/assets/{JsonOutput-DboWEw2n.js → JsonOutput-IpD2GLtO.js} +1 -1
  4. package/dist/assets/{MarimoErrorOutput-RmM7djc-.js → MarimoErrorOutput-dTNCLY-Q.js} +1 -1
  5. package/dist/assets/{Plot-C7NE7pEx.js → Plot-BAM1jEAz.js} +72 -72
  6. package/dist/assets/{RenderHTML-Bmn77an6.js → RenderHTML-C5GEp4ca.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-RyZ9Xe2b.js → add-cell-with-ai-C0J3LyiV.js} +1 -1
  8. package/dist/assets/{add-connection-dialog-DiHC8_uD.js → add-connection-dialog-C42PDYI7.js} +1 -1
  9. package/dist/assets/{agent-panel-CWWFNdAZ.js → agent-panel-CH-jHjEl.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-Dnf-CxbP.js → ai-model-dropdown-D14GiszF.js} +1 -1
  11. package/dist/assets/{app-config-button-D1Z_xsvC.js → app-config-button-v-557oRb.js} +1 -1
  12. package/dist/assets/{cell-editor-CKnV9MwH.js → cell-editor-Dd6UaL1A.js} +2 -2
  13. package/dist/assets/{cell-link-D4UrIH9w.js → cell-link-Cimoe3Fv.js} +1 -1
  14. package/dist/assets/{cells-ArUhhHls.js → cells-CcsG9Aum.js} +1 -1
  15. package/dist/assets/{chat-display-YmFjOXkV.js → chat-display-hfpeXiYe.js} +1 -1
  16. package/dist/assets/{chat-panel-B76rxYTh.js → chat-panel-DxT370nA.js} +1 -1
  17. package/dist/assets/{chat-ui-BitNq1z6.js → chat-ui-Dv4y0-td.js} +1 -1
  18. package/dist/assets/{column-preview-BvDPfcdF.js → column-preview-ZSErTRFA.js} +1 -1
  19. package/dist/assets/{command-palette-CPRmmNjA.js → command-palette-CjF_cblG.js} +1 -1
  20. package/dist/assets/{common-CRBlPqv5.js → common-BZK7spst.js} +1 -1
  21. package/dist/assets/{components-DwGcJvMB.js → components-D2OlyENc.js} +1 -1
  22. package/dist/assets/{components-BfHGr__b.js → components-DpxyscxU.js} +1 -1
  23. package/dist/assets/{datasource-D9e37ifa.js → datasource-D9nfSxKS.js} +1 -1
  24. package/dist/assets/{dependency-graph-panel-BBmN-Vc7.js → dependency-graph-panel-5MbMtFss.js} +1 -1
  25. package/dist/assets/{documentation-panel-Dm2xtsTq.js → documentation-panel-DPdXS3YO.js} +1 -1
  26. package/dist/assets/{download-7EtMZf2Y.js → download-BFQaUFKI.js} +1 -1
  27. package/dist/assets/{edit-page-B-kCXJQD.js → edit-page-CMd8_Psc.js} +4 -4
  28. package/dist/assets/{error-panel-C3-vTzaH.js → error-panel-DV8jpRsf.js} +1 -1
  29. package/dist/assets/{file-explorer-panel-DyDct4o3.js → file-explorer-panel-Dr_ZNDk3.js} +1 -1
  30. package/dist/assets/{file-icons-JXAG6vK-.js → file-icons-DSJsG_mI.js} +1 -1
  31. package/dist/assets/{floating-outline-B6Qyid7Q.js → floating-outline-Cfa1ESSb.js} +1 -1
  32. package/dist/assets/{focus-DCN0oEe0.js → focus-C5u0JQUq.js} +1 -1
  33. package/dist/assets/{form-Byef3KYr.js → form-3ZUGKch9.js} +1 -1
  34. package/dist/assets/glide-data-editor-a3qLDl-r.js +132 -0
  35. package/dist/assets/{home-page-Bg02jazh.js → home-page-BrqppCUS.js} +1 -1
  36. package/dist/assets/{hooks-BoxLBXGI.js → hooks-CHE17GG1.js} +1 -1
  37. package/dist/assets/{html-to-image-C5XSE7QT.js → html-to-image-BRbQwG7G.js} +1 -1
  38. package/dist/assets/{index-B1HqiNNr.js → index-Bt8G6SSE.js} +8 -8
  39. package/dist/assets/{kiosk-mode-CriCUOI1.js → kiosk-mode-Cu86-jaD.js} +1 -1
  40. package/dist/assets/{layout-BjQtqcnj.js → layout-B-lTkLKA.js} +1 -1
  41. package/dist/assets/{logs-panel-CoWO9c8s.js → logs-panel-CNVgwoHO.js} +1 -1
  42. package/dist/assets/{markdown-renderer-CyUc0f8D.js → markdown-renderer-B91NzmVT.js} +1 -1
  43. package/dist/assets/{name-cell-input-DeM6upjB.js → name-cell-input-hsV_b1Op.js} +1 -1
  44. package/dist/assets/{outline-panel-C4P3wA7Z.js → outline-panel-C3jvSnZF.js} +1 -1
  45. package/dist/assets/{packages-panel-DnrjjQDF.js → packages-panel-0_Z5vM7i.js} +1 -1
  46. package/dist/assets/{panels-aBXT7_tR.js → panels-uc8QhzpO.js} +1 -1
  47. package/dist/assets/{process-output-e_aMblRk.js → process-output-CsvKn_Mr.js} +1 -1
  48. package/dist/assets/{readonly-python-code-CVgh88Tn.js → readonly-python-code-oFCRG7Wt.js} +1 -1
  49. package/dist/assets/{run-page-yA3m6QEA.js → run-page-DKCqiq_f.js} +1 -1
  50. package/dist/assets/{scratchpad-panel-Cul3iUG0.js → scratchpad-panel-ChHLgDv_.js} +1 -1
  51. package/dist/assets/{session-panel-CzPIEKo8.js → session-panel-CPKKt31q.js} +1 -1
  52. package/dist/assets/{snippets-panel-DQgE3W8I.js → snippets-panel-CDqEDwpY.js} +1 -1
  53. package/dist/assets/{spec-CBbUxOvL.js → spec-CFx2bitO.js} +1 -1
  54. package/dist/assets/{state-pGNeffyB.js → state-BBVlYaRC.js} +1 -1
  55. package/dist/assets/{state-C79RsVoe.js → state-C93JW11U.js} +1 -1
  56. package/dist/assets/{textarea-DqzNK0s9.js → textarea-DJEKmYtw.js} +1 -1
  57. package/dist/assets/{tracing-BUFVOmZw.js → tracing-CLWi5jD3.js} +1 -1
  58. package/dist/assets/{tracing-panel-BsLloPWd.js → tracing-panel-ksnvVrMH.js} +2 -2
  59. package/dist/assets/{useAddCell-cC7JUC0q.js → useAddCell-mJ1PkF-E.js} +1 -1
  60. package/dist/assets/{useCellActionButton-BiYBXHfb.js → useCellActionButton-4HWj1rt3.js} +1 -1
  61. package/dist/assets/{useDeleteCell-D2p4Dz0U.js → useDeleteCell-B0OAS0ly.js} +1 -1
  62. package/dist/assets/{useDependencyPanelTab-c5-eXlcr.js → useDependencyPanelTab-BuZ0fgAR.js} +1 -1
  63. package/dist/assets/useLifecycle-N3bfh_O1.js +1 -0
  64. package/dist/assets/{useNotebookActions-A-2lB6Y1.js → useNotebookActions-DuHUqtII.js} +1 -1
  65. package/dist/assets/{useRunCells-DgBY-vh9.js → useRunCells-Du76UV1R.js} +1 -1
  66. package/dist/assets/{useSplitCell-SS0kKwVk.js → useSplitCell-CeL7eJq1.js} +1 -1
  67. package/dist/index.html +24 -24
  68. package/package.json +1 -1
  69. package/src/__mocks__/common.ts +4 -4
  70. package/src/components/chat/acp/agent-panel.tsx +2 -2
  71. package/src/components/data-table/__tests__/columns.test.tsx +7 -7
  72. package/src/components/data-table/cell-hover-template/types.ts +1 -1
  73. package/src/components/data-table/cell-hover-text/types.ts +1 -1
  74. package/src/components/data-table/cell-selection/__tests__/feature.test.ts +1 -1
  75. package/src/components/data-table/cell-selection/types.ts +1 -1
  76. package/src/components/data-table/cell-styling/types.ts +1 -1
  77. package/src/components/data-table/charts/chart-spec/altair-generator.ts +2 -2
  78. package/src/components/data-table/column-formatting/types.ts +2 -2
  79. package/src/components/data-table/column-summary/legacy-chart-spec.ts +1 -1
  80. package/src/components/data-table/column-wrapping/types.ts +1 -1
  81. package/src/components/data-table/copy-column/types.ts +1 -1
  82. package/src/components/data-table/focus-row/types.ts +1 -1
  83. package/src/components/data-table/loading-table.tsx +1 -1
  84. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +2 -2
  85. package/src/components/data-table/range-focus/atoms.ts +2 -2
  86. package/src/components/dependency-graph/dependency-graph-tree.tsx +1 -1
  87. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +1 -1
  88. package/src/components/editor/ai/ai-completion-editor.tsx +1 -1
  89. package/src/components/editor/app-container.tsx +1 -1
  90. package/src/components/editor/chrome/panels/empty-state.tsx +1 -0
  91. package/src/components/editor/controls/keyboard-shortcuts.tsx +1 -1
  92. package/src/components/editor/navigation/__tests__/navigation.test.ts +1 -1
  93. package/src/components/editor/navigation/navigation.ts +1 -1
  94. package/src/components/editor/notebook-cell.tsx +1 -1
  95. package/src/components/editor/output/JsonOutput.tsx +4 -4
  96. package/src/components/editor/output/ansi-reduce.ts +2 -2
  97. package/src/components/editor/output/console/ConsoleOutput.tsx +1 -1
  98. package/src/components/editor/renderers/cells-renderer.tsx +1 -1
  99. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +1 -1
  100. package/src/components/editor/renderers/plugins.ts +1 -1
  101. package/src/components/editor/renderers/slides-layout/types.ts +2 -2
  102. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +2 -2
  103. package/src/components/editor/renderers/vertical-layout/__tests__/vertical-layout.test.ts +1 -1
  104. package/src/components/find-replace/find-replace.tsx +3 -1
  105. package/src/components/forms/form.tsx +1 -1
  106. package/src/components/forms/options.ts +1 -1
  107. package/src/components/static-html/static-banner.tsx +2 -2
  108. package/src/components/terminal/terminal.tsx +4 -4
  109. package/src/components/ui/button.tsx +1 -1
  110. package/src/components/ui/command.tsx +1 -1
  111. package/src/core/ai/context/providers/__tests__/datasource.test.ts +1 -1
  112. package/src/core/ai/context/providers/__tests__/error.test.ts +1 -1
  113. package/src/core/ai/context/providers/__tests__/variable.test.ts +1 -1
  114. package/src/core/ai/context/registry.ts +2 -2
  115. package/src/core/ai/tools/registry.ts +1 -1
  116. package/src/core/cells/__tests__/cells.test.ts +2 -2
  117. package/src/core/cells/__tests__/scrollCellIntoView.test.ts +1 -1
  118. package/src/core/cells/__tests__/session.test.ts +1 -1
  119. package/src/core/cells/__tests__/utils.test.ts +1 -1
  120. package/src/core/cells/cells.ts +1 -1
  121. package/src/core/cells/ids.ts +1 -1
  122. package/src/core/codemirror/ai/request.ts +1 -1
  123. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +1 -1
  124. package/src/core/codemirror/copilot/__tests__/transport.test.ts +1 -1
  125. package/src/core/codemirror/copilot/language-server.ts +1 -1
  126. package/src/core/codemirror/copilot/types.ts +1 -1
  127. package/src/core/codemirror/facet.ts +1 -1
  128. package/src/core/codemirror/language/__tests__/sql.test.ts +4 -4
  129. package/src/core/codemirror/language/languages/sql/completion-builder.ts +1 -1
  130. package/src/core/codemirror/language/metadata.ts +1 -1
  131. package/src/core/codemirror/language/types.ts +1 -1
  132. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -1
  133. package/src/core/codemirror/lsp/notebook-lsp.ts +1 -1
  134. package/src/core/codemirror/misc/__tests__/dnd.test.ts +1 -1
  135. package/src/core/codemirror/rtc/loro/awareness.ts +1 -1
  136. package/src/core/config/feature-flag.tsx +1 -1
  137. package/src/core/dom/outline.ts +1 -1
  138. package/src/core/export/__tests__/hooks.test.ts +1 -1
  139. package/src/core/hotkeys/__tests__/hotkeys.test.ts +1 -1
  140. package/src/core/hotkeys/shortcuts.ts +1 -1
  141. package/src/core/islands/__tests__/bridge.test.ts +2 -2
  142. package/src/core/islands/bridge.ts +2 -2
  143. package/src/core/islands/components/output-wrapper.tsx +1 -1
  144. package/src/core/islands/parse.ts +1 -1
  145. package/src/core/lsp/__tests__/transport.test.ts +1 -1
  146. package/src/core/network/DeferredRequestRegistry.ts +1 -1
  147. package/src/core/network/__tests__/requests-network.test.ts +1 -1
  148. package/src/core/network/api.ts +2 -2
  149. package/src/core/network/requests-lazy.ts +1 -1
  150. package/src/core/network/requests-toasting.tsx +1 -1
  151. package/src/core/static/files.ts +1 -1
  152. package/src/core/vscode/vscode-bindings.ts +1 -1
  153. package/src/core/wasm/bridge.ts +3 -3
  154. package/src/core/wasm/worker/tracer.ts +1 -1
  155. package/src/core/websocket/useWebSocket.tsx +2 -2
  156. package/src/css/globals.css +37 -61
  157. package/src/custom.d.ts +1 -1
  158. package/src/hooks/__tests__/useDuplicateShortcuts.test.ts +2 -2
  159. package/src/hooks/debug.ts +3 -3
  160. package/src/hooks/useDebounce.ts +1 -1
  161. package/src/hooks/useEventListener.ts +1 -1
  162. package/src/hooks/useHotkey.ts +1 -1
  163. package/src/hooks/useLifecycle.ts +2 -2
  164. package/src/hooks/useNonce.ts +1 -1
  165. package/src/hooks/useResizeObserver.ts +2 -2
  166. package/src/main.tsx +1 -1
  167. package/src/plugins/core/RenderHTML.tsx +3 -3
  168. package/src/plugins/core/__test__/registerReactComponent.test.ts +1 -1
  169. package/src/plugins/core/registerReactComponent.tsx +4 -4
  170. package/src/plugins/core/rpc.ts +1 -1
  171. package/src/plugins/impl/DataTablePlugin.tsx +1 -1
  172. package/src/plugins/impl/FileBrowserPlugin.tsx +1 -1
  173. package/src/plugins/impl/FormPlugin.tsx +1 -1
  174. package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +1 -1
  175. package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +1 -1
  176. package/src/plugins/impl/anywidget/model.ts +1 -1
  177. package/src/plugins/impl/anywidget/types.ts +2 -2
  178. package/src/plugins/impl/anywidget/widget-binding.ts +1 -1
  179. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  180. package/src/plugins/impl/chat/chat-ui.tsx +1 -1
  181. package/src/plugins/impl/data-editor/glide-data-editor.tsx +1 -1
  182. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +2 -2
  183. package/src/plugins/impl/data-explorer/components/query-form.tsx +1 -1
  184. package/src/plugins/impl/data-explorer/functions/function.ts +1 -1
  185. package/src/plugins/impl/data-explorer/queries/types.ts +1 -1
  186. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -1
  187. package/src/plugins/impl/data-frames/forms/renderers.tsx +1 -1
  188. package/src/plugins/impl/data-frames/utils/operators.ts +1 -1
  189. package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +1 -1
  190. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +1 -1
  191. package/src/plugins/impl/panel/PanelPlugin.tsx +2 -2
  192. package/src/plugins/impl/plotly/Plot.tsx +3 -3
  193. package/src/plugins/impl/vega/batched.ts +1 -1
  194. package/src/plugins/impl/vega/make-selectable.ts +1 -1
  195. package/src/plugins/impl/vega/types.ts +1 -1
  196. package/src/plugins/layout/DownloadPlugin.tsx +1 -1
  197. package/src/plugins/layout/LazyPlugin.tsx +1 -1
  198. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  199. package/src/plugins/layout/mermaid/mermaid.tsx +1 -1
  200. package/src/plugins/plugins.ts +1 -1
  201. package/src/stories/data-explorer.stories.tsx +1 -1
  202. package/src/stories/dataframe.stories.tsx +1 -1
  203. package/src/stories/editor.stories.tsx +1 -1
  204. package/src/stories/select.stories.tsx +1 -1
  205. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  206. package/src/utils/Logger.ts +1 -1
  207. package/src/utils/__tests__/arrays.test.ts +1 -1
  208. package/src/utils/__tests__/blob.test.ts +1 -1
  209. package/src/utils/__tests__/dates.test.ts +1 -1
  210. package/src/utils/__tests__/errors.test.ts +1 -1
  211. package/src/utils/__tests__/objects.test.ts +3 -3
  212. package/src/utils/__tests__/waitForWs.test.ts +1 -1
  213. package/src/utils/arrays.ts +1 -1
  214. package/src/utils/assertNever.ts +1 -1
  215. package/src/utils/batch-requests.ts +2 -2
  216. package/src/utils/createReducer.ts +2 -2
  217. package/src/utils/id-tree.tsx +2 -2
  218. package/src/utils/idle.ts +1 -1
  219. package/src/utils/invariant.ts +1 -2
  220. package/src/utils/maps.ts +1 -1
  221. package/src/utils/math.ts +0 -1
  222. package/src/utils/multi-map.ts +1 -1
  223. package/src/utils/objects.ts +1 -1
  224. package/src/utils/once.ts +2 -2
  225. package/src/utils/staticImplements.ts +1 -1
  226. package/src/utils/storage/jotai.ts +1 -1
  227. package/src/utils/tracer.ts +2 -2
  228. package/dist/assets/glide-data-editor-CDqunAkw.js +0 -132
  229. package/dist/assets/useLifecycle-D202VvPd.js +0 -1
@@ -156,7 +156,7 @@ export const AiCompletionEditor: React.FC<Props> = ({
156
156
  // Use complete to pass the prompt directly, else input might be empty
157
157
  complete(initialPrompt);
158
158
  }
159
- // eslint-disable-next-line react-hooks/exhaustive-deps
159
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
160
160
  }, [triggerImmediately]);
161
161
 
162
162
  // Focus the input
@@ -31,7 +31,7 @@ export const AppContainer: React.FC<PropsWithChildren<Props>> = ({
31
31
  <StatusOverlay connection={connection} isRunning={isRunning} />
32
32
  <PyodideLoader>
33
33
  <WrappedWithSidebar>
34
- {/** biome-ignore lint/correctness/useUniqueElementIds: ID is used by other components to grab the DOM element */}
34
+ {/** oxlint-ignore-next-line -- ID is used by other components to grab the DOM element */}
35
35
  <div
36
36
  id="App"
37
37
  data-config-width={width}
@@ -18,6 +18,7 @@ export const PanelEmptyState = ({
18
18
  <div className="mx-6 my-6 flex flex-col gap-2">
19
19
  <div className="flex flex-row gap-2 items-center">
20
20
  {icon &&
21
+ // oxlint-disable-next-line react/no-clone-element
21
22
  React.cloneElement(icon, {
22
23
  className: "text-accent-foreground flex-shrink-0",
23
24
  })}
@@ -90,7 +90,7 @@ export const KeyboardShortcuts: React.FC = () => {
90
90
  },
91
91
  };
92
92
 
93
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
93
+ // oxlint-disable-next-line typescript/no-dynamic-delete
94
94
  delete newConfig.keymap.overrides[editingShortcut];
95
95
 
96
96
  setEditingShortcut(null);
@@ -134,7 +134,7 @@ const mockRequestClient = MockRequestClient.create();
134
134
  // Helper to setup selection
135
135
  const setupSelection = () => {
136
136
  const { reducer, cellSelectionAtom } = selectionTesting;
137
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
137
+ // oxlint-disable-next-line typescript/no-explicit-any
138
138
  const dispatch = (action: any) => {
139
139
  store.set(cellSelectionAtom, (prev: CellSelectionState) =>
140
140
  reducer(prev, action),
@@ -614,7 +614,7 @@ export function useCellNavigationProps(
614
614
  if (isShortcutPressed(shortcut as HotkeyAction, evt)) {
615
615
  // If the handler is a function, it's a single-cell handler
616
616
  // and we only operate on the currently focused cell.
617
- if (handler instanceof Function) {
617
+ if (typeof handler === "function") {
618
618
  const success = handler(cellId);
619
619
  if (success) {
620
620
  evt.preventDefault();
@@ -704,7 +704,7 @@ const EditableCellComponent = ({
704
704
  <a
705
705
  href="https://links.marimo.app/reusable-definitions"
706
706
  target="_blank"
707
- rel="noopener"
707
+ rel="noreferrer"
708
708
  >
709
709
  <SquareFunctionIcon
710
710
  size={16}
@@ -46,7 +46,7 @@ interface Props {
46
46
  valueTypes?: "json" | "python";
47
47
  }
48
48
 
49
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ // oxlint-disable-next-line typescript/no-explicit-any
50
50
  const CopyButton: React.FC<DataItemProps<any>> = ({ value }) => {
51
51
  const skipCopy =
52
52
  typeof value === "string" &&
@@ -83,13 +83,13 @@ const CopyButton: React.FC<DataItemProps<any>> = ({ value }) => {
83
83
  );
84
84
  };
85
85
 
86
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ // oxlint-disable-next-line typescript/no-explicit-any
87
87
  const JSONCopyButton: React.FC<DataItemProps<any>> = (props) => {
88
88
  // if
89
89
  return <CopyButton {...props} value={JSON.stringify(props.value, null, 2)} />;
90
90
  };
91
91
 
92
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
+ // oxlint-disable-next-line typescript/no-explicit-any
93
93
  const PyCopyButton: React.FC<DataItemProps<any>> = (props) => {
94
94
  return <CopyButton {...props} value={getCopyValue(props.value)} />;
95
95
  };
@@ -233,7 +233,7 @@ const LEAF_RENDERERS: Record<string, LeafRenderer> = {
233
233
  },
234
234
  };
235
235
 
236
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
236
+ // oxlint-disable-next-line typescript/no-explicit-any
237
237
  const MIME_TYPES: DataType<any>[] = Object.entries(LEAF_RENDERERS).map(
238
238
  ([leafType, render]) => ({
239
239
  is: (value) => typeof value === "string" && value.startsWith(leafType),
@@ -13,7 +13,7 @@ export interface Cursor {
13
13
  export class TerminalBuffer {
14
14
  private lines: string[] = [""];
15
15
  private cursor: Cursor = { row: 0, col: 0 };
16
- // biome-ignore lint/suspicious/noControlCharactersInRegex: Needed for ANSI parsing
16
+ // oxlint-ignore-next-line no-control-regex -- Needed for ANSI escape sequence parsing
17
17
  private static readonly ESCAPE_REGEX = /\u001B\[([0-9;]*)([A-DJKH])/u;
18
18
 
19
19
  /** Ensure the internal lines array is large enough. */
@@ -185,7 +185,7 @@ export class TerminalBuffer {
185
185
  */
186
186
  export class AnsiParser {
187
187
  // Matches both CSI sequences (ESC[...letter) and other escape sequences like character set selection (ESC(B)
188
- // biome-ignore lint/suspicious/noControlCharactersInRegex: Needed for ANSI parsing
188
+ // oxlint-ignore-next-line no-control-regex -- Needed for ANSI parsing
189
189
  private ESC_REGEX = /\u001B(?:\[[0-9;]*[A-Za-z]|\([0-9A-Za-z])/gu;
190
190
 
191
191
  parse(input: string): { type: "text" | "escape"; value: string }[] {
@@ -234,7 +234,7 @@ const ConsoleOutputInternal = (props: Props): React.ReactNode => {
234
234
  data-testid="console-output-area"
235
235
  ref={ref}
236
236
  {...selectAllProps}
237
- // biome-ignore lint/a11y/noNoninteractiveTabindex: Needed to capture keypress events
237
+ // oxlint-ignore-next-line jsx-a11y/no-noninteractive-tabindex -- Needed to capture keypress events
238
238
  tabIndex={0}
239
239
  className={cn(
240
240
  "console-output-area overflow-hidden rounded-b-lg flex flex-col-reverse w-full gap-1 focus:outline-hidden",
@@ -69,7 +69,7 @@ CellsRenderer.displayName = "CellsRenderer";
69
69
  interface PluginCellRendererProps extends PropsWithChildren<Props> {
70
70
  appConfig: AppConfig;
71
71
  mode: AppMode;
72
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
+ // oxlint-disable-next-line typescript/no-explicit-any
73
73
  plugin: ICellRendererPlugin<any, any>;
74
74
  layoutData: Partial<Record<LayoutType, LayoutData>>;
75
75
  finalLayout: LayoutType;
@@ -329,7 +329,7 @@ export const GridLayoutRenderer: React.FC<Props> = ({
329
329
  <div
330
330
  key={cell.id}
331
331
  draggable={true}
332
- // eslint-disable-next-line react/no-unknown-property
332
+ // oxlint-disable-next-line react/no-unknown-property
333
333
  unselectable="on"
334
334
  data-cell-id={cell.id}
335
335
  // Firefox requires some kind of initialization which we can do by adding this attribute
@@ -7,7 +7,7 @@ import type { ICellRendererPlugin, LayoutType } from "./types";
7
7
  import { VerticalLayoutPlugin } from "./vertical-layout/vertical-layout";
8
8
 
9
9
  // If more renderers are added, we may want to consider lazy loading them.
10
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ // oxlint-disable-next-line typescript/no-explicit-any
11
11
  export const cellRendererPlugins: ICellRendererPlugin<any, any>[] = [
12
12
  GridLayoutPlugin,
13
13
  SlidesLayoutPlugin,
@@ -1,11 +1,11 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  /**
5
5
  * The serialized form of a slides layout.
6
6
  * This must be backwards-compatible as it is stored on the user's disk.
7
7
  */
8
- // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
8
+ // oxlint-disable-next-line typescript/consistent-type-definitions
9
9
  export type SerializedSlidesLayout = {};
10
10
 
11
11
  export interface SlidesLayout extends SerializedSlidesLayout {
@@ -110,9 +110,9 @@ describe("useFocusFirstEditor", () => {
110
110
  expect(querySelectorSpy).toHaveBeenCalledWith(
111
111
  '[data-cell-name="testCell"]',
112
112
  );
113
- // eslint-disable-next-line @typescript-eslint/unbound-method
113
+ // oxlint-disable-next-line typescript/unbound-method
114
114
  expect(mockElement.scrollIntoView).toHaveBeenCalled();
115
- // eslint-disable-next-line @typescript-eslint/unbound-method
115
+ // oxlint-disable-next-line typescript/unbound-method
116
116
  expect(mockElement.focus).toHaveBeenCalled();
117
117
  expect(mockEditor.focus).toHaveBeenCalled();
118
118
 
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
  import { describe, expect, it } from "vitest";
4
4
  import type { OutputMessage } from "@/core/kernel/messages";
5
5
  import { groupCellsByColumn, shouldHideCode } from "../vertical-layout";
@@ -221,7 +221,9 @@ export const FindReplace: React.FC = () => {
221
221
  variant="outline"
222
222
  className="h-6 text-xs"
223
223
  onClick={() => {
224
- replaceNext() && resetMatches();
224
+ if (replaceNext()) {
225
+ resetMatches();
226
+ }
225
227
  }}
226
228
  disabled={state.findText === ""}
227
229
  >
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { PlusIcon, RefreshCcw, Trash2Icon } from "lucide-react";
5
5
  import React from "react";
@@ -35,7 +35,7 @@ export interface FieldOptions {
35
35
  optionRegex?: string;
36
36
  }
37
37
 
38
- // eslint-disable-next-line @typescript-eslint/no-redeclare
38
+ // oxlint-disable-next-line typescript/no-redeclare
39
39
  export const FieldOptions = {
40
40
  of(options: FieldOptions): string {
41
41
  return JSON.stringify(options);
@@ -1,6 +1,6 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable react/jsx-no-comment-textnodes */
3
- /* eslint-disable react/jsx-no-target-blank */
2
+ /* oxlint-disable react/jsx-no-comment-textnodes */
3
+ /* oxlint-disable react/jsx-no-target-blank */
4
4
 
5
5
  import { useAtomValue } from "jotai";
6
6
  import { CopyIcon, DownloadIcon } from "lucide-react";
@@ -143,7 +143,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
143
143
  const terminalRef = useRef<HTMLDivElement>(null);
144
144
  const wsRef = useRef<WebSocket | null>(null);
145
145
 
146
- // eslint-disable-next-line react/hook-use-state
146
+ // oxlint-disable-next-line react/hook-use-state
147
147
  const [{ terminal, fitAddon, searchAddon }] = useState(() => {
148
148
  // Create a new terminal instance
149
149
  const term = new Terminal({
@@ -300,7 +300,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
300
300
  return () => {
301
301
  // noop
302
302
  };
303
- // eslint-disable-next-line react-hooks/exhaustive-deps
303
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
304
304
  }, [initialized]);
305
305
 
306
306
  // Process pending commands when terminal is ready
@@ -335,7 +335,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
335
335
  }
336
336
 
337
337
  return;
338
- // eslint-disable-next-line react-hooks/exhaustive-deps
338
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
339
339
  }, [visible]);
340
340
 
341
341
  // On mount
@@ -373,7 +373,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
373
373
  return () => {
374
374
  abortController.abort();
375
375
  };
376
- // eslint-disable-next-line react-hooks/exhaustive-deps
376
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
377
377
  }, []);
378
378
 
379
379
  return (
@@ -108,7 +108,7 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
108
108
 
109
109
  React.useImperativeHandle(
110
110
  ref,
111
- // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style
111
+ // oxlint-disable-next-line typescript/non-nullable-type-assertion-style
112
112
  () => buttonRef.current as HTMLButtonElement,
113
113
  );
114
114
 
@@ -61,7 +61,7 @@ const CommandInput = React.forwardRef<
61
61
  >(({ className, icon, rootClassName, ...props }, ref) => (
62
62
  <div
63
63
  className={cn("flex items-center border-b px-3", rootClassName)}
64
- // eslint-disable-next-line react/no-unknown-property
64
+ // oxlint-disable-next-line react/no-unknown-property
65
65
  cmdk-input-wrapper=""
66
66
  >
67
67
  {icon === null ? null : (
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { beforeEach, describe, expect, it } from "vitest";
5
5
  import { cellId, variableName } from "@/__tests__/branded";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { createStore } from "jotai";
5
5
  import { beforeEach, describe, expect, it } from "vitest";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { describe, expect, it, vi } from "vitest";
5
5
  import { cellId, variableName } from "@/__tests__/branded";
@@ -98,7 +98,7 @@ export abstract class AIContextProvider<
98
98
  * Registry for managing different AI context providers
99
99
  */
100
100
  export class AIContextRegistry<T extends AIContextItem> {
101
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
+ // oxlint-disable-next-line typescript/no-explicit-any
102
102
  private providers = new Set<AIContextProvider<any>>();
103
103
 
104
104
  /**
@@ -106,7 +106,7 @@ export class AIContextRegistry<T extends AIContextItem> {
106
106
  */
107
107
  register<U extends AIContextItem>(
108
108
  provider: AIContextProvider<U>,
109
- // eslint-disable-next-line @typescript-eslint/prefer-return-this-type
109
+ // oxlint-disable-next-line typescript/prefer-return-this-type
110
110
  ): AIContextRegistry<U | T> {
111
111
  this.providers.add(provider);
112
112
  return this;
@@ -14,7 +14,7 @@ import { formatToolDescription } from "./utils";
14
14
 
15
15
  export type AnyZodObject = ZodObject<z.ZodRawShape>;
16
16
 
17
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ // oxlint-disable-next-line typescript/no-explicit-any
18
18
  type StoredTool = AiTool<any, any>;
19
19
 
20
20
  interface InvokeResult<TName> {
@@ -45,7 +45,7 @@ vi.mock("@/core/codemirror/editing/commands", () => ({
45
45
  vi.mock("../scrollCellIntoView", async (importOriginal) => {
46
46
  const actual = await importOriginal();
47
47
  return {
48
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ // oxlint-disable-next-line typescript/no-explicit-any
49
49
  ...(actual as any),
50
50
  scrollToTop: vi.fn(),
51
51
  scrollToBottom: vi.fn(),
@@ -1023,7 +1023,7 @@ describe("cell reducer", () => {
1023
1023
  });
1024
1024
  cell = cells[0];
1025
1025
  expect(cell.status).toBe("idle");
1026
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1026
+ // oxlint-disable-next-line typescript/no-explicit-any no-unsafe-optional-chaining
1027
1027
  expect((cell.output?.data as any)[0].msg).toBe(
1028
1028
  "This cell wasn't run because an ancestor was stopped with `mo.stop`: ",
1029
1029
  );
@@ -40,7 +40,7 @@ describe("scrollCellIntoView", () => {
40
40
 
41
41
  it("should scroll active line when editor has focus", () => {
42
42
  const mockEditor = { hasFocus: true };
43
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ // oxlint-disable-next-line typescript/no-explicit-any
44
44
  mockGetCellEditorView.mockReturnValue(mockEditor as any);
45
45
 
46
46
  scrollCellIntoView(cid);
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import type * as api from "@marimo-team/marimo-api";
4
- /* eslint-disable @typescript-eslint/no-explicit-any */
4
+ /* oxlint-disable typescript/no-explicit-any */
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
6
6
  import { Mocks } from "@/__mocks__/common";
7
7
  import { cellId } from "@/__tests__/branded";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
  import { describe, expect, it } from "vitest";
4
4
  import {
5
5
  getCellConfigs,
@@ -80,7 +80,7 @@ export interface NotebookState {
80
80
  */
81
81
  history: {
82
82
  name: string;
83
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ // oxlint-disable-next-line typescript/no-explicit-any
84
84
  serializedEditorState: any;
85
85
  column: CellColumnId;
86
86
  index: CellIndex;
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-redeclare */
2
+ /* oxlint-disable typescript/no-redeclare */
3
3
 
4
4
  import type { components } from "@marimo-team/marimo-api";
5
5
  import { OBJECT_ID_ATTR } from "@/core/dom/ui-element-constants";
@@ -53,7 +53,7 @@ ${opts.codeAfter}
53
53
  }
54
54
 
55
55
  let result = "";
56
- // eslint-disable-next-line no-constant-condition
56
+ // oxlint-disable-next-line no-constant-condition
57
57
  while (true) {
58
58
  const { done, value } = await reader.read();
59
59
  if (done) {
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { Transport } from "@open-rpc/client-js/build/transports/Transport";
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { WebSocketTransport } from "@open-rpc/client-js";
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
@@ -121,7 +121,7 @@ export class CopilotLanguageServerClient extends LanguageServerClient {
121
121
  ).request(method, params);
122
122
  }
123
123
 
124
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
+ // oxlint-disable-next-line typescript/no-explicit-any
125
125
  override async notify(method: any, params: any): Promise<any> {
126
126
  logger.debug("#notify", method, params);
127
127
  return super.notify(method, params);
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  export interface GitHubCopilotSignInInitiateResult {
5
5
  verificationUri: string; // https://github.com/login/device
@@ -15,7 +15,7 @@ import { Facet } from "@codemirror/state";
15
15
  export function singleFacet<T>() {
16
16
  return Facet.define<T, T>({
17
17
  combine: (values) => {
18
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
18
+ // oxlint-disable-next-line typescript/no-non-null-assertion
19
19
  return values.find((v) => v !== undefined)!;
20
20
  },
21
21
  });
@@ -1722,9 +1722,9 @@ describe("tablesCompletionSource", () => {
1722
1722
  };
1723
1723
 
1724
1724
  const getCompletion = (extensions: Extension[]) => {
1725
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1725
+ // oxlint-disable-next-line typescript/no-explicit-any
1726
1726
  const ext = extensions.find((ext) => (ext as any).facet === undefined);
1727
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1727
+ // oxlint-disable-next-line typescript/no-explicit-any
1728
1728
  return (ext as any)?.value?.override?.[0];
1729
1729
  };
1730
1730
 
@@ -2140,7 +2140,7 @@ describe("tablesCompletionSource", () => {
2140
2140
  ...mockStore.get(dataSourceConnectionsAtom),
2141
2141
  connectionsMap: new Map([
2142
2142
  [TEST_ENGINE, newConnection],
2143
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2143
+ // oxlint-disable-next-line typescript/no-explicit-any
2144
2144
  ]) as any,
2145
2145
  latestEngineSelected: TEST_ENGINE,
2146
2146
  });
@@ -2153,7 +2153,7 @@ describe("tablesCompletionSource", () => {
2153
2153
  mockStore.set(dataSourceConnectionsAtom, {
2154
2154
  connectionsMap: new Map([
2155
2155
  [TEST_ENGINE, mockConnection],
2156
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2156
+ // oxlint-disable-next-line typescript/no-explicit-any
2157
2157
  ]) as any,
2158
2158
  latestEngineSelected: TEST_ENGINE,
2159
2159
  });
@@ -76,7 +76,7 @@ export class CompletionBuilder {
76
76
  * Set a value at a nested path, creating intermediate objects as needed
77
77
  */
78
78
  private setAt(path: string[], value: SQLNamespace): void {
79
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ // oxlint-disable-next-line typescript/no-explicit-any
80
80
  let current: any = this.schema;
81
81
  for (const key of path.slice(0, -1)) {
82
82
  if (!current[key]) {
@@ -5,7 +5,7 @@ import type { EditorView } from "@codemirror/view";
5
5
  /**
6
6
  * Metadata for language adapters
7
7
  */
8
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ // oxlint-disable-next-line typescript/no-explicit-any
9
9
  export type LanguageMetadata = Record<string, any>;
10
10
 
11
11
  /**
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import type { Extension } from "@codemirror/state";
5
5
  import type { CellId } from "@/core/cells/ids";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { EditorView } from "@codemirror/view";
5
5
  import {
@@ -815,7 +815,7 @@ export class NotebookLanguageServerClient implements ILanguageServerClient {
815
815
  ...diag,
816
816
  range: lens.reverseRange(diag.range, cellId),
817
817
  };
818
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
818
+ // oxlint-disable-next-line typescript/no-non-null-assertion
819
819
  diagnosticsByCellId.get(cellId)!.push(cellDiag);
820
820
  break; // Exit inner loop once we find the matching cell
821
821
  }
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
  import { EditorView } from "@codemirror/view";
4
4
  import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
5
  import { dndBundle } from "../dnd";
@@ -185,7 +185,7 @@ export const createSelectionLayer = (): Extension =>
185
185
  .flatMap(([, state]) => {
186
186
  const selectionRange = EditorSelection.range(
187
187
  state.cursor.anchor,
188
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
188
+ // oxlint-disable-next-line typescript/no-non-null-assertion
189
189
  state.cursor.head!,
190
190
  );
191
191
  const markers = RectangleMarker.forRange(
@@ -4,7 +4,7 @@ import { repl } from "@/utils/repl";
4
4
  import { getRequestClient } from "../network/requests";
5
5
  import { getResolvedMarimoConfig } from "./config";
6
6
 
7
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
7
+ // oxlint-disable-next-line typescript/no-empty-object-type
8
8
  export interface ExperimentalFeatures {
9
9
  markdown: boolean; // Used in playground (community cloud)
10
10
  wasm_layouts: boolean; // Used in playground (community cloud)
@@ -39,7 +39,7 @@ function getOutline(html: string): Outline | null {
39
39
  const document = parser.parseFromString(html, "text/html");
40
40
 
41
41
  const headings = document.querySelectorAll(HEADER_TAGS);
42
- // eslint-disable-next-line unicorn/prefer-spread
42
+ // oxlint-disable-next-line unicorn/prefer-spread
43
43
  for (const heading of Array.from(headings)) {
44
44
  const name = heading.textContent;
45
45
  // Check if the heading is within any of the excluded tags
@@ -55,7 +55,7 @@ describe("useEnrichCellOutputs", () => {
55
55
 
56
56
  // Helper to set the mocked atom (cast to any to work around type mismatch)
57
57
  const setCellsRuntime = (value: Record<CellId, CellRuntimeState>) => {
58
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
+ // oxlint-disable-next-line typescript/no-explicit-any
59
59
  store.set(cellsRuntimeAtom as any, value);
60
60
  };
61
61
 
@@ -15,7 +15,7 @@ function createHotkeys(
15
15
  keys: Partial<Record<HotkeyAction, Hotkey>>,
16
16
  ): Record<HotkeyAction, Hotkey> {
17
17
  return new Proxy(keys as Record<HotkeyAction, Hotkey>, {
18
- // biome-ignore lint: ok to have three arguments here (It's a web API)
18
+ // oxlint-ignore-next-line -- ok to have three arguments here (It's a web API)
19
19
  get(target, p, receiver) {
20
20
  const key = Reflect.get(target, p, receiver);
21
21
  if (key === "undefined") {