diff --git a/README.md b/README.md index 243a35ff..43716811 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ You can **install the extension in VSCode from [HERE](https://marketplace.visual - [x] **Hover information** - [x] **Signature type hints** Trigger characters are both `(` and ` ` (space) - [x] **Document highlight** -- [ ] *missing* Document symbols ("Outline"): Removed again, as they mainly led to problems. If you want symbols, additionally install [Yorkxin's extension](https://github.com/yorkxin/vscode-coffeescript-support). It's marked as deprecated but can provide this feature well. +- [x] Document symbols ("Outline") - [x] **Find definition** - [x] **Find references** - **Code actions**: Organize imports only. Probably only rarely works as you intend it to. Auto imports: Not implemented as code actions, but works while autocompleting. diff --git a/client/client.ts b/client/client.ts index 47d57bca..818840b7 100644 --- a/client/client.ts +++ b/client/client.ts @@ -40,7 +40,8 @@ export function initializeLanguageClient(lspModulePath: string): LanguageClient const clientOptions: LanguageClientOptions = { documentSelector, synchronize: { - configurationSection: ['coffeesense', 'javascript', 'typescript', 'files.associations'], + // Also sync VS Code outline settings so the server can sort DocumentSymbols accordingly + configurationSection: ['coffeesense', 'javascript', 'typescript', 'files.associations', 'outline'], fileEvents: vscode.workspace.createFileSystemWatcher('{**/*.js,**/*.ts,**/*.json}', false, false, true) }, initializationOptions: { diff --git a/server/package.json b/server/package.json index 88c76949..58b2c02a 100644 --- a/server/package.json +++ b/server/package.json @@ -22,7 +22,7 @@ }, "homepage": "https://github.com/phil294/coffeesense/tree/master/server", "dependencies": { - "coffeescript": "github:edemaine/coffeescript#var-assign", + "coffeescript": "github:sergioalcaraz/coffeescript#var-assign", "jshashes": "^1.0.8", "typescript": "^5.1.6", "volatile-map": "^2.0.0", diff --git a/server/src/embeddedSupport/languageModes.ts b/server/src/embeddedSupport/languageModes.ts index 262b76bb..6689e34b 100644 --- a/server/src/embeddedSupport/languageModes.ts +++ b/server/src/embeddedSupport/languageModes.ts @@ -11,7 +11,8 @@ import { Position, CodeActionContext, CodeAction, - TextDocumentEdit + TextDocumentEdit, + DocumentSymbol } from 'vscode-languageserver-types'; import type { TextDocument } from 'vscode-languageserver-textdocument'; @@ -50,6 +51,7 @@ export interface LanguageMode { findDocumentHighlight?(document: TextDocument, position: Position): DocumentHighlight[]; findDefinition?(document: TextDocument, position: Position): Definition; findReferences?(document: TextDocument, position: Position): Location[]; + findDocumentSymbols?(document: TextDocument): DocumentSymbol[]; onDocumentChanged?(filePath: string): void; onDocumentRemoved(document: TextDocument): void; diff --git a/server/src/modes/script/javascript.ts b/server/src/modes/script/javascript.ts index 758ed13f..939919d5 100644 --- a/server/src/modes/script/javascript.ts +++ b/server/src/modes/script/javascript.ts @@ -4,7 +4,7 @@ import { CodeAction, CodeActionContext, CodeActionKind, CompletionItem, CompletionItemKind, CompletionItemTag, CompletionList, Definition, Diagnostic, DiagnosticSeverity, DiagnosticTag, DocumentHighlight, DocumentHighlightKind, Hover, Location, MarkedString, MarkupContent, ParameterInformation, Position, Range, SignatureHelp, - SignatureInformation, TextEdit + SignatureInformation, TextEdit, DocumentSymbol, SymbolKind } from 'vscode-languageserver-types'; import { URI } from 'vscode-uri'; import { CoffeescriptDocumentRegions, LanguageId } from '../../embeddedSupport/embeddedSupport'; @@ -15,6 +15,7 @@ import { DependencyService, RuntimeLibrary } from '../../services/dependencyServ import { DocumentService } from '../../services/documentService'; import { EnvironmentService } from '../../services/EnvironmentService'; import transpile_service, { common_js_variable_name_character, get_line_at_line_no, get_word_around_position, pseudo_compile_coffee } from '../../services/transpileService'; +import { getDocumentSymbolsFromCoffee } from '../../services/coffeeAstService'; import { IServiceHost } from '../../services/typescriptService/serviceHost'; import { toCompletionItemKind } from '../../services/typescriptService/util'; import { CodeActionData, CodeActionDataKind, OrganizeImportsActionData } from '../../types'; @@ -23,6 +24,7 @@ import { getFileFsPath, getFilePath } from '../../utils/paths'; import { NULL_SIGNATURE } from '../nullMode'; import * as Previewer from './previewer'; import { HighlightSpanKind } from 'typescript'; +import { logger } from '../../log'; @@ -896,9 +898,74 @@ export async function getJavascriptMode( delete action.data; return action; }, + findDocumentSymbols(coffee_doc: TextDocument): DocumentSymbol[] { + try { + const symbols = getDocumentSymbolsFromCoffee(coffee_doc); + if (symbols && symbols.length) return symbols; + } catch (e: any) { + logger.logDebug('coffeeAstService failed: ' + (e && e.message)); + } + + // Fallback: TypeScript navigation + source maps (existing logic) + const transpilation = transpile_service.result_by_uri.get(coffee_doc.uri) + const { scriptDoc: js_doc, service } = updateCurrentCoffeescriptTextDocument(coffee_doc); + if (!languageServiceIncludesFile(service, coffee_doc.uri)) { + return []; + } + const fileFsPath = getFileFsPath(js_doc.uri); + const nav = service.getNavigationTree(fileFsPath); + if (!nav || !nav.childItems) return []; + const mapKind = (k: string) => { + switch ((k || '').toLowerCase()) { + case 'module': return SymbolKind.Module; + case 'class': return SymbolKind.Class; + case 'method': return SymbolKind.Method; + case 'function': return SymbolKind.Function; + case 'constructor': return SymbolKind.Constructor; + case 'property': return SymbolKind.Property; + case 'var': + case 'local': + case 'const': + case 'let': + return SymbolKind.Variable; + case 'interface': return SymbolKind.Interface; + case 'enum': return SymbolKind.Enum; + default: return SymbolKind.Object; + } + }; + const convertNode = (node: any): DocumentSymbol | null => { + const span = (node.spans && node.spans.length) ? node.spans[0] : node.textSpan || node.nameSpan; + if (!span) return null; + let range = convertRange(js_doc, span); + let selectionRange = range; + if (node.nameSpan) selectionRange = convertRange(js_doc, node.nameSpan); + if (transpilation?.source_map) { + const coffee_range = transpile_service.range_js_to_coffee(transpilation, range, coffee_doc); + const coffee_selection = transpile_service.range_js_to_coffee(transpilation, selectionRange, coffee_doc); + if (coffee_range) range = coffee_range; + if (coffee_selection) selectionRange = coffee_selection; + else if (coffee_range) selectionRange = range; + } else { + return null; + } + const children = (node.childItems || []).map((c: any) => convertNode(c)).filter((c: any) => c) as DocumentSymbol[]; + return { + name: node.text || node.kind || '', + detail: '', + kind: mapKind(node.kind), + range, + selectionRange, + children: children.length ? children : undefined + } as DocumentSymbol; + }; + const symbols = (nav.childItems || []).map((c: any) => convertNode(c)).filter((s: any) => s) as DocumentSymbol[]; + return symbols; + }, + onDocumentRemoved(document: TextDocument) { jsDocuments.onDocumentRemoved(document); }, + onDocumentChanged(filePath: string) { serviceHost.updateExternalDocument(filePath); }, diff --git a/server/src/services/coffeeAstService.ts b/server/src/services/coffeeAstService.ts new file mode 100644 index 00000000..a8ff4b25 --- /dev/null +++ b/server/src/services/coffeeAstService.ts @@ -0,0 +1,461 @@ +import { TextDocument } from 'vscode-languageserver-textdocument'; +import { DocumentSymbol, Range, SymbolKind, Position } from 'vscode-languageserver-types'; +import { logger } from '../log'; + +// Parse CoffeeScript AST (via CoffeeScript.compile(..., { ast: true })) and produce LSP DocumentSymbols +export function getDocumentSymbolsFromCoffee(doc: TextDocument): DocumentSymbol[] { + const text = doc.getText(); + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const Coffee: any = require('coffeescript'); + if (!Coffee || typeof Coffee.compile !== 'function') { + logger.logDebug && logger.logDebug('coffeescript not found'); + return []; + } + + const ast = Coffee.compile(text, { ast: true }); + if (!ast) return []; + + const flat: { sym: DocumentSymbol; start: number; end: number }[] = []; + const seen = new WeakSet(); + + const toRange = (node: any): Range | null => { + if (!node) return null; + + if (Array.isArray(node.range) && typeof node.range[0] === 'number') { + const start = node.range[0] as number; + const end = node.range[1] as number; + return Range.create(doc.positionAt(start), doc.positionAt(end)); + } + + if (typeof node.start === 'number' && typeof node.end === 'number') { + return Range.create(doc.positionAt(node.start), doc.positionAt(node.end)); + } + + const loc = node.loc || node.location || node.locationData || node.astLocation || node.rangeData; + if (loc && loc.start && typeof loc.start.line === 'number') { + const sLine = Math.max(0, (loc.start.line || 0) - 1); + const sCol = loc.start.column ?? loc.start.column0 ?? 0; + const eLine = Math.max(0, (loc.end?.line ?? loc.last_line ?? loc.start.line) - 1); + const eCol = loc.end?.column ?? loc.last_column ?? loc.start.column ?? 0; + return Range.create(Position.create(sLine, sCol), Position.create(eLine, eCol)); + } + + if (typeof node.first_line === 'number') { + const sLine = node.first_line; + const sCol = node.first_column ?? 0; + const eLine = node.last_line ?? sLine; + const eCol = (node.last_column ?? node.first_column ?? 0) + 1; + return Range.create(Position.create(sLine, sCol), Position.create(eLine, eCol)); + } + + return null; + }; + + const getName = (node: any): string | undefined => { + if (!node) return undefined; + if (typeof node.name === 'string' && node.name.trim()) return node.name; + if (node.name && typeof node.name.value === 'string') return node.name.value; + if (node.id && typeof node.id === 'object' && typeof node.id.name === 'string') return node.id.name; + if (node.key && typeof node.key === 'object' && typeof node.key.name === 'string') return node.key.name; + if (node.variable && node.variable.base && typeof node.variable.base.value === 'string') return node.variable.base.value; + if (node.variable && typeof node.variable.name === 'string') return node.variable.name; + if (node.id && node.id.base && typeof node.id.base.value === 'string') return node.id.base.value; + if (node.id && typeof node.id === 'string') return node.id; + if (node.identifier && typeof node.identifier === 'string') return node.identifier; + if (node.literal && typeof node.literal === 'string') return node.literal; + if (node.value && typeof node.value === 'string') return node.value; + if (node.type === 'Class' && node.variable && node.variable.base && node.variable.base.value) return node.variable.base.value; + return undefined; + }; + + // Try to build a dotted name for member expressions (e.g. module.exports, exports.foo) + const getFullName = (node: any): string | undefined => { + if (!node || typeof node !== 'object') return undefined; + + const tryGet = (n: any): string | undefined => { + if (!n) return undefined; + // direct name + const direct = getName(n); + if (direct) return direct; + + // common shapes: base.property, object.property, variable.base + variable.name + const base = n.base || n.object || n.subject || n.receiver || n.left || (n.variable && n.variable.base); + const prop = n.property || n.propertyName || n.member || n.index || n.key || n.name; + + const baseName = tryGet(base) || getName(base); + const propName = getName(prop) || (typeof prop === 'string' ? prop : undefined) || (Array.isArray(n.properties) && n.properties.length ? getName(n.properties[0]) : undefined); + + if (baseName && propName) return `${baseName}.${propName}`; + + // fallback: some nodes expose id/base.name + if (n.id && n.id.base && n.id.base.value) { + const idBase = n.id.base.value; + const idName = (n.id.name || n.id.base.name || n.id.value); + if (idBase && idName) return `${idBase}.${idName}`; + } + + return undefined; + }; + + return tryGet(node); + }; + + + const kindFromNode = (node: any): SymbolKind => { + const t = (node && (node.type || node.constructor?.name || '')).toString().toLowerCase(); + if (t.includes('class')) return SymbolKind.Class; + if (t.includes('constructor')) return SymbolKind.Constructor; + if (t.includes('method')) return SymbolKind.Method; + if (t.includes('function') || t.includes('code') || t.includes('lambda') || t.includes('func')) return SymbolKind.Function; + if (t.includes('property')) return SymbolKind.Property; + if (t.includes('assign') || t.includes('var') || t.includes('value')) return SymbolKind.Variable; + if (t.includes('module')) return SymbolKind.Module; + return SymbolKind.Object; + }; + + // eslint-disable-next-line no-inner-declarations + function isSymbolCandidate(node: any, parent: any): boolean { + if (!node) return false; + const t = (node.type || node.constructor?.name || '').toString().toLowerCase(); + if (t.includes('class')) return true; + if (t.includes('method') || t.includes('classmethod')) return true; + if (t.includes('constructor')) return true; + // include any function / code node (including anonymous functions / closures) + if (t.includes('function') || t.includes('lambda') || t.includes('code') || t.includes('functionexpression')) return true; + // include object / property nodes so object literal structure can appear in outline + if (t.includes('object') || t.includes('property') || t.includes('objectexpression')) return true; + // include ES module import and export declarations + if (t.includes('import') || t.includes('export')) return true; + + const pt = parent ? (parent.type || parent.constructor?.name || '').toString().toLowerCase() : ''; + if (pt.includes('assign') || pt.includes('assignment') || pt.includes('assignmentexpression')) return true; + if (parent && parent.variable) return true; + + // assignments to this/@ should be considered property declarations + if (node.variable && node.variable.base && (node.variable.base.type === 'ThisExpression' || node.variable.base.type === 'This')) return true; + + return false; + } + + // eslint-disable-next-line no-inner-declarations + function collect(node: any, parent?: any, propName?: string) { + if (!node || typeof node !== 'object') return; + if (seen.has(node)) return; + seen.add(node); + + const nodeType = (node.type || node.constructor?.name || '').toString().toLowerCase(); + + // Skip primitive literal nodes (null/boolean/number/string) to reduce outline noise. + // Their enclosing assignment or property will be collected instead. + if (nodeType.includes('literal') || nodeType.includes('null') || nodeType.includes('boolean') || nodeType.includes('numeric') || nodeType.includes('number') || nodeType.includes('string')) { + return; // primitives don't become symbols themselves + } + + // Special-case: assignment nodes -> create a symbol from the left-hand side + const isAssignType = nodeType.includes('assign') || nodeType.includes('assignment') || nodeType.includes('assignmentexpression'); + if (isAssignType) { + const left = node.left || node.lhs || node.lvalue || node.id || node.variable || node.leftHandSide || node.target; + const right = node.right || node.value || node.init || node.expression || node.rvalue || node.initializer || node.rightHandSide; + const leftName = getFullName(left) || getName(left) || getName(node); + const assignRange = toRange(node) || toRange(left) || toRange(right); + if (leftName && assignRange) { + const rt = (right && (right.type || right.constructor?.name || '')).toString().toLowerCase(); + let symKind: SymbolKind = SymbolKind.Variable; + if (rt.includes('function') || rt.includes('lambda') || rt.includes('code') || rt.includes('functionexpression')) { + symKind = SymbolKind.Function; + } else if (rt.includes('object') || rt.includes('objectexpression') || rt.includes('objectliteral') || rt.includes('property')) { + symKind = SymbolKind.Variable; + } + + const sel = toRange(left) || assignRange; + const rStart = doc.offsetAt(assignRange.start); + const rEnd = doc.offsetAt(assignRange.end); + let sStart = doc.offsetAt(sel.start); + let sEnd = doc.offsetAt(sel.end); + if (sStart < rStart) sStart = rStart; + if (sEnd > rEnd) sEnd = rEnd; + if (sEnd < sStart) sEnd = sStart; + + const selectionRange = Range.create(doc.positionAt(sStart), doc.positionAt(sEnd)); + const sym: DocumentSymbol = { + name: leftName, + detail: (right && right.type) || (node.type || '') as string, + kind: symKind, + range: assignRange, + selectionRange, + children: undefined + }; + flat.push({ sym, start: rStart, end: rEnd }); + + // Mark left processed so the identifier itself is not emitted separately + if (left && typeof left === 'object') seen.add(left); + } + // continue traversal into right side to collect object properties / nested functions + } + + // Special-case: import declarations -> create symbols for imported bindings (ES modules) + if (nodeType.includes('import')) { + const specifiers = node.specifiers || node.imports || node.specifiersList || node.specifier || []; + const source = node.source || node.from || node.module || node.path; + if (Array.isArray(specifiers) && specifiers.length) { + for (const spec of specifiers) { + const local = spec.local || spec.name || spec.id || spec.variable; + const localName = getName(local) || getName(spec) || getName(node) || (typeof spec === 'string' ? spec : undefined); + const importRange = toRange(spec) || toRange(local) || toRange(node); + if (localName && importRange) { + const sel = toRange(local) || importRange; + const rStart = doc.offsetAt(importRange.start); + const rEnd = doc.offsetAt(importRange.end); + let sStart = doc.offsetAt(sel.start); + let sEnd = doc.offsetAt(sel.end); + if (sStart < rStart) sStart = rStart; + if (sEnd > rEnd) sEnd = rEnd; + if (sEnd < sStart) sEnd = sStart; + const selectionRange = Range.create(doc.positionAt(sStart), doc.positionAt(sEnd)); + const detail = (source && (source.value || source.name || source.literal || source)) || (node.type || ''); + const sym: DocumentSymbol = { + name: localName, + detail: detail as string, + kind: SymbolKind.Module, + range: importRange, + selectionRange, + children: undefined + }; + flat.push({ sym, start: rStart, end: rEnd }); + if (local && typeof local === 'object') seen.add(local); + } + } + } else { + // side-effect import like `import 'module'` - emit module name if available + const modName = (source && (source.value || source.name || source.literal || source)) || getName(node); + const importRange = toRange(node); + if (modName && importRange) { + const rStart = doc.offsetAt(importRange.start); + const rEnd = doc.offsetAt(importRange.end); + const selectionRange = importRange; + const sym: DocumentSymbol = { + name: String(modName), + detail: (node.type || '') as string, + kind: SymbolKind.Module, + range: importRange, + selectionRange, + children: undefined + }; + flat.push({ sym, start: rStart, end: rEnd }); + } + } + } + + // Special-case: export declarations -> create symbols for exported bindings (ES modules) + if (nodeType.includes('export')) { + const specifiers = node.specifiers || node.exports || node.specifiersList || node.specifier || node.exported || []; + const source = node.source || node.from || node.module || node.path; + const decl = node.declaration || node.decl || node.declared || node.expression || node.value || node.right || node.default || node.exportedDecl; + + const computeRangeFromChildren = (n: any): Range | null => { + if (!n || typeof n !== 'object') return null; + const localSeen = new WeakSet(); + const stackNodes: any[] = [n]; + let minOffset = Number.POSITIVE_INFINITY; + let maxOffset = -1; + while (stackNodes.length) { + const cur = stackNodes.pop(); + if (!cur || typeof cur !== 'object' || localSeen.has(cur)) continue; + localSeen.add(cur); + const r = toRange(cur); + if (r) { + const s = doc.offsetAt(r.start); + const e = doc.offsetAt(r.end); + if (s < minOffset) minOffset = s; + if (e > maxOffset) maxOffset = e; + } + for (const k of Object.keys(cur)) { + const v = cur[k]; + if (Array.isArray(v)) { + for (const el of v) if (el && typeof el === 'object') stackNodes.push(el); + } else if (v && typeof v === 'object') { + stackNodes.push(v); + } + } + } + if (maxOffset >= 0) return Range.create(doc.positionAt(minOffset), doc.positionAt(maxOffset)); + return null; + }; + + if (Array.isArray(specifiers) && specifiers.length) { + for (const spec of specifiers) { + const exported = spec.exported || spec.name || spec.local || spec.id || spec.variable || spec; + const exportName = getName(exported) || getName(spec) || getName(node) || (typeof exported === 'string' ? exported : undefined); + let exportRange = toRange(spec) || toRange(exported) || toRange(node) || computeRangeFromChildren(spec) || computeRangeFromChildren(exported) || computeRangeFromChildren(node); + if (exportName && exportRange) { + const sel = toRange(exported) || exportRange; + const rStart = doc.offsetAt(exportRange.start); + const rEnd = doc.offsetAt(exportRange.end); + let sStart = doc.offsetAt(sel.start); + let sEnd = doc.offsetAt(sel.end); + if (sStart < rStart) sStart = rStart; + if (sEnd > rEnd) sEnd = rEnd; + if (sEnd < sStart) sEnd = sStart; + const selectionRange = Range.create(doc.positionAt(sStart), doc.positionAt(sEnd)); + const sym: DocumentSymbol = { + name: exportName, + detail: (source && (source.value || source.name || source.literal || source)) || (node.type || 'export'), + kind: SymbolKind.Module, + range: exportRange, + selectionRange, + children: undefined + }; + flat.push({ sym, start: rStart, end: rEnd }); + } + } + } else if (decl) { + const declName = getName(decl) || getName(node) || 'default'; + let exportRange = toRange(node) || toRange(decl) || computeRangeFromChildren(decl) || computeRangeFromChildren(node); + if (exportRange) { + const sel = toRange(decl) || exportRange; + const rStart = doc.offsetAt(exportRange.start); + const rEnd = doc.offsetAt(exportRange.end); + let sStart = doc.offsetAt(sel.start); + let sEnd = doc.offsetAt(sel.end); + if (sStart < rStart) sStart = rStart; + if (sEnd > rEnd) sEnd = rEnd; + if (sEnd < sStart) sEnd = sStart; + const selectionRange = Range.create(doc.positionAt(sStart), doc.positionAt(sEnd)); + let symKind: SymbolKind = SymbolKind.Variable; + const dt = (decl && (decl.type || decl.constructor?.name || '')).toString().toLowerCase(); + if (dt.includes('class')) symKind = SymbolKind.Class; + else if (dt.includes('function') || dt.includes('lambda') || dt.includes('code')) symKind = SymbolKind.Function; + else if (dt.includes('object')) symKind = SymbolKind.Variable; + const sym: DocumentSymbol = { + name: declName, + detail: 'export default', + kind: symKind, + range: exportRange, + selectionRange, + children: undefined + }; + flat.push({ sym, start: rStart, end: rEnd }); + } + } else if (source) { + const modName = (source && (source.value || source.name || source.literal || source)) || getName(node); + let exportRange = toRange(node) || computeRangeFromChildren(node); + if (modName && exportRange) { + const rStart = doc.offsetAt(exportRange.start); + const rEnd = doc.offsetAt(exportRange.end); + const selectionRange = exportRange; + const sym: DocumentSymbol = { + name: String(modName), + detail: (node.type || 'export') as string, + kind: SymbolKind.Module, + range: exportRange, + selectionRange, + children: undefined + }; + flat.push({ sym, start: rStart, end: rEnd }); + } + } + } + + // Determine a name for the node. Prefer explicit names; synthesize for anonymous functions + let name = getName(node); + const range = toRange(node); + + if (!name && nodeType.includes('function')) { + const params = (node.params || node.parameters || []).map((p: any) => { + if (!p) return ''; + if (typeof p === 'string') return p; + if (typeof p.name === 'string') return p.name; + if (typeof p.identifier === 'string') return p.identifier; + return ''; + }).filter(Boolean).slice(0, 3); + name = params.length ? `function(${params.join(',')})` : 'function'; + } + + const parentType = parent ? (parent.type || parent.constructor?.name || '').toString().toLowerCase() : ''; + // If this is an anonymous class/object exported as `export default`, synthesize a visible name + if (!name && nodeType.includes('class')) { + name = parentType.includes('export') ? 'default class' : 'class'; + } + if (!name && nodeType.includes('object') && parentType.includes('export')) { + name = 'default object'; + } + const isRightOfAssignment = parentType.includes('assign') && ['right', 'value', 'init', 'expression', 'rvalue', 'initializer', 'rightHandSide'].includes(propName || ''); + const isLeftOfAssignment = parentType.includes('assign') && ['left', 'lhs', 'lvalue', 'leftHandSide', 'id', 'variable', 'target'].includes(propName || ''); + + if (name && range && isSymbolCandidate(node, parent)) { + // Avoid duplicating symbols for assignment lhs/rhs because assignment produced the symbol + if (isLeftOfAssignment) { + // skip identifier symbol; assignment already emitted it + } else if (isRightOfAssignment && (nodeType.includes('function') || nodeType.includes('lambda') || nodeType.includes('code') || nodeType.includes('identifier'))) { + // skip the RHS function/identifier symbol — assignment emitted it + } else { + let selectionRange = (node.id && toRange(node.id)) || (node.key && toRange(node.key)) || range; + const rStart = doc.offsetAt(range.start); + const rEnd = doc.offsetAt(range.end); + let sStart = doc.offsetAt(selectionRange.start); + let sEnd = doc.offsetAt(selectionRange.end); + if (sStart < rStart) sStart = rStart; + if (sEnd > rEnd) sEnd = rEnd; + if (sEnd < sStart) sEnd = sStart; + selectionRange = Range.create(doc.positionAt(sStart), doc.positionAt(sEnd)); + + const sym: DocumentSymbol = { + name, + detail: (node.type || '') as string, + kind: kindFromNode(node), + range, + selectionRange, + children: undefined + }; + flat.push({ sym, start: rStart, end: rEnd }); + } + } + + // Always traverse children so object properties and nested functions are discovered + for (const k of Object.keys(node)) { + const v = node[k]; + if (Array.isArray(v)) { + for (const el of v) collect(el, node, k); + } else if (v && typeof v === 'object') { + collect(v, node, k); + } + } + } + + collect(ast, undefined, undefined); + + logger.logDebug && logger.logDebug('coffeeAstService: collected ' + flat.length + ' flat symbols'); + + if (flat.length === 0) return []; + + // Build hierarchy by range containment + flat.sort((a, b) => a.start - b.start || b.end - a.end); + + const root: DocumentSymbol[] = []; + const stack: { sym: DocumentSymbol; start: number; end: number }[] = []; + + for (const item of flat) { + while (stack.length > 0) { + const top = stack[stack.length - 1]!; + if (item.start >= top.start && item.end <= top.end) break; + stack.pop(); + } + if (stack.length === 0) { + root.push(item.sym); + } else { + const parent = stack[stack.length - 1]!.sym; + parent.children = parent.children || []; + parent.children.push(item.sym); + } + stack.push(item); + } + + logger.logDebug && logger.logDebug('coffeeAstService: returning ' + root.length + ' root symbols'); + + return root; + } catch (e: any) { + logger.logDebug && logger.logDebug('coffeeAstService failed: ' + (e && e.message)); + return []; + } +} diff --git a/server/src/services/lsp.ts b/server/src/services/lsp.ts index f4200598..9a09c307 100644 --- a/server/src/services/lsp.ts +++ b/server/src/services/lsp.ts @@ -12,6 +12,7 @@ import { FileChangeType, Connection, TextDocumentPositionParams, + DocumentSymbolParams, InitializeParams, ServerCapabilities, TextDocumentSyncKind, @@ -30,7 +31,8 @@ import { SignatureHelp, DocumentUri, CodeAction, - CodeActionKind + CodeActionKind, + DocumentSymbol } from 'vscode-languageserver-types'; import type { TextDocument } from 'vscode-languageserver-textdocument'; @@ -356,6 +358,7 @@ export class LSP { this.lspConnection.onDefinition(this.onDefinition.bind(this)); this.lspConnection.onDocumentHighlight(this.onDocumentHighlight.bind(this)); + this.lspConnection.onDocumentSymbol(this.onDocumentSymbols.bind(this)); this.lspConnection.onHover(this.onHover.bind(this)); this.lspConnection.onReferences(this.onReferences.bind(this)); this.lspConnection.onSignatureHelp(this.onSignatureHelp.bind(this)); @@ -472,6 +475,12 @@ export class LSP { return project?.onDocumentHighlight(params) ?? []; } + async onDocumentSymbols(params: DocumentSymbolParams): Promise { + const project = await this.getProjectService(params.textDocument.uri); + + return project?.onDocumentSymbols(params) ?? []; + } + async onDefinition(params: TextDocumentPositionParams): Promise { const project = await this.getProjectService(params.textDocument.uri); @@ -575,6 +584,7 @@ export class LSP { documentFormattingProvider: false, hoverProvider: true, documentHighlightProvider: true, + documentSymbolProvider: true, definitionProvider: true, referencesProvider: true, codeActionProvider: { diff --git a/server/src/services/projectService.ts b/server/src/services/projectService.ts index 9e52c4e3..b654bfcd 100644 --- a/server/src/services/projectService.ts +++ b/server/src/services/projectService.ts @@ -14,6 +14,7 @@ import { TextDocumentPositionParams } from 'vscode-languageserver'; import { TextDocument } from 'vscode-languageserver-textdocument'; +import { DocumentSymbol } from 'vscode-languageserver-types'; import { LanguageId } from '../embeddedSupport/embeddedSupport'; import { LanguageModes } from '../embeddedSupport/languageModes'; import { NULL_COMPLETION, NULL_HOVER, NULL_SIGNATURE } from '../modes/nullMode'; @@ -31,6 +32,7 @@ export interface ProjectService { onCompletionResolve(item: CompletionItem): Promise; onHover(params: TextDocumentPositionParams): Promise; onDocumentHighlight(params: TextDocumentPositionParams): Promise; + onDocumentSymbols(params: { textDocument: { uri: string } }): Promise; onDefinition(params: TextDocumentPositionParams): Promise; onReferences(params: TextDocumentPositionParams): Promise; onSignatureHelp(params: TextDocumentPositionParams): Promise; @@ -96,6 +98,77 @@ export async function createProjectService( } return []; }, + async onDocumentSymbols({ textDocument }: { textDocument: { uri: string } }) { + const doc = documentService.getDocument(textDocument.uri)!; + const result: DocumentSymbol[] = []; + if (doc && doc.languageId === LANGUAGE_ID) { + for (const lmr of languageModes.getAllLanguageModeRangesInDocument(doc)) { + const mode = lmr.mode; + if (mode && mode.findDocumentSymbols) { + const symbols = mode.findDocumentSymbols(doc); + if (symbols && symbols.length) { + result.push(...symbols); + } + } + } + } + + // Respect outline sort order if provided via workspace settings (e.g., VS Code's Outline view) + try { + const cfg = env.getConfig() as any; + let sortOrder: string | undefined = undefined; + // common locations for the setting + if (cfg && cfg.outline && (cfg.outline.sortOrder || cfg.outline.sortBy)) { + sortOrder = cfg.outline.sortOrder || cfg.outline.sortBy; + } + if (!sortOrder) sortOrder = cfg['outline.sortOrder'] || cfg['outline.sortBy'] || cfg['editor.outline.sortOrder']; + + const compareByPosition = (a: DocumentSymbol, b: DocumentSymbol) => { + const as = doc.offsetAt(a.range.start); + const bs = doc.offsetAt(b.range.start); + return as - bs; + }; + const compareByName = (a: DocumentSymbol, b: DocumentSymbol) => + (a.name || '').toLowerCase().localeCompare((b.name || '').toLowerCase()); + const kindOrder = (k: number) => k || 0; + const compareByCategory = (a: DocumentSymbol, b: DocumentSymbol) => { + const ka = kindOrder(a.kind as number); + const kb = kindOrder(b.kind as number); + if (ka !== kb) return ka - kb; + return compareByName(a, b); + }; + + const sorter = (order?: string) => { + switch ((order || 'position').toString().toLowerCase()) { + case 'name': + return compareByName; + case 'category': + case 'kind': + return compareByCategory; + case 'position': + default: + return compareByPosition; + } + }; + + const sortRec = (arr: DocumentSymbol[]) => { + if (!arr || !arr.length) return; + const cmp = sorter(sortOrder); + arr.sort(cmp as any); + for (const s of arr) { + if (s.children) sortRec(s.children); + } + }; + + sortRec(result); + } catch (e) { + // ignore sorting errors + } + + return result; + }, + + async onDefinition({ textDocument, position }) { const doc = documentService.getDocument(textDocument.uri)!; const mode = languageModes.getModeAtPosition(doc, position); diff --git a/server/yarn.lock b/server/yarn.lock index c62720b6..dd8286f8 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -2,214 +2,47 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" - integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== - dependencies: - "@babel/highlight" "^7.22.10" - chalk "^2.4.2" - -"@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== - -"@babel/core@^7.1.15": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.10.tgz#aad442c7bcd1582252cb4576747ace35bc122f35" - integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.10" - "@babel/parser" "^7.22.10" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.1" - -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== - dependencies: - "@babel/types" "^7.22.10" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helpers@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.10.tgz#ae6005c539dfbcb5cd71fb51bfc8a52ba63bc37a" - integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" - -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.22.10", "@babel/parser@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" - integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== - -"@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" - integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== - dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.10" - "@babel/types" "^7.22.10" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.22.10", "@babel/types@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" - integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7": + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" + integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== + dependencies: + "@babel/types" "^7.29.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.28.2", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" "@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.6.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" - integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== -"@eslint/eslintrc@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.1.tgz#18d635e24ad35f7276e8a49d135c7d3ca6a46f93" - integrity sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -221,18 +54,18 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^8.46.0": - version "8.46.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.46.0.tgz#3f7802972e8b6fe3f88ed1aabc74ec596c456db6" - integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -240,42 +73,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -298,22 +99,55 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@types/babel__core@^7.1.15": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== + dependencies: + "@babel/types" "^7.28.2" + "@types/coffeescript@^2.5.1": - version "2.5.3" - resolved "https://registry.yarnpkg.com/@types/coffeescript/-/coffeescript-2.5.3.tgz#428004249254b1b64a6ee3d86d63ada3f364c333" - integrity sha512-D/PYwDw7KCAEgXVqXN2la1DuJB8nPXzXHN3Hh0DkDyEmWf231HPnpAeIEXE9szkaBmx+MiCrF0+4jhR3Y/y6UA== + version "2.5.7" + resolved "https://registry.yarnpkg.com/@types/coffeescript/-/coffeescript-2.5.7.tgz#36bd5cac2e1025f6c37681e7017675031fe2a9a3" + integrity sha512-UXsSC38arfQNqQIKck80YBjL+FdQSPiWJ2lGb3E/bAZAmjuC0WLIOSYMZydiDI9ni6GW/4W3GSdvL8JJpf3jAA== dependencies: - "@babel/core" "^7.1.15" + "@types/babel__core" "^7.1.15" "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/lodash@^4.14.179": - version "4.14.196" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.196.tgz#a7c3d6fc52d8d71328b764e28e080b4169ec7a95" - integrity sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ== + version "4.17.24" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.24.tgz#4ae334fc62c0e915ca8ed8e35dcc6d4eeb29215f" + integrity sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ== "@types/node@^17.0.21": version "17.0.45" @@ -326,9 +160,9 @@ integrity sha512-Ku5+GPFa12S3W26Uwtw+xyrtIpaZsGYHH6zxNbZlstmlvMYSZRzOwzwsXbxlVUbHyUucctSyuFtu6bNxwYomIw== "@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + version "7.7.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.1.tgz#3ce3af1a5524ef327d2da9e4fd8b6d95c8d70528" + integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA== "@typescript-eslint/eslint-plugin@^5.13.0": version "5.62.0" @@ -414,20 +248,25 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@ungap/structured-clone@^1.2.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + version "6.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -439,13 +278,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -469,49 +301,25 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.14" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.14.tgz#d9de602370d91347cd9ddad1224d4fd701eb348b" + integrity sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" - node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + fill-range "^7.1.1" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -caniuse-lite@^1.0.30001517: - version "1.0.30001519" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz#3e7b8b8a7077e78b0eb054d69e6edf5c7df35601" - integrity sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -520,16 +328,9 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -"coffeescript@github:edemaine/coffeescript#var-assign": - version "2.6.1" - resolved "https://codeload.github.com/edemaine/coffeescript/tar.gz/939327e9fd2be0f5fc2af688bb6a0d63e5d4b3cb" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" +"coffeescript@github:sergioalcaraz/coffeescript#var-assign": + version "2.7.0" + resolved "https://codeload.github.com/sergioalcaraz/coffeescript/tar.gz/c8f1e5afe9b7dd5c91c35a930f4fa11e6302fbb6" color-convert@^2.0.1: version "2.0.1" @@ -538,11 +339,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -553,31 +349,26 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - core-js@^3.21.1: - version "3.32.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.0.tgz#7643d353d899747ab1f8b03d2803b0312a0fb3b6" - integrity sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww== + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.49.0.tgz#8b4d520ac034311fa21aa616f017ada0e0dbbddd" + integrity sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg== cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: - ms "2.1.2" + ms "^2.1.3" deep-is@^0.1.3: version "0.1.4" @@ -598,21 +389,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -electron-to-chromium@^1.4.477: - version "1.4.487" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.487.tgz#e2ef8b15f2791bf68fa6f38f2656f1a551d360ae" - integrity sha512-XbCRs/34l31np/p33m+5tdBrdXu9jJkZxSbNxj5I0H1KtV2ZMSB+i/HYqDiRzHaFx2T5EdytjoBRe8QRJE2vQg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -634,23 +410,24 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f" - integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.10.0: - version "8.46.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552" - integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.1" - "@eslint/js" "^8.46.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -658,7 +435,7 @@ eslint@^8.10.0: doctrine "^3.0.0" escape-string-regexp "^4.0.0" eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.2" + eslint-visitor-keys "^3.4.3" espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" @@ -692,9 +469,9 @@ espree@^9.6.0, espree@^9.6.1: eslint-visitor-keys "^3.4.1" esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== dependencies: estraverse "^5.1.0" @@ -726,15 +503,15 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -747,9 +524,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== dependencies: reusify "^1.0.4" @@ -760,10 +537,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -776,17 +553,18 @@ find-up@^5.0.0: path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.4.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" + integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== fs.realpath@^1.0.0: version "1.0.0" @@ -794,14 +572,9 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== glob-parent@^5.1.2: version "5.1.2" @@ -829,15 +602,10 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -858,25 +626,20 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -926,28 +689,23 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== dependencies: argparse "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - jshashes@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/jshashes/-/jshashes-1.0.8.tgz#f60d837428383abf73ab022e1542e6614bd75514" integrity sha512-btmQZ/w1rj8Lb6nEwvhjM7nBYoj54yaEFo2PWh3RkxZ8qNwuvOxvQYN/JxVuwoMmdIluL+XwYVJ+pEEZoSYybQ== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -958,10 +716,12 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" levn@^0.4.1: version "0.4.1" @@ -984,48 +744,34 @@ lodash.merge@^4.6.2: integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== natural-compare-lite@^1.4.0: version "1.4.0" @@ -1037,11 +783,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1050,16 +791,16 @@ once@^1.3.0: wrappy "1" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" p-limit@^3.0.2: version "3.1.0" @@ -1107,15 +848,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== prelude-ls@^1.2.1: version "1.2.1" @@ -1123,9 +859,9 @@ prelude-ls@^1.2.1: integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== queue-microtask@^1.2.2: version "1.2.3" @@ -1138,9 +874,9 @@ resolve-from@^4.0.0: integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rimraf@^3.0.2: version "3.0.2" @@ -1150,9 +886,9 @@ rimraf@^3.0.2: glob "^7.1.3" rollup@^2.69.1: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + version "2.80.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.80.0.tgz#a82efc15b748e986a7c76f0f771221b1fa108a2c" + integrity sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ== optionalDependencies: fsevents "~2.3.2" @@ -1163,17 +899,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - semver@^7.3.7: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== shebang-command@^2.0.0: version "2.0.0" @@ -1204,13 +933,6 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1223,11 +945,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1260,17 +977,9 @@ type-fest@^0.20.2: integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== typescript@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== uri-js@^4.2.2: version "4.4.1" @@ -1298,9 +1007,9 @@ vscode-languageserver-protocol@3.16.0: vscode-languageserver-types "3.16.0" vscode-languageserver-textdocument@^1.0.4: - version "1.0.8" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz#9eae94509cbd945ea44bca8dcfe4bb0c15bb3ac0" - integrity sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q== + version "1.0.12" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== vscode-languageserver-types@3.16.0: version "3.16.0" @@ -1315,9 +1024,9 @@ vscode-languageserver@7.0.0: vscode-languageserver-protocol "3.16.0" vscode-uri@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.7.tgz#6d19fef387ee6b46c479e5fb00870e15e58c1eb8" - integrity sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" + integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== which@^2.0.1: version "2.0.2" @@ -1326,21 +1035,16 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" diff --git a/test/lsp/features/document-symbols/basic.test.ts b/test/lsp/features/document-symbols/basic.test.ts new file mode 100644 index 00000000..af261ea5 --- /dev/null +++ b/test/lsp/features/document-symbols/basic.test.ts @@ -0,0 +1,36 @@ +import assert from 'assert' +import vscode from 'vscode' +import { showFile } from '../../../editorHelper' +import { getDocUri } from '../../path' + +describe('Should provide document symbols (outline)', () => { + const doc = getDocUri('document-symbols/basic.coffee') + + it('lists top-level and class symbols', async () => { + await showFile(doc) + const symbols = (await vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', doc)) as vscode.DocumentSymbol[] + if (!symbols || symbols.length === 0) { + throw new Error('No document symbols returned') + } + + const findByName = (list: vscode.DocumentSymbol[]|undefined, name: string): vscode.DocumentSymbol | undefined => { + if (!list) return undefined + for (const s of list) { + if (s.name === name) return s + const found = findByName(s.children, name) + if (found) return found + } + return undefined + } + + const person = findByName(symbols, 'Person') + assert.ok(person, 'Person symbol missing') + const constructor = findByName(person?.children, 'constructor') + assert.ok(constructor, 'constructor missing in Person') + const greet = findByName(person?.children, 'greet') + assert.ok(greet, 'greet missing in Person') + + const square = findByName(symbols, 'square') || findByName(symbols, 'square =') + assert.ok(square, 'square symbol missing') + }) +}) diff --git a/test/lsp/features/document-symbols/exports.test.ts b/test/lsp/features/document-symbols/exports.test.ts new file mode 100644 index 00000000..2358c406 --- /dev/null +++ b/test/lsp/features/document-symbols/exports.test.ts @@ -0,0 +1,56 @@ +import assert from 'assert' +import vscode from 'vscode' +import { showFile } from '../../../editorHelper' +import { getDocUri } from '../../path' + +describe('Document symbols: export default (anonymous)', () => { + const classDoc = getDocUri('document-symbols/export-default-class.coffee') + const fnDoc = getDocUri('document-symbols/export-default-fn.coffee') + const objDoc = getDocUri('document-symbols/export-default-object.coffee') + + const findByName = (list: vscode.DocumentSymbol[]|undefined, name: string): vscode.DocumentSymbol | undefined => { + if (!list) return undefined + for (const s of list) { + if (s.name === name) return s + const found = findByName(s.children, name) + if (found) return found + } + return undefined + } + + it('shows class members inside export default', async () => { + await showFile(classDoc) + const symbols = (await vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', classDoc)) as vscode.DocumentSymbol[] + if (!symbols || symbols.length === 0) throw new Error('No document symbols returned') + + const def = findByName(symbols, 'default') + assert.ok(def, 'default export missing') + // ensure class member is present + const greet = findByName(symbols, 'greet') + assert.ok(greet, 'greet missing in exported class') + }) + + it('shows inner assignments / functions inside export default function', async () => { + await showFile(fnDoc) + const symbols = (await vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', fnDoc)) as vscode.DocumentSymbol[] + if (!symbols || symbols.length === 0) throw new Error('No document symbols returned') + + const def = findByName(symbols, 'default') + assert.ok(def, 'default export missing') + const inner = findByName(symbols, 'inner') + assert.ok(inner, 'inner function/assignment inside exported function missing') + }) + + it('shows object properties inside export default object', async () => { + await showFile(objDoc) + const symbols = (await vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', objDoc)) as vscode.DocumentSymbol[] + if (!symbols || symbols.length === 0) throw new Error('No document symbols returned') + + const def = findByName(symbols, 'default') + assert.ok(def, 'default export missing') + const a = findByName(symbols, 'a') + assert.ok(a, 'property a missing in exported object') + const nestedC = findByName(symbols, 'c') + assert.ok(nestedC, 'nested property c missing in exported object') + }) +}) diff --git a/test/lsp/fixture/document-symbols/basic.coffee b/test/lsp/fixture/document-symbols/basic.coffee new file mode 100644 index 00000000..dab2164a --- /dev/null +++ b/test/lsp/fixture/document-symbols/basic.coffee @@ -0,0 +1,7 @@ +# Basic document symbol fixture +class Person + constructor: (@name) -> + greet: (who) -> + console.log "Hello #{who} from #{@name}" + +square = (n) -> n * n diff --git a/test/lsp/fixture/document-symbols/export-default-class.coffee b/test/lsp/fixture/document-symbols/export-default-class.coffee new file mode 100644 index 00000000..dc1c2d16 --- /dev/null +++ b/test/lsp/fixture/document-symbols/export-default-class.coffee @@ -0,0 +1,4 @@ +# export default anonymous class (non-proprietary example) +export default class + constructor: (@name) -> + greet: (who) -> console.log "Hello #{who} from #{@name}" diff --git a/test/lsp/fixture/document-symbols/export-default-fn.coffee b/test/lsp/fixture/document-symbols/export-default-fn.coffee new file mode 100644 index 00000000..c9006368 --- /dev/null +++ b/test/lsp/fixture/document-symbols/export-default-fn.coffee @@ -0,0 +1,5 @@ +# export default anonymous function (non-proprietary example) +export default -> + inner = (x) -> x * 2 + result = inner 3 + return result diff --git a/test/lsp/fixture/document-symbols/export-default-object.coffee b/test/lsp/fixture/document-symbols/export-default-object.coffee new file mode 100644 index 00000000..2cd15778 --- /dev/null +++ b/test/lsp/fixture/document-symbols/export-default-object.coffee @@ -0,0 +1,6 @@ +# export default anonymous object (non-proprietary example) +export default + a: 1 + b: (x) -> x + 1 + nested: + c: 'hi'