From a12d0426f0845071ac6cc89caedfb693620c52e1 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Wed, 8 Oct 2025 16:07:55 +0200 Subject: [PATCH 01/21] feat: Set up a custom renderer for data frames. --- build/esbuild/build.ts | 5 +++ package.json | 10 +++++ .../dataframe-renderer/DataframeRenderer.tsx | 11 +++++ .../webview-side/dataframe-renderer/index.ts | 35 ++++++++++++++++ .../dataframe-renderer/styles.css | 42 +++++++++++++++++++ 5 files changed, 103 insertions(+) create mode 100644 src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx create mode 100644 src/webviews/webview-side/dataframe-renderer/index.ts create mode 100644 src/webviews/webview-side/dataframe-renderer/styles.css diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index a9339a35de..a1093e1e93 100644 --- a/build/esbuild/build.ts +++ b/build/esbuild/build.ts @@ -287,6 +287,11 @@ async function buildAll() { ), { target: 'web', watch: watchAll } ), + build( + path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'dataframe-renderer', 'index.ts'), + path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'dataframeRenderer', 'dataframeRenderer.js'), + { target: 'web', watch: isWatchMode } + ), build( path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'variable-view', 'index.tsx'), path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'viewers', 'variableView.js'), diff --git a/package.json b/package.json index 0505a7f89f..a724a5a9d8 100644 --- a/package.json +++ b/package.json @@ -1809,6 +1809,16 @@ "entrypoint": "./dist/webviews/webview-side/ipywidgetsKernel/ipywidgetsKernel.js" } ], + "notebookRenderer": [ + { + "id": "deepnote-dataframe-renderer", + "displayName": "Deepnote Dataframe Renderer", + "entrypoint": "./dist/webviews/webview-side/dataframeRenderer/dataframeRenderer.js", + "mimeTypes": [ + "application/vnd.deepnote.dataframe.v3+json" + ] + } + ], "viewsContainers": { "activitybar": [ { diff --git a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx new file mode 100644 index 0000000000..8c7c9f592c --- /dev/null +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -0,0 +1,11 @@ +import * as React from 'react'; + +interface DataframeRendererProps { + data: any; +} + +export const DataframeRenderer: React.FC = ({ data }) => { + console.log('DataframeRenderer', data); + + return
This is the Deepnote dataframe renderer
; +}; diff --git a/src/webviews/webview-side/dataframe-renderer/index.ts b/src/webviews/webview-side/dataframe-renderer/index.ts new file mode 100644 index 0000000000..79d9cc761d --- /dev/null +++ b/src/webviews/webview-side/dataframe-renderer/index.ts @@ -0,0 +1,35 @@ +import './styles.css'; + +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; + +import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-notebook-renderer'; + +import { DataframeRenderer } from './DataframeRenderer'; + +export const activate: ActivationFunction = (_context: RendererContext) => { + return { + renderOutputItem(outputItem: OutputItem, element: HTMLElement) { + try { + const data = outputItem.json(); + console.log('Dataframe renderer - received data:', data); + + const root = document.createElement('div'); + element.appendChild(root); + + ReactDOM.render(React.createElement(DataframeRenderer, { data }), root); + } catch (error) { + console.error('Error rendering dataframe:', error); + const errorDiv = document.createElement('div'); + errorDiv.style.padding = '10px'; + errorDiv.style.color = 'var(--vscode-errorForeground)'; + errorDiv.textContent = `Error rendering dataframe: ${error}`; + element.appendChild(errorDiv); + } + }, + + disposeOutputItem(_id?: string) { + // Cleanup if needed + } + }; +}; diff --git a/src/webviews/webview-side/dataframe-renderer/styles.css b/src/webviews/webview-side/dataframe-renderer/styles.css new file mode 100644 index 0000000000..181e7c4a10 --- /dev/null +++ b/src/webviews/webview-side/dataframe-renderer/styles.css @@ -0,0 +1,42 @@ +.dataframe-container { + overflow: auto; + max-width: 100%; + font-family: var(--vscode-editor-font-family); + font-size: var(--vscode-editor-font-size); +} + +.dataframe-table { + border-collapse: collapse; + width: 100%; + border: 1px solid var(--vscode-panel-border); +} + +.dataframe-table th { + background-color: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + font-weight: 600; + padding: 8px 12px; + text-align: left; + position: sticky; + top: 0; + color: var(--vscode-foreground); +} + +.dataframe-table td { + border: 1px solid var(--vscode-panel-border); + padding: 6px 12px; + color: var(--vscode-foreground); +} + +.dataframe-table tbody tr.even-row { + background-color: var(--vscode-editor-background); +} + +.dataframe-table tbody tr.odd-row { + background-color: var(--vscode-list-hoverBackground); +} + +.dataframe-table tbody tr:hover { + background-color: var(--vscode-list-activeSelectionBackground); + color: var(--vscode-list-activeSelectionForeground); +} From c19acd42c6dacefe38262f339021f675ab956248 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Thu, 9 Oct 2025 12:05:10 +0200 Subject: [PATCH 02/21] wip --- package.json | 3 +- src/kernels/deepnote/deepnoteController.ts | 91 +++++++++++++ src/kernels/execution/cellExecution.ts | 4 + .../controllers/vscodeNotebookController.ts | 6 +- .../extension-side/dataframe/rendererComms.ts | 124 ++++++++++++++++++ .../extension-side/serviceRegistry.node.ts | 5 + .../extension-side/serviceRegistry.web.ts | 5 + .../dataframe-renderer/DataframeRenderer.tsx | 71 +++++++++- .../webview-side/dataframe-renderer/index.ts | 5 +- .../dataframe-renderer/styles.css | 48 +++---- 10 files changed, 317 insertions(+), 45 deletions(-) create mode 100644 src/kernels/deepnote/deepnoteController.ts create mode 100644 src/webviews/extension-side/dataframe/rendererComms.ts diff --git a/package.json b/package.json index a724a5a9d8..91dc46a43a 100644 --- a/package.json +++ b/package.json @@ -1816,7 +1816,8 @@ "entrypoint": "./dist/webviews/webview-side/dataframeRenderer/dataframeRenderer.js", "mimeTypes": [ "application/vnd.deepnote.dataframe.v3+json" - ] + ], + "requiresMessaging": "optional" } ], "viewsContainers": { diff --git a/src/kernels/deepnote/deepnoteController.ts b/src/kernels/deepnote/deepnoteController.ts new file mode 100644 index 0000000000..dd5f413f84 --- /dev/null +++ b/src/kernels/deepnote/deepnoteController.ts @@ -0,0 +1,91 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + CancellationToken, + NotebookCell, + NotebookCellExecution, + NotebookCellOutput, + NotebookCellOutputItem, + NotebookController +} from 'vscode'; + +import { KernelController } from '../kernelController'; + +/** + * DeepnoteController extends KernelController to intercept cell execution + * and prepend initialization code to each cell execution. + */ +export class DeepnoteController extends KernelController { + constructor(controller: NotebookController) { + super(controller); + } + + public override createNotebookCellExecution(cell: NotebookCell): NotebookCellExecution { + const execution = super.createNotebookCellExecution(cell); + return new DeepnoteNotebookCellExecution(execution, cell); + } +} + +/** + * Wrapper around NotebookCellExecution that prepends initialization code. + * This is implemented by delegating all calls to the underlying execution object. + * + * Note: This wrapper currently just delegates to the underlying execution. + * The actual code interception will be implemented at the execution layer. + */ +class DeepnoteNotebookCellExecution implements NotebookCellExecution { + constructor( + private readonly execution: NotebookCellExecution, + public readonly cell: NotebookCell + ) { + // Prepend code will be: print("Hello world") + // This will be implemented at the CellExecution layer + } + + get executionOrder(): number | undefined { + return this.execution.executionOrder; + } + + set executionOrder(value: number | undefined) { + this.execution.executionOrder = value; + } + + get token(): CancellationToken { + return this.execution.token; + } + + public start(startTime?: number): void { + this.execution.start(startTime); + } + + public end(success: boolean | undefined, endTime?: number): void { + this.execution.end(success, endTime); + } + + public clearOutput(cell?: NotebookCell): Thenable { + return this.execution.clearOutput(cell); + } + + public replaceOutput(out: NotebookCellOutput | readonly NotebookCellOutput[], cell?: NotebookCell): Thenable { + return this.execution.replaceOutput(out, cell); + } + + public appendOutput(out: NotebookCellOutput | readonly NotebookCellOutput[], cell?: NotebookCell): Thenable { + return this.execution.appendOutput(out, cell); + } + + public replaceOutputItems( + items: NotebookCellOutputItem | readonly NotebookCellOutputItem[], + output: NotebookCellOutput + ): Thenable { + return this.execution.replaceOutputItems(items, output); + } + + public appendOutputItems( + items: NotebookCellOutputItem | readonly NotebookCellOutputItem[], + output: NotebookCellOutput + ): Thenable { + return this.execution.appendOutputItems(items, output); + } +} diff --git a/src/kernels/execution/cellExecution.ts b/src/kernels/execution/cellExecution.ts index f1710e1a5e..5675e84ce2 100644 --- a/src/kernels/execution/cellExecution.ts +++ b/src/kernels/execution/cellExecution.ts @@ -406,6 +406,10 @@ export class CellExecution implements ICellExecution, IDisposable { return this.completedSuccessfully(); } + // Prepend initialization code + const prependCode = 'print("Hello world")'; + code = prependCode + '\n' + code; + // Generate metadata from our cell (some kernels expect this.) // eslint-disable-next-line @typescript-eslint/no-explicit-any const metadata: any = { diff --git a/src/notebooks/controllers/vscodeNotebookController.ts b/src/notebooks/controllers/vscodeNotebookController.ts index 4bae4114f2..c2f689c503 100644 --- a/src/notebooks/controllers/vscodeNotebookController.ts +++ b/src/notebooks/controllers/vscodeNotebookController.ts @@ -71,7 +71,7 @@ import { initializeInteractiveOrNotebookTelemetryBasedOnUserAction } from '../.. import { NotebookCellLanguageService } from '../languages/cellLanguageService'; import { IDataScienceErrorHandler } from '../../kernels/errors/types'; import { ITrustedKernelPaths } from '../../kernels/raw/finder/types'; -import { KernelController } from '../../kernels/kernelController'; +import { DeepnoteController } from '../../kernels/deepnote/deepnoteController'; import { RemoteKernelReconnectBusyIndicator } from './remoteKernelReconnectBusyIndicator'; import { LastCellExecutionTracker } from '../../kernels/execution/lastCellExecutionTracker'; import type { IAnyMessageArgs } from '@jupyterlab/services/lib/kernel/kernel'; @@ -548,7 +548,7 @@ export class VSCodeNotebookController implements Disposable, IVSCodeNotebookCont // Creating these execution objects marks the cell as queued for execution (vscode will update cell UI). type CellExec = { cell: NotebookCell; exec: NotebookCellExecution }; const cellExecs: CellExec[] = (this.cellQueue.get(doc) || []).map((cell) => { - const exec = this.createCellExecutionIfNecessary(cell, new KernelController(this.controller)); + const exec = this.createCellExecutionIfNecessary(cell, new DeepnoteController(this.controller)); return { cell, exec }; }); this.cellQueue.delete(doc); @@ -561,7 +561,7 @@ export class VSCodeNotebookController implements Disposable, IVSCodeNotebookCont // Connect to a matching kernel if possible (but user may pick a different one) let currentContext: 'start' | 'execution' = 'start'; - let controller: IKernelController = new KernelController(this.controller); + let controller: IKernelController = new DeepnoteController(this.controller); const lastCellExecutionTracker = this.serviceContainer.get(LastCellExecutionTracker); let kernel: IKernel | undefined; try { diff --git a/src/webviews/extension-side/dataframe/rendererComms.ts b/src/webviews/extension-side/dataframe/rendererComms.ts new file mode 100644 index 0000000000..c8d13d647f --- /dev/null +++ b/src/webviews/extension-side/dataframe/rendererComms.ts @@ -0,0 +1,124 @@ +import { injectable } from 'inversify'; +import { + env, + NotebookEdit, + NotebookEditor, + NotebookRendererMessaging, + notebooks, + workspace, + WorkspaceEdit +} from 'vscode'; + +import { IExtensionSyncActivationService } from '../../../platform/activation/types'; +import { IDisposable } from '../../../platform/common/types'; +import { dispose } from '../../../platform/common/utils/lifecycle'; +import { logger } from '../../../platform/logging'; + +type SelectPageSizeCommand = { + command: 'selectPageSize'; + cellIndex: number; + size: number; +}; + +type GoToPageCommand = { + command: 'goToPage'; + cellIndex: number; + page: number; +}; + +type CopyTableDataCommand = { + command: 'copyTableData'; + data: string; +}; + +type ExportDataframeCommand = { + command: 'exportDataframe'; + cellIndex: number; +}; + +type DataframeCommand = SelectPageSizeCommand | GoToPageCommand | CopyTableDataCommand | ExportDataframeCommand; + +@injectable() +export class DataframeRendererComms implements IExtensionSyncActivationService { + private readonly disposables: IDisposable[] = []; + + public dispose() { + dispose(this.disposables); + } + + activate() { + const comms = notebooks.createRendererMessaging('deepnote-dataframe-renderer'); + comms.onDidReceiveMessage(this.onDidReceiveMessage.bind(this, comms), this, this.disposables); + } + + private onDidReceiveMessage( + _comms: NotebookRendererMessaging, + { editor, message }: { editor: NotebookEditor; message: DataframeCommand } + ) { + logger.info('DataframeRendererComms received message', message); + + if (!message || typeof message !== 'object') { + return; + } + + switch (message.command) { + case 'selectPageSize': + this.handleSelectPageSize(editor, message); + break; + case 'goToPage': + this.handleGoToPage(editor, message); + break; + case 'copyTableData': + this.handleCopyTableData(message); + break; + case 'exportDataframe': + this.handleExportDataframe(editor, message); + break; + } + } + + private async handleSelectPageSize(editor: NotebookEditor, message: SelectPageSizeCommand) { + const cell = editor.notebook.cellAt(message.cellIndex); + logger.info( + `[DataframeRenderer] selectPageSize called for cell ${ + message.cellIndex + } (${cell?.document.uri.toString()}), size=${message.size}` + ); + + // Store page size in cell metadata + if (cell) { + const edit = new WorkspaceEdit(); + const notebookEdit = NotebookEdit.updateCellMetadata(message.cellIndex, { + ...cell.metadata, + dataframePageSize: message.size + }); + edit.set(editor.notebook.uri, [notebookEdit]); + await workspace.applyEdit(edit); + } + } + + private handleGoToPage(editor: NotebookEditor, message: GoToPageCommand) { + const cell = editor.notebook.cellAt(message.cellIndex); + logger.info( + `[DataframeRenderer] goToPage called for cell ${ + message.cellIndex + } (${cell?.document.uri.toString()}), page=${message.page}` + ); + // Could store current page in cell metadata if needed + } + + private async handleCopyTableData(message: CopyTableDataCommand) { + logger.info(`[DataframeRenderer] copyTableData called, data length=${message.data.length} characters`); + await env.clipboard.writeText(message.data); + } + + private handleExportDataframe(editor: NotebookEditor, message: ExportDataframeCommand) { + const cell = editor.notebook.cellAt(message.cellIndex); + logger.info( + `[DataframeRenderer] exportDataframe called for cell ${ + message.cellIndex + } (${cell?.document.uri.toString()})` + ); + // TODO: Implement dataframe export functionality + } +} diff --git a/src/webviews/extension-side/serviceRegistry.node.ts b/src/webviews/extension-side/serviceRegistry.node.ts index 3dad485a8b..65fe3b95e8 100644 --- a/src/webviews/extension-side/serviceRegistry.node.ts +++ b/src/webviews/extension-side/serviceRegistry.node.ts @@ -17,6 +17,7 @@ import { IJupyterVariableDataProvider, IJupyterVariableDataProviderFactory } from './dataviewer/types'; +import { DataframeRendererComms } from './dataframe/rendererComms'; import { IPyWidgetRendererComms } from './ipywidgets/rendererComms'; import { PlotViewer } from './plotting/plotViewer.node'; import { PlotViewerProvider } from './plotting/plotViewerProvider'; @@ -65,6 +66,10 @@ export function registerTypes(serviceManager: IServiceManager) { IExtensionSyncActivationService, IPyWidgetRendererComms ); + serviceManager.addSingleton( + IExtensionSyncActivationService, + DataframeRendererComms + ); serviceManager.addSingleton(IVariableViewProvider, VariableViewProvider); serviceManager.add(IJupyterVariableDataProvider, JupyterVariableDataProvider); serviceManager.addSingleton( diff --git a/src/webviews/extension-side/serviceRegistry.web.ts b/src/webviews/extension-side/serviceRegistry.web.ts index 5dd0ecea4b..1767e24a0d 100644 --- a/src/webviews/extension-side/serviceRegistry.web.ts +++ b/src/webviews/extension-side/serviceRegistry.web.ts @@ -27,6 +27,7 @@ import { PlotSaveHandler } from './plotView/plotSaveHandler'; import { PlotViewHandler } from './plotView/plotViewHandler'; import { RendererCommunication } from './plotView/rendererCommunication'; import { IPlotSaveHandler } from './plotView/types'; +import { DataframeRendererComms } from './dataframe/rendererComms'; import { IPyWidgetRendererComms } from './ipywidgets/rendererComms'; import { DataViewerDelegator } from './dataviewer/dataViewerDelegator'; @@ -65,6 +66,10 @@ export function registerTypes(serviceManager: IServiceManager) { IExtensionSyncActivationService, IPyWidgetRendererComms ); + serviceManager.addSingleton( + IExtensionSyncActivationService, + DataframeRendererComms + ); serviceManager.addSingleton(IVariableViewProvider, VariableViewProvider); serviceManager.add(IJupyterVariableDataProvider, JupyterVariableDataProvider); serviceManager.addSingleton( diff --git a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx index 8c7c9f592c..3811e1e5e8 100644 --- a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -1,11 +1,70 @@ -import * as React from 'react'; +import React, { memo, useState } from 'react'; +import { RendererContext } from 'vscode-notebook-renderer'; interface DataframeRendererProps { - data: any; + context: RendererContext; + data: { + column_count: number; + columns: { + dtype: string; + name: string; + stats: any; + }[]; + preview_row_count: number; + row_count: number; + rows: { + _deepnote_index_column: number; + [key: string]: any; + }[]; + type: string; + }; } -export const DataframeRenderer: React.FC = ({ data }) => { - console.log('DataframeRenderer', data); +export const DataframeRenderer = memo(function DataframeRenderer({ context, data }: DataframeRendererProps) { + const [resultsPerPage, setResultsPerPage] = useState(10); - return
This is the Deepnote dataframe renderer
; -}; + const filteredColumns = data.columns.filter((column) => !column.name.startsWith('_deepnote_')); + const numberOfRows = Math.min(data.row_count, data.preview_row_count); + const numberOfColumns = filteredColumns.length; + + const updateCellMetadata = (metadata: Record) => { + if (context.postMessage) { + context.postMessage({ + command: 'updateCellMetadata', + cellIndex: 0, // or get the actual cell index + metadata: metadata + }); + } + }; + + return ( +
+ +
+ {filteredColumns.map((column) => { + const rows = data.rows.map((row) => row[column.name]); + + return ( +
+
{column.name}
+
+ {rows.map((value, index) => ( +
+ {value ? value.toString() : 'None'} +
+ ))} +
+
+ ); + })} +
+
+
+ {numberOfRows} rows, {numberOfColumns} columns +
+
+
+
+
+ ); +}); diff --git a/src/webviews/webview-side/dataframe-renderer/index.ts b/src/webviews/webview-side/dataframe-renderer/index.ts index 79d9cc761d..b4d401231f 100644 --- a/src/webviews/webview-side/dataframe-renderer/index.ts +++ b/src/webviews/webview-side/dataframe-renderer/index.ts @@ -7,9 +7,10 @@ import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-not import { DataframeRenderer } from './DataframeRenderer'; -export const activate: ActivationFunction = (_context: RendererContext) => { +export const activate: ActivationFunction = (context: RendererContext) => { return { renderOutputItem(outputItem: OutputItem, element: HTMLElement) { + console.log('Dataframe renderer - rendering output item:', { outputItem, context }); try { const data = outputItem.json(); console.log('Dataframe renderer - received data:', data); @@ -17,7 +18,7 @@ export const activate: ActivationFunction = (_context: RendererContext) const root = document.createElement('div'); element.appendChild(root); - ReactDOM.render(React.createElement(DataframeRenderer, { data }), root); + ReactDOM.render(React.createElement(DataframeRenderer, { data, context }), root); } catch (error) { console.error('Error rendering dataframe:', error); const errorDiv = document.createElement('div'); diff --git a/src/webviews/webview-side/dataframe-renderer/styles.css b/src/webviews/webview-side/dataframe-renderer/styles.css index 181e7c4a10..9f71821e18 100644 --- a/src/webviews/webview-side/dataframe-renderer/styles.css +++ b/src/webviews/webview-side/dataframe-renderer/styles.css @@ -1,42 +1,24 @@ +.dataframe-column { + background: 'red'; + flex: 1; +} + .dataframe-container { - overflow: auto; - max-width: 100%; font-family: var(--vscode-editor-font-family); font-size: var(--vscode-editor-font-size); -} - -.dataframe-table { - border-collapse: collapse; + max-width: 100%; width: 100%; - border: 1px solid var(--vscode-panel-border); -} - -.dataframe-table th { - background-color: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - font-weight: 600; - padding: 8px 12px; - text-align: left; - position: sticky; - top: 0; - color: var(--vscode-foreground); -} - -.dataframe-table td { - border: 1px solid var(--vscode-panel-border); - padding: 6px 12px; - color: var(--vscode-foreground); -} - -.dataframe-table tbody tr.even-row { - background-color: var(--vscode-editor-background); } -.dataframe-table tbody tr.odd-row { - background-color: var(--vscode-list-hoverBackground); +.dataframe-content { + display: flex; + flex-direction: row; } -.dataframe-table tbody tr:hover { - background-color: var(--vscode-list-activeSelectionBackground); - color: var(--vscode-list-activeSelectionForeground); +.dataframe-footer { + border-top: 1px solid var(--vscode-editorWidget-border); + display: flex; + justify-content: space-between; + flex-direction: row; + padding: 4px 8px; } From 066229a704a17f8bd100e4cb3fcc13e3dc7b5e61 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Thu, 9 Oct 2025 12:31:58 +0200 Subject: [PATCH 03/21] add the table state. --- src/kernels/execution/cellExecution.ts | 27 +++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/kernels/execution/cellExecution.ts b/src/kernels/execution/cellExecution.ts index 5675e84ce2..8cb7b7b122 100644 --- a/src/kernels/execution/cellExecution.ts +++ b/src/kernels/execution/cellExecution.ts @@ -32,6 +32,7 @@ import { KernelError } from '../errors/kernelError'; import { getCachedSysPrefix } from '../../platform/interpreter/helpers'; import { getCellMetadata } from '../../platform/common/utils'; import { NotebookCellExecutionState, notebookCellExecutions } from '../../platform/notebooks/cellExecutionStateService'; +import dedent from 'dedent'; /** * Factory for CellExecution objects. @@ -406,9 +407,21 @@ export class CellExecution implements ICellExecution, IDisposable { return this.completedSuccessfully(); } - // Prepend initialization code - const prependCode = 'print("Hello world")'; - code = prependCode + '\n' + code; + const tableState = + 'deepnote_table_state' in this.cell.metadata ? this.cell.metadata.deepnote_table_state : undefined; + + if (tableState) { + const tableStateAsJson = JSON.stringify(tableState); + + code = dedent` + if '_dntk' in globals(): + _dntk.dataframe_utils.configure_dataframe_formatter(${escapePythonString(tableStateAsJson)}) + else: + _deepnote_current_table_attrs = ${escapePythonString(tableStateAsJson)} + + ${code} + `; + } // Generate metadata from our cell (some kernels expect this.) // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -505,3 +518,11 @@ export class CellExecution implements ICellExecution, IDisposable { } } } + +function escapePythonString(value: string): string { + // We have to escape backslashes, single quotes, and newlines + const escaped = value.replaceAll('\\', '\\\\').replaceAll("'", "\\'").replaceAll('\n', '\\n'); + + // Wrap the escaped string in single quotes + return `'${escaped}'`; +} From e36b9c0959afa0b5945d93680b01c1e9fb240354 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Thu, 9 Oct 2025 20:09:25 +0200 Subject: [PATCH 04/21] page size handling --- build/esbuild/build.ts | 34 +- package-lock.json | 1372 ++++++++++++++++- package.json | 5 + postcss.config.js | 6 + .../deepnote/deepnoteToolkitInstaller.node.ts | 7 +- src/kernels/deepnote/types.ts | 6 +- src/kernels/execution/cellExecution.ts | 18 +- .../execution/cellExecutionMessageHandler.ts | 70 +- src/kernels/execution/helpers.ts | 48 +- .../deepnote/deepnoteDataConverter.ts | 56 +- .../deepnoteDataConverter.unit.test.ts | 8 +- src/notebooks/deepnote/pocket.ts | 12 +- src/notebooks/deepnote/pocket.unit.test.ts | 22 +- .../resolveCompletionItem.unit.test.ts | 2 +- .../dataframe/dataframeController.ts | 172 +++ .../extension-side/dataframe/rendererComms.ts | 124 -- .../extension-side/serviceRegistry.node.ts | 7 +- .../extension-side/serviceRegistry.web.ts | 7 +- .../dataframe-renderer/DataframeRenderer.tsx | 130 +- .../webview-side/dataframe-renderer/index.ts | 33 +- .../dataframe-renderer/styles.css | 24 - .../dataframe-renderer/tailwind.css | 3 + tailwind.config.js | 24 + 23 files changed, 1867 insertions(+), 323 deletions(-) create mode 100644 postcss.config.js create mode 100644 src/webviews/extension-side/dataframe/dataframeController.ts delete mode 100644 src/webviews/extension-side/dataframe/rendererComms.ts delete mode 100644 src/webviews/webview-side/dataframe-renderer/styles.css create mode 100644 src/webviews/webview-side/dataframe-renderer/tailwind.css create mode 100644 tailwind.config.js diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index a1093e1e93..d19c54b002 100644 --- a/build/esbuild/build.ts +++ b/build/esbuild/build.ts @@ -9,6 +9,9 @@ import { lessLoader } from 'esbuild-plugin-less'; import fs from 'fs-extra'; import { getZeroMQPreBuildsFoldersToKeep, getBundleConfiguration, bundleConfiguration } from '../webpack/common'; import ImportGlobPlugin from 'esbuild-plugin-import-glob'; +import postcss from 'postcss'; +import tailwindcss from '@tailwindcss/postcss'; +import autoprefixer from 'autoprefixer'; const plugin = require('node-stdlib-browser/helpers/esbuild/plugin'); const stdLibBrowser = require('node-stdlib-browser'); @@ -86,7 +89,11 @@ const loader: { [ext: string]: Loader } = { // https://github.com/evanw/esbuild/issues/20#issuecomment-802269745 // https://github.com/hyrious/esbuild-plugin-style -function style({ minify = true, charset = 'utf8' }: StylePluginOptions = {}): Plugin { +function style({ + minify = true, + charset = 'utf8', + enableTailwind = false +}: StylePluginOptions & { enableTailwind?: boolean } = {}): Plugin { return { name: 'style', setup({ onResolve, onLoad }) { @@ -132,6 +139,27 @@ function style({ minify = true, charset = 'utf8' }: StylePluginOptions = {}): Pl })); onLoad({ filter: /.*/, namespace: 'style-content' }, async (args) => { + // Process with PostCSS/Tailwind if enabled and file exists + if (enableTailwind && args.path.includes('tailwind.css') && fs.existsSync(args.path)) { + const cssContent = await fs.readFile(args.path, 'utf8'); + const result = await postcss([tailwindcss, autoprefixer]).process(cssContent, { + from: args.path, + to: args.path + }); + + const options = { ...opt, stdin: { contents: result.css, loader: 'css' } }; + options.loader = options.loader || {}; + // Add the same loaders we add for other places + Object.keys(loader).forEach((key) => { + if (options.loader && !options.loader[key]) { + options.loader[key] = loader[key]; + } + }); + const { errors, warnings, outputFiles } = await esbuild.build(options); + return { errors, warnings, contents: outputFiles![0].text, loader: 'text' }; + } + + // Default behavior for other CSS files const options = { entryPoints: [args.path], ...opt }; options.loader = options.loader || {}; // Add the same loaders we add for other places @@ -158,7 +186,9 @@ function createConfig( const plugins: Plugin[] = []; let define: SameShape['define'] = undefined; if (target === 'web') { - plugins.push(style()); + // Enable Tailwind processing for dataframe renderer + const enableTailwind = source.includes(path.join('dataframe-renderer', 'index.ts')); + plugins.push(style({ enableTailwind })); plugins.push(lessLoader()); define = { diff --git a/package-lock.json b/package-lock.json index a32854b445..503a63e050 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,6 +81,7 @@ "@aminya/node-gyp-build": "^4.8.1-aminya.1", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@sinonjs/fake-timers": "^6.0.1", + "@tailwindcss/postcss": "^4.1.14", "@types/ansi-regex": "^4.0.0", "@types/chai": "^4.3.6", "@types/chai-arrays": "^2.0.1", @@ -133,6 +134,7 @@ "@vscode/test-web": "^0.0.71", "@vscode/zeromq": "^0.2.3", "acorn": "^8.9.0", + "autoprefixer": "^10.4.21", "buffer": "^6.0.3", "bufferutil": "^4.0.6", "chai": "^4.3.10", @@ -150,6 +152,7 @@ "esbuild": "^0.25.1", "esbuild-plugin-import-glob": "^0.1.1", "esbuild-plugin-less": "^1.3.19", + "esbuild-postcss": "^0.0.4", "eslint": "^8.52.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.0.0", @@ -186,6 +189,7 @@ "node-html-parser": "^6.1.13", "node-stdlib-browser": "^1.3.1", "nyc": "^15.1.0", + "postcss": "^8.5.6", "prettier": "^3.0.0", "relative": "^3.0.2", "rimraf": "^5.0.1", @@ -193,6 +197,7 @@ "sinon": "^15.2.0", "source-map": "^0.7.4", "source-map-support": "^0.5.21", + "tailwindcss": "^4.1.14", "ts-mock-imports": "^1.3.0", "ts-mockito": "^2.6.1", "tsx": "^4.19.4", @@ -289,6 +294,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@aminya/node-gyp-build": { "version": "4.8.1-aminya.1", "resolved": "https://registry.npmjs.org/@aminya/node-gyp-build/-/node-gyp-build-4.8.1-aminya.1.tgz", @@ -1481,6 +1499,19 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1628,6 +1659,17 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", @@ -1645,9 +1687,10 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -2814,6 +2857,292 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "node_modules/@tailwindcss/node": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.1", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.14" + } + }, + "node_modules/@tailwindcss/node/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.5.1" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz", + "integrity": "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", + "postcss": "^8.4.41", + "tailwindcss": "4.1.14" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -4669,6 +4998,44 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -4863,6 +5230,16 @@ } ] }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.15.tgz", + "integrity": "sha512-qsJ8/X+UypqxHXN75M7dF88jNK37dLBRW7LeUzCPz+TNs37G8cfWy9nWzS+LS//g600zrt2le9KuXt0rWfDz5Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -5144,9 +5521,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, "funding": [ { @@ -5162,11 +5539,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -5429,9 +5808,9 @@ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, "node_modules/caniuse-lite": { - "version": "1.0.30001655", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", - "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", "dev": true, "funding": [ { @@ -5446,7 +5825,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chai": { "version": "4.3.10", @@ -5574,6 +5954,16 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/cipher-base": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", @@ -6710,6 +7100,16 @@ "node": ">=0.10.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dfa": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", @@ -6962,10 +7362,11 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", - "dev": true + "version": "1.5.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz", + "integrity": "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==", + "dev": true, + "license": "ISC" }, "node_modules/elliptic": { "version": "6.6.1", @@ -7031,10 +7432,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7348,6 +7750,20 @@ "esbuild": ">=0.14.0 <0.25.2" } }, + "node_modules/esbuild-postcss": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/esbuild-postcss/-/esbuild-postcss-0.0.4.tgz", + "integrity": "sha512-CKYibp+aCswskE+gBPnGZ0b9YyuY0n9w2dxyMaoLYEvGTwmjkRj5SV8l1zGJpw8KylqmcMTK0Gr349RnOLd+8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-load-config": "^3.1.0" + }, + "peerDependencies": { + "esbuild": "*", + "postcss": "^8.0.0" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -8618,6 +9034,20 @@ "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==" }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -10817,6 +11247,16 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -11390,6 +11830,255 @@ "node": ">= 10.13.0" } }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/linebreak": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.0.2.tgz", @@ -11833,6 +12522,19 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -12177,7 +12879,26 @@ "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", "dev": true, "engines": { - "node": ">= 10.13.0" + "node": ">= 10.13.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/natural-compare": { @@ -12392,10 +13113,11 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true, + "license": "MIT" }, "node_modules/node-stdlib-browser": { "version": "1.3.1", @@ -12518,6 +13240,16 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nouislider": { "version": "15.4.0", "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-15.4.0.tgz", @@ -13615,6 +14347,75 @@ "node": ">= 0.4" } }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -14911,6 +15712,16 @@ "node": ">= 8" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -15484,6 +16295,13 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/tailwindcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", + "dev": true, + "license": "MIT" + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -15493,6 +16311,23 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tar-fs": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", @@ -15530,6 +16365,16 @@ "streamx": "^2.15.0" } }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/tas-client": { "version": "0.2.33", "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz", @@ -16388,9 +17233,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -16406,9 +17251,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -17222,6 +18068,12 @@ "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", "dev": true }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, "@aminya/node-gyp-build": { "version": "4.8.1-aminya.1", "resolved": "https://registry.npmjs.org/@aminya/node-gyp-build/-/node-gyp-build-4.8.1-aminya.1.tgz", @@ -17962,6 +18814,15 @@ } } }, + "@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "requires": { + "minipass": "^7.0.4" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -18070,6 +18931,16 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", @@ -18081,9 +18952,9 @@ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, "@jridgewell/trace-mapping": { "version": "0.3.25", @@ -19124,6 +19995,159 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "@tailwindcss/node": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", + "dev": true, + "requires": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.1", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.14" + }, + "dependencies": { + "magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + } + } + }, + "@tailwindcss/oxide": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", + "dev": true, + "requires": { + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14", + "detect-libc": "^2.0.4", + "tar": "^7.5.1" + } + }, + "@tailwindcss/oxide-android-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-darwin-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", + "dev": true, + "optional": true, + "requires": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + } + }, + "@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", + "dev": true, + "optional": true + }, + "@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", + "dev": true, + "optional": true + }, + "@tailwindcss/postcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz", + "integrity": "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==", + "dev": true, + "requires": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", + "postcss": "^8.4.41", + "tailwindcss": "4.1.14" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -20553,6 +21577,20 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "requires": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + } + }, "available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -20690,6 +21728,12 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "baseline-browser-mapping": { + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.15.tgz", + "integrity": "sha512-qsJ8/X+UypqxHXN75M7dF88jNK37dLBRW7LeUzCPz+TNs37G8cfWy9nWzS+LS//g600zrt2le9KuXt0rWfDz5Q==", + "dev": true + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -20942,15 +21986,16 @@ } }, "browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" } }, "buffer": { @@ -21124,9 +22169,9 @@ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, "caniuse-lite": { - "version": "1.0.30001655", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", - "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", "dev": true }, "chai": { @@ -21222,6 +22267,12 @@ } } }, + "chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true + }, "cipher-base": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", @@ -22101,6 +23152,12 @@ "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true }, + "detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true + }, "dfa": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", @@ -22314,9 +23371,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "version": "1.5.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz", + "integrity": "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==", "dev": true }, "elliptic": { @@ -22380,9 +23437,9 @@ } }, "enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -22646,6 +23703,15 @@ "less": "^4.2.2" } }, + "esbuild-postcss": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/esbuild-postcss/-/esbuild-postcss-0.0.4.tgz", + "integrity": "sha512-CKYibp+aCswskE+gBPnGZ0b9YyuY0n9w2dxyMaoLYEvGTwmjkRj5SV8l1zGJpw8KylqmcMTK0Gr349RnOLd+8A==", + "dev": true, + "requires": { + "postcss-load-config": "^3.1.0" + } + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -23597,6 +24663,12 @@ "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==" }, + "fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -25159,6 +26231,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true + }, "jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -25610,6 +26688,101 @@ } } }, + "lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "requires": { + "detect-libc": "^2.0.3", + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "dev": true, + "optional": true + }, + "lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "dev": true, + "optional": true + }, + "lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "dev": true, + "optional": true + }, + "lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "dev": true, + "optional": true + }, + "lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "dev": true, + "optional": true + }, + "lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "dev": true, + "optional": true + }, + "lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "dev": true, + "optional": true + }, + "lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "dev": true, + "optional": true + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true + }, "linebreak": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.0.2.tgz", @@ -25960,6 +27133,15 @@ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, + "minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "requires": { + "minipass": "^7.1.2" + } + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -26209,6 +27391,12 @@ "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", "dev": true }, + "nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -26388,9 +27576,9 @@ } }, "node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", "dev": true }, "node-stdlib-browser": { @@ -26475,6 +27663,12 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, "nouislider": { "version": "15.4.0", "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-15.4.0.tgz", @@ -27300,6 +28494,35 @@ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true }, + "postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "requires": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "dependencies": { + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } + }, "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -28284,6 +29507,12 @@ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true }, + "source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true + }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -28756,12 +29985,39 @@ } } }, + "tailwindcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", + "dev": true + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, + "tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "dev": true, + "requires": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "dependencies": { + "yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true + } + } + }, "tar-fs": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", @@ -29471,13 +30727,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" } }, "uri-js": { diff --git a/package.json b/package.json index 91dc46a43a..d1b1b91993 100644 --- a/package.json +++ b/package.json @@ -2180,6 +2180,7 @@ "@aminya/node-gyp-build": "^4.8.1-aminya.1", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@sinonjs/fake-timers": "^6.0.1", + "@tailwindcss/postcss": "^4.1.14", "@types/ansi-regex": "^4.0.0", "@types/chai": "^4.3.6", "@types/chai-arrays": "^2.0.1", @@ -2232,6 +2233,7 @@ "@vscode/test-web": "^0.0.71", "@vscode/zeromq": "^0.2.3", "acorn": "^8.9.0", + "autoprefixer": "^10.4.21", "buffer": "^6.0.3", "bufferutil": "^4.0.6", "chai": "^4.3.10", @@ -2249,6 +2251,7 @@ "esbuild": "^0.25.1", "esbuild-plugin-import-glob": "^0.1.1", "esbuild-plugin-less": "^1.3.19", + "esbuild-postcss": "^0.0.4", "eslint": "^8.52.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^9.0.0", @@ -2285,6 +2288,7 @@ "node-html-parser": "^6.1.13", "node-stdlib-browser": "^1.3.1", "nyc": "^15.1.0", + "postcss": "^8.5.6", "prettier": "^3.0.0", "relative": "^3.0.2", "rimraf": "^5.0.1", @@ -2292,6 +2296,7 @@ "sinon": "^15.2.0", "source-map": "^0.7.4", "source-map-support": "^0.5.21", + "tailwindcss": "^4.1.14", "ts-mock-imports": "^1.3.0", "ts-mockito": "^2.6.1", "tsx": "^4.19.4", diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000000..8d9dc210e5 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {} + } +}; diff --git a/src/kernels/deepnote/deepnoteToolkitInstaller.node.ts b/src/kernels/deepnote/deepnoteToolkitInstaller.node.ts index b9ee1113dd..86efba92ac 100644 --- a/src/kernels/deepnote/deepnoteToolkitInstaller.node.ts +++ b/src/kernels/deepnote/deepnoteToolkitInstaller.node.ts @@ -4,7 +4,7 @@ import { inject, injectable, named } from 'inversify'; import { CancellationToken, Uri, workspace } from 'vscode'; import { PythonEnvironment } from '../../platform/pythonEnvironments/info'; -import { IDeepnoteToolkitInstaller, DEEPNOTE_TOOLKIT_WHEEL_URL } from './types'; +import { IDeepnoteToolkitInstaller, DEEPNOTE_TOOLKIT_WHEEL_URL, DEEPNOTE_TOOLKIT_VERSION } from './types'; import { IProcessServiceFactory } from '../../platform/common/process/types.node'; import { logger } from '../../platform/logging'; import { IOutputChannel, IExtensionContext } from '../../platform/common/types'; @@ -29,10 +29,11 @@ export class DeepnoteToolkitInstaller implements IDeepnoteToolkitInstaller { ) {} private getVenvPath(deepnoteFileUri: Uri): Uri { - // Create a unique venv name based on the file path using a hash + // Create a unique venv name based on the file path and toolkit version using a hash // This avoids Windows MAX_PATH issues and prevents directory structure leakage + // Including the version ensures a new venv is created when the toolkit version changes const hash = this.getVenvHash(deepnoteFileUri); - return Uri.joinPath(this.context.globalStorageUri, 'deepnote-venvs', hash); + return Uri.joinPath(this.context.globalStorageUri, 'deepnote-venvs', `${hash}-${DEEPNOTE_TOOLKIT_VERSION}`); } public async getVenvInterpreter(deepnoteFileUri: Uri): Promise { diff --git a/src/kernels/deepnote/types.ts b/src/kernels/deepnote/types.ts index 622ae0abc9..c969fb1a15 100644 --- a/src/kernels/deepnote/types.ts +++ b/src/kernels/deepnote/types.ts @@ -154,7 +154,9 @@ export interface IDeepnoteKernelAutoSelector { ensureKernelSelected(notebook: vscode.NotebookDocument, token?: vscode.CancellationToken): Promise; } -export const DEEPNOTE_TOOLKIT_VERSION = '0.2.30.post23'; -export const DEEPNOTE_TOOLKIT_WHEEL_URL = `https://deepnote-staging-runtime-artifactory.s3.amazonaws.com/deepnote-toolkit-packages/${DEEPNOTE_TOOLKIT_VERSION}/deepnote_toolkit-${DEEPNOTE_TOOLKIT_VERSION}-py3-none-any.whl`; +export const DEEPNOTE_TOOLKIT_VERSION = '0.2.30.dev29+890433e'; +export const DEEPNOTE_TOOLKIT_WHEEL_URL = `https://deepnote-staging-runtime-artifactory.s3.amazonaws.com/deepnote-toolkit-packages/${encodeURIComponent( + DEEPNOTE_TOOLKIT_VERSION +)}/deepnote_toolkit-${encodeURIComponent(DEEPNOTE_TOOLKIT_VERSION)}-py3-none-any.whl`; export const DEEPNOTE_DEFAULT_PORT = 8888; export const DEEPNOTE_NOTEBOOK_TYPE = 'deepnote'; diff --git a/src/kernels/execution/cellExecution.ts b/src/kernels/execution/cellExecution.ts index 8cb7b7b122..2708eeac70 100644 --- a/src/kernels/execution/cellExecution.ts +++ b/src/kernels/execution/cellExecution.ts @@ -411,16 +411,26 @@ export class CellExecution implements ICellExecution, IDisposable { 'deepnote_table_state' in this.cell.metadata ? this.cell.metadata.deepnote_table_state : undefined; if (tableState) { - const tableStateAsJson = JSON.stringify(tableState); + const tableStateSpec = JSON.stringify(tableState); - code = dedent` + logger.info( + `Cell ${this.cell.index}: Found table state spec in metadata: ${JSON.stringify( + tableStateSpec + ).substring(0, 200)}` + ); + const tableStateAsJson = tableStateSpec; + + const prependedCode = dedent` if '_dntk' in globals(): _dntk.dataframe_utils.configure_dataframe_formatter(${escapePythonString(tableStateAsJson)}) else: _deepnote_current_table_attrs = ${escapePythonString(tableStateAsJson)} - - ${code} `; + + logger.info(`Cell ${this.cell.index}: Prepending table state configuration code to cell execution`); + code = `${prependedCode}\n\n${code}`; + } else { + logger.info(`Cell ${this.cell.index}: No table state spec found in metadata`); } // Generate metadata from our cell (some kernels expect this.) diff --git a/src/kernels/execution/cellExecutionMessageHandler.ts b/src/kernels/execution/cellExecutionMessageHandler.ts index 7b13630947..f952580d5a 100644 --- a/src/kernels/execution/cellExecutionMessageHandler.ts +++ b/src/kernels/execution/cellExecutionMessageHandler.ts @@ -634,7 +634,9 @@ export class CellExecutionMessageHandler implements IDisposable { CellExecutionMessageHandler.modelIdsOwnedByCells.set(this.cell, modelIds); } } - const cellOutput = cellOutputToVSCCellOutput(output); + // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id + const cellId = (this.cell.metadata?.id as string | undefined) || this.cell.document.uri.toString(); + const cellOutput = cellOutputToVSCCellOutput(output, this.cell.index, cellId); const displayId = 'transient' in output && typeof output.transient === 'object' && @@ -1003,32 +1005,50 @@ export class CellExecutionMessageHandler implements IDisposable { // Ensure we append to previous output, only if the streams are the same & // If the last output is the desired stream type. if (this.lastUsedStreamOutput?.stream === msg.content.name) { - const output = cellOutputToVSCCellOutput({ - output_type: 'stream', - name: msg.content.name, - text: msg.content.text - }); + // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id + const cellId = (this.cell.metadata?.id as string | undefined) || this.cell.document.uri.toString(); + const output = cellOutputToVSCCellOutput( + { + output_type: 'stream', + name: msg.content.name, + text: msg.content.text + }, + this.cell.index, + cellId + ); traceCellMessage(this.cell, `Append output items '${msg.content.text.substring(0, 100)}`); task?.appendOutputItems(output.items, this.lastUsedStreamOutput.output).then(noop, noop); } else if (previousValueOfClearOutputOnNextUpdateToOutput) { // Replace the current outputs with a single new output. const text = concatMultilineString(msg.content.text); - const output = cellOutputToVSCCellOutput({ - output_type: 'stream', - name: msg.content.name, - text - }); + // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id + const cellId = (this.cell.metadata?.id as string | undefined) || this.cell.document.uri.toString(); + const output = cellOutputToVSCCellOutput( + { + output_type: 'stream', + name: msg.content.name, + text + }, + this.cell.index, + cellId + ); this.lastUsedStreamOutput = { output, stream: msg.content.name }; traceCellMessage(this.cell, `Replace output with '${text.substring(0, 100)}'`); task?.replaceOutput([output]).then(noop, noop); } else { // Create a new output const text = formatStreamText(concatMultilineString(msg.content.text)); - const output = cellOutputToVSCCellOutput({ - output_type: 'stream', - name: msg.content.name, - text - }); + // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id + const cellId = (this.cell.metadata?.id as string | undefined) || this.cell.document.uri.toString(); + const output = cellOutputToVSCCellOutput( + { + output_type: 'stream', + name: msg.content.name, + text + }, + this.cell.index, + cellId + ); this.lastUsedStreamOutput = { output, stream: msg.content.name }; traceCellMessage(this.cell, `Append new output '${text.substring(0, 100)}'`); task?.appendOutput([output]).then(noop, noop); @@ -1146,11 +1166,19 @@ export class CellExecutionMessageHandler implements IDisposable { const output = translateCellDisplayOutput( new NotebookCellOutput(outputToBeUpdated.outputItems, outputToBeUpdated.outputContainer.metadata) ); - const newOutput = cellOutputToVSCCellOutput({ - ...output, - data: msg.content.data, - metadata: msg.content.metadata - } as nbformat.IDisplayData); + // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id + const cellId = + (outputToBeUpdated.cell.metadata?.id as string | undefined) || + outputToBeUpdated.cell.document.uri.toString(); + const newOutput = cellOutputToVSCCellOutput( + { + ...output, + data: msg.content.data, + metadata: msg.content.metadata + } as nbformat.IDisplayData, + outputToBeUpdated.cell.index, + cellId + ); // If there was no output and still no output, then nothing to do. if (outputToBeUpdated.outputItems.length === 0 && newOutput.items.length === 0) { logger.trace('Update display data message received, but no output to update', msg.content); diff --git a/src/kernels/execution/helpers.ts b/src/kernels/execution/helpers.ts index c5e59c4228..1bade6f212 100644 --- a/src/kernels/execution/helpers.ts +++ b/src/kernels/execution/helpers.ts @@ -115,7 +115,10 @@ export function traceCellMessage(cell: NotebookCell, message: string | (() => st ); } -const cellOutputMappers = new Map NotebookCellOutput>(); +const cellOutputMappers = new Map< + nbformat.OutputType, + (output: nbformat.IOutput, cellIndex?: number, cellId?: string) => NotebookCellOutput +>(); // eslint-disable-next-line @typescript-eslint/no-explicit-any cellOutputMappers.set('display_data', translateDisplayDataOutput as any); // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -126,7 +129,11 @@ cellOutputMappers.set('execute_result', translateDisplayDataOutput as any); cellOutputMappers.set('stream', translateStreamOutput as any); // eslint-disable-next-line @typescript-eslint/no-explicit-any cellOutputMappers.set('update_display_data', translateDisplayDataOutput as any); -export function cellOutputToVSCCellOutput(output: nbformat.IOutput): NotebookCellOutput { +export function cellOutputToVSCCellOutput( + output: nbformat.IOutput, + cellIndex?: number, + cellId?: string +): NotebookCellOutput { /** * Stream, `application/x.notebook.stream` * Error, `application/x.notebook.error-traceback` @@ -153,20 +160,29 @@ export function cellOutputToVSCCellOutput(output: nbformat.IOutput): NotebookCel const fn = cellOutputMappers.get(output.output_type as nbformat.OutputType); let result: NotebookCellOutput; if (fn) { - result = fn(output); + result = fn(output, cellIndex, cellId); } else { logger.warn(`Unable to translate cell from ${output.output_type} to NotebookCellData for VS Code.`); // eslint-disable-next-line @typescript-eslint/no-explicit-any - result = translateDisplayDataOutput(output as any); + result = translateDisplayDataOutput(output as any, cellIndex, cellId); } return result; } -function getOutputMetadata(output: nbformat.IOutput): CellOutputMetadata { +function getOutputMetadata(output: nbformat.IOutput, cellIndex?: number, cellId?: string): CellOutputMetadata { // Add on transient data if we have any. This should be removed by our save functions elsewhere. const metadata: CellOutputMetadata = { outputType: output.output_type }; + + if (cellIndex !== undefined) { + metadata.cellIndex = cellIndex; + } + + if (cellId) { + metadata.cellId = cellId; + } + if (output.transient) { // eslint-disable-next-line @typescript-eslint/no-explicit-any metadata.transient = output.transient as any; @@ -200,7 +216,9 @@ export function getNotebookCellOutputMetadata(output: { * E.g. Jupyter cell output contains metadata to add backgrounds to images. */ function translateDisplayDataOutput( - output: nbformat.IDisplayData | nbformat.IDisplayUpdate | nbformat.IExecuteResult + output: nbformat.IDisplayData | nbformat.IDisplayUpdate | nbformat.IExecuteResult, + cellIndex?: number, + cellId?: string ): NotebookCellOutput { // Metadata could be as follows: // We'll have metadata specific to each mime type as well as generic metadata. @@ -219,7 +237,7 @@ function translateDisplayDataOutput( } } */ - const metadata = getOutputMetadata(output); + const metadata = getOutputMetadata(output, cellIndex, cellId); // If we have SVG or PNG, then add special metadata to indicate whether to display `open plot` if ('image/svg+xml' in output.data || 'image/png' in output.data) { metadata.__displayOpenPlotIcon = true; @@ -235,10 +253,10 @@ function translateDisplayDataOutput( return new NotebookCellOutput(sortOutputItemsBasedOnDisplayOrder(items), metadata); } -function translateStreamOutput(output: nbformat.IStream): NotebookCellOutput { +function translateStreamOutput(output: nbformat.IStream, cellIndex?: number, cellId?: string): NotebookCellOutput { const value = concatMultilineString(output.text); const factoryFn = output.name === 'stderr' ? NotebookCellOutputItem.stderr : NotebookCellOutputItem.stdout; - return new NotebookCellOutput([factoryFn(value)], getOutputMetadata(output)); + return new NotebookCellOutput([factoryFn(value)], getOutputMetadata(output, cellIndex, cellId)); } // Output stream can only have stderr or stdout so just check the first output. Undefined if no outputs @@ -282,6 +300,14 @@ interface CellOutputMetadata { */ outputType: nbformat.OutputType | string; executionCount?: nbformat.IExecuteResult['ExecutionCount']; + /** + * Index of the cell that produced this output + */ + cellIndex?: number; + /** + * ID of the cell that produced this output + */ + cellId?: string; /** * Whether the original Mime data is JSON or not. * This properly only exists in metadata for NotebookCellOutputItems @@ -542,7 +568,7 @@ export function translateCellDisplayOutput(output: NotebookCellOutput): JupyterO * As we're displaying the error in the statusbar, we don't want this dup error in output. * Hence remove this. */ -function translateErrorOutput(output?: nbformat.IError): NotebookCellOutput { +function translateErrorOutput(output?: nbformat.IError, cellIndex?: number, cellId?: string): NotebookCellOutput { output = output || { output_type: 'error', ename: '', evalue: '', traceback: [] }; return new NotebookCellOutput( [ @@ -552,7 +578,7 @@ function translateErrorOutput(output?: nbformat.IError): NotebookCellOutput { stack: (output?.traceback || []).join('\n') }) ], - { ...getOutputMetadata(output), originalError: output } + { ...getOutputMetadata(output, cellIndex, cellId), originalError: output } ); } diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index 2291df27e9..15b659787f 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -28,7 +28,7 @@ export class DeepnoteDataConverter { * @returns Array of VS Code notebook cell data */ convertBlocksToCells(blocks: DeepnoteBlock[]): NotebookCellData[] { - return blocks.map((block) => { + return blocks.map((block, index) => { const converter = this.registry.findConverter(block.type); if (!converter) { @@ -54,7 +54,7 @@ export class DeepnoteDataConverter { // The pocket is a place to tuck away Deepnote-specific fields for later. addPocketToCellMetadata(cell); - cell.outputs = this.transformOutputsForVsCode(block.outputs || []); + cell.outputs = this.transformOutputsForVsCode(block.outputs || [], index, block.id); return cell; }); @@ -202,7 +202,11 @@ export class DeepnoteDataConverter { }); } - private transformOutputsForVsCode(outputs: DeepnoteOutput[]): NotebookCellOutput[] { + private transformOutputsForVsCode( + outputs: DeepnoteOutput[], + cellIndex: number, + cellId: string + ): NotebookCellOutput[] { return outputs.map((output) => { if ('output_type' in output) { if (output.output_type === 'error') { @@ -213,7 +217,12 @@ export class DeepnoteDataConverter { stack: errorOutput.traceback ? errorOutput.traceback.join('\n') : '' }; - return new NotebookCellOutput([NotebookCellOutputItem.error(error)]); + const metadata = { + cellIndex, + cellId + }; + + return new NotebookCellOutput([NotebookCellOutputItem.error(error)], metadata); } if (output.output_type === 'execute_result' || output.output_type === 'display_data') { @@ -274,7 +283,10 @@ export class DeepnoteDataConverter { } // Preserve metadata and execution_count - const metadata: Record = {}; + const metadata: Record = { + cellIndex, + cellId + }; if (output.execution_count !== undefined) { metadata.executionCount = output.execution_count; @@ -284,9 +296,7 @@ export class DeepnoteDataConverter { Object.assign(metadata, output.metadata); } - return Object.keys(metadata).length > 0 - ? new NotebookCellOutput(items, metadata) - : new NotebookCellOutput(items); + return new NotebookCellOutput(items, metadata); } if (output.output_type === 'stream') { @@ -299,12 +309,28 @@ export class DeepnoteDataConverter { ? 'application/vnd.code.notebook.stderr' : 'application/vnd.code.notebook.stdout'; - return new NotebookCellOutput([NotebookCellOutputItem.text(String(output.text), mimeType)]); + const metadata = { + cellIndex, + cellId + }; + + return new NotebookCellOutput( + [NotebookCellOutputItem.text(String(output.text), mimeType)], + metadata + ); } // Unknown output type - return as text if available if ('text' in output && output.text) { - return new NotebookCellOutput([NotebookCellOutputItem.text(String(output.text), 'text/plain')]); + const metadata = { + cellIndex, + cellId + }; + + return new NotebookCellOutput( + [NotebookCellOutputItem.text(String(output.text), 'text/plain')], + metadata + ); } // No text, return empty output @@ -313,7 +339,15 @@ export class DeepnoteDataConverter { // Fallback for outputs without output_type but with text if ('text' in output && output.text) { - return new NotebookCellOutput([NotebookCellOutputItem.text(String(output.text), 'text/plain')]); + const metadata = { + cellIndex, + cellId + }; + + return new NotebookCellOutput( + [NotebookCellOutputItem.text(String(output.text), 'text/plain')], + metadata + ); } return new NotebookCellOutput([]); diff --git a/src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts b/src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts index 457db5051f..2a9fedc3a1 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts @@ -30,7 +30,8 @@ suite('DeepnoteDataConverter', () => { assert.strictEqual(cells[0].kind, NotebookCellKind.Code); assert.strictEqual(cells[0].value, 'print("hello")'); assert.strictEqual(cells[0].languageId, 'python'); - assert.strictEqual(cells[0].metadata?.__deepnotePocket?.id, 'block1'); + // id should be at top level, not in pocket + assert.strictEqual(cells[0].metadata?.id, 'block1'); assert.strictEqual(cells[0].metadata?.__deepnotePocket?.type, 'code'); assert.strictEqual(cells[0].metadata?.__deepnotePocket?.sortingKey, 'a0'); assert.strictEqual(cells[0].metadata?.custom, 'data'); @@ -53,7 +54,8 @@ suite('DeepnoteDataConverter', () => { assert.strictEqual(cells[0].kind, NotebookCellKind.Markup); assert.strictEqual(cells[0].value, '# Title'); assert.strictEqual(cells[0].languageId, 'markdown'); - assert.strictEqual(cells[0].metadata?.__deepnotePocket?.id, 'block2'); + // id should be at top level, not in pocket + assert.strictEqual(cells[0].metadata?.id, 'block2'); assert.strictEqual(cells[0].metadata?.__deepnotePocket?.type, 'markdown'); }); @@ -108,10 +110,10 @@ suite('DeepnoteDataConverter', () => { languageId: 'python', metadata: { __deepnotePocket: { - id: 'existing-id', type: 'code', sortingKey: 'a5' }, + id: 'existing-id', original: 'metadata' } } diff --git a/src/notebooks/deepnote/pocket.ts b/src/notebooks/deepnote/pocket.ts index ed3ca35ac3..f46f6bc896 100644 --- a/src/notebooks/deepnote/pocket.ts +++ b/src/notebooks/deepnote/pocket.ts @@ -3,13 +3,15 @@ import type { NotebookCellData } from 'vscode'; import type { DeepnoteBlock, DeepnoteOutput } from './deepnoteTypes'; import { generateBlockId, generateSortingKey } from './dataConversionUtils'; -const deepnoteBlockSpecificFields = ['blockGroup', 'executionCount', 'id', 'outputs', 'sortingKey', 'type'] as const; +// Note: 'id' is intentionally excluded from this list so it remains at the top level of cell.metadata +// The id field is needed at runtime for cell identification during execution +const deepnoteBlockSpecificFields = ['blockGroup', 'executionCount', 'outputs', 'sortingKey', 'type'] as const; // Stores extra Deepnote-specific fields for each block that are not part of the standard VSCode NotebookCellData structure. +// Note: 'id' is not in the pocket - it stays at the top level of cell.metadata for runtime access export interface Pocket { blockGroup?: string; executionCount?: number; - id?: string; outputs?: DeepnoteOutput[]; sortingKey?: string; type?: string; @@ -47,10 +49,14 @@ export function createBlockFromPocket(cell: NotebookCellData, index: number): De const pocket = extractPocketFromCellMetadata(cell); const metadata = cell.metadata ? { ...cell.metadata } : undefined; + // Get id from top-level metadata before cleaning it up + const cellId = metadata?.id as string | undefined; if (metadata) { // Remove pocket and all pocket fields from metadata delete metadata.__deepnotePocket; + // Also remove id from metadata as it goes into block.id + delete metadata.id; for (const field of deepnoteBlockSpecificFields) { delete metadata[field]; @@ -60,7 +66,7 @@ export function createBlockFromPocket(cell: NotebookCellData, index: number): De const block: DeepnoteBlock = { blockGroup: pocket?.blockGroup || 'default-group', content: cell.value, - id: pocket?.id || generateBlockId(), + id: cellId || generateBlockId(), metadata, sortingKey: pocket?.sortingKey || generateSortingKey(index), type: pocket?.type || 'code' diff --git a/src/notebooks/deepnote/pocket.unit.test.ts b/src/notebooks/deepnote/pocket.unit.test.ts index 49f9717b21..8ff4f51a79 100644 --- a/src/notebooks/deepnote/pocket.unit.test.ts +++ b/src/notebooks/deepnote/pocket.unit.test.ts @@ -18,12 +18,13 @@ suite('Pocket', () => { addPocketToCellMetadata(cell); + // id should remain at top level, not moved to pocket assert.deepStrictEqual(cell.metadata.__deepnotePocket, { - id: 'block-123', type: 'code', sortingKey: 'a0', executionCount: 5 }); + assert.strictEqual(cell.metadata.id, 'block-123'); assert.strictEqual(cell.metadata.other, 'value'); }); @@ -57,10 +58,11 @@ suite('Pocket', () => { addPocketToCellMetadata(cell); + // id should remain at top level, not moved to pocket assert.deepStrictEqual(cell.metadata.__deepnotePocket, { - id: 'block-123', type: 'code' }); + assert.strictEqual(cell.metadata.id, 'block-123'); }); }); @@ -70,18 +72,18 @@ suite('Pocket', () => { cell.metadata = { __deepnotePocket: { - id: 'block-123', type: 'code', sortingKey: 'a0', executionCount: 5 }, + id: 'block-123', other: 'value' }; const pocket = extractPocketFromCellMetadata(cell); + // id is not in the pocket anymore assert.deepStrictEqual(pocket, { - id: 'block-123', type: 'code', sortingKey: 'a0', executionCount: 5 @@ -115,11 +117,11 @@ suite('Pocket', () => { cell.metadata = { __deepnotePocket: { - id: 'block-123', type: 'code', sortingKey: 'a0', executionCount: 5 }, + id: 'block-123', custom: 'value' }; @@ -149,15 +151,16 @@ suite('Pocket', () => { cell.metadata = { __deepnotePocket: { - id: 'block-123', type: 'code' }, + id: 'block-123', custom: 'value' }; const block = createBlockFromPocket(cell, 0); assert.isUndefined(block.metadata?.__deepnotePocket); + assert.isUndefined(block.metadata?.id); assert.strictEqual(block.metadata?.custom, 'value'); }); @@ -166,9 +169,9 @@ suite('Pocket', () => { cell.metadata = { __deepnotePocket: { - id: 'block-123', type: 'code' }, + id: 'block-123', custom: 'value', slideshow: { slide_type: 'slide' } }; @@ -191,9 +194,8 @@ suite('Pocket', () => { const cell = new NotebookCellData(NotebookCellKind.Code, 'print("hello")', 'python'); cell.metadata = { - __deepnotePocket: { - id: 'block-123' - } + __deepnotePocket: {}, + id: 'block-123' }; const block = createBlockFromPocket(cell, 3); diff --git a/src/standalone/intellisense/resolveCompletionItem.unit.test.ts b/src/standalone/intellisense/resolveCompletionItem.unit.test.ts index 071e37c43a..a36152e5d7 100644 --- a/src/standalone/intellisense/resolveCompletionItem.unit.test.ts +++ b/src/standalone/intellisense/resolveCompletionItem.unit.test.ts @@ -546,7 +546,7 @@ suite('Jupyter Kernel Completion (requestInspect)', () => { foo: 'bar' } }; - return [output1, finalOutput].map(cellOutputToVSCCellOutput); + return [output1, finalOutput].map((output) => cellOutputToVSCCellOutput(output)); } test('Resolve the documentation', async () => { completionItem = new CompletionItem('One'); diff --git a/src/webviews/extension-side/dataframe/dataframeController.ts b/src/webviews/extension-side/dataframe/dataframeController.ts new file mode 100644 index 0000000000..8319f6f555 --- /dev/null +++ b/src/webviews/extension-side/dataframe/dataframeController.ts @@ -0,0 +1,172 @@ +import { injectable } from 'inversify'; +import { + commands, + env, + NotebookEdit, + NotebookEditor, + NotebookRendererMessaging, + notebooks, + window, + workspace, + WorkspaceEdit +} from 'vscode'; + +import { IExtensionSyncActivationService } from '../../../platform/activation/types'; +import { IDisposable } from '../../../platform/common/types'; +import { dispose } from '../../../platform/common/utils/lifecycle'; +import { logger } from '../../../platform/logging'; + +type SelectPageSizeCommand = { + cellId?: string; + cellIndex?: number; + command: 'selectPageSize'; + size: number; +}; + +type GoToPageCommand = { + command: 'goToPage'; + cellIndex: number; + page: number; +}; + +type CopyTableDataCommand = { + command: 'copyTableData'; + data: string; +}; + +type ExportDataframeCommand = { + command: 'exportDataframe'; + cellIndex: number; +}; + +type DataframeCommand = SelectPageSizeCommand | GoToPageCommand | CopyTableDataCommand | ExportDataframeCommand; + +@injectable() +export class DataframeController implements IExtensionSyncActivationService { + private readonly disposables: IDisposable[] = []; + + public dispose() { + dispose(this.disposables); + } + + activate() { + const comms = notebooks.createRendererMessaging('deepnote-dataframe-renderer'); + comms.onDidReceiveMessage(this.onDidReceiveMessage.bind(this, comms), this, this.disposables); + } + + private onDidReceiveMessage( + _comms: NotebookRendererMessaging, + { editor, message }: { editor: NotebookEditor; message: DataframeCommand } + ) { + logger.info('DataframeController received message', message); + + if (!message || typeof message !== 'object') { + return; + } + + switch (message.command) { + case 'selectPageSize': + void this.handleSelectPageSize(editor, message); + break; + case 'goToPage': + void this.handleGoToPage(editor, message); + break; + case 'copyTableData': + void this.handleCopyTableData(message); + break; + case 'exportDataframe': + void this.handleExportDataframe(editor, message); + break; + } + } + + private async handleSelectPageSize(editor: NotebookEditor, message: SelectPageSizeCommand) { + let cell; + let cellIndex: number; + + // Try to find cell by cellId first (more reliable) + if (message.cellId) { + const cells = editor.notebook.getCells(); + const foundCell = cells.find((c) => c.metadata.id === message.cellId); + + if (foundCell) { + cell = foundCell; + cellIndex = foundCell.index; + logger.info(`[DataframeController] Found cell by cellId ${message.cellId} at index ${cellIndex}`); + } else { + const errorMessage = `Unable to update page size: Could not find the cell with ID ${message.cellId}. The cell may have been deleted.`; + logger.error(`[DataframeController] ${errorMessage}`); + await window.showErrorMessage(errorMessage); + throw new Error(errorMessage); + } + } else if (message.cellIndex !== undefined) { + // Fall back to cellIndex if cellId is not available + try { + cell = editor.notebook.cellAt(message.cellIndex); + cellIndex = message.cellIndex; + logger.info(`[DataframeController] Using cellIndex ${cellIndex} (cellId not available)`); + } catch (error) { + const errorMessage = `Unable to update page size: Cell at index ${message.cellIndex} not found. The notebook structure may have changed.`; + logger.error(`[DataframeController] ${errorMessage}`, error); + await window.showErrorMessage(errorMessage); + throw new Error(errorMessage); + } + } else { + const errorMessage = + 'Unable to update page size: No cell identifier provided. ' + + 'Please re-run the cell to update the output metadata.'; + logger.error(`[DataframeController] ${errorMessage}`); + await window.showErrorMessage(errorMessage); + throw new Error(errorMessage); + } + + // Update page size in table state within cell metadata + const existingTableState = cell.metadata.deepnote_table_state || {}; + const updatedTableState = { + ...existingTableState, + pageSize: message.size + }; + + const edit = new WorkspaceEdit(); + const notebookEdit = NotebookEdit.updateCellMetadata(cellIndex, { + ...cell.metadata, + deepnote_table_state: updatedTableState + }); + + edit.set(editor.notebook.uri, [notebookEdit]); + + await workspace.applyEdit(edit); + + // Re-execute the cell to apply the new page size + logger.info(`[DataframeRenderer] Re-executing cell ${cellIndex} with new page size`); + await commands.executeCommand('notebook.cell.execute', { + ranges: [{ start: cellIndex, end: cellIndex + 1 }], + document: editor.notebook.uri + }); + } + + private handleGoToPage(editor: NotebookEditor, message: GoToPageCommand) { + const cell = editor.notebook.cellAt(message.cellIndex); + logger.info( + `[DataframeRenderer] goToPage called for cell ${ + message.cellIndex + } (${cell?.document.uri.toString()}), page=${message.page}` + ); + // Could store current page in cell metadata if needed + } + + private async handleCopyTableData(message: CopyTableDataCommand) { + logger.info(`[DataframeRenderer] copyTableData called, data length=${message.data.length} characters`); + await env.clipboard.writeText(message.data); + } + + private handleExportDataframe(editor: NotebookEditor, message: ExportDataframeCommand) { + const cell = editor.notebook.cellAt(message.cellIndex); + logger.info( + `[DataframeRenderer] exportDataframe called for cell ${ + message.cellIndex + } (${cell?.document.uri.toString()})` + ); + // TODO: Implement dataframe export functionality + } +} diff --git a/src/webviews/extension-side/dataframe/rendererComms.ts b/src/webviews/extension-side/dataframe/rendererComms.ts deleted file mode 100644 index c8d13d647f..0000000000 --- a/src/webviews/extension-side/dataframe/rendererComms.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { injectable } from 'inversify'; -import { - env, - NotebookEdit, - NotebookEditor, - NotebookRendererMessaging, - notebooks, - workspace, - WorkspaceEdit -} from 'vscode'; - -import { IExtensionSyncActivationService } from '../../../platform/activation/types'; -import { IDisposable } from '../../../platform/common/types'; -import { dispose } from '../../../platform/common/utils/lifecycle'; -import { logger } from '../../../platform/logging'; - -type SelectPageSizeCommand = { - command: 'selectPageSize'; - cellIndex: number; - size: number; -}; - -type GoToPageCommand = { - command: 'goToPage'; - cellIndex: number; - page: number; -}; - -type CopyTableDataCommand = { - command: 'copyTableData'; - data: string; -}; - -type ExportDataframeCommand = { - command: 'exportDataframe'; - cellIndex: number; -}; - -type DataframeCommand = SelectPageSizeCommand | GoToPageCommand | CopyTableDataCommand | ExportDataframeCommand; - -@injectable() -export class DataframeRendererComms implements IExtensionSyncActivationService { - private readonly disposables: IDisposable[] = []; - - public dispose() { - dispose(this.disposables); - } - - activate() { - const comms = notebooks.createRendererMessaging('deepnote-dataframe-renderer'); - comms.onDidReceiveMessage(this.onDidReceiveMessage.bind(this, comms), this, this.disposables); - } - - private onDidReceiveMessage( - _comms: NotebookRendererMessaging, - { editor, message }: { editor: NotebookEditor; message: DataframeCommand } - ) { - logger.info('DataframeRendererComms received message', message); - - if (!message || typeof message !== 'object') { - return; - } - - switch (message.command) { - case 'selectPageSize': - this.handleSelectPageSize(editor, message); - break; - case 'goToPage': - this.handleGoToPage(editor, message); - break; - case 'copyTableData': - this.handleCopyTableData(message); - break; - case 'exportDataframe': - this.handleExportDataframe(editor, message); - break; - } - } - - private async handleSelectPageSize(editor: NotebookEditor, message: SelectPageSizeCommand) { - const cell = editor.notebook.cellAt(message.cellIndex); - logger.info( - `[DataframeRenderer] selectPageSize called for cell ${ - message.cellIndex - } (${cell?.document.uri.toString()}), size=${message.size}` - ); - - // Store page size in cell metadata - if (cell) { - const edit = new WorkspaceEdit(); - const notebookEdit = NotebookEdit.updateCellMetadata(message.cellIndex, { - ...cell.metadata, - dataframePageSize: message.size - }); - edit.set(editor.notebook.uri, [notebookEdit]); - await workspace.applyEdit(edit); - } - } - - private handleGoToPage(editor: NotebookEditor, message: GoToPageCommand) { - const cell = editor.notebook.cellAt(message.cellIndex); - logger.info( - `[DataframeRenderer] goToPage called for cell ${ - message.cellIndex - } (${cell?.document.uri.toString()}), page=${message.page}` - ); - // Could store current page in cell metadata if needed - } - - private async handleCopyTableData(message: CopyTableDataCommand) { - logger.info(`[DataframeRenderer] copyTableData called, data length=${message.data.length} characters`); - await env.clipboard.writeText(message.data); - } - - private handleExportDataframe(editor: NotebookEditor, message: ExportDataframeCommand) { - const cell = editor.notebook.cellAt(message.cellIndex); - logger.info( - `[DataframeRenderer] exportDataframe called for cell ${ - message.cellIndex - } (${cell?.document.uri.toString()})` - ); - // TODO: Implement dataframe export functionality - } -} diff --git a/src/webviews/extension-side/serviceRegistry.node.ts b/src/webviews/extension-side/serviceRegistry.node.ts index 65fe3b95e8..e3d0620a88 100644 --- a/src/webviews/extension-side/serviceRegistry.node.ts +++ b/src/webviews/extension-side/serviceRegistry.node.ts @@ -17,7 +17,7 @@ import { IJupyterVariableDataProvider, IJupyterVariableDataProviderFactory } from './dataviewer/types'; -import { DataframeRendererComms } from './dataframe/rendererComms'; +import { DataframeController } from './dataframe/dataframeController'; import { IPyWidgetRendererComms } from './ipywidgets/rendererComms'; import { PlotViewer } from './plotting/plotViewer.node'; import { PlotViewerProvider } from './plotting/plotViewerProvider'; @@ -66,10 +66,7 @@ export function registerTypes(serviceManager: IServiceManager) { IExtensionSyncActivationService, IPyWidgetRendererComms ); - serviceManager.addSingleton( - IExtensionSyncActivationService, - DataframeRendererComms - ); + serviceManager.addSingleton(IExtensionSyncActivationService, DataframeController); serviceManager.addSingleton(IVariableViewProvider, VariableViewProvider); serviceManager.add(IJupyterVariableDataProvider, JupyterVariableDataProvider); serviceManager.addSingleton( diff --git a/src/webviews/extension-side/serviceRegistry.web.ts b/src/webviews/extension-side/serviceRegistry.web.ts index 1767e24a0d..defd4f49ca 100644 --- a/src/webviews/extension-side/serviceRegistry.web.ts +++ b/src/webviews/extension-side/serviceRegistry.web.ts @@ -27,7 +27,7 @@ import { PlotSaveHandler } from './plotView/plotSaveHandler'; import { PlotViewHandler } from './plotView/plotViewHandler'; import { RendererCommunication } from './plotView/rendererCommunication'; import { IPlotSaveHandler } from './plotView/types'; -import { DataframeRendererComms } from './dataframe/rendererComms'; +import { DataframeController } from './dataframe/dataframeController'; import { IPyWidgetRendererComms } from './ipywidgets/rendererComms'; import { DataViewerDelegator } from './dataviewer/dataViewerDelegator'; @@ -66,10 +66,7 @@ export function registerTypes(serviceManager: IServiceManager) { IExtensionSyncActivationService, IPyWidgetRendererComms ); - serviceManager.addSingleton( - IExtensionSyncActivationService, - DataframeRendererComms - ); + serviceManager.addSingleton(IExtensionSyncActivationService, DataframeController); serviceManager.addSingleton(IVariableViewProvider, VariableViewProvider); serviceManager.add(IJupyterVariableDataProvider, JupyterVariableDataProvider); serviceManager.addSingleton( diff --git a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx index 3811e1e5e8..faf2eab2e5 100644 --- a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -1,7 +1,13 @@ -import React, { memo, useState } from 'react'; +import React, { memo, useMemo, useState } from 'react'; import { RendererContext } from 'vscode-notebook-renderer'; +export interface DataframeMetadata { + table_state_spec?: string; +} + interface DataframeRendererProps { + cellId?: string; + cellIndex?: number; context: RendererContext; data: { column_count: number; @@ -18,51 +24,109 @@ interface DataframeRendererProps { }[]; type: string; }; + metadata?: DataframeMetadata; +} + +interface TableState { + columnOrder: string[]; + pageIndex: number; + pageSize: number; + sortBy: { id: string; type: string }[]; } -export const DataframeRenderer = memo(function DataframeRenderer({ context, data }: DataframeRendererProps) { - const [resultsPerPage, setResultsPerPage] = useState(10); +export const DataframeRenderer = memo(function DataframeRenderer({ + cellId, + cellIndex, + context, + data, + metadata +}: DataframeRendererProps) { + console.log('[DataframeRenderer] Rendering with:', { cellId, cellIndex, data, metadata }); + + const tableState = useMemo((): TableState => JSON.parse(metadata?.table_state_spec || '{}'), [metadata]); + const [pageSize, setPageSize] = useState(tableState.pageSize || 10); + + console.log({ state: context.getState(), tableState }); const filteredColumns = data.columns.filter((column) => !column.name.startsWith('_deepnote_')); const numberOfRows = Math.min(data.row_count, data.preview_row_count); const numberOfColumns = filteredColumns.length; - const updateCellMetadata = (metadata: Record) => { - if (context.postMessage) { - context.postMessage({ - command: 'updateCellMetadata', - cellIndex: 0, // or get the actual cell index - metadata: metadata - }); - } + const handlePageSizeChange = (event: React.ChangeEvent) => { + const newPageSize = Number(event.target.value); + + setPageSize(newPageSize); + + console.log('[DataframeRenderer] handlePageSizeChange called with cellId:', cellId, 'cellIndex:', cellIndex); + + const message = { + command: 'selectPageSize', + cellId, + cellIndex, + size: newPageSize + }; + + console.log('[DataframeRenderer] Posting message:', message); + + context.postMessage?.(message); }; return ( -
- -
- {filteredColumns.map((column) => { - const rows = data.rows.map((row) => row[column.name]); - - return ( -
-
{column.name}
-
- {rows.map((value, index) => ( -
- {value ? value.toString() : 'None'} -
- ))} +
+
+
+ {filteredColumns.map((column) => { + const rows = data.rows.map((row) => row[column.name]); + + return ( +
+
+
{column.name}
+
{column.dtype}
+
+
+ {rows.map((value, index) => ( +
+ {value ? value.toString() : 'None'} +
+ ))} +
-
- ); - })} + ); + })} +
-
-
- {numberOfRows} rows, {numberOfColumns} columns +
+
+
+ {numberOfRows} rows, {numberOfColumns} columns +
+
+ + + +
-
+
diff --git a/src/webviews/webview-side/dataframe-renderer/index.ts b/src/webviews/webview-side/dataframe-renderer/index.ts index b4d401231f..1fbe32f200 100644 --- a/src/webviews/webview-side/dataframe-renderer/index.ts +++ b/src/webviews/webview-side/dataframe-renderer/index.ts @@ -1,11 +1,19 @@ -import './styles.css'; +import './tailwind.css'; import * as React from 'react'; import * as ReactDOM from 'react-dom'; import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-notebook-renderer'; -import { DataframeRenderer } from './DataframeRenderer'; +import { DataframeMetadata, DataframeRenderer } from './DataframeRenderer'; + +interface Metadata { + cellId?: string; + cellIndex?: number; + executionCount: number; + metadata?: DataframeMetadata; + outputType: string; +} export const activate: ActivationFunction = (context: RendererContext) => { return { @@ -15,10 +23,29 @@ export const activate: ActivationFunction = (context: RendererContext) const data = outputItem.json(); console.log('Dataframe renderer - received data:', data); + const metadata = outputItem.metadata as Metadata | undefined; + console.log('[DataframeRenderer] Full metadata:', metadata); + console.log('[DataframeRenderer] Full outputItem:', outputItem); + + const dataFrameMetadata = metadata?.metadata as DataframeMetadata | undefined; + const cellId = metadata?.cellId; + const cellIndex = metadata?.cellIndex; + + console.log('[DataframeRenderer] Extracted cellId:', cellId, 'cellIndex:', cellIndex); + const root = document.createElement('div'); element.appendChild(root); - ReactDOM.render(React.createElement(DataframeRenderer, { data, context }), root); + ReactDOM.render( + React.createElement(DataframeRenderer, { + context, + data, + metadata: dataFrameMetadata, + cellId, + cellIndex + }), + root + ); } catch (error) { console.error('Error rendering dataframe:', error); const errorDiv = document.createElement('div'); diff --git a/src/webviews/webview-side/dataframe-renderer/styles.css b/src/webviews/webview-side/dataframe-renderer/styles.css deleted file mode 100644 index 9f71821e18..0000000000 --- a/src/webviews/webview-side/dataframe-renderer/styles.css +++ /dev/null @@ -1,24 +0,0 @@ -.dataframe-column { - background: 'red'; - flex: 1; -} - -.dataframe-container { - font-family: var(--vscode-editor-font-family); - font-size: var(--vscode-editor-font-size); - max-width: 100%; - width: 100%; -} - -.dataframe-content { - display: flex; - flex-direction: row; -} - -.dataframe-footer { - border-top: 1px solid var(--vscode-editorWidget-border); - display: flex; - justify-content: space-between; - flex-direction: row; - padding: 4px 8px; -} diff --git a/src/webviews/webview-side/dataframe-renderer/tailwind.css b/src/webviews/webview-side/dataframe-renderer/tailwind.css new file mode 100644 index 0000000000..b5c61c9567 --- /dev/null +++ b/src/webviews/webview-side/dataframe-renderer/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000000..3c827dfdef --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,24 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./src/webviews/webview-side/dataframe-renderer/**/*.{ts,tsx}'], + theme: { + extend: { + colors: { + 'vscode-foreground': 'var(--vscode-foreground)', + 'vscode-background': 'var(--vscode-editor-background)', + 'vscode-border': 'var(--vscode-panel-border)' + }, + borderColor: { + 'vscode-border': 'var(--vscode-panel-border)' + }, + fontFamily: { + mono: 'var(--vscode-editor-font-family)' + } + } + }, + plugins: [], + // Prevent Tailwind from conflicting with VSCode styles + corePlugins: { + preflight: false + } +}; From 558035f94422f8e3133fc35643b2743fb860b442 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Mon, 13 Oct 2025 13:04:00 +0200 Subject: [PATCH 05/21] add page navigation --- .../dataframe/dataframeController.ts | 62 ++++++++++++++++--- .../dataframe-renderer/DataframeRenderer.tsx | 62 ++++++++++++++++++- 2 files changed, 113 insertions(+), 11 deletions(-) diff --git a/src/webviews/extension-side/dataframe/dataframeController.ts b/src/webviews/extension-side/dataframe/dataframeController.ts index 8319f6f555..0528c0c305 100644 --- a/src/webviews/extension-side/dataframe/dataframeController.ts +++ b/src/webviews/extension-side/dataframe/dataframeController.ts @@ -24,8 +24,9 @@ type SelectPageSizeCommand = { }; type GoToPageCommand = { + cellId?: string; + cellIndex?: number; command: 'goToPage'; - cellIndex: number; page: number; }; @@ -145,14 +146,57 @@ export class DataframeController implements IExtensionSyncActivationService { }); } - private handleGoToPage(editor: NotebookEditor, message: GoToPageCommand) { - const cell = editor.notebook.cellAt(message.cellIndex); - logger.info( - `[DataframeRenderer] goToPage called for cell ${ - message.cellIndex - } (${cell?.document.uri.toString()}), page=${message.page}` - ); - // Could store current page in cell metadata if needed + private async handleGoToPage(editor: NotebookEditor, message: GoToPageCommand) { + let cell; + let cellIndex: number; + + // Try to find cell by cellId first (more reliable) + if (message.cellId) { + const cells = editor.notebook.getCells(); + const foundCell = cells.find((c) => c.metadata.id === message.cellId); + + if (foundCell) { + cell = foundCell; + cellIndex = foundCell.index; + logger.info(`[DataframeController] Found cell by cellId ${message.cellId} at index ${cellIndex}`); + } else { + const errorMessage = `Unable to navigate to page: Could not find the cell with ID ${message.cellId}. The cell may have been deleted.`; + logger.error(`[DataframeController] ${errorMessage}`); + await window.showErrorMessage(errorMessage); + throw new Error(errorMessage); + } + } else { + const errorMessage = + 'Unable to navigate to page: No cell identifier provided. ' + + 'Please re-run the cell to update the output metadata.'; + logger.error(`[DataframeController] ${errorMessage}`); + await window.showErrorMessage(errorMessage); + throw new Error(errorMessage); + } + + // Update page index in table state within cell metadata + const existingTableState = cell.metadata.deepnote_table_state || {}; + const updatedTableState = { + ...existingTableState, + pageIndex: message.page + }; + + const edit = new WorkspaceEdit(); + const notebookEdit = NotebookEdit.updateCellMetadata(cellIndex, { + ...cell.metadata, + deepnote_table_state: updatedTableState + }); + + edit.set(editor.notebook.uri, [notebookEdit]); + + await workspace.applyEdit(edit); + + // Re-execute the cell to apply the new page + logger.info(`[DataframeController] Re-executing cell ${cellIndex} with new page index ${message.page}`); + await commands.executeCommand('notebook.cell.execute', { + ranges: [{ start: cellIndex, end: cellIndex + 1 }], + document: editor.notebook.uri + }); } private async handleCopyTableData(message: CopyTableDataCommand) { diff --git a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx index faf2eab2e5..44ced77ea2 100644 --- a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -1,6 +1,8 @@ import React, { memo, useMemo, useState } from 'react'; import { RendererContext } from 'vscode-notebook-renderer'; +import '../react-common/codicon/codicon.css'; + export interface DataframeMetadata { table_state_spec?: string; } @@ -45,6 +47,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ const tableState = useMemo((): TableState => JSON.parse(metadata?.table_state_spec || '{}'), [metadata]); const [pageSize, setPageSize] = useState(tableState.pageSize || 10); + const [pageIndex, setPageIndex] = useState(tableState.pageIndex || 0); console.log({ state: context.getState(), tableState }); @@ -52,6 +55,8 @@ export const DataframeRenderer = memo(function DataframeRenderer({ const numberOfRows = Math.min(data.row_count, data.preview_row_count); const numberOfColumns = filteredColumns.length; + const totalPages = Math.ceil(data.row_count / pageSize); + const handlePageSizeChange = (event: React.ChangeEvent) => { const newPageSize = Number(event.target.value); @@ -71,6 +76,23 @@ export const DataframeRenderer = memo(function DataframeRenderer({ context.postMessage?.(message); }; + const handlePageChange = (newPageIndex: number) => { + setPageIndex(newPageIndex); + + console.log('[DataframeRenderer] handlePageChange called with cellId:', cellId, 'page:', newPageIndex); + + const message = { + command: 'goToPage', + cellId, + cellIndex, + page: newPageIndex + }; + + console.log('[DataframeRenderer] Posting message:', message); + + context.postMessage?.(message); + }; + return (
@@ -103,7 +125,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ })}
-
+
{numberOfRows} rows, {numberOfColumns} columns @@ -127,7 +149,43 @@ export const DataframeRenderer = memo(function DataframeRenderer({
-
+
+ + + Page {pageIndex + 1} of {totalPages} + + +
+ +
+ {/* Actions */} +
); From 5113db68bc147a5675698f2ccc4d966a4070e9a8 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Mon, 13 Oct 2025 14:48:08 +0200 Subject: [PATCH 06/21] Generate Python code before executing the cell. --- pnpm-lock.yaml | 9689 ----------------- src/kernels/execution/cellExecution.ts | 47 +- .../dataframe-renderer/DataframeRenderer.tsx | 4 +- 3 files changed, 15 insertions(+), 9725 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 74f6a31ba9..0000000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,9689 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@c4312/evt': - specifier: ^0.1.1 - version: 0.1.1 - '@deepnote/blocks': - specifier: ^1.0.0 - version: 1.0.0 - '@enonic/fnv-plus': - specifier: ^1.3.0 - version: 1.3.0 - '@jupyter-widgets/base': - specifier: ^6.0.8 - version: 6.0.11(bufferutil@4.0.9)(react@16.14.0)(utf-8-validate@5.0.10) - '@jupyter-widgets/controls': - specifier: ^5.0.9 - version: 5.0.12(bufferutil@4.0.9)(react@16.14.0)(utf-8-validate@5.0.10) - '@jupyter-widgets/schema': - specifier: ^0.5.5 - version: 0.5.6 - '@jupyterlab/coreutils': - specifier: ^6.2.4 - version: 6.4.9 - '@jupyterlab/nbformat': - specifier: ^4.2.4 - version: 4.4.9 - '@jupyterlab/services': - specifier: ^7.2.4 - version: 7.4.9(bufferutil@4.0.9)(react@16.14.0)(utf-8-validate@5.0.10) - '@lumino/widgets': - specifier: ^2.4.0 - version: 2.7.1 - '@nteract/messaging': - specifier: ^7.0.0 - version: 7.0.20 - '@vscode/extension-telemetry': - specifier: ^0.7.7 - version: 0.7.7(tslib@2.8.1) - '@vscode/python-extension': - specifier: ^1.0.4 - version: 1.0.6 - ansi-to-html: - specifier: ^0.6.7 - version: 0.6.15 - bootstrap: - specifier: ^5.0.0 - version: 5.3.8(@popperjs/core@2.11.8) - bootstrap-less: - specifier: ^3.3.8 - version: 3.3.8 - cross-fetch: - specifier: ^3.1.5 - version: 3.2.0(encoding@0.1.13) - encoding: - specifier: ^0.1.13 - version: 0.1.13 - fast-deep-equal: - specifier: ^2.0.1 - version: 2.0.1 - format-util: - specifier: ^1.0.5 - version: 1.0.5 - fs-extra: - specifier: ^4.0.3 - version: 4.0.3 - glob: - specifier: ^7.1.2 - version: 7.2.3 - iconv-lite: - specifier: ^0.6.3 - version: 0.6.3 - inversify: - specifier: ^6.0.1 - version: 6.2.2(reflect-metadata@0.1.14) - isomorphic-ws: - specifier: ^4.0.1 - version: 4.0.1(ws@6.2.3) - jquery: - specifier: ^3.6.0 - version: 3.7.1 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - jsonc-parser: - specifier: ^2.0.3 - version: 2.3.1 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - marked: - specifier: ^4.0.10 - version: 4.3.0 - node-fetch: - specifier: ^2.6.7 - version: 2.7.0(encoding@0.1.13) - node-gyp-build: - specifier: ^4.6.0 - version: 4.8.4 - node-stream-zip: - specifier: ^1.6.0 - version: 1.15.0 - pdfkit: - specifier: ^0.13.0 - version: 0.13.0 - pidtree: - specifier: ^0.6.0 - version: 0.6.0 - portfinder: - specifier: ^1.0.25 - version: 1.0.38 - react: - specifier: ^16.5.2 - version: 16.14.0 - react-data-grid: - specifier: ^6.0.2-0 - version: 6.1.0(react-dom@16.14.0)(react@16.14.0) - react-dom: - specifier: ^16.5.2 - version: 16.14.0(react@16.14.0) - react-redux: - specifier: ^7.1.1 - version: 7.2.9(react-dom@16.14.0)(react@16.14.0) - react-svg-pan-zoom: - specifier: 3.9.0 - version: 3.9.0(react@16.14.0) - react-svgmt: - specifier: 1.1.11 - version: 1.1.11(prop-types@15.8.1)(react-dom@16.14.0)(react@16.14.0) - react-virtualized: - specifier: ^9.21.1 - version: 9.22.6(react-dom@16.14.0)(react@16.14.0) - redux: - specifier: ^4.0.4 - version: 4.2.1 - redux-logger: - specifier: ^3.0.6 - version: 3.0.6 - reflect-metadata: - specifier: ^0.1.12 - version: 0.1.14 - safe-buffer: - specifier: ^5.2.1 - version: 5.2.1 - sanitize-filename: - specifier: ^1.6.3 - version: 1.6.3 - semver: - specifier: ^5.7.2 - version: 5.7.2 - slickgrid: - specifier: ^2.4.17 - version: 2.4.45 - stack-trace: - specifier: 0.0.10 - version: 0.0.10 - strip-comments: - specifier: ^2.0.1 - version: 2.0.1 - styled-components: - specifier: ^5.2.1 - version: 5.3.11(@babel/core@7.28.4)(react-dom@16.14.0)(react-is@19.2.0)(react@16.14.0) - svg-to-pdfkit: - specifier: ^0.1.8 - version: 0.1.8 - tcp-port-used: - specifier: ^1.0.1 - version: 1.0.2 - tmp: - specifier: ^0.2.4 - version: 0.2.5 - url-parse: - specifier: ^1.5.10 - version: 1.5.10 - vscode-debugprotocol: - specifier: ^1.41.0 - version: 1.51.0 - vscode-languageclient: - specifier: 8.0.2-next.5 - version: 8.0.2-next.5 - vscode-tas-client: - specifier: ^0.1.84 - version: 0.1.84 - ws: - specifier: ^6.2.3 - version: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - zeromq: - specifier: ^6.5.0 - version: 6.5.0 - zeromqold: - specifier: npm:zeromq@^6.0.0-beta.6 - version: /zeromq@6.5.0 - -optionalDependencies: - fsevents: - specifier: ^2.3.2 - version: 2.3.3 - -devDependencies: - '@actions/core': - specifier: ^1.11.1 - version: 1.11.1 - '@actions/github': - specifier: ^6.0.1 - version: 6.0.1 - '@actions/glob': - specifier: ^0.5.0 - version: 0.5.0 - '@aminya/node-gyp-build': - specifier: ^4.8.1-aminya.1 - version: 4.8.1-aminya.1 - '@istanbuljs/nyc-config-typescript': - specifier: ^1.0.2 - version: 1.0.2(nyc@15.1.0) - '@sinonjs/fake-timers': - specifier: ^6.0.1 - version: 6.0.1 - '@types/ansi-regex': - specifier: ^4.0.0 - version: 4.0.0 - '@types/chai': - specifier: ^4.3.6 - version: 4.3.20 - '@types/chai-arrays': - specifier: ^2.0.1 - version: 2.0.3 - '@types/chai-as-promised': - specifier: ^7.1.6 - version: 7.1.8 - '@types/cors': - specifier: ^2.8.6 - version: 2.8.19 - '@types/debug': - specifier: ^4.1.5 - version: 4.1.12 - '@types/dedent': - specifier: ^0.7.0 - version: 0.7.2 - '@types/del': - specifier: ^4.0.0 - version: 4.0.3 - '@types/event-stream': - specifier: ^3.3.33 - version: 3.3.34 - '@types/format-util': - specifier: ^1.0.2 - version: 1.0.4 - '@types/fs-extra': - specifier: ^5.0.1 - version: 5.1.0 - '@types/get-port': - specifier: ^3.2.0 - version: 3.2.0 - '@types/glob': - specifier: ^5.0.35 - version: 5.0.38 - '@types/js-yaml': - specifier: ^4.0.9 - version: 4.0.9 - '@types/json2csv': - specifier: ^5.0.3 - version: 5.0.7 - '@types/loadable__component': - specifier: ^5.10.0 - version: 5.13.10 - '@types/lodash': - specifier: ^4.14.104 - version: 4.17.20 - '@types/memoize-one': - specifier: ^4.1.1 - version: 4.1.1 - '@types/mocha': - specifier: ^10.0.10 - version: 10.0.10 - '@types/nock': - specifier: ^10.0.3 - version: 10.0.3 - '@types/node': - specifier: ^22.15.1 - version: 22.18.8 - '@types/node-fetch': - specifier: ^2.6.12 - version: 2.6.13 - '@types/pdfkit': - specifier: ^0.11.0 - version: 0.11.2 - '@types/promisify-node': - specifier: ^0.4.0 - version: 0.4.3 - '@types/react': - specifier: ^16.4.14 - version: 16.14.67 - '@types/react-dom': - specifier: ^16.0.8 - version: 16.9.25(@types/react@16.14.67) - '@types/react-json-tree': - specifier: ^0.6.8 - version: 0.6.11 - '@types/react-redux': - specifier: ^7.1.5 - version: 7.1.34 - '@types/react-virtualized': - specifier: ^9.21.2 - version: 9.22.3 - '@types/redux-logger': - specifier: ^3.0.7 - version: 3.0.13 - '@types/semver': - specifier: ^5.5.0 - version: 5.5.0 - '@types/sinon': - specifier: ^10.0.15 - version: 10.0.20 - '@types/sinonjs__fake-timers': - specifier: ^6.0.1 - version: 6.0.4 - '@types/stack-trace': - specifier: 0.0.29 - version: 0.0.29 - '@types/strip-comments': - specifier: ^2.0.1 - version: 2.0.4 - '@types/svg-to-pdfkit': - specifier: ^0.1.0 - version: 0.1.3 - '@types/tcp-port-used': - specifier: ^1.0.0 - version: 1.0.4 - '@types/temp': - specifier: ^0.8.32 - version: 0.8.34 - '@types/tmp': - specifier: ^0.2.3 - version: 0.2.6 - '@types/url-parse': - specifier: ^1.4.8 - version: 1.4.11 - '@types/uuid': - specifier: ^3.4.3 - version: 3.4.13 - '@types/vscode-notebook-renderer': - specifier: ^1.60.0 - version: 1.72.4 - '@types/ws': - specifier: ^6.0.1 - version: 6.0.4 - '@typescript-eslint/eslint-plugin': - specifier: ^6.9.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/eslint-plugin-tslint': - specifier: ^6.9.0 - version: 6.21.0(eslint@8.57.1)(tslint@6.1.3)(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: ^6.9.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@vscode/dts': - specifier: ^0.4.0 - version: 0.4.1 - '@vscode/test-cli': - specifier: ^0.0.8 - version: 0.0.8 - '@vscode/test-electron': - specifier: ^2.3.9 - version: 2.5.2 - '@vscode/test-web': - specifier: ^0.0.71 - version: 0.0.71 - '@vscode/zeromq': - specifier: ^0.2.3 - version: 0.2.7 - acorn: - specifier: ^8.9.0 - version: 8.15.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - bufferutil: - specifier: ^4.0.6 - version: 4.0.9 - chai: - specifier: ^4.3.10 - version: 4.5.0 - chai-arrays: - specifier: ^2.2.0 - version: 2.2.0 - chai-as-promised: - specifier: ^7.1.1 - version: 7.1.2(chai@4.5.0) - chai-exclude: - specifier: ^2.1.0 - version: 2.1.1(chai@4.5.0) - codecov: - specifier: ^3.7.1 - version: 3.8.3(encoding@0.1.13) - colors: - specifier: ^1.4.0 - version: 1.4.0 - concurrently: - specifier: ^8.2.2 - version: 8.2.2 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - dedent: - specifier: ^0.7.0 - version: 0.7.0 - del: - specifier: ^3.0.0 - version: 3.0.0 - es-abstract: - specifier: ^1.19.1 - version: 1.24.0 - es5-ext: - specifier: ^0.10.63 - version: 0.10.64 - esbuild: - specifier: ^0.25.1 - version: 0.25.10 - esbuild-plugin-import-glob: - specifier: ^0.1.1 - version: 0.1.1 - esbuild-plugin-less: - specifier: ^1.3.19 - version: 1.3.27(esbuild@0.25.10) - eslint: - specifier: ^8.52.0 - version: 8.57.1 - eslint-config-airbnb: - specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.32.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.5)(eslint@8.57.1) - eslint-config-prettier: - specifier: ^9.0.0 - version: 9.1.2(eslint@8.57.1) - eslint-plugin-header: - specifier: ^3.1.1 - version: 3.1.1(eslint@8.57.1) - eslint-plugin-import: - specifier: ^2.29.0 - version: 2.32.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1) - eslint-plugin-jsdoc: - specifier: ^46.8.2 - version: 46.10.1(eslint@8.57.1) - eslint-plugin-jsx-a11y: - specifier: ^6.7.1 - version: 6.10.2(eslint@8.57.1) - eslint-plugin-local-rules: - specifier: file:build/eslint-rules - version: file:build/eslint-rules - eslint-plugin-no-null: - specifier: ^1.0.2 - version: 1.0.2(eslint@8.57.1) - eslint-plugin-no-only-tests: - specifier: ^3.1.0 - version: 3.3.0 - eslint-plugin-prefer-arrow: - specifier: ^1.2.3 - version: 1.2.3(eslint@8.57.1) - eslint-plugin-prettier: - specifier: ^5.0.1 - version: 5.5.4(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.6.2) - eslint-plugin-react: - specifier: ^7.33.2 - version: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) - flat: - specifier: ^5.0.1 - version: 5.0.2 - get-port: - specifier: ^3.2.0 - version: 3.2.0 - glob-parent: - specifier: ^6.0.2 - version: 6.0.2 - gulp: - specifier: ^5.0.0 - version: 5.0.1 - gulp-filter: - specifier: ^7.0.0 - version: 7.0.0(gulp@5.0.1) - gulp-rename: - specifier: ^2.0.0 - version: 2.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - json2csv: - specifier: ^5.0.7 - version: 5.0.7 - jsonschema: - specifier: ^1.4.1 - version: 1.5.0 - keyv: - specifier: ^4.1.0 - version: 4.5.4 - less: - specifier: ^4.1.3 - version: 4.4.2 - less-plugin-inline-urls: - specifier: ^1.2.0 - version: 1.2.0 - lolex: - specifier: ^6.0.0 - version: 6.0.0 - lru-cache: - specifier: ^10.0.0 - version: 10.4.3 - mocha: - specifier: ^11.0.1 - version: 11.7.4 - mocha-junit-reporter: - specifier: ^2.2.0 - version: 2.2.1(mocha@11.7.4) - mocha-multi-reporters: - specifier: ^1.5.1 - version: 1.5.1(mocha@11.7.4) - nock: - specifier: ^13.3.1 - version: 13.5.6 - node-has-native-dependencies: - specifier: ^1.0.2 - version: 1.0.2 - node-html-parser: - specifier: ^6.1.13 - version: 6.1.13 - node-stdlib-browser: - specifier: ^1.3.1 - version: 1.3.1 - nyc: - specifier: ^15.1.0 - version: 15.1.0 - prettier: - specifier: ^3.0.0 - version: 3.6.2 - relative: - specifier: ^3.0.2 - version: 3.0.2 - rimraf: - specifier: ^5.0.1 - version: 5.0.10 - screenshot-desktop: - specifier: ^1.15.2 - version: 1.15.2 - sinon: - specifier: ^15.2.0 - version: 15.2.0 - source-map: - specifier: ^0.7.4 - version: 0.7.6 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - ts-mock-imports: - specifier: ^1.3.0 - version: 1.3.17(sinon@15.2.0)(typescript@5.9.3) - ts-mockito: - specifier: ^2.6.1 - version: 2.6.1 - tsx: - specifier: ^4.19.4 - version: 4.20.6 - typemoq: - specifier: ^2.1.0 - version: 2.1.0 - typescript: - specifier: ^5.8.3 - version: 5.9.3 - unicode-properties: - specifier: ^1.3.1 - version: 1.4.1 - utf-8-validate: - specifier: ^5.0.8 - version: 5.0.10 - util: - specifier: ^0.12.4 - version: 0.12.5 - -packages: - - /@actions/core@1.11.1: - resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} - dependencies: - '@actions/exec': 1.1.1 - '@actions/http-client': 2.2.3 - dev: true - - /@actions/exec@1.1.1: - resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} - dependencies: - '@actions/io': 1.1.3 - dev: true - - /@actions/github@6.0.1: - resolution: {integrity: sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==} - dependencies: - '@actions/http-client': 2.2.3 - '@octokit/core': 5.2.2 - '@octokit/plugin-paginate-rest': 9.2.2(@octokit/core@5.2.2) - '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.2) - '@octokit/request': 8.4.1 - '@octokit/request-error': 5.1.1 - undici: 5.29.0 - dev: true - - /@actions/glob@0.5.0: - resolution: {integrity: sha512-tST2rjPvJLRZLuT9NMUtyBjvj9Yo0MiJS3ow004slMvm8GFM+Zv9HvMJ7HWzfUyJnGrJvDsYkWBaaG3YKXRtCw==} - dependencies: - '@actions/core': 1.11.1 - minimatch: 3.1.2 - dev: true - - /@actions/http-client@2.2.3: - resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} - dependencies: - tunnel: 0.0.6 - undici: 5.29.0 - dev: true - - /@actions/io@1.1.3: - resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} - dev: true - - /@aminya/node-gyp-build@4.8.1-aminya.1: - resolution: {integrity: sha512-r5eD8cvhlXpr5H2TKKsDBlPUzmK8FaWQG4QQ0+AbHyGra2a1uZBa7r9DXCe4FSADw1sU9RAMRJH5/POm4lojFQ==} - hasBin: true - dev: true - - /@azure/abort-controller@2.1.2: - resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.8.1 - dev: false - - /@azure/core-auth@1.10.1: - resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} - engines: {node: '>=20.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.13.1 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/core-rest-pipeline@1.22.1: - resolution: {integrity: sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA==} - engines: {node: '>=20.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 - '@typespec/ts-http-runtime': 0.3.1 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/core-tracing@1.3.1: - resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} - engines: {node: '>=20.0.0'} - dependencies: - tslib: 2.8.1 - dev: false - - /@azure/core-util@1.13.1: - resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} - engines: {node: '>=20.0.0'} - dependencies: - '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.1 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@azure/logger@1.3.0: - resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} - engines: {node: '>=20.0.0'} - dependencies: - '@typespec/ts-http-runtime': 0.3.1 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/code-frame@7.27.1: - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - /@babel/compat-data@7.28.4: - resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} - engines: {node: '>=6.9.0'} - - /@babel/core@7.28.4: - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - /@babel/generator@7.28.3: - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - /@babel/helper-annotate-as-pure@7.27.3: - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.28.4 - dev: false - - /@babel/helper-compilation-targets@7.27.2: - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.28.4 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.26.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - /@babel/helper-globals@7.28.0: - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - /@babel/helper-module-imports@7.27.1: - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - transitivePeerDependencies: - - supports-color - - /@babel/helper-module-imports@7.27.1(supports-color@5.5.0): - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.28.4(supports-color@5.5.0) - '@babel/types': 7.28.4 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4): - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 - transitivePeerDependencies: - - supports-color - - /@babel/helper-plugin-utils@7.27.1: - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-string-parser@7.27.1: - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-identifier@7.27.1: - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option@7.27.1: - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - /@babel/helpers@7.28.4: - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - - /@babel/parser@7.28.4: - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.28.4 - - /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4): - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - dev: false - - /@babel/runtime@7.28.4: - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - - /@babel/template@7.27.2: - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - - /@babel/traverse@7.28.4: - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - /@babel/traverse@7.28.4(supports-color@5.5.0): - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - debug: 4.4.3(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/types@7.28.4: - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@c4312/evt@0.1.1: - resolution: {integrity: sha512-8EW+r3o2mothQKzNuBUGm8MTysihexfBCp1wvw3O6bgA2q7YHNlT104+LOFH1HS/PRy8owzkvZRLbPx4modJoQ==} - dev: false - - /@deepnote/blocks@1.0.0: - resolution: {integrity: sha512-2CNz7QVwKebS6UQxsx4CgJThOjXqd0T096n1UvIxw8L92izOk6QIm+g8Jq3WM7T1ytKJLYd3w7YcOjglN9JK7Q==, tarball: https://npm.pkg.github.com/download/@deepnote/blocks/1.0.0/bbad3593046ed93df89035400c7e7d85a4742494} - dependencies: - ts-dedent: 2.2.0 - dev: false - - /@emotion/is-prop-valid@1.4.0: - resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} - dependencies: - '@emotion/memoize': 0.9.0 - dev: false - - /@emotion/memoize@0.9.0: - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - dev: false - - /@emotion/stylis@0.8.5: - resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - dev: false - - /@emotion/unitless@0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: false - - /@enonic/fnv-plus@1.3.0: - resolution: {integrity: sha512-BCN9uNWH8AmiP7BXBJqEinUY9KXalmRzo+L0cB/mQsmFfzODxwQrbvxCHXUNH2iP+qKkWYtB4vyy8N62PViMFw==} - dev: false - - /@es-joy/jsdoccomment@0.41.0: - resolution: {integrity: sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==} - engines: {node: '>=16'} - dependencies: - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.0.0 - dev: true - - /@esbuild/aix-ppc64@0.25.10: - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.25.10: - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.25.10: - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.25.10: - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.25.10: - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.25.10: - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.25.10: - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.25.10: - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.25.10: - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.25.10: - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.25.10: - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.25.10: - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.25.10: - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.25.10: - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.25.10: - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.25.10: - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.25.10: - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-arm64@0.25.10: - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.25.10: - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-arm64@0.25.10: - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.25.10: - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openharmony-arm64@0.25.10: - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.25.10: - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.25.10: - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.25.10: - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.25.10: - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.9.0(eslint@8.57.1): - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.12.1: - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.57.1: - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - dev: true - - /@gulpjs/messages@1.1.0: - resolution: {integrity: sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==} - engines: {node: '>=10.13.0'} - dev: true - - /@gulpjs/to-absolute-glob@4.0.0: - resolution: {integrity: sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==} - engines: {node: '>=10.13.0'} - dependencies: - is-negated-glob: 1.0.0 - dev: true - - /@humanwhocodes/config-array@0.13.0: - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - dev: true - - /@inversifyjs/common@1.4.0: - resolution: {integrity: sha512-qfRJ/3iOlCL/VfJq8+4o5X4oA14cZSBbpAmHsYj8EsIit1xDndoOl0xKOyglKtQD4u4gdNVxMHx4RWARk/I4QA==} - dev: false - - /@inversifyjs/core@1.3.5(reflect-metadata@0.1.14): - resolution: {integrity: sha512-B4MFXabhNTAmrfgB+yeD6wd/GIvmvWC6IQ8Rh/j2C3Ix69kmqwz9pr8Jt3E+Nho9aEHOQCZaGmrALgtqRd+oEQ==} - dependencies: - '@inversifyjs/common': 1.4.0 - '@inversifyjs/reflect-metadata-utils': 0.2.4(reflect-metadata@0.1.14) - transitivePeerDependencies: - - reflect-metadata - dev: false - - /@inversifyjs/reflect-metadata-utils@0.2.4(reflect-metadata@0.1.14): - resolution: {integrity: sha512-u95rV3lKfG+NT2Uy/5vNzoDujos8vN8O18SSA5UyhxsGYd4GLQn/eUsGXfOsfa7m34eKrDelTKRUX1m/BcNX5w==} - peerDependencies: - reflect-metadata: 0.2.2 - dependencies: - reflect-metadata: 0.1.14 - dev: false - - /@isaacs/balanced-match@4.0.1: - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - dev: true - - /@isaacs/brace-expansion@5.0.0: - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - dependencies: - '@isaacs/balanced-match': 4.0.1 - dev: true - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/nyc-config-typescript@1.0.2(nyc@15.1.0): - resolution: {integrity: sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==} - engines: {node: '>=8'} - peerDependencies: - nyc: '>=15' - dependencies: - '@istanbuljs/schema': 0.1.3 - nyc: 15.1.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jridgewell/gen-mapping@0.3.13: - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - /@jridgewell/remapping@2.3.5: - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - /@jridgewell/sourcemap-codec@1.5.5: - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - /@jridgewell/trace-mapping@0.3.31: - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - /@jupyter-widgets/base@6.0.11(bufferutil@4.0.9)(react@16.14.0)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-s4+UM7DlrhCOqWCh18fSPjOOLWQlKb+vTxHvOQbvwqgwe6pEuncykzZ1vbii71G5RC5tZ+lQblYR1SWDNdq3qQ==} - dependencies: - '@jupyterlab/services': 7.4.9(bufferutil@4.0.9)(react@16.14.0)(utf-8-validate@5.0.10) - '@lumino/coreutils': 2.2.1 - '@lumino/messaging': 2.0.3 - '@lumino/widgets': 2.7.1 - '@types/backbone': 1.4.14 - '@types/lodash': 4.17.20 - backbone: 1.4.0 - jquery: 3.7.1 - lodash: 4.17.21 - transitivePeerDependencies: - - bufferutil - - react - - utf-8-validate - dev: false - - /@jupyter-widgets/controls@5.0.12(bufferutil@4.0.9)(react@16.14.0)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-4ry+1Fb2kB6vdHLDdrvrhZTElyhJfs+Z2XfyqvhkUkIPpCYpF8RXeVay//annWO/H1v0JhfLu44Ett+1/+djVA==} - dependencies: - '@jupyter-widgets/base': 6.0.11(bufferutil@4.0.9)(react@16.14.0)(utf-8-validate@5.0.10) - '@lumino/algorithm': 2.0.3 - '@lumino/domutils': 2.0.3 - '@lumino/messaging': 2.0.3 - '@lumino/signaling': 2.1.4 - '@lumino/widgets': 2.7.1 - d3-color: 3.1.0 - d3-format: 3.1.0 - jquery: 3.7.1 - nouislider: 15.4.0 - transitivePeerDependencies: - - bufferutil - - react - - utf-8-validate - dev: false - - /@jupyter-widgets/schema@0.5.6: - resolution: {integrity: sha512-o8gjK4tzF+pKh5ER0LmUqJOpk2IRGxo+MdosLsJqtw0r00/6e72rTjA9C7uNYamYSpuXDslCe00YHaGdDcTIpw==} - dev: false - - /@jupyter/ydoc@3.1.0: - resolution: {integrity: sha512-+hLNUBZr8Zz8NiuaoYKINDURDJHbjFGxg8EcSU52y+rBe412TsoFxfPSng4eP7w3cZFrVlm7D+8K0nAMHxj0ZQ==} - dependencies: - '@jupyterlab/nbformat': 4.4.9 - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - '@lumino/signaling': 2.1.4 - y-protocols: 1.0.6(yjs@13.6.27) - yjs: 13.6.27 - dev: false - - /@jupyterlab/coreutils@6.4.9: - resolution: {integrity: sha512-UcuKl+ioafIYdJM2XEb+f/VOJy4a3Xcdp6G/Bpw2BGEhlL+E6zgSjuLZOIlwaJb1B3qJGvjpW64bDPbM5jDEKA==} - dependencies: - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - '@lumino/signaling': 2.1.4 - minimist: 1.2.8 - path-browserify: 1.0.1 - url-parse: 1.5.10 - dev: false - - /@jupyterlab/nbformat@4.4.9: - resolution: {integrity: sha512-8Zb1byR338T+8Ty/Rx1jkKj986Xp7EjXgRqDKsuRLTvE2dpR17FitCKqF/J3ia33MNkElIk9Aj+fatNm8ypGdA==} - dependencies: - '@lumino/coreutils': 2.2.1 - dev: false - - /@jupyterlab/services@7.4.9(bufferutil@4.0.9)(react@16.14.0)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-gBapumGTArPUWO8IHgBgFybDgDbixjlRmqd2vgiscb+dhD1gH2WHHlmpJwuzTtX3tng72bDPYgnG8Zc22wtUWQ==} - dependencies: - '@jupyter/ydoc': 3.1.0 - '@jupyterlab/coreutils': 6.4.9 - '@jupyterlab/nbformat': 4.4.9 - '@jupyterlab/settingregistry': 4.4.9(react@16.14.0) - '@jupyterlab/statedb': 4.4.9 - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - '@lumino/polling': 2.1.4 - '@lumino/properties': 2.0.3 - '@lumino/signaling': 2.1.4 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - react - - utf-8-validate - dev: false - - /@jupyterlab/settingregistry@4.4.9(react@16.14.0): - resolution: {integrity: sha512-IexXqi8pTqwBNEvFe2yh48aSq3ePFdAymsdLPP0A4ZF93EB2MQr3fvIiuoH4HE71rfZnXWW39u2yS5puTkszFw==} - peerDependencies: - react: '>=16' - dependencies: - '@jupyterlab/nbformat': 4.4.9 - '@jupyterlab/statedb': 4.4.9 - '@lumino/commands': 2.3.2 - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - '@lumino/signaling': 2.1.4 - '@rjsf/utils': 5.24.13(react@16.14.0) - ajv: 8.17.1 - json5: 2.2.3 - react: 16.14.0 - dev: false - - /@jupyterlab/statedb@4.4.9: - resolution: {integrity: sha512-DBfQzz+ahBPZeuy5HrGkaK73HSz6t2PVpK8ekQkqEla6zVx5CzcqOaS7ea+r+5pKWOZeHQVu7c7B7tX/MNaUkQ==} - dependencies: - '@lumino/commands': 2.3.2 - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - '@lumino/properties': 2.0.3 - '@lumino/signaling': 2.1.4 - dev: false - - /@koa/cors@5.0.0: - resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} - engines: {node: '>= 14.0.0'} - dependencies: - vary: 1.1.2 - dev: true - - /@koa/router@13.1.1: - resolution: {integrity: sha512-JQEuMANYRVHs7lm7KY9PCIjkgJk73h4m4J+g2mkw2Vo1ugPZ17UJVqEH8F+HeAdjKz5do1OaLe7ArDz+z308gw==} - engines: {node: '>= 18'} - dependencies: - debug: 4.4.3 - http-errors: 2.0.0 - koa-compose: 4.1.0 - path-to-regexp: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@lumino/algorithm@2.0.3: - resolution: {integrity: sha512-DIcF7cIrGEC1Wh8DNjdwaL7IdcNs4Jj1VjO/90oHefeQPszKgc6DSfCxvbQiRanKR6tl/JL7tq4ZRPZES2oVAA==} - dev: false - - /@lumino/collections@2.0.3: - resolution: {integrity: sha512-Y9Wtvuk8SD6xcKgkqe3SUx5RywOcRz6DyWE4f5FvBT3OdANq76p9r0wtf8OKPt4BGE41kAQR+bdq3k+MfHlUsQ==} - dependencies: - '@lumino/algorithm': 2.0.3 - dev: false - - /@lumino/commands@2.3.2: - resolution: {integrity: sha512-aAFEiUpp2hrkQU82Z85w1L80g0iDzsQRncLBa+pqVR/k0k1lz6H9F6xZ1ff+lBumZKKtsxBxNomvd0hfxLLqGw==} - dependencies: - '@lumino/algorithm': 2.0.3 - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - '@lumino/domutils': 2.0.3 - '@lumino/keyboard': 2.0.3 - '@lumino/signaling': 2.1.4 - '@lumino/virtualdom': 2.0.3 - dev: false - - /@lumino/coreutils@2.2.1: - resolution: {integrity: sha512-yij4TnxDIum7xfFUsVvZB0oLv4shs2mNbn3juwtEIsruvVBPmurNzKX0Y8z2QetbP2AZ6MSFtBzEKsihf0H0VA==} - dependencies: - '@lumino/algorithm': 2.0.3 - dev: false - - /@lumino/disposable@2.1.4: - resolution: {integrity: sha512-qTJiDbglPE2QnG4x4gtBcRbcfKQibxyyinNGKcNDrcK2TGTbbhK5PpMQ8d70l2V2Xw2pb/LfksBAg5pxkJ/G4A==} - dependencies: - '@lumino/signaling': 2.1.4 - dev: false - - /@lumino/domutils@2.0.3: - resolution: {integrity: sha512-bXAbZg3mf2ZDNdBBpCGDike3U+osRGHePTh8H2Ud2KwaN4g/5IryFJm/TiO4K5IYs91bWF2Zqhf3FsdbZKHlGw==} - dev: false - - /@lumino/dragdrop@2.1.6: - resolution: {integrity: sha512-N9aqdOYl5HTuTAIVvjTXxlPKK3e9JAj5yEtJ4nA/tNE7J8C9y3BRQ4fBAtk7O0z/8yx8tO8a0j5oSt2zAfvYuA==} - dependencies: - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - dev: false - - /@lumino/keyboard@2.0.3: - resolution: {integrity: sha512-bU2OxAR8a9eNBdV0YFjU6/lVVpbOw1gM7yHOuDGDdNu4J0UpKapFoR9gopNGSaHTmTwDtx9RHdFfIAgHwjZ+VQ==} - dev: false - - /@lumino/messaging@2.0.3: - resolution: {integrity: sha512-//NAE+FG9UWSoXs4i5imduGY1XDvhjMGNF82aMyFTv8wVU6bdRfRmj0xLlQ8ixzA0eXPOFL4ugWZNdlu48P1+Q==} - dependencies: - '@lumino/algorithm': 2.0.3 - '@lumino/collections': 2.0.3 - dev: false - - /@lumino/polling@2.1.4: - resolution: {integrity: sha512-gSkxlIJ/4/esY2G7bsRrY9A4KimDMHTo0shaD+MCbhd09fZMCWJoDMcA447/dykB1rM5NXgugNLjpdGGL/e8cw==} - dependencies: - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - '@lumino/signaling': 2.1.4 - dev: false - - /@lumino/properties@2.0.3: - resolution: {integrity: sha512-zkXIU5uYz/ScHCHGl5Bt4gMYsfPxZEduZd80zqDslBWvTIMro3NnzLe66NMnecbdr5N3hDJagYyA8//Qy3XjiA==} - dev: false - - /@lumino/signaling@2.1.4: - resolution: {integrity: sha512-nC5Z6d9om369Jkh1Vp3b7C89hV4cjr1fQDVcxhemyKXwc9r6VW7FpKixC+jElcAknP5KLj1FAa8Np+K06mMkEA==} - dependencies: - '@lumino/algorithm': 2.0.3 - '@lumino/coreutils': 2.2.1 - dev: false - - /@lumino/virtualdom@2.0.3: - resolution: {integrity: sha512-q2C8eBxPvvOOQjN3KuxZ+vJi082JH/GF7KwMdaWsy5g+7wjKdnXPuLQFTBLOrVqIzmbxBDlLeFr93CEhdQXcyQ==} - dependencies: - '@lumino/algorithm': 2.0.3 - dev: false - - /@lumino/widgets@2.7.1: - resolution: {integrity: sha512-gGq3zB1260gG1aK1m3SkqVoWZ/yfUxCKZvUOmRKLIcZPJUs33bgessm4P65oY5C1eAXalU4erLmKBiBaOn5gtw==} - dependencies: - '@lumino/algorithm': 2.0.3 - '@lumino/commands': 2.3.2 - '@lumino/coreutils': 2.2.1 - '@lumino/disposable': 2.1.4 - '@lumino/domutils': 2.0.3 - '@lumino/dragdrop': 2.1.6 - '@lumino/keyboard': 2.0.3 - '@lumino/messaging': 2.0.3 - '@lumino/properties': 2.0.3 - '@lumino/signaling': 2.1.4 - '@lumino/virtualdom': 2.0.3 - dev: false - - /@microsoft/1ds-core-js@3.2.18(tslib@2.8.1): - resolution: {integrity: sha512-ytlFv3dfb8OGqvbZP8tSIlNvn3QNYxdsF0k6ikRMWSr6CmBxBi1sliaxc2Q5KuYOuaeWkd8WRm25Rx/UtHcyMg==} - dependencies: - '@microsoft/applicationinsights-core-js': 2.8.18(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 2.0.2 - '@microsoft/dynamicproto-js': 1.1.11 - transitivePeerDependencies: - - tslib - dev: false - - /@microsoft/1ds-post-js@3.2.18(tslib@2.8.1): - resolution: {integrity: sha512-Tzjcja4SMyws3UP58kD2edFPNb7BJtx5uCgwf/PWXwDyfbUY1/crsTQdEyR98wy/vorvLDZdQlcL++VMChfYnQ==} - dependencies: - '@microsoft/1ds-core-js': 3.2.18(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 2.0.2 - '@microsoft/dynamicproto-js': 1.1.11 - transitivePeerDependencies: - - tslib - dev: false - - /@microsoft/applicationinsights-channel-js@2.8.18(tslib@2.8.1): - resolution: {integrity: sha512-KNYk8qeci8AcWKZUqgCElEr1Ef5G+iudq1mN57Sc/8hUONNp2fTfWh1Cm+RUTRIEWAC29uUWGyLhSqiTF3ox1w==} - peerDependencies: - tslib: '*' - dependencies: - '@microsoft/applicationinsights-common': 2.8.18(tslib@2.8.1) - '@microsoft/applicationinsights-core-js': 2.8.18(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 2.0.2 - '@microsoft/dynamicproto-js': 1.1.11 - tslib: 2.8.1 - dev: false - - /@microsoft/applicationinsights-common@2.8.18(tslib@2.8.1): - resolution: {integrity: sha512-/PBRmRL6rFCoO3vWpIEHuFnu+TinEYRKWOj+I+XVUH5myZpv+nYvaRdwryVTkmCYxLyL9kxtNn7hQx8DBlhdSw==} - peerDependencies: - tslib: '*' - dependencies: - '@microsoft/applicationinsights-core-js': 2.8.18(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 2.0.2 - '@microsoft/dynamicproto-js': 1.1.11 - tslib: 2.8.1 - dev: false - - /@microsoft/applicationinsights-core-js@2.8.18(tslib@2.8.1): - resolution: {integrity: sha512-yPHRZFLpnEO0uSgFPM1BLMRRwjoten9YBbn4pJRbCT4PigLnj748knmWsMwXIdcehtkRTYz78kPYa/LWP7nvmA==} - peerDependencies: - tslib: '*' - dependencies: - '@microsoft/applicationinsights-shims': 2.0.2 - '@microsoft/dynamicproto-js': 1.1.11 - tslib: 2.8.1 - dev: false - - /@microsoft/applicationinsights-shims@2.0.2: - resolution: {integrity: sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==} - dev: false - - /@microsoft/applicationinsights-web-basic@2.8.18(tslib@2.8.1): - resolution: {integrity: sha512-CN13JfKY3YrXgzId6t2eSYzjofwXA0iiybGHiTa7r/BWLSMaA7gUcOsNm2M21dYuFX+RFb9b4M0UJiaOHwaUvQ==} - peerDependencies: - tslib: '*' - dependencies: - '@microsoft/applicationinsights-channel-js': 2.8.18(tslib@2.8.1) - '@microsoft/applicationinsights-common': 2.8.18(tslib@2.8.1) - '@microsoft/applicationinsights-core-js': 2.8.18(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 2.0.2 - '@microsoft/dynamicproto-js': 1.1.11 - tslib: 2.8.1 - dev: false - - /@microsoft/applicationinsights-web-snippet@1.2.2: - resolution: {integrity: sha512-pIa6QiUaenVlKzNJ9PYMgHDm4PfIJjm5zW3Vq//xsSkRerNlFfcv7dJKHGtX7kYPlSeMRFwld303bwIoUijehQ==} - dev: false - - /@microsoft/dynamicproto-js@1.1.11: - resolution: {integrity: sha512-gNw9z9LbqLV+WadZ6/MMrWwO3e0LuoUH1wve/1iPsBNbgqeVCiB0EZFNNj2lysxS2gkqoF9hmyVaG3MoM1BkxA==} - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - dev: true - - /@nteract/commutable@7.5.1: - resolution: {integrity: sha512-Z4dz6tUuQJGeCeB7zp2ZTYTnkyRxvGWWozS9n3QuoB9k18GeKdEgT7Rzkt7DbzBpKwmSrHaMVJETLiOVXj4bWA==} - dependencies: - immutable: 4.3.7 - uuid: 8.3.2 - dev: false - - /@nteract/messaging@7.0.20: - resolution: {integrity: sha512-dl8WFvk+pkOzZowMV4SIJC+Kx52LSy0GZr9UQ/te+RJqiUD/nsEl2fbvcqdTV6SZBT4H2WyZRWIUedBtH3zmvw==} - dependencies: - '@nteract/types': 7.1.9 - '@types/uuid': 8.3.4 - lodash.clonedeep: 4.5.0 - rxjs: 6.6.7 - uuid: 8.3.2 - dev: false - - /@nteract/types@7.1.9: - resolution: {integrity: sha512-a7lGMWdjfz2QGlZbAiFHifU9Nhk9ntwg/iKUTMIMRPY1Wfs5UreHSMt+vZ8OY5HGjxicfHozBatGDKXeKXFHMQ==} - dependencies: - '@nteract/commutable': 7.5.1 - immutable: 4.3.7 - rxjs: 6.6.7 - uuid: 8.3.2 - dev: false - - /@octokit/auth-token@4.0.0: - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} - dev: true - - /@octokit/core@5.2.2: - resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} - engines: {node: '>= 18'} - dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.1.1 - '@octokit/request': 8.4.1 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 - dev: true - - /@octokit/endpoint@9.0.6: - resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} - engines: {node: '>= 18'} - dependencies: - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 - dev: true - - /@octokit/graphql@7.1.1: - resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} - engines: {node: '>= 18'} - dependencies: - '@octokit/request': 8.4.1 - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 - dev: true - - /@octokit/openapi-types@20.0.0: - resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} - dev: true - - /@octokit/openapi-types@24.2.0: - resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} - dev: true - - /@octokit/plugin-paginate-rest@9.2.2(@octokit/core@5.2.2): - resolution: {integrity: sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - dependencies: - '@octokit/core': 5.2.2 - '@octokit/types': 12.6.0 - dev: true - - /@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.2): - resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - dependencies: - '@octokit/core': 5.2.2 - '@octokit/types': 12.6.0 - dev: true - - /@octokit/request-error@5.1.1: - resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} - engines: {node: '>= 18'} - dependencies: - '@octokit/types': 13.10.0 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request@8.4.1: - resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} - engines: {node: '>= 18'} - dependencies: - '@octokit/endpoint': 9.0.6 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 - dev: true - - /@octokit/types@12.6.0: - resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} - dependencies: - '@octokit/openapi-types': 20.0.0 - dev: true - - /@octokit/types@13.10.0: - resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - dependencies: - '@octokit/openapi-types': 24.2.0 - dev: true - - /@opentelemetry/api@1.9.0: - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - dev: false - - /@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0): - resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.28.0 - dev: false - - /@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0): - resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - dev: false - - /@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0): - resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 - dev: false - - /@opentelemetry/semantic-conventions@1.28.0: - resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} - engines: {node: '>=14'} - dev: false - - /@opentelemetry/semantic-conventions@1.37.0: - resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} - engines: {node: '>=14'} - dev: false - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - - /@pkgr/core@0.2.9: - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true - - /@playwright/browser-chromium@1.56.0: - resolution: {integrity: sha512-+OABx0PwbzoWXO5qOmonvQlIZq0u89XpDkRYf+ZTOs+wsI3r/NV90rzGr8nsJZTj7o10tdPMmuGmZ3OKP9ag4Q==} - engines: {node: '>=18'} - requiresBuild: true - dependencies: - playwright-core: 1.56.0 - dev: true - - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false - - /@rjsf/utils@5.24.13(react@16.14.0): - resolution: {integrity: sha512-rNF8tDxIwTtXzz5O/U23QU73nlhgQNYJ+Sv5BAwQOIyhIE2Z3S5tUiSVMwZHt0julkv/Ryfwi+qsD4FiE5rOuw==} - engines: {node: '>=14'} - peerDependencies: - react: ^16.14.0 || >=17 - dependencies: - json-schema-merge-allof: 0.8.1 - jsonpointer: 5.0.1 - lodash: 4.17.21 - lodash-es: 4.17.21 - react: 16.14.0 - react-is: 18.3.1 - dev: false - - /@rtsao/scc@1.1.0: - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - dev: true - - /@sinonjs/commons@1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.1 - dev: true - - /@sinonjs/fake-timers@11.3.1: - resolution: {integrity: sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==} - dependencies: - '@sinonjs/commons': 3.0.1 - dev: true - - /@sinonjs/fake-timers@6.0.1: - resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /@sinonjs/samsam@8.0.3: - resolution: {integrity: sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==} - dependencies: - '@sinonjs/commons': 3.0.1 - type-detect: 4.1.0 - dev: true - - /@sinonjs/text-encoding@0.7.3: - resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} - dev: true - - /@swc/helpers@0.3.17: - resolution: {integrity: sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==} - dependencies: - tslib: 2.8.1 - dev: false - - /@tootallnate/once@1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: true - - /@types/ansi-regex@4.0.0: - resolution: {integrity: sha512-r1W316vjsZXn1/csLC4HcCJs6jIHIzksHJd7xx+Dl+PAb0S2Dh9cR8ZsIMEfGmbBtP7JNWlf2KKahSkDP6rg3g==} - dev: true - - /@types/backbone@1.4.14: - resolution: {integrity: sha512-85ldQ99fiYTJFBlZuAJRaCdvTZKZ2p1fSs3fVf+6Ub6k1X0g0hNJ0qJ/2FOByyyAQYLtbEz3shX5taKQfBKBDw==} - dependencies: - '@types/jquery': 3.5.33 - '@types/underscore': 1.13.0 - dev: false - - /@types/chai-arrays@2.0.3: - resolution: {integrity: sha512-6Sn2OTvsv8kvdcwDoVdwYut2/PMQh3AIp4sB+uDpn7SFLRF123SWOlmC/WQHZmTFapaMvroh+MbLNpSoU+rlLQ==} - dependencies: - '@types/chai': 4.3.20 - dev: true - - /@types/chai-as-promised@7.1.8: - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - dependencies: - '@types/chai': 4.3.20 - dev: true - - /@types/chai@4.3.20: - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - dev: true - - /@types/cors@2.8.19: - resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - dependencies: - '@types/node': 22.18.8 - dev: true - - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - dependencies: - '@types/ms': 2.1.0 - dev: true - - /@types/dedent@0.7.2: - resolution: {integrity: sha512-kRiitIeUg1mPV9yH4VUJ/1uk2XjyANfeL8/7rH1tsjvHeO9PJLBHJIYsFWmAvmGj5u8rj+1TZx7PZzW2qLw3Lw==} - dev: true - - /@types/del@4.0.3: - resolution: {integrity: sha512-3n5r1UsyZWS7gvQC0Z6QPA2thgK0cBGZHkKUta+e+saNCr2bjQPSSU6Tg1maX5/2LR4ot167Q7T7ohWzP8edAw==} - deprecated: This is a stub types definition. del provides its own type definitions, so you do not need this installed. - dependencies: - del: 3.0.0 - dev: true - - /@types/event-stream@3.3.34: - resolution: {integrity: sha512-LLiivgWKii4JeMzFy3trrxqkRrVSdue8WmbXyHuSJLwNrhIQU5MTrc65jhxEPwMyh5HR1xevSdD+k2nnSRKw9g==} - dependencies: - '@types/node': 22.18.8 - dev: true - - /@types/format-util@1.0.4: - resolution: {integrity: sha512-xrCYOdHh5zA3LUrn6CvspYwlzSWxPso11Lx32WnAG6KvLCRecKZ/Rh21PLXUkzUFsQmrGcx/traJAFjR6dVS5Q==} - dev: true - - /@types/fs-extra@5.1.0: - resolution: {integrity: sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==} - dependencies: - '@types/node': 22.18.8 - dev: true - - /@types/get-port@3.2.0: - resolution: {integrity: sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==} - dev: true - - /@types/glob@5.0.38: - resolution: {integrity: sha512-rTtf75rwyP9G2qO5yRpYtdJ6aU1QqEhWbtW55qEgquEDa6bXW0s2TWZfDm02GuppjEozOWG/F2UnPq5hAQb+gw==} - dependencies: - '@types/minimatch': 6.0.0 - '@types/node': 22.18.8 - dev: true - - /@types/hoist-non-react-statics@3.3.7(@types/react@16.14.67): - resolution: {integrity: sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==} - peerDependencies: - '@types/react': '*' - dependencies: - '@types/react': 16.14.67 - hoist-non-react-statics: 3.3.2 - - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/jquery@3.5.33: - resolution: {integrity: sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==} - dependencies: - '@types/sizzle': 2.3.10 - dev: false - - /@types/js-yaml@4.0.9: - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - dev: true - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - - /@types/json2csv@5.0.7: - resolution: {integrity: sha512-Ma25zw9G9GEBnX8b12R4EYvnFT6dBh8L3jwsN5EUFXa+fl2dqmbLDbNWN0XuQU3rSXdsbBeCYjI9uHU2PUBxhA==} - dependencies: - '@types/node': 22.18.8 - dev: true - - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - - /@types/less@3.0.8: - resolution: {integrity: sha512-Gjm4+H9noDJgu5EdT3rUw5MhPBag46fiOy27BefvWkNL8mlZnKnCaVVVTLKj6RYXed9b62CPKnPav9govyQDzA==} - dev: true - - /@types/loadable__component@5.13.10: - resolution: {integrity: sha512-2/LjmgG1JcGPj7T3NViq7BB5cvOA0s63gL3Gv+FPULj2L+3ExWfsNQcsFPUIOoGsVUJeZxgNPf320JZDyxjtCQ==} - dependencies: - '@types/react': 16.14.67 - dev: true - - /@types/lodash@4.17.20: - resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} - - /@types/memoize-one@4.1.1: - resolution: {integrity: sha512-+9djKUUn8hOyktLCfCy4hLaIPgDNovaU36fsnZe9trFHr6ddlbIn2q0SEsnkCkNR+pBWEU440Molz/+Mpyf+gQ==} - dev: true - - /@types/minimatch@3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - dev: true - - /@types/minimatch@6.0.0: - resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} - deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - dependencies: - minimatch: 10.0.3 - dev: true - - /@types/mocha@10.0.10: - resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - dev: true - - /@types/ms@2.1.0: - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - dev: true - - /@types/nock@10.0.3: - resolution: {integrity: sha512-OthuN+2FuzfZO3yONJ/QVjKmLEuRagS9TV9lEId+WHL9KhftYG+/2z+pxlr0UgVVXSpVD8woie/3fzQn8ft/Ow==} - dependencies: - '@types/node': 22.18.8 - dev: true - - /@types/node-fetch@2.6.13: - resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - dependencies: - '@types/node': 22.18.8 - form-data: 4.0.4 - dev: true - - /@types/node@22.18.8: - resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} - dependencies: - undici-types: 6.21.0 - dev: true - - /@types/pdfkit@0.11.2: - resolution: {integrity: sha512-4FS1b4ZqSdE4vrHIxpiaPbOIvELlssavpknaRRrdrRH7IgRvO6nbGeI3PEiC7vJSDfxQ8GBZwGVybqgUX4oqww==} - dependencies: - '@types/node': 22.18.8 - dev: true - - /@types/promisify-node@0.4.3: - resolution: {integrity: sha512-EqOBK2rELgNQ0z7cLeqIN8mjxJzrwoWlKyG5jgCQUGrn6jV1n58Yi92OXsqpxSB80DuIODkZvqx1EFcVyUsdnA==} - dev: true - - /@types/prop-types@15.7.15: - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - /@types/react-dom@16.9.25(@types/react@16.14.67): - resolution: {integrity: sha512-ZK//eAPhwft9Ul2/Zj+6O11YR6L4JX0J2sVeBC9Ft7x7HFN7xk7yUV/zDxqV6rjvqgl6r8Dq7oQImxtyf/Mzcw==} - peerDependencies: - '@types/react': ^16.0.0 - dependencies: - '@types/react': 16.14.67 - dev: true - - /@types/react-json-tree@0.6.11: - resolution: {integrity: sha512-HP0Sf0ZHjCi1FHLJxh/pLaxaevEW6ILlV2C5Dn3EZFTkLjWkv+EVf/l/zvtmoU9ZwuO/3TKVeWK/700UDxunTw==} - dependencies: - '@types/react': 16.14.67 - dev: true - - /@types/react-redux@7.1.34: - resolution: {integrity: sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==} - dependencies: - '@types/hoist-non-react-statics': 3.3.7(@types/react@16.14.67) - '@types/react': 16.14.67 - hoist-non-react-statics: 3.3.2 - redux: 4.2.1 - - /@types/react-virtualized@9.22.3: - resolution: {integrity: sha512-UKRWeBIrECaKhE4O//TSFhlgwntMwyiEIOA7WZoVkr52Jahv0dH6YIOorqc358N2V3oKFclsq5XxPmx2PiYB5A==} - dependencies: - '@types/prop-types': 15.7.15 - '@types/react': 16.14.67 - dev: true - - /@types/react@16.14.67: - resolution: {integrity: sha512-6M9qGVD9UQWHDrBYvLKNHVRVsuFylGRaEoTLb8Y9eGAWxb0K0D84kViIcejUOq0RoEPSIOsipWRIEu46TS27ZQ==} - dependencies: - '@types/prop-types': 15.7.15 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 - - /@types/redux-logger@3.0.13: - resolution: {integrity: sha512-jylqZXQfMxahkuPcO8J12AKSSCQngdEWQrw7UiLUJzMBcv1r4Qg77P6mjGLjM27e5gFQDPD8vwUMJ9AyVxFSsg==} - dependencies: - redux: 5.0.1 - dev: true - - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - - /@types/semver@5.5.0: - resolution: {integrity: sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==} - dev: true - - /@types/semver@7.7.1: - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - dev: true - - /@types/sinon@10.0.20: - resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} - dependencies: - '@types/sinonjs__fake-timers': 6.0.4 - dev: true - - /@types/sinonjs__fake-timers@6.0.4: - resolution: {integrity: sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==} - dev: true - - /@types/sizzle@2.3.10: - resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==} - dev: false - - /@types/stack-trace@0.0.29: - resolution: {integrity: sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==} - dev: true - - /@types/strip-comments@2.0.4: - resolution: {integrity: sha512-YwcQqIGy90zEHrReYrMTpZfq003Um77WayeE8UwJTHvaM9g9XR9N7GMVSnjRhhDzQYVX375JnB5P6q5kAg221g==} - dev: true - - /@types/svg-to-pdfkit@0.1.3: - resolution: {integrity: sha512-cvCWOllCV7v6K4jWhzaAkWXhMbTlDHFTBorKx0E233xVflRb8wbVFvSyEezSJfIiP+9dWd5YTuiPR2k/dlyNYg==} - dependencies: - '@types/pdfkit': 0.11.2 - dev: true - - /@types/tcp-port-used@1.0.4: - resolution: {integrity: sha512-0vQ4fz9TTM4bCdllYWEJ2JHBUXR9xqPtc70dJ7BMRDVfvZyYdrgey3nP5RRcVj+qAgnHJM8r9fvgrfnPMxdnhA==} - dev: true - - /@types/temp@0.8.34: - resolution: {integrity: sha512-oLa9c5LHXgS6UimpEVp08De7QvZ+Dfu5bMQuWyMhf92Z26Q10ubEMOWy9OEfUdzW7Y/sDWVHmUaLFtmnX/2j0w==} - dependencies: - '@types/node': 22.18.8 - dev: true - - /@types/tmp@0.2.6: - resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} - dev: true - - /@types/underscore@1.13.0: - resolution: {integrity: sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==} - dev: false - - /@types/url-parse@1.4.11: - resolution: {integrity: sha512-FKvKIqRaykZtd4n47LbK/W/5fhQQ1X7cxxzG9A48h0BGN+S04NH7ervcCjM8tyR0lyGru83FAHSmw2ObgKoESg==} - dev: true - - /@types/uuid@3.4.13: - resolution: {integrity: sha512-pAeZeUbLE4Z9Vi9wsWV2bYPTweEHeJJy0G4pEjOA/FSvy1Ad5U5Km8iDV6TKre1mjBiVNfAdVHKruP8bAh4Q5A==} - dev: true - - /@types/uuid@8.3.4: - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - dev: false - - /@types/vscode-notebook-renderer@1.72.4: - resolution: {integrity: sha512-bdKO41c6Dc24pH/O/eM/jqfCwGH4zc76o/g/6Gt1y/eg/bvvqP2/VpbV+Sa5Te2sZekFRcbYnSSFTKo3wcVGUg==} - dev: true - - /@types/ws@6.0.4: - resolution: {integrity: sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==} - dependencies: - '@types/node': 22.18.8 - dev: true - - /@typescript-eslint/eslint-plugin-tslint@6.21.0(eslint@8.57.1)(tslint@6.1.3)(typescript@5.9.3): - resolution: {integrity: sha512-DktcL2dSnR90VCVHXYKUz40QQ5DY2lSvnbkQJ+b1BtWhj/sNXdtlmQR6vB6b4RyEm/GMhvLFj6Pq1MvVVXLMAg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - tslint: ^5.0.0 || ^6.0.0 - typescript: '*' - dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 - tslint: 6.1.3(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.9.3): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3 - eslint: 8.57.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@6.21.0: - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - dev: true - - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - debug: 4.4.3 - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@6.21.0: - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3): - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3): - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - eslint: 8.57.1 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@6.21.0: - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@typespec/ts-http-runtime@0.3.1: - resolution: {integrity: sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww==} - engines: {node: '>=20.0.0'} - dependencies: - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@ungap/structured-clone@1.3.0: - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - dev: true - - /@vscode/dts@0.4.1: - resolution: {integrity: sha512-o8cI5Vqt6S6Y5mCI7yCkSQdiLQaLG5DMUpciJV3zReZwE+dA5KERxSVX8H3cPEhyKw21XwKGmIrg6YmN6M5uZA==} - hasBin: true - dependencies: - https-proxy-agent: 7.0.6 - minimist: 1.2.8 - prompts: 2.4.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@vscode/extension-telemetry@0.7.7(tslib@2.8.1): - resolution: {integrity: sha512-uW508BPjkWDBOKvvvSym3ZmGb7kHIiWaAfB/1PHzLz2x9TrC33CfjmFEI+CywIL/jBv4bqZxxjN4tfefB61F+g==} - engines: {vscode: ^1.75.0} - dependencies: - '@microsoft/1ds-core-js': 3.2.18(tslib@2.8.1) - '@microsoft/1ds-post-js': 3.2.18(tslib@2.8.1) - '@microsoft/applicationinsights-web-basic': 2.8.18(tslib@2.8.1) - applicationinsights: 2.5.0 - transitivePeerDependencies: - - applicationinsights-native-metrics - - supports-color - - tslib - dev: false - - /@vscode/python-extension@1.0.6: - resolution: {integrity: sha512-q7KYf+mymM67G0yS6xfhczFwu2teBi5oXHVdNgtCsYhErdSOkwMPtE291SqQahrjTcgKxn7O56i1qb1EQR6o4w==} - engines: {node: '>=22.17.0', vscode: ^1.93.0} - dev: false - - /@vscode/test-cli@0.0.8: - resolution: {integrity: sha512-sBSMSDzJChiiDjmys2Q6uI4SIoUYf0t6oDsQO3ypaQ7udha9YD4e2On9e9VE5OBayZMpxbgJX+NudmCwJMdOIg==} - hasBin: true - dependencies: - '@types/mocha': 10.0.10 - c8: 9.1.0 - chokidar: 3.6.0 - enhanced-resolve: 5.18.3 - glob: 10.4.5 - minimatch: 9.0.5 - mocha: 10.8.2 - supports-color: 9.4.0 - yargs: 17.7.2 - dev: true - - /@vscode/test-electron@2.5.2: - resolution: {integrity: sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==} - engines: {node: '>=16'} - dependencies: - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - jszip: 3.10.1 - ora: 8.2.0 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@vscode/test-web@0.0.71: - resolution: {integrity: sha512-uj9a3A3QD1qBOw1ZL19SKNSG6c6rvP9N4XrMvBVKSeAOkmOQftAZoBERLMJPEaJ8Z5dF7aLmA79drjOBk+VTRg==} - engines: {node: '>=16'} - hasBin: true - dependencies: - '@koa/cors': 5.0.0 - '@koa/router': 13.1.1 - '@playwright/browser-chromium': 1.56.0 - gunzip-maybe: 1.4.2 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - koa: 3.0.1 - koa-morgan: 1.0.1 - koa-mount: 4.2.0 - koa-static: 5.0.0 - minimist: 1.2.8 - playwright: 1.56.0 - tar-fs: 3.1.1 - tinyglobby: 0.2.14 - vscode-uri: 3.1.0 - transitivePeerDependencies: - - bare-buffer - - react-native-b4a - - supports-color - dev: true - - /@vscode/zeromq@0.2.7: - resolution: {integrity: sha512-lbnfCMoVe6O7aHL0TkQJSU+yd5Hs1A6mpr/zG/C+ibFXlhGq7rUEIHt4krf6P9gn0rgoAYJceJkvLHnvDWk5/A==} - dev: true - - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - - /acorn-jsx@5.3.2(acorn@8.15.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.15.0 - dev: true - - /acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - dev: true - - /agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - dev: false - - /ansi-colors@1.1.0: - resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-wrap: 0.1.0 - dev: true - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - dev: true - - /ansi-to-html@0.6.15: - resolution: {integrity: sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==} - engines: {node: '>=8.0.0'} - hasBin: true - dependencies: - entities: 2.2.0 - dev: false - - /ansi-wrap@0.1.0: - resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} - engines: {node: '>=0.10.0'} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} - dependencies: - default-require-extensions: 3.0.1 - dev: true - - /applicationinsights@2.5.0: - resolution: {integrity: sha512-6kIFmpANRok+6FhCOmO7ZZ/mh7fdNKn17BaT13cg/RV5roLPJlA6q8srWexayHd3MPcwMb9072e8Zp0P47s/pw==} - engines: {node: '>=8.0.0'} - peerDependencies: - applicationinsights-native-metrics: '*' - peerDependenciesMeta: - applicationinsights-native-metrics: - optional: true - dependencies: - '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.22.1 - '@microsoft/applicationinsights-web-snippet': 1.2.2 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - cls-hooked: 4.2.2 - continuation-local-storage: 3.2.1 - diagnostic-channel: 1.1.0 - diagnostic-channel-publishers: 1.0.5(diagnostic-channel@1.1.0) - transitivePeerDependencies: - - supports-color - dev: false - - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: true - - /are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /argv@0.0.2: - resolution: {integrity: sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==} - engines: {node: '>=0.6.10'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true - - /aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - dev: true - - /arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - dev: true - - /arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - dev: true - - /array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - /array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - dev: true - - /array-each@1.0.1: - resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} - engines: {node: '>=0.10.0'} - dev: true - - /array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - dev: true - - /array-slice@1.1.0: - resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} - engines: {node: '>=0.10.0'} - dev: true - - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - dependencies: - array-uniq: 1.0.3 - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: true - - /array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - dev: true - - /array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - dev: true - - /array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - dev: true - - /array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 - dev: true - - /array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - dev: true - - /arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - dev: true - - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: true - - /asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} - dependencies: - bn.js: 4.12.2 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - - /assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - dependencies: - call-bind: 1.0.8 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.7 - util: 0.12.5 - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - dev: true - - /ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - dev: true - - /async-done@2.0.0: - resolution: {integrity: sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==} - engines: {node: '>= 10.13.0'} - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - stream-exhaust: 1.0.2 - dev: true - - /async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - dev: true - - /async-hook-jl@1.7.6: - resolution: {integrity: sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==} - engines: {node: ^4.7 || >=6.9 || >=7.3} - dependencies: - stack-chain: 1.3.7 - dev: false - - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - dev: false - - /async-listener@0.6.10: - resolution: {integrity: sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==} - engines: {node: <=0.11.8 || >0.11.10} - dependencies: - semver: 5.7.2 - shimmer: 1.2.1 - dev: false - - /async-settle@2.0.0: - resolution: {integrity: sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==} - engines: {node: '>= 10.13.0'} - dependencies: - async-done: 2.0.0 - dev: true - - /async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.1.0 - - /axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} - engines: {node: '>=4'} - dev: true - - /axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - dev: true - - /b4a@1.7.3: - resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - dev: true - - /babel-plugin-styled-components@2.1.4(@babel/core@7.28.4)(styled-components@5.3.11)(supports-color@5.5.0): - resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} - peerDependencies: - styled-components: '>= 2' - dependencies: - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - lodash: 4.17.21 - picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.28.4)(react-dom@16.14.0)(react-is@19.2.0)(react@16.14.0) - transitivePeerDependencies: - - '@babel/core' - - supports-color - dev: false - - /bach@2.0.1: - resolution: {integrity: sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==} - engines: {node: '>=10.13.0'} - dependencies: - async-done: 2.0.0 - async-settle: 2.0.0 - now-and-later: 3.0.0 - dev: true - - /backbone@1.4.0: - resolution: {integrity: sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==} - dependencies: - underscore: 1.13.7 - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /bare-events@2.7.0: - resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} - dev: true - - /bare-fs@4.4.5: - resolution: {integrity: sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==} - engines: {bare: '>=1.16.0'} - requiresBuild: true - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - dependencies: - bare-events: 2.7.0 - bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.7.0) - bare-url: 2.2.2 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - react-native-b4a - dev: true - optional: true - - /bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} - engines: {bare: '>=1.14.0'} - requiresBuild: true - dev: true - optional: true - - /bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - requiresBuild: true - dependencies: - bare-os: 3.6.2 - dev: true - optional: true - - /bare-stream@2.7.0(bare-events@2.7.0): - resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} - requiresBuild: true - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - dependencies: - bare-events: 2.7.0 - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - optional: true - - /bare-url@2.2.2: - resolution: {integrity: sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==} - requiresBuild: true - dependencies: - bare-path: 3.0.0 - dev: true - optional: true - - /base64-js@0.0.8: - resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} - engines: {node: '>= 0.4'} - dev: false - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /baseline-browser-mapping@2.8.12: - resolution: {integrity: sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==} - hasBin: true - - /basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - dev: true - - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - dev: true - - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - - /bn.js@4.12.2: - resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - dev: true - - /bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - dev: true - - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /bootstrap-less@3.3.8: - resolution: {integrity: sha512-OooZ0uabOUyktvjgXpoJaGZfyZ0tQ2zij449tIZ2gQ6+TEDrnRxVlOXq+O8NwCRwI9/RA39VQfcelWQ8qPMhUw==} - dev: false - - /bootstrap@5.3.8(@popperjs/core@2.11.8): - resolution: {integrity: sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==} - peerDependencies: - '@popperjs/core': ^2.11.8 - dependencies: - '@popperjs/core': 2.11.8 - dev: false - - /brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.1.1 - dev: true - - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: true - - /brotli@1.3.3: - resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} - dependencies: - base64-js: 1.5.1 - dev: false - - /browser-resolve@2.0.0: - resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} - dependencies: - resolve: 1.22.10 - dev: true - - /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - dev: true - - /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.7 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - dev: true - - /browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - dependencies: - cipher-base: 1.0.7 - des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /browserify-rsa@4.1.1: - resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} - engines: {node: '>= 0.10'} - dependencies: - bn.js: 5.2.2 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: true - - /browserify-sign@4.2.5: - resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==} - engines: {node: '>= 0.10'} - dependencies: - bn.js: 5.2.2 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.6.1 - inherits: 2.0.4 - parse-asn1: 5.1.9 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - dev: true - - /browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - dependencies: - pako: 0.2.9 - dev: true - - /browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - dependencies: - pako: 1.0.11 - dev: true - - /browserslist@4.26.3: - resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - baseline-browser-mapping: 2.8.12 - caniuse-lite: 1.0.30001748 - electron-to-chromium: 1.5.232 - node-releases: 2.0.23 - update-browserslist-db: 1.1.3(browserslist@4.26.3) - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.4 - - /builtin-modules@1.1.1: - resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} - engines: {node: '>=0.10.0'} - dev: true - - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true - - /builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - dev: true - - /c8@9.1.0: - resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} - engines: {node: '>=14.14.0'} - hasBin: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 3.3.1 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 - test-exclude: 6.0.0 - v8-to-istanbul: 9.3.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - dev: true - - /caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} - dependencies: - hasha: 5.2.2 - make-dir: 3.1.0 - package-hash: 4.0.0 - write-file-atomic: 3.0.3 - dev: true - - /call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - /call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - /call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false - - /caniuse-lite@1.0.30001748: - resolution: {integrity: sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==} - - /chai-arrays@2.2.0: - resolution: {integrity: sha512-4awrdGI2EH8owJ9I58PXwG4N56/FiM8bsn4CVSNEgr4GKAM6Kq5JPVApUbhUBjDakbZNuRvV7quRSC38PWq/tg==} - engines: {node: '>=0.10'} - dev: true - - /chai-as-promised@7.1.2(chai@4.5.0): - resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} - peerDependencies: - chai: '>= 2.1.2 < 6' - dependencies: - chai: 4.5.0 - check-error: 1.0.3 - dev: true - - /chai-exclude@2.1.1(chai@4.5.0): - resolution: {integrity: sha512-IHgNmgAFOkyRPnmOtZio9UsOHQ6RnzVr2LOs+5V9urYYqjhV/ERLQapC0Eq2DmID5eDWyngAcBxNUm0ZK0QbrQ==} - peerDependencies: - chai: '>= 4.0.0 < 5' - dependencies: - chai: 4.5.0 - fclone: 1.0.11 - dev: true - - /chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - dev: true - - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - dependencies: - readdirp: 4.1.2 - dev: true - - /cipher-base@1.0.7: - resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} - engines: {node: '>= 0.10'} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 - dev: true - - /circular-json@0.3.3: - resolution: {integrity: sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==} - deprecated: CircularJSON is in maintenance only, flatted is its successor. - dev: true - - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - dependencies: - restore-cursor: 5.1.0 - dev: true - - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true - - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - - /cls-hooked@4.2.2: - resolution: {integrity: sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==} - engines: {node: ^4.7 || >=6.9 || >=7.3 || >=8.2.1} - dependencies: - async-hook-jl: 1.7.6 - emitter-listener: 1.1.2 - semver: 5.7.2 - dev: false - - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false - - /cmake-ts@1.0.2: - resolution: {integrity: sha512-5l++JHE7MxFuyV/OwJf3ek7ZZN1aGPFPM5oUz6AnK5inQAPe4TFXRMz5sA2qg2FRgByPWdqO+gSfIPo8GzoKNQ==} - hasBin: true - dev: false - - /codecov@3.8.3(encoding@0.1.13): - resolution: {integrity: sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==} - engines: {node: '>=4.0'} - deprecated: https://about.codecov.io/blog/codecov-uploader-deprecation-plan/ - hasBin: true - dependencies: - argv: 0.0.2 - ignore-walk: 3.0.4 - js-yaml: 3.14.1 - teeny-request: 7.1.1(encoding@0.1.13) - urlgrey: 1.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: true - - /comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - dev: true - - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - - /compute-gcd@1.2.1: - resolution: {integrity: sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==} - dependencies: - validate.io-array: 1.0.6 - validate.io-function: 1.0.2 - validate.io-integer-array: 1.0.0 - dev: false - - /compute-lcm@1.1.2: - resolution: {integrity: sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==} - dependencies: - compute-gcd: 1.2.1 - validate.io-array: 1.0.6 - validate.io-function: 1.0.2 - validate.io-integer-array: 1.0.0 - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.2 - shell-quote: 1.8.3 - spawn-command: 0.0.2 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - dev: true - - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: true - - /console-browserify@1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - dev: true - - /constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - dev: true - - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true - - /continuation-local-storage@3.2.1: - resolution: {integrity: sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==} - dependencies: - async-listener: 0.6.10 - emitter-listener: 1.1.2 - dev: false - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - /cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - keygrip: 1.1.0 - dev: true - - /copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - dependencies: - is-what: 3.14.1 - dev: true - - /copy-props@4.0.0: - resolution: {integrity: sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==} - engines: {node: '>= 10.13.0'} - dependencies: - each-props: 3.0.0 - is-plain-object: 5.0.0 - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - - /create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - dependencies: - bn.js: 4.12.2 - elliptic: 6.6.1 - dev: true - - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - dependencies: - cipher-base: 1.0.7 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.3 - sha.js: 2.4.12 - dev: true - - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - dependencies: - cipher-base: 1.0.7 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.3 - safe-buffer: 5.2.1 - sha.js: 2.4.12 - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - dependencies: - cross-spawn: 7.0.6 - dev: true - - /cross-fetch@3.2.0(encoding@0.1.13): - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - dev: false - - /cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - dev: true - - /crypto-browserify@3.12.1: - resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} - engines: {node: '>= 0.10'} - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.5 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - hash-base: 3.0.5 - inherits: 2.0.4 - pbkdf2: 3.1.5 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - dev: true - - /crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - dev: false - - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: false - - /css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - dev: true - - /css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - dev: false - - /css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - dev: true - - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - /d3-color@1.4.1: - resolution: {integrity: sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==} - dev: false - - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false - - /d3-ease@1.0.7: - resolution: {integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==} - dev: false - - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false - - /d3-interpolate@1.4.0: - resolution: {integrity: sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==} - dependencies: - d3-color: 1.4.1 - dev: false - - /d3-timer@1.0.10: - resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} - dev: false - - /d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 - dev: true - - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true - - /data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - dev: true - - /data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - dev: true - - /data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - dev: true - - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.28.4 - dev: true - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: false - - /debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - - /debug@4.4.3(supports-color@5.5.0): - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 5.5.0 - dev: false - - /debug@4.4.3(supports-color@8.1.1): - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 8.1.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - dev: true - - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true - - /deep-diff@0.3.8: - resolution: {integrity: sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==} - dev: false - - /deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.1.0 - dev: true - - /deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - dev: true - - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - es-get-iterator: 1.1.3 - get-intrinsic: 1.3.0 - is-arguments: 1.2.0 - is-array-buffer: 3.0.5 - is-date-object: 1.1.0 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.4 - side-channel: 1.1.0 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - dev: false - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - /default-require-extensions@3.0.1: - resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} - engines: {node: '>=8'} - dependencies: - strip-bom: 4.0.0 - dev: true - - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - /del@3.0.0: - resolution: {integrity: sha512-7yjqSoVSlJzA4t/VUwazuEagGeANEKB3f/aNI//06pfKgwoCb7f6Q1gETN1sZzYaj6chTQ0AhIwDiPdfOjko4A==} - engines: {node: '>=4'} - dependencies: - globby: 6.1.0 - is-path-cwd: 1.0.0 - is-path-in-cwd: 1.0.1 - p-map: 1.2.0 - pify: 3.0.0 - rimraf: 2.7.1 - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - dev: true - - /des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - - /detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - dev: true - - /dfa@1.2.0: - resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} - dev: false - - /diagnostic-channel-publishers@1.0.5(diagnostic-channel@1.1.0): - resolution: {integrity: sha512-dJwUS0915pkjjimPJVDnS/QQHsH0aOYhnZsLJdnZIMOrB+csj8RnZhWTuwnm8R5v3Z7OZs+ksv5luC14DGB7eg==} - peerDependencies: - diagnostic-channel: '*' - dependencies: - diagnostic-channel: 1.1.0 - dev: false - - /diagnostic-channel@1.1.0: - resolution: {integrity: sha512-fwujyMe1gj6rk6dYi9hMZm0c8Mz8NDMVl2LB4iaYh3+LIAThZC8RKFGXWG0IML2OxAit/ZFRgZhMkhQ3d/bobQ==} - dependencies: - semver: 5.7.2 - dev: false - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} - engines: {node: '>=0.3.1'} - dev: true - - /diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - dependencies: - bn.js: 4.12.2 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - dependencies: - '@babel/runtime': 7.28.4 - csstype: 3.1.3 - dev: false - - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: true - - /domain-browser@4.22.0: - resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} - engines: {node: '>=10'} - dev: true - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: true - - /dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - dependencies: - end-of-stream: 1.4.5 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - dev: true - - /each-props@3.0.0: - resolution: {integrity: sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==} - engines: {node: '>= 10.13.0'} - dependencies: - is-plain-object: 5.0.0 - object.defaults: 1.1.0 - dev: true - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true - - /electron-to-chromium@1.5.232: - resolution: {integrity: sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==} - - /elliptic@6.6.1: - resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} - dependencies: - bn.js: 4.12.2 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - - /emitter-listener@1.1.2: - resolution: {integrity: sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==} - dependencies: - shimmer: 1.2.1 - dev: false - - /emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - dev: true - - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - dependencies: - iconv-lite: 0.6.3 - - /end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - dependencies: - once: 1.4.0 - dev: true - - /enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - dev: true - - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: false - - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - requiresBuild: true - dependencies: - prr: 1.0.1 - dev: true - optional: true - - /es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - dev: true - - /es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - is-arguments: 1.2.0 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.1.1 - isarray: 2.0.5 - stop-iteration-iterator: 1.1.0 - dev: false - - /es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - dev: true - - /es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - - /es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - dev: true - - /es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - dependencies: - hasown: 2.0.2 - dev: true - - /es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - dev: true - - /es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - dev: true - - /es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - dev: true - - /es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - dev: true - - /es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - dependencies: - d: 1.0.2 - ext: 1.7.0 - dev: true - - /esbuild-plugin-import-glob@0.1.1: - resolution: {integrity: sha512-yAFH+9AoIcsQkODSx0KUPRv1FeJUN6Tef8vkPQMcuVkc2vXYneYKsHhOiFS/yIsg5bQ70HHtAlXVA1uTjgoJXg==} - dependencies: - fast-glob: 3.3.3 - dev: true - - /esbuild-plugin-less@1.3.27(esbuild@0.25.10): - resolution: {integrity: sha512-GRD29/F9jmXkEoUBzbXXEgK6MVvKCBQJFO+lBH/HOiHlP+UMsx0ePx/4qeHfpJNYZtGKMZa8/WEodj3xUIoPvg==} - peerDependencies: - esbuild: '>=0.14.0 <0.25.11' - dependencies: - '@types/less': 3.0.8 - esbuild: 0.25.10 - less: 4.4.2 - dev: true - - /esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} - engines: {node: '>=18'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 - dev: true - - /escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.32.0)(eslint@8.57.1): - resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 - dependencies: - confusing-browser-globals: 1.0.11 - eslint: 8.57.1 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1) - object.assign: 4.1.7 - object.entries: 1.1.9 - semver: 6.3.1 - dev: true - - /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.32.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.5)(eslint@8.57.1): - resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} - engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.3 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.28.0 - eslint-plugin-react-hooks: ^4.3.0 - dependencies: - eslint: 8.57.1 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) - object.assign: 4.1.7 - object.entries: 1.1.9 - dev: true - - /eslint-config-prettier@9.1.2(eslint@8.57.1): - resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.57.1 - dev: true - - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - debug: 3.2.7 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-header@3.1.1(eslint@8.57.1): - resolution: {integrity: sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==} - peerDependencies: - eslint: '>=7.7.0' - dependencies: - eslint: 8.57.1 - dev: true - - /eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1): - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@rtsao/scc': 1.1.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-jsdoc@46.10.1(eslint@8.57.1): - resolution: {integrity: sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==} - engines: {node: '>=16'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - dependencies: - '@es-joy/jsdoccomment': 0.41.0 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint: 8.57.1 - esquery: 1.6.0 - is-builtin-module: 3.2.1 - semver: 7.7.2 - spdx-expression-parse: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.10.3 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - dev: true - - /eslint-plugin-no-null@1.0.2(eslint@8.57.1): - resolution: {integrity: sha512-uRDiz88zCO/2rzGfgG15DBjNsgwWtWiSo4Ezy7zzajUgpnFIqd1TjepKeRmJZHEfBGu58o2a8S0D7vglvvhkVA==} - engines: {node: '>=5.0.0'} - peerDependencies: - eslint: '>=3.0.0' - dependencies: - eslint: 8.57.1 - dev: true - - /eslint-plugin-no-only-tests@3.3.0: - resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} - engines: {node: '>=5.0.0'} - dev: true - - /eslint-plugin-prefer-arrow@1.2.3(eslint@8.57.1): - resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} - peerDependencies: - eslint: '>=2.0.0' - dependencies: - eslint: 8.57.1 - dev: true - - /eslint-plugin-prettier@5.5.4(eslint-config-prettier@9.1.2)(eslint@8.57.1)(prettier@3.6.2): - resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.57.1 - eslint-config-prettier: 9.1.2(eslint@8.57.1) - prettier: 3.6.2 - prettier-linter-helpers: 1.0.0 - synckit: 0.11.11 - dev: true - - /eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.57.1 - dev: true - - /eslint-plugin-react@7.37.5(eslint@8.57.1): - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - dev: true - - /events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - dependencies: - bare-events: 2.7.0 - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - dev: true - - /expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - dependencies: - homedir-polyfill: 1.0.3 - dev: true - - /ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - dependencies: - type: 2.7.3 - dev: true - - /extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - - /fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true - - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: true - - /fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fast-levenshtein@3.0.0: - resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} - dependencies: - fastest-levenshtein: 1.0.16 - dev: true - - /fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - dev: false - - /fast-url-parser@1.1.3: - resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} - dependencies: - punycode: 1.4.1 - dev: true - - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - dev: true - - /fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - dependencies: - reusify: 1.1.0 - dev: true - - /fclone@1.0.11: - resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} - dev: true - - /fdir@6.5.0(picomatch@4.0.3): - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - dependencies: - picomatch: 4.0.3 - dev: true - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true - - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /findup-sync@5.0.0: - resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} - engines: {node: '>= 10.13.0'} - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.8 - resolve-dir: 1.0.1 - dev: true - - /fined@2.0.0: - resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} - engines: {node: '>= 10.13.0'} - dependencies: - expand-tilde: 2.0.2 - is-plain-object: 5.0.0 - object.defaults: 1.1.0 - object.pick: 1.3.0 - parse-filepath: 1.0.2 - dev: true - - /flagged-respawn@2.0.0: - resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} - engines: {node: '>= 10.13.0'} - dev: true - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - - /flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - dev: true - - /fontkit@1.9.0: - resolution: {integrity: sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==} - dependencies: - '@swc/helpers': 0.3.17 - brotli: 1.3.3 - clone: 2.1.2 - deep-equal: 2.2.3 - dfa: 1.2.0 - restructure: 2.0.1 - tiny-inflate: 1.0.3 - unicode-properties: 1.4.1 - unicode-trie: 2.0.0 - dev: false - - /for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - - /for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - dev: true - - /for-own@1.0.0: - resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - dev: true - - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - dependencies: - cross-spawn: 7.0.6 - signal-exit: 3.0.7 - dev: true - - /foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - dev: true - - /form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - dev: true - - /format-util@1.0.5: - resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} - dev: false - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - - /fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - dev: true - - /fs-extra@4.0.3: - resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: false - - /fs-mkdirp-stream@2.0.1: - resolution: {integrity: sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /fs-walk@0.0.1: - resolution: {integrity: sha512-uMI5ZDLEw/B1/iRNASM0BTpeQQjp/fSMm7cI3ky7JDglBNwG0rEaEAjgB6ZsKK1y3ui8WVXVsgiIH9IkjcHkwg==} - dependencies: - async: 3.2.6 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - /function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - /generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-east-asian-width@1.4.0: - resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} - engines: {node: '>=18'} - dev: true - - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - - /get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} - dev: true - - /get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - /get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - dev: true - - /get-tsconfig@4.11.0: - resolution: {integrity: sha512-sNsqf7XKQ38IawiVGPOoAlqZo1DMrO7TU+ZcZwi7yLl7/7S0JwmoBMKz/IkUPhSoXM0Ng3vT0yB1iCe5XavDeQ==} - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-stream@8.0.3: - resolution: {integrity: sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A==} - engines: {node: '>=10.13.0'} - dependencies: - '@gulpjs/to-absolute-glob': 4.0.0 - anymatch: 3.1.3 - fastq: 1.19.1 - glob-parent: 6.0.2 - is-glob: 4.0.3 - is-negated-glob: 1.0.0 - normalize-path: 3.0.0 - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /glob-watcher@6.0.0: - resolution: {integrity: sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==} - engines: {node: '>= 10.13.0'} - dependencies: - async-done: 2.0.0 - chokidar: 3.6.0 - dev: true - - /glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - dev: true - - /global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - dev: true - - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} - dependencies: - array-union: 1.0.2 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: true - - /glogg@2.2.0: - resolution: {integrity: sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==} - engines: {node: '>= 10.13.0'} - dependencies: - sparkles: 2.1.0 - dev: true - - /gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /gulp-cli@3.1.0: - resolution: {integrity: sha512-zZzwlmEsTfXcxRKiCHsdyjZZnFvXWM4v1NqBJSYbuApkvVKivjcmOS2qruAJ+PkEHLFavcDKH40DPc1+t12a9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dependencies: - '@gulpjs/messages': 1.1.0 - chalk: 4.1.2 - copy-props: 4.0.0 - gulplog: 2.2.0 - interpret: 3.1.1 - liftoff: 5.0.1 - mute-stdout: 2.0.0 - replace-homedir: 2.0.0 - semver-greatest-satisfied-range: 2.0.0 - string-width: 4.2.3 - v8flags: 4.0.1 - yargs: 16.2.0 - dev: true - - /gulp-filter@7.0.0(gulp@5.0.1): - resolution: {integrity: sha512-ZGWtJo0j1mHfP77tVuhyqem4MRA5NfNRjoVe6VAkLGeQQ/QGo2VsFwp7zfPTGDsd1rwzBmoDHhxpE6f5B3Zuaw==} - engines: {node: '>=12'} - peerDependencies: - gulp: '>=4' - peerDependenciesMeta: - gulp: - optional: true - dependencies: - gulp: 5.0.1 - multimatch: 5.0.0 - plugin-error: 1.0.1 - streamfilter: 3.0.0 - to-absolute-glob: 2.0.2 - dev: true - - /gulp-rename@2.1.0: - resolution: {integrity: sha512-dGuzuH8jQGqCMqC544IEPhs5+O2l+IkdoSZsgd4kY97M1CxQeI3qrmweQBIrxLBbjbe/8uEWK8HHcNBc3OCy4g==} - engines: {node: '>=4'} - dev: true - - /gulp@5.0.1: - resolution: {integrity: sha512-PErok3DZSA5WGMd6XXV3IRNO0mlB+wW3OzhFJLEec1jSERg2j1bxJ6e5Fh6N6fn3FH2T9AP4UYNb/pYlADB9sA==} - engines: {node: '>=10.13.0'} - hasBin: true - dependencies: - glob-watcher: 6.0.0 - gulp-cli: 3.1.0 - undertaker: 2.0.0 - vinyl-fs: 4.0.2 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /gulplog@2.2.0: - resolution: {integrity: sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==} - engines: {node: '>= 10.13.0'} - dependencies: - glogg: 2.2.0 - dev: true - - /gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - dev: true - - /has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.1 - - /has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - dependencies: - dunder-proto: 1.0.1 - dev: true - - /has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.1.0 - - /hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /hash-base@3.1.2: - resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} - engines: {node: '>= 0.8'} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 - dev: true - - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - - /hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} - dependencies: - is-stream: 2.0.1 - type-fest: 0.8.1 - dev: true - - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true - - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - - /homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - dependencies: - parse-passwd: 1.0.0 - dev: true - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} - dependencies: - deep-equal: 1.0.1 - http-errors: 1.8.1 - dev: true - - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - dev: true - - /http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} - dependencies: - depd: 1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 1.5.0 - toidentifier: 1.0.1 - dev: true - - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - - /http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - /https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - dev: true - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - dev: true - - /https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore-walk@3.0.4: - resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} - dependencies: - minimatch: 3.1.2 - dev: true - - /ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - dev: true - - /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: true - - /immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - dev: false - - /import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - - /interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} - dev: true - - /inversify@6.2.2(reflect-metadata@0.1.14): - resolution: {integrity: sha512-KB836KHbZ9WrUnB8ax5MtadOwnqQYa+ZJO3KWbPFgcr4RIEnHM621VaqFZzOZd9+U7ln6upt9n0wJei7x2BNqw==} - peerDependencies: - reflect-metadata: ~0.2.2 - dependencies: - '@inversifyjs/common': 1.4.0 - '@inversifyjs/core': 1.3.5(reflect-metadata@0.1.14) - reflect-metadata: 0.1.14 - dev: false - - /ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - dev: false - - /is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - dev: true - - /is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - /is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - /is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - dev: true - - /is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - dependencies: - has-bigints: 1.1.0 - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.3.0 - dev: true - - /is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: true - - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - /is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - dependencies: - hasown: 2.0.2 - dev: true - - /is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - dev: true - - /is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - /is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - dev: true - - /is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - dependencies: - is-plain-object: 2.0.4 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: true - - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - /is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - dev: true - - /is-negated-glob@1.0.0: - resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} - engines: {node: '>=0.10.0'} - dev: true - - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-path-cwd@1.0.0: - resolution: {integrity: sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==} - engines: {node: '>=0.10.0'} - dev: true - - /is-path-in-cwd@1.0.1: - resolution: {integrity: sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-path-inside: 1.0.1 - dev: true - - /is-path-inside@1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} - dependencies: - path-is-inside: 1.0.2 - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true - - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true - - /is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - /is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} - dependencies: - is-unc-path: 1.0.0 - dev: true - - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - /is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - /is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - /is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.19 - dev: true - - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - - /is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} - dependencies: - unc-path-regex: 0.1.2 - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true - - /is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - dev: true - - /is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - dev: false - - /is-valid-glob@1.0.0: - resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} - engines: {node: '>=0.10.0'} - dev: true - - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - /is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - dev: true - - /is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - /is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true - - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - - /is2@2.0.9: - resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} - engines: {node: '>=v0.10.0'} - dependencies: - deep-is: 0.1.4 - ip-regex: 4.3.0 - is-url: 1.2.4 - dev: false - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - dependencies: - isarray: 1.0.0 - dev: true - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /isomorphic-timers-promises@1.0.1: - resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} - engines: {node: '>=10'} - dev: true - - /isomorphic-ws@4.0.1(ws@6.2.3): - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - dependencies: - ws: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - dev: false - - /isomorphic.js@0.2.5: - resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - dev: false - - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} - dependencies: - append-transform: 2.0.0 - dev: true - - /istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.28.4 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} - dependencies: - archy: 1.0.0 - cross-spawn: 7.0.6 - istanbul-lib-coverage: 3.2.2 - p-map: 3.0.0 - rimraf: 3.0.2 - uuid: 8.3.2 - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - - /iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - dev: true - - /jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - - /jquery-ui@1.14.1: - resolution: {integrity: sha512-DhzsYH8VeIvOaxwi+B/2BCsFFT5EGjShdzOcm5DssWjtcpGWIMsn66rJciDA6jBruzNiLf1q0KvwMoX1uGNvnQ==} - dependencies: - jquery: 3.7.1 - dev: false - - /jquery@3.7.1: - resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} - dev: false - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} - engines: {node: '>=12.0.0'} - dev: true - - /jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-compare@0.2.2: - resolution: {integrity: sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==} - dependencies: - lodash: 4.17.21 - dev: false - - /json-schema-merge-allof@0.8.1: - resolution: {integrity: sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==} - engines: {node: '>=12.0.0'} - dependencies: - compute-lcm: 1.1.2 - json-schema-compare: 0.2.2 - lodash: 4.17.21 - dev: false - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - - /json2csv@5.0.7: - resolution: {integrity: sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==} - engines: {node: '>= 10', npm: '>= 6.13.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - hasBin: true - dependencies: - commander: 6.2.1 - jsonparse: 1.3.1 - lodash.get: 4.4.2 - dev: true - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - /jsonc-parser@2.3.1: - resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} - dev: false - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: false - - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true - - /jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - dev: false - - /jsonschema@1.5.0: - resolution: {integrity: sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==} - dev: true - - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - dev: true - - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: true - - /just-extend@6.2.0: - resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} - dev: true - - /keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} - dependencies: - tsscmp: 1.0.6 - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - - /koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - dev: true - - /koa-morgan@1.0.1: - resolution: {integrity: sha512-JOUdCNlc21G50afBXfErUrr1RKymbgzlrO5KURY+wmDG1Uvd2jmxUJcHgylb/mYXy2SjiNZyYim/ptUBGsIi3A==} - dependencies: - morgan: 1.10.1 - transitivePeerDependencies: - - supports-color - dev: true - - /koa-mount@4.2.0: - resolution: {integrity: sha512-2iHQc7vbA9qLeVq5gKAYh3m5DOMMlMfIKjW/REPAS18Mf63daCJHHVXY9nbu7ivrnYn5PiPC4CE523Tf5qvjeQ==} - engines: {node: '>= 7.6.0'} - dependencies: - debug: 4.4.3 - koa-compose: 4.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} - dependencies: - debug: 4.4.3 - http-errors: 1.8.1 - resolve-path: 1.4.0 - transitivePeerDependencies: - - supports-color - dev: true - - /koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} - dependencies: - debug: 3.2.7 - koa-send: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /koa@3.0.1: - resolution: {integrity: sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==} - engines: {node: '>= 18'} - dependencies: - accepts: 1.3.8 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookies: 0.9.1 - delegates: 1.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - fresh: 0.5.2 - http-assert: 1.5.0 - http-errors: 2.0.0 - koa-compose: 4.1.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - dev: true - - /language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - dev: true - - /language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - dependencies: - language-subtag-registry: 0.3.23 - dev: true - - /last-run@2.0.0: - resolution: {integrity: sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==} - engines: {node: '>= 10.13.0'} - dev: true - - /lead@4.0.0: - resolution: {integrity: sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==} - engines: {node: '>=10.13.0'} - dev: true - - /less-plugin-inline-urls@1.2.0: - resolution: {integrity: sha512-QS9MLcg8Lo6ZHVS+9kncmHeLypIdnFgG/neqV3RPkXfiiSCJHn/jTQHKnXfDEL/F/JM+z6MQ6ukWr/xsOChHTA==} - engines: {node: '>=0.4.2'} - dev: true - - /less@4.4.2: - resolution: {integrity: sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==} - engines: {node: '>=14'} - hasBin: true - dependencies: - copy-anything: 2.0.6 - parse-node-version: 1.0.1 - tslib: 2.8.1 - optionalDependencies: - errno: 0.1.8 - graceful-fs: 4.2.11 - image-size: 0.5.5 - make-dir: 2.1.0 - mime: 1.6.0 - needle: 3.3.1 - source-map: 0.6.1 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lib0@0.2.114: - resolution: {integrity: sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==} - engines: {node: '>=16'} - hasBin: true - dependencies: - isomorphic.js: 0.2.5 - dev: false - - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - dependencies: - immediate: 3.0.6 - dev: true - - /liftoff@5.0.1: - resolution: {integrity: sha512-wwLXMbuxSF8gMvubFcFRp56lkFV69twvbU5vDPbaw+Q+/rF8j0HKjGbIdlSi+LuJm9jf7k9PB+nTxnsLMPcv2Q==} - engines: {node: '>=10.13.0'} - dependencies: - extend: 3.0.2 - findup-sync: 5.0.0 - fined: 2.0.0 - flagged-respawn: 2.0.0 - is-plain-object: 5.0.0 - rechoir: 0.8.0 - resolve: 1.22.10 - dev: true - - /linebreak@1.1.0: - resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} - dependencies: - base64-js: 0.0.8 - unicode-trie: 2.0.0 - dev: false - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false - - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false - - /lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - dev: true - - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - dependencies: - chalk: 5.6.2 - is-unicode-supported: 1.3.0 - dev: true - - /lolex@6.0.0: - resolution: {integrity: sha512-ad9IBHbfVJ3bPAotDxnCgJgKcNK5/mrRAfbJzXhY5+PEmuBWP7wyHQlA6L8TfSfPlqlDjY4K7IG6mbzsrIBx1A==} - deprecated: lolex has been renamed to @sinonjs/fake-timers. No API changes made. Please use the new package instead - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - - /lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - dev: true - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: true - optional: true - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: true - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.7.2 - dev: true - - /map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - dev: true - - /marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} - hasBin: true - dev: false - - /math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - dependencies: - hash-base: 3.0.5 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /md5@2.3.0: - resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - dev: true - - /media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - dev: true - - /miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - dependencies: - bn.js: 4.12.2 - brorand: 1.1.0 - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.54.0 - dev: true - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - dev: true - - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true - - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: true - - /minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} - dependencies: - '@isaacs/brace-expansion': 5.0.0 - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.12 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.2 - dev: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.2 - dev: true - - /minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.2 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - /minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - dev: true - - /mocha-junit-reporter@2.2.1(mocha@11.7.4): - resolution: {integrity: sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==} - peerDependencies: - mocha: '>=2.2.5' - dependencies: - debug: 4.4.3 - md5: 2.3.0 - mkdirp: 3.0.1 - mocha: 11.7.4 - strip-ansi: 6.0.1 - xml: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /mocha-multi-reporters@1.5.1(mocha@11.7.4): - resolution: {integrity: sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg==} - engines: {node: '>=6.0.0'} - peerDependencies: - mocha: '>=3.1.2' - dependencies: - debug: 4.4.3 - lodash: 4.17.21 - mocha: 11.7.4 - transitivePeerDependencies: - - supports-color - dev: true - - /mocha@10.8.2: - resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} - engines: {node: '>= 14.0.0'} - hasBin: true - dependencies: - ansi-colors: 4.1.3 - browser-stdout: 1.3.1 - chokidar: 3.6.0 - debug: 4.4.3(supports-color@8.1.1) - diff: 5.2.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.1.6 - ms: 2.1.3 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.5.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 - yargs-unparser: 2.0.0 - dev: true - - /mocha@11.7.4: - resolution: {integrity: sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - dependencies: - browser-stdout: 1.3.1 - chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) - diff: 7.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 10.4.5 - he: 1.2.0 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 9.0.5 - ms: 2.1.3 - picocolors: 1.1.1 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 9.3.4 - yargs: 17.7.2 - yargs-parser: 21.1.1 - yargs-unparser: 2.0.0 - dev: true - - /morgan@1.10.1: - resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} - engines: {node: '>= 0.8.0'} - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - /multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: true - - /mute-stdout@2.0.0: - resolution: {integrity: sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==} - engines: {node: '>= 10.13.0'} - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} - engines: {node: '>= 4.4.x'} - hasBin: true - requiresBuild: true - dependencies: - iconv-lite: 0.6.3 - sax: 1.4.1 - dev: true - optional: true - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true - - /nise@5.1.9: - resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} - dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 11.3.1 - '@sinonjs/text-encoding': 0.7.3 - just-extend: 6.2.0 - path-to-regexp: 6.3.0 - dev: true - - /nock@13.5.6: - resolution: {integrity: sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==} - engines: {node: '>= 10.13'} - dependencies: - debug: 4.4.3 - json-stringify-safe: 5.0.1 - propagate: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /node-addon-api@8.5.0: - resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} - engines: {node: ^18 || ^20 || >= 21} - dev: false - - /node-fetch@2.7.0(encoding@0.1.13): - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - encoding: 0.1.13 - whatwg-url: 5.0.0 - - /node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - /node-has-native-dependencies@1.0.2: - resolution: {integrity: sha512-UR6FarlOodRgnOAavtHADY/tkC75+g7S4UYyZL+uu3QytJPXMmxn7N302IVawIF2af7bBjR8BCMbgO5tdGebSQ==} - hasBin: true - dependencies: - fs-walk: 0.0.1 - dev: true - - /node-html-parser@6.1.13: - resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - dependencies: - css-select: 5.2.2 - he: 1.2.0 - dev: true - - /node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} - dependencies: - process-on-spawn: 1.1.0 - dev: true - - /node-releases@2.0.23: - resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} - - /node-stdlib-browser@1.3.1: - resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} - engines: {node: '>=10'} - dependencies: - assert: 2.1.0 - browser-resolve: 2.0.0 - browserify-zlib: 0.2.0 - buffer: 5.7.1 - console-browserify: 1.2.0 - constants-browserify: 1.0.0 - create-require: 1.1.1 - crypto-browserify: 3.12.1 - domain-browser: 4.22.0 - events: 3.3.0 - https-browserify: 1.0.0 - isomorphic-timers-promises: 1.0.1 - os-browserify: 0.3.0 - path-browserify: 1.0.1 - pkg-dir: 5.0.0 - process: 0.11.10 - punycode: 1.4.1 - querystring-es3: 0.2.1 - readable-stream: 3.6.2 - stream-browserify: 3.0.0 - stream-http: 3.2.0 - string_decoder: 1.3.0 - timers-browserify: 2.0.12 - tty-browserify: 0.0.1 - url: 0.11.4 - util: 0.12.5 - vm-browserify: 1.1.2 - dev: true - - /node-stream-zip@1.15.0: - resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} - engines: {node: '>=0.12.0'} - dev: false - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /nouislider@15.4.0: - resolution: {integrity: sha512-AV7UMhGhZ4Mj6ToMT812Ib8OJ4tAXR2/Um7C4l4ZvvsqujF0WpQTpqqHJ+9xt4174R7ueQOUrBR4yakJpAIPCA==} - dev: false - - /now-and-later@3.0.0: - resolution: {integrity: sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==} - engines: {node: '>= 10.13.0'} - dependencies: - once: 1.4.0 - dev: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} - hasBin: true - dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - caching-transform: 4.0.0 - convert-source-map: 1.9.0 - decamelize: 1.2.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - foreground-child: 2.0.0 - get-package-type: 0.1.0 - glob: 7.2.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 4.0.3 - istanbul-lib-processinfo: 2.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.2.0 - make-dir: 3.1.0 - node-preload: 0.2.1 - p-map: 3.0.0 - process-on-spawn: 1.1.0 - resolve-from: 5.0.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - spawn-wrap: 2.0.0 - test-exclude: 6.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - /object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - /object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - /object.defaults@1.1.0: - resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} - engines: {node: '>=0.10.0'} - dependencies: - array-each: 1.0.1 - array-slice: 1.1.0 - for-own: 1.0.0 - isobject: 3.0.1 - dev: true - - /object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - dev: true - - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - dev: true - - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - dev: true - - /object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - dev: true - - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - - /on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - dependencies: - mimic-function: 5.0.1 - dev: true - - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: true - - /ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.1.2 - dev: true - - /os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - dev: true - - /own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map@1.2.0: - resolution: {integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==} - engines: {node: '>=4'} - dev: true - - /p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} - dependencies: - graceful-fs: 4.2.11 - hasha: 5.2.2 - lodash.flattendeep: 4.4.0 - release-zalgo: 1.0.0 - dev: true - - /package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - dev: true - - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-asn1@5.1.9: - resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} - engines: {node: '>= 0.10'} - dependencies: - asn1.js: 4.10.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - pbkdf2: 3.1.5 - safe-buffer: 5.2.1 - dev: true - - /parse-filepath@1.0.2: - resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} - engines: {node: '>=0.8'} - dependencies: - is-absolute: 1.0.0 - map-cache: 0.2.2 - path-root: 0.1.1 - dev: true - - /parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - dev: true - - /parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: true - - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-root-regex@0.1.2: - resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} - engines: {node: '>=0.10.0'} - dev: true - - /path-root@0.1.1: - resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} - engines: {node: '>=0.10.0'} - dependencies: - path-root-regex: 0.1.2 - dev: true - - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - dev: true - - /path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /pbkdf2@3.1.5: - resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} - engines: {node: '>= 0.10'} - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.3 - safe-buffer: 5.2.1 - sha.js: 2.4.12 - to-buffer: 1.2.2 - dev: true - - /pdfkit@0.13.0: - resolution: {integrity: sha512-AW79eHU5eLd2vgRDS9z3bSoi0FA+gYm+100LLosrQQMLUzOBGVOhG7ABcMFpJu7Bpg+MT74XYHi4k9EuU/9EZw==} - dependencies: - crypto-js: 4.2.0 - fontkit: 1.9.0 - linebreak: 1.1.0 - png-js: 1.0.0 - dev: false - - /peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 - dev: true - - /performance-now@0.2.0: - resolution: {integrity: sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==} - dev: false - - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: false - - /picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - dev: true - - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: false - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - requiresBuild: true - dev: true - optional: true - - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: true - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} - dependencies: - find-up: 5.0.0 - dev: true - - /playwright-core@1.56.0: - resolution: {integrity: sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==} - engines: {node: '>=18'} - hasBin: true - dev: true - - /playwright@1.56.0: - resolution: {integrity: sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==} - engines: {node: '>=18'} - hasBin: true - dependencies: - playwright-core: 1.56.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /plugin-error@1.0.1: - resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} - engines: {node: '>= 0.10'} - dependencies: - ansi-colors: 1.1.0 - arr-diff: 4.0.0 - arr-union: 3.1.0 - extend-shallow: 3.0.2 - dev: true - - /png-js@1.0.0: - resolution: {integrity: sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==} - dev: false - - /portfinder@1.0.38: - resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} - engines: {node: '>= 10.12'} - dependencies: - async: 3.2.6 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - dev: false - - /possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false - - /postinstall-build@5.0.3: - resolution: {integrity: sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg==} - deprecated: postinstall-build's behavior is now built into npm! You should migrate off of postinstall-build and use the new `prepare` lifecycle script with npm 5.0.0 or greater. - hasBin: true - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.3.0 - dev: true - - /prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /process-on-spawn@1.1.0: - resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} - engines: {node: '>=8'} - dependencies: - fromentries: 1.3.2 - dev: true - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - /propagate@2.0.1: - resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} - engines: {node: '>= 8'} - dev: true - - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - requiresBuild: true - dev: true - optional: true - - /public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - dependencies: - bn.js: 4.12.2 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - parse-asn1: 5.1.9 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: true - - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - dev: true - - /pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - dev: true - - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - dev: true - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: true - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - - /qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.1.0 - dev: true - - /querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /raf@3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - dependencies: - performance-now: 2.1.0 - dev: false - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: true - - /react-data-grid@6.1.0(react-dom@16.14.0)(react@16.14.0): - resolution: {integrity: sha512-N1UtiHvsowEPzhx0VPqQKvGgSza/YNljczbisFDGMjawiGApS2taMv7h+EDXDx49CdaA6ur4eYS0z10x63IUpw==} - peerDependencies: - react: ^16.0.0 - react-dom: ^16.0.0 - dependencies: - object-assign: 4.1.1 - react: 16.14.0 - react-dom: 16.14.0(react@16.14.0) - react-is-deprecated: 0.1.2 - shallowequal: 1.1.0 - dev: false - - /react-dom@16.14.0(react@16.14.0): - resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} - peerDependencies: - react: ^16.14.0 - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - prop-types: 15.8.1 - react: 16.14.0 - scheduler: 0.19.1 - dev: false - - /react-is-deprecated@0.1.2: - resolution: {integrity: sha512-n3Y04lqbuwMiSywwAKBwW89YxAPuFwS5tYA4L6wDGLQCdSsod1KSfzCIiTTUvS9hPdaB39HdvxjxAaS0Lk4h+A==} - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: false - - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: false - - /react-is@19.2.0: - resolution: {integrity: sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==} - dev: false - - /react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - dev: false - - /react-motion@0.5.2(react@16.14.0): - resolution: {integrity: sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==} - peerDependencies: - react: ^0.14.9 || ^15.3.0 || ^16.0.0 - dependencies: - performance-now: 0.2.0 - prop-types: 15.8.1 - raf: 3.4.1 - react: 16.14.0 - dev: false - - /react-move@2.9.1(react@16.14.0): - resolution: {integrity: sha512-5qKYsJrKKpSypEaaYyR2HBbBgX65htRqKDa8o5OGDkq2VfklmTCbLawtYFpdmcJRqbz4jCYpzo2Rrsazq9HA8Q==} - peerDependencies: - react: ^15.4.0 || ^16.0.0 - dependencies: - '@babel/runtime': 7.28.4 - d3-interpolate: 1.4.0 - d3-timer: 1.0.10 - prop-types: 15.8.1 - react: 16.14.0 - react-lifecycles-compat: 3.0.4 - dev: false - - /react-redux@7.2.9(react-dom@16.14.0)(react@16.14.0): - resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} - peerDependencies: - react: ^16.8.3 || ^17 || ^18 - react-dom: '*' - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - dependencies: - '@babel/runtime': 7.28.4 - '@types/react-redux': 7.1.34 - hoist-non-react-statics: 3.3.2 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0(react@16.14.0) - react-is: 17.0.2 - dev: false - - /react-svg-pan-zoom@3.9.0(react@16.14.0): - resolution: {integrity: sha512-GhrThWV8NnjZcJxMiVfT427ykDl9LIRk8WzR7uRq2FwlARJCq3WEafffsQRQoKvrPpR4Rcgt7fQWTjMb9TDNLw==} - peerDependencies: - react: '>=16.0.0' - dependencies: - prop-types: 15.8.1 - react: 16.14.0 - transformation-matrix: 2.16.1 - dev: false - - /react-svgmt@1.1.11(prop-types@15.8.1)(react-dom@16.14.0)(react@16.14.0): - resolution: {integrity: sha512-y85s2dy37AJ0z+Sjsnwpkt/5md9nUFh2gkcTZL68uG5ZqIIXf7Na2CrinXWm6anY5JmnMQAXsoMlozcro1H8DA==} - peerDependencies: - prop-types: ^15.6.0 - react: ^16.3.0 - react-dom: ^16.3.0 - dependencies: - d3-ease: 1.0.7 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0(react@16.14.0) - react-motion: 0.5.2(react@16.14.0) - react-move: 2.9.1(react@16.14.0) - dev: false - - /react-virtualized@9.22.6(react-dom@16.14.0)(react@16.14.0): - resolution: {integrity: sha512-U5j7KuUQt3AaMatlMJ0UJddqSiX+Km0YJxSqbAzIiGw5EmNz0khMyqP2hzgu4+QUtm+QPIrxzUX4raJxmVJnHg==} - peerDependencies: - react: ^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - dependencies: - '@babel/runtime': 7.28.4 - clsx: 1.2.1 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0(react@16.14.0) - react-lifecycles-compat: 3.0.4 - dev: false - - /react@16.14.0: - resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - prop-types: 15.8.1 - dev: false - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - dev: true - - /rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - dependencies: - resolve: 1.22.10 - dev: true - - /redux-logger@3.0.6: - resolution: {integrity: sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==} - dependencies: - deep-diff: 0.3.8 - dev: false - - /redux@4.2.1: - resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} - dependencies: - '@babel/runtime': 7.28.4 - - /redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - dev: true - - /reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} - dev: false - - /reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - dev: true - - /regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - /relative@3.0.2: - resolution: {integrity: sha512-Q5W2qeYtY9GbiR8z1yHNZ1DGhyjb4AnLEjt8iE6XfcC1QIu+FAtj3HQaO0wH28H1mX6cqNLvAqWhP402dxJGyA==} - engines: {node: '>= 0.8.0'} - dependencies: - isobject: 2.1.0 - dev: true - - /release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} - dependencies: - es6-error: 4.1.1 - dev: true - - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: true - - /replace-ext@2.0.0: - resolution: {integrity: sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==} - engines: {node: '>= 10'} - dev: true - - /replace-homedir@2.0.0: - resolution: {integrity: sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==} - engines: {node: '>= 10.13.0'} - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: false - - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve-options@2.0.0: - resolution: {integrity: sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==} - engines: {node: '>= 10.13.0'} - dependencies: - value-or-function: 4.0.0 - dev: true - - /resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} - dependencies: - http-errors: 1.6.3 - path-is-absolute: 1.0.1 - dev: true - - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true - - /resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - dev: true - - /restructure@2.0.1: - resolution: {integrity: sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg==} - dev: false - - /reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - dependencies: - glob: 10.4.5 - dev: true - - /ripemd160@2.0.3: - resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} - engines: {node: '>= 0.8'} - dependencies: - hash-base: 3.1.2 - inherits: 2.0.4 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - dependencies: - tslib: 1.14.1 - dev: false - - /rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - dependencies: - tslib: 2.8.1 - dev: true - - /safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - /safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - dev: true - - /safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /sanitize-filename@1.6.3: - resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - dependencies: - truncate-utf8-bytes: 1.0.2 - dev: false - - /sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - requiresBuild: true - dev: true - optional: true - - /scheduler@0.19.1: - resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - dev: false - - /screenshot-desktop@1.15.2: - resolution: {integrity: sha512-/uf8xhq3n/Ym7oOKT4XF1uLAYP9njABB9zMw7kkOaDVr8XOO1HBQsNJXT8lUvzD26Uj8IYkwQX46UMZG4Y/dIQ==} - dependencies: - temp: 0.9.4 - dev: true - - /semver-greatest-satisfied-range@2.0.0: - resolution: {integrity: sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==} - engines: {node: '>= 10.13.0'} - dependencies: - sver: 1.8.4 - dev: true - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - /semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - dependencies: - randombytes: 2.1.0 - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - /set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - dev: true - - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: true - - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true - - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true - - /sha.js@2.4.12: - resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} - engines: {node: '>= 0.10'} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 - dev: true - - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - dev: true - - /shimmer@1.2.1: - resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - dev: false - - /side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - /side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - /side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - /side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true - - /sinon@15.2.0: - resolution: {integrity: sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==} - deprecated: 16.1.1 - dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 10.3.0 - '@sinonjs/samsam': 8.0.3 - diff: 5.2.0 - nise: 5.1.9 - supports-color: 7.2.0 - dev: true - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slickgrid@2.4.45: - resolution: {integrity: sha512-WvygGTaLU9LnMWZSxqW1agwq8IcDGeCZ289vP1E07eh3ffyLm5TGQsYHXvTwWCHtriZBw+L9RFK/h7TsIMcoLQ==} - dependencies: - jquery: 3.7.1 - jquery-ui: 1.14.1 - dev: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - dev: true - - /sparkles@2.1.0: - resolution: {integrity: sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==} - engines: {node: '>= 10.13.0'} - dev: true - - /spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - dev: true - - /spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} - dependencies: - foreground-child: 2.0.0 - is-windows: 1.0.2 - make-dir: 3.1.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - which: 2.0.2 - dev: true - - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true - - /spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 - dev: true - - /spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /stack-chain@1.3.7: - resolution: {integrity: sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug==} - dev: false - - /stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - dev: false - - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true - - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true - - /statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - dev: true - - /stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - dev: true - - /stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - - /stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - - /stream-composer@1.0.2: - resolution: {integrity: sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==} - dependencies: - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /stream-events@1.0.5: - resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} - dependencies: - stubs: 3.0.0 - dev: true - - /stream-exhaust@1.0.2: - resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} - dev: true - - /stream-http@3.2.0: - resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - dev: true - - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: true - - /streamfilter@3.0.0: - resolution: {integrity: sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==} - engines: {node: '>=8.12.0'} - dependencies: - readable-stream: 3.6.2 - dev: true - - /streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} - dependencies: - events-universal: 1.0.1 - fast-fifo: 1.3.2 - text-decoder: 1.2.3 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.2 - dev: true - - /string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - dependencies: - emoji-regex: 10.5.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 - dev: true - - /string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - dev: true - - /string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - dev: true - - /string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - dev: true - - /string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - dev: true - - /string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - dev: true - - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - dev: true - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.2.2 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-comments@2.0.1: - resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} - engines: {node: '>=10'} - dev: false - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /stubs@3.0.0: - resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - dev: true - - /styled-components@5.3.11(@babel/core@7.28.4)(react-dom@16.14.0)(react-is@19.2.0)(react@16.14.0): - resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} - engines: {node: '>=10'} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - react-is: '>= 16.8.0' - dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/traverse': 7.28.4(supports-color@5.5.0) - '@emotion/is-prop-valid': 1.4.0 - '@emotion/stylis': 0.8.5 - '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.28.4)(styled-components@5.3.11)(supports-color@5.5.0) - css-to-react-native: 3.2.0 - hoist-non-react-statics: 3.3.2 - react: 16.14.0 - react-dom: 16.14.0(react@16.14.0) - react-is: 19.2.0 - shallowequal: 1.1.0 - supports-color: 5.5.0 - transitivePeerDependencies: - - '@babel/core' - dev: false - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /sver@1.8.4: - resolution: {integrity: sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==} - optionalDependencies: - semver: 6.3.1 - dev: true - - /svg-to-pdfkit@0.1.8: - resolution: {integrity: sha512-QItiGZBy5TstGy+q8mjQTMGRlDDOARXLxH+sgVm1n/LYeo0zFcQlcCh8m4zi8QxctrxB9Kue/lStc/RD5iLadQ==} - dependencies: - pdfkit: 0.13.0 - dev: false - - /synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/core': 0.2.9 - dev: true - - /tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - dev: true - - /tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} - dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.4.5 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-buffer - - react-native-b4a - dev: true - - /tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - dependencies: - b4a: 1.7.3 - fast-fifo: 1.3.2 - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /tas-client@0.2.33: - resolution: {integrity: sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg==} - dev: false - - /tcp-port-used@1.0.2: - resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} - dependencies: - debug: 4.3.1 - is2: 2.0.9 - transitivePeerDependencies: - - supports-color - dev: false - - /teeny-request@7.1.1(encoding@0.1.13): - resolution: {integrity: sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==} - engines: {node: '>=10'} - dependencies: - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - stream-events: 1.0.5 - uuid: 8.3.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - dependencies: - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /temp@0.9.4: - resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} - engines: {node: '>=6.0.0'} - dependencies: - mkdirp: 0.5.6 - rimraf: 2.6.3 - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - dependencies: - b4a: 1.7.3 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - - /timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} - dependencies: - setimmediate: 1.0.5 - dev: true - - /tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - - /tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - dev: true - - /tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} - engines: {node: '>=14.14'} - dev: false - - /to-absolute-glob@2.0.2: - resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} - engines: {node: '>=0.10.0'} - dependencies: - is-absolute: 1.0.0 - is-negated-glob: 1.0.0 - dev: true - - /to-buffer@1.2.2: - resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} - engines: {node: '>= 0.4'} - dependencies: - isarray: 2.0.5 - safe-buffer: 5.2.1 - typed-array-buffer: 1.0.3 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /to-through@3.0.0: - resolution: {integrity: sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==} - engines: {node: '>=10.13.0'} - dependencies: - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - /transformation-matrix@2.16.1: - resolution: {integrity: sha512-tdtC3wxVEuzU7X/ydL131Q3JU5cPMEn37oqVLITjRDSDsnSHVFzW2JiCLfZLIQEgWzZHdSy3J6bZzvKEN24jGA==} - dev: false - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - - /truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - dependencies: - utf8-byte-length: 1.0.5 - dev: false - - /ts-api-utils@1.4.3(typescript@5.9.3): - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.9.3 - dev: true - - /ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - dev: false - - /ts-mock-imports@1.3.17(sinon@15.2.0)(typescript@5.9.3): - resolution: {integrity: sha512-P2B9AzoA93/DRcSruu/nJIvmK6r3I/Zy3oLKj1PaPrErnYfa4NOCriqQIje/hQb9HK5wD76af35uPpBenUJcFw==} - peerDependencies: - sinon: '>= 4.1.2' - typescript: '>=2.6.1' - dependencies: - sinon: 15.2.0 - typescript: 5.9.3 - dev: true - - /ts-mockito@2.6.1: - resolution: {integrity: sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw==} - dependencies: - lodash: 4.17.21 - dev: true - - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - /tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - /tslint@6.1.3(typescript@5.9.3): - resolution: {integrity: sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==} - engines: {node: '>=4.8.0'} - deprecated: TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information. - hasBin: true - peerDependencies: - typescript: '>=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev' - dependencies: - '@babel/code-frame': 7.27.1 - builtin-modules: 1.1.1 - chalk: 2.4.2 - commander: 2.20.3 - diff: 4.0.2 - glob: 7.2.3 - js-yaml: 3.14.1 - minimatch: 3.1.2 - mkdirp: 0.5.6 - resolve: 1.22.10 - semver: 5.7.2 - tslib: 1.14.1 - tsutils: 2.29.0(typescript@5.9.3) - typescript: 5.9.3 - dev: true - - /tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - dev: true - - /tsutils@2.29.0(typescript@5.9.3): - resolution: {integrity: sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==} - peerDependencies: - typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev' - dependencies: - tslib: 1.14.1 - typescript: 5.9.3 - dev: true - - /tsx@4.20.6: - resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} - engines: {node: '>=18.0.0'} - hasBin: true - dependencies: - esbuild: 0.25.10 - get-tsconfig: 4.11.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tty-browserify@0.0.1: - resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - dev: true - - /tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 - dev: true - - /type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - dev: true - - /typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - dev: true - - /typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - dev: true - - /typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - dev: true - - /typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - dev: true - - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - - /typemoq@2.1.0: - resolution: {integrity: sha512-DtRNLb7x8yCTv/KHlwes+NI+aGb4Vl1iPC63Hhtcvk1DpxSAZzKWQv0RQFY0jX2Uqj0SDBNl8Na4e6MV6TNDgw==} - engines: {node: '>=6.0.0'} - requiresBuild: true - dependencies: - circular-json: 0.3.3 - lodash: 4.17.21 - postinstall-build: 5.0.3 - dev: true - - /typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - dev: true - - /unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} - dev: true - - /underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - dev: false - - /undertaker-registry@2.0.0: - resolution: {integrity: sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==} - engines: {node: '>= 10.13.0'} - dev: true - - /undertaker@2.0.0: - resolution: {integrity: sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==} - engines: {node: '>=10.13.0'} - dependencies: - bach: 2.0.1 - fast-levenshtein: 3.0.0 - last-run: 2.0.0 - undertaker-registry: 2.0.0 - dev: true - - /undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - dev: true - - /undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.1 - dev: true - - /unicode-properties@1.4.1: - resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} - dependencies: - base64-js: 1.5.1 - unicode-trie: 2.0.0 - - /unicode-trie@2.0.0: - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - dependencies: - pako: 0.2.9 - tiny-inflate: 1.0.3 - - /universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - dev: true - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: false - - /update-browserslist-db@1.1.3(browserslist@4.26.3): - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.26.3 - escalade: 3.2.0 - picocolors: 1.1.1 - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /url@0.11.4: - resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} - engines: {node: '>= 0.4'} - dependencies: - punycode: 1.4.1 - qs: 6.14.0 - dev: true - - /urlgrey@1.0.0: - resolution: {integrity: sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==} - dependencies: - fast-url-parser: 1.1.3 - dev: true - - /utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.4 - - /utf8-byte-length@1.0.5: - resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.19 - dev: true - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - /v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - dev: true - - /v8flags@4.0.1: - resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} - engines: {node: '>= 10.13.0'} - dev: true - - /validate.io-array@1.0.6: - resolution: {integrity: sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==} - dev: false - - /validate.io-function@1.0.2: - resolution: {integrity: sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==} - dev: false - - /validate.io-integer-array@1.0.0: - resolution: {integrity: sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==} - dependencies: - validate.io-array: 1.0.6 - validate.io-integer: 1.0.5 - dev: false - - /validate.io-integer@1.0.5: - resolution: {integrity: sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==} - dependencies: - validate.io-number: 1.0.3 - dev: false - - /validate.io-number@1.0.3: - resolution: {integrity: sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==} - dev: false - - /value-or-function@4.0.0: - resolution: {integrity: sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==} - engines: {node: '>= 10.13.0'} - dev: true - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - - /vinyl-contents@2.0.0: - resolution: {integrity: sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==} - engines: {node: '>=10.13.0'} - dependencies: - bl: 5.1.0 - vinyl: 3.0.1 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /vinyl-fs@4.0.2: - resolution: {integrity: sha512-XRFwBLLTl8lRAOYiBqxY279wY46tVxLaRhSwo3GzKEuLz1giffsOquWWboD/haGf5lx+JyTigCFfe7DWHoARIA==} - engines: {node: '>=10.13.0'} - dependencies: - fs-mkdirp-stream: 2.0.1 - glob-stream: 8.0.3 - graceful-fs: 4.2.11 - iconv-lite: 0.6.3 - is-valid-glob: 1.0.0 - lead: 4.0.0 - normalize-path: 3.0.0 - resolve-options: 2.0.0 - stream-composer: 1.0.2 - streamx: 2.23.0 - to-through: 3.0.0 - value-or-function: 4.0.0 - vinyl: 3.0.1 - vinyl-sourcemap: 2.0.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /vinyl-sourcemap@2.0.0: - resolution: {integrity: sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==} - engines: {node: '>=10.13.0'} - dependencies: - convert-source-map: 2.0.0 - graceful-fs: 4.2.11 - now-and-later: 3.0.0 - streamx: 2.23.0 - vinyl: 3.0.1 - vinyl-contents: 2.0.0 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /vinyl@3.0.1: - resolution: {integrity: sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==} - engines: {node: '>=10.13.0'} - dependencies: - clone: 2.1.2 - remove-trailing-separator: 1.1.0 - replace-ext: 2.0.0 - teex: 1.0.1 - transitivePeerDependencies: - - react-native-b4a - dev: true - - /vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - dev: true - - /vscode-debugprotocol@1.51.0: - resolution: {integrity: sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA==} - deprecated: This package has been renamed to @vscode/debugprotocol, please update to the new name - dev: false - - /vscode-jsonrpc@8.0.2-next.1: - resolution: {integrity: sha512-sbbvGSWja7NVBLHPGawtgezc8DHYJaP4qfr/AaJiyDapWcSFtHyPtm18+LnYMLTmB7bhOUW/lf5PeeuLpP6bKA==} - engines: {node: '>=14.0.0'} - dev: false - - /vscode-languageclient@8.0.2-next.5: - resolution: {integrity: sha512-g87RJLHz0XlRyk6DOTbAk4JHcj8CKggXy4JiFL7OlhETkcYzTOR8d+Qdb4GqZr37PDs1Cl21omtTNK5LyR/RQg==} - engines: {vscode: ^1.67.0} - dependencies: - minimatch: 3.1.2 - semver: 7.7.2 - vscode-languageserver-protocol: 3.17.2-next.6 - dev: false - - /vscode-languageserver-protocol@3.17.2-next.6: - resolution: {integrity: sha512-WtsebNOOkWyNn4oFYoAMPC8Q/ZDoJ/K7Ja53OzTixiitvrl/RpXZETrtzH79R8P5kqCyx6VFBPb6KQILJfkDkA==} - dependencies: - vscode-jsonrpc: 8.0.2-next.1 - vscode-languageserver-types: 3.17.2-next.2 - dev: false - - /vscode-languageserver-types@3.17.2-next.2: - resolution: {integrity: sha512-TiAkLABgqkVWdAlC3XlOfdhdjIAdVU4YntPUm9kKGbXr+MGwpVnKz2KZMNBcvG0CFx8Hi8qliL0iq+ndPB720w==} - dev: false - - /vscode-tas-client@0.1.84: - resolution: {integrity: sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==} - engines: {vscode: ^1.85.0} - dependencies: - tas-client: 0.2.33 - dev: false - - /vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - /which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - /which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - dev: true - - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: true - - /which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - dev: true - - /workerpool@9.3.4: - resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} - dev: true - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: true - - /ws@6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - async-limiter: 1.0.1 - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - dev: false - - /ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 - dev: false - - /xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - dev: true - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - - /y-protocols@1.0.6(yjs@13.6.27): - resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==} - engines: {node: '>=16.0.0', npm: '>=8.0.0'} - peerDependencies: - yjs: ^13.0.0 - dependencies: - lib0: 0.2.114 - yjs: 13.6.27 - dev: false - - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - dev: true - - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - dev: true - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yjs@13.6.27: - resolution: {integrity: sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==} - engines: {node: '>=16.0.0', npm: '>=8.0.0'} - dependencies: - lib0: 0.2.114 - dev: false - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /zeromq@6.5.0: - resolution: {integrity: sha512-vWOrt19lvcXTxu5tiHXfEGQuldSlU+qZn2TT+4EbRQzaciWGwNZ99QQTolQOmcwVgZLodv+1QfC6UZs2PX/6pQ==} - engines: {node: '>= 12'} - requiresBuild: true - dependencies: - cmake-ts: 1.0.2 - node-addon-api: 8.5.0 - dev: false - - file:build/eslint-rules: - resolution: {directory: build/eslint-rules, type: directory} - name: eslint-plugin-local-rules - dev: true diff --git a/src/kernels/execution/cellExecution.ts b/src/kernels/execution/cellExecution.ts index 2708eeac70..c069cddaec 100644 --- a/src/kernels/execution/cellExecution.ts +++ b/src/kernels/execution/cellExecution.ts @@ -32,7 +32,8 @@ import { KernelError } from '../errors/kernelError'; import { getCachedSysPrefix } from '../../platform/interpreter/helpers'; import { getCellMetadata } from '../../platform/common/utils'; import { NotebookCellExecutionState, notebookCellExecutions } from '../../platform/notebooks/cellExecutionStateService'; -import dedent from 'dedent'; +import { createBlockFromPocket } from '../../notebooks/deepnote/pocket'; +import { createPythonCode } from '@deepnote/blocks'; /** * Factory for CellExecution objects. @@ -407,31 +408,19 @@ export class CellExecution implements ICellExecution, IDisposable { return this.completedSuccessfully(); } - const tableState = - 'deepnote_table_state' in this.cell.metadata ? this.cell.metadata.deepnote_table_state : undefined; - - if (tableState) { - const tableStateSpec = JSON.stringify(tableState); - - logger.info( - `Cell ${this.cell.index}: Found table state spec in metadata: ${JSON.stringify( - tableStateSpec - ).substring(0, 200)}` - ); - const tableStateAsJson = tableStateSpec; - - const prependedCode = dedent` - if '_dntk' in globals(): - _dntk.dataframe_utils.configure_dataframe_formatter(${escapePythonString(tableStateAsJson)}) - else: - _deepnote_current_table_attrs = ${escapePythonString(tableStateAsJson)} - `; + // Convert NotebookCell to Deepnote block for further operations + const cellData = { + kind: this.cell.kind, + value: this.cell.document.getText(), + languageId: this.cell.document.languageId, + metadata: this.cell.metadata, + outputs: [...(this.cell.outputs || [])] + }; + const deepnoteBlock = createBlockFromPocket(cellData, this.cell.index); - logger.info(`Cell ${this.cell.index}: Prepending table state configuration code to cell execution`); - code = `${prependedCode}\n\n${code}`; - } else { - logger.info(`Cell ${this.cell.index}: No table state spec found in metadata`); - } + // Use createPythonCode to generate code with table state already included + logger.info(`Cell ${this.cell.index}: Using createPythonCode to generate execution code with table state`); + code = createPythonCode(deepnoteBlock); // Generate metadata from our cell (some kernels expect this.) // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -528,11 +517,3 @@ export class CellExecution implements ICellExecution, IDisposable { } } } - -function escapePythonString(value: string): string { - // We have to escape backslashes, single quotes, and newlines - const escaped = value.replaceAll('\\', '\\\\').replaceAll("'", "\\'").replaceAll('\n', '\\n'); - - // Wrap the escaped string in single quotes - return `'${escaped}'`; -} diff --git a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx index 44ced77ea2..5964305d52 100644 --- a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -183,9 +183,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({
-
- {/* Actions */} -
+
{/* Actions */}
); From 1ba9ab4e874cbae3de780a43c708e8c5e30b1685 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Mon, 13 Oct 2025 14:52:03 +0200 Subject: [PATCH 07/21] clean up --- src/kernels/deepnote/deepnoteController.ts | 33 +++++++++------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/kernels/deepnote/deepnoteController.ts b/src/kernels/deepnote/deepnoteController.ts index dd5f413f84..63a98c31eb 100644 --- a/src/kernels/deepnote/deepnoteController.ts +++ b/src/kernels/deepnote/deepnoteController.ts @@ -1,32 +1,13 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - import { CancellationToken, NotebookCell, NotebookCellExecution, NotebookCellOutput, - NotebookCellOutputItem, - NotebookController + NotebookCellOutputItem } from 'vscode'; import { KernelController } from '../kernelController'; -/** - * DeepnoteController extends KernelController to intercept cell execution - * and prepend initialization code to each cell execution. - */ -export class DeepnoteController extends KernelController { - constructor(controller: NotebookController) { - super(controller); - } - - public override createNotebookCellExecution(cell: NotebookCell): NotebookCellExecution { - const execution = super.createNotebookCellExecution(cell); - return new DeepnoteNotebookCellExecution(execution, cell); - } -} - /** * Wrapper around NotebookCellExecution that prepends initialization code. * This is implemented by delegating all calls to the underlying execution object. @@ -89,3 +70,15 @@ class DeepnoteNotebookCellExecution implements NotebookCellExecution { return this.execution.appendOutputItems(items, output); } } + +/** + * DeepnoteController extends KernelController to intercept cell execution + * and prepend initialization code to each cell execution. + */ +export class DeepnoteController extends KernelController { + public override createNotebookCellExecution(cell: NotebookCell): NotebookCellExecution { + const execution = super.createNotebookCellExecution(cell); + + return new DeepnoteNotebookCellExecution(execution, cell); + } +} From a51a1505e2351a9d9170714689bcaa3a1fc0048b Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Mon, 13 Oct 2025 15:35:05 +0200 Subject: [PATCH 08/21] pr feedback. --- build/esbuild/build.ts | 2 +- .../execution/cellExecutionMessageHandler.ts | 20 ++- .../deepnoteInitNotebookRunner.node.ts | 2 +- .../deepnoteKernelAutoSelector.node.ts | 44 +++--- .../deepnoteRequirementsHelper.node.ts | 47 ++++--- .../dataframe/dataframeController.ts | 125 +++++++++--------- .../dataframe-renderer/DataframeRenderer.tsx | 43 ++++-- .../webview-side/dataframe-renderer/index.ts | 12 +- 8 files changed, 171 insertions(+), 124 deletions(-) diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index d19c54b002..48f5e26003 100644 --- a/build/esbuild/build.ts +++ b/build/esbuild/build.ts @@ -320,7 +320,7 @@ async function buildAll() { build( path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'dataframe-renderer', 'index.ts'), path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'dataframeRenderer', 'dataframeRenderer.js'), - { target: 'web', watch: isWatchMode } + { target: 'web', watch: watchAll } ), build( path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'variable-view', 'index.tsx'), diff --git a/src/kernels/execution/cellExecutionMessageHandler.ts b/src/kernels/execution/cellExecutionMessageHandler.ts index f952580d5a..5d881fe40d 100644 --- a/src/kernels/execution/cellExecutionMessageHandler.ts +++ b/src/kernels/execution/cellExecutionMessageHandler.ts @@ -79,6 +79,14 @@ export function getParentHeaderMsgId(msg: KernelMessage.IMessage): string | unde return undefined; } +/** + * Gets the cell ID, preferring the metadata id from Deepnote blocks, + * otherwise falling back to the cell's document URI. + */ +function getCellId(cell: NotebookCell): string { + return (cell.metadata?.id as string | undefined) || cell.document.uri.toString(); +} + /** * Responsible for handling of jupyter messages as a result of execution of individual cells. */ @@ -635,7 +643,7 @@ export class CellExecutionMessageHandler implements IDisposable { } } // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id - const cellId = (this.cell.metadata?.id as string | undefined) || this.cell.document.uri.toString(); + const cellId = getCellId(this.cell); const cellOutput = cellOutputToVSCCellOutput(output, this.cell.index, cellId); const displayId = 'transient' in output && @@ -1006,7 +1014,7 @@ export class CellExecutionMessageHandler implements IDisposable { // If the last output is the desired stream type. if (this.lastUsedStreamOutput?.stream === msg.content.name) { // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id - const cellId = (this.cell.metadata?.id as string | undefined) || this.cell.document.uri.toString(); + const cellId = getCellId(this.cell); const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1022,7 +1030,7 @@ export class CellExecutionMessageHandler implements IDisposable { // Replace the current outputs with a single new output. const text = concatMultilineString(msg.content.text); // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id - const cellId = (this.cell.metadata?.id as string | undefined) || this.cell.document.uri.toString(); + const cellId = getCellId(this.cell); const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1039,7 +1047,7 @@ export class CellExecutionMessageHandler implements IDisposable { // Create a new output const text = formatStreamText(concatMultilineString(msg.content.text)); // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id - const cellId = (this.cell.metadata?.id as string | undefined) || this.cell.document.uri.toString(); + const cellId = getCellId(this.cell); const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1167,9 +1175,7 @@ export class CellExecutionMessageHandler implements IDisposable { new NotebookCellOutput(outputToBeUpdated.outputItems, outputToBeUpdated.outputContainer.metadata) ); // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id - const cellId = - (outputToBeUpdated.cell.metadata?.id as string | undefined) || - outputToBeUpdated.cell.document.uri.toString(); + const cellId = getCellId(outputToBeUpdated.cell); const newOutput = cellOutputToVSCCellOutput( { ...output, diff --git a/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts b/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts index 668d9a0482..cbc5f8f5b5 100644 --- a/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts +++ b/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts @@ -234,7 +234,7 @@ export class DeepnoteInitNotebookRunner { } const block = codeBlocks[i]; - const percentComplete = Math.floor((i / codeBlocks.length) * 100); + const percentComplete = Math.min(100, Math.floor(((i + 1) / codeBlocks.length) * 100)); // Show more detailed progress with percentage progress( diff --git a/src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts b/src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts index 0d97a2162b..9c506affdf 100644 --- a/src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts +++ b/src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts @@ -12,7 +12,8 @@ import { notebooks, NotebookController, CancellationTokenSource, - Disposable + Disposable, + l10n } from 'vscode'; import { IExtensionSyncActivationService } from '../../platform/activation/types'; import { IDisposableRegistry } from '../../platform/common/types'; @@ -127,8 +128,10 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, // Always try to ensure kernel is selected (this will reuse existing controllers) // Don't await - let it happen in background so notebook opens quickly void this.ensureKernelSelected(notebook).catch((error) => { - logger.error(`Failed to auto-select Deepnote kernel for ${getDisplayPath(notebook.uri)}: ${error}`); - void window.showErrorMessage(`Failed to load Deepnote kernel: ${error}`); + logger.error(`Failed to auto-select Deepnote kernel for ${getDisplayPath(notebook.uri)}`, error); + void window.showErrorMessage( + l10n.t('Failed to load Deepnote kernel. Please check the output for details.') + ); }); } @@ -240,7 +243,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, logger.info(`Init notebook cancelled for project ${projectId}`); return; } - logger.error(`Error running init notebook: ${error}`); + logger.error('Error running init notebook', error); // Continue anyway - don't block user if init fails } finally { // Always clean up the CTS and event listeners @@ -253,7 +256,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, return window.withProgress( { location: ProgressLocation.Notification, - title: 'Loading Deepnote Kernel', + title: l10n.t('Loading Deepnote Kernel'), cancellable: true }, async (progress, progressToken) => { @@ -277,7 +280,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, notebook.uri )}` ); - progress.report({ message: 'Reusing existing kernel...' }); + progress.report({ message: l10n.t('Reusing existing kernel...') }); // Ensure server is registered with the provider (it might have been unregistered on close) if (connectionMetadata.serverInfo) { @@ -317,7 +320,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, // No existing controller, so create a new one logger.info(`Creating new Deepnote kernel for ${getDisplayPath(notebook.uri)}`); - progress.report({ message: 'Setting up Deepnote kernel...' }); + progress.report({ message: l10n.t('Setting up Deepnote kernel...') }); // Check if Python extension is installed if (!this.pythonExtensionChecker.isPythonExtensionInstalled) { @@ -327,7 +330,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, } // Get active Python interpreter - progress.report({ message: 'Finding Python interpreter...' }); + progress.report({ message: l10n.t('Finding Python interpreter...') }); const interpreter = await this.interpreterService.getActiveInterpreter(notebook.uri); if (!interpreter) { logger.warn( @@ -339,7 +342,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, logger.info(`Using base interpreter: ${getDisplayPath(interpreter.uri)}`); // Ensure deepnote-toolkit is installed in a venv and get the venv interpreter - progress.report({ message: 'Installing Deepnote toolkit...' }); + progress.report({ message: l10n.t('Installing Deepnote toolkit...') }); const venvInterpreter = await this.toolkitInstaller.ensureInstalled( interpreter, baseFileUri, @@ -353,7 +356,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, logger.info(`Deepnote toolkit venv ready at: ${getDisplayPath(venvInterpreter.uri)}`); // Start the Deepnote server using the venv interpreter - progress.report({ message: 'Starting Deepnote server...' }); + progress.report({ message: l10n.t('Starting Deepnote server...') }); const serverInfo = await this.serverStarter.getOrStartServer( venvInterpreter, baseFileUri, @@ -375,7 +378,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, this.notebookServerHandles.set(notebookKey, serverProviderHandle.handle); // Connect to the server and get available kernel specs - progress.report({ message: 'Connecting to kernel...' }); + progress.report({ message: l10n.t('Connecting to kernel...') }); const connectionInfo = createJupyterConnectionInfo( serverProviderHandle, { @@ -409,10 +412,15 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, if (!kernelSpec) { logger.warn( - `⚠️ Venv kernel spec '${expectedKernelName}' not found! Falling back to generic Python kernel.` + l10n.t( + "⚠️ Venv kernel spec '{expectedKernelName}' not found! Falling back to generic Python kernel.", + { expectedKernelName } + ) ); logger.warn( - `This may cause import errors if packages are installed to the venv but kernel uses system Python.` + l10n.t( + 'This may cause import errors if packages are installed to the venv but kernel uses system Python.' + ) ); kernelSpec = kernelSpecs.find((s) => s.language === 'python') || @@ -429,7 +437,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, await disposeAsync(sessionManager); } - progress.report({ message: 'Finalizing kernel setup...' }); + progress.report({ message: l10n.t('Finalizing kernel setup...') }); const newConnectionMetadata = DeepnoteKernelConnectionMetadata.create({ interpreter, kernelSpec, @@ -467,7 +475,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, if (project) { // Create requirements.txt first (needs to be ready for init notebook) - progress.report({ message: 'Creating requirements.txt...' }); + progress.report({ message: l10n.t('Creating requirements.txt...') }); await this.requirementsHelper.createRequirementsFile(project, progressToken); logger.info(`Created requirements.txt for project ${projectId}`); @@ -504,7 +512,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, controller.controller.updateNotebookAffinity(notebook, NotebookControllerAffinity.Preferred); logger.info(`Successfully auto-selected Deepnote kernel for ${getDisplayPath(notebook.uri)}`); - progress.report({ message: 'Kernel ready!' }); + progress.report({ message: l10n.t('Kernel ready!') }); // Dispose the loading controller once the real one is ready const loadingController = this.loadingControllers.get(notebookKey); @@ -514,7 +522,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, logger.info(`Disposed loading controller for ${notebookKey}`); } } catch (ex) { - logger.error(`Failed to auto-select Deepnote kernel: ${ex}`); + logger.error('Failed to auto-select Deepnote kernel', ex); throw ex; } } @@ -526,7 +534,7 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, const loadingController = notebooks.createNotebookController( `deepnote-loading-${notebookKey}`, DEEPNOTE_NOTEBOOK_TYPE, - 'Loading Deepnote Kernel...' + l10n.t('Loading Deepnote Kernel...') ); // Set it as the preferred controller immediately diff --git a/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts b/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts index 4ea14115d9..9f468bc868 100644 --- a/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts +++ b/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts @@ -1,18 +1,23 @@ import { inject, injectable } from 'inversify'; -import { workspace, CancellationToken, window } from 'vscode'; +import { workspace, CancellationToken, window, Uri, l10n } from 'vscode'; import * as fs from 'fs'; -import * as path from '../../platform/vscode-path/path'; + import type { DeepnoteProject } from './deepnoteTypes'; import { ILogger } from '../../platform/logging/types'; import { IPersistentStateFactory } from '../../platform/common/types'; const DONT_ASK_OVERWRITE_REQUIREMENTS_KEY = 'DEEPNOTE_DONT_ASK_OVERWRITE_REQUIREMENTS'; +export const IDeepnoteRequirementsHelper = Symbol('IDeepnoteRequirementsHelper'); +export interface IDeepnoteRequirementsHelper { + createRequirementsFile(project: DeepnoteProject, token: CancellationToken): Promise; +} + /** * Helper class for creating requirements.txt files from Deepnote project settings. */ @injectable() -export class DeepnoteRequirementsHelper { +export class DeepnoteRequirementsHelper implements IDeepnoteRequirementsHelper { constructor( @inject(ILogger) private readonly logger: ILogger, @inject(IPersistentStateFactory) private readonly persistentStateFactory: IPersistentStateFactory @@ -36,6 +41,17 @@ export class DeepnoteRequirementsHelper { return; } + // Validate and normalize requirements: ensure they are valid strings, trim them, and remove empty entries + const normalizedRequirements = requirements + .filter((req) => typeof req === 'string') // Keep only string entries + .map((req) => req.trim()) // Trim whitespace + .filter((req) => req.length > 0); // Remove empty strings + + if (normalizedRequirements.length === 0) { + this.logger.info(`No valid requirements found in project ${project.project.id}`); + return; + } + // Get the workspace folder to determine where to create the requirements.txt file const workspaceFolders = workspace.workspaceFolders; if (!workspaceFolders || workspaceFolders.length === 0) { @@ -48,11 +64,11 @@ export class DeepnoteRequirementsHelper { return; } - const workspaceRoot = workspaceFolders[0].uri.fsPath; - const requirementsPath = path.join(workspaceRoot, 'requirements.txt'); + // Use Uri.joinPath to build the filesystem path using the Uri API + const requirementsPath = Uri.joinPath(workspaceFolders[0].uri, 'requirements.txt').fsPath; - // Convert requirements array to text format first - const requirementsText = requirements.join('\n') + '\n'; + // Convert normalized requirements array to text format + const requirementsText = normalizedRequirements.join('\n') + '\n'; // Check if requirements.txt already exists const fileExists = await fs.promises @@ -77,12 +93,14 @@ export class DeepnoteRequirementsHelper { if (!dontAskState.value) { // User hasn't chosen "Don't Ask Again", so prompt them - const yes = 'Yes'; - const no = 'No'; - const dontAskAgain = "Don't Ask Again"; + const yes = l10n.t('Yes'); + const no = l10n.t('No'); + const dontAskAgain = l10n.t("Don't Ask Again"); const response = await window.showWarningMessage( - `A requirements.txt file already exists in this workspace. Do you want to override it with requirements from your Deepnote project?`, + l10n.t( + 'A requirements.txt file already exists in this workspace. Do you want to override it with requirements from your Deepnote project?' + ), { modal: true }, yes, no, @@ -131,15 +149,10 @@ export class DeepnoteRequirementsHelper { } this.logger.info( - `Created requirements.txt with ${requirements.length} dependencies at ${requirementsPath}` + `Created requirements.txt with ${normalizedRequirements.length} dependencies at ${requirementsPath}` ); } catch (error) { this.logger.error(`Error creating requirements.txt:`, error); } } } - -export const IDeepnoteRequirementsHelper = Symbol('IDeepnoteRequirementsHelper'); -export interface IDeepnoteRequirementsHelper { - createRequirementsFile(project: DeepnoteProject, token: CancellationToken): Promise; -} diff --git a/src/webviews/extension-side/dataframe/dataframeController.ts b/src/webviews/extension-side/dataframe/dataframeController.ts index 0528c0c305..10f6a40457 100644 --- a/src/webviews/extension-side/dataframe/dataframeController.ts +++ b/src/webviews/extension-side/dataframe/dataframeController.ts @@ -55,7 +55,7 @@ export class DataframeController implements IExtensionSyncActivationService { comms.onDidReceiveMessage(this.onDidReceiveMessage.bind(this, comms), this, this.disposables); } - private onDidReceiveMessage( + private async onDidReceiveMessage( _comms: NotebookRendererMessaging, { editor, message }: { editor: NotebookEditor; message: DataframeCommand } ) { @@ -65,62 +65,53 @@ export class DataframeController implements IExtensionSyncActivationService { return; } - switch (message.command) { - case 'selectPageSize': - void this.handleSelectPageSize(editor, message); - break; - case 'goToPage': - void this.handleGoToPage(editor, message); - break; - case 'copyTableData': - void this.handleCopyTableData(message); - break; - case 'exportDataframe': - void this.handleExportDataframe(editor, message); - break; + if (message.command === 'selectPageSize') { + return this.handleSelectPageSize(editor, message); } + + if (message.command === 'goToPage') { + return this.handleGoToPage(editor, message); + } + + if (message.command === 'copyTableData') { + return this.handleCopyTableData(message); + } + + if (message.command === 'exportDataframe') { + return this.handleExportDataframe(editor, message); + } + + logger.warn(`DataframeController received unknown command:`, message); } private async handleSelectPageSize(editor: NotebookEditor, message: SelectPageSizeCommand) { - let cell; - let cellIndex: number; - - // Try to find cell by cellId first (more reliable) - if (message.cellId) { - const cells = editor.notebook.getCells(); - const foundCell = cells.find((c) => c.metadata.id === message.cellId); - - if (foundCell) { - cell = foundCell; - cellIndex = foundCell.index; - logger.info(`[DataframeController] Found cell by cellId ${message.cellId} at index ${cellIndex}`); - } else { - const errorMessage = `Unable to update page size: Could not find the cell with ID ${message.cellId}. The cell may have been deleted.`; - logger.error(`[DataframeController] ${errorMessage}`); - await window.showErrorMessage(errorMessage); - throw new Error(errorMessage); - } - } else if (message.cellIndex !== undefined) { - // Fall back to cellIndex if cellId is not available - try { - cell = editor.notebook.cellAt(message.cellIndex); - cellIndex = message.cellIndex; - logger.info(`[DataframeController] Using cellIndex ${cellIndex} (cellId not available)`); - } catch (error) { - const errorMessage = `Unable to update page size: Cell at index ${message.cellIndex} not found. The notebook structure may have changed.`; - logger.error(`[DataframeController] ${errorMessage}`, error); - await window.showErrorMessage(errorMessage); - throw new Error(errorMessage); - } - } else { + if (!message.cellId && message.cellIndex === undefined) { const errorMessage = 'Unable to update page size: No cell identifier provided. ' + 'Please re-run the cell to update the output metadata.'; + logger.error(`[DataframeController] ${errorMessage}`); + await window.showErrorMessage(errorMessage); + + throw new Error(errorMessage); + } + + const cells = editor.notebook.getCells(); + const cell = cells.find((c) => c.metadata.id === message.cellId); + + if (!cell) { + const errorMessage = `Unable to update page size: Could not find the cell with ID ${message.cellId}. The cell may have been deleted.`; + + logger.error(`[DataframeController] ${errorMessage}`); + + await window.showErrorMessage(errorMessage); + throw new Error(errorMessage); } + const cellIndex = cell.index; + // Update page size in table state within cell metadata const existingTableState = cell.metadata.deepnote_table_state || {}; const updatedTableState = { @@ -140,6 +131,7 @@ export class DataframeController implements IExtensionSyncActivationService { // Re-execute the cell to apply the new page size logger.info(`[DataframeRenderer] Re-executing cell ${cellIndex} with new page size`); + await commands.executeCommand('notebook.cell.execute', { ranges: [{ start: cellIndex, end: cellIndex + 1 }], document: editor.notebook.uri @@ -147,30 +139,28 @@ export class DataframeController implements IExtensionSyncActivationService { } private async handleGoToPage(editor: NotebookEditor, message: GoToPageCommand) { - let cell; - let cellIndex: number; - - // Try to find cell by cellId first (more reliable) - if (message.cellId) { - const cells = editor.notebook.getCells(); - const foundCell = cells.find((c) => c.metadata.id === message.cellId); - - if (foundCell) { - cell = foundCell; - cellIndex = foundCell.index; - logger.info(`[DataframeController] Found cell by cellId ${message.cellId} at index ${cellIndex}`); - } else { - const errorMessage = `Unable to navigate to page: Could not find the cell with ID ${message.cellId}. The cell may have been deleted.`; - logger.error(`[DataframeController] ${errorMessage}`); - await window.showErrorMessage(errorMessage); - throw new Error(errorMessage); - } - } else { + if (!message.cellId) { const errorMessage = 'Unable to navigate to page: No cell identifier provided. ' + 'Please re-run the cell to update the output metadata.'; + + logger.error(`[DataframeController] ${errorMessage}`); + + await window.showErrorMessage(errorMessage); + + throw new Error(errorMessage); + } + + const cells = editor.notebook.getCells(); + const cell = cells.find((c) => c.metadata.id === message.cellId); + + if (!cell) { + const errorMessage = `Unable to navigate to page: Could not find the cell with ID ${message.cellId}. The cell may have been deleted.`; + logger.error(`[DataframeController] ${errorMessage}`); + await window.showErrorMessage(errorMessage); + throw new Error(errorMessage); } @@ -181,6 +171,8 @@ export class DataframeController implements IExtensionSyncActivationService { pageIndex: message.page }; + const cellIndex = cell.index; + const edit = new WorkspaceEdit(); const notebookEdit = NotebookEdit.updateCellMetadata(cellIndex, { ...cell.metadata, @@ -193,6 +185,7 @@ export class DataframeController implements IExtensionSyncActivationService { // Re-execute the cell to apply the new page logger.info(`[DataframeController] Re-executing cell ${cellIndex} with new page index ${message.page}`); + await commands.executeCommand('notebook.cell.execute', { ranges: [{ start: cellIndex, end: cellIndex + 1 }], document: editor.notebook.uri @@ -201,11 +194,13 @@ export class DataframeController implements IExtensionSyncActivationService { private async handleCopyTableData(message: CopyTableDataCommand) { logger.info(`[DataframeRenderer] copyTableData called, data length=${message.data.length} characters`); + await env.clipboard.writeText(message.data); } - private handleExportDataframe(editor: NotebookEditor, message: ExportDataframeCommand) { + private async handleExportDataframe(editor: NotebookEditor, message: ExportDataframeCommand) { const cell = editor.notebook.cellAt(message.cellIndex); + logger.info( `[DataframeRenderer] exportDataframe called for cell ${ message.cellIndex diff --git a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx index 5964305d52..600da69774 100644 --- a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -2,11 +2,28 @@ import React, { memo, useMemo, useState } from 'react'; import { RendererContext } from 'vscode-notebook-renderer'; import '../react-common/codicon/codicon.css'; +import { logMessage } from '../react-common/logger'; export interface DataframeMetadata { table_state_spec?: string; } +interface ColumnStats { + unique_count: number; + nan_count: number; + min: string | null; + max: string | null; + histogram: Array<{ + bin_start: number; + bin_end: number; + count: number; + }> | null; + categories: Array<{ + name: string; + count: number; + }> | null; +} + interface DataframeRendererProps { cellId?: string; cellIndex?: number; @@ -16,13 +33,13 @@ interface DataframeRendererProps { columns: { dtype: string; name: string; - stats: any; + stats: ColumnStats; }[]; preview_row_count: number; row_count: number; rows: { _deepnote_index_column: number; - [key: string]: any; + [key: string]: unknown; }[]; type: string; }; @@ -43,13 +60,19 @@ export const DataframeRenderer = memo(function DataframeRenderer({ data, metadata }: DataframeRendererProps) { - console.log('[DataframeRenderer] Rendering with:', { cellId, cellIndex, data, metadata }); + logMessage( + `[DataframeRenderer] Rendering with cellId: ${cellId}, cellIndex: ${cellIndex}, data: ${JSON.stringify( + data + )}, metadata: ${JSON.stringify(metadata)}` + ); const tableState = useMemo((): TableState => JSON.parse(metadata?.table_state_spec || '{}'), [metadata]); const [pageSize, setPageSize] = useState(tableState.pageSize || 10); const [pageIndex, setPageIndex] = useState(tableState.pageIndex || 0); - console.log({ state: context.getState(), tableState }); + logMessage( + `[DataframeRenderer] State: ${JSON.stringify(context.getState())}, tableState: ${JSON.stringify(tableState)}` + ); const filteredColumns = data.columns.filter((column) => !column.name.startsWith('_deepnote_')); const numberOfRows = Math.min(data.row_count, data.preview_row_count); @@ -62,7 +85,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ setPageSize(newPageSize); - console.log('[DataframeRenderer] handlePageSizeChange called with cellId:', cellId, 'cellIndex:', cellIndex); + logMessage(`[DataframeRenderer] handlePageSizeChange called with cellId: ${cellId}, cellIndex: ${cellIndex}`); const message = { command: 'selectPageSize', @@ -71,7 +94,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ size: newPageSize }; - console.log('[DataframeRenderer] Posting message:', message); + logMessage(`[DataframeRenderer] Posting message: ${JSON.stringify(message)}`); context.postMessage?.(message); }; @@ -79,7 +102,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ const handlePageChange = (newPageIndex: number) => { setPageIndex(newPageIndex); - console.log('[DataframeRenderer] handlePageChange called with cellId:', cellId, 'page:', newPageIndex); + logMessage(`[DataframeRenderer] handlePageChange called with cellId: ${cellId}, page: ${newPageIndex}`); const message = { command: 'goToPage', @@ -88,7 +111,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ page: newPageIndex }; - console.log('[DataframeRenderer] Posting message:', message); + logMessage(`[DataframeRenderer] Posting message: ${JSON.stringify(message)}`); context.postMessage?.(message); }; @@ -116,7 +139,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ : 'bg-[var(--vscode-list-hoverBackground)]/50' }`} > - {value ? value.toString() : 'None'} + {value === null || value === undefined ? 'None' : String(value)}
))}
@@ -160,6 +183,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ `} disabled={pageIndex === 0} title="Previous page" + type="button" onClick={() => handlePageChange(pageIndex - 1)} >
@@ -177,6 +201,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({ `} disabled={pageIndex >= totalPages - 1} title="Next page" + type="button" onClick={() => handlePageChange(pageIndex + 1)} >
diff --git a/src/webviews/webview-side/dataframe-renderer/index.ts b/src/webviews/webview-side/dataframe-renderer/index.ts index 1fbe32f200..3805171db7 100644 --- a/src/webviews/webview-side/dataframe-renderer/index.ts +++ b/src/webviews/webview-side/dataframe-renderer/index.ts @@ -5,6 +5,7 @@ import * as ReactDOM from 'react-dom'; import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-notebook-renderer'; +import { logErrorMessage, logMessage } from '../react-common/logger'; import { DataframeMetadata, DataframeRenderer } from './DataframeRenderer'; interface Metadata { @@ -18,20 +19,19 @@ interface Metadata { export const activate: ActivationFunction = (context: RendererContext) => { return { renderOutputItem(outputItem: OutputItem, element: HTMLElement) { - console.log('Dataframe renderer - rendering output item:', { outputItem, context }); + logMessage(`Dataframe renderer - rendering output item: ${outputItem.id}`); try { const data = outputItem.json(); - console.log('Dataframe renderer - received data:', data); + logMessage(`Dataframe renderer - received data with ${Object.keys(data).length} keys`); const metadata = outputItem.metadata as Metadata | undefined; - console.log('[DataframeRenderer] Full metadata:', metadata); - console.log('[DataframeRenderer] Full outputItem:', outputItem); + logMessage(`[DataframeRenderer] Full metadata: ${JSON.stringify(metadata)}`); const dataFrameMetadata = metadata?.metadata as DataframeMetadata | undefined; const cellId = metadata?.cellId; const cellIndex = metadata?.cellIndex; - console.log('[DataframeRenderer] Extracted cellId:', cellId, 'cellIndex:', cellIndex); + logMessage(`[DataframeRenderer] Extracted cellId: ${cellId}, cellIndex: ${cellIndex}`); const root = document.createElement('div'); element.appendChild(root); @@ -47,7 +47,7 @@ export const activate: ActivationFunction = (context: RendererContext) root ); } catch (error) { - console.error('Error rendering dataframe:', error); + logErrorMessage(`Error rendering dataframe: ${error}`); const errorDiv = document.createElement('div'); errorDiv.style.padding = '10px'; errorDiv.style.color = 'var(--vscode-errorForeground)'; From 98d7fe65b534758f3c2cd8d7a4d64a50b5f1519d Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Mon, 13 Oct 2025 15:49:36 +0200 Subject: [PATCH 09/21] Update build/esbuild/build.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- build/esbuild/build.ts | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index 48f5e26003..2d4918d02e 100644 --- a/build/esbuild/build.ts +++ b/build/esbuild/build.ts @@ -141,23 +141,30 @@ function style({ onLoad({ filter: /.*/, namespace: 'style-content' }, async (args) => { // Process with PostCSS/Tailwind if enabled and file exists if (enableTailwind && args.path.includes('tailwind.css') && fs.existsSync(args.path)) { - const cssContent = await fs.readFile(args.path, 'utf8'); - const result = await postcss([tailwindcss, autoprefixer]).process(cssContent, { - from: args.path, - to: args.path - }); + try { + const cssContent = await fs.readFile(args.path, 'utf8'); + const result = await postcss([tailwindcss, autoprefixer]).process(cssContent, { + from: args.path, + to: args.path + }); - const options = { ...opt, stdin: { contents: result.css, loader: 'css' } }; - options.loader = options.loader || {}; - // Add the same loaders we add for other places - Object.keys(loader).forEach((key) => { - if (options.loader && !options.loader[key]) { - options.loader[key] = loader[key]; - } - }); - const { errors, warnings, outputFiles } = await esbuild.build(options); - return { errors, warnings, contents: outputFiles![0].text, loader: 'text' }; + const options = { ...opt, stdin: { contents: result.css, loader: 'css' } }; + options.loader = options.loader || {}; + // Add the same loaders we add for other places + Object.keys(loader).forEach((key) => { + if (options.loader && !options.loader[key]) { + options.loader[key] = loader[key]; + } + }); + const { errors, warnings, outputFiles } = await esbuild.build(options); + return { errors, warnings, contents: outputFiles![0].text, loader: 'text' }; + } catch (error) { + console.error(`PostCSS processing failed for ${args.path}:`, error); + throw error; + } } + // …rest of the onLoad handler… + }); // Default behavior for other CSS files const options = { entryPoints: [args.path], ...opt }; From 3a4d57918bc8f598452fed7c459f7bd05e965ee1 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Mon, 13 Oct 2025 16:32:11 +0200 Subject: [PATCH 10/21] feedback --- build/esbuild/build.ts | 14 +++++------ .../deepnoteRequirementsHelper.node.ts | 25 +++++++++++++------ .../dataframe/dataframeController.ts | 23 +++++++++++------ 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index 2d4918d02e..9379d33147 100644 --- a/build/esbuild/build.ts +++ b/build/esbuild/build.ts @@ -141,7 +141,7 @@ function style({ onLoad({ filter: /.*/, namespace: 'style-content' }, async (args) => { // Process with PostCSS/Tailwind if enabled and file exists if (enableTailwind && args.path.includes('tailwind.css') && fs.existsSync(args.path)) { - try { + try { const cssContent = await fs.readFile(args.path, 'utf8'); const result = await postcss([tailwindcss, autoprefixer]).process(cssContent, { from: args.path, @@ -158,13 +158,11 @@ function style({ }); const { errors, warnings, outputFiles } = await esbuild.build(options); return { errors, warnings, contents: outputFiles![0].text, loader: 'text' }; - } catch (error) { - console.error(`PostCSS processing failed for ${args.path}:`, error); - throw error; - } + } catch (error) { + console.error(`PostCSS processing failed for ${args.path}:`, error); + throw error; + } } - // …rest of the onLoad handler… - }); // Default behavior for other CSS files const options = { entryPoints: [args.path], ...opt }; @@ -175,7 +173,9 @@ function style({ options.loader[key] = loader[key]; } }); + const { errors, warnings, outputFiles } = await esbuild.build(options); + return { errors, warnings, contents: outputFiles![0].text, loader: 'text' }; }); } diff --git a/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts b/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts index 9f468bc868..5cae9097ae 100644 --- a/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts +++ b/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts @@ -41,11 +41,15 @@ export class DeepnoteRequirementsHelper implements IDeepnoteRequirementsHelper { return; } - // Validate and normalize requirements: ensure they are valid strings, trim them, and remove empty entries - const normalizedRequirements = requirements - .filter((req) => typeof req === 'string') // Keep only string entries - .map((req) => req.trim()) // Trim whitespace - .filter((req) => req.length > 0); // Remove empty strings + // Validate and normalize requirements: ensure they are valid strings, trim them, remove empty entries, and dedupe + const normalizedRequirements = Array.from( + new Set( + requirements + .filter((req): req is string => typeof req === 'string') // Keep only string entries with type guard + .map((req) => req.trim()) // Trim whitespace + .filter((req) => req.length > 0) // Remove empty strings + ) + ); if (normalizedRequirements.length === 0) { this.logger.info(`No valid requirements found in project ${project.project.id}`); @@ -67,9 +71,12 @@ export class DeepnoteRequirementsHelper implements IDeepnoteRequirementsHelper { // Use Uri.joinPath to build the filesystem path using the Uri API const requirementsPath = Uri.joinPath(workspaceFolders[0].uri, 'requirements.txt').fsPath; - // Convert normalized requirements array to text format + // Convert normalized requirements array to text format (using LF line endings) const requirementsText = normalizedRequirements.join('\n') + '\n'; + // Helper to normalize line endings to LF for comparison + const normalizeLineEndings = (text: string): string => text.replace(/\r\n/g, '\n'); + // Check if requirements.txt already exists const fileExists = await fs.promises .access(requirementsPath) @@ -77,10 +84,12 @@ export class DeepnoteRequirementsHelper implements IDeepnoteRequirementsHelper { .catch(() => false); if (fileExists) { - // Read existing file contents and compare + // Read existing file contents and compare (normalize line endings for comparison) const existingContent = await fs.promises.readFile(requirementsPath, 'utf8'); + const normalizedExistingContent = normalizeLineEndings(existingContent); + const normalizedRequirementsText = normalizeLineEndings(requirementsText); - if (existingContent === requirementsText) { + if (normalizedExistingContent === normalizedRequirementsText) { this.logger.info('requirements.txt already has the correct content, skipping update'); return; } diff --git a/src/webviews/extension-side/dataframe/dataframeController.ts b/src/webviews/extension-side/dataframe/dataframeController.ts index 10f6a40457..5674036bc9 100644 --- a/src/webviews/extension-side/dataframe/dataframeController.ts +++ b/src/webviews/extension-side/dataframe/dataframeController.ts @@ -2,6 +2,7 @@ import { injectable } from 'inversify'; import { commands, env, + l10n, NotebookEdit, NotebookEditor, NotebookRendererMessaging, @@ -86,9 +87,9 @@ export class DataframeController implements IExtensionSyncActivationService { private async handleSelectPageSize(editor: NotebookEditor, message: SelectPageSizeCommand) { if (!message.cellId && message.cellIndex === undefined) { - const errorMessage = - 'Unable to update page size: No cell identifier provided. ' + - 'Please re-run the cell to update the output metadata.'; + const errorMessage = l10n.t( + 'Unable to update page size: No cell identifier provided. Please re-run the cell to update the output metadata.' + ); logger.error(`[DataframeController] ${errorMessage}`); @@ -101,7 +102,10 @@ export class DataframeController implements IExtensionSyncActivationService { const cell = cells.find((c) => c.metadata.id === message.cellId); if (!cell) { - const errorMessage = `Unable to update page size: Could not find the cell with ID ${message.cellId}. The cell may have been deleted.`; + const errorMessage = l10n.t( + 'Unable to update page size: Could not find the cell with ID {0}. The cell may have been deleted.', + message.cellId ?? '' + ); logger.error(`[DataframeController] ${errorMessage}`); @@ -140,9 +144,9 @@ export class DataframeController implements IExtensionSyncActivationService { private async handleGoToPage(editor: NotebookEditor, message: GoToPageCommand) { if (!message.cellId) { - const errorMessage = - 'Unable to navigate to page: No cell identifier provided. ' + - 'Please re-run the cell to update the output metadata.'; + const errorMessage = l10n.t( + 'Unable to navigate to page: No cell identifier provided. Please re-run the cell to update the output metadata.' + ); logger.error(`[DataframeController] ${errorMessage}`); @@ -155,7 +159,10 @@ export class DataframeController implements IExtensionSyncActivationService { const cell = cells.find((c) => c.metadata.id === message.cellId); if (!cell) { - const errorMessage = `Unable to navigate to page: Could not find the cell with ID ${message.cellId}. The cell may have been deleted.`; + const errorMessage = l10n.t( + 'Unable to navigate to page: Could not find the cell with ID {0}. The cell may have been deleted.', + message.cellId ?? '' + ); logger.error(`[DataframeController] ${errorMessage}`); From 4fa78e28dd778c5f8c469c00df1ccb261daad23b Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 11:49:08 +0200 Subject: [PATCH 11/21] docs and metadata changes. --- build/esbuild/build.ts | 2 +- .../execution/cellExecutionMessageHandler.ts | 19 +- src/kernels/execution/helpers.ts | 64 +- src/notebooks/deepnote/blocks.md | 628 ++++++++++++++++++ .../deepnote/deepnoteDataConverter.ts | 45 +- src/notebooks/deepnote/pocket.ts | 12 +- src/notebooks/deepnote/serialization.md | 305 --------- .../dataframe-renderer/DataframeRenderer.tsx | 25 +- .../webview-side/dataframe-renderer/index.ts | 11 +- 9 files changed, 735 insertions(+), 376 deletions(-) create mode 100644 src/notebooks/deepnote/blocks.md delete mode 100644 src/notebooks/deepnote/serialization.md diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index 9379d33147..80f4393b80 100644 --- a/build/esbuild/build.ts +++ b/build/esbuild/build.ts @@ -327,7 +327,7 @@ async function buildAll() { build( path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'dataframe-renderer', 'index.ts'), path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'dataframeRenderer', 'dataframeRenderer.js'), - { target: 'web', watch: watchAll } + { target: 'web', watch: isWatchMode } ), build( path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'variable-view', 'index.tsx'), diff --git a/src/kernels/execution/cellExecutionMessageHandler.ts b/src/kernels/execution/cellExecutionMessageHandler.ts index 5d881fe40d..b914f3282c 100644 --- a/src/kernels/execution/cellExecutionMessageHandler.ts +++ b/src/kernels/execution/cellExecutionMessageHandler.ts @@ -644,7 +644,8 @@ export class CellExecutionMessageHandler implements IDisposable { } // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id const cellId = getCellId(this.cell); - const cellOutput = cellOutputToVSCCellOutput(output, this.cell.index, cellId); + const cellMetadata = this.cell.metadata || {}; + const cellOutput = cellOutputToVSCCellOutput(output, this.cell.index, cellId, cellMetadata); const displayId = 'transient' in output && typeof output.transient === 'object' && @@ -1015,6 +1016,7 @@ export class CellExecutionMessageHandler implements IDisposable { if (this.lastUsedStreamOutput?.stream === msg.content.name) { // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id const cellId = getCellId(this.cell); + const cellMetadata = this.cell.metadata || {}; const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1022,7 +1024,8 @@ export class CellExecutionMessageHandler implements IDisposable { text: msg.content.text }, this.cell.index, - cellId + cellId, + cellMetadata ); traceCellMessage(this.cell, `Append output items '${msg.content.text.substring(0, 100)}`); task?.appendOutputItems(output.items, this.lastUsedStreamOutput.output).then(noop, noop); @@ -1031,6 +1034,7 @@ export class CellExecutionMessageHandler implements IDisposable { const text = concatMultilineString(msg.content.text); // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id const cellId = getCellId(this.cell); + const cellMetadata = this.cell.metadata || {}; const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1038,7 +1042,8 @@ export class CellExecutionMessageHandler implements IDisposable { text }, this.cell.index, - cellId + cellId, + cellMetadata ); this.lastUsedStreamOutput = { output, stream: msg.content.name }; traceCellMessage(this.cell, `Replace output with '${text.substring(0, 100)}'`); @@ -1048,6 +1053,7 @@ export class CellExecutionMessageHandler implements IDisposable { const text = formatStreamText(concatMultilineString(msg.content.text)); // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id const cellId = getCellId(this.cell); + const cellMetadata = this.cell.metadata || {}; const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1055,7 +1061,8 @@ export class CellExecutionMessageHandler implements IDisposable { text }, this.cell.index, - cellId + cellId, + cellMetadata ); this.lastUsedStreamOutput = { output, stream: msg.content.name }; traceCellMessage(this.cell, `Append new output '${text.substring(0, 100)}'`); @@ -1176,6 +1183,7 @@ export class CellExecutionMessageHandler implements IDisposable { ); // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id const cellId = getCellId(outputToBeUpdated.cell); + const cellMetadata = outputToBeUpdated.cell.metadata || {}; const newOutput = cellOutputToVSCCellOutput( { ...output, @@ -1183,7 +1191,8 @@ export class CellExecutionMessageHandler implements IDisposable { metadata: msg.content.metadata } as nbformat.IDisplayData, outputToBeUpdated.cell.index, - cellId + cellId, + cellMetadata ); // If there was no output and still no output, then nothing to do. if (outputToBeUpdated.outputItems.length === 0 && newOutput.items.length === 0) { diff --git a/src/kernels/execution/helpers.ts b/src/kernels/execution/helpers.ts index 1bade6f212..39f2a5b801 100644 --- a/src/kernels/execution/helpers.ts +++ b/src/kernels/execution/helpers.ts @@ -117,7 +117,12 @@ export function traceCellMessage(cell: NotebookCell, message: string | (() => st const cellOutputMappers = new Map< nbformat.OutputType, - (output: nbformat.IOutput, cellIndex?: number, cellId?: string) => NotebookCellOutput + ( + output: nbformat.IOutput, + cellIndex?: number, + cellId?: string, + cellMetadata?: Record + ) => NotebookCellOutput >(); // eslint-disable-next-line @typescript-eslint/no-explicit-any cellOutputMappers.set('display_data', translateDisplayDataOutput as any); @@ -132,7 +137,8 @@ cellOutputMappers.set('update_display_data', translateDisplayDataOutput as any); export function cellOutputToVSCCellOutput( output: nbformat.IOutput, cellIndex?: number, - cellId?: string + cellId?: string, + cellMetadata?: Record ): NotebookCellOutput { /** * Stream, `application/x.notebook.stream` @@ -160,29 +166,39 @@ export function cellOutputToVSCCellOutput( const fn = cellOutputMappers.get(output.output_type as nbformat.OutputType); let result: NotebookCellOutput; if (fn) { - result = fn(output, cellIndex, cellId); + result = fn(output, cellIndex, cellId, cellMetadata); } else { logger.warn(`Unable to translate cell from ${output.output_type} to NotebookCellData for VS Code.`); // eslint-disable-next-line @typescript-eslint/no-explicit-any - result = translateDisplayDataOutput(output as any, cellIndex, cellId); + result = translateDisplayDataOutput(output as any, cellIndex, cellId, cellMetadata); } return result; } -function getOutputMetadata(output: nbformat.IOutput, cellIndex?: number, cellId?: string): CellOutputMetadata { - // Add on transient data if we have any. This should be removed by our save functions elsewhere. +function getOutputMetadata( + output: nbformat.IOutput, + cellIndex?: number, + cellId?: string, + cellMetadata?: Record +): CellOutputMetadata { + // Merge in order: cellId, cellMetadata, cellIndex, then output-specific metadata (output metadata wins conflicts) const metadata: CellOutputMetadata = { outputType: output.output_type }; - if (cellIndex !== undefined) { - metadata.cellIndex = cellIndex; - } - if (cellId) { metadata.cellId = cellId; } + // Merge cell metadata next (block-level metadata from Deepnote) + if (cellMetadata) { + Object.assign(metadata, cellMetadata); + } + + if (cellIndex !== undefined) { + metadata.cellIndex = cellIndex; + } + if (output.transient) { // eslint-disable-next-line @typescript-eslint/no-explicit-any metadata.transient = output.transient as any; @@ -193,7 +209,10 @@ function getOutputMetadata(output: nbformat.IOutput, cellIndex?: number, cellId? case 'execute_result': case 'update_display_data': { metadata.executionCount = output.execution_count; - metadata.metadata = output.metadata ? JSON.parse(JSON.stringify(output.metadata)) : {}; + // Output metadata is merged last so it overrides block metadata + if (output.metadata) { + Object.assign(metadata, output.metadata); + } break; } default: @@ -218,7 +237,8 @@ export function getNotebookCellOutputMetadata(output: { function translateDisplayDataOutput( output: nbformat.IDisplayData | nbformat.IDisplayUpdate | nbformat.IExecuteResult, cellIndex?: number, - cellId?: string + cellId?: string, + cellMetadata?: Record ): NotebookCellOutput { // Metadata could be as follows: // We'll have metadata specific to each mime type as well as generic metadata. @@ -237,7 +257,7 @@ function translateDisplayDataOutput( } } */ - const metadata = getOutputMetadata(output, cellIndex, cellId); + const metadata = getOutputMetadata(output, cellIndex, cellId, cellMetadata); // If we have SVG or PNG, then add special metadata to indicate whether to display `open plot` if ('image/svg+xml' in output.data || 'image/png' in output.data) { metadata.__displayOpenPlotIcon = true; @@ -253,10 +273,15 @@ function translateDisplayDataOutput( return new NotebookCellOutput(sortOutputItemsBasedOnDisplayOrder(items), metadata); } -function translateStreamOutput(output: nbformat.IStream, cellIndex?: number, cellId?: string): NotebookCellOutput { +function translateStreamOutput( + output: nbformat.IStream, + cellIndex?: number, + cellId?: string, + cellMetadata?: Record +): NotebookCellOutput { const value = concatMultilineString(output.text); const factoryFn = output.name === 'stderr' ? NotebookCellOutputItem.stderr : NotebookCellOutputItem.stdout; - return new NotebookCellOutput([factoryFn(value)], getOutputMetadata(output, cellIndex, cellId)); + return new NotebookCellOutput([factoryFn(value)], getOutputMetadata(output, cellIndex, cellId, cellMetadata)); } // Output stream can only have stderr or stdout so just check the first output. Undefined if no outputs @@ -568,7 +593,12 @@ export function translateCellDisplayOutput(output: NotebookCellOutput): JupyterO * As we're displaying the error in the statusbar, we don't want this dup error in output. * Hence remove this. */ -function translateErrorOutput(output?: nbformat.IError, cellIndex?: number, cellId?: string): NotebookCellOutput { +function translateErrorOutput( + output?: nbformat.IError, + cellIndex?: number, + cellId?: string, + cellMetadata?: Record +): NotebookCellOutput { output = output || { output_type: 'error', ename: '', evalue: '', traceback: [] }; return new NotebookCellOutput( [ @@ -578,7 +608,7 @@ function translateErrorOutput(output?: nbformat.IError, cellIndex?: number, cell stack: (output?.traceback || []).join('\n') }) ], - { ...getOutputMetadata(output, cellIndex, cellId), originalError: output } + { ...getOutputMetadata(output, cellIndex, cellId, cellMetadata), originalError: output } ); } diff --git a/src/notebooks/deepnote/blocks.md b/src/notebooks/deepnote/blocks.md new file mode 100644 index 0000000000..6dbafc1bc1 --- /dev/null +++ b/src/notebooks/deepnote/blocks.md @@ -0,0 +1,628 @@ +# Deepnote Blocks Architecture + +This document explains how blocks work in the VSCode Deepnote extension. Blocks are the fundamental units of content in Deepnote notebooks, and understanding their lifecycle is crucial for working with this extension. + +## Overview: Three Representations + +Every Deepnote block exists in **three different representations** as it moves through the system: + +1. **File Storage** - The block as stored in the `.deepnote` YAML file +2. **Editor Representation** - The block as a VS Code `NotebookCell` in the editor +3. **Kernel Execution** - The block converted to executable Python code + +Understanding how data flows between these representations is key to working with this extension. + +``` +┌─────────────────┐ +│ .deepnote File │ +│ (YAML format) │ +└────────┬────────┘ + │ Deserialize (serializer) + ▼ +┌─────────────────┐ +│ VS Code Cell │ +│ (with pocket) │ +└────────┬────────┘ + │ Execute (cellExecution) + ▼ +┌─────────────────┐ +│ Python Code │ +│ (via blocks) │ +└─────────────────┘ +``` + +## Representation 1: File Storage + +Blocks are stored in `.deepnote` YAML files with this structure: + +```yaml +project: + notebooks: + - id: 'notebook-uuid' + name: 'My Notebook' + blocks: + - id: 'block-uuid' + type: 'code' + content: "df = pd.DataFrame({'a': [1, 2, 3]})\ndf" + sortingKey: '001' + blockGroup: 'default-group' + executionCount: 1 + metadata: + table_state_spec: '{"pageSize": 25, "pageIndex": 0}' + outputs: + - output_type: 'execute_result' + execution_count: 1 + data: + application/vnd.deepnote.dataframe.v3+json: + column_count: 1 + row_count: 3 + metadata: + table_state_spec: '{"pageSize": 25}' +``` + +Key fields in a block: +- `id` - Unique identifier +- `type` - Block type (code, text-cell-h1, markdown, etc.) +- `content` - The actual code or text content +- `sortingKey` - Controls block order +- `blockGroup` - Groups related blocks +- `metadata` - Arbitrary metadata (e.g., table state, input options) +- `outputs` - Execution outputs with their own metadata + +**File:** `src/notebooks/deepnote/deepnoteTypes.ts:1-15` + +The `DeepnoteBlock` type is defined in `@deepnote/blocks` package and includes all these fields. + +## Representation 2: Editor Representation + +When a `.deepnote` file is opened, blocks are converted to VS Code `NotebookCellData` objects. This happens in the **serializer** and **data converter**. + +### The Conversion Process + +**File:** `src/notebooks/deepnote/deepnoteDataConverter.ts:30-61` + +```typescript +convertBlocksToCells(blocks: DeepnoteBlock[]): NotebookCellData[] { + return blocks.map((block, index) => { + const converter = this.registry.findConverter(block.type); + const cell = converter.convertToCell(block); + + // Store Deepnote fields in metadata + cell.metadata = { + ...block.metadata, + id: block.id, + type: block.type, + sortingKey: block.sortingKey, + blockGroup: block.blockGroup, + executionCount: block.executionCount, + outputs: block.outputs + }; + + // Move Deepnote-specific fields to pocket + addPocketToCellMetadata(cell); + + cell.outputs = this.transformOutputsForVsCode(block.outputs || [], ...); + + return cell; + }); +} +``` + +### The Pocket System + +The **pocket** is a special metadata field (`__deepnotePocket`) that stores Deepnote-specific data that doesn't map to VS Code's notebook format. This allows round-trip conversion without data loss. + +**File:** `src/notebooks/deepnote/pocket.ts:6-18` + +```typescript +// These fields are moved into the pocket during editing +const deepnoteBlockSpecificFields = ['blockGroup', 'executionCount', 'sortingKey', 'type']; + +export interface Pocket { + blockGroup?: string; + executionCount?: number; + sortingKey?: string; + type?: string; +} +``` + +**Important:** The `id` and `outputs` fields are **NOT** in the pocket: +- `id` stays at the top level of `cell.metadata` because it's needed at runtime for cell identification during execution +- `outputs` are managed natively by VS Code through `cell.outputs`, so there's no need to store them in the pocket + +**File:** `src/notebooks/deepnote/pocket.ts:20-42` + +The `addPocketToCellMetadata()` function: +1. Takes Deepnote-specific fields from cell metadata +2. Moves them into `cell.metadata.__deepnotePocket` +3. Leaves `id` at the top level for runtime access + +Example of a cell after pocket conversion: + +```typescript +{ + kind: NotebookCellKind.Code, + value: "df = pd.DataFrame({'a': [1, 2, 3]})\ndf", + languageId: 'python', + metadata: { + id: 'block-uuid', // Stays at top level! + table_state_spec: '{"pageSize": 25, "pageIndex": 0}', + __deepnotePocket: { + type: 'code', + sortingKey: '001', + blockGroup: 'default-group', + executionCount: 1 + } + }, + outputs: [...] // Managed by VS Code, not in pocket +} +``` + +### Saving Back to File + +When saving, the process reverses: + +**File:** `src/notebooks/deepnote/deepnoteDataConverter.ts:69-88` + +```typescript +convertCellsToBlocks(cells: NotebookCellData[]): DeepnoteBlock[] { + return cells.map((cell, index) => { + // Restore block from pocket + const block = createBlockFromPocket(cell, index); + + const converter = this.registry.findConverter(block.type); + converter.applyChangesToBlock(block, cell); + + return block; + }); +} +``` + +**File:** `src/notebooks/deepnote/pocket.ts:48-79` + +The `createBlockFromPocket()` function: +1. Extracts the pocket from `cell.metadata.__deepnotePocket` +2. Gets `id` from top-level metadata +3. Removes pocket and Deepnote fields from metadata +4. Reconstructs a clean `DeepnoteBlock` with all fields in the right places +5. Outputs are handled separately via `cell.outputs` (not from pocket) + +## Block Converters + +Different block types need different conversion logic. The extension uses a **converter pattern** with specialized converters for each block type. + +**File:** `src/notebooks/deepnote/converters/converterRegistry.ts` + +Each converter implements: +- `canConvert(blockType)` - Returns true if it handles this type +- `convertToCell(block)` - Block → Cell +- `applyChangesToBlock(block, cell)` - Cell changes → Block + +### Code Block Converter + +**File:** `src/notebooks/deepnote/converters/codeBlockConverter.ts:6-24` + +```typescript +export class CodeBlockConverter implements BlockConverter { + canConvert(blockType: string): boolean { + return blockType.toLowerCase() === 'code'; + } + + convertToCell(block: DeepnoteBlock): NotebookCellData { + return new NotebookCellData( + NotebookCellKind.Code, + block.content || '', + 'python' + ); + } + + applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void { + block.content = cell.value || ''; + } +} +``` + +Simple: just moves the content between block and cell. + +### Text Block Converter + +**File:** `src/notebooks/deepnote/converters/textBlockConverter.ts:7-51` + +Text blocks (headings, bullets, todos, etc.) use the `@deepnote/blocks` package to convert between plain text and markdown: + +```typescript +export class TextBlockConverter implements BlockConverter { + protected static readonly textBlockTypes = [ + 'text-cell-h1', 'text-cell-h2', 'text-cell-h3', + 'text-cell-p', 'text-cell-bullet', 'text-cell-todo', + 'text-cell-callout', 'separator' + ]; + + convertToCell(block: DeepnoteBlock): NotebookCellData { + // Convert Deepnote text block to markdown for VS Code + const markdown = createMarkdown(block); + return new NotebookCellData(NotebookCellKind.Markup, markdown, 'markdown'); + } + + applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void { + // Convert markdown back to plain text for Deepnote + block.content = cell.value || ''; + const textValue = stripMarkdown(block); + block.content = textValue; + } +} +``` + +This is crucial: **text blocks are stored as plain text in .deepnote files but displayed as markdown in VS Code**. + +## Representation 3: Kernel Execution + +When a cell is executed, it's converted back to a `DeepnoteBlock` and then transformed into executable Python code. + +**File:** `src/kernels/execution/cellExecution.ts:411-423` + +```typescript +private async execute(code: string, session: IKernelSession) { + // Convert NotebookCell to Deepnote block + const cellData = { + kind: this.cell.kind, + value: this.cell.document.getText(), + languageId: this.cell.document.languageId, + metadata: this.cell.metadata, + outputs: [...(this.cell.outputs || [])] + }; + const deepnoteBlock = createBlockFromPocket(cellData, this.cell.index); + + // Use createPythonCode to generate executable code + code = createPythonCode(deepnoteBlock); + + // Send to kernel... +} +``` + +### The `createPythonCode()` Function + +**File:** `node_modules/@deepnote/blocks/dist/index.d.ts:85-87` + +```typescript +declare function createPythonCode( + block: DeepnoteBlock, + executionContext?: ButtonExecutionContext +): string; +``` + +This function from the `@deepnote/blocks` package converts a block into executable Python code. It handles: +- Regular code blocks - returns content as-is +- Input blocks - generates code to create variables based on metadata +- Chart blocks - generates plotting code +- SQL blocks - generates code to run queries +- Button blocks - generates callback code + +The key insight: **Different block types generate different Python code**, even though they all start from the same `DeepnoteBlock` structure. + +## Metadata Flow for Output Rendering + +One of the most important features is how block metadata flows through to outputs so custom renderers can use it. + +### Generating Outputs with Metadata + +**File:** `src/kernels/execution/helpers.ts:188-217` + +When execution produces an output, we attach metadata: + +```typescript +function getOutputMetadata( + output: nbformat.IOutput, + cellId: string | undefined, + cellIndex: number, + blockMetadata: Record | undefined +): Record { + const metadata: Record = {}; + + if (cellId) { + metadata.cellId = cellId; + } + + // Merge block metadata (contains table_state_spec, etc.) + if (blockMetadata) { + Object.assign(metadata, blockMetadata); + } + + metadata.cellIndex = cellIndex; + + // For execute_result/display_data, add execution count and merge output metadata + if (output.output_type === 'execute_result' || output.output_type === 'display_data') { + metadata.executionCount = output.execution_count; + + // Output metadata wins conflicts (merged last) + if (output.metadata) { + Object.assign(metadata, output.metadata); + } + } + + return metadata; +} +``` + +Merge order is critical: +1. `cellId` (from block) +2. `blockMetadata` (from block.metadata - includes table_state_spec) +3. `cellIndex` (current position) +4. `executionCount` (from output) +5. `output.metadata` (wins conflicts) + +### Custom Renderers + +Custom renderers receive this metadata and use it to display outputs correctly. + +**File:** `src/webviews/webview-side/dataframe-renderer/index.ts:10-45` + +The dataframe renderer receives metadata: + +```typescript +interface Metadata { + cellId?: string; + cellIndex?: number; + executionCount: number; + metadata?: DataframeMetadata; // Contains table_state_spec! + outputType: string; +} + +export const activate: ActivationFunction = (context) => { + return { + renderOutputItem(outputItem: OutputItem, element: HTMLElement) { + const data = outputItem.json(); + const metadata = outputItem.metadata as Metadata | undefined; + + const dataFrameMetadata = metadata?.metadata as DataframeMetadata | undefined; + const cellId = metadata?.cellId; + const cellIndex = metadata?.cellIndex; + + ReactDOM.render( + React.createElement(DataframeRenderer, { + context, + data, + metadata: dataFrameMetadata, // Has table_state_spec + cellId, + cellIndex + }), + root + ); + } + }; +}; +``` + +**File:** `src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx:68-70` + +The renderer uses `table_state_spec` to initialize pagination: + +```typescript +const tableState = useMemo((): TableState => + JSON.parse(metadata?.table_state_spec || '{}'), + [metadata] +); +const [pageSize, setPageSize] = useState(tableState.pageSize || 10); +const [pageIndex, setPageIndex] = useState(tableState.pageIndex || 0); +``` + +### Interactive Updates + +When the user changes page size or navigates pages, the renderer sends a message back to the extension: + +**File:** `src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx:82-98` + +```typescript +const handlePageSizeChange = (event: React.ChangeEvent) => { + const newPageSize = Number(event.target.value); + setPageSize(newPageSize); + + context.postMessage?.({ + command: 'selectPageSize', + cellId, + size: newPageSize + }); +}; +``` + +**File:** `src/webviews/extension-side/dataframe/dataframeController.ts:88-143` + +The controller receives the message and re-executes the cell with updated metadata: + +```typescript +private async handleSelectPageSize(editor: NotebookEditor, message: SelectPageSizeCommand) { + const cell = editor.notebook.getCells().find(c => c.metadata.id === message.cellId); + + // Update table state in cell metadata + const updatedTableState = { + ...cell.metadata.deepnote_table_state, + pageSize: message.size + }; + + const edit = NotebookEdit.updateCellMetadata(cell.index, { + ...cell.metadata, + deepnote_table_state: updatedTableState + }); + + await workspace.applyEdit(edit); + + // Re-execute to apply new page size + await commands.executeCommand('notebook.cell.execute', { + ranges: [{ start: cell.index, end: cell.index + 1 }] + }); +} +``` + +This creates a loop: +1. Block metadata → Cell metadata → Output metadata → Renderer +2. User interaction → Controller → Cell metadata update → Re-execution +3. Back to step 1 + +## Complete Example: Big Number Block Lifecycle + +Let's walk through the complete lifecycle of a "big number block" - a Deepnote block type that displays a large numeric value with optional comparison. + +### 1. File Storage + +In the `.deepnote` file: + +```yaml +blocks: + - id: 'big-number-block-uuid' + type: 'big-number' + content: '' + sortingKey: '001' + blockGroup: 'default-group' + metadata: + deepnote_big_number_title: 'Customers' + deepnote_big_number_value: 'customers' + deepnote_big_number_format: 'number' + deepnote_big_number_comparison_type: '' + deepnote_big_number_comparison_title: '' + deepnote_big_number_comparison_value: '' + deepnote_big_number_comparison_format: '' + deepnote_big_number_comparison_enabled: false +``` + +The metadata contains all the big number configuration. + +### 2. Editor Representation + +When opened in VS Code, the block becomes a cell with JSON content showing the configuration: + +```typescript +{ + kind: NotebookCellKind.Code, + value: JSON.stringify({ + title: 'Customers', + value: 'customers', + format: 'number', + comparison_type: '', + comparison_title: '', + comparison_value: '', + comparison_format: '', + comparison_enabled: false + }, null, 2), + languageId: 'python', + metadata: { + id: 'big-number-block-uuid', + deepnote_big_number_title: 'Customers', + deepnote_big_number_value: 'customers', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: '', + deepnote_big_number_comparison_title: '', + deepnote_big_number_comparison_value: '', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: false, + __deepnotePocket: { + type: 'big-number', + sortingKey: '001', + blockGroup: 'default-group' + } + } +} +``` + +**The user sees JSON content** displaying the block's configuration, not an empty cell. This provides visibility into what the block represents while preserving all configuration in metadata. + +### 3. Kernel Execution + +When executed, `createPythonCode(deepnoteBlock)` generates Python code based on the metadata: + +```python +# Generated from big number block metadata +# Evaluates the 'customers' variable and displays it +_deepnote_big_number_result = _dntk.execute_big_number({ + "id": 'big-number-block-uuid', + "deepnote_big_number_title": 'Customers', + "deepnote_big_number_value": 'customers', + "deepnote_big_number_format": 'number', + "deepnote_big_number_comparison_type": '', + "deepnote_big_number_comparison_title": '', + "deepnote_big_number_comparison_value": '', + "deepnote_big_number_comparison_format": '', + "deepnote_big_number_comparison_enabled": false, +}) + +_deepnote_big_number_result +``` + +The block's metadata is used to generate Python code that evaluates the variable and creates a display output! + +### 4. Output Rendering + +When executed, the output includes block metadata for the custom renderer: + +```typescript +{ + items: [ + NotebookCellOutputItem.json({ + title: "Customers", + value: 1523, + format: "number" + }, 'application/vnd.deepnote.big-number') + ], + metadata: { + cellId: 'big-number-block-uuid', + cellIndex: 0, + deepnote_big_number_title: 'Customers', + deepnote_big_number_value: 'customers', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_enabled: false + } +} +``` + +A custom renderer uses this metadata to display a large, formatted number with the title "Customers" showing "1,523". + +### 5. Saving Changes + +When the user saves the notebook: + +1. `createBlockFromPocket()` extracts fields from the pocket +2. The converter's `applyChangesToBlock()` updates the block content +3. Block metadata remains unchanged +4. The serializer writes back to the `.deepnote` file + +All the input configuration survives the round trip! + +## Key Takeaways + +1. **Three Representations**: Blocks exist as YAML in files, as cells in the editor, and as Python code in the kernel. + +2. **The Pocket**: Deepnote-specific fields (blockGroup, executionCount, sortingKey, type) are stored in `__deepnotePocket` during editing to keep cell metadata clean. The `id` stays at the top level for runtime access, and `outputs` are managed natively by VS Code. + +3. **Converters**: Different block types have specialized converters. Text blocks are stored as plain text but displayed as markdown. + +4. **Code Generation**: `createPythonCode()` from `@deepnote/blocks` transforms blocks into executable Python based on their type and metadata. + +5. **Metadata Flow**: Block metadata flows through to outputs (cellId → blockMetadata → cellIndex → executionCount → output.metadata) so custom renderers can use it. + +6. **Round-Trip Preservation**: The pocket system and converters ensure no data is lost when converting between representations. + +7. **Interactive Outputs**: Custom renderers can send messages back to update cell metadata and trigger re-execution, creating interactive experiences. + +## Related Files + +- **Serialization**: `src/notebooks/deepnote/deepnoteSerializer.ts` +- **Data Conversion**: `src/notebooks/deepnote/deepnoteDataConverter.ts` +- **Pocket System**: `src/notebooks/deepnote/pocket.ts` +- **Converters**: `src/notebooks/deepnote/converters/` +- **Execution**: `src/kernels/execution/cellExecution.ts` +- **Metadata Handling**: `src/kernels/execution/helpers.ts` +- **Custom Renderers**: `src/webviews/webview-side/dataframe-renderer/` +- **Renderer Controllers**: `src/webviews/extension-side/dataframe/` + +## Adding Support for New Block Types + +To add support for a new Deepnote block type: + +1. **Create a converter** in `src/notebooks/deepnote/converters/` implementing `BlockConverter` +2. **Register it** in `DeepnoteDataConverter` constructor +3. **Implement conversion logic**: + - `convertToCell()` - How to display in VS Code + - `applyChangesToBlock()` - How to save changes back +4. **Ensure metadata preservation** - Store configuration in `block.metadata` +5. **The `@deepnote/blocks` package** handles code generation - no changes needed unless you're modifying that package + +The architecture is designed to make adding new block types straightforward while preserving all data through the entire lifecycle. diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index 15b659787f..bac30fdee3 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -47,14 +47,13 @@ export class DeepnoteDataConverter { type: block.type, sortingKey: block.sortingKey, ...(blockWithOptionalFields.blockGroup && { blockGroup: blockWithOptionalFields.blockGroup }), - ...(block.executionCount !== undefined && { executionCount: block.executionCount }), - ...(block.outputs !== undefined && { outputs: block.outputs }) + ...(block.executionCount !== undefined && { executionCount: block.executionCount }) }; // The pocket is a place to tuck away Deepnote-specific fields for later. addPocketToCellMetadata(cell); - cell.outputs = this.transformOutputsForVsCode(block.outputs || [], index, block.id); + cell.outputs = this.transformOutputsForVsCode(block.outputs || [], index, block.id, block.metadata); return cell; }); @@ -78,7 +77,8 @@ export class DeepnoteDataConverter { converter.applyChangesToBlock(block, cell); - // If pocket didn't have outputs, but cell does, convert VS Code outputs to Deepnote format + // Convert VS Code outputs to Deepnote format + // Outputs are managed by VS Code natively, not stored in the pocket if (!block.outputs && cell.outputs && cell.outputs.length > 0) { block.outputs = this.transformOutputsForDeepnote(cell.outputs); } @@ -205,7 +205,8 @@ export class DeepnoteDataConverter { private transformOutputsForVsCode( outputs: DeepnoteOutput[], cellIndex: number, - cellId: string + cellId: string, + blockMetadata?: Record ): NotebookCellOutput[] { return outputs.map((output) => { if ('output_type' in output) { @@ -217,9 +218,10 @@ export class DeepnoteDataConverter { stack: errorOutput.traceback ? errorOutput.traceback.join('\n') : '' }; - const metadata = { - cellIndex, - cellId + const metadata: Record = { + cellId, + ...blockMetadata, + cellIndex }; return new NotebookCellOutput([NotebookCellOutputItem.error(error)], metadata); @@ -283,9 +285,11 @@ export class DeepnoteDataConverter { } // Preserve metadata and execution_count + // Merge in order: cellId, blockMetadata, cellIndex, executionCount, then output.metadata (wins conflicts) const metadata: Record = { - cellIndex, - cellId + cellId, + ...blockMetadata, + cellIndex }; if (output.execution_count !== undefined) { @@ -309,9 +313,10 @@ export class DeepnoteDataConverter { ? 'application/vnd.code.notebook.stderr' : 'application/vnd.code.notebook.stdout'; - const metadata = { - cellIndex, - cellId + const metadata: Record = { + cellId, + ...blockMetadata, + cellIndex }; return new NotebookCellOutput( @@ -322,9 +327,10 @@ export class DeepnoteDataConverter { // Unknown output type - return as text if available if ('text' in output && output.text) { - const metadata = { - cellIndex, - cellId + const metadata: Record = { + cellId, + ...blockMetadata, + cellIndex }; return new NotebookCellOutput( @@ -339,9 +345,10 @@ export class DeepnoteDataConverter { // Fallback for outputs without output_type but with text if ('text' in output && output.text) { - const metadata = { - cellIndex, - cellId + const metadata: Record = { + cellId, + ...blockMetadata, + cellIndex }; return new NotebookCellOutput( diff --git a/src/notebooks/deepnote/pocket.ts b/src/notebooks/deepnote/pocket.ts index f46f6bc896..02e7a3963f 100644 --- a/src/notebooks/deepnote/pocket.ts +++ b/src/notebooks/deepnote/pocket.ts @@ -1,18 +1,18 @@ import type { NotebookCellData } from 'vscode'; -import type { DeepnoteBlock, DeepnoteOutput } from './deepnoteTypes'; +import type { DeepnoteBlock } from './deepnoteTypes'; import { generateBlockId, generateSortingKey } from './dataConversionUtils'; // Note: 'id' is intentionally excluded from this list so it remains at the top level of cell.metadata // The id field is needed at runtime for cell identification during execution -const deepnoteBlockSpecificFields = ['blockGroup', 'executionCount', 'outputs', 'sortingKey', 'type'] as const; +// Note: 'outputs' is also excluded because VS Code manages outputs natively through cell.outputs +const deepnoteBlockSpecificFields = ['blockGroup', 'executionCount', 'sortingKey', 'type'] as const; // Stores extra Deepnote-specific fields for each block that are not part of the standard VSCode NotebookCellData structure. -// Note: 'id' is not in the pocket - it stays at the top level of cell.metadata for runtime access +// Note: 'id' and 'outputs' are not in the pocket - they are managed by VS Code natively export interface Pocket { blockGroup?: string; executionCount?: number; - outputs?: DeepnoteOutput[]; sortingKey?: string; type?: string; } @@ -76,9 +76,5 @@ export function createBlockFromPocket(cell: NotebookCellData, index: number): De block.executionCount = pocket.executionCount; } - if (pocket?.outputs !== undefined) { - block.outputs = pocket.outputs; - } - return block; } diff --git a/src/notebooks/deepnote/serialization.md b/src/notebooks/deepnote/serialization.md deleted file mode 100644 index b4f25644b0..0000000000 --- a/src/notebooks/deepnote/serialization.md +++ /dev/null @@ -1,305 +0,0 @@ -# Deepnote Serialization Architecture - -This document explains how Deepnote notebooks are serialized and deserialized between the Deepnote YAML format and VS Code's notebook format. - -## Overview - -The serialization system converts Deepnote blocks to VS Code cells and vice versa while preserving all Deepnote-specific metadata. This is accomplished through a converter pattern and a "pocket" system for storing extra data. - -## Key Concepts - -### The Pocket System - -The **pocket** is a special metadata field (`__deepnotePocket`) that stores Deepnote-specific block information that doesn't have a direct equivalent in VS Code's notebook format. This ensures perfect round-trip conversion without data loss. - -Pocket fields include: -- `id`: Deepnote block ID -- `type`: Deepnote block type (e.g., 'code', 'markdown', 'text-cell-h1') -- `sortingKey`: Deepnote sorting key for block ordering -- `executionCount`: Execution count for code blocks -- `outputs`: Original Deepnote outputs (for round-trip preservation) -- `blockGroup`: Deepnote block group identifier - -### The Converter Pattern - -Each Deepnote block type has a corresponding converter that knows how to: -1. Convert a Deepnote block to a VS Code cell (`convertToCell`) -2. Apply changes from a VS Code cell back to a Deepnote block (`applyChangesToBlock`) - -Converters are registered in a `ConverterRegistry` and retrieved based on block type. - -## Serialization Flow (Deepnote → VS Code) - -When opening a Deepnote notebook in VS Code: - -```text -Deepnote YAML File - ↓ -Parse YAML (js-yaml) - ↓ -Extract blocks from selected notebook - ↓ -For each block: - 1. Find converter for block.type - 2. converter.convertToCell(block) → creates VS Code cell - 3. Store Deepnote fields in cell.metadata - 4. addPocketToCellMetadata(cell) → moves fields to __deepnotePocket - 5. transformOutputsForVsCode(block.outputs) → convert outputs - ↓ -VS Code NotebookData with cells -``` - -**Key functions:** -- `deepnoteDataConverter.ts::convertBlocksToCells(blocks)` - Main entry point -- `pocket.ts::addPocketToCellMetadata(cell)` - Creates the pocket -- `deepnoteDataConverter.ts::transformOutputsForVsCode(outputs)` - Converts outputs - -## Deserialization Flow (VS Code → Deepnote) - -When saving a notebook in VS Code: - -```text -VS Code NotebookData with cells - ↓ -For each cell: - 1. createBlockFromPocket(cell, index) → creates base block - 2. Find converter for block.type - 3. converter.applyChangesToBlock(block, cell) → updates content - 4. If needed: transformOutputsForDeepnote(cell.outputs) → convert new outputs - ↓ -Array of Deepnote blocks - ↓ -Update project YAML structure - ↓ -Serialize to YAML (js-yaml) - ↓ -Deepnote YAML File -``` - -**Key functions:** -- `deepnoteDataConverter.ts::convertCellsToBlocks(cells)` - Main entry point -- `pocket.ts::createBlockFromPocket(cell, index)` - Extracts block from pocket -- `deepnoteDataConverter.ts::transformOutputsForDeepnote(outputs)` - Converts outputs - -## Adding Support for a New Block Type - -Follow these steps to add support for a new Deepnote block type: - -### 1. Create a Converter Class - -Create a new file in `src/notebooks/deepnote/converters/`: - -```typescript -// src/notebooks/deepnote/converters/myBlockConverter.ts -import { NotebookCellData, NotebookCellKind } from 'vscode'; -import type { BlockConverter } from './blockConverter'; -import type { DeepnoteBlock } from '../deepnoteTypes'; - -export class MyBlockConverter implements BlockConverter { - // Block types this converter handles - get blockTypes(): string[] { - return ['my-block-type']; - } - - // Convert Deepnote block to VS Code cell - convertToCell(block: DeepnoteBlock): NotebookCellData { - // Choose appropriate cell kind - const cell = new NotebookCellData( - NotebookCellKind.Markup, // or NotebookCellKind.Code - block.content || '', - 'markdown' // or 'python', etc. - ); - - return cell; - } - - // Apply VS Code cell changes back to Deepnote block - applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void { - // Update the block content from the cell - block.content = cell.value || ''; - - // Apply any transformations needed - // (e.g., strip prefixes, convert formats, etc.) - } -} -``` - -### 2. Register the Converter - -Add your converter to the registry in `deepnoteDataConverter.ts`: - -```typescript -import { MyBlockConverter } from './converters/myBlockConverter'; - -export class DeepnoteDataConverter { - private readonly registry = new ConverterRegistry(); - - constructor() { - this.registry.register(new CodeBlockConverter()); - this.registry.register(new TextBlockConverter()); - this.registry.register(new MarkdownBlockConverter()); - this.registry.register(new MyBlockConverter()); // Add this line - } - // ... -} -``` - -### 3. Create Tests - -Create comprehensive tests in `src/notebooks/deepnote/converters/myBlockConverter.unit.test.ts`: - -```typescript -import { assert } from 'chai'; -import { NotebookCellKind } from 'vscode'; -import { MyBlockConverter } from './myBlockConverter'; -import type { DeepnoteBlock } from '../deepnoteTypes'; - -suite('MyBlockConverter', () => { - let converter: MyBlockConverter; - - setup(() => { - converter = new MyBlockConverter(); - }); - - suite('convertToCell', () => { - test('converts my-block-type to cell', () => { - const block: DeepnoteBlock = { - id: 'block1', - type: 'my-block-type', - content: 'Hello World', - sortingKey: 'a0' - }; - - const cell = converter.convertToCell(block); - - assert.strictEqual(cell.kind, NotebookCellKind.Markup); - assert.strictEqual(cell.value, 'Hello World'); - assert.strictEqual(cell.languageId, 'markdown'); - }); - }); - - suite('applyChangesToBlock', () => { - test('applies cell changes to block', () => { - const block: DeepnoteBlock = { - id: 'block1', - type: 'my-block-type', - content: '', - sortingKey: 'a0' - }; - - const cell = new NotebookCellData( - NotebookCellKind.Markup, - 'Updated content', - 'markdown' - ); - - converter.applyChangesToBlock(block, cell); - - assert.strictEqual(block.content, 'Updated content'); - }); - }); -}); -``` - -### 4. Add Round-Trip Tests - -Ensure your converter preserves data correctly in `deepnoteDataConverter.unit.test.ts`: - -```typescript -test('my-block-type round-trips correctly', () => { - const originalBlock: DeepnoteBlock = { - id: 'block1', - type: 'my-block-type', - content: 'Test content', - sortingKey: 'a0', - metadata: { custom: 'data' } - }; - - const cell = converter.convertBlocksToCells([originalBlock])[0]; - const roundTripBlock = converter.convertCellsToBlocks([cell])[0]; - - assert.deepStrictEqual(roundTripBlock, originalBlock); -}); -``` - -## Important Guidelines - -### DO: - -- ✅ Use the pocket system for Deepnote-specific fields -- ✅ Preserve all block metadata during conversion -- ✅ Test round-trip conversion (blocks → cells → blocks) -- ✅ Handle both empty and undefined fields correctly -- ✅ Use `assert.deepStrictEqual()` for object comparisons in tests - -### DON'T: - -- ❌ Store Deepnote-specific data directly in cell metadata (use the pocket) -- ❌ Modify the pocket in converters (it's managed automatically) -- ❌ Assume all optional fields exist (check for undefined) -- ❌ Convert undefined to empty arrays/objects (preserve exact structure) - -## Example: TextBlockConverter - -Here's a real example showing header transformations: - -```typescript -export class TextBlockConverter implements BlockConverter { - get blockTypes(): string[] { - return ['text-cell-h1', 'text-cell-h2', 'text-cell-h3', 'text-cell']; - } - - convertToCell(block: DeepnoteBlock): NotebookCellData { - let content = block.content || ''; - - // Add markdown prefix based on block type - if (block.type === 'text-cell-h1') { - content = `# ${content}`; - } else if (block.type === 'text-cell-h2') { - content = `## ${content}`; - } else if (block.type === 'text-cell-h3') { - content = `### ${content}`; - } - - return new NotebookCellData(NotebookCellKind.Markup, content, 'markdown'); - } - - applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void { - let value = cell.value || ''; - - // Strip markdown prefix when converting back - if (block.type === 'text-cell-h1') { - value = value.replace(/^#\s+/, ''); - } else if (block.type === 'text-cell-h2') { - value = value.replace(/^##\s+/, ''); - } else if (block.type === 'text-cell-h3') { - value = value.replace(/^###\s+/, ''); - } - - block.content = value; - } -} -``` - -This example shows: -1. Supporting multiple block types in one converter -2. Transforming content during conversion (adding markdown prefixes) -3. Reversing the transformation when converting back (stripping prefixes) -4. Preserving the original block type through the pocket system - -## Testing Your Converter - -Run the tests to ensure everything works: - -```bash -# Run all tests -npm test - -# Run only your converter tests -npx mocha --config ./build/.mocha.unittests.js.json ./out/notebooks/deepnote/converters/myBlockConverter.unit.test.js -``` - -Make sure: -1. All tests pass -2. Round-trip conversion preserves all data -3. The real Deepnote notebook test still passes diff --git a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx index 600da69774..af150e22f7 100644 --- a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -2,7 +2,6 @@ import React, { memo, useMemo, useState } from 'react'; import { RendererContext } from 'vscode-notebook-renderer'; import '../react-common/codicon/codicon.css'; -import { logMessage } from '../react-common/logger'; export interface DataframeMetadata { table_state_spec?: string; @@ -26,7 +25,6 @@ interface ColumnStats { interface DataframeRendererProps { cellId?: string; - cellIndex?: number; context: RendererContext; data: { column_count: number; @@ -55,22 +53,21 @@ interface TableState { export const DataframeRenderer = memo(function DataframeRenderer({ cellId, - cellIndex, context, data, metadata }: DataframeRendererProps) { - logMessage( - `[DataframeRenderer] Rendering with cellId: ${cellId}, cellIndex: ${cellIndex}, data: ${JSON.stringify( - data - )}, metadata: ${JSON.stringify(metadata)}` - ); + console.log('[DataframeRenderer] Rendering dataframe', { + cellId, + data, + metadata + }); const tableState = useMemo((): TableState => JSON.parse(metadata?.table_state_spec || '{}'), [metadata]); const [pageSize, setPageSize] = useState(tableState.pageSize || 10); const [pageIndex, setPageIndex] = useState(tableState.pageIndex || 0); - logMessage( + console.log( `[DataframeRenderer] State: ${JSON.stringify(context.getState())}, tableState: ${JSON.stringify(tableState)}` ); @@ -85,16 +82,15 @@ export const DataframeRenderer = memo(function DataframeRenderer({ setPageSize(newPageSize); - logMessage(`[DataframeRenderer] handlePageSizeChange called with cellId: ${cellId}, cellIndex: ${cellIndex}`); + console.log(`[DataframeRenderer] handlePageSizeChange called with cellId: ${cellId}`); const message = { command: 'selectPageSize', cellId, - cellIndex, size: newPageSize }; - logMessage(`[DataframeRenderer] Posting message: ${JSON.stringify(message)}`); + console.log(`[DataframeRenderer] Posting message: ${JSON.stringify(message)}`); context.postMessage?.(message); }; @@ -102,16 +98,15 @@ export const DataframeRenderer = memo(function DataframeRenderer({ const handlePageChange = (newPageIndex: number) => { setPageIndex(newPageIndex); - logMessage(`[DataframeRenderer] handlePageChange called with cellId: ${cellId}, page: ${newPageIndex}`); + console.log(`[DataframeRenderer] handlePageChange called with cellId: ${cellId}, page: ${newPageIndex}`); const message = { command: 'goToPage', cellId, - cellIndex, page: newPageIndex }; - logMessage(`[DataframeRenderer] Posting message: ${JSON.stringify(message)}`); + console.log(`[DataframeRenderer] Posting message: ${JSON.stringify(message)}`); context.postMessage?.(message); }; diff --git a/src/webviews/webview-side/dataframe-renderer/index.ts b/src/webviews/webview-side/dataframe-renderer/index.ts index 3805171db7..eccd67b978 100644 --- a/src/webviews/webview-side/dataframe-renderer/index.ts +++ b/src/webviews/webview-side/dataframe-renderer/index.ts @@ -5,7 +5,6 @@ import * as ReactDOM from 'react-dom'; import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-notebook-renderer'; -import { logErrorMessage, logMessage } from '../react-common/logger'; import { DataframeMetadata, DataframeRenderer } from './DataframeRenderer'; interface Metadata { @@ -19,19 +18,19 @@ interface Metadata { export const activate: ActivationFunction = (context: RendererContext) => { return { renderOutputItem(outputItem: OutputItem, element: HTMLElement) { - logMessage(`Dataframe renderer - rendering output item: ${outputItem.id}`); + console.log(`Dataframe renderer - rendering output item: ${outputItem.id}`); try { const data = outputItem.json(); - logMessage(`Dataframe renderer - received data with ${Object.keys(data).length} keys`); + console.log(`Dataframe renderer - received data with ${Object.keys(data).length} keys`); const metadata = outputItem.metadata as Metadata | undefined; - logMessage(`[DataframeRenderer] Full metadata: ${JSON.stringify(metadata)}`); + console.log('[DataframeRenderer] Full metadata', metadata); const dataFrameMetadata = metadata?.metadata as DataframeMetadata | undefined; const cellId = metadata?.cellId; const cellIndex = metadata?.cellIndex; - logMessage(`[DataframeRenderer] Extracted cellId: ${cellId}, cellIndex: ${cellIndex}`); + console.log(`[DataframeRenderer] Extracted cellId: ${cellId}, cellIndex: ${cellIndex}`); const root = document.createElement('div'); element.appendChild(root); @@ -47,7 +46,7 @@ export const activate: ActivationFunction = (context: RendererContext) root ); } catch (error) { - logErrorMessage(`Error rendering dataframe: ${error}`); + console.error(`Error rendering dataframe: ${error}`); const errorDiv = document.createElement('div'); errorDiv.style.padding = '10px'; errorDiv.style.color = 'var(--vscode-errorForeground)'; From 8ae05ab4b42ce2ac0fbbdcc34bf450a8ad6c1a1e Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 16:13:05 +0200 Subject: [PATCH 12/21] use the latest blocks package. --- package-lock.json | 14 +++++++------- package.json | 2 +- src/kernels/execution/cellExecutionCreator.ts | 18 ++++++++++-------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 503a63e050..d41fad5f0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "MIT", "dependencies": { "@c4312/evt": "^0.1.1", - "@deepnote/blocks": "^1.1.0", + "@deepnote/blocks": "^1.2.0", "@enonic/fnv-plus": "^1.3.0", "@jupyter-widgets/base": "^6.0.8", "@jupyter-widgets/controls": "^5.0.9", @@ -785,9 +785,9 @@ "integrity": "sha512-8EW+r3o2mothQKzNuBUGm8MTysihexfBCp1wvw3O6bgA2q7YHNlT104+LOFH1HS/PRy8owzkvZRLbPx4modJoQ==" }, "node_modules/@deepnote/blocks": { - "version": "1.1.0", - "resolved": "https://npm.pkg.github.com/download/@deepnote/blocks/1.1.0/eaed628f944e73fe64a6a9fd5f93b2bcfe130b44", - "integrity": "sha512-E3yqruwTtn7aGz1qy34w34Z/KhNiFe1FqWkqyyyzfQRzC/YKVY8UljX/cu4VjT8k7K1BkBQzz2MkNq7Beuxp+g==", + "version": "1.2.0", + "resolved": "https://npm.pkg.github.com/download/@deepnote/blocks/1.2.0/8192752d1ed398930eaa3373a802f1285c034d93", + "integrity": "sha512-EFiWpCMz5/55eUW6Udvonqc1xtVtVaPA7+4T1RGdkiYyBhx17gyU9DmDpyjz+gP+j64AHrmnL2VVaqtwu0YHkA==", "license": "Apache-2.0", "dependencies": { "ts-dedent": "^2.2.0", @@ -18433,9 +18433,9 @@ "integrity": "sha512-8EW+r3o2mothQKzNuBUGm8MTysihexfBCp1wvw3O6bgA2q7YHNlT104+LOFH1HS/PRy8owzkvZRLbPx4modJoQ==" }, "@deepnote/blocks": { - "version": "1.1.0", - "resolved": "https://npm.pkg.github.com/download/@deepnote/blocks/1.1.0/eaed628f944e73fe64a6a9fd5f93b2bcfe130b44", - "integrity": "sha512-E3yqruwTtn7aGz1qy34w34Z/KhNiFe1FqWkqyyyzfQRzC/YKVY8UljX/cu4VjT8k7K1BkBQzz2MkNq7Beuxp+g==", + "version": "1.2.0", + "resolved": "https://npm.pkg.github.com/download/@deepnote/blocks/1.2.0/8192752d1ed398930eaa3373a802f1285c034d93", + "integrity": "sha512-EFiWpCMz5/55eUW6Udvonqc1xtVtVaPA7+4T1RGdkiYyBhx17gyU9DmDpyjz+gP+j64AHrmnL2VVaqtwu0YHkA==", "requires": { "ts-dedent": "^2.2.0", "yaml": "^2.8.1", diff --git a/package.json b/package.json index d1b1b91993..a342128bbc 100644 --- a/package.json +++ b/package.json @@ -2110,7 +2110,7 @@ }, "dependencies": { "@c4312/evt": "^0.1.1", - "@deepnote/blocks": "^1.1.0", + "@deepnote/blocks": "^1.2.0", "@enonic/fnv-plus": "^1.3.0", "@jupyter-widgets/base": "^6.0.8", "@jupyter-widgets/controls": "^5.0.9", diff --git a/src/kernels/execution/cellExecutionCreator.ts b/src/kernels/execution/cellExecutionCreator.ts index 1a1d5b18c9..f02a80d7da 100644 --- a/src/kernels/execution/cellExecutionCreator.ts +++ b/src/kernels/execution/cellExecutionCreator.ts @@ -60,16 +60,18 @@ export class NotebookCellExecutionWrapper implements NotebookCellExecution { // Allow this to be called more than once (so we can switch out a kernel during running a cell) if (!this.started) { this._started = true; - this._impl.start(startTime); - this._startTime = startTime; - // We clear the output as soon as we start, - // We generally start with a time, when we receive a response from the kernel, - // indicating the fact that the kernel has started processing the output. - // That's when we clear the output. (ideally it should be cleared as soon as its queued, but thats an upstream core issue). + + // Clear outputs immediately on first start if configured to do so + // This ensures old outputs are removed before any new outputs arrive from the kernel if (this.clearOutputOnStartWithTime) { - logger.trace(`Start cell ${this.cell.index} execution @ ${startTime} (clear output)`); + logger.trace(`Start cell ${this.cell.index} execution (clear output)`); this._impl.clearOutput().then(noop, noop); - } else { + } + + this._impl.start(startTime); + this._startTime = startTime; + + if (startTime) { logger.trace(`Start cell ${this.cell.index} execution @ ${startTime}`); } } From 9fec8d429a5dd3db268f2f250a9f96e5f5532042 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 16:21:08 +0200 Subject: [PATCH 13/21] add the packages permission --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81a49ae250..246dbc59be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,6 +96,7 @@ jobs: permissions: id-token: write contents: read + packages: read steps: - name: Checkout uses: actions/checkout@v5 From 0537364e429330211602715a4c7fc5d6b3949a6c Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 17:53:17 +0200 Subject: [PATCH 14/21] simplify execution flow. --- src/kernels/deepnote/deepnoteController.ts | 84 ----- src/kernels/execution/cellExecutionCreator.ts | 47 +-- .../cellExecutionCreator.unit.test.ts | 290 ++++++++++++++++++ src/kernels/execution/helpers.ts | 5 +- .../controllers/vscodeNotebookController.ts | 5 +- .../deepnote/deepnoteDataConverter.ts | 19 +- 6 files changed, 338 insertions(+), 112 deletions(-) delete mode 100644 src/kernels/deepnote/deepnoteController.ts create mode 100644 src/kernels/execution/cellExecutionCreator.unit.test.ts diff --git a/src/kernels/deepnote/deepnoteController.ts b/src/kernels/deepnote/deepnoteController.ts deleted file mode 100644 index 63a98c31eb..0000000000 --- a/src/kernels/deepnote/deepnoteController.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - CancellationToken, - NotebookCell, - NotebookCellExecution, - NotebookCellOutput, - NotebookCellOutputItem -} from 'vscode'; - -import { KernelController } from '../kernelController'; - -/** - * Wrapper around NotebookCellExecution that prepends initialization code. - * This is implemented by delegating all calls to the underlying execution object. - * - * Note: This wrapper currently just delegates to the underlying execution. - * The actual code interception will be implemented at the execution layer. - */ -class DeepnoteNotebookCellExecution implements NotebookCellExecution { - constructor( - private readonly execution: NotebookCellExecution, - public readonly cell: NotebookCell - ) { - // Prepend code will be: print("Hello world") - // This will be implemented at the CellExecution layer - } - - get executionOrder(): number | undefined { - return this.execution.executionOrder; - } - - set executionOrder(value: number | undefined) { - this.execution.executionOrder = value; - } - - get token(): CancellationToken { - return this.execution.token; - } - - public start(startTime?: number): void { - this.execution.start(startTime); - } - - public end(success: boolean | undefined, endTime?: number): void { - this.execution.end(success, endTime); - } - - public clearOutput(cell?: NotebookCell): Thenable { - return this.execution.clearOutput(cell); - } - - public replaceOutput(out: NotebookCellOutput | readonly NotebookCellOutput[], cell?: NotebookCell): Thenable { - return this.execution.replaceOutput(out, cell); - } - - public appendOutput(out: NotebookCellOutput | readonly NotebookCellOutput[], cell?: NotebookCell): Thenable { - return this.execution.appendOutput(out, cell); - } - - public replaceOutputItems( - items: NotebookCellOutputItem | readonly NotebookCellOutputItem[], - output: NotebookCellOutput - ): Thenable { - return this.execution.replaceOutputItems(items, output); - } - - public appendOutputItems( - items: NotebookCellOutputItem | readonly NotebookCellOutputItem[], - output: NotebookCellOutput - ): Thenable { - return this.execution.appendOutputItems(items, output); - } -} - -/** - * DeepnoteController extends KernelController to intercept cell execution - * and prepend initialization code to each cell execution. - */ -export class DeepnoteController extends KernelController { - public override createNotebookCellExecution(cell: NotebookCell): NotebookCellExecution { - const execution = super.createNotebookCellExecution(cell); - - return new DeepnoteNotebookCellExecution(execution, cell); - } -} diff --git a/src/kernels/execution/cellExecutionCreator.ts b/src/kernels/execution/cellExecutionCreator.ts index f02a80d7da..aa3f5bd391 100644 --- a/src/kernels/execution/cellExecutionCreator.ts +++ b/src/kernels/execution/cellExecutionCreator.ts @@ -61,16 +61,17 @@ export class NotebookCellExecutionWrapper implements NotebookCellExecution { if (!this.started) { this._started = true; - // Clear outputs immediately on first start if configured to do so + // Must call start() before clearOutput() per VS Code API requirements + this._impl.start(startTime); + this._startTime = startTime; + + // Clear outputs immediately after start if configured to do so // This ensures old outputs are removed before any new outputs arrive from the kernel if (this.clearOutputOnStartWithTime) { logger.trace(`Start cell ${this.cell.index} execution (clear output)`); this._impl.clearOutput().then(noop, noop); } - this._impl.start(startTime); - this._startTime = startTime; - if (startTime) { logger.trace(`Start cell ${this.cell.index} execution @ ${startTime}`); } @@ -125,27 +126,31 @@ export class NotebookCellExecutionWrapper implements NotebookCellExecution { export class CellExecutionCreator { private static _map = new WeakMap(); static getOrCreate(cell: NotebookCell, controller: IKernelController, clearOutputOnStartWithTime = false) { - let cellExecution: NotebookCellExecutionWrapper | undefined; - cellExecution = this.get(cell); - if (!cellExecution) { - cellExecution = CellExecutionCreator.create(cell, controller, clearOutputOnStartWithTime); - } else { - // Cell execution may already exist, but its controller may be different - if (cellExecution.controllerId !== controller.id) { - // Stop the old execution so we don't have more than one for a cell at a time. - const oldExecution = cellExecution; - oldExecution.end(undefined); + const existingExecution = this.get(cell); + + if (existingExecution) { + // Always end and replace existing executions. + // VS Code's NotebookCellExecution API doesn't support reuse - once end() is called, + // you cannot call start(), clearOutput(), or any other methods on it again. + // This handles both controller changes and re-executions. + const wasStarted = existingExecution.started; + existingExecution.end(undefined); + // Note: end() callback automatically removes it from the map - // Create a new one with the new controller - cellExecution = CellExecutionCreator.create(cell, controller, clearOutputOnStartWithTime); + // Create a fresh execution wrapper + const cellExecution = CellExecutionCreator.create(cell, controller, clearOutputOnStartWithTime); - // Start the new one off now if the old one was already started - if (oldExecution.started) { - cellExecution.start(new Date().getTime()); - } + // If the old execution was started, start the new one immediately + // This handles the case where we're switching controllers mid-execution + if (wasStarted) { + cellExecution.start(new Date().getTime()); } + + return cellExecution; } - return cellExecution; + + // No existing execution, create a fresh one + return CellExecutionCreator.create(cell, controller, clearOutputOnStartWithTime); } static get(cell: NotebookCell) { return CellExecutionCreator._map.get(cell); diff --git a/src/kernels/execution/cellExecutionCreator.unit.test.ts b/src/kernels/execution/cellExecutionCreator.unit.test.ts new file mode 100644 index 0000000000..2e5b9fe91b --- /dev/null +++ b/src/kernels/execution/cellExecutionCreator.unit.test.ts @@ -0,0 +1,290 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { assert } from 'chai'; +import { anything, instance, mock, verify, when } from 'ts-mockito'; +import { CancellationToken, NotebookCell, NotebookCellExecution } from 'vscode'; +import { IKernelController } from '../types'; +import { CellExecutionCreator, NotebookCellExecutionWrapper } from './cellExecutionCreator'; + +suite('NotebookCellExecutionWrapper', () => { + let mockImpl: NotebookCellExecution; + let mockController: IKernelController; + let mockCell: NotebookCell; + let mockToken: CancellationToken; + let endCallback: () => void; + + setup(() => { + mockImpl = mock(); + mockController = mock(); + mockCell = mock(); + mockToken = mock(); + + when(mockImpl.cell).thenReturn(instance(mockCell)); + when(mockImpl.token).thenReturn(instance(mockToken)); + when(mockCell.index).thenReturn(0); + when(mockImpl.start(anything())).thenReturn(undefined); + when(mockImpl.clearOutput(anything())).thenReturn(Promise.resolve()); + when(mockController.id).thenReturn('test-controller'); + + endCallback = () => {}; + }); + + test('When clearOutputOnStartWithTime is true, start is called before clearOutput', () => { + // Create a manual spy to track call order + const callOrder: string[] = []; + const spyImpl = { + cell: instance(mockCell), + token: instance(mockToken), + executionOrder: undefined as number | undefined, + clearOutput: () => { + callOrder.push('clearOutput'); + return Promise.resolve(); + }, + start: () => { + callOrder.push('start'); + }, + end: () => {}, + replaceOutput: () => Promise.resolve(), + appendOutput: () => Promise.resolve(), + replaceOutputItems: () => Promise.resolve(), + appendOutputItems: () => Promise.resolve() + } as NotebookCellExecution; + + const wrapper = new NotebookCellExecutionWrapper(spyImpl, 'test-controller', endCallback, true); + + wrapper.start(); + + // Verify start was called before clearOutput + assert.deepStrictEqual( + callOrder, + ['start', 'clearOutput'], + 'start should be called before clearOutput' + ); + }); + + test('When clearOutputOnStartWithTime is false, clearOutput is not called on start', () => { + const wrapper = new NotebookCellExecutionWrapper( + instance(mockImpl), + 'test-controller', + endCallback, + false // clearOutputOnStartWithTime + ); + + wrapper.start(); + + verify(mockImpl.clearOutput(anything())).never(); + verify(mockImpl.start(anything())).once(); + }); + + test('When clearOutputOnStartWithTime is true with startTime, start is still called before clearOutput', () => { + // Create a manual spy to track call order + const callOrder: string[] = []; + let capturedStartTime: number | undefined; + + const spyImpl = { + cell: instance(mockCell), + token: instance(mockToken), + executionOrder: undefined as number | undefined, + clearOutput: () => { + callOrder.push('clearOutput'); + return Promise.resolve(); + }, + start: (startTime?: number) => { + callOrder.push('start'); + capturedStartTime = startTime; + }, + end: () => {}, + replaceOutput: () => Promise.resolve(), + appendOutput: () => Promise.resolve(), + replaceOutputItems: () => Promise.resolve(), + appendOutputItems: () => Promise.resolve() + } as NotebookCellExecution; + + const wrapper = new NotebookCellExecutionWrapper(spyImpl, 'test-controller', endCallback, true); + + const startTime = Date.now(); + wrapper.start(startTime); + + // Verify start was called before clearOutput + assert.deepStrictEqual( + callOrder, + ['start', 'clearOutput'], + 'start should be called before clearOutput even with startTime' + ); + assert.strictEqual(capturedStartTime, startTime, 'startTime should be passed to start()'); + }); + + test('start() can be called multiple times but only executes once', () => { + // Create a manual spy to track call counts + let clearOutputCallCount = 0; + let startCallCount = 0; + + const spyImpl = { + cell: instance(mockCell), + token: instance(mockToken), + executionOrder: undefined as number | undefined, + clearOutput: () => { + clearOutputCallCount++; + return Promise.resolve(); + }, + start: () => { + startCallCount++; + }, + end: () => {}, + replaceOutput: () => Promise.resolve(), + appendOutput: () => Promise.resolve(), + replaceOutputItems: () => Promise.resolve(), + appendOutputItems: () => Promise.resolve() + } as NotebookCellExecution; + + const wrapper = new NotebookCellExecutionWrapper(spyImpl, 'test-controller', endCallback, true); + + wrapper.start(); + wrapper.start(); + wrapper.start(); + + // Should only be called once + assert.strictEqual(clearOutputCallCount, 1, 'clearOutput should be called only once'); + assert.strictEqual(startCallCount, 1, 'start should be called only once'); + assert.isTrue(wrapper.started, 'wrapper should be marked as started'); + }); + + test('started flag is false initially and true after start', () => { + const wrapper = new NotebookCellExecutionWrapper( + instance(mockImpl), + 'test-controller', + endCallback, + false + ); + + assert.isFalse(wrapper.started, 'started should be false before start() is called'); + + wrapper.start(); + + assert.isTrue(wrapper.started, 'started should be true after start() is called'); + }); + + test('clearOutput() is called when reusing a started execution with clearOutputOnStartWithTime=true', () => { + let clearOutputCallCount = 0; + + const spyImpl = { + cell: instance(mockCell), + token: instance(mockToken), + executionOrder: undefined as number | undefined, + clearOutput: () => { + clearOutputCallCount++; + return Promise.resolve(); + }, + start: () => {}, + end: () => {}, + replaceOutput: () => Promise.resolve(), + appendOutput: () => Promise.resolve(), + replaceOutputItems: () => Promise.resolve(), + appendOutputItems: () => Promise.resolve() + } as NotebookCellExecution; + + const wrapper = new NotebookCellExecutionWrapper(spyImpl, 'test-controller', endCallback, true); + + // Start the wrapper (simulating first execution) + wrapper.start(); + + // Should have called clearOutput once during start + assert.strictEqual(clearOutputCallCount, 1, 'clearOutput should be called once after start'); + + // Now manually call clearOutput to simulate re-execution + // This simulates what CellExecutionCreator.getOrCreate() does when reusing a started wrapper + wrapper.clearOutput(); + + // Should have called clearOutput twice now (once from start, once from manual call) + assert.strictEqual(clearOutputCallCount, 2, 'clearOutput should be called again when manually invoked on reused wrapper'); + }); +}); + +suite('CellExecutionCreator', () => { + test('Re-execution: Always creates fresh wrapper and ends old one', () => { + let endCallCount = 0; + let clearOutputCallCount = 0; + + // Create mock cell + const mockCell = mock(); + const mockToken = mock(); + when(mockCell.index).thenReturn(0); + + // Create a spy implementation to track calls + const spyImpl1 = { + cell: instance(mockCell), + token: instance(mockToken), + executionOrder: undefined as number | undefined, + clearOutput: () => { + clearOutputCallCount++; + return Promise.resolve(); + }, + start: () => {}, + end: () => { + endCallCount++; + }, + replaceOutput: () => Promise.resolve(), + appendOutput: () => Promise.resolve(), + replaceOutputItems: () => Promise.resolve(), + appendOutputItems: () => Promise.resolve() + } as NotebookCellExecution; + + const spyImpl2 = { + cell: instance(mockCell), + token: instance(mockToken), + executionOrder: undefined as number | undefined, + clearOutput: () => { + clearOutputCallCount++; + return Promise.resolve(); + }, + start: () => {}, + end: () => { + endCallCount++; + }, + replaceOutput: () => Promise.resolve(), + appendOutput: () => Promise.resolve(), + replaceOutputItems: () => Promise.resolve(), + appendOutputItems: () => Promise.resolve() + } as NotebookCellExecution; + + // Create mock controller + const mockController = mock(); + when(mockController.id).thenReturn('test-controller'); + when(mockController.createNotebookCellExecution(anything())) + .thenReturn(spyImpl1) + .thenReturn(spyImpl2); + + // First execution: Create a new execution wrapper + const execution1 = CellExecutionCreator.getOrCreate(instance(mockCell), instance(mockController), true); + execution1.start(); + + // clearOutput should have been called once during start() + assert.strictEqual(clearOutputCallCount, 1, 'clearOutput should be called once during first execution start'); + assert.strictEqual(endCallCount, 0, 'end should not be called yet'); + + // Simulate re-execution (like what happens when pageSize changes in dataframe) + // This should end the old wrapper and create a fresh new one + const execution2 = CellExecutionCreator.getOrCreate(instance(mockCell), instance(mockController), true); + + // Should be a DIFFERENT wrapper instance (fresh one) + assert.notStrictEqual(execution1, execution2, 'Should create a fresh execution wrapper, not reuse'); + + // Old execution should have been ended + assert.strictEqual(endCallCount, 1, 'Old execution should be ended when creating new one'); + + // New execution should be started automatically because old one was started + assert.isTrue(execution2.started, 'New execution should be started automatically'); + + // clearOutput should have been called again during the new execution's start + assert.strictEqual( + clearOutputCallCount, + 2, + 'clearOutput should be called again when new execution starts' + ); + + // Clean up - end the execution to remove it from the map + execution2.end(true); + assert.strictEqual(endCallCount, 2, 'Both executions should be ended'); + }); +}); diff --git a/src/kernels/execution/helpers.ts b/src/kernels/execution/helpers.ts index 39f2a5b801..c18fbd15e3 100644 --- a/src/kernels/execution/helpers.ts +++ b/src/kernels/execution/helpers.ts @@ -209,9 +209,12 @@ function getOutputMetadata( case 'execute_result': case 'update_display_data': { metadata.executionCount = output.execution_count; - // Output metadata is merged last so it overrides block metadata + // Output metadata is merged in two places: + // 1. At the top level for easy access by custom renderers + // 2. In the metadata property for round-trip conversion if (output.metadata) { Object.assign(metadata, output.metadata); + metadata.metadata = output.metadata; } break; } diff --git a/src/notebooks/controllers/vscodeNotebookController.ts b/src/notebooks/controllers/vscodeNotebookController.ts index c2f689c503..a386b4ee4f 100644 --- a/src/notebooks/controllers/vscodeNotebookController.ts +++ b/src/notebooks/controllers/vscodeNotebookController.ts @@ -71,7 +71,6 @@ import { initializeInteractiveOrNotebookTelemetryBasedOnUserAction } from '../.. import { NotebookCellLanguageService } from '../languages/cellLanguageService'; import { IDataScienceErrorHandler } from '../../kernels/errors/types'; import { ITrustedKernelPaths } from '../../kernels/raw/finder/types'; -import { DeepnoteController } from '../../kernels/deepnote/deepnoteController'; import { RemoteKernelReconnectBusyIndicator } from './remoteKernelReconnectBusyIndicator'; import { LastCellExecutionTracker } from '../../kernels/execution/lastCellExecutionTracker'; import type { IAnyMessageArgs } from '@jupyterlab/services/lib/kernel/kernel'; @@ -548,7 +547,7 @@ export class VSCodeNotebookController implements Disposable, IVSCodeNotebookCont // Creating these execution objects marks the cell as queued for execution (vscode will update cell UI). type CellExec = { cell: NotebookCell; exec: NotebookCellExecution }; const cellExecs: CellExec[] = (this.cellQueue.get(doc) || []).map((cell) => { - const exec = this.createCellExecutionIfNecessary(cell, new DeepnoteController(this.controller)); + const exec = this.createCellExecutionIfNecessary(cell, this.controller); return { cell, exec }; }); this.cellQueue.delete(doc); @@ -561,7 +560,7 @@ export class VSCodeNotebookController implements Disposable, IVSCodeNotebookCont // Connect to a matching kernel if possible (but user may pick a different one) let currentContext: 'start' | 'execution' = 'start'; - let controller: IKernelController = new DeepnoteController(this.controller); + let controller: IKernelController = this.controller; const lastCellExecutionTracker = this.serviceContainer.get(LastCellExecutionTracker); let kernel: IKernel | undefined; try { diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index bac30fdee3..fd769f85f1 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -47,13 +47,19 @@ export class DeepnoteDataConverter { type: block.type, sortingKey: block.sortingKey, ...(blockWithOptionalFields.blockGroup && { blockGroup: blockWithOptionalFields.blockGroup }), - ...(block.executionCount !== undefined && { executionCount: block.executionCount }) + ...(block.executionCount !== undefined && { executionCount: block.executionCount }), + // Track whether this block had outputs for round-trip fidelity + __hadOutputs: block.outputs !== undefined }; // The pocket is a place to tuck away Deepnote-specific fields for later. addPocketToCellMetadata(cell); - cell.outputs = this.transformOutputsForVsCode(block.outputs || [], index, block.id, block.metadata); + // Only set outputs if the block has them (including empty arrays) + // This preserves round-trip fidelity + if (block.outputs !== undefined) { + cell.outputs = this.transformOutputsForVsCode(block.outputs, index, block.id, block.metadata); + } return cell; }); @@ -79,10 +85,17 @@ export class DeepnoteDataConverter { // Convert VS Code outputs to Deepnote format // Outputs are managed by VS Code natively, not stored in the pocket - if (!block.outputs && cell.outputs && cell.outputs.length > 0) { + // Only set outputs if the block originally had them (tracked by __hadOutputs flag) + const hadOutputs = cell.metadata?.__hadOutputs; + if (hadOutputs && !block.outputs && cell.outputs) { block.outputs = this.transformOutputsForDeepnote(cell.outputs); } + // Clean up internal tracking flags from metadata + if (block.metadata && '__hadOutputs' in block.metadata) { + delete block.metadata.__hadOutputs; + } + return block; }); } From 9b9216a8ece3832fd75e524bdd040fdc66aff5c3 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 17:55:19 +0200 Subject: [PATCH 15/21] remove copyright header --- .../cellExecutionCreator.unit.test.ts | 33 ++++++------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/src/kernels/execution/cellExecutionCreator.unit.test.ts b/src/kernels/execution/cellExecutionCreator.unit.test.ts index 2e5b9fe91b..7cec5206b7 100644 --- a/src/kernels/execution/cellExecutionCreator.unit.test.ts +++ b/src/kernels/execution/cellExecutionCreator.unit.test.ts @@ -1,9 +1,7 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - import { assert } from 'chai'; import { anything, instance, mock, verify, when } from 'ts-mockito'; import { CancellationToken, NotebookCell, NotebookCellExecution } from 'vscode'; + import { IKernelController } from '../types'; import { CellExecutionCreator, NotebookCellExecutionWrapper } from './cellExecutionCreator'; @@ -56,11 +54,7 @@ suite('NotebookCellExecutionWrapper', () => { wrapper.start(); // Verify start was called before clearOutput - assert.deepStrictEqual( - callOrder, - ['start', 'clearOutput'], - 'start should be called before clearOutput' - ); + assert.deepStrictEqual(callOrder, ['start', 'clearOutput'], 'start should be called before clearOutput'); }); test('When clearOutputOnStartWithTime is false, clearOutput is not called on start', () => { @@ -151,12 +145,7 @@ suite('NotebookCellExecutionWrapper', () => { }); test('started flag is false initially and true after start', () => { - const wrapper = new NotebookCellExecutionWrapper( - instance(mockImpl), - 'test-controller', - endCallback, - false - ); + const wrapper = new NotebookCellExecutionWrapper(instance(mockImpl), 'test-controller', endCallback, false); assert.isFalse(wrapper.started, 'started should be false before start() is called'); @@ -197,7 +186,11 @@ suite('NotebookCellExecutionWrapper', () => { wrapper.clearOutput(); // Should have called clearOutput twice now (once from start, once from manual call) - assert.strictEqual(clearOutputCallCount, 2, 'clearOutput should be called again when manually invoked on reused wrapper'); + assert.strictEqual( + clearOutputCallCount, + 2, + 'clearOutput should be called again when manually invoked on reused wrapper' + ); }); }); @@ -251,9 +244,7 @@ suite('CellExecutionCreator', () => { // Create mock controller const mockController = mock(); when(mockController.id).thenReturn('test-controller'); - when(mockController.createNotebookCellExecution(anything())) - .thenReturn(spyImpl1) - .thenReturn(spyImpl2); + when(mockController.createNotebookCellExecution(anything())).thenReturn(spyImpl1).thenReturn(spyImpl2); // First execution: Create a new execution wrapper const execution1 = CellExecutionCreator.getOrCreate(instance(mockCell), instance(mockController), true); @@ -277,11 +268,7 @@ suite('CellExecutionCreator', () => { assert.isTrue(execution2.started, 'New execution should be started automatically'); // clearOutput should have been called again during the new execution's start - assert.strictEqual( - clearOutputCallCount, - 2, - 'clearOutput should be called again when new execution starts' - ); + assert.strictEqual(clearOutputCallCount, 2, 'clearOutput should be called again when new execution starts'); // Clean up - end the execution to remove it from the map execution2.end(true); From e5a1bbadf43a7f369c06c0e2ce323d5ff2b430b8 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 18:06:29 +0200 Subject: [PATCH 16/21] clean up the code --- src/kernels/execution/cellExecutionCreator.ts | 7 +++- .../cellExecutionCreator.unit.test.ts | 34 +++++++++++----- .../deepnoteInitNotebookRunner.node.ts | 16 ++++++-- .../dataframe/dataframeController.ts | 39 ++++++------------- 4 files changed, 53 insertions(+), 43 deletions(-) diff --git a/src/kernels/execution/cellExecutionCreator.ts b/src/kernels/execution/cellExecutionCreator.ts index aa3f5bd391..803abf5ab4 100644 --- a/src/kernels/execution/cellExecutionCreator.ts +++ b/src/kernels/execution/cellExecutionCreator.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { +import type { CancellationToken, CellExecutionError, NotebookCell, @@ -69,7 +69,10 @@ export class NotebookCellExecutionWrapper implements NotebookCellExecution { // This ensures old outputs are removed before any new outputs arrive from the kernel if (this.clearOutputOnStartWithTime) { logger.trace(`Start cell ${this.cell.index} execution (clear output)`); - this._impl.clearOutput().then(noop, noop); + + this._impl + .clearOutput() + .then(noop, (err) => logger.warn(`Failed to clear output for cell ${this.cell.index}`, err)); } if (startTime) { diff --git a/src/kernels/execution/cellExecutionCreator.unit.test.ts b/src/kernels/execution/cellExecutionCreator.unit.test.ts index 7cec5206b7..fe25b35be6 100644 --- a/src/kernels/execution/cellExecutionCreator.unit.test.ts +++ b/src/kernels/execution/cellExecutionCreator.unit.test.ts @@ -25,7 +25,9 @@ suite('NotebookCellExecutionWrapper', () => { when(mockImpl.clearOutput(anything())).thenReturn(Promise.resolve()); when(mockController.id).thenReturn('test-controller'); - endCallback = () => {}; + endCallback = () => { + // noop + }; }); test('When clearOutputOnStartWithTime is true, start is called before clearOutput', () => { @@ -42,7 +44,9 @@ suite('NotebookCellExecutionWrapper', () => { start: () => { callOrder.push('start'); }, - end: () => {}, + end: () => { + // noop + }, replaceOutput: () => Promise.resolve(), appendOutput: () => Promise.resolve(), replaceOutputItems: () => Promise.resolve(), @@ -88,7 +92,9 @@ suite('NotebookCellExecutionWrapper', () => { callOrder.push('start'); capturedStartTime = startTime; }, - end: () => {}, + end: () => { + // noop + }, replaceOutput: () => Promise.resolve(), appendOutput: () => Promise.resolve(), replaceOutputItems: () => Promise.resolve(), @@ -125,7 +131,9 @@ suite('NotebookCellExecutionWrapper', () => { start: () => { startCallCount++; }, - end: () => {}, + end: () => { + // noop + }, replaceOutput: () => Promise.resolve(), appendOutput: () => Promise.resolve(), replaceOutputItems: () => Promise.resolve(), @@ -165,8 +173,12 @@ suite('NotebookCellExecutionWrapper', () => { clearOutputCallCount++; return Promise.resolve(); }, - start: () => {}, - end: () => {}, + start: () => { + // noop + }, + end: () => { + // noop + }, replaceOutput: () => Promise.resolve(), appendOutput: () => Promise.resolve(), replaceOutputItems: () => Promise.resolve(), @@ -183,7 +195,7 @@ suite('NotebookCellExecutionWrapper', () => { // Now manually call clearOutput to simulate re-execution // This simulates what CellExecutionCreator.getOrCreate() does when reusing a started wrapper - wrapper.clearOutput(); + void wrapper.clearOutput(); // Should have called clearOutput twice now (once from start, once from manual call) assert.strictEqual( @@ -213,7 +225,9 @@ suite('CellExecutionCreator', () => { clearOutputCallCount++; return Promise.resolve(); }, - start: () => {}, + start: () => { + // noop + }, end: () => { endCallCount++; }, @@ -231,7 +245,9 @@ suite('CellExecutionCreator', () => { clearOutputCallCount++; return Promise.resolve(); }, - start: () => {}, + start: () => { + // noop + }, end: () => { endCallCount++; }, diff --git a/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts b/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts index cbc5f8f5b5..a5dc600f85 100644 --- a/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts +++ b/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts @@ -1,8 +1,16 @@ import { inject, injectable } from 'inversify'; -import { NotebookDocument, ProgressLocation, window, CancellationTokenSource, CancellationToken } from 'vscode'; +import { + type NotebookDocument, + ProgressLocation, + window, + CancellationTokenSource, + type CancellationToken, + l10n +} from 'vscode'; + import { logger } from '../../platform/logging'; import { IDeepnoteNotebookManager } from '../types'; -import { DeepnoteProject, DeepnoteNotebook } from './deepnoteTypes'; +import type { DeepnoteProject, DeepnoteNotebook } from './deepnoteTypes'; import { IKernelProvider } from '../../kernels/types'; import { getDisplayPath } from '../../platform/common/platform/fs-paths'; @@ -134,14 +142,14 @@ export class DeepnoteInitNotebookRunner { return window.withProgress( { location: ProgressLocation.Notification, - title: `🚀 Initializing project environment`, + title: l10n.t(`🚀 Initializing project environment`), cancellable: false }, async (notificationProgress) => { return window.withProgress( { location: ProgressLocation.Window, - title: `Init: "${initNotebook.name}"`, + title: l10n.t(`Init: "${initNotebook.name}"`), cancellable: false }, async (windowProgress) => { diff --git a/src/webviews/extension-side/dataframe/dataframeController.ts b/src/webviews/extension-side/dataframe/dataframeController.ts index 5674036bc9..87a4f63804 100644 --- a/src/webviews/extension-side/dataframe/dataframeController.ts +++ b/src/webviews/extension-side/dataframe/dataframeController.ts @@ -1,44 +1,42 @@ import { injectable } from 'inversify'; import { commands, - env, l10n, NotebookEdit, - NotebookEditor, - NotebookRendererMessaging, + type NotebookEditor, + type NotebookRendererMessaging, notebooks, window, workspace, WorkspaceEdit } from 'vscode'; -import { IExtensionSyncActivationService } from '../../../platform/activation/types'; -import { IDisposable } from '../../../platform/common/types'; +import type { IExtensionSyncActivationService } from '../../../platform/activation/types'; +import type { IDisposable } from '../../../platform/common/types'; import { dispose } from '../../../platform/common/utils/lifecycle'; import { logger } from '../../../platform/logging'; type SelectPageSizeCommand = { cellId?: string; - cellIndex?: number; command: 'selectPageSize'; size: number; }; type GoToPageCommand = { cellId?: string; - cellIndex?: number; command: 'goToPage'; page: number; }; type CopyTableDataCommand = { + cellId?: string; command: 'copyTableData'; data: string; }; type ExportDataframeCommand = { + cellId?: string; command: 'exportDataframe'; - cellIndex: number; }; type DataframeCommand = SelectPageSizeCommand | GoToPageCommand | CopyTableDataCommand | ExportDataframeCommand; @@ -75,18 +73,20 @@ export class DataframeController implements IExtensionSyncActivationService { } if (message.command === 'copyTableData') { - return this.handleCopyTableData(message); + // TODO: Implement dataframe export functionality + return; } if (message.command === 'exportDataframe') { - return this.handleExportDataframe(editor, message); + // TODO: Implement dataframe export functionality + return; } logger.warn(`DataframeController received unknown command:`, message); } private async handleSelectPageSize(editor: NotebookEditor, message: SelectPageSizeCommand) { - if (!message.cellId && message.cellIndex === undefined) { + if (!message.cellId) { const errorMessage = l10n.t( 'Unable to update page size: No cell identifier provided. Please re-run the cell to update the output metadata.' ); @@ -198,21 +198,4 @@ export class DataframeController implements IExtensionSyncActivationService { document: editor.notebook.uri }); } - - private async handleCopyTableData(message: CopyTableDataCommand) { - logger.info(`[DataframeRenderer] copyTableData called, data length=${message.data.length} characters`); - - await env.clipboard.writeText(message.data); - } - - private async handleExportDataframe(editor: NotebookEditor, message: ExportDataframeCommand) { - const cell = editor.notebook.cellAt(message.cellIndex); - - logger.info( - `[DataframeRenderer] exportDataframe called for cell ${ - message.cellIndex - } (${cell?.document.uri.toString()})` - ); - // TODO: Implement dataframe export functionality - } } From 895fe09275b43bd675b99034472ad995621b43ab Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 18:13:28 +0200 Subject: [PATCH 17/21] revert controller changes --- src/notebooks/controllers/vscodeNotebookController.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/notebooks/controllers/vscodeNotebookController.ts b/src/notebooks/controllers/vscodeNotebookController.ts index a386b4ee4f..4bae4114f2 100644 --- a/src/notebooks/controllers/vscodeNotebookController.ts +++ b/src/notebooks/controllers/vscodeNotebookController.ts @@ -71,6 +71,7 @@ import { initializeInteractiveOrNotebookTelemetryBasedOnUserAction } from '../.. import { NotebookCellLanguageService } from '../languages/cellLanguageService'; import { IDataScienceErrorHandler } from '../../kernels/errors/types'; import { ITrustedKernelPaths } from '../../kernels/raw/finder/types'; +import { KernelController } from '../../kernels/kernelController'; import { RemoteKernelReconnectBusyIndicator } from './remoteKernelReconnectBusyIndicator'; import { LastCellExecutionTracker } from '../../kernels/execution/lastCellExecutionTracker'; import type { IAnyMessageArgs } from '@jupyterlab/services/lib/kernel/kernel'; @@ -547,7 +548,7 @@ export class VSCodeNotebookController implements Disposable, IVSCodeNotebookCont // Creating these execution objects marks the cell as queued for execution (vscode will update cell UI). type CellExec = { cell: NotebookCell; exec: NotebookCellExecution }; const cellExecs: CellExec[] = (this.cellQueue.get(doc) || []).map((cell) => { - const exec = this.createCellExecutionIfNecessary(cell, this.controller); + const exec = this.createCellExecutionIfNecessary(cell, new KernelController(this.controller)); return { cell, exec }; }); this.cellQueue.delete(doc); @@ -560,7 +561,7 @@ export class VSCodeNotebookController implements Disposable, IVSCodeNotebookCont // Connect to a matching kernel if possible (but user may pick a different one) let currentContext: 'start' | 'execution' = 'start'; - let controller: IKernelController = this.controller; + let controller: IKernelController = new KernelController(this.controller); const lastCellExecutionTracker = this.serviceContainer.get(LastCellExecutionTracker); let kernel: IKernel | undefined; try { From 54ca963f8e3e67f9a185639be97525b0df2b154d Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 18:43:35 +0200 Subject: [PATCH 18/21] pr feedback --- .../execution/cellExecutionCreator.unit.test.ts | 10 +++++----- .../extension-side/dataframe/dataframeController.ts | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/kernels/execution/cellExecutionCreator.unit.test.ts b/src/kernels/execution/cellExecutionCreator.unit.test.ts index fe25b35be6..7f61e6894d 100644 --- a/src/kernels/execution/cellExecutionCreator.unit.test.ts +++ b/src/kernels/execution/cellExecutionCreator.unit.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'chai'; +import { strict as assert } from 'assert'; import { anything, instance, mock, verify, when } from 'ts-mockito'; import { CancellationToken, NotebookCell, NotebookCellExecution } from 'vscode'; @@ -149,17 +149,17 @@ suite('NotebookCellExecutionWrapper', () => { // Should only be called once assert.strictEqual(clearOutputCallCount, 1, 'clearOutput should be called only once'); assert.strictEqual(startCallCount, 1, 'start should be called only once'); - assert.isTrue(wrapper.started, 'wrapper should be marked as started'); + assert.strictEqual(wrapper.started, true, 'wrapper should be marked as started'); }); test('started flag is false initially and true after start', () => { const wrapper = new NotebookCellExecutionWrapper(instance(mockImpl), 'test-controller', endCallback, false); - assert.isFalse(wrapper.started, 'started should be false before start() is called'); + assert.strictEqual(wrapper.started, false, 'started should be false before start() is called'); wrapper.start(); - assert.isTrue(wrapper.started, 'started should be true after start() is called'); + assert.strictEqual(wrapper.started, true, 'started should be true after start() is called'); }); test('clearOutput() is called when reusing a started execution with clearOutputOnStartWithTime=true', () => { @@ -281,7 +281,7 @@ suite('CellExecutionCreator', () => { assert.strictEqual(endCallCount, 1, 'Old execution should be ended when creating new one'); // New execution should be started automatically because old one was started - assert.isTrue(execution2.started, 'New execution should be started automatically'); + assert.strictEqual(execution2.started, true, 'New execution should be started automatically'); // clearOutput should have been called again during the new execution's start assert.strictEqual(clearOutputCallCount, 2, 'clearOutput should be called again when new execution starts'); diff --git a/src/webviews/extension-side/dataframe/dataframeController.ts b/src/webviews/extension-side/dataframe/dataframeController.ts index 87a4f63804..9e7526df48 100644 --- a/src/webviews/extension-side/dataframe/dataframeController.ts +++ b/src/webviews/extension-side/dataframe/dataframeController.ts @@ -45,15 +45,15 @@ type DataframeCommand = SelectPageSizeCommand | GoToPageCommand | CopyTableDataC export class DataframeController implements IExtensionSyncActivationService { private readonly disposables: IDisposable[] = []; - public dispose() { - dispose(this.disposables); - } - - activate() { + public activate() { const comms = notebooks.createRendererMessaging('deepnote-dataframe-renderer'); comms.onDidReceiveMessage(this.onDidReceiveMessage.bind(this, comms), this, this.disposables); } + public dispose() { + dispose(this.disposables); + } + private async onDidReceiveMessage( _comms: NotebookRendererMessaging, { editor, message }: { editor: NotebookEditor; message: DataframeCommand } From df330bcda710763741e63c8414e3113d40f2dc30 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Wed, 15 Oct 2025 09:16:13 +0200 Subject: [PATCH 19/21] pr feedback --- src/kernels/execution/cellExecutionCreator.ts | 4 +- .../cellExecutionCreator.unit.test.ts | 80 ++++++++++++++++++- .../execution/cellExecutionMessageHandler.ts | 21 +++-- src/notebooks/deepnote/blocks.md | 2 +- .../deepnote/deepnoteDataConverter.ts | 6 +- .../dataframe/dataframeController.ts | 3 +- .../dataframe-renderer/DataframeRenderer.tsx | 11 ++- .../webview-side/dataframe-renderer/index.ts | 3 + 8 files changed, 105 insertions(+), 25 deletions(-) diff --git a/src/kernels/execution/cellExecutionCreator.ts b/src/kernels/execution/cellExecutionCreator.ts index 803abf5ab4..cec6a73214 100644 --- a/src/kernels/execution/cellExecutionCreator.ts +++ b/src/kernels/execution/cellExecutionCreator.ts @@ -137,6 +137,8 @@ export class CellExecutionCreator { // you cannot call start(), clearOutput(), or any other methods on it again. // This handles both controller changes and re-executions. const wasStarted = existingExecution.started; + + // Always call end() to ensure VS Code cleans up its internal execution state existingExecution.end(undefined); // Note: end() callback automatically removes it from the map @@ -146,7 +148,7 @@ export class CellExecutionCreator { // If the old execution was started, start the new one immediately // This handles the case where we're switching controllers mid-execution if (wasStarted) { - cellExecution.start(new Date().getTime()); + cellExecution.start(Date.now()); } return cellExecution; diff --git a/src/kernels/execution/cellExecutionCreator.unit.test.ts b/src/kernels/execution/cellExecutionCreator.unit.test.ts index 7f61e6894d..0949bf2e39 100644 --- a/src/kernels/execution/cellExecutionCreator.unit.test.ts +++ b/src/kernels/execution/cellExecutionCreator.unit.test.ts @@ -1,4 +1,4 @@ -import { strict as assert } from 'assert'; +import { assert } from 'chai'; import { anything, instance, mock, verify, when } from 'ts-mockito'; import { CancellationToken, NotebookCell, NotebookCellExecution } from 'vscode'; @@ -58,7 +58,7 @@ suite('NotebookCellExecutionWrapper', () => { wrapper.start(); // Verify start was called before clearOutput - assert.deepStrictEqual(callOrder, ['start', 'clearOutput'], 'start should be called before clearOutput'); + assert.deepEqual(callOrder, ['start', 'clearOutput'], 'start should be called before clearOutput'); }); test('When clearOutputOnStartWithTime is false, clearOutput is not called on start', () => { @@ -107,7 +107,7 @@ suite('NotebookCellExecutionWrapper', () => { wrapper.start(startTime); // Verify start was called before clearOutput - assert.deepStrictEqual( + assert.deepEqual( callOrder, ['start', 'clearOutput'], 'start should be called before clearOutput even with startTime' @@ -290,4 +290,78 @@ suite('CellExecutionCreator', () => { execution2.end(true); assert.strictEqual(endCallCount, 2, 'Both executions should be ended'); }); + + test('Re-execution without starting first execution should not cause duplicate execution error', () => { + // This test catches a regression where unstarted executions weren't properly cleaned up + let endCallCount = 0; + + // Create mock cell + const mockCell = mock(); + const mockToken = mock(); + when(mockCell.index).thenReturn(0); + + // Create spy implementations + const spyImpl1 = { + cell: instance(mockCell), + token: instance(mockToken), + executionOrder: undefined as number | undefined, + clearOutput: () => Promise.resolve(), + start: () => { + // noop + }, + end: () => { + endCallCount++; + }, + replaceOutput: () => Promise.resolve(), + appendOutput: () => Promise.resolve(), + replaceOutputItems: () => Promise.resolve(), + appendOutputItems: () => Promise.resolve() + } as NotebookCellExecution; + + const spyImpl2 = { + cell: instance(mockCell), + token: instance(mockToken), + executionOrder: undefined as number | undefined, + clearOutput: () => Promise.resolve(), + start: () => { + // noop + }, + end: () => { + endCallCount++; + }, + replaceOutput: () => Promise.resolve(), + appendOutput: () => Promise.resolve(), + replaceOutputItems: () => Promise.resolve(), + appendOutputItems: () => Promise.resolve() + } as NotebookCellExecution; + + // Create mock controller + const mockController = mock(); + when(mockController.id).thenReturn('test-controller'); + when(mockController.createNotebookCellExecution(anything())).thenReturn(spyImpl1).thenReturn(spyImpl2); + + // First execution: Create but DON'T start it + const execution1 = CellExecutionCreator.getOrCreate(instance(mockCell), instance(mockController), false); + assert.strictEqual(execution1.started, false, 'First execution should not be started'); + assert.strictEqual(endCallCount, 0, 'end should not be called yet'); + + // Second execution: This should not fail with "duplicate execution" error + // Even though the first execution was never started, it must be ended to clean up VS Code's internal state + const execution2 = CellExecutionCreator.getOrCreate(instance(mockCell), instance(mockController), false); + + // First execution should have been ended (even though it was never started) + assert.strictEqual(endCallCount, 1, 'First execution should be ended to clean up VS Code state'); + + // Should be a different wrapper instance + assert.notStrictEqual(execution1, execution2, 'Should create a fresh execution wrapper'); + assert.strictEqual(execution2.started, false, 'Second execution should not be started'); + + // Verify that we can get the new execution from the map + const retrieved = CellExecutionCreator.get(instance(mockCell)); + assert.strictEqual(retrieved, execution2, 'Should retrieve the second execution from the map'); + + // Clean up + execution2.end(true); + assert.strictEqual(endCallCount, 2, 'Both executions should be ended'); + }); }); diff --git a/src/kernels/execution/cellExecutionMessageHandler.ts b/src/kernels/execution/cellExecutionMessageHandler.ts index b914f3282c..98ca0cf922 100644 --- a/src/kernels/execution/cellExecutionMessageHandler.ts +++ b/src/kernels/execution/cellExecutionMessageHandler.ts @@ -988,6 +988,10 @@ export class CellExecutionMessageHandler implements IDisposable { traceCellMessage(this.cell, `Update streamed output, new output '${msg.content.text.substring(0, 100)}'`); const task = this.getOrCreateExecutionTask(true); + // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id + const cellId = getCellId(this.cell); + const cellMetadata = this.cell.metadata || {}; + const outputName = msg.content.name === 'stdout' ? NotebookCellOutputItem.stdout('').mime @@ -1014,9 +1018,6 @@ export class CellExecutionMessageHandler implements IDisposable { // Ensure we append to previous output, only if the streams are the same & // If the last output is the desired stream type. if (this.lastUsedStreamOutput?.stream === msg.content.name) { - // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id - const cellId = getCellId(this.cell); - const cellMetadata = this.cell.metadata || {}; const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1032,9 +1033,6 @@ export class CellExecutionMessageHandler implements IDisposable { } else if (previousValueOfClearOutputOnNextUpdateToOutput) { // Replace the current outputs with a single new output. const text = concatMultilineString(msg.content.text); - // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id - const cellId = getCellId(this.cell); - const cellMetadata = this.cell.metadata || {}; const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1051,9 +1049,6 @@ export class CellExecutionMessageHandler implements IDisposable { } else { // Create a new output const text = formatStreamText(concatMultilineString(msg.content.text)); - // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id - const cellId = getCellId(this.cell); - const cellMetadata = this.cell.metadata || {}; const output = cellOutputToVSCCellOutput( { output_type: 'stream', @@ -1178,12 +1173,14 @@ export class CellExecutionMessageHandler implements IDisposable { logger.warn('Update display data message received, but output cell is closed', msg.content); return; } - const output = translateCellDisplayOutput( - new NotebookCellOutput(outputToBeUpdated.outputItems, outputToBeUpdated.outputContainer.metadata) - ); + // Use cell metadata id if available (from Deepnote blocks), otherwise fall back to cell's internal id const cellId = getCellId(outputToBeUpdated.cell); const cellMetadata = outputToBeUpdated.cell.metadata || {}; + + const output = translateCellDisplayOutput( + new NotebookCellOutput(outputToBeUpdated.outputItems, outputToBeUpdated.outputContainer.metadata) + ); const newOutput = cellOutputToVSCCellOutput( { ...output, diff --git a/src/notebooks/deepnote/blocks.md b/src/notebooks/deepnote/blocks.md index 6dbafc1bc1..c39a8c698c 100644 --- a/src/notebooks/deepnote/blocks.md +++ b/src/notebooks/deepnote/blocks.md @@ -12,7 +12,7 @@ Every Deepnote block exists in **three different representations** as it moves t Understanding how data flows between these representations is key to working with this extension. -``` +```text ┌─────────────────┐ │ .deepnote File │ │ (YAML format) │ diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index fd769f85f1..3bd1e3f19b 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -85,9 +85,9 @@ export class DeepnoteDataConverter { // Convert VS Code outputs to Deepnote format // Outputs are managed by VS Code natively, not stored in the pocket - // Only set outputs if the block originally had them (tracked by __hadOutputs flag) - const hadOutputs = cell.metadata?.__hadOutputs; - if (hadOutputs && !block.outputs && cell.outputs) { + // Preserve outputs when they exist (including newly produced outputs) + // Only set if not already set to avoid overwriting converter-managed outputs + if (cell.outputs && !block.outputs) { block.outputs = this.transformOutputsForDeepnote(cell.outputs); } diff --git a/src/webviews/extension-side/dataframe/dataframeController.ts b/src/webviews/extension-side/dataframe/dataframeController.ts index 9e7526df48..122c0215da 100644 --- a/src/webviews/extension-side/dataframe/dataframeController.ts +++ b/src/webviews/extension-side/dataframe/dataframeController.ts @@ -47,7 +47,8 @@ export class DataframeController implements IExtensionSyncActivationService { public activate() { const comms = notebooks.createRendererMessaging('deepnote-dataframe-renderer'); - comms.onDidReceiveMessage(this.onDidReceiveMessage.bind(this, comms), this, this.disposables); + const messageDisposable = comms.onDidReceiveMessage(this.onDidReceiveMessage.bind(this, comms), this); + this.disposables.push(messageDisposable); } public dispose() { diff --git a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx index af150e22f7..8c8701beed 100644 --- a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -1,5 +1,6 @@ -import React, { memo, useMemo, useState } from 'react'; -import { RendererContext } from 'vscode-notebook-renderer'; +import React from 'react'; +import { memo, useMemo, useState } from 'react'; +import type { RendererContext } from 'vscode-notebook-renderer'; import '../react-common/codicon/codicon.css'; @@ -127,7 +128,7 @@ export const DataframeRenderer = memo(function DataframeRenderer({
{rows.map((value, index) => (