diff --git a/.gitignore b/.gitignore index 663a2663c..8adb5c69e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ build/ out/ coverage/ *.tsbuildinfo +/.vscode-test-web diff --git a/.vscode/launch.json b/.vscode/launch.json index 007891bb6..1de64e263 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "name": "Run Extension", "type": "extensionHost", "request": "launch", - "args": ["--extensionDevelopmentPath=${workspaceFolder}/lana", "--disable-extensions"], + "args": ["--extensionDevelopmentPath=${workspaceFolder}/lana"], "outFiles": ["${workspaceFolder}/lana/out/**/*.js"], "localRoot": "${workspaceFolder}/lana" }, @@ -21,8 +21,7 @@ "type": "extensionHost", "request": "launch", "args": [ - "--extensionDevelopmentPath=${workspaceFolder}/${input:worktree}/lana", - "--disable-extensions" + "--extensionDevelopmentPath=${workspaceFolder}/${input:worktree}/lana" ], "outFiles": ["${workspaceFolder}/${input:worktree}/lana/out/**/*.js"], "localRoot": "${workspaceFolder}/${input:worktree}/lana" diff --git a/lana/package.json b/lana/package.json index 68ff4ef02..c5c23a57f 100644 --- a/lana/package.json +++ b/lana/package.json @@ -52,6 +52,9 @@ "categories": [ "Other" ], + "extensionDependencies": [ + "salesforce.salesforcedx-vscode-services" + ], "activationEvents": [ "onLanguage:apexlog", "onStartupFinished" @@ -382,8 +385,9 @@ }, "dependencies": { "@apexdevtools/apex-parser": "5.1.0", - "@salesforce/apex-node": "^9.0.0", - "@salesforce/core": "^9.1.0" + "@salesforce/vscode-services": "^67.12.0", + "effect": "^3.22.0", + "vscode-uri": "^3.1.0" }, "devDependencies": { "@types/jest": "^30.0.0", diff --git a/lana/src/Main.ts b/lana/src/Main.ts index 8222bef92..35b5f50ce 100644 --- a/lana/src/Main.ts +++ b/lana/src/Main.ts @@ -5,13 +5,16 @@ import type { ExtensionContext } from 'vscode'; import { Context } from './Context.js'; import { Display } from './display/Display.js'; +import { disposeServices, initServices } from './services/servicesRuntime.js'; export let context: Context | null = null; -export function activate(extensionContext: ExtensionContext) { +export async function activate(extensionContext: ExtensionContext) { + await initServices(); context = new Context(extensionContext, new Display()); } -export function deactivate() { +export async function deactivate() { context = null; + await disposeServices(); } diff --git a/lana/src/__tests__/helpers/test-builders.ts b/lana/src/__tests__/helpers/test-builders.ts index d6e3476ba..710660e5c 100644 --- a/lana/src/__tests__/helpers/test-builders.ts +++ b/lana/src/__tests__/helpers/test-builders.ts @@ -159,6 +159,7 @@ export function createMockApexLog(overrides: PartialApexLog = {}): ApexLog { export interface MockDisplay { output: jest.Mock; showErrorMessage: jest.Mock; + showFile: jest.Mock; showInformationMessage: jest.Mock; showWarningMessage: jest.Mock; } @@ -167,6 +168,7 @@ export function createMockDisplay(): MockDisplay { return { output: jest.fn(), showErrorMessage: jest.fn(), + showFile: jest.fn(), showInformationMessage: jest.fn(), showWarningMessage: jest.fn(), }; @@ -179,6 +181,7 @@ export interface MockContext { context: MockExtensionContext; display: MockDisplay; workspaces: { uri: { fsPath: string }; name: string }[]; + workspaceManager?: unknown; } /** diff --git a/lana/src/__tests__/mocks/vscode.ts b/lana/src/__tests__/mocks/vscode.ts index bcbe9432e..9a435ecb5 100644 --- a/lana/src/__tests__/mocks/vscode.ts +++ b/lana/src/__tests__/mocks/vscode.ts @@ -12,6 +12,7 @@ // a drift from `@types/vscode` surfaces as ONE error at the factory, not at // every call site. import type { EndOfLine, TextDocument } from 'vscode'; +import { URI, Utils } from 'vscode-uri'; // Track subscriptions for cleanup const subscriptions: { dispose: jest.Mock }[] = []; @@ -110,36 +111,21 @@ export const ViewColumn = { } as const; export type ViewColumn = (typeof ViewColumn)[keyof typeof ViewColumn]; -// Mock Uri class +// Delegate URI semantics to vscode-uri so virtual URI tests match VS Code. export const Uri = { - file: jest.fn((path: string) => ({ - scheme: 'file', - authority: '', - path, - fsPath: path, - query: '', - fragment: '', - with: jest.fn(), - toString: jest.fn(() => `file://${path}`), - toJSON: jest.fn(() => ({ scheme: 'file', path, fsPath: path })), - })), - parse: jest.fn((value: string) => ({ - scheme: value.startsWith('file://') ? 'file' : 'unknown', - authority: '', - path: value.replace('file://', ''), - fsPath: value.replace('file://', ''), - query: '', - fragment: '', - with: jest.fn(), - toString: jest.fn(() => value), - })), - joinPath: jest.fn((base, ...pathSegments) => ({ - ...base, - path: [base.path, ...pathSegments].join('/'), - fsPath: [base.fsPath, ...pathSegments].join('/'), - })), + file: (path: string) => URI.file(path), + parse: (value: string) => URI.parse(value), + joinPath: (base: URI, ...pathSegments: string[]) => Utils.joinPath(base, ...pathSegments), }; +export class TabInputText { + readonly uri: ReturnType; + + constructor(uri: ReturnType) { + this.uri = uri; + } +} + // Mock RelativePattern (constructor used for glob searches) export const RelativePattern = jest.fn(); @@ -300,6 +286,10 @@ export const workspace = { }, }; +export const extensions = { + getExtension: jest.fn(), +}; + // Mock window export const window = { showInformationMessage: jest.fn().mockResolvedValue(undefined), @@ -342,6 +332,12 @@ export const window = { replace: jest.fn(), })), createWebviewPanel: jest.fn(), + tabGroups: { + activeTabGroup: { activeTab: undefined as { input: unknown } | undefined }, + onDidChangeTabs: jest.fn((_listener: (event: unknown) => unknown) => ({ + dispose: jest.fn(), + })), + }, activeTextEditor: undefined as unknown, visibleTextEditors: [], onDidChangeActiveTextEditor: jest.fn(() => ({ dispose: jest.fn() })), @@ -368,6 +364,7 @@ export const commands = { // Mock languages export const languages = { + setTextDocumentLanguage: jest.fn().mockResolvedValue(undefined), registerFoldingRangeProvider: jest.fn((_selector, _provider) => { const disposable = { dispose: jest.fn() }; subscriptions.push(disposable); @@ -537,10 +534,12 @@ export const resetMocks = (): void => { // Reset workspace folders workspace.workspaceFolders = []; + workspace.textDocuments = []; // Reset active editor window.activeTextEditor = undefined; window.visibleTextEditors = []; + window.tabGroups.activeTabGroup.activeTab = undefined; }; // Export as default for module replacement @@ -550,6 +549,7 @@ export default { Selection, ViewColumn, Uri, + TabInputText, RelativePattern, FoldingRange, FoldingRangeKind, @@ -558,6 +558,7 @@ export default { ThemeColor, ConfigurationTarget, workspace, + extensions, window, commands, languages, diff --git a/lana/src/cache/LogEventCache.ts b/lana/src/cache/LogEventCache.ts index 896ecedd6..5412da1e0 100644 --- a/lana/src/cache/LogEventCache.ts +++ b/lana/src/cache/LogEventCache.ts @@ -1,12 +1,12 @@ /* * Copyright (c) 2026 Certinia Inc. All rights reserved. */ -import { readFile } from 'fs/promises'; import { workspace } from 'vscode'; import { parse, type ApexLog, type LogEvent } from 'apex-log-parser'; import type { Context } from '../Context.js'; +import { readFile } from '../services/salesforceServices.js'; export interface EventSearchResult { event: LogEvent; @@ -17,17 +17,17 @@ export class LogEventCache { private static readonly MAX_CACHE_SIZE = 10; private static cache = new Map(); - static async getApexLog(filePath: string): Promise { - const cached = LogEventCache.cache.get(filePath); + static async getApexLog(uriString: string): Promise { + const cached = LogEventCache.cache.get(uriString); if (cached) { // Move to end (most recently used) - LogEventCache.cache.delete(filePath); - LogEventCache.cache.set(filePath, cached); + LogEventCache.cache.delete(uriString); + LogEventCache.cache.set(uriString, cached); return cached; } try { - const content = await readFile(filePath, 'utf-8'); + const content = await readFile(uriString); const apexLog = parse(content); // Evict oldest if at capacity @@ -38,7 +38,7 @@ export class LogEventCache { } } - LogEventCache.cache.set(filePath, apexLog); + LogEventCache.cache.set(uriString, apexLog); return apexLog; } catch { return null; @@ -49,15 +49,15 @@ export class LogEventCache { return LogEventCache.searchEvents(apexLog.children, timestamp, 0); } - static clearCache(filePath: string): void { - LogEventCache.cache.delete(filePath); + static clearCache(uriString: string): void { + LogEventCache.cache.delete(uriString); } static apply(context: Context): void { context.context.subscriptions.push( workspace.onDidCloseTextDocument((doc) => { if (doc.languageId === 'apexlog') { - LogEventCache.clearCache(doc.uri.fsPath); + LogEventCache.clearCache(doc.uri.toString()); } }), ); diff --git a/lana/src/cache/__tests__/LogEventCache.test.ts b/lana/src/cache/__tests__/LogEventCache.test.ts index 8ca68198e..6a8964a20 100644 --- a/lana/src/cache/__tests__/LogEventCache.test.ts +++ b/lana/src/cache/__tests__/LogEventCache.test.ts @@ -2,7 +2,6 @@ * Copyright (c) 2026 Certinia Inc. All rights reserved. */ import { beforeEach, describe, expect, it } from '@jest/globals'; - import { workspace } from 'vscode'; import { @@ -12,18 +11,17 @@ import { } from '../../__tests__/helpers/test-builders.js'; import { LogEventCache } from '../LogEventCache.js'; -// Mock fs/promises -jest.mock('fs/promises', () => ({ - readFile: jest.fn(), -})); - // Mock apex-log-parser jest.mock('apex-log-parser', () => ({ parse: jest.fn(), })); import { parse } from 'apex-log-parser'; -import { readFile } from 'fs/promises'; +import { readFile } from '../../services/salesforceServices.js'; + +jest.mock('../../services/salesforceServices.js', () => ({ + readFile: jest.fn(), +})); const mockReadFile = readFile as jest.Mock; const mockParse = parse as jest.Mock; @@ -373,8 +371,8 @@ describe('LogEventCache', () => { await LogEventCache.getApexLog('/test/file.log'); // Capture the callback - let closeCallback: ((doc: { languageId: string; uri: { fsPath: string } }) => void) | null = - null; + let closeCallback: + ((doc: { languageId: string; uri: { toString: () => string } }) => void) | null = null; (workspace.onDidCloseTextDocument as jest.Mock).mockImplementationOnce((cb) => { closeCallback = cb; return { dispose: jest.fn() }; @@ -386,7 +384,7 @@ describe('LogEventCache', () => { // Simulate closing an apexlog document closeCallback!({ languageId: 'apexlog', - uri: { fsPath: '/test/file.log' }, + uri: { toString: () => '/test/file.log' }, }); // @ts-expect-error - accessing private static for testing @@ -401,8 +399,8 @@ describe('LogEventCache', () => { await LogEventCache.getApexLog('/test/file.log'); // Capture the callback - let closeCallback: ((doc: { languageId: string; uri: { fsPath: string } }) => void) | null = - null; + let closeCallback: + ((doc: { languageId: string; uri: { toString: () => string } }) => void) | null = null; (workspace.onDidCloseTextDocument as jest.Mock).mockImplementationOnce((cb) => { closeCallback = cb; return { dispose: jest.fn() }; @@ -414,7 +412,7 @@ describe('LogEventCache', () => { // Simulate closing a non-apexlog document closeCallback!({ languageId: 'javascript', - uri: { fsPath: '/test/file.log' }, + uri: { toString: () => '/test/file.log' }, }); // @ts-expect-error - accessing private static for testing diff --git a/lana/src/codelenses/ShowAnalysisCodeLens.ts b/lana/src/codelenses/ShowAnalysisCodeLens.ts index f215820fa..820a4a6b9 100644 --- a/lana/src/codelenses/ShowAnalysisCodeLens.ts +++ b/lana/src/codelenses/ShowAnalysisCodeLens.ts @@ -28,11 +28,7 @@ class ShowAnalysisCodeLens implements CodeLensProvider { } static apply(context: Context): void { - const docSelector = [ - { scheme: 'file', language: 'apexlog' }, - { scheme: 'file', pattern: '**/*.log' }, - { scheme: 'file', pattern: '**/*.txt' }, - ]; + const docSelector = [{ language: 'apexlog' }, { pattern: '**/*.log' }, { pattern: '**/*.txt' }]; const codeLensProviderDisposable = languages.registerCodeLensProvider( docSelector, diff --git a/lana/src/commands/LogView.ts b/lana/src/commands/LogView.ts index d025542fa..a1e87455c 100644 --- a/lana/src/commands/LogView.ts +++ b/lana/src/commands/LogView.ts @@ -1,16 +1,14 @@ /* * Copyright (c) 2020 Certinia Inc. All rights reserved. */ -import { createReadStream, existsSync } from 'fs'; -import { writeFile } from 'fs/promises'; -import { homedir } from 'os'; -import { basename, dirname, join, parse } from 'path'; import { Uri, commands, window as vscWindow, workspace, type WebviewPanel } from 'vscode'; +import { Utils } from 'vscode-uri'; import type { Context } from '../Context.js'; import { OpenFileInPackage } from '../display/OpenFileInPackage.js'; import { WebView } from '../display/WebView.js'; import { RawLogNavigation } from '../log-features/RawLogNavigation.js'; +import { fileOrFolderExists, readFile, writeFile } from '../services/salesforceServices.js'; import { PRIVATE_SECTIONS, getColumnOverrides, @@ -32,7 +30,7 @@ interface WebViewLogFileRequest { export class LogView { private static helpUrl = 'https://certinia.github.io/debug-log-analyzer/'; private static currentPanel: WebviewPanel | undefined; - private static currentLogPath: string | undefined; + private static currentLogUri: Uri | undefined; private static pendingNavigationTimestamp: number | undefined; static getCurrentView() { @@ -40,7 +38,11 @@ export class LogView { } static getLogPath() { - return LogView.currentLogPath; + return LogView.currentLogUri ? getLogDisplayPath(LogView.currentLogUri) : undefined; + } + + static getLogUri(): Uri | undefined { + return LogView.currentLogUri; } static setPendingNavigation(timestamp: number): void { @@ -50,22 +52,24 @@ export class LogView { static async createView( context: Context, beforeSendLog?: Promise, - logPath?: string, + logUri?: Uri, logData?: string, ): Promise { - const panel = WebView.apply('logFile', `Log: ${logPath ? basename(logPath) : 'Untitled'}`, [ - Uri.file(join(context.context.extensionPath, 'out')), - Uri.file(dirname(logPath || '')), + const logName = logUri ? Utils.basename(logUri) : 'Untitled'; + const logDir = logUri ? Utils.dirname(logUri) : context.context.extensionUri; + const panel = WebView.apply('logFile', `Log: ${logName}`, [ + Utils.joinPath(context.context.extensionUri, 'out'), + logDir, ]); this.currentPanel = panel; - this.currentLogPath = logPath; + this.currentLogUri = logUri; - const logViewerRoot = join(context.context.extensionPath, 'out'); - const index = join(logViewerRoot, 'index.html'); - const bundleUri = panel.webview.asWebviewUri(Uri.file(join(logViewerRoot, 'bundle.js'))); - const codiconUri = panel.webview.asWebviewUri(Uri.file(join(logViewerRoot, 'codicon.css'))); + const logViewerRoot = Utils.joinPath(context.context.extensionUri, 'out'); + const index = Utils.joinPath(logViewerRoot, 'index.html'); + const bundleUri = panel.webview.asWebviewUri(Utils.joinPath(logViewerRoot, 'bundle.js')); + const codiconUri = panel.webview.asWebviewUri(Utils.joinPath(logViewerRoot, 'codicon.css')); const indexSrc = await this.getFile(index); - panel.iconPath = Uri.file(join(logViewerRoot, 'certinia-icon-color.png')); + panel.iconPath = Utils.joinPath(logViewerRoot, 'certinia-icon-color.png'); panel.webview.html = indexSrc .replace(/bundle\.js/gi, bundleUri.toString(true)) .replace(/codicon\.css/gi, codiconUri.toString(true)); @@ -90,7 +94,7 @@ export class LogView { () => { configListener.dispose(); this.currentPanel = undefined; - this.currentLogPath = undefined; + this.currentLogUri = undefined; }, undefined, context.context.subscriptions, @@ -98,27 +102,31 @@ export class LogView { panel.webview.onDidReceiveMessage( async (msg: WebViewLogFileRequest) => { + if (!isWebViewLogFileRequest(msg)) { + return; + } const { cmd, requestId, payload } = msg; switch (cmd) { case 'fetchLog': { + if (!requestId) { + break; + } await beforeSendLog; - LogView.sendLog(requestId, panel, context, logPath, logData); + await LogView.sendLog(requestId, panel, context, logUri, logData); break; } case 'openPath': { - const filePath = payload as string; - if (filePath) { - context.display.showFile(filePath); + if (logUri) { + context.display.showFile(logUri); } break; } case 'openType': { - const symbol = payload as string; - if (symbol) { - await OpenFileInPackage.openFileForSymbol(context, symbol); + if (typeof payload === 'string' && payload) { + await OpenFileInPackage.openFileForSymbol(context, payload); } break; } @@ -148,8 +156,8 @@ export class LogView { } case 'updateConfig': { - const { section, value } = payload as { section: string; value: unknown }; - if (section) { + if (isConfigUpdate(payload)) { + const { section, value } = payload; if ((PRIVATE_SECTIONS as readonly string[]).includes(section)) { updatePrivateSection(context.context.globalState, section, value); } else { @@ -160,20 +168,16 @@ export class LogView { } case 'saveFile': { - const { fileContent, options } = payload as { - fileContent: string; - options: { defaultFileName?: string }; - }; - - if (fileContent && options?.defaultFileName) { + if (isSaveFileRequest(payload)) { + const { fileContent, options } = payload; const defaultWorkspace = (workspace.workspaceFolders || [])[0]; - const defaultDir = defaultWorkspace?.uri.path || homedir(); + const defaultDir = defaultWorkspace?.uri ?? context.context.extensionUri; const destinationFile = await vscWindow.showSaveDialog({ - defaultUri: Uri.file(join(defaultDir, options.defaultFileName)), + defaultUri: Utils.joinPath(defaultDir, options.defaultFileName), }); if (destinationFile) { - writeFile(destinationFile.fsPath, fileContent).catch((error) => { + writeFile(destinationFile, fileContent).catch((error) => { const msg = error instanceof Error ? error.message : String(error); vscWindow.showErrorMessage(`Unable to save file: ${msg}`); }); @@ -183,17 +187,15 @@ export class LogView { } case 'showError': { - const { text } = payload as { text: string }; - if (text) { - vscWindow.showErrorMessage(text); + if (isTextPayload(payload)) { + vscWindow.showErrorMessage(payload.text); } break; } case 'goToLogLine': { - const { timestamp } = payload as { timestamp: number }; - if (timestamp && LogView.currentLogPath) { - RawLogNavigation.goToLineByTimestamp(LogView.currentLogPath, timestamp); + if (isTimestampPayload(payload) && logUri) { + await RawLogNavigation.goToLineByTimestamp(logUri, payload.timestamp); } break; } @@ -226,36 +228,24 @@ export class LogView { return config; } - private static async getFile(filePath: string): Promise { - let data = ''; - return new Promise((resolve, reject) => { - createReadStream(filePath) - .on('error', (error) => { - reject(error); - }) - .on('data', (row) => { - data += row; - }) - .on('end', () => { - resolve(data); - }); - }); + private static async getFile(fileUri: Uri): Promise { + return readFile(fileUri); } - private static sendLog( + private static async sendLog( requestId: string, panel: WebviewPanel, context: Context, - logFilePath?: string, + logUri?: Uri, logData?: string, ) { - if (!logData && !existsSync(logFilePath || '')) { + if (!logData && logUri && !(await fileOrFolderExists(logUri))) { context.display.showErrorMessage('Log file could not be found.', { modal: true, }); + return; } - const filePath = parse(logFilePath || ''); const navigateToTimestamp = LogView.pendingNavigationTimestamp; LogView.pendingNavigationTimestamp = undefined; @@ -263,12 +253,79 @@ export class LogView { requestId, cmd: 'fetchLog', payload: { - logName: filePath.base, - logUri: logFilePath ? panel.webview.asWebviewUri(Uri.file(logFilePath)).toString(true) : '', - logPath: logFilePath, + logName: logUri ? Utils.basename(logUri) : '', + logUri: logUri ? panel.webview.asWebviewUri(logUri).toString(true) : '', + logPath: logUri ? getLogDisplayPath(logUri) : undefined, logData: logData, navigateToTimestamp, }, }); } } + +function getLogDisplayPath(logUri: Uri): string { + return ( + workspace.asRelativePath(logUri, true) || + (logUri.scheme === 'file' ? logUri.fsPath : logUri.path) + ); +} + +function isWebViewLogFileRequest(value: unknown): value is WebViewLogFileRequest { + return ( + typeof value === 'object' && + value !== null && + !Array.isArray(value) && + typeof (value as Record).cmd === 'string' && + ((value as Record).requestId === undefined || + typeof (value as Record).requestId === 'string') + ); +} + +function isConfigUpdate(value: unknown): value is { section: string; value: unknown } { + return ( + typeof value === 'object' && + value !== null && + !Array.isArray(value) && + typeof (value as Record).section === 'string' && + Boolean((value as Record).section) + ); +} + +function isSaveFileRequest( + value: unknown, +): value is { fileContent: string; options: { defaultFileName: string } } { + if (typeof value !== 'object' || value === null || Array.isArray(value)) { + return false; + } + const payload = value as Record; + const options = payload.options; + return ( + typeof payload.fileContent === 'string' && + Boolean(payload.fileContent) && + typeof options === 'object' && + options !== null && + !Array.isArray(options) && + typeof (options as Record).defaultFileName === 'string' && + Boolean((options as Record).defaultFileName) + ); +} + +function isTextPayload(value: unknown): value is { text: string } { + return ( + typeof value === 'object' && + value !== null && + !Array.isArray(value) && + typeof (value as Record).text === 'string' && + Boolean((value as Record).text) + ); +} + +function isTimestampPayload(value: unknown): value is { timestamp: number } { + return ( + typeof value === 'object' && + value !== null && + !Array.isArray(value) && + typeof (value as Record).timestamp === 'number' && + Number.isFinite((value as Record).timestamp) + ); +} diff --git a/lana/src/commands/RetrieveLogFile.ts b/lana/src/commands/RetrieveLogFile.ts index c217c026a..c7b340e68 100644 --- a/lana/src/commands/RetrieveLogFile.ts +++ b/lana/src/commands/RetrieveLogFile.ts @@ -1,22 +1,25 @@ /* * Copyright (c) 2020 Certinia Inc. All rights reserved. */ -import type { LogRecord } from '@salesforce/apex-node'; -import { existsSync } from 'fs'; -import { join, parse } from 'path'; import { + Uri, window, type QuickPick as VSCodeQuickPick, type QuickPickItem, type WebviewPanel, } from 'vscode'; +import { Utils } from 'vscode-uri'; import { appName } from '../AppSettings.js'; import type { Context } from '../Context.js'; import { Item, Options, QuickPick } from '../display/QuickPick.js'; import { QuickPickWorkspace } from '../display/QuickPickWorkspace.js'; -import { GetLogFile } from '../salesforce/logs/GetLogFile.js'; -import { GetLogFiles } from '../salesforce/logs/GetLogFiles.js'; +import { + getLogBody, + listLogs, + writeFile, + type ApexLogListItem, +} from '../services/salesforceServices.js'; import { Command } from './Command.js'; import { LogView } from './LogView.js'; @@ -54,15 +57,29 @@ export class RetrieveLogFile { } private static async command(context: Context): Promise { - const ws = await QuickPickWorkspace.pickOrReturn(context); + const workspace = await QuickPickWorkspace.pickOrReturn(context); const loadingPicker = RetrieveLogFile.showLoadingPicker(); try { - const logFiles = await GetLogFiles.apply(ws); + const logFiles = await listLogs(); const logFileId = await RetrieveLogFile.getLogFile(logFiles); if (logFileId) { - const logFilePath = this.getLogFilePath(ws, logFileId); - const writeLogFile = this.writeLogFile(ws, logFilePath); - return LogView.createView(context, writeLogFile, logFilePath); + const logUri = Utils.joinPath( + Uri.parse(workspace.uri), + '.sfdx', + 'tools', + 'debug', + 'logs', + `${logFileId}.log`, + ); + const logData = await getLogBody(logFileId); + this.assertRetrievedLog(logFileId, logData); + try { + await writeFile(logUri, logData); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : String(error); + context.display.output(`Unable to cache retrieved log: ${message}`, true); + } + return LogView.createView(context, undefined, logUri, logData); } } finally { loadingPicker.dispose(); @@ -78,7 +95,7 @@ export class RetrieveLogFile { return qp; } - private static async getLogFile(files: LogRecord[]): Promise { + private static async getLogFile(files: ApexLogListItem[]): Promise { const items = files .sort((a, b) => { const aDate = Date.parse(a.StartTime); @@ -86,8 +103,8 @@ export class RetrieveLogFile { return bDate - aDate; }) .map((r) => { - const name = `${r.LogUser.Name} - ${r.Operation}`; - const description = `${(r.LogLength / 1024).toFixed(2)} KB ${this.formatDuration(r.DurationMilliseconds)}`; + const name = `${r.LogUser?.Name ?? 'Unknown user'} - ${r.Operation ?? 'Unknown operation'}`; + const description = `${(r.LogLength / 1024).toFixed(2)} KB ${this.formatDuration(r.DurationMilliseconds ?? 0)}`; const detail = `${new Date(r.StartTime).toLocaleString()} - ${r.Status} - ${r.Id}`; return new DebugLogItem(name, description, detail, r.Id); }); @@ -145,17 +162,11 @@ export class RetrieveLogFile { return Math.round(value * precision) / precision; } - private static getLogFilePath(ws: string, fileId: string): string { - const logDirectory = join(ws, '.sfdx', 'tools', 'debug', 'logs'); - const logFilePath = join(logDirectory, `${fileId}.log`); - return logFilePath; - } - - private static async writeLogFile(ws: string, logPath: string) { - const logExists = existsSync(logPath); - if (!logExists) { - const logfilePath = parse(logPath); - await GetLogFile.apply(ws, logfilePath.dir, logfilePath.name); + private static assertRetrievedLog(logId: string, logData: string): void { + if (/^accessdenied(?:access denied)?$/i.test(logData.trim())) { + throw new Error( + `Salesforce denied access to the body of Apex log ${logId}. Verify that the authenticated user can access ApexLog records and their bodies.`, + ); } } } diff --git a/lana/src/commands/ShowInLogAnalysis.ts b/lana/src/commands/ShowInLogAnalysis.ts index 7a87a6bcf..b1a9879a6 100644 --- a/lana/src/commands/ShowInLogAnalysis.ts +++ b/lana/src/commands/ShowInLogAnalysis.ts @@ -1,7 +1,7 @@ /* * Copyright (c) 2025 Certinia Inc. All rights reserved. */ -import { window } from 'vscode'; +import { Uri, window } from 'vscode'; import type { Context } from '../Context.js'; import { Command } from './Command.js'; @@ -30,21 +30,21 @@ export class ShowInLogAnalysis { } const panel = LogView.getCurrentView(); - const logPath = LogView.getLogPath(); + const currentLogUri = LogView.getLogUri(); // If panel doesn't exist, open the log analysis view first if (!panel) { const activeEditor = window.activeTextEditor; - const logFilePath = filePath ?? activeEditor?.document.uri.fsPath; + const logUri = filePath ? Uri.parse(filePath) : activeEditor?.document.uri; - if (!logFilePath) { + if (!logUri) { context.display.showInformationMessage('No active Apex log file.'); return; } // Set pending navigation so it's sent after log is parsed LogView.setPendingNavigation(timestamp); - await LogView.createView(context, Promise.resolve(), logFilePath); + await LogView.createView(context, Promise.resolve(), logUri); return; // Navigation will happen via fetchLog payload } else { // Panel exists - reveal it first @@ -52,10 +52,14 @@ export class ShowInLogAnalysis { // Verify we're navigating to the same log const activeEditor = window.activeTextEditor; - if (logPath && activeEditor && activeEditor.document.uri.fsPath !== logPath) { + if ( + currentLogUri && + activeEditor && + activeEditor.document.uri.toString() !== currentLogUri.toString() + ) { // Different log file is active, open the active one LogView.setPendingNavigation(timestamp); - await LogView.createView(context, Promise.resolve(), activeEditor.document.uri.fsPath); + await LogView.createView(context, Promise.resolve(), activeEditor.document.uri); return; // Navigation will happen via fetchLog payload } } diff --git a/lana/src/commands/ShowLogAnalysis.ts b/lana/src/commands/ShowLogAnalysis.ts index 1f9028968..5e7344dbf 100644 --- a/lana/src/commands/ShowLogAnalysis.ts +++ b/lana/src/commands/ShowLogAnalysis.ts @@ -1,12 +1,11 @@ /* * Copyright (c) 2020 Certinia Inc. All rights reserved. */ -import { existsSync } from 'fs'; -import type { Uri } from 'vscode'; -import { window } from 'vscode'; +import { TabInputText, window, type Uri } from 'vscode'; import { appName } from '../AppSettings.js'; import type { Context } from '../Context.js'; +import { fileOrFolderExists } from '../services/salesforceServices.js'; import { Command } from './Command.js'; import { LogView } from './LogView.js'; @@ -33,12 +32,13 @@ export class ShowLogAnalysis { } private static async command(context: Context, uri: Uri): Promise { - const filePath = uri?.fsPath || window?.activeTextEditor?.document.fileName || ''; - const fileContent = !existsSync(filePath) ? window?.activeTextEditor?.document.getText() : ''; + const activeTab = window.tabGroups.activeTabGroup.activeTab; + const logUri = + uri || + window.activeTextEditor?.document.uri || + (activeTab?.input instanceof TabInputText ? activeTab.input.uri : undefined); - if (filePath || fileContent) { - LogView.createView(context, Promise.resolve(), filePath, fileContent); - } else { + if (!logUri) { context.display.showErrorMessage( 'No file selected or the file is too large. Try again using the file explorer or text editor command.', ); @@ -46,5 +46,10 @@ export class ShowLogAnalysis { 'No file selected or the file is too large. Try again using the file explorer or text editor command.', ); } + + const fileContent = (await fileOrFolderExists(logUri)) + ? undefined + : window.activeTextEditor?.document.getText(); + await LogView.createView(context, Promise.resolve(), logUri, fileContent); } } diff --git a/lana/src/commands/__tests__/LogView.test.ts b/lana/src/commands/__tests__/LogView.test.ts new file mode 100644 index 000000000..08e758d2f --- /dev/null +++ b/lana/src/commands/__tests__/LogView.test.ts @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2026 Certinia Inc. All rights reserved. + */ +import { describe, expect, it } from '@jest/globals'; + +import { createMockContext } from '../../__tests__/helpers/test-builders.js'; +import { Uri, workspace } from '../../__tests__/mocks/vscode.js'; +import { WebView } from '../../display/WebView.js'; +import { readFile } from '../../services/salesforceServices.js'; +import { LogView } from '../LogView.js'; + +jest.mock('../../display/WebView.js', () => ({ + WebView: { apply: jest.fn() }, +})); +jest.mock('../../services/salesforceServices.js', () => ({ + fileOrFolderExists: jest.fn(), + readFile: jest.fn(), + writeFile: jest.fn(), +})); +jest.mock('../../workspace/AppConfig.js', () => ({ + PRIVATE_SECTIONS: [], + getColumnOverrides: jest.fn(() => ({})), + getColumnViews: jest.fn(() => ({})), + getConfig: jest.fn(() => ({ + timeline: {}, + callTree: { columnOverrides: {} }, + database: { + soql: { columnView: 'General', columnOverrides: {} }, + dml: { columnView: 'General', columnOverrides: {} }, + sosl: { columnView: 'General', columnOverrides: {} }, + }, + inspector: {}, + })), + getInspectorState: jest.fn(() => ({})), + sameConfig: jest.fn(() => true), + updateConfig: jest.fn(), + updatePrivateSection: jest.fn(), +})); + +const mockApplyWebView = WebView.apply as jest.Mock; +const mockReadFile = readFile as jest.Mock; + +describe('LogView', () => { + it('uses a display path in the payload and the captured URI for open actions', async () => { + let receiveMessage: ((message: unknown) => Promise) | undefined; + const postMessage = jest.fn().mockResolvedValue(true); + const panel = { + iconPath: undefined, + onDidDispose: jest.fn(() => ({ dispose: jest.fn() })), + reveal: jest.fn(), + webview: { + asWebviewUri: jest.fn((uri: { path: string }) => Uri.parse(`webview:${uri.path}`)), + html: '', + onDidReceiveMessage: jest.fn((listener: (message: unknown) => Promise) => { + receiveMessage = listener; + return { dispose: jest.fn() }; + }), + postMessage, + }, + }; + mockApplyWebView.mockReturnValue(panel as unknown as import('vscode').WebviewPanel); + mockReadFile.mockResolvedValue(''); + workspace.asRelativePath.mockReturnValue('workspace/logs/virtual.log'); + const context = createMockContext(); + const logUri = Uri.parse('memfs:/repository/logs/virtual.log'); + + await LogView.createView( + context as unknown as import('../../Context.js').Context, + Promise.resolve(), + logUri, + 'log body', + ); + await receiveMessage?.({ cmd: 'fetchLog', requestId: 'request-1' }); + + expect(postMessage).toHaveBeenCalledWith({ + requestId: 'request-1', + cmd: 'fetchLog', + payload: { + logName: 'virtual.log', + logUri: 'webview:/repository/logs/virtual.log', + logPath: 'workspace/logs/virtual.log', + logData: 'log body', + navigateToTimestamp: undefined, + }, + }); + + await receiveMessage?.({ cmd: 'openPath', payload: 'file:///untrusted.log' }); + + expect(context.display.showFile).toHaveBeenCalledWith(logUri); + }); +}); diff --git a/lana/src/commands/__tests__/RetrieveLogFile.test.ts b/lana/src/commands/__tests__/RetrieveLogFile.test.ts index 49f68992b..3d9cc62f1 100644 --- a/lana/src/commands/__tests__/RetrieveLogFile.test.ts +++ b/lana/src/commands/__tests__/RetrieveLogFile.test.ts @@ -1,53 +1,27 @@ /* * Copyright (c) 2026 Certinia Inc. All rights reserved. */ - -/** - * Tests for RetrieveLogFile command, focusing on the private formatDuration method. - * Since formatDuration is private, we test it indirectly through its usage in getLogFile. - */ import { beforeEach, describe, expect, it } from '@jest/globals'; - -import { window } from 'vscode'; - +import { commands, window } from 'vscode'; import { createMockContext } from '../../__tests__/helpers/test-builders.js'; +import { QuickPick } from '../../display/QuickPick.js'; +import { QuickPickWorkspace } from '../../display/QuickPickWorkspace.js'; +import { getLogBody, listLogs, writeFile } from '../../services/salesforceServices.js'; +import { LogView } from '../LogView.js'; import { RetrieveLogFile } from '../RetrieveLogFile.js'; -// Mock dependencies jest.mock('../../display/QuickPickWorkspace.js', () => ({ - QuickPickWorkspace: { - pickOrReturn: jest.fn(), - }, -})); - -jest.mock('../../salesforce/logs/GetLogFiles.js', () => ({ - GetLogFiles: { - apply: jest.fn(), - }, + QuickPickWorkspace: { pickOrReturn: jest.fn() }, })); - -jest.mock('../../salesforce/logs/GetLogFile.js', () => ({ - GetLogFile: { - apply: jest.fn(), - }, -})); - -jest.mock('../LogView.js', () => ({ - LogView: { - createView: jest.fn(), - }, -})); - jest.mock('../../display/QuickPick.js', () => ({ - QuickPick: { - pick: jest.fn(), - }, + QuickPick: { pick: jest.fn() }, Item: class { name: string; desc: string; details: string; sticky: boolean; selected: boolean; + constructor(name: string, desc: string, details: string, sticky: boolean, selected: boolean) { this.name = name; this.desc = desc; @@ -58,702 +32,148 @@ jest.mock('../../display/QuickPick.js', () => ({ }, Options: class { placeholder: string; + constructor(placeholder: string) { this.placeholder = placeholder; } }, })); - -jest.mock('fs', () => ({ - existsSync: jest.fn(), +jest.mock('../../services/salesforceServices.js', () => ({ + getLogBody: jest.fn(), + listLogs: jest.fn(), + writeFile: jest.fn(), })); +jest.mock('../LogView.js', () => ({ LogView: { createView: jest.fn() } })); -import { existsSync } from 'fs'; -import { commands } from 'vscode'; - -import { QuickPick } from '../../display/QuickPick.js'; -import { QuickPickWorkspace } from '../../display/QuickPickWorkspace.js'; -import { GetLogFile } from '../../salesforce/logs/GetLogFile.js'; -import { GetLogFiles } from '../../salesforce/logs/GetLogFiles.js'; -import { LogView } from '../LogView.js'; - -const mockPickOrReturn = QuickPickWorkspace.pickOrReturn as jest.Mock; -const mockGetLogFiles = GetLogFiles.apply as jest.Mock; -const mockGetLogFile = GetLogFile.apply as jest.Mock; -const mockQuickPickPick = QuickPick.pick as jest.Mock; -const mockExistsSync = existsSync as jest.Mock; +const mockPickWorkspace = QuickPickWorkspace.pickOrReturn as jest.Mock; +const mockPick = QuickPick.pick as jest.Mock; +const mockListLogs = listLogs as jest.Mock; +const mockGetLogBody = getLogBody as jest.Mock; +const mockWriteFile = writeFile as jest.Mock; const mockCreateView = LogView.createView as jest.Mock; const mockRegisterCommand = commands.registerCommand as jest.Mock; +const log = (id: string, startTime = '2024-01-01T00:00:00.000Z', durationMilliseconds = 100) => ({ + Id: id, + LogUser: { Name: 'User' }, + Operation: 'Op', + LogLength: 1024, + DurationMilliseconds: durationMilliseconds, + StartTime: startTime, + Status: 'Success', +}); + describe('RetrieveLogFile', () => { beforeEach(() => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([]); - mockQuickPickPick.mockResolvedValue([]); - mockExistsSync.mockReturnValue(false); + jest.clearAllMocks(); + mockPickWorkspace.mockResolvedValue({ uri: 'file:///test/workspace' }); + mockListLogs.mockResolvedValue([]); + mockPick.mockResolvedValue([]); + mockGetLogBody.mockResolvedValue('log body'); + mockWriteFile.mockResolvedValue(undefined); (window.createQuickPick as jest.Mock).mockReturnValue({ - items: [], busy: false, enabled: true, placeholder: '', show: jest.fn(), - hide: jest.fn(), dispose: jest.fn(), }); }); - describe('apply', () => { - it('should register command with context', () => { - const mockContext = createMockContext(); - - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - expect(mockContext.context.subscriptions.length).toBe(1); - }); + const command = (): (() => Promise) => + mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]?.[1]; - it('should output registration message', () => { - const mockContext = createMockContext(); - - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - expect(mockContext.display.output).toHaveBeenCalledWith( - "Registered command 'Lana: Retrieve Log'", - ); - }); + it('registers the command', () => { + const context = createMockContext(); + RetrieveLogFile.apply(context as unknown as import('../../Context.js').Context); + expect(context.context.subscriptions).toHaveLength(1); }); - describe('error handling', () => { - it('should register command even when errors occur during execution', () => { - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - // The error handling is tested by verifying the command is registered - expect(mockContext.context.subscriptions.length).toBe(1); - }); + it('lists logs through Salesforce Services', async () => { + const context = createMockContext(); + RetrieveLogFile.apply(context as unknown as import('../../Context.js').Context); + await command()(); + expect(mockListLogs).toHaveBeenCalledWith(); }); - describe('command execution flow', () => { - /** - * Helper to get the registered command callback. - * The Command class stores callbacks via commands.registerCommand. - */ - const getCommandCallback = (): (() => Promise) => { - // Get the most recent call's callback (second argument) - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - return lastCall[1]; - }; - - it('should call QuickPickWorkspace.pickOrReturn first', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([]); - mockQuickPickPick.mockResolvedValue([]); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const commandCallback = getCommandCallback(); - await commandCallback(); - - expect(mockPickOrReturn).toHaveBeenCalled(); - }); - - it('should call GetLogFiles.apply with workspace path', async () => { - mockPickOrReturn.mockResolvedValue('/my/workspace'); - mockGetLogFiles.mockResolvedValue([]); - mockQuickPickPick.mockResolvedValue([]); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const commandCallback = getCommandCallback(); - await commandCallback(); - - expect(mockGetLogFiles).toHaveBeenCalledWith('/my/workspace'); - }); - - it('should return undefined when no log is selected', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'log1', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - // Return empty array (user cancelled) - mockQuickPickPick.mockResolvedValue([]); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const commandCallback = getCommandCallback(); - const result = await commandCallback(); - - expect(result).toBeUndefined(); - expect(mockCreateView).not.toHaveBeenCalled(); - }); - - it('should create view when log is selected', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'selected-log-id', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - // Return selected item with logId - mockQuickPickPick.mockResolvedValue([{ logId: 'selected-log-id' }]); - mockExistsSync.mockReturnValue(false); - mockGetLogFile.mockResolvedValue(undefined); - mockCreateView.mockResolvedValue({ panel: 'mock' }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const commandCallback = getCommandCallback(); - await commandCallback(); - - expect(mockCreateView).toHaveBeenCalled(); - const createViewCall = mockCreateView.mock.calls[0]; - expect(createViewCall[2]).toContain('selected-log-id.log'); - }); - - it('should skip download when log file already exists', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'existing-log', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - mockQuickPickPick.mockResolvedValue([{ logId: 'existing-log' }]); - // File already exists - mockExistsSync.mockReturnValue(true); - mockCreateView.mockResolvedValue({ panel: 'mock' }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const commandCallback = getCommandCallback(); - await commandCallback(); - - // GetLogFile should NOT be called since file exists - expect(mockGetLogFile).not.toHaveBeenCalled(); - expect(mockCreateView).toHaveBeenCalled(); - }); - - it('should download log file when it does not exist', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'new-log', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - mockQuickPickPick.mockResolvedValue([{ logId: 'new-log' }]); - // File does not exist - mockExistsSync.mockReturnValue(false); - mockGetLogFile.mockResolvedValue(undefined); - mockCreateView.mockResolvedValue({ panel: 'mock' }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const commandCallback = getCommandCallback(); - await commandCallback(); - - // GetLogFile SHOULD be called since file doesn't exist - expect(mockGetLogFile).toHaveBeenCalledWith( - '/test/workspace', - expect.stringContaining('.sfdx/tools/debug/logs'), - 'new-log', - ); - }); + it('retrieves the selected body and opens it without requiring a local file', async () => { + mockListLogs.mockResolvedValue([log('selected-log')]); + mockPick.mockResolvedValue([{ logId: 'selected-log' }]); + const context = createMockContext(); + RetrieveLogFile.apply(context as unknown as import('../../Context.js').Context); + await command()(); + + expect(mockGetLogBody).toHaveBeenCalledWith('selected-log'); + expect(mockWriteFile).toHaveBeenCalledWith( + expect.objectContaining({ path: expect.stringContaining('selected-log.log') }), + 'log body', + ); + expect(mockCreateView).toHaveBeenCalledWith( + context, + undefined, + expect.objectContaining({ path: expect.stringContaining('selected-log.log') }), + 'log body', + ); }); - describe('formatDuration via getLogFile', () => { - /** - * Tests for the private formatDuration method, tested indirectly through getLogFile. - * formatDuration converts milliseconds to human-readable strings. - */ - - const createLogWithDuration = (durationMs: number) => ({ - Id: 'test-log', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: durationMs, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }); - - const getCapturedDescription = async (durationMs: number): Promise => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([createLogWithDuration(durationMs)]); - - let capturedDesc = ''; - mockQuickPickPick.mockImplementation((items: Array<{ desc: string }>) => { - capturedDesc = items[0]?.desc || ''; - return Promise.resolve([]); - }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - return capturedDesc; - }; - - it('should format 0 ms as "0 ms"', async () => { - const desc = await getCapturedDescription(0); - expect(desc).toContain('0 ms'); - }); - - it('should format values < 10 ms with 2 decimal precision', async () => { - const desc = await getCapturedDescription(5.123); - // _round(5.123, 100) = 5.12 - expect(desc).toContain('5.12 ms'); - }); - - it('should format values 10-99 ms with 1 decimal precision', async () => { - const desc = await getCapturedDescription(45.67); - // _round(45.67, 10) = 45.7 - expect(desc).toContain('45.7 ms'); - }); - - it('should format values >= 100 ms with no decimal precision', async () => { - const desc = await getCapturedDescription(789.4); - // _round(789.4, 1) = 789 - expect(desc).toContain('789 ms'); - }); - - it('should format 1-9.99 seconds with 2 decimal precision', async () => { - const desc = await getCapturedDescription(1234); - // 1.234s, _round(1.234, 100) = 1.23 - expect(desc).toContain('1.23 s'); - }); - - it('should format 10-59.99 seconds with 1 decimal precision', async () => { - const desc = await getCapturedDescription(45678); - // 45.678s, _round(45.678, 10) = 45.7 - expect(desc).toContain('45.7 s'); - }); - - it('should format exact minutes without seconds', async () => { - const desc = await getCapturedDescription(120000); - // 120s = 2m exactly - expect(desc).toContain('2m'); - expect(desc).not.toContain('2m '); - }); - - it('should format minutes with whole seconds', async () => { - const desc = await getCapturedDescription(150000); - // 150s = 2m 30s - expect(desc).toContain('2m 30s'); - }); - - it('should format minutes with fractional seconds', async () => { - const desc = await getCapturedDescription(125500); - // 125.5s = 2m 5.5s - expect(desc).toContain('2m 5.5s'); - }); - - it('should format large durations in minutes', async () => { - const desc = await getCapturedDescription(300000); - // 300s = 5m exactly - expect(desc).toContain('5m'); - }); - - it('should format undefined/falsy duration as "0 ms"', async () => { - // Test with undefined cast to number (becomes NaN which is falsy) - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'test-log', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: undefined as unknown as number, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - - let capturedDesc = ''; - mockQuickPickPick.mockImplementation((items: Array<{ desc: string }>) => { - capturedDesc = items[0]?.desc || ''; - return Promise.resolve([]); - }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - expect(capturedDesc).toContain('0 ms'); - }); - }); - - describe('getLogFile behavior', () => { - it('should sort logs newest first', async () => { - const logs = [ - { - Id: 'oldest', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - { - Id: 'newest', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-03T00:00:00.000Z', - Status: 'Success', - }, - { - Id: 'middle', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-02T00:00:00.000Z', - Status: 'Success', - }, - ]; - - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue(logs); - - // Capture the items passed to QuickPick - let capturedItems: Array<{ logId: string }> = []; - mockQuickPickPick.mockImplementation((items) => { - capturedItems = items; - return Promise.resolve([]); - }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - // Verify items are sorted newest first - expect(capturedItems).toHaveLength(3); - expect(capturedItems[0]?.logId).toBe('newest'); - expect(capturedItems[1]?.logId).toBe('middle'); - expect(capturedItems[2]?.logId).toBe('oldest'); - }); - - it('should format log item name as "User - Operation"', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'log1', - LogUser: { Name: 'John Doe' }, - Operation: '/apex/MyController', - LogLength: 2048, - DurationMilliseconds: 500, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - - let capturedItems: Array<{ name: string }> = []; - mockQuickPickPick.mockImplementation((items) => { - capturedItems = items; - return Promise.resolve([]); - }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - expect(capturedItems).toHaveLength(1); - expect(capturedItems[0]?.name).toBe('John Doe - /apex/MyController'); - }); - - it('should format log item description with size in KB and duration', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'log1', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 5120, // 5 KB - DurationMilliseconds: 1500, // 1.5s - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - - let capturedItems: Array<{ desc: string }> = []; - mockQuickPickPick.mockImplementation((items) => { - capturedItems = items; - return Promise.resolve([]); - }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - expect(capturedItems).toHaveLength(1); - expect(capturedItems[0]?.desc).toContain('5.00 KB'); - expect(capturedItems[0]?.desc).toContain('1.5 s'); - }); - - it('should format log item detail with date, status, and ID', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'ABC123XYZ', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-06-15T10:30:00.000Z', - Status: 'Success', - }, - ]); - - let capturedItems: Array<{ details: string }> = []; - mockQuickPickPick.mockImplementation((items) => { - capturedItems = items; - return Promise.resolve([]); - }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - expect(capturedItems).toHaveLength(1); - expect(capturedItems[0]?.details).toContain('Success'); - expect(capturedItems[0]?.details).toContain('ABC123XYZ'); - }); - - it('should return null when QuickPick returns empty array', async () => { - mockPickOrReturn.mockResolvedValue('/test/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'log1', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - mockQuickPickPick.mockResolvedValue([]); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - const result = await lastCall[1](); - - expect(result).toBeUndefined(); - expect(mockCreateView).not.toHaveBeenCalled(); - }); + it('still opens a retrieved log when cache writing fails', async () => { + mockListLogs.mockResolvedValue([log('selected-log')]); + mockPick.mockResolvedValue([{ logId: 'selected-log' }]); + mockWriteFile.mockRejectedValue(new Error('read-only workspace')); + const context = createMockContext(); + RetrieveLogFile.apply(context as unknown as import('../../Context.js').Context); + await command()(); + expect(mockCreateView).toHaveBeenCalled(); }); - describe('safeCommand error handling', () => { - it('should catch Error and display error message', async () => { - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - // Setup rejection using implementation - mockPickOrReturn.mockImplementationOnce(() => - Promise.reject(new Error('Test error message')), - ); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - expect(mockContext.display.showErrorMessage).toHaveBeenCalledWith( - 'Error loading logfile: Test error message', - ); - }); - - it('should convert non-Error to string in error message', async () => { - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - // Setup rejection using implementation - throw a non-Error value - mockPickOrReturn.mockImplementationOnce(() => Promise.reject('String error')); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - expect(mockContext.display.showErrorMessage).toHaveBeenCalledWith( - 'Error loading logfile: String error', - ); - }); - - it('should return undefined on error (not reject)', async () => { - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - // Setup rejection using implementation - mockPickOrReturn.mockImplementationOnce(() => Promise.reject(new Error('Some error'))); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - const result = await lastCall[1](); - - // Should resolve (not reject) with undefined - expect(result).toBeUndefined(); - }); + it('sorts logs newest first before presenting them', async () => { + mockListLogs.mockResolvedValue([ + log('old', '2024-01-01T00:00:00.000Z'), + log('new', '2024-01-03T00:00:00.000Z'), + ]); + let items: Array<{ logId: string }> = []; + mockPick.mockImplementation((picked) => { + items = picked; + return Promise.resolve([]); + }); + const context = createMockContext(); + RetrieveLogFile.apply(context as unknown as import('../../Context.js').Context); + await command()(); + expect(items.map((item) => item.logId)).toEqual(['new', 'old']); }); - describe('getLogFilePath', () => { - it('should construct path with .sfdx/tools/debug/logs directory', async () => { - mockPickOrReturn.mockResolvedValue('/my/project'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'test-log-123', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - mockQuickPickPick.mockResolvedValue([{ logId: 'test-log-123' }]); - mockExistsSync.mockReturnValue(true); - mockCreateView.mockResolvedValue({ panel: 'mock' }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - // Verify the path passed to createView - const createViewCall = mockCreateView.mock.calls[0]; - const logFilePath = createViewCall[2]; - - expect(logFilePath).toBe('/my/project/.sfdx/tools/debug/logs/test-log-123.log'); - }); - - it('should append .log extension to fileId', async () => { - mockPickOrReturn.mockResolvedValue('/workspace'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'myLogId', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - mockQuickPickPick.mockResolvedValue([{ logId: 'myLogId' }]); - mockExistsSync.mockReturnValue(true); - mockCreateView.mockResolvedValue({ panel: 'mock' }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - const createViewCall = mockCreateView.mock.calls[0]; - const logFilePath = createViewCall[2]; - - expect(logFilePath).toContain('myLogId.log'); - }); + it.each([ + [0, '0 ms'], + [5.123, '5.12 ms'], + [45.67, '45.7 ms'], + [789.4, '789 ms'], + [1234, '1.23 s'], + [45678, '45.7 s'], + [120000, '2m'], + [150000, '2m 30s'], + [125500, '2m 5.5s'], + ])('formats %s milliseconds as %s', async (durationMilliseconds, expectedDuration) => { + mockListLogs.mockResolvedValue([log('duration', undefined, durationMilliseconds)]); + let description = ''; + mockPick.mockImplementation((items) => { + description = items[0]?.desc ?? ''; + return Promise.resolve([]); + }); + const context = createMockContext(); + RetrieveLogFile.apply(context as unknown as import('../../Context.js').Context); + await command()(); + expect(description).toContain(expectedDuration); }); - describe('writeLogFile', () => { - it('should call GetLogFile.apply when file does not exist', async () => { - mockPickOrReturn.mockResolvedValue('/test/ws'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'download-me', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - mockQuickPickPick.mockResolvedValue([{ logId: 'download-me' }]); - mockExistsSync.mockReturnValue(false); - mockGetLogFile.mockResolvedValue(undefined); - mockCreateView.mockResolvedValue({ panel: 'mock' }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - expect(mockGetLogFile).toHaveBeenCalledWith( - '/test/ws', - '/test/ws/.sfdx/tools/debug/logs', - 'download-me', - ); - }); - - it('should NOT call GetLogFile.apply when file exists', async () => { - mockPickOrReturn.mockResolvedValue('/test/ws'); - mockGetLogFiles.mockResolvedValue([ - { - Id: 'already-exists', - LogUser: { Name: 'User' }, - Operation: 'Op', - LogLength: 1024, - DurationMilliseconds: 100, - StartTime: '2024-01-01T00:00:00.000Z', - Status: 'Success', - }, - ]); - mockQuickPickPick.mockResolvedValue([{ logId: 'already-exists' }]); - mockExistsSync.mockReturnValue(true); - mockCreateView.mockResolvedValue({ panel: 'mock' }); - - const mockContext = createMockContext(); - RetrieveLogFile.apply(mockContext as unknown as import('../../Context.js').Context); - - const lastCall = mockRegisterCommand.mock.calls[mockRegisterCommand.mock.calls.length - 1]; - await lastCall[1](); - - expect(mockGetLogFile).not.toHaveBeenCalled(); - }); + it('reports an access-denied log response', async () => { + mockListLogs.mockResolvedValue([log('denied')]); + mockPick.mockResolvedValue([{ logId: 'denied' }]); + mockGetLogBody.mockResolvedValue('AccessDenied'); + const context = createMockContext(); + RetrieveLogFile.apply(context as unknown as import('../../Context.js').Context); + await command()(); + expect(context.display.showErrorMessage).toHaveBeenCalledWith( + expect.stringContaining('Salesforce denied access'), + ); }); }); diff --git a/lana/src/decorations/RawLogLineDecoration.ts b/lana/src/decorations/RawLogLineDecoration.ts index daf8d264a..5a9048840 100644 --- a/lana/src/decorations/RawLogLineDecoration.ts +++ b/lana/src/decorations/RawLogLineDecoration.ts @@ -88,7 +88,7 @@ export class RawLogLineDecoration { } const timestamp = parseInt(match[1], 10); - const filePath = document.uri.fsPath; + const filePath = document.uri.toString(); const apexLog = await LogEventCache.getApexLog(filePath); if (!apexLog) { diff --git a/lana/src/display/Display.ts b/lana/src/display/Display.ts index 3a33b33d0..fe1c50fab 100644 --- a/lana/src/display/Display.ts +++ b/lana/src/display/Display.ts @@ -23,7 +23,7 @@ export class Display { window.showErrorMessage(s, options); } - showFile(path: string, options: TextDocumentShowOptions = {}): void { - commands.executeCommand('vscode.open', Uri.file(path.trim()), options); + showFile(uri: Uri | string, options: TextDocumentShowOptions = {}): void { + commands.executeCommand('vscode.open', typeof uri === 'string' ? Uri.parse(uri) : uri, options); } } diff --git a/lana/src/display/OpenFileInPackage.ts b/lana/src/display/OpenFileInPackage.ts index ab8f6ce48..482ee7479 100644 --- a/lana/src/display/OpenFileInPackage.ts +++ b/lana/src/display/OpenFileInPackage.ts @@ -1,8 +1,8 @@ /* * Copyright (c) 2020 Certinia Inc. All rights reserved. */ -import { basename } from 'path'; import { Position, Selection, ViewColumn, workspace, type TextDocumentShowOptions } from 'vscode'; +import { Utils } from 'vscode-uri'; import type { Context } from '../Context.js'; import { getMethodLine, parseApex } from '../salesforce/ApexParser/ApexSymbolLocator.js'; @@ -31,7 +31,7 @@ export class OpenFileInPackage { if (!symbolLocation.isExactMatch) { context.display.showErrorMessage( - `Symbol '${symbolLocation.missingSymbol}' could not be found in file '${basename(uri.fsPath)}'`, + `Symbol '${symbolLocation.missingSymbol}' could not be found in file '${Utils.basename(uri)}'`, ); } const zeroIndexedLineNumber = symbolLocation.line - 1; @@ -44,7 +44,7 @@ export class OpenFileInPackage { selection: new Selection(pos, pos), }; - context.display.showFile(uri.fsPath, options); + context.display.showFile(uri, options); } catch (err) { const message = err instanceof Error ? err.message : String(err); context.display.showErrorMessage(`Unable to open '${symbolName}': ${message}`); diff --git a/lana/src/display/QuickPickWorkspace.ts b/lana/src/display/QuickPickWorkspace.ts index 0f81f10c6..16763b750 100644 --- a/lana/src/display/QuickPickWorkspace.ts +++ b/lana/src/display/QuickPickWorkspace.ts @@ -1,32 +1,47 @@ /* * Copyright (c) 2020 Certinia Inc. All rights reserved. */ -import { parse } from 'path'; import { window } from 'vscode'; +import { Utils } from 'vscode-uri'; import type { Context } from '../Context.js'; +import { VSWorkspace } from '../workspace/VSWorkspace.js'; import { Item, Options, QuickPick } from './QuickPick.js'; export class QuickPickWorkspace { - static async pickOrReturn(context: Context): Promise { + static async pickOrReturn(context: Context): Promise { const workspaceFolders = context.workspaceManager.workspaceFolders; if (workspaceFolders.length > 1) { const [workspace] = await QuickPick.pick( - workspaceFolders.map((ws) => new Item(ws.name(), ws.path(), '')), + workspaceFolders.map((ws) => new Item(ws.name(), ws.uri, '')), new Options('Select a workspace:'), ); if (workspace) { - return workspace.description; + const selectedWorkspace = workspaceFolders.find((ws) => ws.uri === workspace.description); + if (!selectedWorkspace) { + throw new Error('Selected workspace not found'); + } + return selectedWorkspace; } else { throw new Error('No workspace selected'); } } else if (workspaceFolders.length === 1) { - return workspaceFolders[0]?.path() || ''; + const selectedWorkspace = workspaceFolders[0]; + if (!selectedWorkspace) { + throw new Error('No workspace available'); + } + return selectedWorkspace; } else { if (window.activeTextEditor) { - return parse(window.activeTextEditor.document.fileName).dir; + const documentUri = window.activeTextEditor.document.uri; + const folderUri = Utils.dirname(documentUri); + return new VSWorkspace({ + uri: folderUri, + name: Utils.basename(folderUri), + index: 0, + }); } else { throw new Error('No workspace selected'); } diff --git a/lana/src/display/__tests__/OpenFileInPackage.test.ts b/lana/src/display/__tests__/OpenFileInPackage.test.ts index d76f6ec3a..6a0aa871e 100644 --- a/lana/src/display/__tests__/OpenFileInPackage.test.ts +++ b/lana/src/display/__tests__/OpenFileInPackage.test.ts @@ -81,7 +81,7 @@ describe('OpenFileInPackage.openFileForSymbol', () => { const { context, workspaceManager, display } = createContext(); workspaceManager.findSymbol.mockResolvedValue({ status: 'found', - uri: { fsPath: '/ws/force-app/MyClass.cls' }, + uri: { path: '/ws/force-app/MyClass.cls', fsPath: '/ws/force-app/MyClass.cls' }, }); mockGetMethodLine.mockReturnValue({ line: 12, character: 4, isExactMatch: true }); @@ -93,8 +93,8 @@ describe('OpenFileInPackage.openFileForSymbol', () => { ); expect(display.showErrorMessage).not.toHaveBeenCalled(); expect(display.showFile).toHaveBeenCalledTimes(1); - const [path, options] = display.showFile.mock.calls[0]; - expect(path).toBe('/ws/force-app/MyClass.cls'); + const [uri, options] = display.showFile.mock.calls[0]; + expect(uri).toEqual(expect.objectContaining({ fsPath: '/ws/force-app/MyClass.cls' })); // line is converted to zero-indexed; character used as-is expect(options.selection.start).toEqual(expect.objectContaining({ line: 11, character: 4 })); expect(options.viewColumn).toBe(-1); @@ -104,7 +104,7 @@ describe('OpenFileInPackage.openFileForSymbol', () => { const { context, workspaceManager, display } = createContext(); workspaceManager.findSymbol.mockResolvedValue({ status: 'found', - uri: { fsPath: '/ws/MyClass.cls' }, + uri: { path: '/ws/MyClass.cls', fsPath: '/ws/MyClass.cls' }, }); mockGetMethodLine.mockReturnValue({ line: 3, isExactMatch: true }); @@ -118,7 +118,7 @@ describe('OpenFileInPackage.openFileForSymbol', () => { const { context, workspaceManager, display } = createContext(); workspaceManager.findSymbol.mockResolvedValue({ status: 'found', - uri: { fsPath: '/ws/force-app/MyClass.cls' }, + uri: { path: '/ws/force-app/MyClass.cls', fsPath: '/ws/force-app/MyClass.cls' }, }); mockGetMethodLine.mockReturnValue({ line: 1, diff --git a/lana/src/folding/RawLogFoldingProvider.ts b/lana/src/folding/RawLogFoldingProvider.ts index a2998675c..e69ac74e6 100644 --- a/lana/src/folding/RawLogFoldingProvider.ts +++ b/lana/src/folding/RawLogFoldingProvider.ts @@ -28,8 +28,7 @@ class RawLogFoldingProvider implements FoldingRangeProvider { document: TextDocument, _context: FoldingContext, ): Promise { - const filePath = document.uri.fsPath; - const apexLog = await LogEventCache.getApexLog(filePath); + const apexLog = await LogEventCache.getApexLog(document.uri.toString()); if (!apexLog) { return []; @@ -87,11 +86,11 @@ class RawLogFoldingProvider implements FoldingRangeProvider { * unrelated action forces a re-evaluation. */ private warmAndSignal(document: TextDocument): void { - if (document.uri.scheme !== 'file' || !isApexLogContent(document)) { + if (!isApexLogContent(document)) { return; } - void LogEventCache.getApexLog(document.uri.fsPath).then((apexLog) => { + void LogEventCache.getApexLog(document.uri.toString()).then((apexLog) => { if (apexLog) { this.changeEmitter.fire(); } @@ -99,7 +98,7 @@ class RawLogFoldingProvider implements FoldingRangeProvider { } static apply(context: Context): void { - const docSelector = [{ scheme: 'file', language: 'apexlog' }]; + const docSelector = [{ language: 'apexlog' }]; const provider = new RawLogFoldingProvider(); context.context.subscriptions.push( diff --git a/lana/src/folding/__tests__/RawLogFoldingProvider.test.ts b/lana/src/folding/__tests__/RawLogFoldingProvider.test.ts index 6012b0c89..610daef18 100644 --- a/lana/src/folding/__tests__/RawLogFoldingProvider.test.ts +++ b/lana/src/folding/__tests__/RawLogFoldingProvider.test.ts @@ -312,7 +312,7 @@ describe('RawLogFoldingProvider', () => { expect(languages.registerFoldingRangeProvider).toHaveBeenCalledTimes(1); expect(languages.registerFoldingRangeProvider).toHaveBeenCalledWith( - [{ scheme: 'file', language: 'apexlog' }], + [{ language: 'apexlog' }], expect.any(RawLogFoldingProvider), ); }); @@ -354,7 +354,7 @@ describe('RawLogFoldingProvider', () => { return { registeredProvider, openHandler, activeEditorHandler }; } - const flush = () => new Promise((resolve) => setImmediate(resolve)); + const flush = () => new Promise((resolve) => queueMicrotask(resolve)); it('warms the cache and fires onDidChangeFoldingRanges when an apex log opens', async () => { const { registeredProvider, openHandler } = applyAndCapture(); @@ -366,7 +366,7 @@ describe('RawLogFoldingProvider', () => { openHandler(doc); await flush(); - expect(mockGetApexLog).toHaveBeenCalledWith('/test/file.log'); + expect(mockGetApexLog).toHaveBeenCalledWith('file:///test/file.log'); expect(fired).toHaveBeenCalledTimes(1); }); @@ -380,7 +380,7 @@ describe('RawLogFoldingProvider', () => { activeEditorHandler({ document: doc }); await flush(); - expect(mockGetApexLog).toHaveBeenCalledWith('/test/file.log'); + expect(mockGetApexLog).toHaveBeenCalledWith('file:///test/file.log'); expect(fired).toHaveBeenCalledTimes(1); }); @@ -407,7 +407,7 @@ describe('RawLogFoldingProvider', () => { openHandler(doc); await flush(); - expect(mockGetApexLog).toHaveBeenCalledWith('/test/file.log'); + expect(mockGetApexLog).toHaveBeenCalledWith('file:///test/file.log'); expect(fired).not.toHaveBeenCalled(); }); }); diff --git a/lana/src/hovers/RawLogHoverProvider.ts b/lana/src/hovers/RawLogHoverProvider.ts index 8403eb510..0cd1b8dad 100644 --- a/lana/src/hovers/RawLogHoverProvider.ts +++ b/lana/src/hovers/RawLogHoverProvider.ts @@ -25,7 +25,7 @@ class RawLogHoverProvider implements HoverProvider { } const timestamp = parseInt(match[1], 10); - return this.buildHover(document.uri.fsPath, timestamp); + return this.buildHover(document.uri.toString(), timestamp); } private async buildHover(filePath: string, timestamp: number): Promise { @@ -51,7 +51,7 @@ class RawLogHoverProvider implements HoverProvider { } static apply(context: Context): void { - const docSelector = [{ scheme: 'file', language: 'apexlog' }]; + const docSelector = [{ language: 'apexlog' }]; const hoverProviderDisposable = languages.registerHoverProvider( docSelector, diff --git a/lana/src/language/ApexLogLanguageDetector.ts b/lana/src/language/ApexLogLanguageDetector.ts index b9a021172..f79cf4e92 100644 --- a/lana/src/language/ApexLogLanguageDetector.ts +++ b/lana/src/language/ApexLogLanguageDetector.ts @@ -1,9 +1,6 @@ /* * Copyright (c) 2026 Certinia Inc. All rights reserved. */ -import { closeSync, openSync, readSync } from 'node:fs'; -import { extname } from 'node:path'; - import { TabInputText, commands, @@ -13,6 +10,7 @@ import { type TextDocument, type Uri, } from 'vscode'; +import { Utils } from 'vscode-uri'; import type { Context } from '../Context.js'; @@ -21,6 +19,8 @@ const EXECUTION_STARTED = /^\d{2}:\d{2}:\d{2}\.\d{1,} \(\d+\)\|EXECUTION_STARTED const USER_INFO = /^\d{2}:\d{2}:\d{2}\.\d{1,} \(\d+\)\|USER_INFO\|/; const DETECT_EXTENSIONS = new Set(['.log', '.txt']); const MAX_LINES_TO_CHECK = 100; +const MAX_BYTES_TO_READ = 4096; +let contextUpdateGeneration = 0; export function isApexLogContent(doc: TextDocument): boolean { if (doc.lineCount === 0) { @@ -38,18 +38,9 @@ export function isApexLogContent(doc: TextDocument): boolean { return false; } -function isApexLogFile(fsPath: string): boolean { - let fd: number; - try { - fd = openSync(fsPath, 'r'); - } catch { - return false; - } - +export async function isApexLogFile(uri: Uri): Promise { try { - const buf = Buffer.alloc(4096); - const bytesRead = readSync(fd, buf, 0, 4096, 0); - const text = buf.toString('utf8', 0, bytesRead); + const text = await readFilePrefix(uri); const lines = text.split(/\r?\n/); const linesToCheck = Math.min(MAX_LINES_TO_CHECK, lines.length); @@ -60,13 +51,18 @@ function isApexLogFile(fsPath: string): boolean { } } return false; - } finally { - closeSync(fd); + } catch { + return false; } } +async function readFilePrefix(uri: Uri): Promise { + const bytes = await workspace.fs.readFile(uri); + return new TextDecoder().decode(bytes.subarray(0, MAX_BYTES_TO_READ)); +} + function hasDetectExtension(uri: Uri): boolean { - return DETECT_EXTENSIONS.has(extname(uri.fsPath).toLowerCase()); + return DETECT_EXTENSIONS.has(Utils.extname(uri).toLowerCase()); } function getActiveTabUri(): Uri | undefined { @@ -78,8 +74,9 @@ function getActiveTabUri(): Uri | undefined { } function updateContextKey(): void { + const generation = ++contextUpdateGeneration; const editor = window.activeTextEditor; - if (editor && editor.document.uri.scheme === 'file') { + if (editor) { const doc = editor.document; if (hasDetectExtension(doc.uri)) { const detected = isApexLogContent(doc); @@ -92,9 +89,19 @@ function updateContextKey(): void { // Fallback to tab API for large files where activeTextEditor is undefined const tabUri = getActiveTabUri(); - if (tabUri && tabUri.scheme === 'file' && hasDetectExtension(tabUri)) { - const detected = isApexLogFile(tabUri.fsPath); - commands.executeCommand('setContext', 'lana.isApexLog', detected); + if (tabUri && hasDetectExtension(tabUri)) { + const tabKey = tabUri.toString(); + void isApexLogFile(tabUri).then((detected) => { + const activeTabUri = getActiveTabUri(); + if ( + generation !== contextUpdateGeneration || + window.activeTextEditor || + activeTabUri?.toString() !== tabKey + ) { + return; + } + commands.executeCommand('setContext', 'lana.isApexLog', detected); + }); return; } @@ -132,7 +139,7 @@ export class ApexLogLanguageDetector { } function detectAndSetLanguage(doc: TextDocument): void { - if (doc.languageId === 'apexlog' || doc.uri.scheme !== 'file') { + if (doc.languageId === 'apexlog') { return; } diff --git a/lana/src/language/__tests__/ApexLogLanguageDetector.test.ts b/lana/src/language/__tests__/ApexLogLanguageDetector.test.ts index 1689c05b1..67827c5bf 100644 --- a/lana/src/language/__tests__/ApexLogLanguageDetector.test.ts +++ b/lana/src/language/__tests__/ApexLogLanguageDetector.test.ts @@ -3,8 +3,21 @@ */ import { describe, expect, it } from '@jest/globals'; +import { createMockContext } from '../../__tests__/helpers/test-builders.js'; import { createMockTextDocument } from '../../__tests__/mocks/vscode.js'; -import { isApexLogContent } from '../ApexLogLanguageDetector.js'; +import { + TabInputText, + Uri, + commands, + languages, + window, + workspace, +} from '../../__tests__/mocks/vscode.js'; +import { + ApexLogLanguageDetector, + isApexLogContent, + isApexLogFile, +} from '../ApexLogLanguageDetector.js'; describe('isApexLogContent', () => { it('should detect standard log with settings header on line 1', () => { @@ -94,3 +107,98 @@ describe('isApexLogContent', () => { expect(isApexLogContent(doc)).toBe(false); }); }); + +describe('isApexLogFile', () => { + it('decodes only the first 4 KB returned by the filesystem provider', async () => { + const prefix = 'not an Apex log'.padEnd(4096, ' '); + workspace.fs.readFile.mockResolvedValue( + new TextEncoder().encode(`${prefix}09:45:31.888 (1000)|EXECUTION_STARTED`), + ); + const uri = Uri.file('/logs/large.log'); + + await expect(isApexLogFile(uri)).resolves.toBe(false); + + expect(workspace.fs.readFile).toHaveBeenCalledWith(uri); + }); + + it('uses the registered filesystem provider for an arbitrary URI scheme', async () => { + workspace.fs.readFile.mockResolvedValue( + new TextEncoder().encode('09:45:31.888 (1000)|EXECUTION_STARTED'), + ); + const uri = Uri.parse('git:/repository/logs/virtual.log'); + + await expect(isApexLogFile(uri)).resolves.toBe(true); + + expect(workspace.fs.readFile).toHaveBeenCalledWith(uri); + }); +}); + +describe('ApexLogLanguageDetector', () => { + it.each(['log', 'txt'])('detects .%s Apex logs from arbitrary URI schemes', (extension) => { + const doc = createMockTextDocument({ + languageId: 'plaintext', + lines: ['09:45:31.888 (1000)|EXECUTION_STARTED'], + }); + Object.defineProperty(doc, 'uri', { + value: Uri.parse(`git:/repository/logs/virtual.${extension}`), + }); + workspace.textDocuments = [doc]; + + ApexLogLanguageDetector.apply( + createMockContext() as unknown as import('../../Context.js').Context, + ); + + expect(languages.setTextDocumentLanguage).toHaveBeenCalledWith(doc, 'apexlog'); + }); + + it('retains the existing extension prefilter', () => { + const doc = createMockTextDocument({ + languageId: 'plaintext', + lines: ['09:45:31.888 (1000)|EXECUTION_STARTED'], + }); + Object.defineProperty(doc, 'uri', { value: Uri.parse('git:/repository/logs/virtual.json') }); + workspace.textDocuments = [doc]; + + ApexLogLanguageDetector.apply( + createMockContext() as unknown as import('../../Context.js').Context, + ); + + expect(languages.setTextDocumentLanguage).not.toHaveBeenCalled(); + }); + + it('does not publish a stale async result after the active tab changes', async () => { + let resolveSlowRead: ((bytes: Uint8Array) => void) | undefined; + const slowRead = new Promise((resolve) => { + resolveSlowRead = resolve; + }); + const slowUri = Uri.parse('memfs:/logs/slow.log'); + const fastUri = Uri.parse('memfs:/logs/fast.log'); + workspace.fs.readFile.mockImplementation((uri: { path: string }) => + uri.path === slowUri.path + ? slowRead + : Promise.resolve(new TextEncoder().encode('not an Apex log')), + ); + + let notifyTabsChanged: (() => void) | undefined; + window.tabGroups.onDidChangeTabs.mockImplementation((listener: (event: unknown) => void) => { + notifyTabsChanged = () => listener({}); + return { dispose: jest.fn() }; + }); + window.tabGroups.activeTabGroup.activeTab = { input: new TabInputText(slowUri) }; + + ApexLogLanguageDetector.apply( + createMockContext() as unknown as import('../../Context.js').Context, + ); + window.tabGroups.activeTabGroup.activeTab = { input: new TabInputText(fastUri) }; + notifyTabsChanged?.(); + await new Promise((resolve) => setTimeout(resolve, 0)); + + expect(commands.executeCommand).toHaveBeenLastCalledWith('setContext', 'lana.isApexLog', false); + + resolveSlowRead?.(new TextEncoder().encode('09:45:31.888 (1000)|EXECUTION_STARTED')); + await slowRead; + await new Promise((resolve) => setTimeout(resolve, 0)); + + expect(commands.executeCommand).not.toHaveBeenCalledWith('setContext', 'lana.isApexLog', true); + }); +}); diff --git a/lana/src/log-features/RawLogNavigation.ts b/lana/src/log-features/RawLogNavigation.ts index b14eba9b0..c37f84967 100644 --- a/lana/src/log-features/RawLogNavigation.ts +++ b/lana/src/log-features/RawLogNavigation.ts @@ -1,7 +1,9 @@ /* * Copyright (c) 2020 Certinia Inc. All rights reserved. */ -import { Selection, Uri, commands, window, workspace } from 'vscode'; +import { Selection, commands, window, type Uri } from 'vscode'; + +import { readFile } from '../services/salesforceServices.js'; /** * Handles navigation within raw Apex log files. @@ -15,12 +17,10 @@ export class RawLogNavigation { * @param logPath - Path to the log file * @param timestamp - Nanosecond timestamp to find (from log event) */ - public static async goToLineByTimestamp(logPath: string, timestamp: number): Promise { + public static async goToLineByTimestamp(logUri: Uri, timestamp: number): Promise { try { - const uri = Uri.file(logPath); - // Read file (no normalization - avoids doubling memory for large files) - const text = new TextDecoder().decode(await workspace.fs.readFile(uri)); + const text = await readFile(logUri); // Find the exact timestamp pattern: (nanoseconds)| const index = text.indexOf(`(${timestamp})|`); @@ -45,7 +45,7 @@ export class RawLogNavigation { } // Open file with line selected (cursor ends up at end - VS Code limitation) - await commands.executeCommand('vscode.open', uri, { + await commands.executeCommand('vscode.open', logUri, { preview: false, selection: new Selection(lineNumber, 0, lineNumber, lineLength), }); diff --git a/lana/src/salesforce/codesymbol/SfdxProject.ts b/lana/src/salesforce/codesymbol/SfdxProject.ts index 182337a2f..a46b40c20 100644 --- a/lana/src/salesforce/codesymbol/SfdxProject.ts +++ b/lana/src/salesforce/codesymbol/SfdxProject.ts @@ -1,8 +1,8 @@ /* * Copyright (c) 2025 Certinia Inc. All rights reserved. */ -import path from 'path'; import { RelativePattern, type Uri, workspace } from 'vscode'; +import { Utils } from 'vscode-uri'; export interface PackageDirectory { readonly uri: Uri; @@ -45,7 +45,9 @@ export class SfdxProject { const classIndex = new Map(); for (const uri of allUris) { // uri.path is always '/'-separated (unlike fsPath), so posix basename is safe everywhere - const className = path.posix.basename(uri.path, '.cls').toLowerCase(); + const className = Utils.basename(uri) + .replace(/\.cls$/i, '') + .toLowerCase(); const uris = classIndex.get(className); if (uris) { uris.push(uri); diff --git a/lana/src/salesforce/codesymbol/SfdxProjectReader.ts b/lana/src/salesforce/codesymbol/SfdxProjectReader.ts index 563d2dfac..5c1cc6d36 100644 --- a/lana/src/salesforce/codesymbol/SfdxProjectReader.ts +++ b/lana/src/salesforce/codesymbol/SfdxProjectReader.ts @@ -2,6 +2,7 @@ * Copyright (c) 2025 Certinia Inc. All rights reserved. */ import { RelativePattern, Uri, workspace, type WorkspaceFolder } from 'vscode'; + import { SfdxProject } from './SfdxProject.js'; interface RawPackageDirectory { @@ -45,7 +46,7 @@ export async function getProjects(workspaceFolder: WorkspaceFolder): Promise ({ path, fsPath: path }) as Uri; +const joinPath = (base: string, ...segments: string[]): string => + [base, ...segments].join('/').replace(/\/[^/]+\/\.\.\//g, '/'); + /** Mock the workspace scan so each project file resolves to its own contents, in order. */ function mockProjectFiles(files: { uri: Uri; contents: string }[]): void { (workspace.findFiles as jest.Mock).mockResolvedValue(files.map((file) => file.uri)); @@ -30,7 +32,7 @@ describe('getProjects', () => { jest.clearAllMocks(); // Mirror the real Uri.joinPath: join segments and normalize '..' (Uri.joinPath as jest.Mock).mockImplementation((base: Uri, ...segments: string[]) => - fileUri(posix.join(base.path, ...segments)), + fileUri(joinPath(base.path, ...segments)), ); }); diff --git a/lana/src/salesforce/logs/GetLogFile.ts b/lana/src/salesforce/logs/GetLogFile.ts deleted file mode 100644 index 8948be895..000000000 --- a/lana/src/salesforce/logs/GetLogFile.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2020 Certinia Inc. All rights reserved. - */ -import { getSalesforceConnection } from './SalesforceConnection.js'; - -export class GetLogFile { - static async apply(wsPath: string, logDir: string, logId: string): Promise { - const connection = await getSalesforceConnection(wsPath); - - // Dynamic import for code splitting. Improves performance by reducing the amount of JS that is loaded and parsed at the start. - - const { LogService } = await import('@salesforce/apex-node'); - await new LogService(connection).getLogs({ logId: logId, outputDir: logDir }); - } -} diff --git a/lana/src/salesforce/logs/GetLogFiles.ts b/lana/src/salesforce/logs/GetLogFiles.ts deleted file mode 100644 index 363485ba1..000000000 --- a/lana/src/salesforce/logs/GetLogFiles.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2020 Certinia Inc. All rights reserved. - */ -import type { LogRecord } from '@salesforce/apex-node'; - -import { getSalesforceConnection } from './SalesforceConnection.js'; - -export class GetLogFiles { - static async apply(wsPath: string): Promise { - const connection = await getSalesforceConnection(wsPath); - - // Dynamic import for code splitting. Improves performance by reducing the amount of JS that is loaded and parsed at the start. - - const { LogService } = await import('@salesforce/apex-node'); - return new LogService(connection).getLogRecords(); - } -} diff --git a/lana/src/salesforce/logs/SalesforceConnection.ts b/lana/src/salesforce/logs/SalesforceConnection.ts deleted file mode 100644 index 524ab6bab..000000000 --- a/lana/src/salesforce/logs/SalesforceConnection.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020 Certinia Inc. All rights reserved. - */ -import type { Connection } from '@salesforce/core'; - -import { setupPinoBundlerPaths } from '../setupPinoPaths.js'; - -export async function getSalesforceConnection(wsPath: string): Promise { - // Must be called before importing @salesforce packages that use pino - setupPinoBundlerPaths(); - - // Dynamic import for code splitting. Improves performance by reducing the amount of JS that is loaded and parsed at the start. - - const { ConfigAggregator, OrgConfigProperties, Org } = await import('@salesforce/core'); - - const aggregator = await ConfigAggregator.create({ projectPath: wsPath }); - const aliasOrUsername = aggregator.getPropertyValue(OrgConfigProperties.TARGET_ORG); - - if (!aliasOrUsername) { - throw new Error('No default org configured for workspace'); - } - - const org = await Org.create({ aliasOrUsername }); - return org.getConnection(); -} diff --git a/lana/src/salesforce/setupPinoPaths.ts b/lana/src/salesforce/setupPinoPaths.ts deleted file mode 100644 index f5b21e34f..000000000 --- a/lana/src/salesforce/setupPinoPaths.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2020 Certinia Inc. All rights reserved. - */ -import { dirname, join } from 'path'; -import { fileURLToPath } from 'url'; - -/** - * Sets up pino bundler path overrides for worker threads. - * Must be called before any @salesforce/* imports that use pino. - * - * Pino uses worker threads that need to load files from disk at runtime. - * When bundled with rollup, the paths break. This injects the correct - * paths to the separately copied worker files. - */ -export function setupPinoBundlerPaths(): void { - if ('__bundlerPathsOverrides' in globalThis) { - return; - } - - const __dirname = dirname(fileURLToPath(import.meta.url)); - - (globalThis as Record).__bundlerPathsOverrides = { - 'thread-stream-worker': join(__dirname, 'thread-stream-worker.js'), - 'pino-worker': join(__dirname, 'pino-worker.js'), - 'pino/file': join(__dirname, 'pino-file.js'), - '../../lib/logger/transformStream': join(__dirname, 'salesforce-transform-stream.js'), - }; -} diff --git a/lana/src/services/salesforceServices.ts b/lana/src/services/salesforceServices.ts new file mode 100644 index 000000000..8c1d29900 --- /dev/null +++ b/lana/src/services/salesforceServices.ts @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2026 Certinia Inc. All rights reserved. + */ +import type { Uri } from 'vscode'; + +import { getRuntime, getServicesApi } from './servicesRuntime.js'; + +/* eslint-disable @typescript-eslint/naming-convention -- Salesforce API field names are case-sensitive. */ +export interface ApexLogListItem { + Id: string; + LogUser?: { Name?: string }; + Operation?: string; + LogLength: number; + StartTime: string; + Status: string; + DurationMilliseconds?: number; +} +/* eslint-enable @typescript-eslint/naming-convention */ + +export function listLogs(limit = 25): Promise { + const { ApexLogService } = getServicesApi().services; + return getRuntime().runPromise(ApexLogService.listLogs(limit)); +} + +export function getLogBody(logId: string): Promise { + const { ApexLogService } = getServicesApi().services; + return getRuntime().runPromise(ApexLogService.getLogBody(logId)); +} + +export function readFile(uri: Uri | string): Promise { + const { FsService } = getServicesApi().services; + return getRuntime().runPromise(FsService.readFile(uri)); +} + +export function writeFile(uri: Uri | string, content: string): Promise { + const { FsService } = getServicesApi().services; + return getRuntime().runPromise(FsService.safeWriteFile(uri, content)); +} + +export function fileOrFolderExists(uri: Uri | string): Promise { + const { FsService } = getServicesApi().services; + return getRuntime().runPromise(FsService.fileOrFolderExists(uri)); +} diff --git a/lana/src/services/servicesRuntime.ts b/lana/src/services/servicesRuntime.ts new file mode 100644 index 000000000..36680cbe3 --- /dev/null +++ b/lana/src/services/servicesRuntime.ts @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2026 Certinia Inc. All rights reserved. + */ +import type * as Context from 'effect/Context'; +import * as Layer from 'effect/Layer'; +import * as ManagedRuntime from 'effect/ManagedRuntime'; +import { extensions } from 'vscode'; + +import type { SalesforceVSCodeServicesApi } from '@salesforce/vscode-services'; + +const SERVICES_EXTENSION_ID = 'salesforce.salesforcedx-vscode-services'; + +type Services = + SalesforceVSCodeServicesApi['services']['prebuiltServicesDependencies'] extends Context.Context< + infer R + > + ? R + : never; + +type ServicesRuntime = ManagedRuntime.ManagedRuntime; + +let servicesApi: SalesforceVSCodeServicesApi | undefined; +let runtime: ServicesRuntime | undefined; + +export async function initServices(): Promise { + const extension = extensions.getExtension(SERVICES_EXTENSION_ID); + if (!extension) { + throw new Error( + `The '${SERVICES_EXTENSION_ID}' extension is required but was not found. Install the Salesforce Extension Pack and try again.`, + ); + } + + servicesApi = extension.isActive ? extension.exports : await extension.activate(); + runtime = ManagedRuntime.make( + Layer.succeedContext(servicesApi.services.prebuiltServicesDependencies), + ); +} + +export function getServicesApi(): SalesforceVSCodeServicesApi { + if (!servicesApi) { + throw new Error('Salesforce Services is not initialized.'); + } + return servicesApi; +} + +export function getRuntime(): ServicesRuntime { + if (!runtime) { + throw new Error('Salesforce Services runtime is not initialized.'); + } + return runtime; +} + +export async function disposeServices(): Promise { + const activeRuntime = runtime; + runtime = undefined; + servicesApi = undefined; + await activeRuntime?.dispose(); +} diff --git a/lana/src/symbols/RawLogSymbolProvider.ts b/lana/src/symbols/RawLogSymbolProvider.ts index 2b11e88ab..f4ed09993 100644 --- a/lana/src/symbols/RawLogSymbolProvider.ts +++ b/lana/src/symbols/RawLogSymbolProvider.ts @@ -29,7 +29,7 @@ class RawLogSymbolProvider implements DocumentSymbolProvider { document: TextDocument, _token: CancellationToken, ): Promise { - const apexLog = await LogEventCache.getApexLog(document.uri.fsPath); + const apexLog = await LogEventCache.getApexLog(document.uri.toString()); if (!apexLog) { return []; @@ -89,7 +89,7 @@ class RawLogSymbolProvider implements DocumentSymbolProvider { } static apply(context: Context): void { - const docSelector = [{ scheme: 'file', language: 'apexlog' }]; + const docSelector = [{ language: 'apexlog' }]; context.context.subscriptions.push( languages.registerDocumentSymbolProvider(docSelector, new RawLogSymbolProvider()), diff --git a/lana/src/symbols/__tests__/RawLogSymbolProvider.test.ts b/lana/src/symbols/__tests__/RawLogSymbolProvider.test.ts index f7aad575c..1f25bd1b5 100644 --- a/lana/src/symbols/__tests__/RawLogSymbolProvider.test.ts +++ b/lana/src/symbols/__tests__/RawLogSymbolProvider.test.ts @@ -142,7 +142,7 @@ describe('RawLogSymbolProvider', () => { expect(languages.registerDocumentSymbolProvider).toHaveBeenCalledTimes(1); expect(languages.registerDocumentSymbolProvider).toHaveBeenCalledWith( - [{ scheme: 'file', language: 'apexlog' }], + [{ language: 'apexlog' }], expect.any(RawLogSymbolProvider), ); }); diff --git a/lana/src/workspace/VSWorkspace.ts b/lana/src/workspace/VSWorkspace.ts index 695e09a65..303184530 100644 --- a/lana/src/workspace/VSWorkspace.ts +++ b/lana/src/workspace/VSWorkspace.ts @@ -14,9 +14,11 @@ export class VSWorkspace { this.workspaceFolder = workspaceFolder; } - path(): string { - return this.workspaceFolder.uri.fsPath; + /** URI string for desktop and virtual web workspaces. */ + get uri(): string { + return this.workspaceFolder.uri.toString(); } + name(): string { return this.workspaceFolder.name; } diff --git a/lana/src/workspace/__tests__/VSWorkspace.test.ts b/lana/src/workspace/__tests__/VSWorkspace.test.ts index 866364b07..cbcb3b45c 100644 --- a/lana/src/workspace/__tests__/VSWorkspace.test.ts +++ b/lana/src/workspace/__tests__/VSWorkspace.test.ts @@ -24,9 +24,9 @@ describe('VSWorkspace', () => { vsWorkspace = new VSWorkspace(mockWorkspaceFolder); }); - describe('path', () => { - it('should return workspace folder path', () => { - expect(vsWorkspace.path()).toBe('/workspace'); + describe('uri', () => { + it('should expose the workspace folder URI', () => { + expect(vsWorkspace.workspaceFolder.uri.fsPath).toBe('/workspace'); }); }); diff --git a/lana/tsconfig.json b/lana/tsconfig.json index 11b78c721..7da6a51b3 100644 --- a/lana/tsconfig.json +++ b/lana/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "lib": ["ES2022"], + "lib": ["ES2022", "WebWorker"], "esModuleInterop": true, "skipLibCheck": true, "target": "es2022", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c8bebccd..2bb11ed60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -115,12 +115,15 @@ importers: '@apexdevtools/apex-parser': specifier: 5.1.0 version: 5.1.0 - '@salesforce/apex-node': - specifier: ^9.0.0 - version: 9.0.2 - '@salesforce/core': - specifier: ^9.1.0 - version: 9.1.0 + '@salesforce/vscode-services': + specifier: ^67.12.0 + version: 67.13.3(@effect/platform@0.96.3(effect@3.22.1))(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(@types/node@22.20.1) + effect: + specifier: ^3.22.0 + version: 3.22.1 + vscode-uri: + specifier: ^3.1.0 + version: 3.1.0 devDependencies: '@types/jest': specifier: ^30.0.0 @@ -323,6 +326,42 @@ packages: '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@azure-rest/core-client@2.8.0': + resolution: {integrity: sha512-F1ybHeN+++QhyFCF/ehLUEvrOB6fehPdFBFtGdj0C3B2lpQ9zkPiO5JDgsqc6IfjuUe6b3dAbXK0a7+VgSGfhw==} + engines: {node: '>=22.0.0'} + + '@azure/abort-controller@2.2.0': + resolution: {integrity: sha512-fNAjWnA/nZ2jz31kxR/AqRaUT8ewHBw/WuBIosK0moMy1C9e5ValbDfFdIxJzVOOYaYkV/b2F1S4H/aHiqfVQg==} + engines: {node: '>=22.0.0'} + + '@azure/core-auth@1.11.0': + resolution: {integrity: sha512-IUZydyTUkDnYdstOW9pFOOUQlBjAepK5teihDE3x6yxsPJs/hsAaaYpeGxdxrgtOiJbBKSjKW7MDk7AEhb4LRg==} + engines: {node: '>=22.0.0'} + + '@azure/core-client@1.11.0': + resolution: {integrity: sha512-JjQWO6akOck45PH/XBrxzsQGAiKrfFl4m5iggJ0ItMIz5omRufOXWpqCPpdjKN3vKDzlSUvFjaMb7Zwf0gvAdA==} + engines: {node: '>=22.0.0'} + + '@azure/core-rest-pipeline@1.25.0': + resolution: {integrity: sha512-bMs8ekJLjX8wPV+9IPBges1SLPyuDtE9g5gLDWOpxzKcoOFQnpLGkbcT1tdw3FaAmDS1gnPmMmJ6y/T5B96kIA==} + engines: {node: '>=22.0.0'} + + '@azure/core-tracing@1.4.0': + resolution: {integrity: sha512-eGwxD0AtncrxeBM4tG8R55Pc3rdX1hNW2WibJAgYpCVA6E93mvvVH+LcssoVjOBrSKWS55yEIHsk0X8ctHmfOQ==} + engines: {node: '>=22.0.0'} + + '@azure/core-util@1.14.0': + resolution: {integrity: sha512-9n2pWK61veAuN0V20t9lOuoV4CFMdyAZ1ygZzvBGk/pBBJRib/PjL9PLXa/aI2CcPpyHfqVsxxqLCYl6uZlfDw==} + engines: {node: '>=22.0.0'} + + '@azure/logger@1.4.0': + resolution: {integrity: sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA==} + engines: {node: '>=22.0.0'} + + '@azure/monitor-opentelemetry-exporter@1.0.0-beta.44': + resolution: {integrity: sha512-q266CqBoQDp4UcUvPXZ4NYSvl5aTDqiiUu7pDWqqtxL0nCvPkwZT8/vKOhhi8cB0pnL/ojc3basyV9lbS+jbPQ==} + engines: {node: '>=22.0.0'} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -960,6 +999,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime-corejs3@7.29.7': + resolution: {integrity: sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} @@ -1519,6 +1562,25 @@ packages: open-ask-ai: optional: true + '@effect/opentelemetry@0.63.0': + resolution: {integrity: sha512-2yUG2QWNATi1uKP0kwhaP5eLp+c5NDzAL3EOpIcGLBAC0cbXZrx4n9Qw/QwUKxpuV+pbhrBUPCiByyWAFKfuCw==} + peerDependencies: + '@effect/platform': ^0.96.0 + '@opentelemetry/api': ^1.9 + '@opentelemetry/resources': ^2.0.0 + '@opentelemetry/sdk-logs': '>=0.203.0 <0.300.0' + '@opentelemetry/sdk-metrics': ^2.0.0 + '@opentelemetry/sdk-trace-base': ^2.0.0 + '@opentelemetry/sdk-trace-node': ^2.0.0 + '@opentelemetry/sdk-trace-web': ^2.0.0 + '@opentelemetry/semantic-conventions': ^1.33.0 + effect: ^3.21.0 + + '@effect/platform@0.96.3': + resolution: {integrity: sha512-LzvIj4HYE++TcTv/cVTCI/GRvQTV0ymwRmgjZMzNB5dU4OS05pTN36RKN0npiOm5orLJgw4yjIv1dNZoYGh/vg==} + peerDependencies: + effect: ^3.21.5 + '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -1623,6 +1685,15 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1762,6 +1833,10 @@ packages: resolution: {integrity: sha512-k7i2Tntu1fLvkMtRcKDFU64/Fr2M692ECtbwIGX6hcOh5mj+jrMa1tlvcdwffxAMl+lPYCXnY2bjErxWmP84zA==} engines: {node: '>=22'} + '@jsforce/jsforce-node@3.10.22': + resolution: {integrity: sha512-4TLjnvTlBW59NmNSsRRV5dDEepQGfBKVD0WWQlJUJwkU0d5FFxo8GbfNmCOXkjjYAe1wv7SuvMzJKcLZHU6qyw==} + engines: {node: '>=22'} + '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -1921,6 +1996,36 @@ packages: '@module-federation/webpack-bundler-runtime@0.22.0': resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} + cpu: [x64] + os: [win32] + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1944,6 +2049,9 @@ packages: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} + '@nodable/entities@3.0.0': + resolution: {integrity: sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==} + '@node-rs/jieba-android-arm-eabi@1.10.4': resolution: {integrity: sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==} engines: {node: '>= 10'} @@ -1985,28 +2093,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@node-rs/jieba-linux-arm64-musl@1.10.4': resolution: {integrity: sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@node-rs/jieba-linux-x64-gnu@1.10.4': resolution: {integrity: sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@node-rs/jieba-linux-x64-musl@1.10.4': resolution: {integrity: sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@node-rs/jieba-wasm32-wasi@1.10.4': resolution: {integrity: sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==} @@ -2047,6 +2151,136 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opentelemetry/api-logs@0.219.0': + resolution: {integrity: sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api-logs@0.220.0': + resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.8.0': + resolution: {integrity: sha512-/3FIraneMcng67SUJCxvyInk/oxzwsxyadufk0wwfOBLf5wqtAGX4MoQASwSbndBPeARzBryUM9Azr5kHIdWLw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.10.0': + resolution: {integrity: sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.8.0': + resolution: {integrity: sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.9.0': + resolution: {integrity: sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.219.0': + resolution: {integrity: sha512-9t6SvBXXBEjOBcIzgozvBbd3jWrv3Gt3ngGhl1fhdZ/zRc7oZDVOFEqbi2zlBpW9BXhgDMKv422J0DL/3iQWfw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.219.0': + resolution: {integrity: sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.219.0': + resolution: {integrity: sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@2.10.0': + resolution: {integrity: sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/resources@2.8.0': + resolution: {integrity: sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/resources@2.9.0': + resolution: {integrity: sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.219.0': + resolution: {integrity: sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.220.0': + resolution: {integrity: sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.10.0': + resolution: {integrity: sha512-t6r1VSvXNtSDnPXU1FbZeetJb7yyovHmgu0wRSoftxtE0g2rSNhQZQUy69sRUCL+iioJpX8SN/S6wq6ZtvLySQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.8.0': + resolution: {integrity: sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.10.0': + resolution: {integrity: sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.8.0': + resolution: {integrity: sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.8.0': + resolution: {integrity: sha512-nZt9OGufioAc3AfoLTqA9bsAeaMJAictYDdI2VcNQ+PmT+3rfKjAZDZvgPfd8VPX0O5Bw1hdQF6kDK8VSpZiWg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-web@2.8.0': + resolution: {integrity: sha512-P3ZM8BGJ5mwjtyfAxRyxsCyWHvaj+xahdhLoS3YiPsEyTHcWTVzx2691C8SrGkpvro3tNFCsWuNNrvM+spKODg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.10.0': + resolution: {integrity: sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@oxc-parser/binding-android-arm-eabi@0.139.0': resolution: {integrity: sha512-22EsXTA3Vc7OvrF4bfT48PFln2UbxkVgrp/Tm32qLw76Dv7SmcInfClJe6yPYamnli6HiqasnESZ5ezN+X4ybg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2094,56 +2328,48 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.139.0': resolution: {integrity: sha512-u9e884ChAVRmIZ1jr/m46S96FoDQnruFjISLi4Y0i6Wu/JUUmIiw7+umLyXILJsPfUuqnN5BJLe23t07+Y6+IA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.139.0': resolution: {integrity: sha512-Z9tU2b3GJfAXOdirQmz4gZQkQkVjy53i77gf91l0733MQKa/qtk73KQQE2GzDtMqim+HyjpzvemmqzBtH2IJUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.139.0': resolution: {integrity: sha512-RyUbr7hzPK84YDWKs77PRYk9VBwWbsbuYsQzQWiSmLnARXTg2zntLPGfCH/1wpfUYdmGkp/6SsqTXSsYdw9Jgw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.139.0': resolution: {integrity: sha512-dcQhjtcDvtR8BgkUpt03Yz5SzxdzYvTigenIJOEsiSX6G2t6yybEMxGWjp0dOuYGror0BaqcZfTyXR58amCEig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.139.0': resolution: {integrity: sha512-iuGrxysV4rGUymdKpn7bgZQ6Vix8Bi/6D/rp71HYIzphq6NKrsBhsGOYsSZte+uBFL43tXh7Xr7TM72sGliJNA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.139.0': resolution: {integrity: sha512-NxJdZZyaa2JLLvNfH/iJQXfCNfKcPMylwY4ObMpBVmW4Nq+RyUpVVQXrMMelcQ6rwx3nuhF1Iga8n+eoAKGCIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.139.0': resolution: {integrity: sha512-ePxBvvtzISmSsJ0RIj8FNikSCn58i1jtccj7XR4U9Li4iSzhkFyYlnJ51cQTUwkairz8WMTD4SpKoot8RyTnQA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.139.0': resolution: {integrity: sha512-b/c2+mPXMOxG5x16n8yf9cjor/ntQQScmYnSmLEWIWJ4rfXd5dokMxx0kliSLA+YAGq6DD3K9BWi+aFXHiiV1w==} @@ -2209,42 +2435,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} @@ -2373,42 +2593,36 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.2.1': resolution: {integrity: sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.2.1': resolution: {integrity: sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.2.1': resolution: {integrity: sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.2.1': resolution: {integrity: sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-musl@1.2.1': resolution: {integrity: sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-openharmony-arm64@1.2.1': resolution: {integrity: sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==} @@ -2526,79 +2740,66 @@ packages: resolution: {integrity: sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.62.3': resolution: {integrity: sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.62.3': resolution: {integrity: sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.62.3': resolution: {integrity: sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.62.3': resolution: {integrity: sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.62.3': resolution: {integrity: sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.62.3': resolution: {integrity: sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.62.3': resolution: {integrity: sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.62.3': resolution: {integrity: sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.62.3': resolution: {integrity: sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.62.3': resolution: {integrity: sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.62.3': resolution: {integrity: sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.62.3': resolution: {integrity: sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.62.3': resolution: {integrity: sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==} @@ -2644,25 +2845,21 @@ packages: resolution: {integrity: sha512-C8owWG+yvo7X0oVLIXetkoJhIFBP1LYNcAQqtgLmJnQLQDklGuP83dKC+zISGQWpjawHfZ1ER96vLgoTrxKZdw==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-musl@1.7.12': resolution: {integrity: sha512-i51WWI64aRpsfSki6rN0aepPqXkVfS+vZM7+4bWDcmnhUmdMvhIPcYg0QRk3DtyJnu33jqNLM0WHY78k00NyfA==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-gnu@1.7.12': resolution: {integrity: sha512-MSos0FuPEefqo9V92ULd5hggKG29EkSNg1zDcypy0OkpsKh5pfjVxTLYFXgTcVyFoUQQbdG8zFBzYbwmJ8V4ew==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-musl@1.7.12': resolution: {integrity: sha512-JcAMVKXOnjfpC3coWjCFPWD3Yl8RBw6a+IXQQ8mfRlHaHMIiOv8IfZqx15XRxMUn49CtP7Z0Na8iiAg2aKrcfw==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-wasm32-wasi@1.7.12': resolution: {integrity: sha512-n+ZqP6ZMc0nhOgvadg5VhEs9ojtbES80AcWeFnmGkbzIszvGSO63GKNiRkXtjJ9KFuRzytbbmsCqkUVH+Tywxg==} @@ -2698,22 +2895,37 @@ packages: '@rspack/lite-tapable@1.1.0': resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} - '@salesforce/apex-node@9.0.2': - resolution: {integrity: sha512-TD7REX5rTf60pH2DzY5DgbFOsonmwqAQLmfw6mTHTGTbx8jCEcPgaa1F2mvQn7Vg2i7r+ifbJ9YPkwn7aqXF5w==} - engines: {node: '>=22.0.0'} - '@salesforce/core@9.1.0': resolution: {integrity: sha512-ID9g4YH0yZBeWI0eKJv2IJRRN6ZuNjwpIOjEZm9a79Gzxa3IITsV4PCvD8q7JA3PKqiln57p8yJE458Kn5KW1g==} engines: {node: '>=22.0.0'} + '@salesforce/core@9.1.4': + resolution: {integrity: sha512-S4VZ0xstYOAs5dwt7EDGkuFZA8rddy0wmuPTGjsIhgAPzuq3I5lKyBNwqXMMxdhBcWi+P4cXccHLpOYivgdrXQ==} + engines: {node: '>=22.0.0'} + '@salesforce/kit@4.0.0': resolution: {integrity: sha512-VwxhSH/8PQ5YmPAdhmLaJGCgR0n/pOm8T2y+/odMFthd5SA0xsO/kTdaRLFnFQAxxNj1nYtNHRb+BoMuAatzew==} engines: {node: '>=22.0.0'} + '@salesforce/source-deploy-retrieve@13.2.0': + resolution: {integrity: sha512-4R3Sd6it/oX8IRm5JGvi6fba0318VVHz/bgsDFEchHo8ed73LU021nWJJ5hBcveHdW+MUJioO9rU7MCOYLh1uA==} + engines: {node: '>=22.0.0'} + + '@salesforce/source-tracking@8.1.0': + resolution: {integrity: sha512-ookx5YVI4ddEkNWwSkqPrXU5MKXkcuGig0rW7FzBtDnpIZU8q3+elilIJ5PI/YXBAIpUZl69Alsjh6+Bl7ZqeA==} + engines: {node: '>=22.0.0'} + '@salesforce/ts-types@3.0.1': resolution: {integrity: sha512-NWkveMYT2I3O7EAYwWHi6/ba2YUwp9MFi/zJzA+czK5MVqJfdD6FZbiQrTbALZNvFzgFSdq9BvHm6ygRmtROzw==} engines: {node: '>=22.0.0'} + '@salesforce/types@1.8.0': + resolution: {integrity: sha512-sliQcoI0XeR3YYUElIV3z93l7ZL9lDtnegVGbknBFbQKjN/oxH/PQSiM4imnXnModhFQSoe/V3mGXniASoLNvA==} + engines: {node: '>=18'} + + '@salesforce/vscode-services@67.13.3': + resolution: {integrity: sha512-45EukRQHuDT54Eafa+McrUofz1iXSCoMueXdTmwLj6JmXchL4wxoHHBOYv+x7yRAhdiiSfOxdySZ0Zqf+1SwwQ==} + '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -2752,6 +2964,9 @@ packages: '@slorber/remark-comment@1.0.0': resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -2853,42 +3068,36 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.15.47': resolution: {integrity: sha512-3Yu3Uq/VgytqsPjTMbkPU1ExADytbdWbruJYhA584E9jrpE2Ki+R6VVPoZCeAVk1Cb7QxcRTgblw6bSa6a/R+w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-ppc64-gnu@1.15.47': resolution: {integrity: sha512-wfdMi5IaOaNtmh2/6geRoxIdNfqylUZFdtzTKS655y1axWfIWyx7As74vv0wVdjeCIZ3WmCI9odDd4rUttXOSQ==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] - libc: [glibc] '@swc/core-linux-s390x-gnu@1.15.47': resolution: {integrity: sha512-3hHYBY0yx8Ez7GMRrkhXHQzMdR5IZA6Wq5Ee4svlgwvSECLpnAJ9+0AimEGUFDvuLwE7nV/2+PYe8+Nm4rvNcQ==} engines: {node: '>=10'} cpu: [s390x] os: [linux] - libc: [glibc] '@swc/core-linux-x64-gnu@1.15.47': resolution: {integrity: sha512-TjfhjgP/jGCfFHYC3JQPhJA1HwErbIJ9JfREDc1KNkvY6P0LodCgKVIlQ5deeTbkG7ih3bF5PHJLuLpaZjdRyQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.15.47': resolution: {integrity: sha512-CQpS8Ge/avfjZd0UEwG/sds83Uu32deQXcV1Jo3jD0mmvQQqtYAjpsDZXugmheeAwmt+YIuoVtVHro8LMYHqsQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.15.47': resolution: {integrity: sha512-0W8IKHsUTYiT7G2RqtOoVWk+89yzZikIiDUb/sCK6BmQDBhN91hQSfyUtW12jhEWLzYgcfmisfsZrmZE+84U1A==} @@ -2946,42 +3155,36 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/html-linux-arm64-musl@1.15.47': resolution: {integrity: sha512-NyXRQiVBkeutgCwCxUUaFqZdDmpZONs7Zz3AZGoY35s9GwXF412Nt22fK/e7lO/sM6G/+S3rOom/0xTmUQSK6A==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/html-linux-ppc64-gnu@1.15.47': resolution: {integrity: sha512-rQ+XLJHFzu0e4M5p1+8kF2FKzI7WO9KPPji87OuicHZVrDCEqg7/jSGu3hys9CjIQIYVfR+tAFuZz3Q1/jOoNA==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] - libc: [glibc] '@swc/html-linux-s390x-gnu@1.15.47': resolution: {integrity: sha512-w6bitHrllrE3lqmf14cT3spmWhZHGts1O08O4adzxztSPto7O5GM3IerqZm/NtsqlxNsfbVHnhaNXxXWe/8Q+Q==} engines: {node: '>=10'} cpu: [s390x] os: [linux] - libc: [glibc] '@swc/html-linux-x64-gnu@1.15.47': resolution: {integrity: sha512-FTA7E29gcyadd71prg8sJUVacYrIhAXS8L7p48yCfgcNOKquofN1TDOrHVOyYMoxplL3FUwwbN+AZxWO7QfWPQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/html-linux-x64-musl@1.15.47': resolution: {integrity: sha512-g+K1GKUrj+S9o8Qsgii2g7ooMzZ750R4IAqH5CVElIA5FTMAx7KGnu9ga6aEnRwwLYxY3s1k/nN+ls0NEk240g==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/html-win32-arm64-msvc@1.15.47': resolution: {integrity: sha512-5Iw3i00JdTySi+ccc2CM5bxY+8TZivQmcTqUC6mUdAY0/KYBgSe1/L294UJQ4OTLQqNDOYXY9jdb070zZUX7jg==} @@ -3014,10 +3217,17 @@ packages: '@swc/types@0.1.27': resolution: {integrity: sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} @@ -3039,6 +3249,9 @@ packages: '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} @@ -3108,6 +3321,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -3154,6 +3370,9 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -3379,6 +3598,10 @@ packages: resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} hasBin: true + '@typespec/ts-http-runtime@0.3.8': + resolution: {integrity: sha512-bLMpVcWZNzq6lYOybwFwOAR1IXKcHnhUNqYeHjl1bET/qE3jFPFH+p8Wrh3rU4xwdnifPxmKNESBYnvnmc75aA==} + engines: {node: '>=22.0.0'} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher @@ -3428,61 +3651,51 @@ packages: resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} cpu: [arm64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.12.2': resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} cpu: [arm64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} cpu: [loong64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-loong64-musl@1.12.2': resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} cpu: [loong64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} cpu: [ppc64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} cpu: [riscv64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} cpu: [riscv64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} cpu: [s390x] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.12.2': resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} cpu: [x64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.12.2': resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} cpu: [x64] os: [linux] - libc: [musl] '@unrs/resolver-binding-openharmony-arm64@1.12.2': resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} @@ -3698,6 +3911,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -3718,10 +3934,17 @@ packages: resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} engines: {node: '>=12.0.0'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -3736,6 +3959,10 @@ packages: peerDependencies: postcss: ^8.1.0 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + babel-jest@30.4.1: resolution: {integrity: sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -3818,6 +4045,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + basic-ftp@5.3.1: + resolution: {integrity: sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==} + engines: {node: '>=10.0.0'} + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -3828,6 +4059,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@2.3.0: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} @@ -3876,6 +4110,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -3895,6 +4132,10 @@ packages: resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} engines: {node: '>=6.0.0'} + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -3903,6 +4144,10 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -3976,6 +4221,9 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -4014,6 +4262,9 @@ packages: resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} engines: {node: '>= 10.0'} + clean-git-ref@2.0.1: + resolution: {integrity: sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -4022,10 +4273,22 @@ packages: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-table3@0.6.5: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -4038,6 +4301,13 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -4089,6 +4359,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} @@ -4178,6 +4452,9 @@ packages: core-js-compat@3.49.0: resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-js-pure@3.50.0: + resolution: {integrity: sha512-6GP3Pxz4IKyWjAfa747vIu/jilB5z29JWROLqH/b+pXVcpgh6tM06ZIBwSuglgVqzDYURhOK6oEzTrG0bCHitA==} + core-js@3.49.0: resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} @@ -4193,6 +4470,11 @@ packages: typescript: optional: true + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -4333,6 +4615,10 @@ packages: csv-stringify@6.8.0: resolution: {integrity: sha512-Ya0OOHb6XbgPaZKH7dcdmwXe3azUS0TwmlbVdS75HoAhnHApSkiQcfEJoC/s5WwGsrXwOjBDr3FTmCZPjkssgg==} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -4397,6 +4683,9 @@ packages: resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -4417,6 +4706,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -4449,6 +4742,9 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff3@0.0.3: + resolution: {integrity: sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4509,6 +4805,9 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + effect@3.22.1: + resolution: {integrity: sha512-TNoXushmPOBAjJlthF5d2QwnX2xBPEtcNJr5XKNKbRLbDvBcOYkXlYDfvGfSA0zriwLFuCll5MDtNMAdZL17PQ==} + electron-to-chromium@1.5.360: resolution: {integrity: sha512-GkcBt6YYAw9SxFWn+xVar4cLVGlXVuswwtRLBozi2zp0GjXs4ZnOrqV4zbXzg35n7w81hCkyJNYicgXlVHAmBA==} @@ -4581,10 +4880,6 @@ packages: es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - es-object-atoms@1.1.2: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} @@ -4610,6 +4905,10 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} @@ -4622,6 +4921,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true @@ -4759,6 +5063,10 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} + fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -4787,6 +5095,13 @@ packages: fast-uri@4.0.0: resolution: {integrity: sha512-l90y339r2DkZs/ldcWQXcwTjkbp/NbuJDGYoQ3awBgaT3GXOFkm3OkVpz6Z86TywYcya0eVP2r1kTV90f3krGQ==} + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.0: + resolution: {integrity: sha512-9IGxMqvqLOnqP+Egi1nqDHKv5k8aZ7r9n558enxcucmyVGEBNPAU+MOg/8jPIS7rO7sSq4gFm1/nHtiaubMruw==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -4821,6 +5136,10 @@ packages: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} engines: {node: '>=0.4.0'} + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -4843,6 +5162,9 @@ packages: resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} engines: {node: '>=14.16'} + find-my-way-ts@0.1.6: + resolution: {integrity: sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -4866,6 +5188,10 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -4943,6 +5269,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -4950,6 +5280,10 @@ packages: get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + gifuct-js@2.1.2: resolution: {integrity: sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg==} @@ -4999,6 +5333,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -5143,6 +5481,10 @@ packages: resolution: {integrity: sha512-ZA+oNOoM+GLoFTIzhkJptVQov73Srep2LBqhF8hG8CIPKO3nam1jonXVQ/QUH8RbwsmaaVz2SOJdzBNBHNtKbw==} engines: {node: ^22.15.0 || ^24.0.0 || >=26.0.0} + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -5248,9 +5590,17 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + inquirer@8.2.7: + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} + engines: {node: '>=12.0.0'} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@10.5.0: + resolution: {integrity: sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -5272,6 +5622,10 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true @@ -5329,6 +5683,10 @@ packages: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -5385,9 +5743,20 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unsafe@2.0.2: + resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -5406,6 +5775,9 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -5416,6 +5788,11 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-git@1.41.7: + resolution: {integrity: sha512-ZCyMNg0eLUmuhGXdVQFi56fM93kwIqqlUSVnWbgzf1oDYidrQbWfrf+hEvn2E8xyo191zRPQyDCIlwg6YJ6isQ==} + engines: {node: '>=14.17'} + hasBin: true + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -5630,6 +6007,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsforce@3.10.22: + resolution: {integrity: sha512-q4ZJTFyl2CDPnsGCsx/LttHMtbR1PEX+iOvpQMXDgJ0E7Lf0itMXTMhTnwOFIyAhZ26PNY5zNCs88STqE8iGCw==} + engines: {node: '>=22'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -5645,10 +6027,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stream-stringify@3.1.7: - resolution: {integrity: sha512-F4MWetLtY42YMaAKw5cV4e47zMD5aOT+tjjQWjX18ACtdkQ5Y/vrcfbcQ107Rh+MXjOCIx4KhW0wPmOvG8iQ5w==} - engines: {node: '>=7.10.1'} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -5743,28 +6121,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.33.0: resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.33.0: resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.33.0: resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.33.0: resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} @@ -5852,6 +6226,10 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -5862,6 +6240,10 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5872,6 +6254,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + lunr-languages@1.20.0: resolution: {integrity: sha512-3LVgE7ekWXt04NBci/hjm+NXJxXZeRXuyClL0kA0HONyBOjxhP3ZQkuWIM4Ok3pbeptUW/rj3XcJcJuJVPwPYA==} @@ -6137,10 +6523,19 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -6169,6 +6564,9 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimisted@2.0.1: + resolution: {integrity: sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==} + minimizer-webpack-plugin@5.6.1: resolution: {integrity: sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==} engines: {node: '>= 10.13.0'} @@ -6226,13 +6624,26 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msgpackr-extract@3.0.4: + resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} + hasBin: true + + msgpackr@1.12.1: + resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==} + multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true + multipasta@0.2.8: + resolution: {integrity: sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q==} + multistream@3.1.0: resolution: {integrity: sha512-zBgD3kn8izQAN/TaL1PCMv15vYpf+Vcrsfub06njuYVYlzUldzpopTlrEZ53pZVEbfn3Shtv7vRFoOv6LOV87Q==} + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + nanoid@3.3.16: resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -6261,6 +6672,10 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + netmask@2.1.1: + resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} + engines: {node: '>= 0.4.0'} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -6271,6 +6686,10 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -6285,6 +6704,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + normalize-url@8.1.1: resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} engines: {node: '>=14.16'} @@ -6347,6 +6770,10 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -6359,10 +6786,18 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + oxc-parser@0.139.0: resolution: {integrity: sha512-cf1TKZN+zc0lwqigeyXKzKVk5+vNRe99Or2+wVJsXLdlhJgC+gsIniYDfj/ZEBzCJ8Xm21ZG6YtMbR262CcS2w==} engines: {node: ^20.19.0 || >=22.12.0} + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -6415,6 +6850,14 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -6472,6 +6915,10 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -6514,6 +6961,10 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + pino-abstract-transport@1.2.0: resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} @@ -6550,6 +7001,10 @@ packages: resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} engines: {node: '>=16.0.0'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-attribute-case-insensitive@7.0.1: resolution: {integrity: sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==} engines: {node: '>=18'} @@ -7007,6 +7462,13 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} @@ -7018,6 +7480,9 @@ packages: resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} engines: {node: '>=12.20'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} @@ -7249,10 +7714,17 @@ packages: engines: {node: '>= 0.4'} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -7308,6 +7780,10 @@ packages: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -7422,6 +7898,11 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -7468,6 +7949,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -7492,9 +7979,21 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -7610,6 +8109,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strnum@2.4.2: + resolution: {integrity: sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==} + style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -7723,12 +8225,6 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - thingies@2.5.0: - resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - thingies@2.6.1: resolution: {integrity: sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw==} engines: {node: '>=10.18'} @@ -7738,6 +8234,9 @@ packages: thread-stream@3.2.0: resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -7780,6 +8279,10 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -7867,6 +8370,10 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -8013,6 +8520,9 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -8024,6 +8534,9 @@ packages: resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} engines: {node: '>=10.13.0'} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -8113,6 +8626,10 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -8129,6 +8646,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -8203,6 +8724,10 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + xml2js@0.6.2: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} @@ -8408,6 +8933,91 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 + '@azure-rest/core-client@2.8.0': + dependencies: + '@azure/abort-controller': 2.2.0 + '@azure/core-auth': 1.11.0 + '@azure/core-rest-pipeline': 1.25.0 + '@azure/core-tracing': 1.4.0 + '@typespec/ts-http-runtime': 0.3.8 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/abort-controller@2.2.0': + dependencies: + tslib: 2.8.1 + + '@azure/core-auth@1.11.0': + dependencies: + '@azure/abort-controller': 2.2.0 + '@azure/core-util': 1.14.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-client@1.11.0': + dependencies: + '@azure/abort-controller': 2.2.0 + '@azure/core-auth': 1.11.0 + '@azure/core-rest-pipeline': 1.25.0 + '@azure/core-tracing': 1.4.0 + '@azure/core-util': 1.14.0 + '@azure/logger': 1.4.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-rest-pipeline@1.25.0': + dependencies: + '@azure/abort-controller': 2.2.0 + '@azure/core-auth': 1.11.0 + '@azure/core-tracing': 1.4.0 + '@azure/core-util': 1.14.0 + '@azure/logger': 1.4.0 + '@typespec/ts-http-runtime': 0.3.8 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-tracing@1.4.0': + dependencies: + tslib: 2.8.1 + + '@azure/core-util@1.14.0': + dependencies: + '@azure/abort-controller': 2.2.0 + '@typespec/ts-http-runtime': 0.3.8 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/logger@1.4.0': + dependencies: + '@typespec/ts-http-runtime': 0.3.8 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/monitor-opentelemetry-exporter@1.0.0-beta.44': + dependencies: + '@azure-rest/core-client': 2.8.0 + '@azure/core-auth': 1.11.0 + '@azure/core-client': 1.11.0 + '@azure/core-rest-pipeline': 1.25.0 + '@azure/core-util': 1.14.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -9219,6 +9829,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/runtime-corejs3@7.29.7': + dependencies: + core-js-pure: 3.50.0 + '@babel/runtime@7.29.7': {} '@babel/template@7.29.7': @@ -10684,6 +11298,26 @@ snapshots: - utf-8-validate - webpack-cli + '@effect/opentelemetry@0.63.0(@effect/platform@0.96.3(effect@3.22.1))(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.219.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-web@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@3.22.1)': + dependencies: + '@effect/platform': 0.96.3(effect@3.22.1) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-web': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + effect: 3.22.1 + + '@effect/platform@0.96.3(effect@3.22.1)': + dependencies: + effect: 3.22.1 + find-my-way-ts: 0.1.6 + msgpackr: 1.12.1 + multipasta: 0.2.8 + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -10806,6 +11440,13 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@inquirer/external-editor@1.0.3(@types/node@22.20.1)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 22.20.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -11067,6 +11708,18 @@ snapshots: undici: 8.9.0 xml2js: 0.6.2 + '@jsforce/jsforce-node@3.10.22': + dependencies: + '@sindresorhus/is': 4.6.0 + base64url: 3.0.1 + csv-parse: 5.6.0 + csv-stringify: 6.8.0 + faye: 1.4.1 + form-data: 4.0.6 + multistream: 3.1.0 + undici: 8.9.0 + xml2js: 0.6.2 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -11156,7 +11809,7 @@ snapshots: '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) + thingies: 2.6.1(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 @@ -11268,6 +11921,24 @@ snapshots: '@module-federation/runtime': 0.22.0 '@module-federation/sdk': 0.22.0 + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + optional: true + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.11.3 @@ -11305,6 +11976,8 @@ snapshots: '@noble/hashes@1.4.0': {} + '@nodable/entities@3.0.0': {} + '@node-rs/jieba-android-arm-eabi@1.10.4': optional: true @@ -11378,6 +12051,143 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@opentelemetry/api-logs@0.219.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api-logs@0.220.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/context-async-hooks@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/exporter-trace-otlp-http@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-exporter-base@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-transformer@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/resources@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/resources@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.220.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.10.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-metrics@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-trace-node@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-trace-web@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-trace@2.10.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/semantic-conventions@1.43.0': {} + '@oxc-parser/binding-android-arm-eabi@0.139.0': optional: true @@ -11859,21 +12669,31 @@ snapshots: '@rspack/lite-tapable@1.1.0': {} - '@salesforce/apex-node@9.0.2': + '@salesforce/core@9.1.0': dependencies: - '@salesforce/core': 9.1.0 + '@jsforce/jsforce-node': 3.10.19 '@salesforce/kit': 4.0.0 - '@types/istanbul-reports': 3.0.4 - fast-glob: 3.3.3 + '@salesforce/ts-types': 3.0.1 + ajv: 8.20.0 + change-case: 4.1.2 + fast-levenshtein: 3.0.0 faye: 1.4.1 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 - json-stream-stringify: 3.1.7 + form-data: 4.0.6 + js2xmlparser: 4.0.2 + jsonwebtoken: 9.0.3 + jszip: 3.10.1 + memfs: 4.38.1 + pino: 9.14.0 + pino-abstract-transport: 1.2.0 + pino-pretty: 11.3.0 + proper-lockfile: 4.1.2 + semver: 7.8.5 + ts-retry-promise: 0.8.1 + zod: 4.4.3 - '@salesforce/core@9.1.0': + '@salesforce/core@9.1.4': dependencies: - '@jsforce/jsforce-node': 3.10.19 + '@jsforce/jsforce-node': 3.10.22 '@salesforce/kit': 4.0.0 '@salesforce/ts-types': 3.0.1 ajv: 8.20.0 @@ -11897,8 +12717,68 @@ snapshots: dependencies: '@salesforce/ts-types': 3.0.1 + '@salesforce/source-deploy-retrieve@13.2.0': + dependencies: + '@salesforce/core': 9.1.4 + '@salesforce/kit': 4.0.0 + '@salesforce/ts-types': 3.0.1 + '@salesforce/types': 1.8.0 + fast-levenshtein: 3.0.0 + fast-xml-parser: 5.11.0 + got: 11.8.6 + graceful-fs: 4.2.11 + ignore: 5.3.2 + jszip: 3.10.1 + mime: 2.6.0 + minimatch: 9.0.9 + proxy-agent: 6.5.0 + yaml: 2.9.0 + transitivePeerDependencies: + - supports-color + + '@salesforce/source-tracking@8.1.0': + dependencies: + '@salesforce/core': 9.1.4 + '@salesforce/kit': 4.0.0 + '@salesforce/source-deploy-retrieve': 13.2.0 + '@salesforce/ts-types': 3.0.1 + fast-xml-parser: 5.11.0 + graceful-fs: 4.2.11 + isomorphic-git: 1.41.7 + ts-retry-promise: 0.8.1 + transitivePeerDependencies: + - supports-color + '@salesforce/ts-types@3.0.1': {} + '@salesforce/types@1.8.0': {} + + '@salesforce/vscode-services@67.13.3(@effect/platform@0.96.3(effect@3.22.1))(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(@types/node@22.20.1)': + dependencies: + '@azure/monitor-opentelemetry-exporter': 1.0.0-beta.44 + '@effect/opentelemetry': 0.63.0(@effect/platform@0.96.3(effect@3.22.1))(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.219.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-web@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@3.22.1) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-web': 2.8.0(@opentelemetry/api@1.9.1) + '@salesforce/core': 9.1.0 + '@salesforce/source-deploy-retrieve': 13.2.0 + '@salesforce/source-tracking': 8.1.0 + '@types/vscode': 1.102.0 + effect: 3.22.1 + jsforce: 3.10.22(@types/node@22.20.1) + vscode-uri: 3.1.0 + transitivePeerDependencies: + - '@effect/platform' + - '@opentelemetry/resources' + - '@opentelemetry/semantic-conventions' + - '@types/node' + - supports-color + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -11939,6 +12819,8 @@ snapshots: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 + '@standard-schema/spec@1.1.0': {} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -12157,10 +13039,16 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 @@ -12196,6 +13084,13 @@ snapshots: dependencies: '@types/node': 22.20.1 + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 22.20.1 + '@types/responselike': 1.0.3 + '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.2 @@ -12280,6 +13175,10 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.20.1 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -12331,6 +13230,10 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.20.1 + '@types/sax@1.2.7': dependencies: '@types/node': 22.20.1 @@ -12527,6 +13430,14 @@ snapshots: dependencies: '@typescript/old': typescript@6.0.3 + '@typespec/ts-http-runtime@0.3.8': + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@ungap/structured-clone@1.3.0': {} '@ungap/structured-clone@1.3.1': {} @@ -12821,6 +13732,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 4.0.5 + anynum@1.0.1: {} + arg@5.0.2: {} argparse@1.0.10: @@ -12839,8 +13752,14 @@ snapshots: pvutils: 1.1.5 tslib: 2.8.1 + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + astring@1.9.0: {} + async-lock@1.4.1: {} + asynckit@0.4.0: {} atomic-sleep@1.0.0: {} @@ -12854,6 +13773,10 @@ snapshots: postcss: 8.5.25 postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + babel-jest@30.4.1(@babel/core@7.29.7): dependencies: '@babel/core': 7.29.7 @@ -12963,12 +13886,20 @@ snapshots: baseline-browser-mapping@2.11.7: {} + basic-ftp@5.3.1: {} + batch@0.6.1: {} big.js@5.2.2: {} binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + body-parser@2.3.0: dependencies: bytes: 3.1.2 @@ -13048,6 +13979,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -13063,6 +13999,8 @@ snapshots: bytestreamjs@2.0.1: {} + cacheable-lookup@5.0.4: {} + cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -13075,6 +14013,16 @@ snapshots: normalize-url: 8.1.1 responselike: 3.0.0 + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -13156,6 +14104,8 @@ snapshots: character-reference-invalid@2.0.1: {} + chardet@2.2.0: {} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 @@ -13217,16 +14167,26 @@ snapshots: dependencies: source-map: 0.6.1 + clean-git-ref@2.0.1: {} + clean-stack@2.2.0: {} cli-boxes@3.0.0: {} + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + cli-table3@0.6.5: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 + cli-width@3.0.0: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -13245,6 +14205,12 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + clsx@2.1.1: {} co@4.6.0: {} @@ -13279,6 +14245,8 @@ snapshots: commander@2.20.3: {} + commander@4.1.1: {} + commander@5.1.0: {} commander@7.2.0: {} @@ -13367,6 +14335,8 @@ snapshots: dependencies: browserslist: 4.28.7 + core-js-pure@3.50.0: {} + core-js@3.49.0: {} core-util-is@1.0.3: {} @@ -13380,6 +14350,8 @@ snapshots: optionalDependencies: typescript: '@typescript/typescript6@6.0.2' + crc-32@1.2.2: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -13542,6 +14514,8 @@ snapshots: csv-stringify@6.8.0: {} + data-uri-to-buffer@6.0.2: {} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -13584,6 +14558,10 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 + defaults@1.0.4: + dependencies: + clone: 1.0.4 + defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -13602,6 +14580,12 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delayed-stream@1.0.0: {} depd@1.1.2: {} @@ -13622,6 +14606,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff3@0.0.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -13695,6 +14681,11 @@ snapshots: ee-first@1.1.1: {} + effect@3.22.1: + dependencies: + '@standard-schema/spec': 1.1.0 + fast-check: 3.23.2 + electron-to-chromium@1.5.360: {} electron-to-chromium@1.5.398: {} @@ -13747,10 +14738,6 @@ snapshots: es-module-lexer@2.3.1: {} - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -13782,12 +14769,22 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-config-prettier@10.1.8(eslint@10.8.0(jiti@1.21.7)): dependencies: eslint: 10.8.0(jiti@1.21.7) @@ -13985,6 +14982,10 @@ snapshots: extend@3.0.2: {} + fast-check@3.23.2: + dependencies: + pure-rand: 6.1.0 + fast-copy@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -14011,6 +15012,20 @@ snapshots: fast-uri@4.0.0: {} + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.0: + dependencies: + '@nodable/entities': 3.0.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.2 + path-expression-matcher: 1.6.2 + strnum: 2.4.2 + xml-naming: 0.3.0 + fastest-levenshtein@1.0.16: {} fastq@1.20.1: @@ -14050,6 +15065,10 @@ snapshots: dependencies: xml-js: 1.6.11 + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -14080,6 +15099,8 @@ snapshots: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 + find-my-way-ts@0.1.6: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -14104,6 +15125,10 @@ snapshots: flatted@3.4.2: {} + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -14163,7 +15188,7 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 @@ -14178,7 +15203,11 @@ snapshots: get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.4 get-stream@6.0.1: {} @@ -14186,6 +15215,14 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: + dependencies: + basic-ftp: 5.3.1 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + gifuct-js@2.1.2: dependencies: js-binary-schema-parser: 2.0.3 @@ -14256,6 +15293,20 @@ snapshots: gopd@1.2.0: {} + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -14511,6 +15562,11 @@ snapshots: transitivePeerDependencies: - supports-color + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -14588,10 +15644,32 @@ snapshots: inline-style-parser@0.2.7: {} + inquirer@8.2.7(@types/node@22.20.1): + dependencies: + '@inquirer/external-editor': 1.0.3(@types/node@22.20.1) + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + figures: 3.2.0 + lodash: 4.18.1 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + transitivePeerDependencies: + - '@types/node' + invariant@2.2.4: dependencies: loose-envify: 1.4.0 + ip-address@10.5.0: {} + ipaddr.js@1.9.1: {} ipaddr.js@2.4.0: {} @@ -14609,6 +15687,8 @@ snapshots: dependencies: binary-extensions: 2.3.0 + is-callable@1.2.7: {} + is-ci@3.0.1: dependencies: ci-info: 3.9.0 @@ -14648,6 +15728,8 @@ snapshots: global-dirs: 3.0.1 is-path-inside: 3.0.3 + is-interactive@1.0.0: {} + is-module@1.0.0: {} is-network-error@1.3.2: {} @@ -14682,8 +15764,16 @@ snapshots: is-stream@2.0.1: {} + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + is-typedarray@1.0.0: {} + is-unicode-supported@0.1.0: {} + + is-unsafe@2.0.2: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -14698,12 +15788,28 @@ snapshots: isarray@1.0.0: {} + isarray@2.0.5: {} + isexe@2.0.0: {} ismobilejs@1.1.1: {} isobject@3.0.1: {} + isomorphic-git@1.41.7: + dependencies: + async-lock: 1.4.1 + clean-git-ref: 2.0.1 + crc-32: 1.2.2 + diff3: 0.0.3 + ignore: 5.3.2 + minimisted: 2.0.1 + pako: 1.0.11 + pify: 4.0.1 + readable-stream: 4.7.0 + sha.js: 2.4.12 + simple-get: 4.0.1 + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@6.0.3: @@ -15142,6 +16248,26 @@ snapshots: jsesc@3.1.0: {} + jsforce@3.10.22(@types/node@22.20.1): + dependencies: + '@babel/runtime': 7.29.7 + '@babel/runtime-corejs3': 7.29.7 + '@sindresorhus/is': 4.6.0 + base64url: 3.0.1 + commander: 4.1.1 + core-js: 3.49.0 + csv-parse: 5.6.0 + csv-stringify: 6.8.0 + faye: 1.4.1 + form-data: 4.0.6 + inquirer: 8.2.7(@types/node@22.20.1) + multistream: 3.1.0 + open: 7.4.2 + undici: 8.9.0 + xml2js: 0.6.2 + transitivePeerDependencies: + - '@types/node' + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -15152,8 +16278,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json-stream-stringify@3.1.7: {} - json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -15348,6 +16472,11 @@ snapshots: lodash@4.18.1: {} + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -15358,6 +16487,8 @@ snapshots: dependencies: tslib: 2.8.1 + lowercase-keys@2.0.0: {} + lowercase-keys@3.0.0: {} lru-cache@10.4.3: {} @@ -15366,6 +16497,8 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@7.18.3: {} + lunr-languages@1.20.0: {} lunr@2.3.9: {} @@ -15934,8 +17067,12 @@ snapshots: dependencies: mime-db: 1.54.0 + mime@2.6.0: {} + mimic-fn@2.1.0: {} + mimic-response@1.0.1: {} + mimic-response@3.1.0: {} mimic-response@4.0.0: {} @@ -15960,6 +17097,10 @@ snapshots: minimist@1.2.8: {} + minimisted@2.0.1: + dependencies: + minimist: 1.2.8 + minimizer-webpack-plugin@5.6.1(@swc/core@1.15.47(@swc/helpers@0.5.23))(@swc/html@1.15.47)(lightningcss@1.33.0)(postcss@8.5.25)(webpack@5.109.2(@swc/core@1.15.47(@swc/helpers@0.5.23))(postcss@8.5.25)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -16006,16 +17147,36 @@ snapshots: ms@2.1.3: {} + msgpackr-extract@3.0.4: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 + optional: true + + msgpackr@1.12.1: + optionalDependencies: + msgpackr-extract: 3.0.4 + multicast-dns@7.2.5: dependencies: dns-packet: 5.6.1 thunky: 1.1.0 + multipasta@0.2.8: {} + multistream@3.1.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 + mute-stream@0.0.8: {} + nanoid@3.3.16: {} napi-postinstall@0.3.4: {} @@ -16030,6 +17191,8 @@ snapshots: neo-async@2.6.2: {} + netmask@2.1.1: {} + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -16045,6 +17208,11 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + optional: true + node-int64@0.4.0: {} node-releases@2.0.44: {} @@ -16053,6 +17221,8 @@ snapshots: normalize-path@3.0.0: {} + normalize-url@6.1.0: {} + normalize-url@8.1.1: {} npm-run-path@4.0.1: @@ -16113,6 +17283,11 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -16130,6 +17305,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + oxc-parser@0.139.0: dependencies: '@oxc-project/types': 0.139.0 @@ -16155,6 +17342,8 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.139.0 '@oxc-parser/binding-win32-x64-msvc': 0.139.0 + p-cancelable@2.1.1: {} + p-cancelable@3.0.0: {} p-finally@1.0.0: {} @@ -16202,6 +17391,24 @@ snapshots: p-try@2.2.0: {} + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.1.1 + package-json-from-dist@1.0.1: {} package-json@8.1.1: @@ -16272,6 +17479,8 @@ snapshots: path-exists@5.0.0: {} + path-expression-matcher@1.6.2: {} + path-is-absolute@1.0.1: {} path-is-inside@1.0.2: {} @@ -16301,6 +17510,8 @@ snapshots: picomatch@4.0.5: {} + pify@4.0.1: {} + pino-abstract-transport@1.2.0: dependencies: readable-stream: 4.7.0 @@ -16375,6 +17586,8 @@ snapshots: pvutils: 1.1.5 tslib: 2.8.1 + possible-typed-array-names@1.1.0: {} + postcss-attribute-case-insensitive@7.0.1(postcss@8.5.25): dependencies: postcss: 8.5.25 @@ -16878,6 +18091,21 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + pump@3.0.4: dependencies: end-of-stream: 1.4.5 @@ -16889,6 +18117,8 @@ snapshots: dependencies: escape-goat: 4.0.0 + pure-rand@6.1.0: {} + pure-rand@7.0.1: {} pvtsutils@1.3.6: @@ -17191,10 +18421,19 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + retry@0.12.0: {} reusify@1.1.0: {} @@ -17300,6 +18539,8 @@ snapshots: run-applescript@7.1.0: {} + run-async@2.4.1: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -17441,6 +18682,12 @@ snapshots: setprototypeof@1.2.0: {} + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 @@ -17489,6 +18736,14 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.29 @@ -17512,11 +18767,26 @@ snapshots: slash@4.0.0: {} + smart-buffer@4.2.0: {} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.8.1 + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.9 + transitivePeerDependencies: + - supports-color + + socks@2.8.9: + dependencies: + ip-address: 10.5.0 + smart-buffer: 4.2.0 + sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -17619,6 +18889,10 @@ snapshots: strip-json-comments@3.1.1: {} + strnum@2.4.2: + dependencies: + anynum: 1.0.1 + style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -17707,10 +18981,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.5 - thingies@2.5.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - thingies@2.6.1(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -17719,6 +18989,8 @@ snapshots: dependencies: real-require: 0.2.0 + through@2.3.8: {} + thunky@1.1.0: {} tiny-invariant@1.3.3: {} @@ -17750,6 +19022,12 @@ snapshots: tmpl@1.0.5: {} + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -17816,6 +19094,12 @@ snapshots: media-typer: 1.1.1 mime-types: 3.0.2 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -18028,6 +19312,8 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + vscode-uri@3.1.0: {} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -18040,6 +19326,10 @@ snapshots: dependencies: graceful-fs: 4.2.11 + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} webidl-conversions@7.0.0: {} @@ -18259,6 +19549,16 @@ snapshots: tr46: 5.1.1 webidl-conversions: 7.0.0 + which-typed-array@1.1.22: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + 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@2.0.2: dependencies: isexe: 2.0.0 @@ -18271,6 +19571,12 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -18322,6 +19628,8 @@ snapshots: xml-name-validator@5.0.0: {} + xml-naming@0.3.0: {} + xml2js@0.6.2: dependencies: sax: 1.6.1 @@ -18337,8 +19645,7 @@ snapshots: yallist@3.1.1: {} - yaml@2.9.0: - optional: true + yaml@2.9.0: {} yargs-parser@21.1.1: {} diff --git a/rollup.config.mjs b/rollup.config.mjs index 76e8c4e82..10807fc7d 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -58,33 +58,6 @@ export default [ }, }), ), - // Copy runtime dependency files for salesforce bundle compatibility - copy({ - targets: [ - // Pino worker files (thread-stream requires these at runtime) - { - src: 'node_modules/.pnpm/thread-stream@*/node_modules/thread-stream/lib/worker.js', - dest: 'lana/out', - rename: 'thread-stream-worker.js', - }, - { - src: 'node_modules/.pnpm/pino@*/node_modules/pino/lib/worker.js', - dest: 'lana/out', - rename: 'pino-worker.js', - }, - { - src: 'node_modules/.pnpm/pino@*/node_modules/pino/file.js', - dest: 'lana/out', - rename: 'pino-file.js', - }, - // @salesforce/core logger transform stream (pino transport pipeline) - { - src: 'node_modules/.pnpm/@salesforce+core@*/node_modules/@salesforce/core/lib/logger/transformStream.js', - dest: 'lana/out', - rename: 'salesforce-transform-stream.js', - }, - ], - }), ], }, {