From a42253207b75c253cf921542436425c09010f560 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Wed, 8 Oct 2025 16:07:55 +0200 Subject: [PATCH 01/70] 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 3f9c6af85ecacd614d97ed9f7125198b3ae6af4d Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Thu, 9 Oct 2025 12:05:10 +0200 Subject: [PATCH 02/70] 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 e3346987c17a6da15b3b3606cf77770a8a82e699 Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Mon, 13 Oct 2025 07:09:40 +0000 Subject: [PATCH 03/70] feat: Implement deepnote big number chart support and renderer --- build/esbuild/build.ts | 12 ++ package-lock.json | 3 +- package.json | 11 +- .../chartBigNumberBlockConverter.ts | 64 ++++++++ src/notebooks/deepnote/dataConversionUtils.ts | 8 + src/notebooks/deepnote/deepnoteConstants.ts | 1 + .../deepnote/deepnoteDataConverter.ts | 28 +++- src/notebooks/deepnote/deepnoteSchemas.ts | 47 ++++++ src/notebooks/deepnote/deepnoteSerializer.ts | 17 +- src/webviews/deepnote-utils/format-value.ts | 36 +++++ .../ChartBigNumberOutputRenderer.tsx | 145 ++++++++++++++++++ .../chart-big-number-renderer/index.ts | 47 ++++++ .../chart-big-number-renderer/styles.css | 54 +++++++ 13 files changed, 463 insertions(+), 10 deletions(-) create mode 100644 src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts create mode 100644 src/notebooks/deepnote/deepnoteConstants.ts create mode 100644 src/notebooks/deepnote/deepnoteSchemas.ts create mode 100644 src/webviews/deepnote-utils/format-value.ts create mode 100644 src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx create mode 100644 src/webviews/webview-side/chart-big-number-renderer/index.ts create mode 100644 src/webviews/webview-side/chart-big-number-renderer/styles.css diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index a1093e1e93..234784b400 100644 --- a/build/esbuild/build.ts +++ b/build/esbuild/build.ts @@ -292,6 +292,18 @@ async function buildAll() { path.join(extensionFolder, 'dist', 'webviews', 'webview-side', 'dataframeRenderer', 'dataframeRenderer.js'), { target: 'web', watch: isWatchMode } ), + build( + path.join(extensionFolder, 'src', 'webviews', 'webview-side', 'chart-big-number-renderer', 'index.ts'), + path.join( + extensionFolder, + 'dist', + 'webviews', + 'webview-side', + 'chartBigNumberRenderer', + 'chartBigNumberRenderer.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-lock.json b/package-lock.json index a32854b445..961a69b8e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,7 +72,8 @@ "vscode-tas-client": "^0.1.84", "ws": "^6.2.3", "zeromq": "^6.5.0", - "zeromqold": "npm:zeromq@^6.0.0-beta.6" + "zeromqold": "npm:zeromq@^6.0.0-beta.6", + "zod": "^4.1.12" }, "devDependencies": { "@actions/core": "^1.11.1", diff --git a/package.json b/package.json index a724a5a9d8..d4879c851d 100644 --- a/package.json +++ b/package.json @@ -1817,6 +1817,14 @@ "mimeTypes": [ "application/vnd.deepnote.dataframe.v3+json" ] + }, + { + "id": "deepnote-chart-big-number-renderer", + "displayName": "Deepnote Chart Big Number Renderer", + "entrypoint": "./dist/webviews/webview-side/chartBigNumberRenderer/chartBigNumberRenderer.js", + "mimeTypes": [ + "application/vnd.deepnote.chart.big-number+json" + ] } ], "viewsContainers": { @@ -2170,7 +2178,8 @@ "vscode-tas-client": "^0.1.84", "ws": "^6.2.3", "zeromq": "^6.5.0", - "zeromqold": "npm:zeromq@^6.0.0-beta.6" + "zeromqold": "npm:zeromq@^6.0.0-beta.6", + "zod": "^4.1.12" }, "devDependencies": { "@actions/core": "^1.11.1", diff --git a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts new file mode 100644 index 0000000000..8e88e445f3 --- /dev/null +++ b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts @@ -0,0 +1,64 @@ +import { NotebookCellData, NotebookCellKind } from 'vscode'; + +import type { BlockConverter } from './blockConverter'; +import type { DeepnoteBlock } from '../deepnoteTypes'; +import { DeepnoteBigNumberMetadataSchema } from '../deepnoteSchemas'; +import { parseJsonWithFallback } from '../dataConversionUtils'; +import { z } from 'zod'; + +export const DEEPNOTE_VSCODE_RAW_CONTENT_KEY = 'deepnote_jupyter_raw_content'; + +export class ChartBigNumberBlockConverter implements BlockConverter { + applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void { + block.content = ''; + + const config = DeepnoteBigNumberMetadataSchema.safeParse(parseJsonWithFallback(cell.value)); + + if (config.success !== true) { + block.metadata = { + ...block.metadata, + [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: cell.value + }; + return; + } + + if (block.metadata != null) { + delete block.metadata[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]; + } + + block.metadata = { + ...(block.metadata ?? {}), + ...config.data + }; + } + + canConvert(blockType: string): boolean { + return blockType.toLowerCase() === 'big-number'; + } + + convertToCell(block: DeepnoteBlock): NotebookCellData { + console.log('Converting big number block to cell:', block); + + const deepnoteJupyterRawContentResult = z.string().safeParse(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]); + const deepnoteBigNumberMetadataResult = DeepnoteBigNumberMetadataSchema.safeParse(block.metadata); + + if (deepnoteBigNumberMetadataResult.error != null) { + console.error('Error parsing deepnote big number metadata:', deepnoteBigNumberMetadataResult.error); + console.debug('Metadata:', JSON.stringify(block.metadata)); + } + + const configStr = deepnoteJupyterRawContentResult.success + ? deepnoteJupyterRawContentResult.data + : deepnoteBigNumberMetadataResult.success + ? JSON.stringify(deepnoteBigNumberMetadataResult.data, null, 2) + : JSON.stringify(DeepnoteBigNumberMetadataSchema.parse({}), null, 2); + + const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); + console.log(cell); + return cell; + } + + getSupportedTypes(): string[] { + return ['big-number']; + } +} diff --git a/src/notebooks/deepnote/dataConversionUtils.ts b/src/notebooks/deepnote/dataConversionUtils.ts index a3a82a14e6..1b30484770 100644 --- a/src/notebooks/deepnote/dataConversionUtils.ts +++ b/src/notebooks/deepnote/dataConversionUtils.ts @@ -2,6 +2,14 @@ * Utility functions for Deepnote block ID and sorting key generation */ +export function parseJsonWithFallback(value: string, fallback?: unknown): unknown | null { + try { + return JSON.parse(value); + } catch (error) { + return fallback ?? null; + } +} + /** * Generate a random hex ID for blocks (32 character hex string) */ diff --git a/src/notebooks/deepnote/deepnoteConstants.ts b/src/notebooks/deepnote/deepnoteConstants.ts new file mode 100644 index 0000000000..1200071b17 --- /dev/null +++ b/src/notebooks/deepnote/deepnoteConstants.ts @@ -0,0 +1 @@ +export const CHART_BIG_NUMBER_MIME_TYPE = 'application/vnd.deepnote.chart.big-number+json'; diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index 2291df27e9..5e99493988 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -1,12 +1,14 @@ import { NotebookCellData, NotebookCellKind, NotebookCellOutput, NotebookCellOutputItem } from 'vscode'; -import type { DeepnoteBlock, DeepnoteOutput } from './deepnoteTypes'; import { generateBlockId, generateSortingKey } from './dataConversionUtils'; +import type { DeepnoteBlock, DeepnoteOutput } from './deepnoteTypes'; import { ConverterRegistry } from './converters/converterRegistry'; import { CodeBlockConverter } from './converters/codeBlockConverter'; import { addPocketToCellMetadata, createBlockFromPocket } from './pocket'; import { TextBlockConverter } from './converters/textBlockConverter'; import { MarkdownBlockConverter } from './converters/markdownBlockConverter'; +import { ChartBigNumberBlockConverter } from './converters/chartBigNumberBlockConverter'; +import { CHART_BIG_NUMBER_MIME_TYPE } from './deepnoteConstants'; /** * Utility class for converting between Deepnote block structures and VS Code notebook cells. @@ -19,6 +21,7 @@ export class DeepnoteDataConverter { this.registry.register(new CodeBlockConverter()); this.registry.register(new TextBlockConverter()); this.registry.register(new MarkdownBlockConverter()); + this.registry.register(new ChartBigNumberBlockConverter()); } /** @@ -54,7 +57,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.type, block.outputs || []); return cell; }); @@ -202,7 +205,10 @@ export class DeepnoteDataConverter { }); } - private transformOutputsForVsCode(outputs: DeepnoteOutput[]): NotebookCellOutput[] { + private transformOutputsForVsCode( + blockType: DeepnoteBlock['type'], + outputs: DeepnoteOutput[] + ): NotebookCellOutput[] { return outputs.map((output) => { if ('output_type' in output) { if (output.output_type === 'error') { @@ -269,7 +275,21 @@ export class DeepnoteDataConverter { // Plain text as fallback (always last) if (data['text/plain']) { - items.push(NotebookCellOutputItem.text(data['text/plain'] as string)); + let mimeType = 'text/plain'; + if (blockType === 'big-number') { + mimeType = CHART_BIG_NUMBER_MIME_TYPE; + } + items.push(NotebookCellOutputItem.text(data['text/plain'] as string, mimeType)); + } + + // Deepnote chart big number + if (data[CHART_BIG_NUMBER_MIME_TYPE]) { + items.push( + NotebookCellOutputItem.text( + data[CHART_BIG_NUMBER_MIME_TYPE] as string, + CHART_BIG_NUMBER_MIME_TYPE + ) + ); } } diff --git a/src/notebooks/deepnote/deepnoteSchemas.ts b/src/notebooks/deepnote/deepnoteSchemas.ts new file mode 100644 index 0000000000..838004ecb2 --- /dev/null +++ b/src/notebooks/deepnote/deepnoteSchemas.ts @@ -0,0 +1,47 @@ +import { z } from 'zod'; + +export const DeepnoteChartBigNumberOutputSchema = z.object({ + title: z.string().nullish(), + value: z.string().nullish(), + + comparisonTitle: z.string().nullish(), + comparisonValue: z.string().nullish() +}); + +export const DeepnoteBigNumberMetadataSchema = z.object({ + deepnote_big_number_title: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_big_number_value: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_big_number_format: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_big_number_comparison_type: z + .enum(['absolute-value', 'percentage-change', 'absolute-change']) + .nullish() + .transform((val) => val ?? null), + deepnote_big_number_comparison_title: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_big_number_comparison_value: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_big_number_comparison_format: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_big_number_comparison_enabled: z + .boolean() + .nullish() + .transform((val) => val ?? null) +}); + +export type DeepnoteChartBigNumberOutput = z.infer; +export type DeepnoteBigNumberMetadata = z.infer; diff --git a/src/notebooks/deepnote/deepnoteSerializer.ts b/src/notebooks/deepnote/deepnoteSerializer.ts index eafbbe5e91..ca64c86617 100644 --- a/src/notebooks/deepnote/deepnoteSerializer.ts +++ b/src/notebooks/deepnote/deepnoteSerializer.ts @@ -1,12 +1,12 @@ -import { injectable, inject } from 'inversify'; -import { l10n, type CancellationToken, type NotebookData, type NotebookSerializer, workspace } from 'vscode'; +import { inject, injectable } from 'inversify'; import * as yaml from 'js-yaml'; +import { l10n, workspace, type CancellationToken, type NotebookData, type NotebookSerializer } from 'vscode'; import { IDeepnoteNotebookManager } from '../types'; -import type { DeepnoteProject } from './deepnoteTypes'; import { DeepnoteDataConverter } from './deepnoteDataConverter'; +import type { DeepnoteProject } from './deepnoteTypes'; -export { DeepnoteProject, DeepnoteNotebook, DeepnoteOutput } from './deepnoteTypes'; +export { DeepnoteBlock, DeepnoteNotebook, DeepnoteOutput, DeepnoteFile } from './deepnoteTypes'; /** * Serializer for converting between Deepnote YAML files and VS Code notebook format. @@ -64,6 +64,15 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer { const cells = this.converter.convertBlocksToCells(selectedNotebook.blocks); + // for (const cell of cells) { + // console.log(cell.kind, cell.languageId, cell); + // for (const output of cell.outputs ?? []) { + // for (const item of output.items) { + // console.log(' ', item.mime, decodeContent(item.data)); + // } + // } + // } + console.log(`Converted ${cells.length} cells from notebook blocks.`); this.notebookManager.storeOriginalProject(deepnoteProject.project.id, deepnoteProject, selectedNotebook.id); diff --git a/src/webviews/deepnote-utils/format-value.ts b/src/webviews/deepnote-utils/format-value.ts new file mode 100644 index 0000000000..3160352989 --- /dev/null +++ b/src/webviews/deepnote-utils/format-value.ts @@ -0,0 +1,36 @@ +export function formatValue(value: number, format = 'number'): string { + if (format === 'plain') { + return value.toString(); + } + + if (format === 'number') { + return value.toLocaleString(); + } + + if (format === 'percent') { + const percentage = value * 100; + + if (Math.round(percentage) === percentage) { + return `${percentage}%`; + } + + return `${percentage.toFixed(2)}%`; + } + + if (format === 'scientific') { + return value.toExponential(2).toUpperCase(); + } + + if (format === 'currency') { + return value.toLocaleString('en-US', { style: 'currency', currency: 'USD' }); + } + + if (format === 'financial') { + const financialValue = value < 0 ? value * -1 : value; + const formattedValue = financialValue.toLocaleString('en-US', { minimumFractionDigits: 2 }); + + return value >= 0 ? formattedValue : `(${formattedValue})`; + } + + return value.toLocaleString(); +} diff --git a/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx b/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx new file mode 100644 index 0000000000..3844cc62e3 --- /dev/null +++ b/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx @@ -0,0 +1,145 @@ +import React, { useMemo } from 'react'; +import { DeepnoteBigNumberMetadata, DeepnoteChartBigNumberOutput } from '../../../notebooks/deepnote/deepnoteSchemas'; +import { formatValue } from '../../deepnote-utils/format-value'; + +export function ChartBigNumberOutputRenderer({ + output, + metadata +}: { + output: DeepnoteChartBigNumberOutput; + metadata: DeepnoteBigNumberMetadata; +}) { + const hasErrors = false; + + const title = useMemo(() => { + if (hasErrors) { + return 'Not defined'; + } + + return output.title || 'Title'; + }, [output.title, hasErrors]); + + const value = useMemo(() => { + if (hasErrors) { + return 'N/A'; + } + + if (!output.value) { + return 'Value'; + } + + const parsedValue = parseFloat(output.value); + + if (isNaN(parsedValue)) { + return 'NaN'; + } + + return formatValue(parsedValue, metadata.deepnote_big_number_format ?? 'number'); + }, [hasErrors, output.value, metadata.deepnote_big_number_format]); + + const comparisonValue = useMemo(() => { + if (hasErrors) { + return undefined; + } + + if (!output.comparisonValue) { + return undefined; + } + + if (!output.value) { + return; + } + + const isFloat = output.value.includes('.') || output.comparisonValue.includes('.'); + + const parsedValue = isFloat ? parseFloat(output.value) : parseInt(output.value, 10); + const parsedComparisonValue = isFloat + ? parseFloat(output.comparisonValue) + : parseInt(output.comparisonValue, 10); + + if (isNaN(parsedValue) || isNaN(parsedComparisonValue)) { + return undefined; + } + + if (metadata.deepnote_big_number_comparison_type === 'percentage-change') { + return (parsedValue - parsedComparisonValue) / parsedComparisonValue; + } + + if (metadata.deepnote_big_number_comparison_type === 'absolute-value') { + return parsedComparisonValue; + } + + return parsedValue - parsedComparisonValue; + }, [hasErrors, metadata.deepnote_big_number_comparison_type, output.comparisonValue, output.value]); + + const formattedComparisonValue = useMemo(() => { + if (hasErrors) { + return '-'; + } + + if (!comparisonValue) { + return '-'; + } + + if (metadata.deepnote_big_number_comparison_type === 'percentage-change') { + const roundedPercentage = Math.round(comparisonValue * 100) / 100; + + return formatValue(roundedPercentage, 'percent'); + } + + return formatValue(comparisonValue, metadata.deepnote_big_number_format ?? 'number'); + }, [comparisonValue, metadata.deepnote_big_number_format, hasErrors, metadata.deepnote_big_number_comparison_type]); + + const changeDirection = useMemo(() => { + if (!comparisonValue) { + return 1; + } + + return comparisonValue >= 0 ? 1 : -1; + }, [comparisonValue]); + + const comparisonClassName = useMemo(() => { + if (metadata.deepnote_big_number_comparison_format === 'off') { + return 'deepnote-comparison-neutral'; + } + + const formatModifier = metadata.deepnote_big_number_comparison_format === 'inverse' ? -1 : 1; + const modifiedDirection = changeDirection * formatModifier; + + if (modifiedDirection < 0) { + return 'deepnote-comparison-negative'; + } + + return 'deepnote-comparison-positive'; + }, [changeDirection, metadata.deepnote_big_number_comparison_format]); + + return ( +
+
+
+
+

{title}

+
+
+

{value}

+
+
+
+

+ {formattedComparisonValue} +

+
+ {output.comparisonTitle != null ? ( + <> + {' '} +
+

{output.comparisonTitle}

+
+ + ) : null} +
+
+
+
+ ); +} diff --git a/src/webviews/webview-side/chart-big-number-renderer/index.ts b/src/webviews/webview-side/chart-big-number-renderer/index.ts new file mode 100644 index 0000000000..9ec37e223f --- /dev/null +++ b/src/webviews/webview-side/chart-big-number-renderer/index.ts @@ -0,0 +1,47 @@ +import './styles.css'; + +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; + +import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-notebook-renderer'; + +import { ChartBigNumberOutputRenderer } from './ChartBigNumberOutputRenderer'; +import { + DeepnoteBigNumberMetadataSchema, + DeepnoteChartBigNumberOutputSchema +} from '../../../notebooks/deepnote/deepnoteSchemas'; + +export const activate: ActivationFunction = (_context: RendererContext) => { + return { + renderOutputItem(outputItem: OutputItem, element: HTMLElement) { + try { + // .slice(1, -1) is to remove the quotes from the json string + const data = JSON.parse(outputItem.text().slice(1, -1)); + const metadata = DeepnoteBigNumberMetadataSchema.parse(outputItem.metadata); + console.log('Chart Big Number renderer - received data:', data); + + const chartBigNumberOutput = DeepnoteChartBigNumberOutputSchema.parse(data); + console.log('bigNumberConfig', chartBigNumberOutput); + + const root = document.createElement('div'); + element.appendChild(root); + + ReactDOM.render( + React.createElement(ChartBigNumberOutputRenderer, { output: chartBigNumberOutput, metadata }), + root + ); + } catch (error) { + console.error('Error rendering chart big number:', error); + const errorDiv = document.createElement('div'); + errorDiv.style.padding = '10px'; + errorDiv.style.color = 'var(--vscode-errorForeground)'; + errorDiv.textContent = `Error rendering chart big number: ${error}`; + element.appendChild(errorDiv); + } + }, + + disposeOutputItem(_id?: string) { + // Cleanup if needed + } + }; +}; diff --git a/src/webviews/webview-side/chart-big-number-renderer/styles.css b/src/webviews/webview-side/chart-big-number-renderer/styles.css new file mode 100644 index 0000000000..86eb50b0e3 --- /dev/null +++ b/src/webviews/webview-side/chart-big-number-renderer/styles.css @@ -0,0 +1,54 @@ +.deepnote-big-number-container { + display: flex; + flex-direction: row; +} + +.deepnote-big-number-card { + display: flex; + flex-shrink: 0; + padding: 16px; + border-radius: 6px; + border: 1px solid var(--vscode-panel-border); + font-size: 13px; +} + +.deepnote-big-number-content { + width: 200px; +} + +.deepnote-big-number-title { + word-wrap: break-word; + margin: 0; +} + +.deepnote-big-number-value { + font-size: 24px; + font-weight: 600; + margin: 0; +} + +.deepnote-big-number-comparison { + display: flex; + column-gap: 0.5rem; +} + +.deepnote-comparison-text { + margin: 0; +} + +.deepnote-comparison-title { + margin: 0; +} + +/* Conditional comparison colors */ +.deepnote-comparison-positive { + color: var(--vscode-charts-green); +} + +.deepnote-comparison-negative { + color: var(--vscode-errorForeground); +} + +.deepnote-comparison-neutral { + color: var(--vscode-foreground); +} From 62297c208f4694877fd7681ecc107095160bccb2 Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Mon, 13 Oct 2025 07:46:42 +0000 Subject: [PATCH 04/70] refactor: Clean up debug logs and improve big number block conversion handling --- .../converters/chartBigNumberBlockConverter.ts | 5 ++--- src/notebooks/deepnote/deepnoteSerializer.ts | 9 --------- .../ChartBigNumberOutputRenderer.tsx | 18 ++++++++++-------- .../chart-big-number-renderer/index.ts | 6 ++---- 4 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts index 8e88e445f3..e61afb3f07 100644 --- a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts +++ b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts @@ -7,6 +7,7 @@ import { parseJsonWithFallback } from '../dataConversionUtils'; import { z } from 'zod'; export const DEEPNOTE_VSCODE_RAW_CONTENT_KEY = 'deepnote_jupyter_raw_content'; +const DEFAULT_BIG_NUMBER_CONFIG = DeepnoteBigNumberMetadataSchema.parse({}); export class ChartBigNumberBlockConverter implements BlockConverter { applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void { @@ -37,8 +38,6 @@ export class ChartBigNumberBlockConverter implements BlockConverter { } convertToCell(block: DeepnoteBlock): NotebookCellData { - console.log('Converting big number block to cell:', block); - const deepnoteJupyterRawContentResult = z.string().safeParse(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]); const deepnoteBigNumberMetadataResult = DeepnoteBigNumberMetadataSchema.safeParse(block.metadata); @@ -51,7 +50,7 @@ export class ChartBigNumberBlockConverter implements BlockConverter { ? deepnoteJupyterRawContentResult.data : deepnoteBigNumberMetadataResult.success ? JSON.stringify(deepnoteBigNumberMetadataResult.data, null, 2) - : JSON.stringify(DeepnoteBigNumberMetadataSchema.parse({}), null, 2); + : JSON.stringify(DEFAULT_BIG_NUMBER_CONFIG); const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); console.log(cell); diff --git a/src/notebooks/deepnote/deepnoteSerializer.ts b/src/notebooks/deepnote/deepnoteSerializer.ts index ca64c86617..338c0a72a0 100644 --- a/src/notebooks/deepnote/deepnoteSerializer.ts +++ b/src/notebooks/deepnote/deepnoteSerializer.ts @@ -64,15 +64,6 @@ export class DeepnoteNotebookSerializer implements NotebookSerializer { const cells = this.converter.convertBlocksToCells(selectedNotebook.blocks); - // for (const cell of cells) { - // console.log(cell.kind, cell.languageId, cell); - // for (const output of cell.outputs ?? []) { - // for (const item of output.items) { - // console.log(' ', item.mime, decodeContent(item.data)); - // } - // } - // } - console.log(`Converted ${cells.length} cells from notebook blocks.`); this.notebookManager.storeOriginalProject(deepnoteProject.project.id, deepnoteProject, selectedNotebook.id); diff --git a/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx b/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx index 3844cc62e3..428798f5b0 100644 --- a/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx +++ b/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx @@ -9,6 +9,7 @@ export function ChartBigNumberOutputRenderer({ output: DeepnoteChartBigNumberOutput; metadata: DeepnoteBigNumberMetadata; }) { + // TODO: either remove or handle here .. currently handled in the parent const hasErrors = false; const title = useMemo(() => { @@ -62,6 +63,10 @@ export function ChartBigNumberOutputRenderer({ } if (metadata.deepnote_big_number_comparison_type === 'percentage-change') { + if (parsedComparisonValue === 0) { + return undefined; + } + return (parsedValue - parsedComparisonValue) / parsedComparisonValue; } @@ -77,7 +82,7 @@ export function ChartBigNumberOutputRenderer({ return '-'; } - if (!comparisonValue) { + if (comparisonValue == null) { return '-'; } @@ -91,7 +96,7 @@ export function ChartBigNumberOutputRenderer({ }, [comparisonValue, metadata.deepnote_big_number_format, hasErrors, metadata.deepnote_big_number_comparison_type]); const changeDirection = useMemo(() => { - if (!comparisonValue) { + if (comparisonValue == null) { return 1; } @@ -130,12 +135,9 @@ export function ChartBigNumberOutputRenderer({

{output.comparisonTitle != null ? ( - <> - {' '} -
-

{output.comparisonTitle}

-
- +
+

{output.comparisonTitle}

+
) : null} diff --git a/src/webviews/webview-side/chart-big-number-renderer/index.ts b/src/webviews/webview-side/chart-big-number-renderer/index.ts index 9ec37e223f..491bad9e78 100644 --- a/src/webviews/webview-side/chart-big-number-renderer/index.ts +++ b/src/webviews/webview-side/chart-big-number-renderer/index.ts @@ -15,13 +15,11 @@ export const activate: ActivationFunction = (_context: RendererContext) return { renderOutputItem(outputItem: OutputItem, element: HTMLElement) { try { - // .slice(1, -1) is to remove the quotes from the json string - const data = JSON.parse(outputItem.text().slice(1, -1)); + // Remove single quotes from start and end of string if present + const data = JSON.parse(outputItem.text().replace(/^'|'$/g, '')); const metadata = DeepnoteBigNumberMetadataSchema.parse(outputItem.metadata); - console.log('Chart Big Number renderer - received data:', data); const chartBigNumberOutput = DeepnoteChartBigNumberOutputSchema.parse(data); - console.log('bigNumberConfig', chartBigNumberOutput); const root = document.createElement('div'); element.appendChild(root); From 7878345422e7fc6d5ba7df8f134ec936d4e86f10 Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Mon, 13 Oct 2025 12:46:57 +0000 Subject: [PATCH 05/70] feat: Pass block metadata to cell outputs for renderer to access --- src/notebooks/deepnote/deepnoteConstants.ts | 2 ++ .../deepnote/deepnoteDataConverter.ts | 17 +++++++++--- src/notebooks/deepnote/deepnoteSchemas.ts | 8 ++++++ .../ChartBigNumberOutputRenderer.tsx | 26 ++++++++++++------- .../chart-big-number-renderer/index.ts | 12 ++++++--- 5 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/notebooks/deepnote/deepnoteConstants.ts b/src/notebooks/deepnote/deepnoteConstants.ts index 1200071b17..b142cf0526 100644 --- a/src/notebooks/deepnote/deepnoteConstants.ts +++ b/src/notebooks/deepnote/deepnoteConstants.ts @@ -1 +1,3 @@ +export const OUTPUT_BLOCK_METADATA_KEY = 'blockMetadata'; + export const CHART_BIG_NUMBER_MIME_TYPE = 'application/vnd.deepnote.chart.big-number+json'; diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index 5e99493988..5ea86dc00a 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -8,7 +8,7 @@ import { addPocketToCellMetadata, createBlockFromPocket } from './pocket'; import { TextBlockConverter } from './converters/textBlockConverter'; import { MarkdownBlockConverter } from './converters/markdownBlockConverter'; import { ChartBigNumberBlockConverter } from './converters/chartBigNumberBlockConverter'; -import { CHART_BIG_NUMBER_MIME_TYPE } from './deepnoteConstants'; +import { CHART_BIG_NUMBER_MIME_TYPE, OUTPUT_BLOCK_METADATA_KEY } from './deepnoteConstants'; /** * Utility class for converting between Deepnote block structures and VS Code notebook cells. @@ -57,7 +57,7 @@ export class DeepnoteDataConverter { // The pocket is a place to tuck away Deepnote-specific fields for later. addPocketToCellMetadata(cell); - cell.outputs = this.transformOutputsForVsCode(block.type, block.outputs || []); + cell.outputs = this.transformOutputsForVsCode(block.type, block.metadata, block.outputs || []); return cell; }); @@ -198,6 +198,14 @@ export class DeepnoteDataConverter { if (Object.keys(restMetadata).length > 0) { (deepnoteOutput as DeepnoteOutput & { metadata?: Record }).metadata = restMetadata; + + if ( + deepnoteOutput.metadata != null && + typeof deepnoteOutput.metadata === 'object' && + OUTPUT_BLOCK_METADATA_KEY in deepnoteOutput.metadata + ) { + delete deepnoteOutput.metadata[OUTPUT_BLOCK_METADATA_KEY]; + } } } @@ -207,6 +215,7 @@ export class DeepnoteDataConverter { private transformOutputsForVsCode( blockType: DeepnoteBlock['type'], + blockMetadata: DeepnoteBlock['metadata'], outputs: DeepnoteOutput[] ): NotebookCellOutput[] { return outputs.map((output) => { @@ -294,7 +303,9 @@ export class DeepnoteDataConverter { } // Preserve metadata and execution_count - const metadata: Record = {}; + const metadata: Record = { + blockMetadata + }; if (output.execution_count !== undefined) { metadata.executionCount = output.execution_count; diff --git a/src/notebooks/deepnote/deepnoteSchemas.ts b/src/notebooks/deepnote/deepnoteSchemas.ts index 838004ecb2..5972943f26 100644 --- a/src/notebooks/deepnote/deepnoteSchemas.ts +++ b/src/notebooks/deepnote/deepnoteSchemas.ts @@ -1,5 +1,7 @@ import { z } from 'zod'; +import { OUTPUT_BLOCK_METADATA_KEY } from './deepnoteConstants'; + export const DeepnoteChartBigNumberOutputSchema = z.object({ title: z.string().nullish(), value: z.string().nullish(), @@ -43,5 +45,11 @@ export const DeepnoteBigNumberMetadataSchema = z.object({ .transform((val) => val ?? null) }); +export function getDeepnoteBlockMetadataSchema(schema: T) { + return z.object({ + [OUTPUT_BLOCK_METADATA_KEY]: schema + }); +} + export type DeepnoteChartBigNumberOutput = z.infer; export type DeepnoteBigNumberMetadata = z.infer; diff --git a/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx b/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx index 428798f5b0..5cdf9844c2 100644 --- a/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx +++ b/src/webviews/webview-side/chart-big-number-renderer/ChartBigNumberOutputRenderer.tsx @@ -118,6 +118,10 @@ export function ChartBigNumberOutputRenderer({ return 'deepnote-comparison-positive'; }, [changeDirection, metadata.deepnote_big_number_comparison_format]); + const showComparison = + metadata.deepnote_big_number_comparison_enabled === true && + metadata.deepnote_big_number_comparison_type != null; + return (
@@ -128,18 +132,20 @@ export function ChartBigNumberOutputRenderer({

{value}

-
-
-

- {formattedComparisonValue} -

-
- {output.comparisonTitle != null ? ( + {showComparison ? ( +
-

{output.comparisonTitle}

+

+ {formattedComparisonValue} +

- ) : null} -
+ {output.comparisonTitle != null ? ( +
+

{output.comparisonTitle}

+
+ ) : null} +
+ ) : null}
diff --git a/src/webviews/webview-side/chart-big-number-renderer/index.ts b/src/webviews/webview-side/chart-big-number-renderer/index.ts index 491bad9e78..199889e700 100644 --- a/src/webviews/webview-side/chart-big-number-renderer/index.ts +++ b/src/webviews/webview-side/chart-big-number-renderer/index.ts @@ -8,7 +8,8 @@ import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-not import { ChartBigNumberOutputRenderer } from './ChartBigNumberOutputRenderer'; import { DeepnoteBigNumberMetadataSchema, - DeepnoteChartBigNumberOutputSchema + DeepnoteChartBigNumberOutputSchema, + getDeepnoteBlockMetadataSchema } from '../../../notebooks/deepnote/deepnoteSchemas'; export const activate: ActivationFunction = (_context: RendererContext) => { @@ -17,7 +18,9 @@ export const activate: ActivationFunction = (_context: RendererContext) try { // Remove single quotes from start and end of string if present const data = JSON.parse(outputItem.text().replace(/^'|'$/g, '')); - const metadata = DeepnoteBigNumberMetadataSchema.parse(outputItem.metadata); + const { blockMetadata } = getDeepnoteBlockMetadataSchema(DeepnoteBigNumberMetadataSchema).parse( + outputItem.metadata + ); const chartBigNumberOutput = DeepnoteChartBigNumberOutputSchema.parse(data); @@ -25,7 +28,10 @@ export const activate: ActivationFunction = (_context: RendererContext) element.appendChild(root); ReactDOM.render( - React.createElement(ChartBigNumberOutputRenderer, { output: chartBigNumberOutput, metadata }), + React.createElement(ChartBigNumberOutputRenderer, { + output: chartBigNumberOutput, + metadata: blockMetadata + }), root ); } catch (error) { From a12d0426f0845071ac6cc89caedfb693620c52e1 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Wed, 8 Oct 2025 16:07:55 +0200 Subject: [PATCH 06/70] 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 07/70] 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 08/70] 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 09/70] 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 10/70] 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 11/70] 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 12/70] 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 13/70] 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 14/70] 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 debe3a3f156f3bbdc4b023950858411960cb2728 Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Mon, 13 Oct 2025 14:14:21 +0000 Subject: [PATCH 15/70] feat: Support Deepnote input blocks From a476bfd6fd2a1c8e15284f1bfb752594d774976c Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Mon, 13 Oct 2025 14:21:27 +0000 Subject: [PATCH 16/70] feat: Move DEEPNOTE_VSCODE_RAW_CONTENT_KEY into constants file --- .../deepnote/converters/chartBigNumberBlockConverter.ts | 4 ++-- src/notebooks/deepnote/converters/constants.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 src/notebooks/deepnote/converters/constants.ts diff --git a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts index e61afb3f07..68856b5329 100644 --- a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts +++ b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts @@ -1,12 +1,12 @@ import { NotebookCellData, NotebookCellKind } from 'vscode'; +import { z } from 'zod'; import type { BlockConverter } from './blockConverter'; import type { DeepnoteBlock } from '../deepnoteTypes'; import { DeepnoteBigNumberMetadataSchema } from '../deepnoteSchemas'; import { parseJsonWithFallback } from '../dataConversionUtils'; -import { z } from 'zod'; +import { DEEPNOTE_VSCODE_RAW_CONTENT_KEY } from './constants'; -export const DEEPNOTE_VSCODE_RAW_CONTENT_KEY = 'deepnote_jupyter_raw_content'; const DEFAULT_BIG_NUMBER_CONFIG = DeepnoteBigNumberMetadataSchema.parse({}); export class ChartBigNumberBlockConverter implements BlockConverter { diff --git a/src/notebooks/deepnote/converters/constants.ts b/src/notebooks/deepnote/converters/constants.ts new file mode 100644 index 0000000000..514120d3d3 --- /dev/null +++ b/src/notebooks/deepnote/converters/constants.ts @@ -0,0 +1 @@ +export const DEEPNOTE_VSCODE_RAW_CONTENT_KEY = 'deepnote_vscode_raw_content'; From 3a4d57918bc8f598452fed7c459f7bd05e965ee1 Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Mon, 13 Oct 2025 16:32:11 +0200 Subject: [PATCH 17/70] 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 01569a0857deb98ad3a3a4233e171a1eac2da17d Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Mon, 13 Oct 2025 17:03:55 +0000 Subject: [PATCH 18/70] feat: Add Deepnote input blocks converters --- .../deepnote/converters/inputConverters.ts | 201 +++ .../converters/inputConverters.unit.test.ts | 1151 +++++++++++++++++ .../deepnote/deepnoteDataConverter.ts | 22 + src/notebooks/deepnote/deepnoteSchemas.ts | 207 +++ 4 files changed, 1581 insertions(+) create mode 100644 src/notebooks/deepnote/converters/inputConverters.ts create mode 100644 src/notebooks/deepnote/converters/inputConverters.unit.test.ts diff --git a/src/notebooks/deepnote/converters/inputConverters.ts b/src/notebooks/deepnote/converters/inputConverters.ts new file mode 100644 index 0000000000..9b70be65de --- /dev/null +++ b/src/notebooks/deepnote/converters/inputConverters.ts @@ -0,0 +1,201 @@ +import { NotebookCellData, NotebookCellKind } from 'vscode'; +import { z } from 'zod'; + +import type { BlockConverter } from './blockConverter'; +import type { DeepnoteBlock } from '../deepnoteTypes'; +import { + DeepnoteTextInputMetadataSchema, + DeepnoteTextareaInputMetadataSchema, + DeepnoteSelectInputMetadataSchema, + DeepnoteSliderInputMetadataSchema, + DeepnoteCheckboxInputMetadataSchema, + DeepnoteDateInputMetadataSchema, + DeepnoteDateRangeInputMetadataSchema, + DeepnoteFileInputMetadataSchema, + DeepnoteButtonMetadataSchema +} from '../deepnoteSchemas'; +import { parseJsonWithFallback } from '../dataConversionUtils'; +import { DEEPNOTE_VSCODE_RAW_CONTENT_KEY } from './constants'; + +export abstract class BaseInputBlockConverter implements BlockConverter { + abstract schema(): T; + abstract getSupportedType(): string; + abstract defaultConfig(): z.infer; + + applyChangesToBlock(block: DeepnoteBlock, cell: NotebookCellData): void { + block.content = ''; + + const config = this.schema().safeParse(parseJsonWithFallback(cell.value)); + + if (config.success !== true) { + block.metadata = { + ...block.metadata, + [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: cell.value + }; + return; + } + + if (block.metadata != null) { + delete block.metadata[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]; + } + + block.metadata = { + ...(block.metadata ?? {}), + ...config.data + }; + } + + canConvert(blockType: string): boolean { + return blockType.toLowerCase() === this.getSupportedType(); + } + + convertToCell(block: DeepnoteBlock): NotebookCellData { + const deepnoteJupyterRawContentResult = z.string().safeParse(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]); + const deepnoteBigNumberMetadataResult = this.schema().safeParse(block.metadata); + + if (deepnoteBigNumberMetadataResult.error != null) { + console.error('Error parsing deepnote big number metadata:', deepnoteBigNumberMetadataResult.error); + console.debug('Metadata:', JSON.stringify(block.metadata)); + } + + const configStr = deepnoteJupyterRawContentResult.success + ? deepnoteJupyterRawContentResult.data + : deepnoteBigNumberMetadataResult.success + ? JSON.stringify(deepnoteBigNumberMetadataResult.data, null, 2) + : JSON.stringify(this.defaultConfig()); + + const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); + console.log(cell); + return cell; + } + + getSupportedTypes(): string[] { + return [this.getSupportedType()]; + } +} + +export class InputTextBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_INPUT_TEXT_CONFIG = DeepnoteTextInputMetadataSchema.parse({}); + + schema() { + return DeepnoteTextInputMetadataSchema; + } + getSupportedType() { + return 'input-text'; + } + defaultConfig() { + return this.DEFAULT_INPUT_TEXT_CONFIG; + } +} + +export class InputTextareaBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_INPUT_TEXTAREA_CONFIG = DeepnoteTextareaInputMetadataSchema.parse({}); + + schema() { + return DeepnoteTextareaInputMetadataSchema; + } + getSupportedType() { + return 'input-textarea'; + } + defaultConfig() { + return this.DEFAULT_INPUT_TEXTAREA_CONFIG; + } +} + +export class InputSelectBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_INPUT_SELECT_CONFIG = DeepnoteSelectInputMetadataSchema.parse({}); + + schema() { + return DeepnoteSelectInputMetadataSchema; + } + getSupportedType() { + return 'input-select'; + } + defaultConfig() { + return this.DEFAULT_INPUT_SELECT_CONFIG; + } +} + +export class InputSliderBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_INPUT_SLIDER_CONFIG = DeepnoteSliderInputMetadataSchema.parse({}); + + schema() { + return DeepnoteSliderInputMetadataSchema; + } + getSupportedType() { + return 'input-slider'; + } + defaultConfig() { + return this.DEFAULT_INPUT_SLIDER_CONFIG; + } +} + +export class InputCheckboxBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_INPUT_CHECKBOX_CONFIG = DeepnoteCheckboxInputMetadataSchema.parse({}); + + schema() { + return DeepnoteCheckboxInputMetadataSchema; + } + getSupportedType() { + return 'input-checkbox'; + } + defaultConfig() { + return this.DEFAULT_INPUT_CHECKBOX_CONFIG; + } +} + +export class InputDateBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_INPUT_DATE_CONFIG = DeepnoteDateInputMetadataSchema.parse({}); + + schema() { + return DeepnoteDateInputMetadataSchema; + } + getSupportedType() { + return 'input-date'; + } + defaultConfig() { + return this.DEFAULT_INPUT_DATE_CONFIG; + } +} + +export class InputDateRangeBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_INPUT_DATE_RANGE_CONFIG = DeepnoteDateRangeInputMetadataSchema.parse({}); + + schema() { + return DeepnoteDateRangeInputMetadataSchema; + } + getSupportedType() { + return 'input-date-range'; + } + defaultConfig() { + return this.DEFAULT_INPUT_DATE_RANGE_CONFIG; + } +} + +export class InputFileBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_INPUT_FILE_CONFIG = DeepnoteFileInputMetadataSchema.parse({}); + + schema() { + return DeepnoteFileInputMetadataSchema; + } + getSupportedType() { + return 'input-file'; + } + defaultConfig() { + return this.DEFAULT_INPUT_FILE_CONFIG; + } +} + +export class ButtonBlockConverter extends BaseInputBlockConverter { + private readonly DEFAULT_BUTTON_CONFIG = DeepnoteButtonMetadataSchema.parse({}); + + schema() { + return DeepnoteButtonMetadataSchema; + } + getSupportedType() { + return 'button'; + } + defaultConfig() { + return this.DEFAULT_BUTTON_CONFIG; + } +} diff --git a/src/notebooks/deepnote/converters/inputConverters.unit.test.ts b/src/notebooks/deepnote/converters/inputConverters.unit.test.ts new file mode 100644 index 0000000000..fbda5efeb1 --- /dev/null +++ b/src/notebooks/deepnote/converters/inputConverters.unit.test.ts @@ -0,0 +1,1151 @@ +import { assert } from 'chai'; +import { NotebookCellData, NotebookCellKind } from 'vscode'; + +import type { DeepnoteBlock } from '../deepnoteTypes'; +import { + InputTextBlockConverter, + InputTextareaBlockConverter, + InputSelectBlockConverter, + InputSliderBlockConverter, + InputCheckboxBlockConverter, + InputDateBlockConverter, + InputDateRangeBlockConverter, + InputFileBlockConverter, + ButtonBlockConverter +} from './inputConverters'; +import { DEEPNOTE_VSCODE_RAW_CONTENT_KEY } from './constants'; + +suite('InputTextBlockConverter', () => { + let converter: InputTextBlockConverter; + + setup(() => { + converter = new InputTextBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts input-text block with metadata to JSON cell', () => { + const block: DeepnoteBlock = { + blockGroup: '92f21410c8c54ac0be7e4d2a544552ee', + content: '', + id: '70c6668216ce43cfb556e57247a31fb9', + metadata: { + deepnote_input_label: 'some display name', + deepnote_variable_name: 'input_1', + deepnote_variable_value: 'some text input', + deepnote_variable_default_value: 'some default value' + }, + sortingKey: 's', + type: 'input-text' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_input_label, 'some display name'); + assert.strictEqual(parsed.deepnote_variable_name, 'input_1'); + assert.strictEqual(parsed.deepnote_variable_value, 'some text input'); + assert.strictEqual(parsed.deepnote_variable_default_value, 'some default value'); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-text' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_input_label); + assert.isNull(parsed.deepnote_variable_name); + assert.isNull(parsed.deepnote_variable_value); + assert.isNull(parsed.deepnote_variable_default_value); + }); + + test('uses raw content when available', () => { + const rawContent = '{"deepnote_variable_name": "custom"}'; + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + metadata: { + [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: rawContent + }, + sortingKey: 'a0', + type: 'input-text' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.value, rawContent); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON to block metadata', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: 'old content', + id: 'block-123', + sortingKey: 'a0', + type: 'input-text' + }; + const cellValue = JSON.stringify( + { + deepnote_input_label: 'new label', + deepnote_variable_name: 'new_var', + deepnote_variable_value: 'new value', + deepnote_variable_default_value: 'new default' + }, + null, + 2 + ); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_input_label, 'new label'); + assert.strictEqual(block.metadata?.deepnote_variable_name, 'new_var'); + assert.strictEqual(block.metadata?.deepnote_variable_value, 'new value'); + assert.strictEqual(block.metadata?.deepnote_variable_default_value, 'new default'); + }); + + test('handles invalid JSON by storing in raw content key', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: 'old content', + id: 'block-123', + sortingKey: 'a0', + type: 'input-text' + }; + const invalidJson = '{invalid json}'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + + test('clears raw content key when valid JSON is applied', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + metadata: { + [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: 'old raw content' + }, + sortingKey: 'a0', + type: 'input-text' + }; + const cellValue = JSON.stringify({ + deepnote_variable_name: 'var1' + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.isUndefined(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]); + }); + + test('does not modify other block properties', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: 'old content', + id: 'block-123', + executionCount: 5, + sortingKey: 'a0', + type: 'input-text' + }; + const cellValue = JSON.stringify({ deepnote_variable_name: 'var' }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.id, 'block-123'); + assert.strictEqual(block.type, 'input-text'); + assert.strictEqual(block.sortingKey, 'a0'); + assert.strictEqual(block.executionCount, 5); + }); + }); +}); + +suite('InputTextareaBlockConverter', () => { + let converter: InputTextareaBlockConverter; + + setup(() => { + converter = new InputTextareaBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts input-textarea block with multiline value to JSON cell', () => { + const block: DeepnoteBlock = { + blockGroup: '2b5f9340349f4baaa5a3237331214352', + content: '', + id: 'cbfee3d709dc4592b3186e8e95adca55', + metadata: { + deepnote_variable_name: 'input_2', + deepnote_variable_value: 'some multiline\ntext input' + }, + sortingKey: 'v', + type: 'input-textarea' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_variable_name, 'input_2'); + assert.strictEqual(parsed.deepnote_variable_value, 'some multiline\ntext input'); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-textarea' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_variable_name); + assert.isNull(parsed.deepnote_variable_value); + assert.isNull(parsed.deepnote_input_label); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON with multiline value to block metadata', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-textarea' + }; + const cellValue = JSON.stringify({ + deepnote_variable_name: 'textarea_var', + deepnote_variable_value: 'line1\nline2\nline3' + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_variable_name, 'textarea_var'); + assert.strictEqual(block.metadata?.deepnote_variable_value, 'line1\nline2\nline3'); + }); + + test('handles invalid JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-textarea' + }; + const invalidJson = 'not json'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + }); +}); + +suite('InputSelectBlockConverter', () => { + let converter: InputSelectBlockConverter; + + setup(() => { + converter = new InputSelectBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts input-select block with single value', () => { + const block: DeepnoteBlock = { + blockGroup: 'ba248341bdd94b93a234777968bfedcf', + content: '', + id: '83cdcbd2ea5b462a900b6a3d7c8b04cf', + metadata: { + deepnote_input_label: '', + deepnote_variable_name: 'input_3', + deepnote_variable_value: 'Option 1', + deepnote_variable_options: ['Option 1', 'Option 2'], + deepnote_variable_select_type: 'from-options', + deepnote_variable_custom_options: ['Option 1', 'Option 2'], + deepnote_variable_selected_variable: '' + }, + sortingKey: 'x', + type: 'input-select' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_variable_name, 'input_3'); + assert.strictEqual(parsed.deepnote_variable_value, 'Option 1'); + assert.deepStrictEqual(parsed.deepnote_variable_options, ['Option 1', 'Option 2']); + }); + + test('converts input-select block with multiple values', () => { + const block: DeepnoteBlock = { + blockGroup: '9f77387639cd432bb913890dea32b6c3', + content: '', + id: '748548e64442416bb9f3a9c5ec22c4de', + metadata: { + deepnote_input_label: 'some select display name', + deepnote_variable_name: 'input_4', + deepnote_variable_value: ['Option 1'], + deepnote_variable_options: ['Option 1', 'Option 2'], + deepnote_variable_select_type: 'from-options', + deepnote_allow_multiple_values: true, + deepnote_variable_custom_options: ['Option 1', 'Option 2'], + deepnote_variable_selected_variable: '' + }, + sortingKey: 'y', + type: 'input-select' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_allow_multiple_values, true); + assert.deepStrictEqual(parsed.deepnote_variable_value, ['Option 1']); + }); + + test('converts input-select block with allow empty values', () => { + const block: DeepnoteBlock = { + blockGroup: '146c4af1efb2448fa2d3b7cfbd30da77', + content: '', + id: 'a3521dd942d2407693b0202b55c935a7', + metadata: { + deepnote_input_label: 'allows empty value', + deepnote_variable_name: 'input_5', + deepnote_variable_value: 'Option 1', + deepnote_variable_options: ['Option 1', 'Option 2'], + deepnote_allow_empty_values: true, + deepnote_variable_select_type: 'from-options', + deepnote_variable_default_value: '', + deepnote_variable_custom_options: ['Option 1', 'Option 2'], + deepnote_variable_selected_variable: '' + }, + sortingKey: 'yU', + type: 'input-select' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_allow_empty_values, true); + assert.strictEqual(parsed.deepnote_variable_default_value, ''); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-select' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_variable_name); + assert.isNull(parsed.deepnote_variable_value); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON with single value', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-select' + }; + const cellValue = JSON.stringify({ + deepnote_variable_name: 'select_var', + deepnote_variable_value: 'Option A', + deepnote_variable_options: ['Option A', 'Option B'] + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_variable_value, 'Option A'); + assert.deepStrictEqual(block.metadata?.deepnote_variable_options, ['Option A', 'Option B']); + }); + + test('applies valid JSON with array value', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-select' + }; + const cellValue = JSON.stringify({ + deepnote_variable_value: ['Option 1', 'Option 2'], + deepnote_allow_multiple_values: true + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.deepStrictEqual(block.metadata?.deepnote_variable_value, ['Option 1', 'Option 2']); + assert.strictEqual(block.metadata?.deepnote_allow_multiple_values, true); + }); + + test('handles invalid JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-select' + }; + const invalidJson = '{broken'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + }); +}); + +suite('InputSliderBlockConverter', () => { + let converter: InputSliderBlockConverter; + + setup(() => { + converter = new InputSliderBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts input-slider block with basic configuration', () => { + const block: DeepnoteBlock = { + blockGroup: 'e867ead6336e406992c632f315d8316b', + content: '', + id: 'ca9fb5f83cfc454e963d60aeb8060502', + metadata: { + deepnote_input_label: 'slider input value', + deepnote_slider_step: 1, + deepnote_variable_name: 'input_6', + deepnote_variable_value: '5', + deepnote_slider_max_value: 10, + deepnote_slider_min_value: 0, + deepnote_variable_default_value: '5' + }, + sortingKey: 'yj', + type: 'input-slider' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_variable_name, 'input_6'); + assert.strictEqual(parsed.deepnote_variable_value, '5'); + assert.strictEqual(parsed.deepnote_slider_min_value, 0); + assert.strictEqual(parsed.deepnote_slider_max_value, 10); + assert.strictEqual(parsed.deepnote_slider_step, 1); + }); + + test('converts input-slider block with custom step size', () => { + const block: DeepnoteBlock = { + blockGroup: 'a28007ff7c7f4a9d831e7b92fe8f038c', + content: '', + id: '6b4ad1dc5dcd417cbecf5b0bcef7d5be', + metadata: { + deepnote_input_label: 'step size 2', + deepnote_slider_step: 2, + deepnote_variable_name: 'input_7', + deepnote_variable_value: '6', + deepnote_slider_max_value: 10, + deepnote_slider_min_value: 4 + }, + sortingKey: 'yr', + type: 'input-slider' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_slider_step, 2); + assert.strictEqual(parsed.deepnote_slider_min_value, 4); + assert.strictEqual(parsed.deepnote_variable_value, '6'); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-slider' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_variable_name); + assert.isNull(parsed.deepnote_slider_min_value); + assert.isNull(parsed.deepnote_slider_max_value); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON with slider configuration', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-slider' + }; + const cellValue = JSON.stringify({ + deepnote_variable_name: 'slider1', + deepnote_variable_value: '7', + deepnote_slider_min_value: 0, + deepnote_slider_max_value: 100, + deepnote_slider_step: 5 + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_variable_value, '7'); + assert.strictEqual(block.metadata?.deepnote_slider_min_value, 0); + assert.strictEqual(block.metadata?.deepnote_slider_max_value, 100); + assert.strictEqual(block.metadata?.deepnote_slider_step, 5); + }); + + test('handles numeric value', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-slider' + }; + const cellValue = JSON.stringify({ + deepnote_variable_value: 42 + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.deepnote_variable_value, 42); + }); + + test('handles invalid JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-slider' + }; + const invalidJson = 'invalid'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + }); +}); + +suite('InputCheckboxBlockConverter', () => { + let converter: InputCheckboxBlockConverter; + + setup(() => { + converter = new InputCheckboxBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts input-checkbox block to JSON cell', () => { + const block: DeepnoteBlock = { + blockGroup: '5dd57f6bb90b49ebb954f6247b26427d', + content: '', + id: '9f97163d58f14192985d47f89f695239', + metadata: { + deepnote_input_label: '', + deepnote_variable_name: 'input_8', + deepnote_variable_value: false + }, + sortingKey: 'yv', + type: 'input-checkbox' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_variable_name, 'input_8'); + assert.strictEqual(parsed.deepnote_variable_value, false); + }); + + test('handles checkbox with true value', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + metadata: { + deepnote_variable_name: 'check1', + deepnote_variable_value: true + }, + sortingKey: 'a0', + type: 'input-checkbox' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_variable_value, true); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-checkbox' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_variable_name); + assert.isNull(parsed.deepnote_variable_value); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON with boolean value', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-checkbox' + }; + const cellValue = JSON.stringify({ + deepnote_variable_name: 'checkbox1', + deepnote_variable_value: true + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_variable_value, true); + }); + + test('applies false value', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-checkbox' + }; + const cellValue = JSON.stringify({ + deepnote_variable_value: false, + deepnote_variable_default_value: true + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.deepnote_variable_value, false); + assert.strictEqual(block.metadata?.deepnote_variable_default_value, true); + }); + + test('handles invalid JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-checkbox' + }; + const invalidJson = '{]'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + }); +}); + +suite('InputDateBlockConverter', () => { + let converter: InputDateBlockConverter; + + setup(() => { + converter = new InputDateBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts input-date block to JSON cell', () => { + const block: DeepnoteBlock = { + blockGroup: 'e84010446b844a86a1f6bbe5d89dc798', + content: '', + id: '33bce14fafc1431d9293dacc62e6e504', + metadata: { + deepnote_input_label: '', + deepnote_variable_name: 'input_9', + deepnote_variable_value: '2025-10-13T00:00:00.000Z', + deepnote_input_date_version: 2 + }, + sortingKey: 'yx', + type: 'input-date' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_variable_name, 'input_9'); + assert.strictEqual(parsed.deepnote_variable_value, '2025-10-13T00:00:00.000Z'); + assert.strictEqual(parsed.deepnote_input_date_version, 2); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-date' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_variable_name); + assert.isNull(parsed.deepnote_variable_value); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON with date value', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-date' + }; + const cellValue = JSON.stringify({ + deepnote_variable_name: 'date1', + deepnote_variable_value: '2025-12-31T00:00:00.000Z', + deepnote_input_date_version: 2 + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_variable_value, '2025-12-31T00:00:00.000Z'); + assert.strictEqual(block.metadata?.deepnote_input_date_version, 2); + }); + + test('handles invalid JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-date' + }; + const invalidJson = 'not valid'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + }); +}); + +suite('InputDateRangeBlockConverter', () => { + let converter: InputDateRangeBlockConverter; + + setup(() => { + converter = new InputDateRangeBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts input-date-range block with absolute dates', () => { + const block: DeepnoteBlock = { + blockGroup: '1fe36d4de4f04fefbe80cdd0d1a3ad3b', + content: '', + id: '953d7ad89bbf42b38ee8ca1899c3b732', + metadata: { + deepnote_variable_name: 'input_10', + deepnote_variable_value: ['2025-10-06', '2025-10-16'] + }, + sortingKey: 'yy', + type: 'input-date-range' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_variable_name, 'input_10'); + assert.deepStrictEqual(parsed.deepnote_variable_value, ['2025-10-06', '2025-10-16']); + }); + + test('converts input-date-range block with relative date', () => { + const block: DeepnoteBlock = { + blockGroup: '10e193de0aec4f3c80946edf358777e5', + content: '', + id: '322182f9673d45fda1c1aa13f8b02371', + metadata: { + deepnote_input_label: 'relative past 3 months', + deepnote_variable_name: 'input_11', + deepnote_variable_value: 'past3months' + }, + sortingKey: 'yyU', + type: 'input-date-range' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_input_label, 'relative past 3 months'); + assert.strictEqual(parsed.deepnote_variable_value, 'past3months'); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-date-range' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_variable_name); + assert.isNull(parsed.deepnote_variable_value); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON with date range array', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-date-range' + }; + const cellValue = JSON.stringify({ + deepnote_variable_name: 'range1', + deepnote_variable_value: ['2025-01-01', '2025-12-31'] + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.deepStrictEqual(block.metadata?.deepnote_variable_value, ['2025-01-01', '2025-12-31']); + }); + + test('applies valid JSON with relative date string', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-date-range' + }; + const cellValue = JSON.stringify({ + deepnote_variable_value: 'past7days' + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.deepnote_variable_value, 'past7days'); + }); + + test('handles invalid JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-date-range' + }; + const invalidJson = '{{bad}}'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + }); +}); + +suite('InputFileBlockConverter', () => { + let converter: InputFileBlockConverter; + + setup(() => { + converter = new InputFileBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts input-file block to JSON cell', () => { + const block: DeepnoteBlock = { + blockGroup: '651f4f5db96b43d5a6a1a492935fa08d', + content: '', + id: 'c20aa90dacad40b7817f5e7d2823ce88', + metadata: { + deepnote_input_label: 'csv file input', + deepnote_variable_name: 'input_12', + deepnote_variable_value: '', + deepnote_allowed_file_extensions: '.csv' + }, + sortingKey: 'yyj', + type: 'input-file' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_input_label, 'csv file input'); + assert.strictEqual(parsed.deepnote_variable_name, 'input_12'); + assert.strictEqual(parsed.deepnote_allowed_file_extensions, '.csv'); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-file' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_variable_name); + assert.isNull(parsed.deepnote_allowed_file_extensions); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON with file extension', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-file' + }; + const cellValue = JSON.stringify({ + deepnote_variable_name: 'file1', + deepnote_allowed_file_extensions: '.pdf,.docx' + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_allowed_file_extensions, '.pdf,.docx'); + }); + + test('handles invalid JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'input-file' + }; + const invalidJson = 'bad json'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + }); +}); + +suite('ButtonBlockConverter', () => { + let converter: ButtonBlockConverter; + + setup(() => { + converter = new ButtonBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts button block with set_variable behavior', () => { + const block: DeepnoteBlock = { + blockGroup: '22e563550e734e75b35252e4975c3110', + content: '', + id: 'd1af4f0aea6943d2941d4a168b4d03f7', + metadata: { + deepnote_button_title: 'Run', + deepnote_variable_name: 'button_1', + deepnote_button_behavior: 'set_variable', + deepnote_button_color_scheme: 'blue' + }, + sortingKey: 'yyr', + type: 'button' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_button_title, 'Run'); + assert.strictEqual(parsed.deepnote_button_behavior, 'set_variable'); + assert.strictEqual(parsed.deepnote_button_color_scheme, 'blue'); + }); + + test('converts button block with run behavior', () => { + const block: DeepnoteBlock = { + blockGroup: '2a1e97120eb24494adff278264625a4f', + content: '', + id: '6caaf767dc154528bbe3bb29f3c80f4e', + metadata: { + deepnote_button_title: 'Run notebook button', + deepnote_variable_name: 'button_1', + deepnote_button_behavior: 'run', + deepnote_button_color_scheme: 'blue' + }, + sortingKey: 'yyv', + type: 'button' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.strictEqual(parsed.deepnote_button_title, 'Run notebook button'); + assert.strictEqual(parsed.deepnote_button_behavior, 'run'); + }); + + test('handles missing metadata with default config', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'button' + }; + + const cell = converter.convertToCell(block); + + const parsed = JSON.parse(cell.value); + assert.isNull(parsed.deepnote_button_title); + assert.isNull(parsed.deepnote_button_behavior); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON with button configuration', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'button' + }; + const cellValue = JSON.stringify({ + deepnote_button_title: 'Click Me', + deepnote_button_behavior: 'run', + deepnote_button_color_scheme: 'red' + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_button_title, 'Click Me'); + assert.strictEqual(block.metadata?.deepnote_button_behavior, 'run'); + assert.strictEqual(block.metadata?.deepnote_button_color_scheme, 'red'); + }); + + test('applies different color schemes', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'button' + }; + const cellValue = JSON.stringify({ + deepnote_button_color_scheme: 'green' + }); + const cell = new NotebookCellData(NotebookCellKind.Code, cellValue, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.deepnote_button_color_scheme, 'green'); + }); + + test('handles invalid JSON', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + sortingKey: 'a0', + type: 'button' + }; + const invalidJson = '}{'; + const cell = new NotebookCellData(NotebookCellKind.Code, invalidJson, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], invalidJson); + }); + }); +}); diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index 5ea86dc00a..9cbdd55d00 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -9,6 +9,17 @@ import { TextBlockConverter } from './converters/textBlockConverter'; import { MarkdownBlockConverter } from './converters/markdownBlockConverter'; import { ChartBigNumberBlockConverter } from './converters/chartBigNumberBlockConverter'; import { CHART_BIG_NUMBER_MIME_TYPE, OUTPUT_BLOCK_METADATA_KEY } from './deepnoteConstants'; +import { + InputTextBlockConverter, + InputTextareaBlockConverter, + InputSelectBlockConverter, + InputSliderBlockConverter, + InputCheckboxBlockConverter, + InputDateBlockConverter, + InputDateRangeBlockConverter, + InputFileBlockConverter, + ButtonBlockConverter +} from './converters/inputConverters'; /** * Utility class for converting between Deepnote block structures and VS Code notebook cells. @@ -22,6 +33,15 @@ export class DeepnoteDataConverter { this.registry.register(new TextBlockConverter()); this.registry.register(new MarkdownBlockConverter()); this.registry.register(new ChartBigNumberBlockConverter()); + this.registry.register(new InputTextBlockConverter()); + this.registry.register(new InputTextareaBlockConverter()); + this.registry.register(new InputSelectBlockConverter()); + this.registry.register(new InputSliderBlockConverter()); + this.registry.register(new InputCheckboxBlockConverter()); + this.registry.register(new InputDateBlockConverter()); + this.registry.register(new InputDateRangeBlockConverter()); + this.registry.register(new InputFileBlockConverter()); + this.registry.register(new ButtonBlockConverter()); } /** @@ -32,6 +52,8 @@ export class DeepnoteDataConverter { */ convertBlocksToCells(blocks: DeepnoteBlock[]): NotebookCellData[] { return blocks.map((block) => { + console.log('blockType:', block.type); + console.log('registry:', this.registry.listSupportedTypes()); const converter = this.registry.findConverter(block.type); if (!converter) { diff --git a/src/notebooks/deepnote/deepnoteSchemas.ts b/src/notebooks/deepnote/deepnoteSchemas.ts index 5972943f26..aa77e6996b 100644 --- a/src/notebooks/deepnote/deepnoteSchemas.ts +++ b/src/notebooks/deepnote/deepnoteSchemas.ts @@ -45,6 +45,213 @@ export const DeepnoteBigNumberMetadataSchema = z.object({ .transform((val) => val ?? null) }); +export const DeepnoteTextInputMetadataSchema = z.object({ + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_value: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_default_value: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_input_label: z + .string() + .nullish() + .transform((val) => val ?? null) +}); + +export const DeepnoteTextareaInputMetadataSchema = z.object({ + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_value: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_input_label: z + .string() + .nullish() + .transform((val) => val ?? null) +}); + +export const DeepnoteSelectInputMetadataSchema = z.object({ + deepnote_input_label: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_value: z + .union([z.string(), z.array(z.string())]) + .nullish() + .transform((val) => val ?? null), + deepnote_variable_options: z + .array(z.string()) + .nullish() + .transform((val) => val ?? null), + deepnote_variable_custom_options: z + .array(z.string()) + .nullish() + .transform((val) => val ?? null), + deepnote_variable_select_type: z + .enum(['from-options', 'from-variable']) + .nullish() + .transform((val) => val ?? null), + deepnote_allow_multiple_values: z + .boolean() + .nullish() + .transform((val) => val ?? null), + deepnote_allow_empty_values: z + .boolean() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_default_value: z + .union([z.string(), z.array(z.string())]) + .nullish() + .transform((val) => val ?? null), + deepnote_variable_selected_variable: z + .string() + .nullish() + .transform((val) => val ?? null) +}); + +export const DeepnoteSliderInputMetadataSchema = z.object({ + deepnote_input_label: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_value: z + .union([z.string(), z.number()]) + .nullish() + .transform((val) => val ?? null), + deepnote_slider_min_value: z + .number() + .nullish() + .transform((val) => val ?? null), + deepnote_slider_max_value: z + .number() + .nullish() + .transform((val) => val ?? null), + deepnote_slider_step: z + .number() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_default_value: z + .string() + .nullish() + .transform((val) => val ?? null) +}); + +export const DeepnoteCheckboxInputMetadataSchema = z.object({ + deepnote_input_label: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_value: z + .boolean() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_default_value: z + .boolean() + .nullish() + .transform((val) => val ?? null) +}); + +export const DeepnoteDateInputMetadataSchema = z.object({ + deepnote_input_label: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_value: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_default_value: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_input_date_version: z + .number() + .nullish() + .transform((val) => val ?? null) +}); + +export const DeepnoteDateRangeInputMetadataSchema = z.object({ + deepnote_input_label: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_value: z + .union([z.string(), z.tuple([z.string(), z.string()])]) + .nullish() + .transform((val) => val ?? null), + deepnote_variable_default_value: z + .union([z.string(), z.tuple([z.string(), z.string()])]) + .nullish() + .transform((val) => val ?? null) +}); + +export const DeepnoteFileInputMetadataSchema = z.object({ + deepnote_input_label: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_value: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_allowed_file_extensions: z + .string() + .nullish() + .transform((val) => val ?? null) +}); + +export const DeepnoteButtonMetadataSchema = z.object({ + deepnote_button_title: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_variable_name: z + .string() + .nullish() + .transform((val) => val ?? null), + deepnote_button_behavior: z + .enum(['run', 'set_variable']) + .nullish() + .transform((val) => val ?? null), + deepnote_button_color_scheme: z + .enum(['blue', 'red', 'neutral', 'green', 'yellow']) + .nullish() + .transform((val) => val ?? null) +}); + export function getDeepnoteBlockMetadataSchema(schema: T) { return z.object({ [OUTPUT_BLOCK_METADATA_KEY]: schema From 402f0773a5386648d5bc6fa5cb323bef0c09ffc9 Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Mon, 13 Oct 2025 17:33:04 +0000 Subject: [PATCH 19/70] refactor: Remove debug logs and refine metadata parsing in Deepnote converters --- src/notebooks/deepnote/converters/inputConverters.ts | 12 ++++++------ src/notebooks/deepnote/deepnoteDataConverter.ts | 2 -- src/notebooks/deepnote/deepnoteSchemas.ts | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/notebooks/deepnote/converters/inputConverters.ts b/src/notebooks/deepnote/converters/inputConverters.ts index 9b70be65de..dd939ac06d 100644 --- a/src/notebooks/deepnote/converters/inputConverters.ts +++ b/src/notebooks/deepnote/converters/inputConverters.ts @@ -51,18 +51,18 @@ export abstract class BaseInputBlockConverter implements convertToCell(block: DeepnoteBlock): NotebookCellData { const deepnoteJupyterRawContentResult = z.string().safeParse(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]); - const deepnoteBigNumberMetadataResult = this.schema().safeParse(block.metadata); + const deepnoteMetadataResult = this.schema().safeParse(block.metadata); - if (deepnoteBigNumberMetadataResult.error != null) { - console.error('Error parsing deepnote big number metadata:', deepnoteBigNumberMetadataResult.error); + if (deepnoteMetadataResult.error != null) { + console.error('Error parsing deepnote input metadata:', deepnoteMetadataResult.error); console.debug('Metadata:', JSON.stringify(block.metadata)); } const configStr = deepnoteJupyterRawContentResult.success ? deepnoteJupyterRawContentResult.data - : deepnoteBigNumberMetadataResult.success - ? JSON.stringify(deepnoteBigNumberMetadataResult.data, null, 2) - : JSON.stringify(this.defaultConfig()); + : deepnoteMetadataResult.success + ? JSON.stringify(deepnoteMetadataResult.data, null, 2) + : JSON.stringify(this.defaultConfig(), null, 2); const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); console.log(cell); diff --git a/src/notebooks/deepnote/deepnoteDataConverter.ts b/src/notebooks/deepnote/deepnoteDataConverter.ts index 9cbdd55d00..c6f9961629 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -52,8 +52,6 @@ export class DeepnoteDataConverter { */ convertBlocksToCells(blocks: DeepnoteBlock[]): NotebookCellData[] { return blocks.map((block) => { - console.log('blockType:', block.type); - console.log('registry:', this.registry.listSupportedTypes()); const converter = this.registry.findConverter(block.type); if (!converter) { diff --git a/src/notebooks/deepnote/deepnoteSchemas.ts b/src/notebooks/deepnote/deepnoteSchemas.ts index aa77e6996b..5f1fcee14b 100644 --- a/src/notebooks/deepnote/deepnoteSchemas.ts +++ b/src/notebooks/deepnote/deepnoteSchemas.ts @@ -132,7 +132,7 @@ export const DeepnoteSliderInputMetadataSchema = z.object({ .nullish() .transform((val) => val ?? null), deepnote_variable_value: z - .union([z.string(), z.number()]) + .string() .nullish() .transform((val) => val ?? null), deepnote_slider_min_value: z From 40ede24a612baea6c870852802c234fa2b2f616c Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Mon, 13 Oct 2025 18:01:40 +0000 Subject: [PATCH 20/70] feat: Add chart big number converter tests --- .../chartBigNumberBlockConverter.ts | 5 +- .../chartBigNumberBlockConverter.unit.test.ts | 414 ++++++++++++++++++ 2 files changed, 417 insertions(+), 2 deletions(-) create mode 100644 src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts diff --git a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts index 68856b5329..9c04ef5de9 100644 --- a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts +++ b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.ts @@ -20,6 +20,7 @@ export class ChartBigNumberBlockConverter implements BlockConverter { ...block.metadata, [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: cell.value }; + return; } @@ -50,10 +51,10 @@ export class ChartBigNumberBlockConverter implements BlockConverter { ? deepnoteJupyterRawContentResult.data : deepnoteBigNumberMetadataResult.success ? JSON.stringify(deepnoteBigNumberMetadataResult.data, null, 2) - : JSON.stringify(DEFAULT_BIG_NUMBER_CONFIG); + : JSON.stringify(DEFAULT_BIG_NUMBER_CONFIG, null, 2); const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); - console.log(cell); + return cell; } diff --git a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts new file mode 100644 index 0000000000..22cf49188d --- /dev/null +++ b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts @@ -0,0 +1,414 @@ +import { assert } from 'chai'; +import { NotebookCellData, NotebookCellKind } from 'vscode'; + +import type { DeepnoteBlock } from '../deepnoteTypes'; +import { ChartBigNumberBlockConverter } from './chartBigNumberBlockConverter'; +import { DEEPNOTE_VSCODE_RAW_CONTENT_KEY } from './constants'; + +suite('ChartBigNumberBlockConverter', () => { + let converter: ChartBigNumberBlockConverter; + + setup(() => { + converter = new ChartBigNumberBlockConverter(); + }); + + suite('convertToCell', () => { + test('converts percentage change comparison block to cell', () => { + const block: DeepnoteBlock = { + blockGroup: '30b63388a2ad4cf19e9aa3888220a98f', + content: '', + id: '59ae10ae7fee437d828601fae86a955b', + metadata: { + execution_start: 1759913029303, + execution_millis: 0, + execution_context_id: '6ba1d348-b911-4d71-a61c-ea2c18c6479a', + deepnote_big_number_title: 'test title', + deepnote_big_number_value: 'b', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'percentage-change', + deepnote_big_number_comparison_title: 'vs a', + deepnote_big_number_comparison_value: 'a', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }, + sortingKey: 'x', + type: 'big-number', + executionCount: 9, + outputs: [ + { + output_type: 'execute_result', + execution_count: 9, + data: { + 'text/plain': '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "percentage change", "value": "30"}' + }, + metadata: {} + } + ] + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const config = JSON.parse(cell.value); + assert.strictEqual(config.deepnote_big_number_title, 'test title'); + assert.strictEqual(config.deepnote_big_number_value, 'b'); + assert.strictEqual(config.deepnote_big_number_format, 'number'); + assert.strictEqual(config.deepnote_big_number_comparison_type, 'percentage-change'); + assert.strictEqual(config.deepnote_big_number_comparison_title, 'vs a'); + assert.strictEqual(config.deepnote_big_number_comparison_value, 'a'); + assert.strictEqual(config.deepnote_big_number_comparison_format, ''); + assert.strictEqual(config.deepnote_big_number_comparison_enabled, true); + }); + + test('converts absolute change comparison block to cell', () => { + const block: DeepnoteBlock = { + blockGroup: '8a409554b54241e89f4aa001506ce335', + content: '', + id: '8b3c525d4c974405a6d4da77b193023e', + metadata: { + allow_embed: false, + execution_start: 1759939140215, + execution_millis: 1, + execution_context_id: 'f493c0ab-aea3-4cdd-84da-77865f369ba8', + deepnote_big_number_title: 'absolute change 2', + deepnote_big_number_value: 'b', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'absolute-change', + deepnote_big_number_comparison_title: 'vs a', + deepnote_big_number_comparison_value: 'a', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }, + sortingKey: 'y', + type: 'big-number', + executionCount: 9, + outputs: [ + { + output_type: 'execute_result', + execution_count: 9, + data: { + 'text/plain': '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "absolute change", "value": "30"}' + }, + metadata: {} + } + ] + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const config = JSON.parse(cell.value); + assert.strictEqual(config.deepnote_big_number_title, 'absolute change 2'); + assert.strictEqual(config.deepnote_big_number_value, 'b'); + assert.strictEqual(config.deepnote_big_number_format, 'number'); + assert.strictEqual(config.deepnote_big_number_comparison_type, 'absolute-change'); + assert.strictEqual(config.deepnote_big_number_comparison_title, 'vs a'); + assert.strictEqual(config.deepnote_big_number_comparison_value, 'a'); + assert.strictEqual(config.deepnote_big_number_comparison_format, ''); + assert.strictEqual(config.deepnote_big_number_comparison_enabled, true); + }); + + test('converts absolute value comparison block to cell', () => { + const block: DeepnoteBlock = { + blockGroup: '22df6f01c5c44cc081e3af4dceb397e7', + content: '', + id: 'f7016119e6554cfc8ab423ae4cc981b1', + metadata: { + allow_embed: false, + execution_start: 1759939160631, + execution_millis: 0, + execution_context_id: 'f493c0ab-aea3-4cdd-84da-77865f369ba8', + deepnote_big_number_title: 'absolute change 2', + deepnote_big_number_value: 'b', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'absolute-value', + deepnote_big_number_comparison_title: 'vs a', + deepnote_big_number_comparison_value: 'a', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }, + sortingKey: 'yU', + type: 'big-number', + executionCount: 18, + outputs: [ + { + output_type: 'execute_result', + execution_count: 18, + data: { + 'text/plain': '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "absolute value", "value": "30"}' + }, + metadata: {} + } + ] + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const config = JSON.parse(cell.value); + assert.strictEqual(config.deepnote_big_number_title, 'absolute change 2'); + assert.strictEqual(config.deepnote_big_number_value, 'b'); + assert.strictEqual(config.deepnote_big_number_format, 'number'); + assert.strictEqual(config.deepnote_big_number_comparison_type, 'absolute-value'); + assert.strictEqual(config.deepnote_big_number_comparison_title, 'vs a'); + assert.strictEqual(config.deepnote_big_number_comparison_value, 'a'); + assert.strictEqual(config.deepnote_big_number_comparison_format, ''); + assert.strictEqual(config.deepnote_big_number_comparison_enabled, true); + }); + + test('converts disabled comparison block to cell', () => { + const block: DeepnoteBlock = { + blockGroup: '769a4e758a7b4e0b88d2e74bc82d75ca', + content: '', + id: '53cc14203e6243fe915b411a88b36845', + metadata: { + allow_embed: false, + execution_start: 1759939184252, + execution_millis: 1, + execution_context_id: 'f493c0ab-aea3-4cdd-84da-77865f369ba8', + deepnote_big_number_title: 'some title', + deepnote_big_number_value: 'b', + deepnote_big_number_format: 'plain', + deepnote_big_number_comparison_type: 'percentage-change', + deepnote_big_number_comparison_title: 'vs a', + deepnote_big_number_comparison_value: 'a', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: false + }, + sortingKey: 'yj', + type: 'big-number', + executionCount: 33, + outputs: [ + { + output_type: 'execute_result', + execution_count: 33, + data: { + 'text/plain': '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "sgjaoshdgoashgopiashgoihasdoighasoihgoiasdhgoisadhgoihsdoghasdoighaosdg", "value": "30"}' + }, + metadata: {} + } + ] + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const config = JSON.parse(cell.value); + assert.strictEqual(config.deepnote_big_number_title, 'some title'); + assert.strictEqual(config.deepnote_big_number_value, 'b'); + assert.strictEqual(config.deepnote_big_number_format, 'plain'); + assert.strictEqual(config.deepnote_big_number_comparison_type, 'percentage-change'); + assert.strictEqual(config.deepnote_big_number_comparison_title, 'vs a'); + assert.strictEqual(config.deepnote_big_number_comparison_value, 'a'); + assert.strictEqual(config.deepnote_big_number_comparison_format, ''); + assert.strictEqual(config.deepnote_big_number_comparison_enabled, false); + }); + + test('prefers raw content when DEEPNOTE_VSCODE_RAW_CONTENT_KEY exists', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + metadata: { + deepnote_big_number_title: 'metadata title', + deepnote_big_number_value: 'metadata value', + [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: '{"deepnote_big_number_title": "raw title", "deepnote_big_number_value": "raw value"}' + }, + sortingKey: 'a0', + type: 'big-number' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + assert.strictEqual(cell.value, '{"deepnote_big_number_title": "raw title", "deepnote_big_number_value": "raw value"}'); + }); + + test('uses default config when metadata is invalid', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + metadata: { + invalid_field: 'invalid value' + }, + sortingKey: 'a0', + type: 'big-number' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const config = JSON.parse(cell.value); + assert.strictEqual(config.deepnote_big_number_title, null); + assert.strictEqual(config.deepnote_big_number_value, null); + assert.strictEqual(config.deepnote_big_number_format, null); + assert.strictEqual(config.deepnote_big_number_comparison_type, null); + assert.strictEqual(config.deepnote_big_number_comparison_title, null); + assert.strictEqual(config.deepnote_big_number_comparison_value, null); + assert.strictEqual(config.deepnote_big_number_comparison_format, null); + assert.strictEqual(config.deepnote_big_number_comparison_enabled, null); + }); + + test('uses default config when metadata is empty', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: '', + id: 'block-123', + metadata: {}, + sortingKey: 'a0', + type: 'big-number' + }; + + const cell = converter.convertToCell(block); + + assert.strictEqual(cell.kind, NotebookCellKind.Code); + assert.strictEqual(cell.languageId, 'json'); + + const config = JSON.parse(cell.value); + assert.strictEqual(config.deepnote_big_number_title, null); + assert.strictEqual(config.deepnote_big_number_value, null); + assert.strictEqual(config.deepnote_big_number_format, null); + assert.strictEqual(config.deepnote_big_number_comparison_type, null); + assert.strictEqual(config.deepnote_big_number_comparison_title, null); + assert.strictEqual(config.deepnote_big_number_comparison_value, null); + assert.strictEqual(config.deepnote_big_number_comparison_format, null); + assert.strictEqual(config.deepnote_big_number_comparison_enabled, null); + }); + }); + + suite('applyChangesToBlock', () => { + test('applies valid JSON config to block metadata', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: 'old content', + id: 'block-123', + metadata: { existing: 'value' }, + sortingKey: 'a0', + type: 'big-number' + }; + const configStr = JSON.stringify({ + deepnote_big_number_title: 'new title', + deepnote_big_number_value: 'new value', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'percentage-change', + deepnote_big_number_comparison_title: 'vs old', + deepnote_big_number_comparison_value: 'old value', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }, null, 2); + const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_big_number_title, 'new title'); + assert.strictEqual(block.metadata?.deepnote_big_number_value, 'new value'); + assert.strictEqual(block.metadata?.deepnote_big_number_format, 'number'); + assert.strictEqual(block.metadata?.deepnote_big_number_comparison_type, 'percentage-change'); + assert.strictEqual(block.metadata?.deepnote_big_number_comparison_title, 'vs old'); + assert.strictEqual(block.metadata?.deepnote_big_number_comparison_value, 'old value'); + assert.strictEqual(block.metadata?.deepnote_big_number_comparison_format, ''); + assert.strictEqual(block.metadata?.deepnote_big_number_comparison_enabled, true); + assert.strictEqual(block.metadata?.existing, 'value'); + }); + + test('stores invalid JSON as raw content', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: 'old content', + id: 'block-123', + metadata: { existing: 'value' }, + sortingKey: 'a0', + type: 'big-number' + }; + const cell = new NotebookCellData(NotebookCellKind.Code, 'invalid json {', 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], 'invalid json {'); + assert.strictEqual(block.metadata?.existing, 'value'); + }); + + test('removes DEEPNOTE_VSCODE_RAW_CONTENT_KEY when valid config is applied', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: 'old content', + id: 'block-123', + metadata: { + existing: 'value', + [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: 'old raw content' + }, + sortingKey: 'a0', + type: 'big-number' + }; + const configStr = JSON.stringify({ + deepnote_big_number_title: 'new title' + }, null, 2); + const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.deepnote_big_number_title, 'new title'); + assert.strictEqual(block.metadata?.existing, 'value'); + assert.isUndefined(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY]); + }); + + test('handles empty content', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: 'old content', + id: 'block-123', + metadata: { existing: 'value' }, + sortingKey: 'a0', + type: 'big-number' + }; + const cell = new NotebookCellData(NotebookCellKind.Code, '', 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.content, ''); + assert.strictEqual(block.metadata?.[DEEPNOTE_VSCODE_RAW_CONTENT_KEY], ''); + assert.strictEqual(block.metadata?.existing, 'value'); + }); + + test('does not modify other block properties', () => { + const block: DeepnoteBlock = { + blockGroup: 'test-group', + content: 'old content', + executionCount: 5, + id: 'block-123', + metadata: { custom: 'value' }, + outputs: [], + sortingKey: 'a0', + type: 'big-number' + }; + const configStr = JSON.stringify({ + deepnote_big_number_title: 'new title' + }, null, 2); + const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); + + converter.applyChangesToBlock(block, cell); + + assert.strictEqual(block.id, 'block-123'); + assert.strictEqual(block.type, 'big-number'); + assert.strictEqual(block.sortingKey, 'a0'); + assert.strictEqual(block.executionCount, 5); + assert.deepStrictEqual(block.outputs, []); + assert.strictEqual(block.metadata?.custom, 'value'); + }); + }); +}); From d2204223a236b703afffe6640c406d99b87ba61e Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Tue, 14 Oct 2025 06:07:52 +0000 Subject: [PATCH 21/70] Reformat test code --- .../chartBigNumberBlockConverter.unit.test.ts | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts index 22cf49188d..da0c7855d4 100644 --- a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts +++ b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts @@ -39,7 +39,8 @@ suite('ChartBigNumberBlockConverter', () => { output_type: 'execute_result', execution_count: 9, data: { - 'text/plain': '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "percentage change", "value": "30"}' + 'text/plain': + '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "percentage change", "value": "30"}' }, metadata: {} } @@ -89,7 +90,8 @@ suite('ChartBigNumberBlockConverter', () => { output_type: 'execute_result', execution_count: 9, data: { - 'text/plain': '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "absolute change", "value": "30"}' + 'text/plain': + '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "absolute change", "value": "30"}' }, metadata: {} } @@ -139,7 +141,8 @@ suite('ChartBigNumberBlockConverter', () => { output_type: 'execute_result', execution_count: 18, data: { - 'text/plain': '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "absolute value", "value": "30"}' + 'text/plain': + '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "absolute value", "value": "30"}' }, metadata: {} } @@ -189,7 +192,8 @@ suite('ChartBigNumberBlockConverter', () => { output_type: 'execute_result', execution_count: 33, data: { - 'text/plain': '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "sgjaoshdgoashgopiashgoihasdoighasoihgoiasdhgoisadhgoihsdoghasdoighaosdg", "value": "30"}' + 'text/plain': + '{"comparisonTitle": "vs a", "comparisonValue": "10", "title": "sgjaoshdgoashgopiashgoihasdoighasoihgoiasdhgoisadhgoihsdoghasdoighaosdg", "value": "30"}' }, metadata: {} } @@ -220,7 +224,8 @@ suite('ChartBigNumberBlockConverter', () => { metadata: { deepnote_big_number_title: 'metadata title', deepnote_big_number_value: 'metadata value', - [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: '{"deepnote_big_number_title": "raw title", "deepnote_big_number_value": "raw value"}' + [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: + '{"deepnote_big_number_title": "raw title", "deepnote_big_number_value": "raw value"}' }, sortingKey: 'a0', type: 'big-number' @@ -230,7 +235,10 @@ suite('ChartBigNumberBlockConverter', () => { assert.strictEqual(cell.kind, NotebookCellKind.Code); assert.strictEqual(cell.languageId, 'json'); - assert.strictEqual(cell.value, '{"deepnote_big_number_title": "raw title", "deepnote_big_number_value": "raw value"}'); + assert.strictEqual( + cell.value, + '{"deepnote_big_number_title": "raw title", "deepnote_big_number_value": "raw value"}' + ); }); test('uses default config when metadata is invalid', () => { @@ -298,16 +306,20 @@ suite('ChartBigNumberBlockConverter', () => { sortingKey: 'a0', type: 'big-number' }; - const configStr = JSON.stringify({ - deepnote_big_number_title: 'new title', - deepnote_big_number_value: 'new value', - deepnote_big_number_format: 'number', - deepnote_big_number_comparison_type: 'percentage-change', - deepnote_big_number_comparison_title: 'vs old', - deepnote_big_number_comparison_value: 'old value', - deepnote_big_number_comparison_format: '', - deepnote_big_number_comparison_enabled: true - }, null, 2); + const configStr = JSON.stringify( + { + deepnote_big_number_title: 'new title', + deepnote_big_number_value: 'new value', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'percentage-change', + deepnote_big_number_comparison_title: 'vs old', + deepnote_big_number_comparison_value: 'old value', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }, + null, + 2 + ); const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); converter.applyChangesToBlock(block, cell); @@ -354,9 +366,13 @@ suite('ChartBigNumberBlockConverter', () => { sortingKey: 'a0', type: 'big-number' }; - const configStr = JSON.stringify({ - deepnote_big_number_title: 'new title' - }, null, 2); + const configStr = JSON.stringify( + { + deepnote_big_number_title: 'new title' + }, + null, + 2 + ); const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); converter.applyChangesToBlock(block, cell); @@ -396,9 +412,13 @@ suite('ChartBigNumberBlockConverter', () => { sortingKey: 'a0', type: 'big-number' }; - const configStr = JSON.stringify({ - deepnote_big_number_title: 'new title' - }, null, 2); + const configStr = JSON.stringify( + { + deepnote_big_number_title: 'new title' + }, + null, + 2 + ); const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); converter.applyChangesToBlock(block, cell); From 78d3cb762b3fc57773170d1c9a4ad015ac73ea4b Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Tue, 14 Oct 2025 06:11:57 +0000 Subject: [PATCH 22/70] Refactor ChartBigNumberBlockConverter tests to use deepStrictEqual for assertions --- .../chartBigNumberBlockConverter.unit.test.ts | 147 ++++++++++-------- 1 file changed, 84 insertions(+), 63 deletions(-) diff --git a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts index da0c7855d4..8edac22f18 100644 --- a/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts +++ b/src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts @@ -53,14 +53,16 @@ suite('ChartBigNumberBlockConverter', () => { assert.strictEqual(cell.languageId, 'json'); const config = JSON.parse(cell.value); - assert.strictEqual(config.deepnote_big_number_title, 'test title'); - assert.strictEqual(config.deepnote_big_number_value, 'b'); - assert.strictEqual(config.deepnote_big_number_format, 'number'); - assert.strictEqual(config.deepnote_big_number_comparison_type, 'percentage-change'); - assert.strictEqual(config.deepnote_big_number_comparison_title, 'vs a'); - assert.strictEqual(config.deepnote_big_number_comparison_value, 'a'); - assert.strictEqual(config.deepnote_big_number_comparison_format, ''); - assert.strictEqual(config.deepnote_big_number_comparison_enabled, true); + assert.deepStrictEqual(config, { + deepnote_big_number_title: 'test title', + deepnote_big_number_value: 'b', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'percentage-change', + deepnote_big_number_comparison_title: 'vs a', + deepnote_big_number_comparison_value: 'a', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }); }); test('converts absolute change comparison block to cell', () => { @@ -104,14 +106,16 @@ suite('ChartBigNumberBlockConverter', () => { assert.strictEqual(cell.languageId, 'json'); const config = JSON.parse(cell.value); - assert.strictEqual(config.deepnote_big_number_title, 'absolute change 2'); - assert.strictEqual(config.deepnote_big_number_value, 'b'); - assert.strictEqual(config.deepnote_big_number_format, 'number'); - assert.strictEqual(config.deepnote_big_number_comparison_type, 'absolute-change'); - assert.strictEqual(config.deepnote_big_number_comparison_title, 'vs a'); - assert.strictEqual(config.deepnote_big_number_comparison_value, 'a'); - assert.strictEqual(config.deepnote_big_number_comparison_format, ''); - assert.strictEqual(config.deepnote_big_number_comparison_enabled, true); + assert.deepStrictEqual(config, { + deepnote_big_number_title: 'absolute change 2', + deepnote_big_number_value: 'b', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'absolute-change', + deepnote_big_number_comparison_title: 'vs a', + deepnote_big_number_comparison_value: 'a', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }); }); test('converts absolute value comparison block to cell', () => { @@ -155,14 +159,16 @@ suite('ChartBigNumberBlockConverter', () => { assert.strictEqual(cell.languageId, 'json'); const config = JSON.parse(cell.value); - assert.strictEqual(config.deepnote_big_number_title, 'absolute change 2'); - assert.strictEqual(config.deepnote_big_number_value, 'b'); - assert.strictEqual(config.deepnote_big_number_format, 'number'); - assert.strictEqual(config.deepnote_big_number_comparison_type, 'absolute-value'); - assert.strictEqual(config.deepnote_big_number_comparison_title, 'vs a'); - assert.strictEqual(config.deepnote_big_number_comparison_value, 'a'); - assert.strictEqual(config.deepnote_big_number_comparison_format, ''); - assert.strictEqual(config.deepnote_big_number_comparison_enabled, true); + assert.deepStrictEqual(config, { + deepnote_big_number_title: 'absolute change 2', + deepnote_big_number_value: 'b', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'absolute-value', + deepnote_big_number_comparison_title: 'vs a', + deepnote_big_number_comparison_value: 'a', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }); }); test('converts disabled comparison block to cell', () => { @@ -206,14 +212,16 @@ suite('ChartBigNumberBlockConverter', () => { assert.strictEqual(cell.languageId, 'json'); const config = JSON.parse(cell.value); - assert.strictEqual(config.deepnote_big_number_title, 'some title'); - assert.strictEqual(config.deepnote_big_number_value, 'b'); - assert.strictEqual(config.deepnote_big_number_format, 'plain'); - assert.strictEqual(config.deepnote_big_number_comparison_type, 'percentage-change'); - assert.strictEqual(config.deepnote_big_number_comparison_title, 'vs a'); - assert.strictEqual(config.deepnote_big_number_comparison_value, 'a'); - assert.strictEqual(config.deepnote_big_number_comparison_format, ''); - assert.strictEqual(config.deepnote_big_number_comparison_enabled, false); + assert.deepStrictEqual(config, { + deepnote_big_number_title: 'some title', + deepnote_big_number_value: 'b', + deepnote_big_number_format: 'plain', + deepnote_big_number_comparison_type: 'percentage-change', + deepnote_big_number_comparison_title: 'vs a', + deepnote_big_number_comparison_value: 'a', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: false + }); }); test('prefers raw content when DEEPNOTE_VSCODE_RAW_CONTENT_KEY exists', () => { @@ -259,14 +267,16 @@ suite('ChartBigNumberBlockConverter', () => { assert.strictEqual(cell.languageId, 'json'); const config = JSON.parse(cell.value); - assert.strictEqual(config.deepnote_big_number_title, null); - assert.strictEqual(config.deepnote_big_number_value, null); - assert.strictEqual(config.deepnote_big_number_format, null); - assert.strictEqual(config.deepnote_big_number_comparison_type, null); - assert.strictEqual(config.deepnote_big_number_comparison_title, null); - assert.strictEqual(config.deepnote_big_number_comparison_value, null); - assert.strictEqual(config.deepnote_big_number_comparison_format, null); - assert.strictEqual(config.deepnote_big_number_comparison_enabled, null); + assert.deepStrictEqual(config, { + deepnote_big_number_title: null, + deepnote_big_number_value: null, + deepnote_big_number_format: null, + deepnote_big_number_comparison_type: null, + deepnote_big_number_comparison_title: null, + deepnote_big_number_comparison_value: null, + deepnote_big_number_comparison_format: null, + deepnote_big_number_comparison_enabled: null + }); }); test('uses default config when metadata is empty', () => { @@ -285,14 +295,16 @@ suite('ChartBigNumberBlockConverter', () => { assert.strictEqual(cell.languageId, 'json'); const config = JSON.parse(cell.value); - assert.strictEqual(config.deepnote_big_number_title, null); - assert.strictEqual(config.deepnote_big_number_value, null); - assert.strictEqual(config.deepnote_big_number_format, null); - assert.strictEqual(config.deepnote_big_number_comparison_type, null); - assert.strictEqual(config.deepnote_big_number_comparison_title, null); - assert.strictEqual(config.deepnote_big_number_comparison_value, null); - assert.strictEqual(config.deepnote_big_number_comparison_format, null); - assert.strictEqual(config.deepnote_big_number_comparison_enabled, null); + assert.deepStrictEqual(config, { + deepnote_big_number_title: null, + deepnote_big_number_value: null, + deepnote_big_number_format: null, + deepnote_big_number_comparison_type: null, + deepnote_big_number_comparison_title: null, + deepnote_big_number_comparison_value: null, + deepnote_big_number_comparison_format: null, + deepnote_big_number_comparison_enabled: null + }); }); }); @@ -325,15 +337,17 @@ suite('ChartBigNumberBlockConverter', () => { converter.applyChangesToBlock(block, cell); assert.strictEqual(block.content, ''); - assert.strictEqual(block.metadata?.deepnote_big_number_title, 'new title'); - assert.strictEqual(block.metadata?.deepnote_big_number_value, 'new value'); - assert.strictEqual(block.metadata?.deepnote_big_number_format, 'number'); - assert.strictEqual(block.metadata?.deepnote_big_number_comparison_type, 'percentage-change'); - assert.strictEqual(block.metadata?.deepnote_big_number_comparison_title, 'vs old'); - assert.strictEqual(block.metadata?.deepnote_big_number_comparison_value, 'old value'); - assert.strictEqual(block.metadata?.deepnote_big_number_comparison_format, ''); - assert.strictEqual(block.metadata?.deepnote_big_number_comparison_enabled, true); - assert.strictEqual(block.metadata?.existing, 'value'); + assert.deepStrictEqual(block.metadata, { + existing: 'value', + deepnote_big_number_title: 'new title', + deepnote_big_number_value: 'new value', + deepnote_big_number_format: 'number', + deepnote_big_number_comparison_type: 'percentage-change', + deepnote_big_number_comparison_title: 'vs old', + deepnote_big_number_comparison_value: 'old value', + deepnote_big_number_comparison_format: '', + deepnote_big_number_comparison_enabled: true + }); }); test('stores invalid JSON as raw content', () => { @@ -423,12 +437,19 @@ suite('ChartBigNumberBlockConverter', () => { converter.applyChangesToBlock(block, cell); - assert.strictEqual(block.id, 'block-123'); - assert.strictEqual(block.type, 'big-number'); - assert.strictEqual(block.sortingKey, 'a0'); - assert.strictEqual(block.executionCount, 5); - assert.deepStrictEqual(block.outputs, []); - assert.strictEqual(block.metadata?.custom, 'value'); + assert.deepStrictEqual(block, { + blockGroup: 'test-group', + content: '', + executionCount: 5, + id: 'block-123', + metadata: { + custom: 'value', + deepnote_big_number_title: 'new title' + }, + outputs: [], + sortingKey: 'a0', + type: 'big-number' + }); }); }); }); From 79b34ba247515e7c03334c47b3f9e79f6cbe9ecc Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Tue, 14 Oct 2025 09:37:06 +0000 Subject: [PATCH 23/70] Remove debug console.log --- src/notebooks/deepnote/converters/inputConverters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/notebooks/deepnote/converters/inputConverters.ts b/src/notebooks/deepnote/converters/inputConverters.ts index dd939ac06d..9f593dbc6b 100644 --- a/src/notebooks/deepnote/converters/inputConverters.ts +++ b/src/notebooks/deepnote/converters/inputConverters.ts @@ -65,7 +65,7 @@ export abstract class BaseInputBlockConverter implements : JSON.stringify(this.defaultConfig(), null, 2); const cell = new NotebookCellData(NotebookCellKind.Code, configStr, 'json'); - console.log(cell); + return cell; } From 4fa78e28dd778c5f8c469c00df1ccb261daad23b Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 11:49:08 +0200 Subject: [PATCH 24/70] 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 c1becf84dd52d5c22c3db12bb4e321c2ed2c34be Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Tue, 14 Oct 2025 11:09:57 +0000 Subject: [PATCH 25/70] fix: Spread operator object fallback --- src/notebooks/deepnote/converters/inputConverters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/notebooks/deepnote/converters/inputConverters.ts b/src/notebooks/deepnote/converters/inputConverters.ts index 9f593dbc6b..9763170e12 100644 --- a/src/notebooks/deepnote/converters/inputConverters.ts +++ b/src/notebooks/deepnote/converters/inputConverters.ts @@ -29,7 +29,7 @@ export abstract class BaseInputBlockConverter implements if (config.success !== true) { block.metadata = { - ...block.metadata, + ...(block.metadata ?? {}), [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]: cell.value }; return; From e8ce411c55a04841dc55b0fb5788891197eeab83 Mon Sep 17 00:00:00 2001 From: Tomas Kislan Date: Tue, 14 Oct 2025 11:51:07 +0000 Subject: [PATCH 26/70] Merge remote-tracking branch 'origin/chris/display-data-frames' into tomaskislan/grn-4762-support-big-number-blocks --- .github/CODEOWNERS | 2 + .github/workflows/ci.yml | 107 + .gitignore | 6 + .qlty/qlty.toml | 69 + CLAUDE.md | 1 + DEEPNOTE_KERNEL_IMPLEMENTATION.md | 419 +- README.md | 5 + build/esbuild/build.ts | 41 +- package-lock.json | 1372 ++- package.json | 5 + pnpm-lock.yaml | 9689 ----------------- postcss.config.js | 6 + src/extension.common.ts | 2 + src/kernels/deepnote/deepnoteController.ts | 33 +- .../deepnote/deepnoteToolkitInstaller.node.ts | 24 +- src/kernels/deepnote/types.ts | 13 +- src/kernels/execution/cellExecution.ts | 18 +- .../execution/cellExecutionMessageHandler.ts | 85 +- src/kernels/execution/helpers.ts | 82 +- src/notebooks/deepnote/blocks.md | 628 ++ .../deepnote/deepnoteDataConverter.ts | 67 +- .../deepnoteDataConverter.unit.test.ts | 8 +- .../deepnoteInitNotebookRunner.node.ts | 286 + .../deepnoteKernelAutoSelector.node.ts | 174 +- .../deepnote/deepnoteNotebookManager.ts | 18 + .../deepnoteRequirementsHelper.node.ts | 167 + src/notebooks/deepnote/pocket.ts | 20 +- src/notebooks/deepnote/pocket.unit.test.ts | 22 +- src/notebooks/deepnote/serialization.md | 305 - src/notebooks/serviceRegistry.node.ts | 4 + src/notebooks/types.ts | 2 + src/platform/logging/types.ts | 1 + .../resolveCompletionItem.unit.test.ts | 2 +- src/test/coverage.node.ts | 2 +- .../dataframe/dataframeController.ts | 218 + .../extension-side/serviceRegistry.node.ts | 7 +- .../extension-side/serviceRegistry.web.ts | 7 +- .../dataframe-renderer/DataframeRenderer.tsx | 212 +- .../webview-side/dataframe-renderer/index.ts | 38 +- .../dataframe-renderer/tailwind.css | 3 + tailwind.config.js | 24 + 41 files changed, 3897 insertions(+), 10297 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .qlty/qlty.toml delete mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.js create mode 100644 src/notebooks/deepnote/blocks.md create mode 100644 src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts create mode 100644 src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts delete mode 100644 src/notebooks/deepnote/serialization.md create mode 100644 src/webviews/extension-side/dataframe/dataframeController.ts create mode 100644 src/webviews/webview-side/dataframe-renderer/tailwind.css create mode 100644 tailwind.config.js diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..6971b6683c --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +# Default owners for everything in the repository +* @saltenasl @jamesbhobbs @Artmann @andyjakubowski diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 952ddb9af2..b10b5d5c38 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,48 @@ jobs: - name: Check Prettier formatting run: npm run format + typecheck: + name: TypeCheck + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v5 + with: + cache: 'npm' + node-version: ${{ env.NODE_VERSION }} + registry-url: 'https://npm.pkg.github.com' + scope: '@deepnote' + + - name: Install dependencies + run: npm ci --prefer-offline --no-audit + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Run TypeScript type checking + run: npm run typecheck + + qlty: + name: Qlty Check + runs-on: ubuntu-latest + timeout-minutes: 3 + + steps: + - name: Checkout code + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 + + - name: Install qlty + uses: qltysh/qlty-action/install@06730ef41b86b073c3813c0fc07a0c734980ce5d + + - name: Run qlty check + run: qlty check + + - name: Run qlty code smells analysis + run: qlty smells + build: name: Build & Test runs-on: ubuntu-latest @@ -73,6 +115,23 @@ jobs: - name: Run tests run: npm test + env: + VSC_JUPYTER_INSTRUMENT_CODE_FOR_COVERAGE: true + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: coverage/lcov.info + fail_ci_if_error: true + + - name: Upload test results to Codecov + if: '!cancelled()' + uses: codecov/test-results-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: test-report.xml + fail_ci_if_error: true - name: Check dependencies run: npm run checkDependencies @@ -103,3 +162,51 @@ jobs: - name: Check Licenses run: npm run check-licenses + + audit-prod: + name: Audit - Production + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v5 + with: + cache: 'npm' + node-version: ${{ env.NODE_VERSION }} + registry-url: 'https://npm.pkg.github.com' + scope: '@deepnote' + + - name: Install dependencies + run: npm ci --prefer-offline --no-audit + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Run audit for production dependencies + run: npm audit --production + + audit-all: + name: Audit - All + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v5 + with: + cache: 'npm' + node-version: ${{ env.NODE_VERSION }} + registry-url: 'https://npm.pkg.github.com' + scope: '@deepnote' + + - name: Install dependencies + run: npm ci --prefer-offline --no-audit + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Run audit for all dependencies + run: npm audit diff --git a/.gitignore b/.gitignore index 6b25014ba1..3f9ee43792 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,9 @@ src/webviews/webview-side/interactive-common/variableExplorerGrid.css src/webviews/webview-side/interactive-common/variableExplorerGrid.css.map src/webviews/webview-side/react-common/seti/seti.css src/webviews/webview-side/react-common/seti/seti.css.map +# Qlty cache directories +.qlty/cache +.qlty/logs +.qlty/out +.qlty/plugin_cachedir +.qlty/results diff --git a/.qlty/qlty.toml b/.qlty/qlty.toml new file mode 100644 index 0000000000..d2382eb4b7 --- /dev/null +++ b/.qlty/qlty.toml @@ -0,0 +1,69 @@ +# Qlty Configuration +# Learn more at https://docs.qlty.sh +config_version = "0" + +# Plugins configuration +[[plugin]] +name = "actionlint" + +[[plugin]] +name = "trufflehog" + +[[plugin]] +name = "osv-scanner" + +# Source configuration +[[source]] +name = "default" +default = true + +# Exclusion patterns +exclude_patterns = [ + "node_modules/**", + "dist/**", + "build/**", + "coverage/**", + "**/*.min.js", + "**/*.min.css", + ".git/**", +] + +# Code Smells Configuration +[smells] +mode = "block" + +[smells.boolean_logic] +enabled = true +threshold = 4 + +[smells.nested_control_flow] +enabled = true +threshold = 4 + +[smells.function_parameters] +enabled = true +threshold = 5 + +[smells.function_length] +enabled = true +threshold = 50 + +[smells.file_length] +enabled = true +threshold = 500 + +[smells.cognitive_complexity] +enabled = true +threshold = 15 + +[smells.duplicate_code] +enabled = true +threshold = 6 + +[smells.large_class] +enabled = true +threshold = 500 + +[smells.long_parameter_list] +enabled = true +threshold = 2 diff --git a/CLAUDE.md b/CLAUDE.md index 54c7e7c525..4338c0e3ac 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,7 @@ ## Code Style & Organization - Order method, fields and properties, first by accessibility and then by alphabetical order. - Don't add the Microsoft copyright header to new files. +- Use `Uri.joinPath()` for constructing file paths to ensure platform-correct path separators (e.g., `Uri.joinPath(venvPath, 'share', 'jupyter', 'kernels')` instead of string concatenation with `/`) ## Testing - Unit tests use Mocha/Chai framework with `.unit.test.ts` extension diff --git a/DEEPNOTE_KERNEL_IMPLEMENTATION.md b/DEEPNOTE_KERNEL_IMPLEMENTATION.md index ade1164c25..7a125e6d26 100644 --- a/DEEPNOTE_KERNEL_IMPLEMENTATION.md +++ b/DEEPNOTE_KERNEL_IMPLEMENTATION.md @@ -75,14 +75,40 @@ This implementation adds automatic kernel selection and startup for `.deepnote` - `provideJupyterServers(token)`: Lists all registered Deepnote servers - `resolveJupyterServer(server, token)`: Resolves server connection info by handle -#### 5. **Deepnote Kernel Auto-Selector** (`src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts`) +#### 5. **Deepnote Init Notebook Runner** (`src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts`) + +- Runs initialization notebooks automatically before user code executes +- Checks for `project.initNotebookId` in the Deepnote project YAML +- Executes init notebook code blocks sequentially in the kernel +- Shows progress notification to user +- Caches execution per project (runs only once per session) +- Logs errors but allows user to continue on failure +- Blocks user cell execution until init notebook completes + +**Key Methods:** + +- `runInitNotebookIfNeeded(projectId, notebook)`: Main entry point, checks cache and executes if needed +- `executeInitNotebook(notebook, initNotebook)`: Executes all code blocks from init notebook + +#### 6. **Deepnote Requirements Helper** (`src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts`) + +- Static helper class for creating `requirements.txt` from project settings +- Extracts `project.settings.requirements` array from Deepnote YAML +- Creates `requirements.txt` in workspace root before init notebook runs +- Ensures dependencies are available for pip installation in init notebook + +**Key Methods:** + +- `createRequirementsFile(project)`: Creates requirements.txt from project settings + +#### 7. **Deepnote Kernel Auto-Selector** (`src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts`) - Activation service that listens for notebook open events and controller selection changes - Automatically selects Deepnote kernel for `.deepnote` files -- Queries the Deepnote server for available kernel specs -- **Selects a server-native Python kernel spec** (e.g., `python3-venv` or any available Python kernel) +- Queries the Deepnote server for available kernel specs using **matching hash function** +- **Selects a server-native Python kernel spec** (e.g., `deepnote-venv-{hash}` or fallback to any available Python kernel) - The Deepnote server is started with the venv's Python interpreter, ensuring the kernel uses the venv environment -- Environment variables (`PATH`, `VIRTUAL_ENV`) are configured so the server and kernel use the venv's Python +- Environment variables (`PATH`, `VIRTUAL_ENV`, `JUPYTER_PATH`) are configured so the server and kernel use the venv's Python - Registers the server with the server provider - Creates kernel connection metadata - Registers the controller with VSCode @@ -90,74 +116,77 @@ This implementation adds automatic kernel selection and startup for `.deepnote` - **Reuses existing controllers and servers** for persistent kernel sessions - **Automatically reselects kernel** if it becomes unselected after errors - Tracks controllers per notebook file for efficient reuse +- **Coordinates init notebook execution** via event-driven approach **Key Methods:** -- `activate()`: Registers event listeners for notebook open/close and controller selection changes -- `ensureKernelSelected(notebook)`: Main logic for auto-selection, kernel spec selection, and kernel reuse +- `activate()`: Registers event listeners for notebook open/close, controller selection changes, and kernel starts +- `ensureKernelSelected(notebook)`: Main logic for auto-selection, kernel spec selection, kernel reuse, and init notebook preparation - `onDidOpenNotebook(notebook)`: Event handler for notebook opens - `onControllerSelectionChanged(event)`: Event handler for controller selection changes (auto-reselects if needed) - `onDidCloseNotebook(notebook)`: Event handler for notebook closes (preserves controllers for reuse) +- `onKernelStarted(kernel)`: Event handler for kernel starts (triggers init notebook execution) +- `getVenvHash(fileUri)`: Creates consistent hash for kernel spec naming (must match installer) -#### 6. **Service Registry Updates** (`src/notebooks/serviceRegistry.node.ts`) +#### 8. **Service Registry Updates** (`src/notebooks/serviceRegistry.node.ts`) - Registers all new Deepnote kernel services - Binds `DeepnoteServerProvider` as an activation service - Binds `IDeepnoteKernelAutoSelector` as an activation service -#### 7. **Kernel Types Updates** (`src/kernels/types.ts`) +#### 9. **Kernel Types Updates** (`src/kernels/types.ts`) - Adds `DeepnoteKernelConnectionMetadata` to `RemoteKernelConnectionMetadata` union type - Adds deserialization support for `'startUsingDeepnoteKernel'` kind ## Flow Diagram -```text -User opens .deepnote file - ↓ -DeepnoteKernelAutoSelector.onDidOpenNotebook() - ↓ -Check if kernel already selected → Yes → Exit - ↓ No -Get active Python interpreter - ↓ -DeepnoteToolkitInstaller.ensureInstalled() - ↓ -Extract base file URI (remove query params) - ↓ -Check if venv exists for this file → Yes → Skip to server - ↓ No -Create venv for this .deepnote file - ↓ -Upgrade pip to latest version in venv - ↓ -pip install deepnote-toolkit[server] and ipykernel in venv - ↓ -Verify installation - ↓ -DeepnoteServerStarter.getOrStartServer(venv, fileUri) - ↓ -Check if server running for this file → Yes → Return info - ↓ No -Find available port - ↓ -Start: python -m deepnote_toolkit server --jupyter-port - ↓ -Wait for server to be ready (poll /api endpoint) - ↓ -Register server with DeepnoteServerProvider - ↓ -Query server for available kernel specs - ↓ -Select any available Python kernel spec (e.g., python3-venv) - ↓ -Create DeepnoteKernelConnectionMetadata with server kernel spec - ↓ -Register controller with IControllerRegistration - ↓ -Set controller affinity to Preferred (auto-selects kernel) - ↓ -User runs cell → Executes on Deepnote kernel +```mermaid +flowchart TD + Start([User opens .deepnote file]) --> OpenEvent[DeepnoteKernelAutoSelector.onDidOpenNotebook] + OpenEvent --> CheckSelected{Kernel already selected?} + CheckSelected -->|Yes| Exit([Exit]) + CheckSelected -->|No| GetInterpreter[Get active Python interpreter] + GetInterpreter --> EnsureInstalled[DeepnoteToolkitInstaller.ensureInstalled] + EnsureInstalled --> ExtractURI[Extract base file URI] + ExtractURI --> CheckVenv{Venv exists?} + CheckVenv -->|Yes| GetServer[DeepnoteServerStarter.getOrStartServer] + CheckVenv -->|No| CreateVenv[Create venv for .deepnote file] + CreateVenv --> UpgradePip[Upgrade pip to latest version] + UpgradePip --> InstallToolkit[pip install deepnote-toolkit & ipykernel] + InstallToolkit --> InstallKernelSpec[Install kernel spec with --user] + InstallKernelSpec --> GetServer + GetServer --> CheckServer{Server running?} + CheckServer -->|Yes| RegisterServer[Register server with provider] + CheckServer -->|No| FindPort[Find available port] + FindPort --> StartServer[Start: python -m deepnote_toolkit server] + StartServer --> SetEnv[Set PATH, VIRTUAL_ENV, JUPYTER_PATH] + SetEnv --> WaitServer[Wait for server to be ready] + WaitServer --> RegisterServer + RegisterServer --> QuerySpecs[Query server for kernel specs] + QuerySpecs --> SelectSpec[Select deepnote-venv-hash spec] + SelectSpec --> CreateMetadata[Create DeepnoteKernelConnectionMetadata] + CreateMetadata --> RegisterController[Register controller] + RegisterController --> SetAffinity[Set controller affinity to Preferred] + SetAffinity --> CheckInit{Has initNotebookId?} + CheckInit -->|No| Ready([Controller ready!]) + CheckInit -->|Yes| CreateReq[Create requirements.txt] + CreateReq --> StorePending[Store in projectsPendingInitNotebook] + StorePending --> Ready + Ready --> UserRuns([User runs first cell]) + UserRuns --> CreateKernel[VS Code creates kernel lazily] + CreateKernel --> StartKernel[kernel.start] + StartKernel --> FireEvent[Fire onDidStartKernel event] + FireEvent --> EventHandler[onKernelStarted handler] + EventHandler --> CheckPending{Has pending init?} + CheckPending -->|No| ExecuteUser[Execute user's cell] + CheckPending -->|Yes| RunInit[Run init notebook] + RunInit --> GetKernel[Get kernel - guaranteed to exist!] + GetKernel --> ExecBlocks[Execute code blocks sequentially] + ExecBlocks --> PipInstall[pip install -r requirements.txt] + PipInstall --> MarkRun[Mark as run - cached] + MarkRun --> ExecuteUser + ExecuteUser --> ImportWorks([import pandas ✅]) ``` ## Configuration @@ -184,17 +213,19 @@ User runs cell → Executes on Deepnote kernel - Cells will wait for the kernel to be ready before executing - No kernel selection dialog will appear -3. **Once the progress notification shows "Kernel ready!"**: - -- The loading controller is automatically replaced with the real Deepnote kernel -- Your cells start executing - -4. The extension automatically: +1. **The extension automatically sets up the environment:** - Installs deepnote-toolkit in a dedicated virtual environment (first time only) - Starts a Deepnote server on an available port (if not already running) - Selects the appropriate Deepnote kernel -- Executes your cells +- Creates `requirements.txt` from project settings (if defined) +- Runs the init notebook (if `project.initNotebookId` is defined) + +1. **Once the progress notification shows "Kernel ready!"**: + +- The loading controller is automatically replaced with the real Deepnote kernel +- Init notebook code has been executed (if present) +- Your cells start executing **First-time setup** takes 15-30 seconds. **Subsequent opens** of the same file reuse the existing environment and server, taking less than 1 second. @@ -211,6 +242,254 @@ User runs cell → Executes on Deepnote kernel - **Persistent kernel sessions**: Controllers and servers remain available even after errors - **Automatic recovery**: If kernel becomes unselected, it's automatically reselected - **Seamless reusability**: Run cells as many times as you want without manual kernel selection +- **Init notebook support**: Automatically runs initialization code before user notebooks execute +- **Dependency management**: Creates `requirements.txt` from project settings for easy package installation + +## Init Notebook Feature + +### Overview + +Deepnote projects can define an **initialization notebook** that runs automatically before any user code executes. This feature ensures that the environment is properly configured with required packages and setup code before the main notebook runs. + +### How It Works + +When you open a Deepnote notebook, the extension: + +1. **Checks for `initNotebookId`** in the project YAML (`project.initNotebookId`) +2. **Creates `requirements.txt`** from `project.settings.requirements` array +3. **Finds the init notebook** in the project's notebooks array by ID +4. **Executes all code blocks** from the init notebook sequentially +5. **Shows progress** with a notification: "Running init notebook..." +6. **Caches the execution** so it only runs once per project per session +7. **Allows user code to run** after init notebook completes + +### Example Project Structure + +Here's an example of a Deepnote project YAML with an init notebook: + +```yaml +metadata: + createdAt: 2025-07-21T14:50:41.160Z + modifiedAt: 2025-10-07T11:28:09.117Z +project: + id: 4686ec79-9341-4ac4-8aba-ec0ea497f818 + name: My Data Science Project + initNotebookId: a5356b1e77b34793a815faa71e75aad5 # <-- Init notebook ID + notebooks: + - id: a5356b1e77b34793a815faa71e75aad5 # <-- This is the init notebook + name: Init + blocks: + - type: code + content: | + %%bash + # Install requirements from requirements.txt + if test -f requirements.txt + then + pip install -r ./requirements.txt + else echo "No requirements.txt found." + fi + - id: d8403aaa3cd9462a8051a75b8c1eec42 # <-- This is the main notebook + name: Main Analysis + blocks: + - type: code + content: | + import pandas as pd + import numpy as np + # User code starts here + settings: + requirements: + - pandas + - numpy + - matplotlib + - scikit-learn +version: 1.0.0 +``` + +### Behavior Details + +**Execution Flow:** +1. User opens any notebook from the project +2. Kernel controller is registered and selected +3. `requirements.txt` is created with: `pandas`, `numpy`, `matplotlib`, `scikit-learn` +4. **Init notebook info stored as "pending"** (will run when kernel starts) +5. Controller setup completes (no kernel exists yet) +6. **User runs first cell** → Triggers kernel creation +7. **Kernel starts** → `onDidStartKernel` event fires +8. **Init notebook runs automatically** and blocks cell execution until complete +9. Init notebook installs packages from `requirements.txt` +10. User's cell executes → Packages available! + +**Critical Implementation Details - Event-Driven Approach:** +- **Kernel is NOT explicitly started** (was causing `CancellationError`) +- **Listen to `kernelProvider.onDidStartKernel` event** instead +- Init notebook info is **stored as pending** during controller setup +- When user runs first cell, kernel is created lazily by VS Code +- `onDidStartKernel` fires, triggering init notebook execution +- Init notebook execution is **awaited** (blocks user's cell execution) +- Kernel is guaranteed to exist when init notebook runs (no retry logic needed) +- User's cell waits for init notebook to complete before executing + +**Caching:** +- Init notebook runs **once per project** per VS Code session +- If you open multiple notebooks from the same project, init runs only once +- Cache is cleared when VS Code restarts +- Only marks as "run" if execution actually succeeds + +**Error Handling:** +- If init notebook fails, the error is logged but user can still run cells +- Progress continues even if some blocks fail +- User receives notification about any errors +- Returns `false` if kernel unavailable (won't mark as run, can retry) +- Returns `true` if execution completes (marks as run) + +**Progress Indicators:** +- "Creating requirements.txt..." - File creation phase (during controller setup) +- "Kernel ready!" - Controller selection complete +- [User runs first cell] - Triggers kernel creation +- "Running init notebook..." - Execution phase (appears when kernel starts) +- Shows current block progress: "Executing block 1/3..." +- Displays per-block incremental progress +- User's cell queued until init notebook completes + +**Kernel Spec Discovery:** +- Uses correct hash function to match kernel spec name (djb2-style) +- Both installer and auto-selector use **identical** hash function +- Looks for `deepnote-venv-{hash}` (where hash matches installer exactly) +- Falls back with warnings if venv kernel not found +- Sets `JUPYTER_PATH` so server can find user-installed kernel specs + +**Event-Driven Execution:** +- Init notebook does NOT run during controller setup (kernel doesn't exist yet) +- Stores pending init info in `projectsPendingInitNotebook` map +- Listens to `kernelProvider.onDidStartKernel` event +- When user runs first cell and kernel is created, event fires +- Init notebook runs in the event handler when kernel is guaranteed to exist +- User's cell execution is blocked until init notebook completes + +### Use Cases + +**1. Package Installation** +```python +%%bash +pip install -r requirements.txt +``` + +**2. Environment Setup** +```python +import os +os.environ['DATA_PATH'] = '/workspace/data' +os.environ['MODEL_PATH'] = '/workspace/models' +``` + +**3. Database Connections** +```python +import sqlalchemy +engine = sqlalchemy.create_engine('postgresql://...') +``` + +**4. Data Preprocessing** +```python +import pandas as pd +# Preload common datasets +df = pd.read_csv('data/master_dataset.csv') +``` + +**5. Custom Imports** +```python +import sys +sys.path.append('./custom_modules') +from my_utils import helper_functions +``` + +### Benefits of Init Notebooks + +- ✅ **Consistent environment**: Every notebook in the project gets the same setup +- ✅ **Automated dependency installation**: No manual pip install commands needed +- ✅ **One-time setup**: Runs once per session, not every time you open a notebook +- ✅ **Transparent to users**: Happens automatically in the background +- ✅ **Error resilient**: Failures don't block user from running their code +- ✅ **Progress visibility**: Clear notifications show what's happening +- ✅ **Session persistence**: Init state is preserved across notebook switches + +### Configuration in Deepnote Projects + +To add an init notebook to your Deepnote project: + +1. Create a notebook named "Init" (or any name) +2. Add your setup code blocks to this notebook +3. Note the notebook's ID from the YAML +4. Add `initNotebookId: ` to your `project` section +5. Optionally add a `requirements` array under `project.settings` + +The extension will automatically detect and run this notebook when the project is opened. + +### Limitations + +- Init notebook must be a notebook within the same project +- Only code blocks are executed (markdown blocks are skipped) +- Runs in the same kernel as the main notebook (shared state) +- Cannot be cancelled once started +- Runs only once per project per VS Code session +- Requires user to run at least one cell to trigger kernel creation and init notebook execution + +### Technical Notes + +**Why Event-Driven Approach?** + +VS Code creates notebook kernels **lazily** - they don't exist when controllers are selected. The kernel is only created when: +1. User executes a cell, OR +2. Controller explicitly calls `startKernel()` (but this can throw `CancellationError`) + +The event-driven approach is more reliable: +- No `CancellationError` issues +- Kernel is guaranteed to exist when `onDidStartKernel` fires +- Natural integration with VS Code's lazy kernel creation +- Simpler code without complex retry logic + +**Event-Driven Flow Diagram:** + +```mermaid +sequenceDiagram + participant User + participant VSCode + participant AutoSelector as Kernel Auto-Selector + participant KernelProvider + participant InitRunner as Init Notebook Runner + participant Kernel + + User->>VSCode: Opens .deepnote file + VSCode->>AutoSelector: onDidOpenNotebook() + AutoSelector->>AutoSelector: ensureKernelSelected() + AutoSelector->>AutoSelector: Register controller + AutoSelector->>AutoSelector: Create requirements.txt + + alt Has initNotebookId + AutoSelector->>AutoSelector: Store in projectsPendingInitNotebook + Note over AutoSelector: "Init notebook will run when kernel starts" + end + + AutoSelector-->>User: Kernel ready! (but kernel not created yet) + + User->>VSCode: Runs first cell + VSCode->>KernelProvider: getOrCreate(notebook) + KernelProvider->>Kernel: Create kernel instance + Kernel->>Kernel: start() + Kernel->>KernelProvider: Fire onDidStartKernel event + KernelProvider->>AutoSelector: onKernelStarted(kernel) + + alt Has pending init notebook + AutoSelector->>InitRunner: runInitNotebookIfNeeded(notebook, projectId) + InitRunner->>KernelProvider: get(notebook) ✅ exists! + InitRunner->>Kernel: executeHidden(block.content) + Note over InitRunner,Kernel: pip install -r requirements.txt + InitRunner->>InitRunner: Mark as run (cached) + InitRunner-->>AutoSelector: Init complete ✅ + end + + AutoSelector-->>VSCode: Init notebook done + VSCode->>Kernel: Execute user's cell + Kernel-->>User: import pandas ✅ works! +``` ## UI Customization @@ -290,11 +569,21 @@ To test the implementation: - `src/kernels/deepnote/deepnoteServerStarter.node.ts` - Server lifecycle management - `src/kernels/deepnote/deepnoteServerProvider.node.ts` - Jupyter server provider implementation - `src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts` - Automatic kernel selection +- `src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts` - Init notebook execution service +- `src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts` - Requirements.txt creation helper ### Modified: - `src/kernels/types.ts` - Added DeepnoteKernelConnectionMetadata to union types -- `src/notebooks/serviceRegistry.node.ts` - Registered new services +- `src/notebooks/serviceRegistry.node.ts` - Registered new services including init notebook runner +- `src/notebooks/deepnote/deepnoteNotebookManager.ts` - Added init notebook execution tracking +- `src/notebooks/deepnote/deepnoteTypes.ts` - Added initNotebookId field to project type +- `src/notebooks/types.ts` - Updated IDeepnoteNotebookManager interface +- `src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts` - Removed duplicate hash function (now calls `toolkitInstaller.getVenvHash()`), added event-driven init notebook execution via `onDidStartKernel`, added pending init notebook tracking, changed to await init notebook +- `src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts` - Changed to return boolean for success/failure, simplified by removing retry logic (kernel guaranteed to exist), added dual progress bars +- `src/kernels/deepnote/deepnoteServerStarter.node.ts` - Added `JUPYTER_PATH` environment variable for kernel spec discovery +- `src/kernels/deepnote/deepnoteToolkitInstaller.node.ts` - Made `getVenvHash()` public for reuse by auto-selector +- `src/kernels/deepnote/types.ts` - Added `getVenvHash()` to `IDeepnoteToolkitInstaller` interface ## Dependencies @@ -336,12 +625,16 @@ The implementation uses a robust hashing approach for virtual environment direct 1. **Path Hashing**: Uses `getVenvHash()` to create short, unique identifiers from file paths 2. **Hash Algorithm**: Implements a djb2-style hash function for better distribution 3. **Format**: Generates identifiers like `venv_a1b2c3d4` (max 16 characters) -4. **Benefits**: +4. **Shared Implementation**: The hash function is defined in `DeepnoteToolkitInstaller` and exposed as a public method +5. **Consistent Usage**: Both the toolkit installer and kernel auto-selector call `toolkitInstaller.getVenvHash()` +6. **Benefits**: - Avoids Windows MAX_PATH (260 character) limitations - Prevents directory structure leakage into extension storage - Provides consistent naming for both venv directories and kernel specs - Reduces collision risk with better hash distribution +- **Single source of truth** - hash function defined in one place only +- **Guaranteed consistency** - both components use the exact same implementation ## Troubleshooting & Key Fixes diff --git a/README.md b/README.md index e862677183..95562552b4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # Deepnote Extension for Visual Studio Code +[![CI](https://github.com/deepnote/vscode-deepnote/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/deepnote/vscode-deepnote/actions/workflows/ci.yml) +[![codecov](https://codecov.io/gh/deepnote/vscode-deepnote/graph/badge.svg?token=NH066XG7JC)](https://codecov.io/gh/deepnote/vscode-deepnote) + A [Visual Studio Code](https://code.visualstudio.com/) extension that provides support for [Deepnote notebooks](https://deepnote.com/) directly within VS Code. This extension allows you to work with Deepnote notebooks in VS Code, bringing the rich data science capabilities of Deepnote to your favorite editor. ![Deepnote Projects](./images/deepnote-projects.png) @@ -9,6 +12,8 @@ This extension allows you to work with Deepnote notebooks in VS Code. Deepnote n - **More block types** - Choose from SQL blocks, chart blocks, and more specialized data science blocks - **Seamless language switching** - Switch between Python and SQL seamlessly within the same notebook - **Database integrations** - Connect directly to Postgres, Snowflake, BigQuery and more data sources +- **Init notebooks** - Automatically runs initialization code (like dependency installation) before your notebooks execute +- **Project requirements** - Automatically creates `requirements.txt` from your project settings for easy dependency management ## Useful commands diff --git a/build/esbuild/build.ts b/build/esbuild/build.ts index 234784b400..c0912338eb 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,32 @@ 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)) { + 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' }; + } catch (error) { + console.error(`PostCSS processing failed for ${args.path}:`, error); + throw error; + } + } + + // 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 @@ -140,7 +173,9 @@ function style({ minify = true, charset = 'utf8' }: StylePluginOptions = {}): Pl options.loader[key] = loader[key]; } }); + const { errors, warnings, outputFiles } = await esbuild.build(options); + return { errors, warnings, contents: outputFiles![0].text, loader: 'text' }; }); } @@ -158,7 +193,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 961a69b8e0..486a446aa7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,6 +82,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", @@ -134,6 +135,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", @@ -151,6 +153,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", @@ -187,6 +190,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", @@ -194,6 +198,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", @@ -290,6 +295,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", @@ -1482,6 +1500,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", @@ -1629,6 +1660,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", @@ -1646,9 +1688,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", @@ -2815,6 +2858,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", @@ -4670,6 +4999,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", @@ -4864,6 +5231,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", @@ -5145,9 +5522,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": [ { @@ -5163,11 +5540,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" @@ -5430,9 +5809,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": [ { @@ -5447,7 +5826,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chai": { "version": "4.3.10", @@ -5575,6 +5955,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", @@ -6711,6 +7101,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", @@ -6963,10 +7363,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", @@ -7032,10 +7433,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" @@ -7349,6 +7751,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", @@ -8619,6 +9035,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", @@ -10818,6 +11248,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", @@ -11391,6 +11831,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", @@ -11834,6 +12523,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", @@ -12178,7 +12880,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": { @@ -12393,10 +13114,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", @@ -12519,6 +13241,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", @@ -13616,6 +14348,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", @@ -14912,6 +15713,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", @@ -15485,6 +16296,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", @@ -15494,6 +16312,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", @@ -15531,6 +16366,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", @@ -16389,9 +17234,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": [ { @@ -16407,9 +17252,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" @@ -17223,6 +18069,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", @@ -17963,6 +18815,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", @@ -18071,6 +18932,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", @@ -18082,9 +18953,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", @@ -19125,6 +19996,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", @@ -20554,6 +21578,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", @@ -20691,6 +21729,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", @@ -20943,15 +21987,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": { @@ -21125,9 +22170,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": { @@ -21223,6 +22268,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", @@ -22102,6 +23153,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", @@ -22315,9 +23372,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": { @@ -22381,9 +23438,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", @@ -22647,6 +23704,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", @@ -23598,6 +24664,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", @@ -25160,6 +26232,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", @@ -25611,6 +26689,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", @@ -25961,6 +27134,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", @@ -26210,6 +27392,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", @@ -26389,9 +27577,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": { @@ -26476,6 +27664,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", @@ -27301,6 +28495,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", @@ -28285,6 +29508,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", @@ -28757,12 +29986,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", @@ -29472,13 +30728,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 27df12a9ef..f3223893ec 100644 --- a/package.json +++ b/package.json @@ -2189,6 +2189,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", @@ -2241,6 +2242,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", @@ -2258,6 +2260,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", @@ -2294,6 +2297,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", @@ -2301,6 +2305,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/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/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/extension.common.ts b/src/extension.common.ts index 6b3052a0f4..5f98c14739 100644 --- a/src/extension.common.ts +++ b/src/extension.common.ts @@ -37,6 +37,7 @@ import { import { Common } from './platform/common/utils/localize'; import { IServiceContainer, IServiceManager } from './platform/ioc/types'; import { initializeLoggers as init, logger } from './platform/logging'; +import { ILogger } from './platform/logging/types'; import { getJupyterOutputChannel } from './standalone/devTools/jupyterOutputChannel'; import { isUsingPylance } from './standalone/intellisense/notebookPythonPathService'; import { noop } from './platform/common/utils/misc'; @@ -127,6 +128,7 @@ export function initializeGlobals( getJupyterOutputChannel(context.subscriptions), JUPYTER_OUTPUT_CHANNEL ); + serviceManager.addSingletonInstance(ILogger, logger); return [serviceManager, serviceContainer]; } 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); + } +} diff --git a/src/kernels/deepnote/deepnoteToolkitInstaller.node.ts b/src/kernels/deepnote/deepnoteToolkitInstaller.node.ts index 7aa5c19177..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 { @@ -65,6 +66,8 @@ export class DeepnoteToolkitInstaller implements IDeepnoteToolkitInstaller { const venvPath = this.getVenvPath(deepnoteFileUri); const venvKey = venvPath.fsPath; + logger.info(`Ensuring virtual environment at ${venvKey}`); + // Wait for any pending installation for this venv to complete const pendingInstall = this.pendingInstallations.get(venvKey); if (pendingInstall) { @@ -210,6 +213,7 @@ export class DeepnoteToolkitInstaller implements IDeepnoteToolkitInstaller { logger.info('deepnote-toolkit installed successfully in venv'); // Install kernel spec so the kernel uses this venv's Python + // Install into the venv itself (not --user) so the Deepnote server can discover it logger.info('Installing kernel spec for venv...'); try { // Reuse the process service with system environment @@ -219,7 +223,8 @@ export class DeepnoteToolkitInstaller implements IDeepnoteToolkitInstaller { '-m', 'ipykernel', 'install', - '--user', + '--prefix', + venvPath.fsPath, '--name', `deepnote-venv-${this.getVenvHash(deepnoteFileUri)}`, '--display-name', @@ -227,7 +232,14 @@ export class DeepnoteToolkitInstaller implements IDeepnoteToolkitInstaller { ], { throwOnStdErr: false } ); - logger.info('Kernel spec installed successfully'); + const kernelSpecPath = Uri.joinPath( + venvPath, + 'share', + 'jupyter', + 'kernels', + `deepnote-venv-${this.getVenvHash(deepnoteFileUri)}` + ); + logger.info(`Kernel spec installed successfully to ${kernelSpecPath.fsPath}`); } catch (ex) { logger.warn(`Failed to install kernel spec: ${ex}`); // Don't fail the entire installation if kernel spec creation fails @@ -262,7 +274,7 @@ export class DeepnoteToolkitInstaller implements IDeepnoteToolkitInstaller { } } - private getVenvHash(deepnoteFileUri: Uri): string { + public getVenvHash(deepnoteFileUri: Uri): string { // Create a short hash from the file path for kernel naming and venv directory // This provides better uniqueness and prevents directory structure leakage const path = deepnoteFileUri.fsPath; diff --git a/src/kernels/deepnote/types.ts b/src/kernels/deepnote/types.ts index 82df017dd4..c969fb1a15 100644 --- a/src/kernels/deepnote/types.ts +++ b/src/kernels/deepnote/types.ts @@ -85,6 +85,13 @@ export interface IDeepnoteToolkitInstaller { * @param deepnoteFileUri The URI of the .deepnote file */ getVenvInterpreter(deepnoteFileUri: vscode.Uri): Promise; + + /** + * Gets the hash for the venv directory/kernel spec name based on file path. + * @param deepnoteFileUri The URI of the .deepnote file + * @returns The hash string used for venv directory and kernel spec naming + */ + getVenvHash(deepnoteFileUri: vscode.Uri): string; } export const IDeepnoteServerStarter = Symbol('IDeepnoteServerStarter'); @@ -147,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 5675e84ce2..c069cddaec 100644 --- a/src/kernels/execution/cellExecution.ts +++ b/src/kernels/execution/cellExecution.ts @@ -32,6 +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 { createBlockFromPocket } from '../../notebooks/deepnote/pocket'; +import { createPythonCode } from '@deepnote/blocks'; /** * Factory for CellExecution objects. @@ -406,9 +408,19 @@ export class CellExecution implements ICellExecution, IDisposable { return this.completedSuccessfully(); } - // Prepend initialization code - const prependCode = 'print("Hello world")'; - code = prependCode + '\n' + code; + // 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); + + // 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 diff --git a/src/kernels/execution/cellExecutionMessageHandler.ts b/src/kernels/execution/cellExecutionMessageHandler.ts index 7b13630947..b914f3282c 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. */ @@ -634,7 +642,10 @@ 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 = getCellId(this.cell); + const cellMetadata = this.cell.metadata || {}; + const cellOutput = cellOutputToVSCCellOutput(output, this.cell.index, cellId, cellMetadata); const displayId = 'transient' in output && typeof output.transient === 'object' && @@ -1003,32 +1014,56 @@ 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 = getCellId(this.cell); + const cellMetadata = this.cell.metadata || {}; + const output = cellOutputToVSCCellOutput( + { + output_type: 'stream', + name: msg.content.name, + text: msg.content.text + }, + this.cell.index, + cellId, + cellMetadata + ); 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 = getCellId(this.cell); + const cellMetadata = this.cell.metadata || {}; + const output = cellOutputToVSCCellOutput( + { + output_type: 'stream', + name: msg.content.name, + text + }, + this.cell.index, + cellId, + cellMetadata + ); 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 = getCellId(this.cell); + const cellMetadata = this.cell.metadata || {}; + const output = cellOutputToVSCCellOutput( + { + output_type: 'stream', + name: msg.content.name, + text + }, + this.cell.index, + cellId, + cellMetadata + ); 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 +1181,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 = getCellId(outputToBeUpdated.cell); + const cellMetadata = outputToBeUpdated.cell.metadata || {}; + const newOutput = cellOutputToVSCCellOutput( + { + ...output, + data: msg.content.data, + metadata: msg.content.metadata + } as nbformat.IDisplayData, + outputToBeUpdated.cell.index, + cellId, + cellMetadata + ); // 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..39f2a5b801 100644 --- a/src/kernels/execution/helpers.ts +++ b/src/kernels/execution/helpers.ts @@ -115,7 +115,15 @@ 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, + cellMetadata?: Record + ) => 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 +134,12 @@ 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, + cellMetadata?: Record +): NotebookCellOutput { /** * Stream, `application/x.notebook.stream` * Error, `application/x.notebook.error-traceback` @@ -153,20 +166,39 @@ 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, 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); + result = translateDisplayDataOutput(output as any, cellIndex, cellId, cellMetadata); } return result; } -function getOutputMetadata(output: nbformat.IOutput): 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 (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; @@ -177,7 +209,10 @@ function getOutputMetadata(output: nbformat.IOutput): CellOutputMetadata { 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: @@ -200,7 +235,10 @@ 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, + cellMetadata?: Record ): NotebookCellOutput { // Metadata could be as follows: // We'll have metadata specific to each mime type as well as generic metadata. @@ -219,7 +257,7 @@ function translateDisplayDataOutput( } } */ - const metadata = getOutputMetadata(output); + 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; @@ -235,10 +273,15 @@ function translateDisplayDataOutput( return new NotebookCellOutput(sortOutputItemsBasedOnDisplayOrder(items), metadata); } -function translateStreamOutput(output: nbformat.IStream): 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)); + 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 @@ -282,6 +325,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 +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): NotebookCellOutput { +function translateErrorOutput( + output?: nbformat.IError, + cellIndex?: number, + cellId?: string, + cellMetadata?: Record +): NotebookCellOutput { output = output || { output_type: 'error', ename: '', evalue: '', traceback: [] }; return new NotebookCellOutput( [ @@ -552,7 +608,7 @@ function translateErrorOutput(output?: nbformat.IError): NotebookCellOutput { stack: (output?.traceback || []).join('\n') }) ], - { ...getOutputMetadata(output), 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 5ea86dc00a..70d720f1d6 100644 --- a/src/notebooks/deepnote/deepnoteDataConverter.ts +++ b/src/notebooks/deepnote/deepnoteDataConverter.ts @@ -31,7 +31,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) { @@ -50,14 +50,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.type, block.metadata, block.outputs || []); + cell.outputs = this.transformOutputsForVsCode(block.outputs || [], index, block.id, block.type, block.metadata); return cell; }); @@ -81,7 +80,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); } @@ -214,9 +214,11 @@ export class DeepnoteDataConverter { } private transformOutputsForVsCode( + outputs: DeepnoteOutput[], + cellIndex: number, + cellId: string, blockType: DeepnoteBlock['type'], - blockMetadata: DeepnoteBlock['metadata'], - outputs: DeepnoteOutput[] + blockMetadata?: Record ): NotebookCellOutput[] { return outputs.map((output) => { if ('output_type' in output) { @@ -228,7 +230,13 @@ export class DeepnoteDataConverter { stack: errorOutput.traceback ? errorOutput.traceback.join('\n') : '' }; - return new NotebookCellOutput([NotebookCellOutputItem.error(error)]); + const metadata: Record = { + cellId, + ...blockMetadata, + cellIndex + }; + + return new NotebookCellOutput([NotebookCellOutputItem.error(error)], metadata); } if (output.output_type === 'execute_result' || output.output_type === 'display_data') { @@ -303,8 +311,12 @@ export class DeepnoteDataConverter { } // Preserve metadata and execution_count + // Merge in order: cellId, blockMetadata, cellIndex, executionCount, then output.metadata (wins conflicts) const metadata: Record = { - blockMetadata + cellId, + ...blockMetadata, + blockMetadata, // TODO - remove duplicate + cellIndex }; if (output.execution_count !== undefined) { @@ -315,9 +327,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') { @@ -330,12 +340,30 @@ export class DeepnoteDataConverter { ? 'application/vnd.code.notebook.stderr' : 'application/vnd.code.notebook.stdout'; - return new NotebookCellOutput([NotebookCellOutputItem.text(String(output.text), mimeType)]); + const metadata: Record = { + cellId, + ...blockMetadata, + cellIndex + }; + + 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: Record = { + cellId, + ...blockMetadata, + cellIndex + }; + + return new NotebookCellOutput( + [NotebookCellOutputItem.text(String(output.text), 'text/plain')], + metadata + ); } // No text, return empty output @@ -344,7 +372,16 @@ 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: Record = { + cellId, + ...blockMetadata, + cellIndex + }; + + 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/deepnoteInitNotebookRunner.node.ts b/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts new file mode 100644 index 0000000000..cbc5f8f5b5 --- /dev/null +++ b/src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts @@ -0,0 +1,286 @@ +import { inject, injectable } from 'inversify'; +import { NotebookDocument, ProgressLocation, window, CancellationTokenSource, CancellationToken } from 'vscode'; +import { logger } from '../../platform/logging'; +import { IDeepnoteNotebookManager } from '../types'; +import { DeepnoteProject, DeepnoteNotebook } from './deepnoteTypes'; +import { IKernelProvider } from '../../kernels/types'; +import { getDisplayPath } from '../../platform/common/platform/fs-paths'; + +/** + * Service responsible for running init notebooks before the main notebook starts. + * Init notebooks typically contain setup code like pip installs. + */ +@injectable() +export class DeepnoteInitNotebookRunner { + constructor( + @inject(IDeepnoteNotebookManager) private readonly notebookManager: IDeepnoteNotebookManager, + @inject(IKernelProvider) private readonly kernelProvider: IKernelProvider + ) {} + + /** + * Runs the init notebook if it exists and hasn't been run yet for this project. + * This should be called after the kernel is started but before user code executes. + * @param notebook The notebook document + * @param projectId The Deepnote project ID + * @param token Optional cancellation token to stop execution if notebook is closed + */ + async runInitNotebookIfNeeded( + projectId: string, + notebook: NotebookDocument, + token?: CancellationToken + ): Promise { + try { + // Check for cancellation before starting + if (token?.isCancellationRequested) { + logger.info(`Init notebook cancelled before start for project ${projectId}`); + return; + } + + // Check if init notebook has already run for this project + if (this.notebookManager.hasInitNotebookBeenRun(projectId)) { + logger.info(`Init notebook already ran for project ${projectId}, skipping`); + return; + } + + if (token?.isCancellationRequested) { + logger.info(`Init notebook cancelled for project ${projectId}`); + return; + } + + // Get the project data + const project = this.notebookManager.getOriginalProject(projectId) as DeepnoteProject | undefined; + if (!project) { + logger.warn(`Project ${projectId} not found, cannot run init notebook`); + return; + } + + // Check if project has an init notebook ID + const initNotebookId = (project.project as { initNotebookId?: string }).initNotebookId; + if (!initNotebookId) { + logger.info(`No init notebook configured for project ${projectId}`); + // Mark as run so we don't check again + this.notebookManager.markInitNotebookAsRun(projectId); + return; + } + + // Find the init notebook + const initNotebook = project.project.notebooks.find((nb) => nb.id === initNotebookId); + if (!initNotebook) { + logger.warn( + `Init notebook ${initNotebookId} not found in project ${projectId}, skipping initialization` + ); + this.notebookManager.markInitNotebookAsRun(projectId); + return; + } + + if (token?.isCancellationRequested) { + logger.info(`Init notebook cancelled before execution for project ${projectId}`); + return; + } + + logger.info(`Running init notebook "${initNotebook.name}" (${initNotebookId}) for project ${projectId}`); + + // Execute the init notebook with progress + const success = await this.executeInitNotebook(notebook, initNotebook, token); + + if (success) { + // Mark as run so we don't run it again + this.notebookManager.markInitNotebookAsRun(projectId); + logger.info(`Init notebook completed successfully for project ${projectId}`); + } else { + logger.warn(`Init notebook did not execute for project ${projectId} - kernel not available`); + } + } catch (error) { + // Check if this is a cancellation error + if (error instanceof Error && error.message === 'Cancelled') { + logger.info(`Init notebook cancelled for project ${projectId}`); + return; + } + // Log error but don't throw - we want to let user continue anyway + logger.error(`Error running init notebook for project ${projectId}:`, error); + // Still mark as run to avoid retrying on every notebook open + this.notebookManager.markInitNotebookAsRun(projectId); + } + } + + /** + * Executes the init notebook's code blocks in the kernel. + * @param notebook The notebook document (for kernel context) + * @param initNotebook The init notebook to execute + * @param token Optional cancellation token from parent operation + * @returns True if execution completed, false if kernel was not available + */ + private async executeInitNotebook( + notebook: NotebookDocument, + initNotebook: DeepnoteNotebook, + token?: CancellationToken + ): Promise { + // Check for cancellation before starting + if (token?.isCancellationRequested) { + logger.info(`Init notebook execution cancelled before start`); + return false; + } + + // Show progress in both notification AND window for maximum visibility + const cancellationTokenSource = new CancellationTokenSource(); + + // Link parent token to our local token if provided + const tokenDisposable = token?.onCancellationRequested(() => { + cancellationTokenSource.cancel(); + }); + + // Create a wrapper that reports to both progress locations + const executeWithDualProgress = async () => { + return window.withProgress( + { + location: ProgressLocation.Notification, + title: `🚀 Initializing project environment`, + cancellable: false + }, + async (notificationProgress) => { + return window.withProgress( + { + location: ProgressLocation.Window, + title: `Init: "${initNotebook.name}"`, + cancellable: false + }, + async (windowProgress) => { + // Helper to report to both progress bars + const reportProgress = (message: string, increment: number) => { + notificationProgress.report({ message, increment }); + windowProgress.report({ message, increment }); + }; + + return this.executeInitNotebookImpl( + notebook, + initNotebook, + reportProgress, + cancellationTokenSource.token + ); + } + ); + } + ); + }; + + try { + return await executeWithDualProgress(); + } finally { + tokenDisposable?.dispose(); + cancellationTokenSource.dispose(); + } + } + + private async executeInitNotebookImpl( + notebook: NotebookDocument, + initNotebook: DeepnoteNotebook, + progress: (message: string, increment: number) => void, + token: CancellationToken + ): Promise { + try { + // Check for cancellation + if (token.isCancellationRequested) { + logger.info(`Init notebook execution cancelled`); + return false; + } + + progress(`Running init notebook "${initNotebook.name}"...`, 0); + + // Get the kernel for this notebook + // Note: This should always exist because onKernelStarted already fired + const kernel = this.kernelProvider.get(notebook); + if (!kernel) { + logger.error( + `No kernel found for ${getDisplayPath( + notebook.uri + )} even after onDidStartKernel fired - this should not happen` + ); + return false; + } + + logger.info(`Kernel found for ${getDisplayPath(notebook.uri)}, starting init notebook execution`); + + // Filter out non-code blocks + const codeBlocks = initNotebook.blocks.filter((block) => block.type === 'code'); + + if (codeBlocks.length === 0) { + logger.info(`Init notebook has no code blocks, skipping execution`); + return true; // Not an error - just nothing to execute + } + + logger.info(`Executing ${codeBlocks.length} code blocks from init notebook`); + progress( + `Preparing to execute ${codeBlocks.length} initialization ${ + codeBlocks.length === 1 ? 'block' : 'blocks' + }...`, + 5 + ); + + // Check for cancellation + if (token.isCancellationRequested) { + logger.info(`Init notebook execution cancelled before starting blocks`); + return false; + } + + // Get kernel execution + const kernelExecution = this.kernelProvider.getKernelExecution(kernel); + + // Execute each code block sequentially + for (let i = 0; i < codeBlocks.length; i++) { + // Check for cancellation between blocks + if (token.isCancellationRequested) { + logger.info(`Init notebook execution cancelled after block ${i}`); + return false; + } + + const block = codeBlocks[i]; + const percentComplete = Math.min(100, Math.floor(((i + 1) / codeBlocks.length) * 100)); + + // Show more detailed progress with percentage + progress( + `[${percentComplete}%] Executing block ${i + 1} of ${codeBlocks.length}...`, + 90 / codeBlocks.length // Reserve 5% for start, 5% for finish + ); + + logger.info(`Executing init notebook block ${i + 1}/${codeBlocks.length}`); + + try { + // Execute the code silently in the background + const outputs = await kernelExecution.executeHidden(block.content ?? ''); + + // Log outputs for debugging + if (outputs && outputs.length > 0) { + logger.info(`Init notebook block ${i + 1} produced ${outputs.length} outputs`); + + // Check for errors in outputs + const errors = outputs.filter( + (output: { output_type?: string }) => output.output_type === 'error' + ); + if (errors.length > 0) { + logger.warn(`Init notebook block ${i + 1} produced errors:`, errors); + } + } + } catch (blockError) { + // Log error but continue with next block + logger.error(`Error executing init notebook block ${i + 1}:`, blockError); + } + } + + logger.info(`Completed executing all init notebook blocks`); + progress(`✓ Initialization complete! Environment ready.`, 5); + + // Give user a moment to see the completion message + await new Promise((resolve) => setTimeout(resolve, 1000)); + + return true; + } catch (error) { + logger.error(`Error in executeInitNotebook:`, error); + throw error; + } + } +} + +export const IDeepnoteInitNotebookRunner = Symbol('IDeepnoteInitNotebookRunner'); +export interface IDeepnoteInitNotebookRunner { + runInitNotebookIfNeeded(projectId: string, notebook: NotebookDocument, token?: CancellationToken): Promise; +} diff --git a/src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts b/src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts index ac9521d7c9..9c506affdf 100644 --- a/src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts +++ b/src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts @@ -10,7 +10,10 @@ import { window, ProgressLocation, notebooks, - NotebookController + NotebookController, + CancellationTokenSource, + Disposable, + l10n } from 'vscode'; import { IExtensionSyncActivationService } from '../../platform/activation/types'; import { IDisposableRegistry } from '../../platform/common/types'; @@ -34,6 +37,11 @@ import { createJupyterConnectionInfo } from '../../kernels/jupyter/jupyterUtils' import { IJupyterRequestCreator, IJupyterRequestAgentCreator } from '../../kernels/jupyter/types'; import { IConfigurationService } from '../../platform/common/types'; import { disposeAsync } from '../../platform/common/utils'; +import { IDeepnoteInitNotebookRunner } from './deepnoteInitNotebookRunner.node'; +import { IDeepnoteNotebookManager } from '../types'; +import { IDeepnoteRequirementsHelper } from './deepnoteRequirementsHelper.node'; +import { DeepnoteProject } from './deepnoteTypes'; +import { IKernelProvider, IKernel } from '../../kernels/types'; /** * Automatically selects and starts Deepnote kernel for .deepnote notebooks @@ -48,6 +56,11 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, private readonly notebookConnectionMetadata = new Map(); // Track temporary loading controllers that get disposed when real controller is ready private readonly loadingControllers = new Map(); + // Track projects where we need to run init notebook (set during controller setup) + private readonly projectsPendingInitNotebook = new Map< + string, + { notebook: NotebookDocument; project: DeepnoteProject } + >(); constructor( @inject(IDisposableRegistry) private readonly disposables: IDisposableRegistry, @@ -61,7 +74,11 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, @inject(IJupyterRequestAgentCreator) @optional() private readonly requestAgentCreator: IJupyterRequestAgentCreator | undefined, - @inject(IConfigurationService) private readonly configService: IConfigurationService + @inject(IConfigurationService) private readonly configService: IConfigurationService, + @inject(IDeepnoteInitNotebookRunner) private readonly initNotebookRunner: IDeepnoteInitNotebookRunner, + @inject(IDeepnoteNotebookManager) private readonly notebookManager: IDeepnoteNotebookManager, + @inject(IKernelProvider) private readonly kernelProvider: IKernelProvider, + @inject(IDeepnoteRequirementsHelper) private readonly requirementsHelper: IDeepnoteRequirementsHelper ) {} public activate() { @@ -79,6 +96,10 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, this.disposables ); + // Listen to kernel starts to run init notebooks + // Kernels are created lazily when cells are executed, so this is the right time to run init notebook + this.kernelProvider.onDidStartKernel(this.onKernelStarted, this, this.disposables); + // Handle currently open notebooks - await all async operations Promise.all(workspace.notebookDocuments.map((d) => this.onDidOpenNotebook(d))).catch((error) => { logger.error(`Error handling open notebooks during activation: ${error}`); @@ -107,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.') + ); }); } @@ -165,13 +188,75 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, this.serverProvider.unregisterServer(serverHandle); this.notebookServerHandles.delete(notebookKey); } + + // Clean up pending init notebook tracking + const projectId = notebook.metadata?.deepnoteProjectId; + if (projectId) { + this.projectsPendingInitNotebook.delete(projectId); + } + } + + private async onKernelStarted(kernel: IKernel) { + // Only handle deepnote notebooks + if (kernel.notebook?.notebookType !== DEEPNOTE_NOTEBOOK_TYPE) { + return; + } + + const notebook = kernel.notebook; + const projectId = notebook.metadata?.deepnoteProjectId; + + if (!projectId) { + return; + } + + // Check if we have a pending init notebook for this project + const pendingInit = this.projectsPendingInitNotebook.get(projectId); + if (!pendingInit) { + return; // No init notebook to run + } + + logger.info(`Kernel started for Deepnote notebook, running init notebook for project ${projectId}`); + + // Remove from pending list + this.projectsPendingInitNotebook.delete(projectId); + + // Create a CancellationTokenSource tied to the notebook lifecycle + const cts = new CancellationTokenSource(); + const disposables: Disposable[] = []; + + try { + // Register handler to cancel the token if the notebook is closed + // Note: We check the URI to ensure we only cancel for the specific notebook that closed + const closeListener = workspace.onDidCloseNotebookDocument((closedNotebook) => { + if (closedNotebook.uri.toString() === notebook.uri.toString()) { + logger.info(`Notebook closed while init notebook was running, cancelling for project ${projectId}`); + cts.cancel(); + } + }); + disposables.push(closeListener); + + // Run init notebook with cancellation support + await this.initNotebookRunner.runInitNotebookIfNeeded(projectId, notebook, cts.token); + } catch (error) { + // Check if this is a cancellation error - if so, just log and continue + if (error instanceof Error && error.message === 'Cancelled') { + logger.info(`Init notebook cancelled for project ${projectId}`); + return; + } + 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 + cts.dispose(); + disposables.forEach((d) => d.dispose()); + } } public async ensureKernelSelected(notebook: NotebookDocument, _token?: CancellationToken): Promise { return window.withProgress( { location: ProgressLocation.Notification, - title: 'Loading Deepnote Kernel', + title: l10n.t('Loading Deepnote Kernel'), cancellable: true }, async (progress, progressToken) => { @@ -195,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) { @@ -235,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) { @@ -245,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( @@ -257,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, @@ -271,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, @@ -293,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, { @@ -316,30 +401,43 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, `Available kernel specs on Deepnote server: ${kernelSpecs.map((s) => s.name).join(', ')}` ); - // Create expected kernel name based on file path (same logic as in installer) - const safePath = baseFileUri.fsPath.replace(/[^a-zA-Z0-9]/g, '_'); - const venvHash = safePath.substring(0, 16); + // Create expected kernel name based on file path (uses installer's hash logic) + const venvHash = this.toolkitInstaller.getVenvHash(baseFileUri); const expectedKernelName = `deepnote-venv-${venvHash}`; logger.info(`Looking for venv kernel spec: ${expectedKernelName}`); // Prefer the venv kernel spec that uses the venv's Python interpreter // This ensures packages installed via pip are available to the kernel - kernelSpec = - kernelSpecs.find((s) => s.name === expectedKernelName) || - kernelSpecs.find((s) => s.language === 'python') || - kernelSpecs.find((s) => s.name === 'python3-venv') || - kernelSpecs[0]; + kernelSpec = kernelSpecs.find((s) => s.name === expectedKernelName); + + if (!kernelSpec) { + logger.warn( + l10n.t( + "⚠️ Venv kernel spec '{expectedKernelName}' not found! Falling back to generic Python kernel.", + { expectedKernelName } + ) + ); + logger.warn( + 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') || + kernelSpecs.find((s) => s.name === 'python3-venv') || + kernelSpecs[0]; + } if (!kernelSpec) { throw new Error('No kernel specs available on Deepnote server'); } - logger.info(`Using kernel spec: ${kernelSpec.name} (${kernelSpec.display_name})`); + logger.info(`✓ Using kernel spec: ${kernelSpec.name} (${kernelSpec.display_name})`); } finally { await disposeAsync(sessionManager); } - progress.report({ message: 'Finalizing kernel setup...' }); + progress.report({ message: l10n.t('Finalizing kernel setup...') }); const newConnectionMetadata = DeepnoteKernelConnectionMetadata.create({ interpreter, kernelSpec, @@ -368,6 +466,33 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, // Store the controller for reuse this.notebookControllers.set(notebookKey, controller); + // Prepare init notebook execution for when kernel starts + // This MUST complete before marking controller as preferred to avoid race conditions + const projectId = notebook.metadata?.deepnoteProjectId; + const project = projectId + ? (this.notebookManager.getOriginalProject(projectId) as DeepnoteProject | undefined) + : undefined; + + if (project) { + // Create requirements.txt first (needs to be ready for init notebook) + progress.report({ message: l10n.t('Creating requirements.txt...') }); + await this.requirementsHelper.createRequirementsFile(project, progressToken); + logger.info(`Created requirements.txt for project ${projectId}`); + + // Check if project has an init notebook that hasn't been run yet + if ( + project.project.initNotebookId && + !this.notebookManager.hasInitNotebookBeenRun(projectId!) + ) { + // Store for execution when kernel actually starts + // Kernels are created lazily when cells execute, so we can't run init notebook now + this.projectsPendingInitNotebook.set(projectId!, { notebook, project }); + logger.info( + `Init notebook will run automatically when kernel starts for project ${projectId}` + ); + } + } + // Mark this controller as protected so it won't be automatically disposed // This is similar to how active interpreter controllers are protected this.controllerRegistration.trackActiveInterpreterControllers(controllers); @@ -383,10 +508,11 @@ export class DeepnoteKernelAutoSelector implements IDeepnoteKernelAutoSelector, // Auto-select the controller for this notebook using affinity // Setting NotebookControllerAffinity.Preferred will make VSCode automatically select this controller + // This is done AFTER requirements.txt creation to avoid race conditions 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); @@ -396,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; } } @@ -408,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/deepnoteNotebookManager.ts b/src/notebooks/deepnote/deepnoteNotebookManager.ts index e556ff4e46..3c324fb663 100644 --- a/src/notebooks/deepnote/deepnoteNotebookManager.ts +++ b/src/notebooks/deepnote/deepnoteNotebookManager.ts @@ -12,6 +12,7 @@ export class DeepnoteNotebookManager implements IDeepnoteNotebookManager { private readonly currentNotebookId = new Map(); private readonly originalProjects = new Map(); private readonly selectedNotebookByProject = new Map(); + private readonly projectsWithInitNotebookRun = new Set(); /** * Gets the currently selected notebook ID for a project. @@ -73,4 +74,21 @@ export class DeepnoteNotebookManager implements IDeepnoteNotebookManager { updateCurrentNotebookId(projectId: string, notebookId: string): void { this.currentNotebookId.set(projectId, notebookId); } + + /** + * Checks if the init notebook has already been run for a project. + * @param projectId Project identifier + * @returns True if init notebook has been run, false otherwise + */ + hasInitNotebookBeenRun(projectId: string): boolean { + return this.projectsWithInitNotebookRun.has(projectId); + } + + /** + * Marks the init notebook as having been run for a project. + * @param projectId Project identifier + */ + markInitNotebookAsRun(projectId: string): void { + this.projectsWithInitNotebookRun.add(projectId); + } } diff --git a/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts b/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts new file mode 100644 index 0000000000..5cae9097ae --- /dev/null +++ b/src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts @@ -0,0 +1,167 @@ +import { inject, injectable } from 'inversify'; +import { workspace, CancellationToken, window, Uri, l10n } from 'vscode'; +import * as fs from 'fs'; + +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 implements IDeepnoteRequirementsHelper { + constructor( + @inject(ILogger) private readonly logger: ILogger, + @inject(IPersistentStateFactory) private readonly persistentStateFactory: IPersistentStateFactory + ) {} + + /** + * Extracts requirements from project settings and creates a local requirements.txt file. + * @param project The Deepnote project data containing requirements in settings + * @param token Cancellation token to abort the operation if needed + */ + async createRequirementsFile(project: DeepnoteProject, token: CancellationToken): Promise { + try { + // Check if the operation has been cancelled + if (token.isCancellationRequested) { + return; + } + + const requirements = project.project.settings?.requirements; + if (!requirements || !Array.isArray(requirements) || requirements.length === 0) { + this.logger.info(`No requirements found in project ${project.project.id}`); + return; + } + + // 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}`); + return; + } + + // Get the workspace folder to determine where to create the requirements.txt file + const workspaceFolders = workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + this.logger.info('No workspace folder found, cannot create requirements.txt'); + return; + } + + // Check cancellation before performing I/O + if (token.isCancellationRequested) { + return; + } + + // 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 (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) + .then(() => true) + .catch(() => false); + + if (fileExists) { + // 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 (normalizedExistingContent === normalizedRequirementsText) { + this.logger.info('requirements.txt already has the correct content, skipping update'); + return; + } + + // File exists but content is different, check if we should prompt user + const dontAskState = this.persistentStateFactory.createGlobalPersistentState( + DONT_ASK_OVERWRITE_REQUIREMENTS_KEY, + false // default: ask user + ); + + if (!dontAskState.value) { + // User hasn't chosen "Don't Ask Again", so prompt them + const yes = l10n.t('Yes'); + const no = l10n.t('No'); + const dontAskAgain = l10n.t("Don't Ask Again"); + + const response = await window.showWarningMessage( + 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, + dontAskAgain + ); + + // Check cancellation after showing the prompt + if (token.isCancellationRequested) { + return; + } + + switch (response) { + case yes: + // User wants to override, continue with writing + this.logger.info('User chose to override requirements.txt'); + break; + case no: + // User doesn't want to override + this.logger.info('User chose not to override requirements.txt'); + return; + case dontAskAgain: + // User chose "Don't Ask Again", save preference and override this time + await dontAskState.updateValue(true); + this.logger.info('User chose "Don\'t Ask Again" for requirements.txt override'); + break; + default: + // User dismissed the prompt (clicked X) + this.logger.info('User dismissed requirements.txt override prompt'); + return; + } + } else { + // User previously selected "Don't Ask Again", automatically override + this.logger.info( + 'Automatically overriding requirements.txt (user previously selected "Don\'t Ask Again")' + ); + } + } + + // Write the requirements.txt file + await fs.promises.writeFile(requirementsPath, requirementsText, 'utf8'); + + // Check cancellation after I/O operation + if (token.isCancellationRequested) { + this.logger.info('Requirements file creation was cancelled after write'); + return; + } + + this.logger.info( + `Created requirements.txt with ${normalizedRequirements.length} dependencies at ${requirementsPath}` + ); + } catch (error) { + this.logger.error(`Error creating requirements.txt:`, error); + } + } +} diff --git a/src/notebooks/deepnote/pocket.ts b/src/notebooks/deepnote/pocket.ts index ed3ca35ac3..02e7a3963f 100644 --- a/src/notebooks/deepnote/pocket.ts +++ b/src/notebooks/deepnote/pocket.ts @@ -1,16 +1,18 @@ import type { NotebookCellData } from 'vscode'; -import type { DeepnoteBlock, DeepnoteOutput } from './deepnoteTypes'; +import type { DeepnoteBlock } 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 +// 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' and 'outputs' are not in the pocket - they are managed by VS Code natively 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' @@ -70,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/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/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/notebooks/serviceRegistry.node.ts b/src/notebooks/serviceRegistry.node.ts index 391aaf4679..6cb19391a5 100644 --- a/src/notebooks/serviceRegistry.node.ts +++ b/src/notebooks/serviceRegistry.node.ts @@ -53,6 +53,8 @@ import { DeepnoteToolkitInstaller } from '../kernels/deepnote/deepnoteToolkitIns import { DeepnoteServerStarter } from '../kernels/deepnote/deepnoteServerStarter.node'; import { DeepnoteKernelAutoSelector } from './deepnote/deepnoteKernelAutoSelector.node'; import { DeepnoteServerProvider } from '../kernels/deepnote/deepnoteServerProvider.node'; +import { DeepnoteInitNotebookRunner, IDeepnoteInitNotebookRunner } from './deepnote/deepnoteInitNotebookRunner.node'; +import { DeepnoteRequirementsHelper, IDeepnoteRequirementsHelper } from './deepnote/deepnoteRequirementsHelper.node'; export function registerTypes(serviceManager: IServiceManager, isDevMode: boolean) { registerControllerTypes(serviceManager, isDevMode); @@ -135,6 +137,8 @@ export function registerTypes(serviceManager: IServiceManager, isDevMode: boolea serviceManager.addBinding(IDeepnoteServerProvider, IExtensionSyncActivationService); serviceManager.addSingleton(IDeepnoteKernelAutoSelector, DeepnoteKernelAutoSelector); serviceManager.addBinding(IDeepnoteKernelAutoSelector, IExtensionSyncActivationService); + serviceManager.addSingleton(IDeepnoteInitNotebookRunner, DeepnoteInitNotebookRunner); + serviceManager.addSingleton(IDeepnoteRequirementsHelper, DeepnoteRequirementsHelper); // File export/import serviceManager.addSingleton(IFileConverter, FileConverter); diff --git a/src/notebooks/types.ts b/src/notebooks/types.ts index 1a1cab0c3f..377c27988a 100644 --- a/src/notebooks/types.ts +++ b/src/notebooks/types.ts @@ -32,4 +32,6 @@ export interface IDeepnoteNotebookManager { selectNotebookForProject(projectId: string, notebookId: string): void; storeOriginalProject(projectId: string, project: unknown, notebookId: string): void; updateCurrentNotebookId(projectId: string, notebookId: string): void; + hasInitNotebookBeenRun(projectId: string): boolean; + markInitNotebookAsRun(projectId: string): void; } diff --git a/src/platform/logging/types.ts b/src/platform/logging/types.ts index bb8717b654..d03f3c1870 100644 --- a/src/platform/logging/types.ts +++ b/src/platform/logging/types.ts @@ -6,6 +6,7 @@ export type Arguments = unknown[]; +export const ILogger = Symbol('ILogger'); export interface ILogger { error(message: string, ...data: Arguments): void; warn(message: string, ...data: Arguments): void; 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/test/coverage.node.ts b/src/test/coverage.node.ts index ef2160d581..882e86ce9d 100644 --- a/src/test/coverage.node.ts +++ b/src/test/coverage.node.ts @@ -14,7 +14,7 @@ export function setupCoverage() { return; } const htmlReport = process.env.VSC_JUPYTER_INSTRUMENT_CODE_FOR_COVERAGE_HTML ? ['html'] : []; - const reports = htmlReport.concat(['text', 'text-summary']); + const reports = htmlReport.concat(['text', 'text-summary', 'lcov']); const NYC = require('nyc'); const nyc = new NYC({ cwd: path.join(EXTENSION_ROOT_DIR_FOR_TESTS), diff --git a/src/webviews/extension-side/dataframe/dataframeController.ts b/src/webviews/extension-side/dataframe/dataframeController.ts new file mode 100644 index 0000000000..5674036bc9 --- /dev/null +++ b/src/webviews/extension-side/dataframe/dataframeController.ts @@ -0,0 +1,218 @@ +import { injectable } from 'inversify'; +import { + commands, + env, + l10n, + 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 = { + cellId?: string; + cellIndex?: number; + command: 'goToPage'; + 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 async onDidReceiveMessage( + _comms: NotebookRendererMessaging, + { editor, message }: { editor: NotebookEditor; message: DataframeCommand } + ) { + logger.info('DataframeController received message', message); + + if (!message || typeof message !== 'object') { + return; + } + + 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) { + if (!message.cellId && message.cellIndex === undefined) { + 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}`); + + 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 = 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}`); + + 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 = { + ...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 async handleGoToPage(editor: NotebookEditor, message: GoToPageCommand) { + if (!message.cellId) { + 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}`); + + 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 = 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}`); + + 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 cellIndex = cell.index; + + 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) { + 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 + } +} 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..af150e22f7 100644 --- a/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx +++ b/src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx @@ -1,69 +1,209 @@ -import React, { memo, useState } from 'react'; +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; +} + +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; context: RendererContext; data: { column_count: number; 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; }; + 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, + context, + data, + metadata +}: DataframeRendererProps) { + 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); + + console.log( + `[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); 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 totalPages = Math.ceil(data.row_count / pageSize); + + const handlePageSizeChange = (event: React.ChangeEvent) => { + const newPageSize = Number(event.target.value); + + setPageSize(newPageSize); + + console.log(`[DataframeRenderer] handlePageSizeChange called with cellId: ${cellId}`); + + const message = { + command: 'selectPageSize', + cellId, + size: newPageSize + }; + + console.log(`[DataframeRenderer] Posting message: ${JSON.stringify(message)}`); + + context.postMessage?.(message); + }; + + const handlePageChange = (newPageIndex: number) => { + setPageIndex(newPageIndex); + + console.log(`[DataframeRenderer] handlePageChange called with cellId: ${cellId}, page: ${newPageIndex}`); + + const message = { + command: 'goToPage', + cellId, + page: newPageIndex + }; + + console.log(`[DataframeRenderer] Posting message: ${JSON.stringify(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 === null || value === undefined ? 'None' : String(value)} +
+ ))} +
-
- ); - })} + ); + })} +
-
-
- {numberOfRows} rows, {numberOfColumns} columns +
+
+
+ {numberOfRows} rows, {numberOfColumns} columns +
+
+ + + +
-
-
+ +
+ + + Page {pageIndex + 1} of {totalPages} + + +
+ +
{/* Actions */}
); diff --git a/src/webviews/webview-side/dataframe-renderer/index.ts b/src/webviews/webview-side/dataframe-renderer/index.ts index b4d401231f..eccd67b978 100644 --- a/src/webviews/webview-side/dataframe-renderer/index.ts +++ b/src/webviews/webview-side/dataframe-renderer/index.ts @@ -1,26 +1,52 @@ -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 { renderOutputItem(outputItem: OutputItem, element: HTMLElement) { - console.log('Dataframe renderer - rendering output item:', { outputItem, context }); + console.log(`Dataframe renderer - rendering output item: ${outputItem.id}`); try { const data = outputItem.json(); - console.log('Dataframe renderer - received data:', data); + console.log(`Dataframe renderer - received data with ${Object.keys(data).length} keys`); + + const metadata = outputItem.metadata as Metadata | undefined; + console.log('[DataframeRenderer] Full metadata', metadata); + + 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); + console.error(`Error rendering dataframe: ${error}`); const errorDiv = document.createElement('div'); errorDiv.style.padding = '10px'; errorDiv.style.color = 'var(--vscode-errorForeground)'; 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 8ae05ab4b42ce2ac0fbbdcc34bf450a8ad6c1a1e Mon Sep 17 00:00:00 2001 From: Christoffer Artmann Date: Tue, 14 Oct 2025 16:13:05 +0200 Subject: [PATCH 27/70] 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 28/70] 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 29/70] 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 30/70] 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 31/70] 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 32/70] 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 33/70] 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 34/70] 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) => (